Highlighting Objects in Conduits
Windows only
Problem
You need to highlight a curve object on display conduit.
Solution
Consider the following sample CRhinoDisplayConduit
derived class:
class CTestHighlightCurveConduit : public CRhinoDisplayConduit
{
public:
CTestHighlightCurveConduit();
bool ExecConduit(
CRhinoDisplayPipeline& dp,
UINT nChannel,
bool& bTerminate
);
public:
unsigned int m_runtime_object_serial_number;
};
CTestHighlightCurveConduit::CTestHighlightCurveConduit()
: CRhinoDisplayConduit( CSupportChannels::SC_DRAWOBJECT )
{
// TODO: initialize members here
}
bool CTestHighlightCurveConduit::ExecConduit(
CRhinoDisplayPipeline& dp,
UINT nChannel,
bool& bTerminate
)
{
switch( nChannel )
{
case CSupportChannels::SC_DRAWOBJECT:
{
if( m_pChannelAttrs->m_pObject->m_runtime_object_serial_number == m_runtime_object_serial_number )
m_pDisplayAttrs->m_ObjectColor = RGB(255, 105, 180); // hot pink
}
break;
}
return true;
}
During the SC_DRAWOBJECT
channel, the code looks for the target object. If found, it overrides the object’s drawing color.
To use this conduit, you could write a command such as this:
CRhinoCommand::result CCommandTestHighlightCurve::RunCommand( const CRhinoCommandContext& context )
{
CRhinoGetObject go;
go.SetCommandPrompt( L"Select curve to highlight" );
go.SetGeometryFilter( CRhinoGetObject::curve_object );
go.GetObjects( 1, 1 );
if( go.CommandResult() != CRhinoCommand::success )
return go.CommandResult();
const CRhinoObject* obj = go.Object(0).Object();
if( 0 == obj )
return CRhinoCommand::failure;
CTestHighlightCurveConduit conduit;
conduit.m_runtime_object_serial_number = obj->m_runtime_object_serial_number;
conduit.Enable();
context.m_doc.Redraw();
CRhinoGetString gs;
gs.SetCommandPrompt( L"Press <Enter> to continue" );
gs.GetString();
conduit.Disable();
context.m_doc.Redraw();
return CRhinoCommand::success;
}