Moving Curve and Surface Grips
Windows only
Problem
You would like to move the control points of a curve or surface object using the Rhino C/C++ SDK.
Solution
The curve and surface grips you see on the screen, after running Rhino’s PointsOn command, are represented by CRhinoGripObject
-derived objects. To move a grip object, you have to do a few things:
- Get a
CRhinoGripObject
. You can use aCRhinoGetObject
object to do this. - Call
CRhinoGripObject::MoveGrip
to transform the grip’s location. - Call
CRhinoGripObject::Owner
to get the grips owningCRhinoObject
object. - Call
CRhinoObject::NewObject
to create a newCRhinoObject
object based on the new grip location. - Call
CRhinoDoc::ReplaceObject
to replace the original owning object with the new one.
Sample
The following sample code demonstrates this.
NOTE: This sample uses a CRhinoXformObjectList
object to maintain the list of grips and grip owners.
CRhinoCommand::result CCommandMoveGrips::RunCommand( const CRhinoCommandContext& context ) { CRhinoGetObject go; go.SetCommandPrompt( L"Select grips to move" ); go.SetGeometryFilter( CRhinoGetObject::grip_object ); go.GetObjects( 1, 0 ); if( go.CommandResult() != success ) return go.CommandResult(); CRhinoXformObjectList xform_list; if( xform_list.AddObjects(go, true) < 1 ) return failure; CRhinoGetPoint gp; gp.SetCommandPrompt( L"Point to move from" ); gp.GetPoint(); if( gp.CommandResult() != success ) return gp.CommandResult(); ON_3dPoint from = gp.Point(); gp.SetCommandPrompt( L"Point to move to" ); gp.SetBasePoint( from ); gp.DrawLineFromPoint( from, TRUE ); gp.GetPoint(); if( gp.CommandResult() != success ) return gp.CommandResult(); ON_3dPoint to = gp.Point(); ON_Xform xform; xform.Translation( to - from ); if( xform.IsValid() ) { // Transform the grip objects int i; for( i = 0; i < xform_list.m_grips.Count(); i++ ) xform_list.m_grips[i]->MoveGrip( xform ); // Replace the old owner with a new one for( i = 0; i < xform_list.m_grip_owners.Count(); i++ ) { CRhinoObject* old_object = xform_list.m_grip_owners[i]; if( old_object ) { CRhinoObject* new_object = old_object->m_grips->NewObject(); if( new_object ) context.m_doc.ReplaceObject( CRhinoObjRef(old_object), new_object, true ); } } context.m_doc.Redraw(); } return success; }