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/nmVTKRotationCenterPicker.h

97 lines
2.8 KiB
C++

#ifndef NMVTKROTATIONCENTERPICKER_H
#define NMVTKROTATIONCENTERPICKER_H
#include "nmRender_global.h"
#include <QCursor>
#include <vtkWeakPointer.h>
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<vtkProp> 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