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; }