Picking Brep Components

This brief guide discusses picking components of a Brep using C/C++.

Problem

You would like to pick a brep component (e.g. face or edge) and then take action depending on what was picked. If you write an object picker as such:

CRhinoGetObject go;
go.SetCommandPrompt( L"Select face or edge" );
go.SetGeometryFilter( CRhinoGetObject::surface_object |
CRhinoGetObject::edge_object );
go.EnableSubObjectSelect( true );
go.GetObjects( 1, 1 );

and then use it to try to pick the edge of a box, for example, only the faces show up on the “choose one object” menu.

Solution

You need to enable “choose one question” to get multiple subobject types on one brep to work. So, this should work:

CRhinoGetObject go;
go.SetCommandPrompt( L"Select face or edge" );
go.SetGeometryFilter( CRhinoGetObject::surface_object |
CRhinoGetObject::edge_object );
go.EnableSubObjectSelect( true );
go.EnableChooseOneQuestion( true ); // ADD THIS...
go.GetObjects( 1, 1 );