Adding a NURBS Curve from Control Points
Windows only
        
        
    
Overview
Imagine you would like to create a NURBS curve from a set of control points, such that it looks like this:

There are two methods to achieve this…
Method 1
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) );
 
  CRhinoCommand::result res;
  ON_NurbsCurve nc;
  if ( nc.CreateClampedUniformNurbs( 3, 4, points.Count(), points)
    && nc.IsValid())
  {
    context.m_doc.AddCurveObject( nc );
    res = CRhinoCommand::success;
  }
  else
    res = CRhinoCommand::failure;
  context.m_doc.Redraw();
  return res;
}
Method 2
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(dimension, bIsRat, order, cv_count);
  if( !nc.IsValid() )
  {
    return CRhinoCommand::failure;
  }
  //Set CV points
  nc.ReserveCVCapacity( cv_count );
  for( int i = 0; i < cv_count; i++ )
  {
    nc.SetCV(i, points[i] );
  }
  //Set Knots
  nc.ReserveKnotCapacity( order+cv_count-2 );
  ON_MakeClampedUniformKnotVector( order, cv_count, nc.m_knot );
  CRhinoCommand::result res;
  if( nc.IsValid() )
  {
    context.m_doc.AddCurveObject( nc );
    res = CRhinoCommand::success;
  }
  else
    res = CRhinoCommand::failure;
  context.m_doc.Redraw();
  return res;
}
