#include "FITKGraphInteractionStyle.h" #include "FITKGraphAreaPicker.h" #include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h" #include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h" #include "FITK_Kernel/FITKAppFramework/FITKKeyMouseStates.h" #include "FITK_Kernel/FITKCore/FITKCoreMacros.h" #include namespace Comp { FITKGraphInteractionStyle* FITKGraphInteractionStyle::New() { return new FITKGraphInteractionStyle(); } void FITKGraphInteractionStyle::setGraph3DWin(FITKGraph3DWindowVTK * graphWin) { m_graph3dWin = graphWin; } void FITKGraphInteractionStyle::setInteractor(vtkRenderWindowInteractor * interactor) { if (interactor == nullptr)return; //将渲染窗口的交互器设置为该类 interactor->SetInteractorStyle(this); } void FITKGraphInteractionStyle::setAreaPickRenderer(vtkRenderer * renderer) { if (renderer == nullptr || m_areaPick == nullptr)return; m_areaPick->setPickerRender(renderer); } vtkRenderWindowInteractor * FITKGraphInteractionStyle::getInteractor() { return this->Interactor; } void FITKGraphInteractionStyle::setAredPickerState(bool state) { m_areaPick->enable(state); } void FITKGraphInteractionStyle::areaPick(int* startPos, int* endPos) { } FITKGraphInteractionStyle::FITKGraphInteractionStyle() { m_areaPick = new FITKGraphAreaPicker(this); } FITKGraphInteractionStyle::~FITKGraphInteractionStyle() { if (m_areaPick != nullptr) delete m_areaPick; m_areaPick = nullptr; } void FITKGraphInteractionStyle::OnLeftButtonDown() { //使用VTK自身的鼠标左键按下事件 this->Interactor->GetEventPosition(m_leftButtonDowmPos); vtkInteractorStyleRubberBandPick::OnLeftButtonDown(); if (m_areaPick != nullptr && m_areaPick->isEnable()) { m_areaPick->setLeftButtonDownPos(m_leftButtonDowmPos); } } void FITKGraphInteractionStyle::OnLeftButtonUp() { //使用VTK自身的鼠标左键抬起事件 this->Interactor->GetEventPosition(m_leftButtonUpPos); vtkInteractorStyleRubberBandPick::OnLeftButtonUp(); if (m_areaPick != nullptr /*&& isMouseMoved()*/) { m_areaPick->enable(false); } } void FITKGraphInteractionStyle::OnMiddleButtonDown() { //使用VTK自身的鼠标中键按下事件 this->Interactor->GetEventPosition(m_leftButtonDowmPos); vtkInteractorStyleRubberBandPick::OnMiddleButtonDown(); } void FITKGraphInteractionStyle::OnMiddleButtonUp() { //使用VTK自身的鼠标中键抬起事件 this->Interactor->GetEventPosition(m_leftButtonUpPos); vtkInteractorStyleRubberBandPick::OnMiddleButtonUp(); } void FITKGraphInteractionStyle::OnMouseMove() { //使用VTK自身的鼠标移动事件 this->Interactor->GetEventPosition(m_leftButtonUpPos); vtkInteractorStyleRubberBandPick::OnMouseMove(); //判断是否移动 bool isMove = this->isMouseMoved(); //判断鼠标左键是否按下 bool isMouseState = FITKAPP->getGlobalData()->getKeyMouseStates()->mousePressed(Qt::LeftButton); if (m_areaPick != nullptr && isMove && isMouseState) { //重新绘制框选选框 m_areaPick->drawRectangle(); } } void FITKGraphInteractionStyle::OnMouseWheelForward() { //调用VTK自身的鼠标滑轮向前事件 vtkInteractorStyleRubberBandPick::OnMouseWheelForward(); } void FITKGraphInteractionStyle::OnMouseWheelBackward() { //调用VTK自身的鼠标滑轮向后事件 vtkInteractorStyleRubberBandPick::OnMouseWheelBackward(); } void FITKGraphInteractionStyle::OnRightButtonDown() { //调用VTK自身的鼠标右键按下事件 this->Interactor->GetEventPosition(m_leftButtonDowmPos); vtkInteractorStyleRubberBandPick::OnRightButtonDown(); } void FITKGraphInteractionStyle::OnRightButtonUp() { //调用VTK自身的鼠标右键抬起事件 this->Interactor->GetEventPosition(m_leftButtonUpPos); vtkInteractorStyleRubberBandPick::OnRightButtonUp(); } bool FITKGraphInteractionStyle::isMouseMoved() { int dx = m_leftButtonUpPos[0] - m_leftButtonDowmPos[0]; int dy = m_leftButtonUpPos[1] - m_leftButtonDowmPos[1]; return dx * dx + dy * dy > 50; } }