developer:sdksamples:addnurbscurve


Create a NURBS Curve from Control Points

Developer: C++, .NET
Summary: Demonstrates two ways to create clamped ON_NurbsCurve from a set of control points.

Method 1

C++

  CRhinoCommand::result CCommandTest::RunCommand(
          const CRhinoCommandContext& context )
  {
    ON_3dPointArray points;
    points.Append( ON_3dPoint(0, 0, 0) );
    points.Append( ON_3dPoint(0, 2, 0) );
    points.Append( ON_3dPoint(2, 4, 0) );
    points.Append( ON_3dPoint(4, 2, 0) );
    points.Append( ON_3dPoint(4, 0, 0) );
 
    ON_NurbsCurve* nc = ON_NurbsCurve::New(); 
    nc->CreateClampedUniformNurbs( 3, 4, points.Count(), points );
 
    if( nc->IsValid() )
    {
      context.m_doc.AddCurveObject( *nc );
      context.m_doc.Redraw();
    }
 
    RhinoApp().ActiveDoc()->Redraw();
    return CRhinoCommand::success;
  }

VB.NET

Public Overrides Function RunCommand(ByVal context As RMA.Rhino.IRhinoCommandContext)_
  As RMA.Rhino.IRhinoCommand.result
 
    Dim CPoints As New List(Of On3dPoint)
    CPoints.Add(New On3dPoint(0, 0, 0))
    CPoints.Add(New On3dPoint(0, 2, 0))
    CPoints.Add(New On3dPoint(2, 4, 0))
    CPoints.Add(New On3dPoint(4, 2, 0))
    CPoints.Add(New On3dPoint(4, 0, 0))
 
    Dim dimension As Integer = 3
    Dim order As Integer = 4
 
    Dim nc As New OnNurbsCurve
    nc.CreateClampedUniformNurbs(dimension, order, CPoints.ToArray())
 
    If (nc.IsValid()) Then
          context.m_doc.AddCurveObject(nc)
          context.m_doc.Redraw()
    End If
    Return IRhinoCommand.result.success
 
End Function

Method 2

C++

  CRhinoCommand::result CCommandTest::RunCommand(
          const CRhinoCommandContext& context )
  {
    ON_3dPointArray points;
    points.Append( ON_3dPoint(0, 0, 0) );
    points.Append( ON_3dPoint(0, 2, 0) );
    points.Append( ON_3dPoint(2, 4, 0) );
    points.Append( ON_3dPoint(4, 2, 0) );
    points.Append( ON_3dPoint(4, 0, 0) );
 
    int dimension = 3;
    bool bIsRat = false;
    int order = 4;
    int cv_count = points.Count();
 
    ON_NurbsCurve* nc = ON_NurbsCurve::New(dimension, bIsRat, order, cv_count);
    if( !nc )
          return CRhinoCommand::failure;
 
    //Set CV points
    nc->ReserveCVCapacity( cv_count );
    for( int i = 0; i < points.Count(); i++ )
    {
          nc->SetCV(i, points[i] );
    }
 
    //Set Knots
    nc->ReserveKnotCapacity( order+cv_count-2 );
    ON_MakeClampedUniformKnotVector( order, cv_count, nc->m_knot );
 
    if( nc->IsValid() )
    {
      context.m_doc.AddCurveObject( *nc );
      context.m_doc.Redraw();
    }
 
    RhinoApp().ActiveDoc()->Redraw();
    return CRhinoCommand::success;
  }

VB.NET

Public Overrides Function RunCommand(ByVal context As RMA.Rhino.IRhinoCommandContext)_
  As RMA.Rhino.IRhinoCommand.result
 
    Dim i As Integer
    Dim CPoints As New List(Of On3dPoint)
    CPoints.Add(New On3dPoint(0, 0, 0))
    CPoints.Add(New On3dPoint(0, 2, 0))
    CPoints.Add(New On3dPoint(2, 4, 0))
    CPoints.Add(New On3dPoint(4, 2, 0))
    CPoints.Add(New On3dPoint(4, 0, 0))
 
    Dim dimension As Integer = 3
    Dim bIsRational As Boolean = False
    Dim order As Integer = 4
    Dim cv_count As Integer = CPoints.Count()
 
    Dim nc As New OnNurbsCurve(dimension, bIsRational, order, cv_count)
 
    'Set CV Points
    nc.ReserveCVCapacity(cv_count)
    For i = 0 To cv_count - 1
          nc.SetCV(i, CPoints(i))
    Next
 
    'Set Knots
    nc.ReserveKnotCapacity(order + cv_count - 2)
    nc.MakeClampedUniformKnotVector()
 
    If (nc.IsValid()) Then
          context.m_doc.AddCurveObject(nc)
          context.m_doc.Redraw()
    End If
    Return IRhinoCommand.result.success
 
End Function


developer/sdksamples/addnurbscurve.txt · Last modified: 2010/03/11 12:29 by dale Driven by DokuWiki Recent changes RSS feed

 © 1997-2012 

McNeel North America Europe Latin AmericaAsia