#ifndef NMVTKROTATIONCENTERPICKER_H #define NMVTKROTATIONCENTERPICKER_H #include "nmRender_global.h" #include #include class QEvent; class QMouseEvent; class QVTKWidget; class vtkProp; class vtkRenderer; /** * @brief 在指定主几何上执行一次性旋转中心拾取。 * * 本类不拥有 Qt 控件、Renderer 或拾取目标,不修改相机且不主动渲染。 * Qt 事件由所属渲染容器同步转发,拾取完成后由容器统一处理结果。 */ class NM_RENDER_EXPORT nmVTKRotationCenterPicker { public: enum PickOutcome { PickOutcome_None = 0, PickOutcome_Hit, PickOutcome_Miss, PickOutcome_Cancelled }; struct PickEventResult { PickEventResult(bool bEventConsumed = false, PickOutcome ePickOutcome = PickOutcome_None) : bConsumed(bEventConsumed), eOutcome(ePickOutcome) { } bool bConsumed; PickOutcome eOutcome; }; nmVTKRotationCenterPicker(); ~nmVTKRotationCenterPicker(); /** @brief 设置唯一可拾取的主几何;使用弱引用,不延长 Prop 生命周期。 */ void setPickTarget(vtkProp* pTarget); vtkProp* getPickTarget() const; bool hasPickTarget() const; /** * @brief 进入一次性拾取模式并切换十字光标。 * @return 控件、Renderer、目标和状态均有效时返回 true。 */ bool start(QVTKWidget* pWidget, vtkRenderer* pRenderer); /** @brief 主动取消当前操作,清除待消费 Release 并恢复原光标。 */ PickEventResult cancel(); /** @brief 无语义清理临时状态,供失焦、清场和析构调用。 */ void reset(); bool isActive() const; bool hasPendingRelease() const; /** * @brief 同步处理一个 Qt 事件。 * * 左、右键 Press 会结束本次模式,但对应 Release 仍由本对象消费。 */ PickEventResult handleEvent(QEvent* pEvent); /** @brief 复制最近一次 Hit 的世界坐标;没有有效命中时返回 false。 */ bool getPickedPosition(double dPosition[3]) const; private: Q_DISABLE_COPY(nmVTKRotationCenterPicker) bool pickAt(const QMouseEvent* pMouseEvent); void finishActiveMode(); void restoreCursor(); vtkWeakPointer m_pPickTarget; QVTKWidget* m_pWidget; ///< 非所有权指针,仅在活动模式期间有效。 vtkRenderer* m_pRenderer; ///< 非所有权指针,仅在活动模式期间有效。 QCursor m_oPreviousCursor; int m_nPendingReleaseButton; bool m_bHadExplicitCursor; bool m_bCursorOverridden; bool m_bActive; bool m_bHasPickedPosition; double m_dPickedPosition[3]; }; #endif // NMVTKROTATIONCENTERPICKER_H