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