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() {