Picking Surface Point
Windows only
Problem
You want to pick a point on the surface of an object.
Solution
There are a couple of ways to do this:
- Use a
CRhinoGetObject
class. - Use a
CRhinoGetPoint
class.
Using CRhinoGetObject
When picking objects with a CRhinoGetObject
object, the CRhinoObjRef
returned by the object contains picking information, such as the location of the pick…
CRhinoCommand::result CCommandTestPick1::RunCommand( const CRhinoCommandContext& context ) { CRhinoGetObject go; go.SetCommandPrompt( L"Select a surface or a polysurface" ); go.SetGeometryFilter( CRhinoGetObject::surface_object | CRhinoGetObject::polysrf_object ); go.EnablePreSelect( FALSE ); go.GetObjects( 1, 1 ); if( go.CommandResult() != CRhinoCommand::success ) return go.CommandResult(); const CRhinoObjRef& ref = go.Object(0); // If the object was selected by picking a point on it, then // SelectionPoint() returns true and the point where the selection // occured. ON_3dPoint pt; if( ref.SelectionPoint(pt) ) { context.m_doc.AddPointObject( pt ); context.m_doc.Redraw(); } return CRhinoCommand::success; }
Using CRhinoGetPoint
When picking points with a CRhinoGetPoint
object, you can constrain the point picking to a surface…
CRhinoCommand::result CCommandTestPick2::RunCommand( const CRhinoCommandContext& context ) { CRhinoGetObject go; go.SetCommandPrompt( L"Select a surface" ); go.SetGeometryFilter( CRhinoGetObject::surface_object ); go.EnablePreSelect( FALSE ); go.GetObjects( 1, 1 ); if( go.CommandResult() != CRhinoCommand::success ) return go.CommandResult(); const CRhinoObjRef& ref = go.Object(0); const ON_BrepFace* face = ref.Face(); if( 0 == face ) return CRhinoCommand::failure; CRhinoGetPoint gp; gp.SetCommandPrompt( L"Select point on surface" ); gp.Constrain( *face ); gp.GetPoint(); if( gp.CommandResult() != CRhinoCommand::success ) return gp.CommandResult(); ON_3dPoint pt = gp.Point(); context.m_doc.AddPointObject( pt ); context.m_doc.Redraw(); return CRhinoCommand::success; }