You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/nmNum/nmRender/nmVTKOrientationMarkerContr...

77 lines
2.9 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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