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