|
|
#ifndef NMVTKORIENTATIONMARKERCONTROLLER_H
|
|
|
#define NMVTKORIENTATIONMARKERCONTROLLER_H
|
|
|
|
|
|
#include "nmRender_global.h"
|
|
|
|
|
|
#include <vtkSmartPointer.h>
|
|
|
|
|
|
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<vtkAxesActor> m_pAxesActor;
|
|
|
vtkSmartPointer<vtkOrientationMarkerWidget> m_pMarkerWidget;
|
|
|
|
|
|
// 以下为非所有权访问指针,解绑时必须在释放外部对象前清空。
|
|
|
vtkRenderWindowInteractor* m_pInteractor;
|
|
|
vtkRenderer* m_pRenderer;
|
|
|
|
|
|
bool m_bVisible; ///< 用户长期显示偏好,默认开启。
|
|
|
bool m_bViewAvailable; ///< 当前容器是否处于 Ready 状态。
|
|
|
double m_dViewport[4]; ///< 归一化方向轴视口。
|
|
|
};
|
|
|
|
|
|
#endif // NMVTKORIENTATIONMARKERCONTROLLER_H
|