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.
97 lines
2.8 KiB
C++
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
|