]> Creatis software - clitk.git/blob - vv/vvToolRigidReg.cxx
Reformatted using new coding style
[clitk.git] / vv / vvToolRigidReg.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to:
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
8
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.
12
13   It is distributed under dual licence
14
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"
19 #include <QComboBox>
20 #include <QCursor>
21 #include <QApplication>
22 #include <vtkImageData.h>
23 #include <vtkSmartPointer.h>
24 #include <vtkTransform.h>
25 #include "vvImage.h"
26 #include "vvSlicer.h"
27 #include <QString>
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 //------------------------------------------------------------------------------
35
36
37 //------------------------------------------------------------------------------
38 vvToolRigidReg::vvToolRigidReg(vvMainWindowBase * parent, Qt::WindowFlags f):
39   vvToolWidgetBase(parent, f),
40   vvToolBase<vvToolRigidReg>(parent),
41   Ui::vvToolRigidReg()
42 {
43   // GUI Initialization
44   Ui_vvToolRigidReg::setupUi(mToolWidget);
45
46   // Set how many inputs are needed for this tool
47   AddInputSelector("Select the Reference Image");
48   AddInputSelector("Select the Target Image");
49 }
50 //------------------------------------------------------------------------------
51
52
53 //------------------------------------------------------------------------------
54 vvToolRigidReg::~vvToolRigidReg()
55 {
56 }
57 //------------------------------------------------------------------------------
58
59
60 //------------------------------------------------------------------------------
61 bool vvToolRigidReg::close()
62 {
63   return vvToolWidgetBase::close();
64 }
65 //------------------------------------------------------------------------------
66
67
68 //------------------------------------------------------------------------------
69 void vvToolRigidReg::reject()
70 {
71   return vvToolWidgetBase::reject();
72 }
73 //------------------------------------------------------------------------------
74
75
76 //------------------------------------------------------------------------------
77 void vvToolRigidReg::InputIsSelected(std::vector<vvSlicerManager *> & l)
78 {
79   //inputs
80   mInput1 = l[0];
81   mInput2 = l[1];
82   mTwoInputs = true;
83
84
85   SetOverlay();
86   for (int j = 1; j <= 4; j++) {
87     mCurrentSlicerManager->GetSlicer(j-1)->SetActorVisibility("overlay",0,true);
88   }
89   mCurrentSlicerManager->Render();
90
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;
96
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);
101
102   Xval->setText(xcord);
103   Yval->setText(ycord);
104   Zval->setText(zcord);
105
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]);
112
113
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]);
120
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);
127
128
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);
135
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()));
146 }
147 //------------------------------------------------------------------------------
148
149 //------------------------------------------------------------------------------
150 void vvToolRigidReg::apply()
151 {
152
153 }
154 //------------------------------------------------------------------------------
155
156 //------------------------------------------------------------------------------
157 void vvToolRigidReg::SetOverlay()
158 {
159   for (int i =0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
160     mCurrentSlicerManager->GetSlicer(i)->SetOverlay(mInput2->GetImage());
161   }
162 }
163 //------------------------------------------------------------------------------
164
165 //------------------------------------------------------------------------------
166 void vvToolRigidReg::SetXvalue()
167 {
168   QString xstr = Xval->text();
169 }
170 //------------------------------------------------------------------------------
171
172 //------------------------------------------------------------------------------
173 void vvToolRigidReg::SetYvalue()
174 {
175   QString ystr = Yval->text();
176 }
177 //------------------------------------------------------------------------------
178
179 //------------------------------------------------------------------------------
180 void vvToolRigidReg::SetZvalue()
181 {
182   QString zstr = Zval->text();
183 }
184 //------------------------------------------------------------------------------
185
186 //------------------------------------------------------------------------------
187 void vvToolRigidReg::SetTransform(double tX, double tY, double tZ, double aX, double aY, double aZ)
188 {
189
190   vtkSmartPointer<vtkTransform> transform = mCurrentSlicerManager->GetImage()->GetTransform();
191   transform->PostMultiply();
192
193   //Rotations
194   if (aX!=0 || aY!=0 || aZ!=0) {
195     double x, y ,z;
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);
204   }
205
206   //Translations
207   if (tX!=0 || tY!=0 || tZ!=0)
208     transform->Translate(tX,tY,tZ);
209
210   transform->Update();
211
212   for (int i=0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
213     mCurrentSlicerManager->GetImage()->UpdateReslice();
214     mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent();
215     mCurrentSlicerManager->GetSlicer(i)->Render();
216   }
217 }
218 //------------------------------------------------------------------------------
219
220 //------------------------------------------------------------------------------
221 void vvToolRigidReg::UpdateXtranslider()
222 {
223
224   int diff=0;
225   diff=xtrans_slider->value()-xtrans_sb->value();
226   this->SetTransform(diff, 0, 0, 0, 0, 0);
227   xtrans_sb->setValue(xtrans_slider->value());
228 }
229 //------------------------------------------------------------------------------
230
231 //------------------------------------------------------------------------------
232 void vvToolRigidReg::UpdateYtranslider()
233 {
234   int diff=0;
235   diff=ytrans_slider->value()-ytrans_sb->value();
236   this->SetTransform(0, diff, 0, 0, 0, 0);
237   ytrans_sb->setValue(ytrans_slider->value());
238 }
239 //------------------------------------------------------------------------------
240
241 //------------------------------------------------------------------------------
242 void vvToolRigidReg::UpdateZtranslider()
243 {
244   int diff=0;
245   diff=ztrans_slider->value()-ztrans_sb->value();
246   this->SetTransform(0, 0, diff, 0, 0, 0);
247   ztrans_sb->setValue(ztrans_slider->value());
248 }
249 //------------------------------------------------------------------------------
250
251 //------------------------------------------------------------------------------
252 void vvToolRigidReg::UpdateXrotslider()
253 {
254   int diff=0;
255   diff=xrot_slider->value()-xrot_sb->value();
256   this->SetTransform(0, 0, 0, diff, 0, 0);
257   xrot_sb->setValue(xrot_slider->value());
258 }
259 //------------------------------------------------------------------------------
260
261 //------------------------------------------------------------------------------
262 void vvToolRigidReg::UpdateYrotslider()
263 {
264   int diff=0;
265   diff=yrot_slider->value()-yrot_sb->value();
266   this->SetTransform(0, 0, 0, 0, diff, 0);
267   yrot_sb->setValue(yrot_slider->value());
268 }
269 //------------------------------------------------------------------------------
270
271 //------------------------------------------------------------------------------
272 void vvToolRigidReg::UpdateZrotslider()
273 {
274   int diff=0;
275   diff=zrot_slider->value()-zrot_sb->value();
276   this->SetTransform(0, 0, 0, 0, 0, diff);
277   zrot_sb->setValue(zrot_slider->value());
278 }