1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
5 - University of LYON http://www.universite-lyon.fr/
6 - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
7 - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the copyright notices for more information.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
18 #include "vvToolRigidReg.h"
21 #include <QApplication>
22 #include <vtkImageData.h>
23 #include <vtkSmartPointer.h>
24 #include <vtkTransform.h>
28 #include <QMessageBox>
29 #include <vvMainWindow.h>
30 //------------------------------------------------------------------------------
31 // Create the tool and automagically (I like this word) insert it in
32 // the main window menu.
33 ADD_TOOL(vvToolRigidReg);
34 //------------------------------------------------------------------------------
37 //------------------------------------------------------------------------------
38 vvToolRigidReg::vvToolRigidReg(vvMainWindowBase * parent, Qt::WindowFlags f):
39 vvToolWidgetBase(parent, f),
40 vvToolBase<vvToolRigidReg>(parent),
44 Ui_vvToolRigidReg::setupUi(mToolWidget);
46 // Set how many inputs are needed for this tool
47 AddInputSelector("Select the Reference Image");
48 AddInputSelector("Select the Target Image");
50 //------------------------------------------------------------------------------
53 //------------------------------------------------------------------------------
54 vvToolRigidReg::~vvToolRigidReg()
57 //------------------------------------------------------------------------------
60 //------------------------------------------------------------------------------
61 bool vvToolRigidReg::close()
63 return vvToolWidgetBase::close();
65 //------------------------------------------------------------------------------
68 //------------------------------------------------------------------------------
69 void vvToolRigidReg::reject()
71 return vvToolWidgetBase::reject();
73 //------------------------------------------------------------------------------
76 //------------------------------------------------------------------------------
77 void vvToolRigidReg::InputIsSelected(std::vector<vvSlicerManager *> & l)
86 for (int j = 1; j <= 4; j++) {
87 mCurrentSlicerManager->GetSlicer(j-1)->SetActorVisibility("overlay",0,true);
89 mCurrentSlicerManager->Render();
91 std::vector<int> imagesize;
92 imagesize=mCurrentSlicerManager->GetImage()->GetSize();
93 std::vector<double> imageorigin;
94 imageorigin=mCurrentSlicerManager->GetImage()->GetOrigin();
95 QString xcord,ycord,zcord;
97 //default image rotation center is the center of the image
98 xcord=xcord.setNum(imageorigin[0]+imagesize[0]*mCurrentSlicerManager->GetImage()->GetSpacing()[0]/2, 'g', 3);
99 ycord=ycord.setNum(imageorigin[1]+imagesize[1]*mCurrentSlicerManager->GetImage()->GetSpacing()[1]/2, 'g', 3);
100 zcord=zcord.setNum(imageorigin[2]+imagesize[2]*mCurrentSlicerManager->GetImage()->GetSpacing()[2]/2, 'g', 3);
102 Xval->setText(xcord);
103 Yval->setText(ycord);
104 Zval->setText(zcord);
106 xtrans_slider->setMaximum(2*mCurrentSlicerManager->GetImage()->GetSize()[0]);
107 xtrans_slider->setMinimum(-2*mCurrentSlicerManager->GetImage()->GetSize()[0]);
108 ytrans_slider->setMaximum(2*mCurrentSlicerManager->GetImage()->GetSize()[1]);
109 ytrans_slider->setMinimum(-2*mCurrentSlicerManager->GetImage()->GetSize()[1]);
110 ztrans_slider->setMaximum(2*mCurrentSlicerManager->GetImage()->GetSize()[2]);
111 ztrans_slider->setMinimum(-2*mCurrentSlicerManager->GetImage()->GetSize()[2]);
114 xtrans_sb->setMaximum(2*mCurrentSlicerManager->GetImage()->GetSize()[0]);
115 xtrans_sb->setMinimum(-2*mCurrentSlicerManager->GetImage()->GetSize()[0]);
116 ytrans_sb->setMaximum(2*mCurrentSlicerManager->GetImage()->GetSize()[1]);
117 ytrans_sb->setMinimum(-2*mCurrentSlicerManager->GetImage()->GetSize()[1]);
118 ztrans_sb->setMaximum(2*mCurrentSlicerManager->GetImage()->GetSize()[2]);
119 ztrans_sb->setMinimum(-2*mCurrentSlicerManager->GetImage()->GetSize()[2]);
121 xrot_slider->setMaximum(360);
122 xrot_slider->setMinimum(-360);
123 yrot_slider->setMaximum(360);
124 yrot_slider->setMinimum(-360);
125 zrot_slider->setMaximum(360);
126 zrot_slider->setMinimum(-360);
129 xrot_sb->setMaximum(360);
130 xrot_sb->setMinimum(-360);
131 yrot_sb->setMaximum(360);
132 yrot_sb->setMinimum(-360);
133 zrot_sb->setMaximum(360);
134 zrot_sb->setMinimum(-360);
136 //connect all sigs to slots
137 connect(Xval, SIGNAL(editingFinished()), this, SLOT(SetXvalue()));
138 connect(Yval, SIGNAL(editingFinished()), this, SLOT(SetYvalue()));
139 connect(Zval, SIGNAL(editingFinished()), this, SLOT(SetZvalue()));
140 connect(xtrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateXtranslider()));
141 connect(ytrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateYtranslider()));
142 connect(ztrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateZtranslider()));
143 connect(xrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateXrotslider()));
144 connect(yrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateYrotslider()));
145 connect(zrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateZrotslider()));
147 //------------------------------------------------------------------------------
149 //------------------------------------------------------------------------------
150 void vvToolRigidReg::apply()
154 //------------------------------------------------------------------------------
156 //------------------------------------------------------------------------------
157 void vvToolRigidReg::SetOverlay()
159 for (int i =0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
160 mCurrentSlicerManager->GetSlicer(i)->SetOverlay(mInput2->GetImage());
163 //------------------------------------------------------------------------------
165 //------------------------------------------------------------------------------
166 void vvToolRigidReg::SetXvalue()
168 QString xstr = Xval->text();
170 //------------------------------------------------------------------------------
172 //------------------------------------------------------------------------------
173 void vvToolRigidReg::SetYvalue()
175 QString ystr = Yval->text();
177 //------------------------------------------------------------------------------
179 //------------------------------------------------------------------------------
180 void vvToolRigidReg::SetZvalue()
182 QString zstr = Zval->text();
184 //------------------------------------------------------------------------------
186 //------------------------------------------------------------------------------
187 void vvToolRigidReg::SetTransform(double tX, double tY, double tZ, double aX, double aY, double aZ)
190 vtkSmartPointer<vtkTransform> transform = mCurrentSlicerManager->GetImage()->GetTransform();
191 transform->PostMultiply();
194 if (aX!=0 || aY!=0 || aZ!=0) {
196 x= Xval->text().toDouble();
197 y= Yval->text().toDouble();
198 z= Zval->text().toDouble();
199 transform->Translate(-x,-y,-z);
200 if (aX!=0) transform->RotateX(aX);
201 if (aY!=0) transform->RotateY(aY);
202 if (aZ!=0) transform->RotateZ(aZ);
203 transform->Translate(x,y,z);
207 if (tX!=0 || tY!=0 || tZ!=0)
208 transform->Translate(tX,tY,tZ);
212 for (int i=0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
213 mCurrentSlicerManager->GetImage()->UpdateReslice();
214 mCurrentSlicerManager->GetSlicer(i)->Render();
217 //------------------------------------------------------------------------------
219 //------------------------------------------------------------------------------
220 void vvToolRigidReg::UpdateXtranslider()
224 diff=xtrans_slider->value()-xtrans_sb->value();
225 this->SetTransform(diff, 0, 0, 0, 0, 0);
226 xtrans_sb->setValue(xtrans_slider->value());
228 //------------------------------------------------------------------------------
230 //------------------------------------------------------------------------------
231 void vvToolRigidReg::UpdateYtranslider()
234 diff=ytrans_slider->value()-ytrans_sb->value();
235 this->SetTransform(0, diff, 0, 0, 0, 0);
236 ytrans_sb->setValue(ytrans_slider->value());
238 //------------------------------------------------------------------------------
240 //------------------------------------------------------------------------------
241 void vvToolRigidReg::UpdateZtranslider()
244 diff=ztrans_slider->value()-ztrans_sb->value();
245 this->SetTransform(0, 0, diff, 0, 0, 0);
246 ztrans_sb->setValue(ztrans_slider->value());
248 //------------------------------------------------------------------------------
250 //------------------------------------------------------------------------------
251 void vvToolRigidReg::UpdateXrotslider()
254 diff=xrot_slider->value()-xrot_sb->value();
255 this->SetTransform(0, 0, 0, diff, 0, 0);
256 xrot_sb->setValue(xrot_slider->value());
258 //------------------------------------------------------------------------------
260 //------------------------------------------------------------------------------
261 void vvToolRigidReg::UpdateYrotslider()
264 diff=yrot_slider->value()-yrot_sb->value();
265 this->SetTransform(0, 0, 0, 0, diff, 0);
266 yrot_sb->setValue(yrot_slider->value());
268 //------------------------------------------------------------------------------
270 //------------------------------------------------------------------------------
271 void vvToolRigidReg::UpdateZrotslider()
274 diff=zrot_slider->value()-zrot_sb->value();
275 this->SetTransform(0, 0, 0, 0, 0, diff);
276 zrot_sb->setValue(zrot_slider->value());