#ifndef NMVTKORIENTATIONMARKERCONTROLLER_H #define NMVTKORIENTATIONMARKERCONTROLLER_H #include "nmRender_global.h" #include class vtkAxesActor; class vtkOrientationMarkerWidget; class vtkRenderer; class vtkRenderWindowInteractor; /** * @brief 管理单个渲染容器左下角的通用空间方向轴。 * * 控制器独占 AxesActor 和 OrientationMarkerWidget,不进入业务 Scene, * 也不主动触发 Render。所有接口必须在 Qt GUI 线程调用。 */ class NM_RENDER_EXPORT nmVTKOrientationMarkerController { public: /** @brief 创建默认开启、默认不可用的方向轴控制器。 */ nmVTKOrientationMarkerController(); /** @brief 先禁用并解除所有 VTK 关联,再释放内部对象。 */ ~nmVTKOrientationMarkerController(); /** * @brief 将方向轴绑定到同一 RenderWindow 的 Interactor 和主 Renderer。 * * 重新绑定前会完整解除旧关系。绑定成功但视图尚未 Ready 时返回 true, * 此时 Marker 仍保持禁用;绑定失败不修改长期显示偏好。 */ bool bindInteractor(vtkRenderWindowInteractor* pInteractor, vtkRenderer* pRenderer); /** @brief 禁用 Marker,并解除 Actor、Renderer 和 Interactor 的引用关系。 */ void unbindInteractor(); /** @brief 修改长期显示偏好;空、错误和加载状态不会覆盖该偏好。 */ void setVisible(bool bVisible); /** @brief 返回长期显示偏好,不代表 Marker 当前一定处于 Enabled 状态。 */ bool isVisible() const; /** @brief 设置当前视图是否处于可显示方向轴的 Ready 状态。 */ void setViewAvailable(bool bAvailable); /** @brief 返回当前视图可用状态。 */ bool isViewAvailable() const; /** * @brief 设置归一化视口;只接受有限且位于 [0, 1] 的有效矩形。 * @return 参数有效并写入内部 Widget 时返回 true。 */ bool setViewport(double dXMinimum, double dYMinimum, double dXMaximum, double dYMaximum); private: Q_DISABLE_COPY(nmVTKOrientationMarkerController) /** @brief 按绑定、显示偏好和 Ready 状态统一更新 Marker 的 Enabled 状态。 */ void updateEnabledState(); // 智能指针独占 VTK 对象;MarkerWidget 启用期间还会持有相关 VTK 引用。 vtkSmartPointer m_pAxesActor; vtkSmartPointer m_pMarkerWidget; // 以下为非所有权访问指针,解绑时必须在释放外部对象前清空。 vtkRenderWindowInteractor* m_pInteractor; vtkRenderer* m_pRenderer; bool m_bVisible; ///< 用户长期显示偏好,默认开启。 bool m_bViewAvailable; ///< 当前容器是否处于 Ready 状态。 double m_dViewport[4]; ///< 归一化方向轴视口。 }; #endif // NMVTKORIENTATIONMARKERCONTROLLER_H