diff --git a/src/Combinear.css b/src/Combinear.css index d8a146a..395840d 100644 --- a/src/Combinear.css +++ b/src/Combinear.css @@ -99,6 +99,12 @@ QToolButton#fusion{qproperty-icon:url(":/InfiniteViewer/Icon/fusion.png")} QToolButton#MPR{qproperty-icon:url(":/InfiniteViewer/Icon/MPR.png")} QToolButton#VR{qproperty-icon:url(":/InfiniteViewer/Icon/VR.png")} +QToolButton#reset{qproperty-icon:url(":/InfiniteViewer/Icon/Reset.png")} +QToolButton#planeRotate{qproperty-icon:url(":/InfiniteViewer/Icon/rotate.png")} +QToolButton#freeRotate{qproperty-icon:url(":/InfiniteViewer/Icon/rotate-3d.png")} +QToolButton#setting{qproperty-icon:url(":/InfiniteViewer/Icon/Settings.png")} +QToolButton#preset{qproperty-icon:url(":/InfiniteViewer/Icon/preset.png")} + QToolButton#minimize{ min-height: 25px; max-height: 25px; diff --git a/src/Icon/Reset.png b/src/Icon/Reset.png new file mode 100644 index 0000000..23919b5 Binary files /dev/null and b/src/Icon/Reset.png differ diff --git a/src/Icon/Settings.png b/src/Icon/Settings.png new file mode 100644 index 0000000..dbc8be3 Binary files /dev/null and b/src/Icon/Settings.png differ diff --git a/src/Icon/preset.png b/src/Icon/preset.png new file mode 100644 index 0000000..88e674d Binary files /dev/null and b/src/Icon/preset.png differ diff --git a/src/Icon/rotate-3d.png b/src/Icon/rotate-3d.png new file mode 100644 index 0000000..63947b9 Binary files /dev/null and b/src/Icon/rotate-3d.png differ diff --git a/src/Icon/rotate.png b/src/Icon/rotate.png new file mode 100644 index 0000000..1515628 Binary files /dev/null and b/src/Icon/rotate.png differ diff --git a/src/QDicomViewer.qrc b/src/QDicomViewer.qrc index 77bec28..b8a387b 100644 --- a/src/QDicomViewer.qrc +++ b/src/QDicomViewer.qrc @@ -52,6 +52,11 @@ Icon/unfusionable.png Icon/unMPR.png Icon/VR.png + Icon/rotate.png + Icon/rotate-3d.png + Icon/Reset.png + Icon/Settings.png + Icon/preset.png Icon/pq/pqBold24.png diff --git a/src/src/Interaction/VolumeInteractorStyle.cpp b/src/src/Interaction/VolumeInteractorStyle.cpp new file mode 100644 index 0000000..76fd30e --- /dev/null +++ b/src/src/Interaction/VolumeInteractorStyle.cpp @@ -0,0 +1,52 @@ +// +// Created by Krad on 2022/8/24. +// + +#include "VolumeInteractorStyle.h" + +#include +#include +#include +#include +#include +#include + +vtkStandardNewMacro(VolumeInteractorStyle) + +VolumeInteractorStyle::VolumeInteractorStyle() { + +} + +VolumeInteractorStyle::~VolumeInteractorStyle() { + +} + +void VolumeInteractorStyle::OnLeftButtonDown() { + this->FindPokedRenderer(this->Interactor->GetEventPosition()[0], + this->Interactor->GetEventPosition()[1]); + if (this->CurrentRenderer == nullptr) + { + return; + } + + this->GrabFocus(this->EventCallbackCommand); + switch(this->InteractionMode) { + case VOLUME_ROTATE3D: { + this->StartRotate(); + break; + } + case VOLUME_PAN: { + this->StartPan(); + break; + } + case VOLUME_ROTATE2D: { + this->StartSpin(); + break; + } + case VOLUME_ZOOM: { + this->StartDolly(); + break; + } + } +} + diff --git a/src/src/Interaction/VolumeInteractorStyle.h b/src/src/Interaction/VolumeInteractorStyle.h new file mode 100644 index 0000000..3610bf4 --- /dev/null +++ b/src/src/Interaction/VolumeInteractorStyle.h @@ -0,0 +1,47 @@ +// +// Created by Krad on 2022/8/24. +// + +#ifndef OMEGAV_VOLUMEINTERACTORSTYLE_H +#define OMEGAV_VOLUMEINTERACTORSTYLE_H + +#include + +#define VOLUME_ROTATE3D 0 +#define VOLUME_ROTATE2D 1 +#define VOLUME_ZOOM 2 +#define VOLUME_PAN 3 + +class VolumeInteractorStyle:public vtkInteractorStyleTrackballCamera { +public: + static VolumeInteractorStyle *New(); + + vtkTypeMacro(VolumeInteractorStyle, vtkInteractorStyleTrackballCamera); + + vtkSetClampMacro(InteractionMode, int, VOLUME_ROTATE3D, VOLUME_PAN); + vtkGetMacro(InteractionMode, int); + + void OnLeftButtonDown() override; +// void OnLeftButtonUp() override; +// void OnRightButtonDown() override; +// void OnRightButtonUp() override; +// void OnMouseMove() override; + + void OnMouseWheelForward() override{}; + void OnMouseWheelBackward() override{}; + +protected: + VolumeInteractorStyle(); + + ~VolumeInteractorStyle() override; + +private: + VolumeInteractorStyle(const VolumeInteractorStyle &) = delete; + + void operator=(const VolumeInteractorStyle &) = delete; + + int InteractionMode; +}; + + +#endif //OMEGAV_VOLUMEINTERACTORSTYLE_H diff --git a/src/src/Rendering/Viewer/VolumeRenderingViewer.cpp b/src/src/Rendering/Viewer/VolumeRenderingViewer.cpp index c79198e..34c6c6d 100644 --- a/src/src/Rendering/Viewer/VolumeRenderingViewer.cpp +++ b/src/src/Rendering/Viewer/VolumeRenderingViewer.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include @@ -19,6 +18,8 @@ #include #include +#include "Interaction/VolumeInteractorStyle.h" + vtkStandardNewMacro(VolumeRenderingViewer); VolumeRenderingViewer::VolumeRenderingViewer() @@ -112,7 +113,9 @@ void VolumeRenderingViewer::InstallPipeline() { if (this->Interactor) { if (!this->InteractorStyle) { - this->InteractorStyle = vtkInteractorStyleTrackballCamera::New(); + auto style = VolumeInteractorStyle::New(); + style->SetInteractionMode(0); + this->InteractorStyle = style; } this->Interactor->SetInteractorStyle(this->InteractorStyle); @@ -241,3 +244,10 @@ void VolumeRenderingViewer::printFrameRate() { sprintf(buff,"FPS:%3.0f", fps); annotation->SetText(0,buff ); } + +void VolumeRenderingViewer::SetInteractorStyleMode(int mode) { + auto style = VolumeInteractorStyle::SafeDownCast(InteractorStyle); + if (style){ + style->SetInteractionMode(mode); + } +} diff --git a/src/src/Rendering/Viewer/VolumeRenderingViewer.h b/src/src/Rendering/Viewer/VolumeRenderingViewer.h index 692d5fd..510f0ec 100644 --- a/src/src/Rendering/Viewer/VolumeRenderingViewer.h +++ b/src/src/Rendering/Viewer/VolumeRenderingViewer.h @@ -68,6 +68,8 @@ public: */ virtual void SetupInteractor(vtkRenderWindowInteractor *); + void SetInteractorStyleMode(int mode); + protected: VolumeRenderingViewer(); diff --git a/src/src/UI/Widget/ToolBar/VolumeRenderingToolBar.cpp b/src/src/UI/Widget/ToolBar/VolumeRenderingToolBar.cpp index 5cf8d37..53752be 100644 --- a/src/src/UI/Widget/ToolBar/VolumeRenderingToolBar.cpp +++ b/src/src/UI/Widget/ToolBar/VolumeRenderingToolBar.cpp @@ -4,10 +4,80 @@ #include "VolumeRenderingToolBar.h" +#include +#include + VolumeRenderingToolBar::VolumeRenderingToolBar(QWidget *parent) : QToolBar(parent) { + auto btnReset = new QToolButton(this); + addButton(btnReset, "reset"); + + auto mBtnAnonymize = new QToolButton(this); + addButton(mBtnAnonymize, "anonymize"); + addSeparator(); + auto group = new QButtonGroup(this); + + + auto btnFreeRotate = new QToolButton(this); + addButton(btnFreeRotate, "freeRotate"); + btnFreeRotate->setCheckable(true); + btnFreeRotate->setChecked(true); + auto btnRotate = new QToolButton(this); + addButton(btnRotate, "planeRotate"); + btnRotate->setCheckable(true); + auto btnPan = new QToolButton(this); + addButton(btnPan, "pan"); + btnPan->setCheckable(true); + auto btnZoom = new QToolButton(this); + addButton(btnZoom, "zoom"); + btnZoom->setCheckable(true); + auto btnWindow = new QToolButton(this); + addButton(btnWindow, "window"); + btnWindow->setCheckable(true); + + group->addButton(btnFreeRotate,0); + group->addButton(btnRotate,1); + group->addButton(btnZoom,2); + group->addButton(btnPan,3); + group->setExclusive(true); + + connect(group, static_cast(&QButtonGroup::buttonClicked),this,&VolumeRenderingToolBar::modeButtonClicked); + + addSeparator(); + auto btnMeasure = new QToolButton(this); + addButton(btnMeasure, "measure"); + addSeparator(); + auto btnPreset = new QToolButton(this); + addButton(btnPreset, "preset"); + addSeparator(); + auto btnSetting = new QToolButton(this); + addButton(btnSetting, "setting"); + + + QWidget *spacer = new QWidget(this); + spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + addWidget(spacer); + + auto mBtnMinimize = new QToolButton(this); + auto mBtnMaximize = new QToolButton(this); + auto mBtnClose = new QToolButton(this); + auto mBtnFullScreen = new QToolButton(this); + auto mActionMinimize = addButton(mBtnMinimize, "minimize"); + auto mActionMaximize = addButton(mBtnMaximize, "maximize"); + auto mActionClose = addButton(mBtnClose, "close"); + auto mActionFullScreen = addButton(mBtnFullScreen, "fullscreen"); + + mActionMinimize->setVisible(false); + mActionMaximize->setVisible(false); + mActionClose->setVisible(false); } VolumeRenderingToolBar::~VolumeRenderingToolBar() { } + +QAction* VolumeRenderingToolBar::addButton(QToolButton* button, const char* objectName) { + button->setObjectName(objectName); + button->setToolButtonStyle(Qt::ToolButtonIconOnly); + return addWidget(button); +} \ No newline at end of file diff --git a/src/src/UI/Widget/ToolBar/VolumeRenderingToolBar.h b/src/src/UI/Widget/ToolBar/VolumeRenderingToolBar.h index d8eac23..756f23d 100644 --- a/src/src/UI/Widget/ToolBar/VolumeRenderingToolBar.h +++ b/src/src/UI/Widget/ToolBar/VolumeRenderingToolBar.h @@ -7,12 +7,19 @@ #include +class QAction; + class VolumeRenderingToolBar : public QToolBar { Q_OBJECT public: explicit VolumeRenderingToolBar(QWidget *parent = nullptr); - ~VolumeRenderingToolBar(); + ~VolumeRenderingToolBar() override; +signals: + void modeButtonClicked(int id); + +private: + QAction* addButton(QToolButton* button, const char* objectName); }; diff --git a/src/src/UI/Window/VolumeRenderingWindow.cpp b/src/src/UI/Window/VolumeRenderingWindow.cpp index ecd9e04..aae266b 100644 --- a/src/src/UI/Window/VolumeRenderingWindow.cpp +++ b/src/src/UI/Window/VolumeRenderingWindow.cpp @@ -36,6 +36,11 @@ VolumeRenderingWindow::VolumeRenderingWindow(QWidget *parent , Qt::WindowFlags f widget->SetRenderWindow(mRenderWin); layout->addWidget(widget); setMinimumSize(680,500); + + connect(toolBar, &VolumeRenderingToolBar::modeButtonClicked,[=](int mode){ + printf("mode:%d \r\n", mode); + mViewer->SetInteractorStyleMode(mode); + }); } VolumeRenderingWindow::~VolumeRenderingWindow() {