Pull Curve to Surface
Windows only

Demonstrates how to use ON_Surface::Pullback() to pull a curve object to a surface object.

CRhinoCommand::result CCommandTestSdk::RunCommand( const CRhinoCommandContext& context )
{
  CRhinoGetObject gc;
  gc.SetCommandPrompt( L"Select a curve on a surface" );
  gc.SetGeometryFilter( CRhinoGetObject::curve_object );
  gc.GetObjects( 1, 1 );
  if( gc.CommandResult() != CRhinoCommand::success )
    return gc.CommandResult();

  const ON_Curve* pC3d = gc.Object(0).Curve();
  if( !pC3d )
    return CRhinoCommand::failure;

  CRhinoGetObject gs;
  gs.SetCommandPrompt(L"Select the surface" );
  gs.EnableHighlight();
  gs.SetGeometryFilter( CRhinoGetObject::surface_object );
  gs.EnableDeselectAllBeforePostSelect( false );
  gs.EnablePreSelect( FALSE );
  gs.GetObjects( 1, 1 );
  if( gs.CommandResult() != CRhinoCommand::success )
    return gs.CommandResult();

  const ON_Surface* pS = gs.Object(0).Surface();
  if( !pS )
    return CRhinoCommand::failure;

  ON_Curve* pC2d = pS->Pullback( *pC3d, context.m_doc.AbsoluteTolerance() );
  if( !pC2d )
  {
    RhinoApp().Print( L"Unable to pull curve to surface.\n" );
    return CRhinoCommand::failure;
  }

  // At this point we now have a 2D curve to do with what we want.
  // In this case, we will just add it to the document.
  pC2d->ChangeDimension(3);
  if( pC2d->IsValid() )
  {
    CRhinoCurveObject* crv_obj = new CRhinoCurveObject();
    crv_obj->SetCurve( pC2d );
    if( !context.m_doc.AddObject(crv_obj) )
    {
      delete crv_obj;
      return CRhinoCommand::failure;
    }
  }

  context.m_doc.Redraw();

  return CRhinoCommand::success;
}