]> Creatis software - clitk.git/blob - vv/vvToolRigidReg.cxx
Added AutoRegister..........
[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
19 // vv
20 #include "vvToolRigidReg.h"
21 #include "vvImageReader.h"
22 #include "vvSlicer.h"
23
24 // vtk
25 #include <vtkImageData.h>
26 #include <vtkSmartPointer.h>
27 #include <vtkTransform.h>
28
29 // clitk
30 #include "clitkTransformUtilities.h"
31 #include "clitkAffineRegistrationGenericFilter.h"       
32 // qt
33 #include <QMessageBox>
34 #include <QFileDialog>
35 #include <QTextStream>
36 #include <QComboBox>
37 #include <QCursor>
38
39 //------------------------------------------------------------------------------
40 // Create the tool and automagically (I like this word) insert it in
41 // the main window menu.
42 ADD_TOOL(vvToolRigidReg);
43 //------------------------------------------------------------------------------
44
45 //------------------------------------------------------------------------------
46 vvToolRigidReg::vvToolRigidReg(vvMainWindowBase * parent, Qt::WindowFlags f):
47     vvToolWidgetBase(parent, f),
48     vvToolBase<vvToolRigidReg>(parent),
49     Ui::vvToolRigidReg()
50 {
51   // GUI Initialization
52   Ui_vvToolRigidReg::setupUi(mToolWidget);
53    // QSize qsize;
54 //    qsize.setHeight(470);
55 //    qsize.setWidth(850);
56 //    mToolWidget->setFixedSize(qsize);
57
58
59   // Set how many inputs are needed for this tool
60  // mFilter = new clitk::AffineTransformGenericFilter<args_info_clitkAffineTransform>;
61   mFilter = new clitk::AffineRegistrationGenericFilter<args_info_clitkAffineRegistration>;
62
63   // Set how many inputs are needed for this tool
64  AddInputSelector("Select moving image",mFilter);
65  AddInputSelector("Select fixed image",mFilter);
66 }
67 //------------------------------------------------------------------------------
68
69 //------------------------------------------------------------------------------
70 vvToolRigidReg::~vvToolRigidReg()
71 {
72 }
73 //------------------------------------------------------------------------------
74
75 //------------------------------------------------------------------------------
76 bool vvToolRigidReg::close()
77 {
78   ResetTransform();
79   RemoveOverlay();
80   return vvToolWidgetBase::close();
81 }
82 //------------------------------------------------------------------------------
83
84 //------------------------------------------------------------------------------
85 void vvToolRigidReg::reject()
86 {
87
88   return vvToolWidgetBase::reject();
89 }
90 //------------------------------------------------------------------------------
91
92 //------------------------------------------------------------------------------
93 void vvToolRigidReg::GetArgsInfoFromGUI()
94 {
95   QString str;
96   str.append("Configs Loaded for AutoRegister...Apply Filter...");
97     tab2textedit->setText(str);
98  /* cmdline_parser_clitkAffineRegistration_configfile("/home/bharath/bin/AffineReg.txt",&mArgsInfo,1,1,0);
99     mArgsInfo.reference_arg=new char;
100   mArgsInfo.target_arg=new char;
101   mArgsInfo.output_arg=new char;
102   mArgsInfo.referenceMask_arg=new char;
103   mArgsInfo.targetMask_arg=new char;
104   mArgsInfo.initMatrix_arg=new char;
105   mArgsInfo.matrix_arg=new char;*/
106   mArgsInfo.referenceMask_given=0;
107   mArgsInfo.reference_given=0;
108   mArgsInfo.reference_arg=new char;
109   mArgsInfo.target_given=0;
110   mArgsInfo.target_arg=new char;
111   mArgsInfo.output_given=0;
112   mArgsInfo.output_arg=new char;
113   mArgsInfo.checker_after_given=0;
114   mArgsInfo.checker_before_given=0;
115   mArgsInfo.after_given=0;
116   mArgsInfo.before_given=0;
117  // std::string strouput= "/home/bharath/bin/Lung3Doutput.mhd";
118   //mArgsInfo.output_arg=const_cast<char*>(strouput.c_str());
119   mArgsInfo.threads_given=1;
120   mArgsInfo.threads_arg=3;
121   mArgsInfo.normalize_flag=0;
122   DD("GetArgsInfoFromGUI_2");
123   mArgsInfo.blur_arg=0.0;
124   mArgsInfo.referenceMask_arg=new char;
125   mArgsInfo.targetMask_arg=new char;
126   mArgsInfo.targetMask_given=0;
127   mArgsInfo.levels_given=1;
128   mArgsInfo.levels_arg=2;
129   mArgsInfo.moment_flag=1;
130   mArgsInfo.intThreshold_given=0;
131   mArgsInfo.intThreshold_arg=0.0;
132   mArgsInfo.transX_arg=0.0;
133   mArgsInfo.transY_arg=0.0;
134   mArgsInfo.transZ_arg=0.0;
135   mArgsInfo.transform_arg=2;
136   mArgsInfo.gradient_flag=1;
137   mArgsInfo.interp_given=1;
138   mArgsInfo.interp_arg=1;
139   mArgsInfo.interpOrder_given=1;
140   mArgsInfo.interpOrder_arg=3;
141   mArgsInfo.interpSF_given=1;
142   mArgsInfo.interpSF_arg=20;//default
143   mArgsInfo.metric_given=1;
144   mArgsInfo.metric_arg=0;
145   mArgsInfo.samples_arg=1;//default
146   mArgsInfo.stdDev_arg=0.4;
147   mArgsInfo.step_arg=2.0;
148   mArgsInfo.relax_arg=0.7;
149   mArgsInfo.valueTol_arg=0.01;
150   mArgsInfo.stepTol_arg=0.1;
151   mArgsInfo.gradTol_arg=1e-5;
152   mArgsInfo.lineAcc_arg=0.9;
153   mArgsInfo.convFactor_arg=1e+12;
154   mArgsInfo.maxIt_arg=500;
155   mArgsInfo.maxLineIt_arg=50;
156   mArgsInfo.maxEval_arg=500;
157   mArgsInfo.maxCorr_arg=5;
158   mArgsInfo.selectBound_arg=0;
159   mArgsInfo.inc_arg=1.2;
160   mArgsInfo.dec_arg=4;
161   mArgsInfo.optimizer_arg=1;
162   mArgsInfo.initMatrix_given=0;
163   mArgsInfo.initMatrix_arg=new char;
164    mArgsInfo.tWeight_given=1;
165     mArgsInfo.tWeight_arg=1.0;
166   mArgsInfo.rWeight_given=1.0;
167   mArgsInfo.rWeight_arg=50.0;
168   //  std::string str="/home/bharath/bin/matrix.txt";
169  // mArgsInfo.initMatrix_arg=const_cast<char*>(str.c_str());
170   mArgsInfo.matrix_given=0;
171 }
172 //------------------------------------------------------------------------------
173
174 //------------------------------------------------------------------------------
175 void vvToolRigidReg::InputIsSelected(std::vector<vvSlicerManager *> & l)
176 {
177   //inputs
178   mInput1 = l[0];
179   mInput2 = l[1];
180
181   UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),textEdit_2);
182
183   for(int i =0;i<4;i++)
184     for(int j=0;j<4;j++)
185      mInitialMatrix[i*4+j]=mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()->GetElement(i,j);
186
187   if(mInput1->GetFileName()==mInput2->GetFileName())
188   {
189     QMessageBox::information(this, "Warning","Your Reference and Target Images are the same");
190   }
191   mTwoInputs = true;
192   SetOverlay();
193   mImageSize=mInput1->GetImage()->GetSize();
194   SetRotationCenter();
195   SetSliderRanges();
196
197     //connect all sigs to slots
198    connect(resetbutton, SIGNAL(pressed()), this, SLOT(ResetTransform()));
199    connect(tab2loadbutton, SIGNAL(pressed()), this, SLOT(GetArgsInfoFromGUI()));
200    connect(tab2applybutton, SIGNAL(pressed()), this, SLOT(AutoRegister()));
201
202
203    connect(Xval, SIGNAL(editingFinished()), this, SLOT(SetXvalue()));
204    connect(Yval, SIGNAL(editingFinished()), this, SLOT(SetYvalue()));
205    connect(Zval, SIGNAL(editingFinished()), this, SLOT(SetZvalue()));
206
207    connect(xtrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
208    connect(ytrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
209    connect(ztrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
210
211
212    connect(xrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
213    connect(yrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
214    connect(zrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
215
216    connect(xtrans_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
217    connect(ytrans_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
218    connect(ztrans_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
219    connect(xrot_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
220    connect(yrot_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
221    connect(zrot_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
222    
223    connect(loadbutton, SIGNAL(pressed()), this, SLOT(ReadFile()));
224    connect(savebutton, SIGNAL(pressed()), this, SLOT(SaveFile()));
225
226 }
227 //------------------------------------------------------------------------------
228
229 //------------------------------------------------------------------------------
230 void vvToolRigidReg::apply()
231 {
232   RemoveOverlay();
233 }
234 //------------------------------------------------------------------------------
235
236 //------------------------------------------------------------------------------
237 void vvToolRigidReg::SetOverlay()
238 {
239     for (int i =0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
240    mCurrentSlicerManager->GetSlicer(i)->SetOverlay(mInput2->GetImage());
241    mCurrentSlicerManager->GetSlicer(i)->SetActorVisibility("overlay",0,true);
242    mCurrentSlicerManager->SetColorMap();
243    mCurrentSlicerManager->Render();
244    }
245   }
246 //------------------------------------------------------------------------------
247
248 //------------------------------------------------------------------------------
249 void vvToolRigidReg::RemoveOverlay()
250 {
251    for(int i=0;i<mCurrentSlicerManager->NumberOfSlicers();i++)
252          {
253            mInput1->RemoveActor("overlay",0);
254            mInput1->SetColorMap(0);
255            mInput1->Render();
256            hide();
257          }
258 }
259 //------------------------------------------------------------------------------
260
261 //------------------------------------------------------------------------------
262 void vvToolRigidReg::SetXvalue()
263 {
264   QString xstr = Xval->text();
265 }
266 //------------------------------------------------------------------------------
267
268 //------------------------------------------------------------------------------
269 void vvToolRigidReg::SetYvalue()
270 {
271   QString ystr = Yval->text();
272 }
273 //------------------------------------------------------------------------------
274
275 //------------------------------------------------------------------------------
276 void vvToolRigidReg::SetZvalue()
277 {
278   QString zstr = Zval->text();
279 }
280 //------------------------------------------------------------------------------
281
282 //------------------------------------------------------------------------------
283 void vvToolRigidReg::SetTransform(double tX, double tY, double tZ, double aX, double aY, double aZ,bool update)
284 {
285   vtkSmartPointer<vtkTransform> transform = mInput1->GetImage()->GetTransform();
286   transform->PostMultiply();
287   //Rotations
288   if (aX!=0 || aY!=0 || aZ!=0) {
289     double x, y ,z;
290     x= Xval->text().toDouble();
291     y= Yval->text().toDouble();
292     z= Zval->text().toDouble();
293     transform->Translate(-x,-y,-z);
294     if (aX!=0) transform->RotateX(aX);
295     if (aY!=0) transform->RotateY(aY);
296     if (aZ!=0) transform->RotateZ(aZ);
297     transform->Translate(x,y,z);
298   }
299   //Translations
300   if (tX!=0||tY!=0||tZ!=0)
301     transform->Translate(tX*mInput1->GetImage()->GetSpacing()[0],tY*mInput1->GetImage()->GetSpacing()[1],tZ*mInput1->GetImage()->GetSpacing()[2]);
302 }
303 //------------------------------------------------------------------------------
304
305 //------------------------------------------------------------------------------
306 void vvToolRigidReg::SetTransform(vtkMatrix4x4 *matrix)
307 {
308     vtkSmartPointer<vtkTransform> transform=vtkSmartPointer<vtkTransform>::New();
309     for(int i=0; i<4;i++)
310       for(int j=0;j<4;j++)
311     mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()->SetElement(i,j,matrix->GetElement(i,j));
312     
313     Render();
314 }
315 //------------------------------------------------------------------------------
316   
317 //------------------------------------------------------------------------------
318 void vvToolRigidReg::Render()
319 {
320     for (int i=0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
321        mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent();
322       mCurrentSlicerManager->GetSlicer(i)->Render();
323       }
324 }
325 //------------------------------------------------------------------------------
326
327 //------------------------------------------------------------------------------
328   void vvToolRigidReg::UpdateTextEditor(vtkMatrix4x4 *matrix,QTextEdit* textEdit)
329 {
330     QFont font=QFont("Times New Roman",11);
331     textEdit->setCurrentFont(font);
332     textEdit->update();
333
334     QString str1,str2,str3;
335     QColor color;
336     textEdit->clear();
337     textEdit->setAcceptRichText(true);
338     str2=textEdit->toPlainText();
339     str2.append("#Rotation Center(mm): \n#");
340     textEdit->setText(str2);
341
342     str2=textEdit->toPlainText();
343     textEdit->setTextColor(QColor(255,0,0));
344     str2.append(str3.append(Xval->text()));
345     textEdit->setText(str2);
346     str3.clear();
347
348     str2=textEdit->toPlainText();
349     str2.append("\t");
350     textEdit->setText(str2);
351
352     str2=textEdit->toPlainText();
353     str2.append(str3.append(Yval->text()));
354     textEdit->setText(str2);
355     str3.clear();
356
357     str2=textEdit->toPlainText();
358     str2.append("\t");
359     textEdit->setText(str2);
360
361
362     str2=textEdit->toPlainText();
363     str2.append(str3.append(Zval->text()));
364     textEdit->setText(str2);
365
366
367     str2=textEdit->toPlainText();
368     str2.append("\n");
369     textEdit->setText(str2);
370
371
372     str2=textEdit->toPlainText();
373     str2.append("#Transformation Matrix(mm):\n");
374     textEdit->setText(str2);
375     for(int i=0;i<4;i++)
376     {
377     for(int j=0;j<4;j++)
378       {
379     str2=textEdit->toPlainText();
380    // str2.append("\t"+str1.setNum(matrix->Element[i][j]));
381     str2.append(QString("%1\t").arg(str1.setNum(matrix->Element[i][j]),2));
382     textEdit->setText(str2);
383       }
384     str2=textEdit->toPlainText();
385     str2.append("\n");
386     textEdit->setText(str2);
387     }
388     //QString str = QFileDialog::getOpenFileName();
389     textEdit->setTextColor(QColor(255,0,0));
390     textEdit->setFont(QFont("courrier new",12,4,true));
391     textEdit->toPlainText().toAscii();
392
393     str2=textEdit->toPlainText();
394     textEdit->setText(str2);
395 }
396 //------------------------------------------------------------------------------
397
398 //------------------------------------------------------------------------------
399 void vvToolRigidReg::UpdateTransform_sliders()
400 {
401        InitializeSliders(xtrans_slider->value()*mInput1->GetImage()->GetSpacing()[0],
402                          ytrans_slider->value()*mInput1->GetImage()->GetSpacing()[1],
403                          ztrans_slider->value()*mInput1->GetImage()->GetSpacing()[2],
404                         xrot_slider->value(),yrot_slider->value(),zrot_slider->value(),false);
405         UpdateTransform(true);
406        // Render();
407 }
408 //------------------------------------------------------------------------------
409
410 //------------------------------------------------------------------------------
411 void vvToolRigidReg::UpdateTransform_sb()
412 {
413    InitializeSliders(xtrans_sb->value(),
414       ytrans_sb->value(),
415       ztrans_sb->value(),
416                         xrot_sb->value(),yrot_sb->value(),zrot_sb->value(),false);
417                         DD(xtrans_sb->value());
418       UpdateTransform(false);
419    //   Render();
420 }
421 //------------------------------------------------------------------------------
422
423 //------------------------------------------------------------------------------
424 void vvToolRigidReg::AutoRegister()
425
426     if (!mCurrentSlicerManager) close();
427     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
428   
429     std::vector<vvImage::Pointer> inputs;
430     // Input
431     inputs.push_back(mInput1->GetImage());
432     inputs.push_back(mInput2->GetImage());
433     // Check input type
434     // Main filter
435     clitk::AffineRegistrationGenericFilter<args_info_clitkAffineRegistration>::Pointer filter =
436     clitk::AffineRegistrationGenericFilter<args_info_clitkAffineRegistration>::New();
437     filter->SetInputVVImages(inputs);
438     filter->SetArgsInfo(mArgsInfo);
439     DD("ArgsInfo given in");
440     filter->EnableReadOnDisk(false);
441     filter->Update();
442     DD("I am done...! Updated");
443     vvImage::Pointer output = filter->GetOutputVVImage();
444     DD("filter getoutput done...");
445     std::ostringstream osstream;
446     osstream << "Registered" << "_ "
447            << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
448     AddImage(output,osstream.str());
449    
450     QApplication::restoreOverrideCursor();
451     close();
452 }
453 //------------------------------------------------------------------------------
454
455 //------------------------------------------------------------------------------
456 void vvToolRigidReg::UpdateTransform(bool slider_enabled)
457 {
458      vtkSmartPointer<vtkTransform> transform_final=vtkSmartPointer<vtkTransform>::New();
459      transform_final->SetMatrix(mInitialMatrix);
460      transform_final->PostMultiply();
461   //Rotations
462     double x=0, y=0 ,z=0;
463     x= Xval->text().toDouble();
464     y= Yval->text().toDouble();
465     z= Zval->text().toDouble();
466     transform_final->Translate(-x,-y,-z);
467     if(slider_enabled){
468     transform_final->RotateY(yrot_slider->value());
469     transform_final->RotateX(xrot_slider->value());
470     transform_final->RotateZ(zrot_slider->value());
471     }
472     else{
473     transform_final->RotateY(yrot_sb->value());
474     transform_final->RotateX(xrot_sb->value());
475     transform_final->RotateZ(zrot_sb->value());
476     }
477     transform_final->Translate(x,y,z);
478     transform_final->PreMultiply();
479     if(slider_enabled){
480     transform_final->Translate(xtrans_slider->value()*mInput1->GetImage()->GetSpacing()[0],0,0);
481     transform_final->Translate(0,ytrans_slider->value()*mInput1->GetImage()->GetSpacing()[1],0);
482     transform_final->Translate(0,0,ztrans_slider->value()*mInput1->GetImage()->GetSpacing()[2]);
483     }
484     else{
485     transform_final->Translate(xtrans_sb->value(),0,0);
486     transform_final->Translate(0,ytrans_sb->value(),0);
487     transform_final->Translate(0,0,ztrans_sb->value());
488     }
489     SetTransform(transform_final->GetMatrix());
490     UpdateTextEditor(transform_final->GetMatrix(),textEdit);
491 }
492 //------------------------------------------------------------------------------
493
494
495 //------------------------------------------------------------------------------
496 void vvToolRigidReg::SaveFile()
497 {
498   //Write the Transformation Matrix
499     QString f1 = QFileDialog::getSaveFileName(this, tr("Save Transformation Matrix File"),
500                                               mMainWindow->GetInputPathName(),
501                                               tr("Text (*.mat *.txt *.doc *.rtf)"));
502     QFile file1(f1);
503     std::vector<QString> transparameters;
504     QString line1;
505
506     for(int i =0;i<4;i++)
507       for(int j=0;j<4;j++)
508     transparameters.push_back(line1.setNum(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()->Element[i][j]));
509
510     if (file1.open(QFile::WriteOnly | QFile::Truncate)) {
511     QTextStream out1(&file1);
512      for(int i =0;i<4;i++){
513       for(int j=0;j<4;j++) {
514       out1<<transparameters[i*4+j]+"\t";
515       }
516       out1<<"\n";
517      }
518     }
519      else
520      {
521       QMessageBox::information(this,"Warning","Error Reading Parameters");
522      }
523 }
524 //------------------------------------------------------------------------------
525
526 //------------------------------------------------------------------------------
527 void vvToolRigidReg::ReadFile()
528 {
529    std::string x;
530    QString center;
531    double * orientations=new double[3];
532    double * translations=new double[3];
533    vtkMatrix4x4 *matrix=vtkMatrix4x4::New();
534    vtkSmartPointer<vtkTransform> transform = mCurrentSlicerManager->GetImage()->GetTransform();
535
536    //Open File to read the transformation parameters
537   
538     transform->SetMatrix(matrix);
539     transform->GetOrientation(orientations);
540     transform->PostMultiply();
541
542      //Obtain the Rotation Center , set it to origin
543     Xval->setText(center.setNum(0));            
544     Yval->setText(center.setNum(0));
545     Zval->setText(center.setNum(0));
546
547     //In the Order or Y X Z //
548     //now  postmultiply for the rotations
549     SetTransform(0,0,0,0,0,-rint(orientations[2]),false);
550     SetTransform(0,0,0,-rint(orientations[0]),0,0,false);
551     SetTransform(0,0,0,0,-rint(orientations[1]),0,false);
552
553     transform->GetPosition(translations);
554     transform->Identity();
555
556     DD(translations[0]/mInput1->GetImage()->GetSpacing()[0]);
557     DD(translations[1]/mInput1->GetImage()->GetSpacing()[1]);
558     DD(translations[2]/mInput1->GetImage()->GetSpacing()[2]);
559     DD(orientations[0]);
560     DD(orientations[1]);
561     DD(orientations[2]);
562       //set the sliders  and spin box values
563     InitializeSliders(rint(translations[0]),rint(translations[1])
564     ,rint(translations[2]),rint(orientations[0]),rint(orientations[1]),rint(orientations[2]),true);
565     SetTransform(matrix);
566 }
567 //------------------------------------------------------------------------------
568
569 //------------------------------------------------------------------------------
570 void vvToolRigidReg::ResetTransform()
571 {
572   vtkMatrix4x4 *matrix = vtkMatrix4x4::New();
573   for(int i=0;i<4;i++)
574     for(int j=0;j<4;j++)
575           matrix->SetElement(i,j,mInitialMatrix[i*4+j]);
576    SetTransform(matrix);
577    SetRotationCenter();
578    SetSliderRanges();
579    UpdateTextEditor(matrix,textEdit);
580 }
581 //------------------------------------------------------------------------------
582
583 //------------------------------------------------------------------------------
584 void vvToolRigidReg::SetRotationCenter()
585 {
586     //default image rotation center is the center of the image
587     QString xcord,ycord,zcord;
588     std::vector<double> imageorigin;
589     imageorigin=mInput1->GetImage()->GetOrigin();
590     DD("before bug");
591     xcord=xcord.setNum(imageorigin[0]+mImageSize[0]*mInput1->GetImage()->GetSpacing()[0]/2, 'g', 3);
592     ycord=ycord.setNum(imageorigin[1]+mImageSize[1]*mInput1->GetImage()->GetSpacing()[1]/2, 'g', 3);
593     zcord=zcord.setNum(imageorigin[2]+mImageSize[2]*mInput1->GetImage()->GetSpacing()[2]/2, 'g', 3);
594
595     Xval->setText(xcord);
596     Yval->setText(ycord);
597     Zval->setText(zcord);
598     InitializeSliders(0,0,0,0,0,0,true);
599 }
600 //------------------------------------------------------------------------------
601
602 //------------------------------------------------------------------------------
603 void vvToolRigidReg::InitializeSliders(double xtrans,double ytrans, double ztrans, double xrot, double yrot, double zrot,bool sliders)
604 {
605
606     xtrans_sb->blockSignals(true);
607     xtrans_sb->setSingleStep(mInput1->GetImage()->GetSpacing()[0]);
608     xtrans_sb->setValue(xtrans);
609     xtrans_sb->blockSignals(false);
610     ytrans_sb->blockSignals(true);
611     ytrans_sb->setSingleStep(mInput1->GetImage()->GetSpacing()[1]);
612     ytrans_sb->setValue(ytrans);
613     ytrans_sb->blockSignals(false);
614     ztrans_sb->blockSignals(true);
615     ztrans_sb->setSingleStep(mInput1->GetImage()->GetSpacing()[2]);
616     ztrans_sb->setValue(ztrans);
617     ztrans_sb->blockSignals(false);
618
619     if(sliders){
620     xtrans_slider->blockSignals(true);
621     xtrans_slider->setValue(rint(xtrans));
622     xtrans_slider->blockSignals(false);
623     ytrans_slider->blockSignals(true);
624     ytrans_slider->setValue(rint(ytrans));
625     ytrans_slider->blockSignals(false);
626     ztrans_slider->blockSignals(true);
627     ztrans_slider->setValue(rint(ztrans));
628     ztrans_slider->blockSignals(false);
629     }
630     xrot_sb->blockSignals(true);
631     xrot_sb->setValue(xrot);                                                                    
632     xrot_sb->blockSignals(false);
633     yrot_sb->blockSignals(true);
634     yrot_sb->setValue(yrot);
635     yrot_sb->blockSignals(false);
636     zrot_sb->blockSignals(true);
637     zrot_sb->setValue(zrot);
638     zrot_sb->blockSignals(false);
639     xrot_slider->blockSignals(true);
640     xrot_slider->setValue(xrot);
641     xrot_slider->blockSignals(false);
642     yrot_slider->blockSignals(true);
643     yrot_slider->setValue(yrot);
644     yrot_slider->blockSignals(false);
645     zrot_slider->blockSignals(true);
646     zrot_slider->setValue(zrot);
647     zrot_slider->blockSignals(false);
648 }
649 //------------------------------------------------------------------------------
650
651 //------------------------------------------------------------------------------
652 void vvToolRigidReg::SetSliderRanges()
653 {
654   xtrans_slider->blockSignals(true);
655   xtrans_slider->setRange(-2000,2000);
656   xtrans_slider->blockSignals(false);
657
658   ytrans_slider->blockSignals(true);
659   ytrans_slider->setRange(-2000,2000);
660   ytrans_slider->blockSignals(false);
661
662   ztrans_slider->blockSignals(true);
663   ztrans_slider->setRange(-2000,2000);
664   ztrans_slider->blockSignals(false);
665
666   xtrans_sb->blockSignals(true);
667   xtrans_sb->setRange(-2000,2000);
668   xtrans_sb->setDecimals(3);
669   xtrans_sb->blockSignals(false);
670
671   ytrans_sb->blockSignals(true);
672   ytrans_sb->setRange(-2000,2000);
673   ytrans_sb->setDecimals(3);
674   ytrans_sb->blockSignals(false);
675
676   ztrans_sb->blockSignals(true);
677   ztrans_sb->setRange(-2000,2000);
678   ztrans_sb->setDecimals(3);
679   ztrans_sb->blockSignals(false);
680
681   xrot_slider->blockSignals(true);
682   xrot_slider->setRange(-360,360);
683   xrot_slider->blockSignals(false);
684
685   yrot_slider->blockSignals(true);
686   yrot_slider->setRange(-360,360);
687   yrot_slider->blockSignals(false);
688
689   zrot_slider->blockSignals(true);
690   zrot_slider->setRange(-360,360);
691   zrot_slider->blockSignals(false);
692
693   xrot_sb->blockSignals(true);
694   xrot_sb->setRange(-360,360);
695   xrot_sb->blockSignals(false);
696
697   yrot_sb->blockSignals(true);
698   yrot_sb->setRange(-360,360);
699   yrot_sb->blockSignals(false);
700
701   zrot_sb->blockSignals(true);
702   zrot_sb->setRange(-360,360);
703   zrot_sb->blockSignals(false);
704 }