Determining the Active Viewport
Windows only
Problem
You are trying to determine if the current active view is a detail or a standard view. You are having some trouble differentiating between an active page layout and an active detail in a page layout.
Solution
Standard Rhino views are represented by the CRhinoView
class. Layout views are represented by the CRhinoPageView
class. This class is derived from CRhinoView
. A CRhinoPageView
object maintains an array of CRhinoDetailViewObject
objects - one for each detail in the layout.
To determine whether a layout or one if it’s details is active, get the UUID of the layout’s active detail object. If the returned UUID is nil
, then the layout itself is active. Otherwise, the detail object that has the returned UUID is active.
Sample
CRhinoCommand::result CCommandTest::RunCommand( const CRhinoCommandContext& context )
{
CRhinoView* view = RhinoApp().ActiveView();
if (nullptr == view)
return CRhinoCommand::failure;
CRhinoPageView* page_view = static_cast<CRhinoPageView*>(view);
if (page_view)
{
ON_wString layout_name = page_view->MainViewport().Name();
ON_UUID active_detail_uuid = page_view->ActiveDetailObject();
if (ON_UuidIsNotNil(active_detail_uuid))
{
ON_wString detail_name = page_view->ActiveViewport().Name();
RhinoApp().Print(L"The detail \"%s\" on layout \"%s\" is active.\n",
static_cast<const wchar_t*>(detail_name),
static_cast<const wchar_t*>(layout_name)
);
}
else
{
RhinoApp().Print(L"The layout \"%s\" is active.\n",
static_cast<const wchar_t*>(layout_name)
);
}
}
else
{
ON_wString viewport_name = view->ActiveViewport().Name();
RhinoApp().Print(L"The viewport \"%s\" is active.\n",
static_cast<const wchar_t*>(viewport_name)
);
}
return CRhinoCommand::success;
}