From 80092ec37383b8fdb99da1d13bf249c4986e372f Mon Sep 17 00:00:00 2001 From: Krad Date: Wed, 24 Aug 2022 14:50:37 +0800 Subject: [PATCH] VR mode button and VR mode style support. --- src/Combinear.css | 6 ++ src/Icon/Reset.png | Bin 0 -> 1694 bytes src/Icon/Settings.png | Bin 0 -> 1985 bytes src/Icon/preset.png | Bin 0 -> 1508 bytes src/Icon/rotate-3d.png | Bin 0 -> 1923 bytes src/Icon/rotate.png | Bin 0 -> 1588 bytes src/QDicomViewer.qrc | 5 ++ src/src/Interaction/VolumeInteractorStyle.cpp | 52 +++++++++++++ src/src/Interaction/VolumeInteractorStyle.h | 47 ++++++++++++ .../Viewer/VolumeRenderingViewer.cpp | 14 +++- .../Rendering/Viewer/VolumeRenderingViewer.h | 2 + .../Widget/ToolBar/VolumeRenderingToolBar.cpp | 70 ++++++++++++++++++ .../Widget/ToolBar/VolumeRenderingToolBar.h | 9 ++- src/src/UI/Window/VolumeRenderingWindow.cpp | 5 ++ 14 files changed, 207 insertions(+), 3 deletions(-) create mode 100644 src/Icon/Reset.png create mode 100644 src/Icon/Settings.png create mode 100644 src/Icon/preset.png create mode 100644 src/Icon/rotate-3d.png create mode 100644 src/Icon/rotate.png create mode 100644 src/src/Interaction/VolumeInteractorStyle.cpp create mode 100644 src/src/Interaction/VolumeInteractorStyle.h 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 0000000000000000000000000000000000000000..23919b54d0f6ae1dac4f1a463461b041e5ea5414 GIT binary patch literal 1694 zcmV;P24VS$P)Px*SV=@dRA@uhT78IARTMwxjyeXpTT9uOp<5JEBF?>UmeoX!!af8+OG7H{gNh0S zEznfRP_hJVB@2?GsQ$1PC9EtcTa{&_o%inSs#{BFW=l>psh^GPIG!dN^Lh$c_uCA_w zGiJ=_7_56tr_+;+F)snY(*UqT2(c-VNc=hw;#4YC6N|+b6A{~v8;FgC$sppF#+XI` z_|9=09nn4qN6+&f1AzA}yGu_?YXC24+$Hr@|rxQ^vB2G8P+=Yl$Mfko2fM=CbN5h1K3UFO_xe#Iv z5nWSAMno+Duyf3qG4)fYPW>g!ncd#j)>hTo*?AuT@b}>W+p~!HsFd=n{&@QpptW8} zL|Xy~8WFKhO1Uda(8aK>>&`>OwE!@^5QB)zrIc?L?fGJJAYgL)9NVg@s#aH5S9cCY z@IFUFL&KOA);9Lu-8-5w#Wg{9GwDKTJR`8$?V>DcwsMyd~mEB6_#L_X>NT2s zcnh;xDYYuMLIq6XsJ?jXUlG+P3O-dyCqM%Q&0A>yY|2n(=pE2W+vgng)KQ&ZDr z@p$|&0Nm_@iD-@EIGeDwwRJ)^o83x8i$a+S0Qq6|hLmzoRNJU{&+|3{0B>};42!J;Uzn^Rv@f?0AfkV_T_dIZzFZSE%&*pZA`#gMhj!FjA0eXL9TySn zrId@qh|1O8-rhd$!i5X}T0`hO_WFl(R}V@+z8AJ} z9?~K@hKRGIl)sfiK2V!~!X=%A3o6Vjo2>uKJY`4?zfdcXqIxts+h^wWPuMfv? z@i|ke)SRHyzA_D_`KFasW1WJ}cb# z`W4Wh2mmF4nhDw+XBAz0mjY_F^ ziVU@0MfuP<5Jcj-?sbUBB8E~3ulMz%M~~jpU%feBDEEhyuBfP(QF3C7g$N-YBqG09 z9rl9zv~yO$7*j8V;B-#mrWMGSABMAu=xfJuekfUh&F;D`Z+cv;=2c`8B2FSAE);UQ ohKqy#_XH6g<}Uyo9*U*-Ke+D#0NCsbg8%>k07*qoM6N<$f_o4WfB*mh literal 0 HcmV?d00001 diff --git a/src/Icon/Settings.png b/src/Icon/Settings.png new file mode 100644 index 0000000000000000000000000000000000000000..dbc8be3e603d5582ddfd454fd371dc5b461ef524 GIT binary patch literal 1985 zcmV;y2R`_TP)Px+dr3q=RA@uhT4{__MG&rfvt)N&*+3K{5ydqUOi0|_S8oAVez-sUA!-l}-nR)} zk$9mdCLZyRCtkq=6^+LG020u|m@Fo^BJ;Xu!NjN_t457i1VLTbFt1FF^CmsL{f=2C zQ9IcmOjmc;*HzW^RXq^?=L4Iif3a9R0TIdbyi?NljG|~gGpoM7zKzW|yJ-NFQV#;a zwKqQYEaQ3JVC_(c1+><$ zG4m3ULB!j9-@hvlh+F`w%D-lAh={8J;1=Kae<~J>y`Ja24*-*68D^dt1i{zx?=TFH zK*X=i^~`)`5CpGlt)~IN%2;_r<|ZP#FAGE_0GIN{roSU%k(uWLzyZeZiiiU9aHUiT z0AyXlMrQ52DBm1rbR;NE~4pUWtg0IRw@)^KwKy0|4%E%%4R>b#Yh;c-Ki`7=DU~vn_vJ=KFrl zA4{du6lOjS0FGwnU)tK*-pTv?l}e=}qbQQhEkVBn5kKth?cE)pr?tL}nV+^U=!YN( z##w$GfG`ZFBjR@!FkO8$zLX(Yi$=5eeB$m=t44~wSI<~FE!8iJa4LL>IvwUxkOwuilSYX`>ytV|FYac zTm>+VnMcew8W9)zzW+{|7K4L>2TqwXbp2wG{x4&GeCf1hx@Tw@Wq*!_yFPjWIXM%mYCXe3WVdK@I?B zkOs_rpt-1}rRDJM?(T0KH@_YLPR^-(EVhA&#uYyj1Lbo0V?>-`SV7!Qs7Pg)MN!29 zN~wzh;MoiXRuR$VwoFpeL&SB}7?K$1a=a>#WKpG*6gw+2^r;j@6#zN7yt9JZv}x1i z_V)H+065A#%%xZY(4C{Bqdf~2EZFO?s_-V^PtFm?Miu}C0CMwn#4O%X>R^-SSAP$P zNY;%TN-1HZHCL#*!$4AftdtS}@>j=VWnC5kNn$S&(T+4ThGBREBHnMvIQ`n(Ln&1k zFU)*n5CjjTouiaG8UW5SlWQgbSJrd*|4WE?j`90rM09nAGE%8s70WR5%RvyFo8j*g zr*-V0DFBpGLUAuJ4$tg1IJy@v5YdHA2hh^e@=AAi_h)GvYpt(f=Eq|hd3k)_KP_WT z9nV3;D}CR8B5lpqty^dB+qduRMqDV~FExlurBZ(sMIU6nK=HimCGtG)_}<>$p@g8H za1h)3IhmmFp3ctBPaV`@+)LzofdJs!J$v>Xv`T0NtIxt1zaU%xm=z;ckbNpvy#sK%x~VjxpUH_NxxeD z-&jfcZx{7SDY5cm>mu?M^+Q8L?X9h?KU=*{DFqiLvCRFs@q`CK+;5$gU;Y>y8#}na zzkjsOItd#{F<-xmt@-Z87upX31E24iVo( z#2cCURI{izbjasI#*=svB96_?cr3u0zA#+N-3#< zQ<-AI`b&wZuEwrbR}*QkCn}!_Km@eb%b5A$1V#5EqP+3*%=QZ+zUTXXT^rr?frFVp zN5tt?t}%~FRX!Jhs_CU+RY%wm@pVL8DhVbG!+DZmaixc2p Tx4k!B00000NkvXXu0mjfjM}HM literal 0 HcmV?d00001 diff --git a/src/Icon/preset.png b/src/Icon/preset.png new file mode 100644 index 0000000000000000000000000000000000000000..88e674d5cfee07099c651f01741fc42a3a384a9e GIT binary patch literal 1508 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 JPDHLkV1jm)n{NOB literal 0 HcmV?d00001 diff --git a/src/Icon/rotate.png b/src/Icon/rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..1515628350a7bd36554dcd94273ce90f28e321bb GIT binary patch literal 1588 zcmV-42Fv-0P)Px)?ny*JRA@uhS!--mMHD{g?ros_Xib`;Xhciw55>6d%xoGJL=!;}6=IM_(C|YA zgC-_|g8UJF7!}lr(fB~CQNUPyp$0XgL4>C5opaL$e8x~86^KFf2R0_{-eYF7ySaP0 zyL)f9&q+3$+U_HOK} zO-=t*>mG*+(AL(LXl`y^?s?t{0FVH1UQDch0O)4sT@4KltwR+PTL2MV!ptiy%UaIN zm&GJq%KUo(cztkiu(hS7<*zuHu>=s&HfFvb5hurS62ta40BDs`ZYkGCYduXVb;8(0 z7C=Ow1Himez|8ywA|5qA&-1>msi`??YzGDg>X^CCw(UC4^Dachg#fUSna?dl@-xe_ zR-{s?e}Xnd^a22^%{|{-QGnw(GZ3*I5yKpsdAth|cM2g6#)veyuDgJl7X!fRuzra6 zH#0AhQhw!sPegwLKx6LN@v;J3*S(6F+e;AJY{*L~e~v>uB%&q(7!jp}tQSH&o$p6P z?8hi6Kx;i65q}LjM8pG`OlC_uojy;@ZK%!DD5okk)z+A};Y8G4m#+)Z@X~y5I}TvdqG64(pH=(9_d1bzoq?M8C;rWVZCXMvFWVJqiG3 zZ;92i0*L570C?Wl^OSAdvy#c=kFn6IFeaiu0O0(%5P1Q60pM0&=a;3F_r?XQ#$Ic^ z8xhUXJaS{^x3Rswy>`;1N#+P!oA1fYE0t13*(fsV5Dm4~wf`N(H#YirM$IdkTjC_rOvgIenyh$-=T`D)(?Jff5; zyLm(f9}PP*g?a$sim{yk)d)3H=$JqMGxKbv)S+rXN3*XP0sjpLnE4{5l)0Nuh-L(s zYhfXUN+~N|GslxMBj8^EnBrRl6Ke#t)`W<{Ct$*@ft>)ba>8bz;3<%qC)PgTy6&CK zT)69+s)G>X`th_-%W=W3uC8<s|D8a9?99LKo^5x+*nMA&9q7=c_l@f!fR)VCJ)2_Z~5e9RgVeF^~c zeFP3lDd!Y8`k861S0UmX0k$Jv4=oiPt@VS5Sg1_r63kp7#QsnLxr`K6T3oM`Dgqkm zAt9nW0N^dZA7*}1DYeo6?5vX~5lNGULOvsn+M?E4uSG=jCC1;#w(U8|WYQcy3oZ2M zT&BphOiI}{lF@fvcOx^ORY^?T-nPD5v>7$mqI$80)TB&%B|IohSqutBAPEVhJ4{(lE*DaKD($Z z5eQpMKJcF`%lg<<$fT5139D#A6PeU#4vnUSlM3rwiF_mhxy&>R5jOz9&1FcMi_yEx z+~;{-A0qxIcon/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() {