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 ======================================================================-====*/
20 #include "vvToolRigidReg.h"
21 #include "vvImageReader.h"
25 #include <vtkImageData.h>
26 #include <vtkSmartPointer.h>
27 #include <vtkTransform.h>
30 #include "clitkTransformUtilities.h"
31 #include "clitkAffineRegistrationGenericFilter.h"
33 #include <QMessageBox>
34 #include <QFileDialog>
35 #include <QTextStream>
40 //------------------------------------------------------------------------------
41 // Create the tool and automagically (I like this word) insert it in
42 // the main window menu.
43 ADD_TOOL(vvToolRigidReg);
44 //------------------------------------------------------------------------------
46 //------------------------------------------------------------------------------
47 vvToolRigidReg::vvToolRigidReg(vvMainWindowBase * parent, Qt::WindowFlags f):
48 vvToolWidgetBase(parent, f),
49 vvToolBase<vvToolRigidReg>(parent),
53 Ui_vvToolRigidReg::setupUi(mToolWidget);
55 // qsize.setHeight(470);
56 // qsize.setWidth(850);
57 // mToolWidget->setFixedSize(qsize);
58 // Set how many inputs are needed for this tool
59 mFilter = new clitk::AffineRegistrationGenericFilter;
61 cb_interpolator->hide();
64 cb_selectoutput->hide();
70 interpollabel->hide();
73 // Set how many inputs are needed for this tool
74 AddInputSelector("Select moving image",mFilter);
75 AddInputSelector("Select fixed image",mFilter);
77 //------------------------------------------------------------------------------
79 //------------------------------------------------------------------------------
80 vvToolRigidReg::~vvToolRigidReg()
83 //------------------------------------------------------------------------------
85 //------------------------------------------------------------------------------
86 bool vvToolRigidReg::close()
90 return vvToolWidgetBase::close();
92 //------------------------------------------------------------------------------
94 //------------------------------------------------------------------------------
95 void vvToolRigidReg::reject()
98 return vvToolWidgetBase::reject();
100 //------------------------------------------------------------------------------
102 //------------------------------------------------------------------------------
103 void vvToolRigidReg::GetArgsInfoFromGUI()
105 QFont font=QFont("Courier",10);
106 tab2textedit->setTextColor(QColor(255,0,0));
107 tab2textedit->setCurrentFont(font);
108 tab2textedit->update();
110 QString file = QFileDialog::getOpenFileName(
112 "Locate the Config File",
113 mMainWindow->GetInputPathName(),
114 "Text (*.conf *.txt *.rtf *.doc)");
116 DD(file.toStdString());
121 mConfigFile= file.toStdString();
122 CmdlineParser(1, 1);//1,1 - override, initialize
123 cb_transform->show();
125 cb_interpolator->show();
126 cb_optimizer->show();
127 cb_selectoutput->show();
132 interpollabel->show();
133 cb_transform->setCurrentIndex(mArgsInfo.transform_arg);
134 cb_interpolator->setCurrentIndex(mArgsInfo.interp_arg);
135 cb_optimizer->setCurrentIndex(mArgsInfo.optimizer_arg);
136 cb_metric->setCurrentIndex(mArgsInfo.metric_arg);
137 DD(cb_transform->currentIndex());
138 DD(mArgsInfo.transform_arg);
140 //------------------------------------------------------------------------------
142 //------------------------------------------------------------------------------
143 void vvToolRigidReg::Presets()
145 mConfigFile="Presets";
146 if(cb_presets->currentIndex()==0)
148 mArgsInfo.reference_arg=new char;
149 mArgsInfo.reference_given=0;
150 mArgsInfo.target_arg=new char;
151 mArgsInfo.target_given=0;
152 mArgsInfo.output_arg=new char;
153 mArgsInfo.referenceMask_arg=new char;
154 mArgsInfo.targetMask_arg=new char;
155 mArgsInfo.initMatrix_arg=new char;
156 mArgsInfo.matrix_arg=new char;
157 mArgsInfo.referenceMask_given=0;
158 mArgsInfo.reference_given=0;
159 mArgsInfo.reference_arg=new char;
160 mArgsInfo.target_given=0;
161 mArgsInfo.target_arg=new char;
162 mArgsInfo.output_given=0;
163 mArgsInfo.output_arg=new char;
164 mArgsInfo.checker_after_given=0;
165 mArgsInfo.checker_before_given=0;
166 mArgsInfo.after_given=0;
167 mArgsInfo.before_given=0;
168 mArgsInfo.threads_given=1;
169 mArgsInfo.threads_arg=3;
170 mArgsInfo.normalize_flag=0;
171 mArgsInfo.blur_arg=0.0;
172 mArgsInfo.referenceMask_arg=new char;
173 mArgsInfo.targetMask_arg=new char;
174 mArgsInfo.targetMask_given=0;
175 mArgsInfo.levels_given=1;
176 mArgsInfo.levels_arg=2;
177 mArgsInfo.moment_flag=1;
178 mArgsInfo.intThreshold_given=0;
179 mArgsInfo.intThreshold_arg=0.0;
180 mArgsInfo.transX_arg=0.0;
181 mArgsInfo.transY_arg=0.0;
182 mArgsInfo.transZ_arg=0.0;
183 mArgsInfo.transform_arg=2;
184 mArgsInfo.gradient_flag=1;
185 mArgsInfo.interp_given=1;
186 mArgsInfo.interp_arg=1;
187 mArgsInfo.interpOrder_given=1;
188 mArgsInfo.interpOrder_arg=3;
189 mArgsInfo.interpSF_given=1;
190 mArgsInfo.interpSF_arg=20;//default
191 mArgsInfo.metric_given=1;
192 mArgsInfo.metric_arg=0;
193 mArgsInfo.samples_arg=1;//default
194 mArgsInfo.stdDev_arg=0.4;
195 mArgsInfo.step_arg=2.0;
196 mArgsInfo.relax_arg=0.7;
197 mArgsInfo.valueTol_arg=0.01;
198 mArgsInfo.stepTol_arg=0.1;
199 mArgsInfo.gradTol_arg=1e-5;
200 mArgsInfo.lineAcc_arg=0.9;
201 mArgsInfo.convFactor_arg=1e+12;
202 mArgsInfo.maxIt_arg=500;
203 mArgsInfo.maxLineIt_arg=50;
204 mArgsInfo.maxEval_arg=500;
205 mArgsInfo.maxCorr_arg=5;
206 mArgsInfo.selectBound_arg=0;
207 mArgsInfo.inc_arg=1.2;
209 mArgsInfo.optimizer_arg=1;
210 mArgsInfo.initMatrix_given=0;
211 mArgsInfo.initMatrix_arg=new char;
212 mArgsInfo.tWeight_given=1;
213 mArgsInfo.tWeight_arg=1.0;
214 mArgsInfo.rWeight_given=1.0;
215 mArgsInfo.rWeight_arg=50.0;
216 mArgsInfo.matrix_given=1;
217 mArgsInfo.matrix_arg="/home/bharath/bin/writematrix.txt";
221 QMessageBox::information(this,"Sorry", "Other Presets are not available for the moment!");
225 //------------------------------------------------------------------------------
227 //------------------------------------------------------------------------------
228 void vvToolRigidReg::UpdateTextEditor2()
230 QString str1,str2,str3;
232 tab2textedit->clear();
233 tab2textedit->setAcceptRichText(true);
234 str2=tab2textedit->toPlainText();
235 tab2textedit->setTextColor(QColor(255,0,0));
236 str2.append(str3.append("threads="+str1.setNum(mArgsInfo.threads_arg)));
237 tab2textedit->setText(str2);
241 str2=tab2textedit->toPlainText();
243 tab2textedit->setText(str2);
245 str2=tab2textedit->toPlainText();
246 str2.append(str3.append("reference="+str1.append(mArgsInfo.reference_arg)));
247 tab2textedit->setText(str2);
251 str2=tab2textedit->toPlainText();
253 tab2textedit->setText(str2);
255 str2=tab2textedit->toPlainText();
256 str2.append(str3.append("target="+str1.append(mArgsInfo.target_arg)));
257 tab2textedit->setText(str2);
261 str2=tab2textedit->toPlainText();
263 tab2textedit->setText(str2);
265 str2=tab2textedit->toPlainText();
266 str2.append(str3.append("matrix="+str1.append(mArgsInfo.matrix_arg)));
267 tab2textedit->setText(str2);
271 str2=tab2textedit->toPlainText();
273 tab2textedit->setText(str2);
275 str2=tab2textedit->toPlainText();
276 str2.append(str3.append("interp="+str1.setNum(mArgsInfo.interp_arg)));
277 tab2textedit->setText(str2);
281 str2=tab2textedit->toPlainText();
283 tab2textedit->setText(str2);
285 str2=tab2textedit->toPlainText();
286 str2.append(str3.append("transform="+str1.setNum(mArgsInfo.transform_arg)));
287 tab2textedit->setText(str2);
291 str2=tab2textedit->toPlainText();
293 tab2textedit->setText(str2);
295 str2=tab2textedit->toPlainText();
296 str2.append(str3.append("transX="+str1.setNum(mArgsInfo.transX_arg)));
297 tab2textedit->setText(str2);
301 str2=tab2textedit->toPlainText();
303 tab2textedit->setText(str2);
305 str2=tab2textedit->toPlainText();
306 str2.append(str3.append("transY="+str1.setNum(mArgsInfo.transY_arg)));
307 tab2textedit->setText(str2);
311 str2=tab2textedit->toPlainText();
313 tab2textedit->setText(str2);
315 str2=tab2textedit->toPlainText();
316 str2.append(str3.append("transZ="+str1.setNum(mArgsInfo.transZ_arg)));
317 tab2textedit->setText(str2);
321 str2=tab2textedit->toPlainText();
323 tab2textedit->setText(str2);
325 str2=tab2textedit->toPlainText();
326 str2.append(str3.append("metric="+str1.setNum(mArgsInfo.metric_arg)));
327 tab2textedit->setText(str2);
331 str2=tab2textedit->toPlainText();
333 tab2textedit->setText(str2);
335 str2=tab2textedit->toPlainText();
336 str2.append(str3.append("samples="+str1.setNum(mArgsInfo.samples_arg)));
337 tab2textedit->setText(str2);
341 str2=tab2textedit->toPlainText();
343 tab2textedit->setText(str2);
345 str2=tab2textedit->toPlainText();
346 str2.append(str3.append("intThreshold="+str1.setNum(mArgsInfo.intThreshold_arg)));
347 tab2textedit->setText(str2);
351 str2=tab2textedit->toPlainText();
353 tab2textedit->setText(str2);
355 str2=tab2textedit->toPlainText();
356 str2.append(str3.append("stdDev="+str1.setNum(mArgsInfo.stdDev_arg)));
357 tab2textedit->setText(str2);
361 str2=tab2textedit->toPlainText();
363 tab2textedit->setText(str2);
366 str2=tab2textedit->toPlainText();
367 str2.append(str3.append("blur="+str1.setNum(mArgsInfo.blur_arg)));
368 tab2textedit->setText(str2);
372 str2=tab2textedit->toPlainText();
374 tab2textedit->setText(str2);
377 str2=tab2textedit->toPlainText();
378 str2.append(str3.append("optimizer="+str1.setNum(mArgsInfo.optimizer_arg)));
379 tab2textedit->setText(str2);
383 str2=tab2textedit->toPlainText();
385 tab2textedit->setText(str2);
388 str2=tab2textedit->toPlainText();
389 str2.append(str3.append("step="+str1.setNum(mArgsInfo.step_arg)));
390 tab2textedit->setText(str2);
394 str2=tab2textedit->toPlainText();
396 tab2textedit->setText(str2);
399 str2=tab2textedit->toPlainText();
400 str2.append(str3.append("relax="+str1.setNum(mArgsInfo.relax_arg)));
401 tab2textedit->setText(str2);
405 str2=tab2textedit->toPlainText();
407 tab2textedit->setText(str2);
409 str2=tab2textedit->toPlainText();
410 str2.append(str3.append("valueTol="+str1.setNum(mArgsInfo.valueTol_arg)));
411 tab2textedit->setText(str2);
415 str2=tab2textedit->toPlainText();
417 tab2textedit->setText(str2);
419 str2=tab2textedit->toPlainText();
420 str2.append(str3.append("stepTol="+str1.setNum(mArgsInfo.stepTol_arg)));
421 tab2textedit->setText(str2);
425 str2=tab2textedit->toPlainText();
427 tab2textedit->setText(str2);
430 str2=tab2textedit->toPlainText();
431 str2.append(str3.append("gradTol="+str1.setNum(mArgsInfo.gradTol_arg)));
432 tab2textedit->setText(str2);
436 str2=tab2textedit->toPlainText();
438 tab2textedit->setText(str2);
440 str2=tab2textedit->toPlainText();
441 str2.append(str3.append("lineAcc="+str1.setNum(mArgsInfo.lineAcc_arg)));
442 tab2textedit->setText(str2);
446 str2=tab2textedit->toPlainText();
448 tab2textedit->setText(str2);
449 str2=tab2textedit->toPlainText();
450 str2.append(str3.append("convFactor="+str1.setNum(mArgsInfo.convFactor_arg)));
451 tab2textedit->setText(str2);
455 str2=tab2textedit->toPlainText();
457 tab2textedit->setText(str2);
459 str2=tab2textedit->toPlainText();
460 str2.append(str3.append("maxIt="+str1.setNum(mArgsInfo.maxIt_arg)));
461 tab2textedit->setText(str2);
465 str2=tab2textedit->toPlainText();
467 tab2textedit->setText(str2);
469 str2=tab2textedit->toPlainText();
470 str2.append(str3.append("maxLineIt="+str1.setNum(mArgsInfo.maxLineIt_arg)));
471 tab2textedit->setText(str2);
475 str2=tab2textedit->toPlainText();
477 tab2textedit->setText(str2);
479 str2=tab2textedit->toPlainText();
480 str2.append(str3.append("maxEval="+str1.setNum(mArgsInfo.maxEval_arg)));
481 tab2textedit->setText(str2);
485 str2=tab2textedit->toPlainText();
487 tab2textedit->setText(str2);
489 str2=tab2textedit->toPlainText();
490 str2.append(str3.append("maxCorr="+str1.setNum(mArgsInfo.maxCorr_arg)));
491 tab2textedit->setText(str2);
495 str2=tab2textedit->toPlainText();
497 tab2textedit->setText(str2);
499 str2=tab2textedit->toPlainText();
500 str2.append(str3.append("selectBound="+str1.setNum(mArgsInfo.selectBound_arg)));
501 tab2textedit->setText(str2);
505 str2=tab2textedit->toPlainText();
507 tab2textedit->setText(str2);
509 str2=tab2textedit->toPlainText();
510 str2.append(str3.append("rWeight="+str1.setNum(mArgsInfo.rWeight_arg)));
511 tab2textedit->setText(str2);
515 str2=tab2textedit->toPlainText();
517 tab2textedit->setText(str2);
519 str2=tab2textedit->toPlainText();
520 str2.append(str3.append("tWeight="+str1.setNum(mArgsInfo.tWeight_arg)));
521 tab2textedit->setText(str2);
525 str2=tab2textedit->toPlainText();
527 tab2textedit->setText(str2);
529 str2=tab2textedit->toPlainText();
530 str2.append(str3.append("levels="+str1.setNum(mArgsInfo.levels_arg)));
531 tab2textedit->setText(str2);
535 str2=tab2textedit->toPlainText();
537 tab2textedit->setText(str2);
539 str2=tab2textedit->toPlainText();
540 str2.append(str3.append("inc="+str1.setNum(mArgsInfo.inc_arg)));
541 tab2textedit->setText(str2);
545 str2=tab2textedit->toPlainText();
547 tab2textedit->setText(str2);
549 str2=tab2textedit->toPlainText();
550 str2.append(str3.append("dec="+str1.setNum(mArgsInfo.dec_arg)));
551 tab2textedit->setText(str2);
555 str2=tab2textedit->toPlainText();
557 tab2textedit->setText(str2);
559 //------------------------------------------------------------------------------
561 //------------------------------------------------------------------------------
562 void vvToolRigidReg::TransformSelect()
564 mArgsInfo.transform_arg=cb_transform->currentIndex();
567 //------------------------------------------------------------------------------
569 //------------------------------------------------------------------------------
570 void vvToolRigidReg::CmdlineParser(int override, int initialize)
572 //0 opened, 1 not opened fine
573 int opened=cmdline_parser_clitkAffineRegistration_configfile(const_cast<char*>(mConfigFile.c_str()),&mArgsInfo,override,initialize,1);
575 mArgsInfo.gradient_flag=1;
577 //Read the transformation parameters from the path in the config file(mArgsInfo.matrix_arg) and display it on the TextBox 2
579 std::vector<QString> Qstr;
582 readfile.open(mConfigFile.c_str());
585 QMessageBox::information(this,"Warning","Load the Config File First..");
587 if (readfile.is_open())
589 while (!readfile.eof())
591 readfile >> mConfigFile;
592 Qstr.push_back(QString(mConfigFile.c_str()));
597 QMessageBox::information(this,"Warning","Cannot Open File!");
600 for(unsigned int i=0;i<Qstr.size()-1;i++)
602 str=tab2textedit->toPlainText();
603 str.append(Qstr.at(i));
604 tab2textedit->setText(str);
606 tab2textedit->setText(str);
609 //------------------------------------------------------------------------------
611 //------------------------------------------------------------------------------
612 void vvToolRigidReg::OptimizerSelect()
614 mArgsInfo.optimizer_arg=cb_optimizer->currentIndex();
618 //------------------------------------------------------------------------------
620 //------------------------------------------------------------------------------
621 void vvToolRigidReg::InterpolatorSelect()
623 mArgsInfo.interp_arg=cb_interpolator->currentIndex();
626 //------------------------------------------------------------------------------
628 //------------------------------------------------------------------------------
629 void vvToolRigidReg::MetricSelect()
631 mArgsInfo.metric_arg=cb_metric->currentIndex();
634 //------------------------------------------------------------------------------
636 //------------------------------------------------------------------------------
637 void vvToolRigidReg::OutputSelect()
641 //------------------------------------------------------------------------------
643 //------------------------------------------------------------------------------
644 void vvToolRigidReg::SaveTextEdit()
646 DD(mArgsInfo.transform_arg);
647 QString f1 = QFileDialog::getSaveFileName(this, tr("Save Config File"),
648 mMainWindow->GetInputPathName(),
649 tr("Text (*.mat *.txt *.doc *.rtf)"));
651 if(file.open(QFile::WriteOnly | QFile::Truncate) & !mConfigFile.empty() ){
652 QTextStream stream( &file );
653 stream << tab2textedit->toPlainText();
657 QMessageBox::information(this,"Warning","Nothing to Save!");
660 tab2textedit->clear();
661 DD(mArgsInfo.transform_arg);
663 //------------------------------------------------------------------------------
665 //------------------------------------------------------------------------------
666 void vvToolRigidReg::InputIsSelected(std::vector<vvSlicerManager *> & l)
671 UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),textEdit_2);
673 DD(*mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix());
674 for(int i =0;i<4;i++)
678 mInitialMatrix[i*4+j]=mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()->GetElement(i,j);
682 if(mInput1->GetFileName()==mInput2->GetFileName())
684 QMessageBox::information(this, "Warning","Your Reference and Target Images are the same");
687 SetOverlay(mInput2->GetImage());
688 mImageSize=mInput1->GetImage()->GetSize();
692 //connect all sigs to slots
693 connect(resetbutton, SIGNAL(pressed()), this, SLOT(ResetTransform()));
694 connect(tab2loadbutton, SIGNAL(pressed()), this, SLOT(GetArgsInfoFromGUI()));
695 connect(tab2applybutton, SIGNAL(pressed()), this, SLOT(AutoRegister()));
698 connect(Xval, SIGNAL(editingFinished()), this, SLOT(SetXvalue()));
699 connect(Yval, SIGNAL(editingFinished()), this, SLOT(SetYvalue()));
700 connect(Zval, SIGNAL(editingFinished()), this, SLOT(SetZvalue()));
702 connect(xtrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
703 connect(ytrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
704 connect(ztrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
707 connect(xrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
708 connect(yrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
709 connect(zrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders()));
711 connect(xtrans_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
712 connect(ytrans_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
713 connect(ztrans_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
714 connect(xrot_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
715 connect(yrot_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
716 connect(zrot_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb()));
718 connect(loadbutton, SIGNAL(pressed()), this, SLOT(LoadFile()));
719 connect(savebutton, SIGNAL(pressed()), this, SLOT(SaveFile()));
721 connect(cb_presets, SIGNAL(activated(int)), this, SLOT(Presets()));
722 connect(cb_transform, SIGNAL(activated(int)), this, SLOT(TransformSelect()));
723 connect(cb_optimizer, SIGNAL(activated(int)), this, SLOT(OptimizerSelect()));
724 connect(cb_interpolator, SIGNAL(activated(int)), this, SLOT(InterpolatorSelect()));
725 connect(cb_metric, SIGNAL(activated(int)), this, SLOT(MetricSelect()));
726 connect(cb_selectoutput, SIGNAL(activated(int)), this, SLOT(OutputSelect()));
727 connect(tab2savebutton, SIGNAL(pressed()), this, SLOT(SaveTextEdit()));
730 //------------------------------------------------------------------------------
732 //------------------------------------------------------------------------------
733 void vvToolRigidReg::apply()
737 //------------------------------------------------------------------------------
739 //------------------------------------------------------------------------------
740 void vvToolRigidReg::SetOverlay(vvImage::Pointer Image)
742 for (int i =0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
743 mCurrentSlicerManager->GetSlicer(i)->SetOverlay(Image);
744 mCurrentSlicerManager->GetSlicer(i)->SetActorVisibility("overlay",0,true);
745 mCurrentSlicerManager->SetColorMap();
746 mCurrentSlicerManager->Render();
749 //------------------------------------------------------------------------------
751 //------------------------------------------------------------------------------
752 void vvToolRigidReg::RemoveOverlay()
754 for(int i=0;i<mCurrentSlicerManager->NumberOfSlicers();i++)
756 mInput1->RemoveActor("overlay",0);
757 mInput1->SetColorMap(0);
762 //------------------------------------------------------------------------------
764 //------------------------------------------------------------------------------
765 void vvToolRigidReg::SetXvalue()
767 QString xstr = Xval->text();
769 //------------------------------------------------------------------------------
771 //------------------------------------------------------------------------------
772 void vvToolRigidReg::SetYvalue()
774 QString ystr = Yval->text();
776 //------------------------------------------------------------------------------
778 //------------------------------------------------------------------------------
779 void vvToolRigidReg::SetZvalue()
781 QString zstr = Zval->text();
783 //------------------------------------------------------------------------------
785 //------------------------------------------------------------------------------
786 void vvToolRigidReg::SetTransform(double tX, double tY, double tZ, double aX, double aY, double aZ,bool update)
788 vtkSmartPointer<vtkTransform> transform = mInput1->GetImage()->GetTransform();
789 transform->PostMultiply();
791 if (aX!=0 || aY!=0 || aZ!=0) {
793 x= Xval->text().toDouble();
794 y= Yval->text().toDouble();
795 z= Zval->text().toDouble();
796 transform->Translate(-x,-y,-z);
797 if (aX!=0) transform->RotateX(aX);
798 if (aY!=0) transform->RotateY(aY);
799 if (aZ!=0) transform->RotateZ(aZ);
800 transform->Translate(x,y,z);
803 if (tX!=0||tY!=0||tZ!=0)
804 transform->Translate(tX*mInput1->GetImage()->GetSpacing()[0],tY*mInput1->GetImage()->GetSpacing()[1],tZ*mInput1->GetImage()->GetSpacing()[2]);
806 //------------------------------------------------------------------------------
808 //------------------------------------------------------------------------------
809 void vvToolRigidReg::SetTransform(vtkMatrix4x4 *matrix)
811 vtkSmartPointer<vtkTransform> transform=vtkSmartPointer<vtkTransform>::New();
812 for(int i=0; i<4;i++)
814 mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()->SetElement(i,j,matrix->GetElement(i,j));
818 //------------------------------------------------------------------------------
820 //------------------------------------------------------------------------------
821 void vvToolRigidReg::LoadFile()
825 //------------------------------------------------------------------------------
827 //------------------------------------------------------------------------------
828 void vvToolRigidReg::Render()
830 for (int i=0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
831 mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent();
832 mCurrentSlicerManager->GetSlicer(i)->Render();
835 //------------------------------------------------------------------------------
837 //------------------------------------------------------------------------------
838 void vvToolRigidReg::UpdateTextEditor(vtkMatrix4x4 *matrix,QTextEdit* textEdit)
840 QFont font=QFont("Courier",11);
841 textEdit->setCurrentFont(font);
844 QString str1,str2,str3;
847 textEdit->setAcceptRichText(true);
848 str2=textEdit->toPlainText();
849 str2.append("#Rotation Center(mm): \n#");
850 textEdit->setText(str2);
852 str2=textEdit->toPlainText();
853 textEdit->setTextColor(QColor(255,0,0));
854 str2.append(str3.append(Xval->text()));
855 textEdit->setText(str2);
858 str2=textEdit->toPlainText();
860 textEdit->setText(str2);
862 str2=textEdit->toPlainText();
863 str2.append(str3.append(Yval->text()));
864 textEdit->setText(str2);
867 str2=textEdit->toPlainText();
869 textEdit->setText(str2);
872 str2=textEdit->toPlainText();
873 str2.append(str3.append(Zval->text()));
874 textEdit->setText(str2);
877 str2=textEdit->toPlainText();
879 textEdit->setText(str2);
882 str2=textEdit->toPlainText();
883 str2.append("#Transformation Matrix(mm):\n");
884 textEdit->setText(str2);
889 str2=textEdit->toPlainText();
890 // str2.append("\t"+str1.setNum(matrix->Element[i][j]));
891 str2.append(QString("%1\t").arg(str1.setNum(matrix->Element[i][j]),2));
892 textEdit->setText(str2);
894 str2=textEdit->toPlainText();
896 textEdit->setText(str2);
898 //QString str = QFileDialog::getOpenFileName();
899 textEdit->setTextColor(QColor(255,0,0));
900 textEdit->setFont(QFont("courrier new",12,4,true));
901 textEdit->toPlainText().toAscii();
903 str2=textEdit->toPlainText();
904 textEdit->setText(str2);
906 //------------------------------------------------------------------------------
908 //------------------------------------------------------------------------------
909 void vvToolRigidReg::UpdateTransform_sliders()
911 InitializeSliders(xtrans_slider->value()*mInput1->GetImage()->GetSpacing()[0],
912 ytrans_slider->value()*mInput1->GetImage()->GetSpacing()[1],
913 ztrans_slider->value()*mInput1->GetImage()->GetSpacing()[2],
914 xrot_slider->value(),yrot_slider->value(),zrot_slider->value(),false);
915 UpdateTransform(true);
918 //------------------------------------------------------------------------------
920 //------------------------------------------------------------------------------
921 void vvToolRigidReg::UpdateTransform_sb()
923 InitializeSliders(xtrans_sb->value(),
926 xrot_sb->value(),yrot_sb->value(),zrot_sb->value(),false);
927 UpdateTransform(false);
930 //------------------------------------------------------------------------------
932 //------------------------------------------------------------------------------
933 void vvToolRigidReg::AutoRegister()
935 if (!mCurrentSlicerManager) close();
937 if(!mConfigFile.empty()){
938 std::vector<vvImage::Pointer> inputs;
940 inputs.push_back(mInput1->GetImage());
941 inputs.push_back(mInput2->GetImage());
944 clitk::AffineRegistrationGenericFilter::Pointer filter =
945 clitk::AffineRegistrationGenericFilter::New();
946 filter->SetInputVVImages(inputs);
947 filter->SetArgsInfo(mArgsInfo);
948 DD("ArgsInfo given in");
949 filter->EnableReadOnDisk(false);
951 vvImage::Pointer output = filter->GetOutputVVImage();
952 //osstream << "Registered" << "_ "
953 // << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
954 //AddImage(output,osstream.str());
955 QApplication::restoreOverrideCursor();
960 QMessageBox::information(this, "Warning","Load the Config File First!...");
964 //------------------------------------------------------------------------------
966 //------------------------------------------------------------------------------
967 void vvToolRigidReg::UpdateTransform(bool slider_enabled)
969 vtkSmartPointer<vtkTransform> transform_final=mInput1->GetImage()->GetTransform();
970 transform_final->SetMatrix(mInitialMatrix);
971 transform_final->PostMultiply();
973 double x=0, y=0 ,z=0;
974 x= Xval->text().toDouble();
975 y= Yval->text().toDouble();
976 z= Zval->text().toDouble();
977 transform_final->Translate(-x,-y,-z);
979 transform_final->RotateY(yrot_slider->value());
980 transform_final->RotateX(xrot_slider->value());
981 transform_final->RotateZ(zrot_slider->value());
984 transform_final->RotateY(yrot_sb->value());
985 transform_final->RotateX(xrot_sb->value());
986 transform_final->RotateZ(zrot_sb->value());
988 transform_final->Translate(x,y,z);
989 transform_final->PreMultiply();
991 transform_final->Translate(xtrans_slider->value()*mInput1->GetImage()->GetSpacing()[0],0,0);
992 transform_final->Translate(0,ytrans_slider->value()*mInput1->GetImage()->GetSpacing()[1],0);
993 transform_final->Translate(0,0,ztrans_slider->value()*mInput1->GetImage()->GetSpacing()[2]);
996 transform_final->Translate(xtrans_sb->value(),0,0);
997 transform_final->Translate(0,ytrans_sb->value(),0);
998 transform_final->Translate(0,0,ztrans_sb->value());
1000 transform_final->Update();
1002 UpdateTextEditor(transform_final->GetMatrix(),textEdit);
1004 //------------------------------------------------------------------------------
1007 //------------------------------------------------------------------------------
1008 void vvToolRigidReg::SaveFile()
1010 //Write the Transformation Matrix
1011 QString f1 = QFileDialog::getSaveFileName(this, tr("Save Transformation Matrix File"),
1012 mMainWindow->GetInputPathName(),
1013 tr("Text (*.mat *.txt *.doc *.rtf)"));
1015 std::vector<QString> transparameters;
1018 for(int i =0;i<4;i++)
1019 for(int j=0;j<4;j++)
1020 transparameters.push_back(line1.setNum(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()->Element[i][j]));
1022 if (file1.open(QFile::WriteOnly | QFile::Truncate)) {
1023 QTextStream out1(&file1);
1024 for(int i =0;i<4;i++){
1025 for(int j=0;j<4;j++) {
1026 out1<<transparameters[i*4+j]+"\t";
1033 QMessageBox::information(this,"Warning","Error Reading Parameters");
1036 //------------------------------------------------------------------------------
1038 //------------------------------------------------------------------------------
1039 void vvToolRigidReg::ReadFile(bool matrix_given)
1043 double * orientations=new double[3];
1044 double * translations=new double[3];
1045 vtkMatrix4x4 *matrix=vtkMatrix4x4::New();
1046 std::string transfile;
1047 vtkSmartPointer<vtkTransform> transform = mCurrentSlicerManager->GetImage()->GetTransform();
1050 //Open File to read the transformation parameters
1051 QString file1 = QFileDialog::getOpenFileName(
1053 "Choose the Transformation Parameters file",
1054 mMainWindow->GetInputPathName(),
1055 "Text (*.mat *.txt *.rtf *.doc)");
1056 if (file1.isEmpty())
1058 QFile Qfile1(file1);
1059 // ifstream readfile;
1060 transfile= file1.toStdString();
1064 transfile=mArgsInfo.matrix_arg;
1067 std::string filename1(transfile);
1068 std::ifstream f1(filename1.c_str());
1072 itk::Matrix<double, 4, 4> itkMat = clitk::ReadMatrix3D(transfile);
1073 for(int j=0; j<4; j++)
1074 for(int i=0; i<4; i++)
1075 matrix->SetElement(i,j,rint(itkMat[i][j]));
1077 UpdateTextEditor(matrix,textEdit);
1078 transform->SetMatrix(matrix);
1079 transform->GetOrientation(orientations);
1080 transform->PostMultiply();
1082 //Obtain the Rotation Center , set it to origin
1083 Xval->setText(center.setNum(0));
1084 Yval->setText(center.setNum(0));
1085 Zval->setText(center.setNum(0));
1087 //In the Order or Y X Z //
1088 //now postmultiply for the rotations
1089 SetTransform(0,0,0,0,0,-rint(orientations[2]),false);
1090 SetTransform(0,0,0,-rint(orientations[0]),0,0,false);
1091 SetTransform(0,0,0,0,-rint(orientations[1]),0,false);
1093 transform->GetPosition(translations);
1094 transform->Identity();
1096 DD(translations[0]/mInput1->GetImage()->GetSpacing()[0]);
1097 DD(translations[1]/mInput1->GetImage()->GetSpacing()[1]);
1098 DD(translations[2]/mInput1->GetImage()->GetSpacing()[2]);
1099 DD(mInput1->GetImage()->GetSpacing()[0]);
1100 DD(mInput1->GetImage()->GetSpacing()[1]);
1101 DD(mInput1->GetImage()->GetSpacing()[2]);
1102 DD(orientations[0]);
1103 DD(orientations[1]);
1104 DD(orientations[2]);
1105 //set the sliders and spin box values
1106 InitializeSliders(rint(translations[0]),rint(translations[1])
1107 ,rint(translations[2]),rint(orientations[0]),rint(orientations[1]),rint(orientations[2]),true);
1108 SetTransform(matrix);
1110 //------------------------------------------------------------------------------
1112 //------------------------------------------------------------------------------
1113 void vvToolRigidReg::ResetTransform()
1115 vtkSmartPointer<vtkTransform> transform = mCurrentSlicerManager->GetImage()->GetTransform();
1116 transform->SetMatrix(mInitialMatrix);
1117 transform->Update();
1120 SetRotationCenter();
1122 UpdateTextEditor(transform->GetMatrix(),textEdit);
1124 //------------------------------------------------------------------------------
1126 //------------------------------------------------------------------------------
1127 void vvToolRigidReg::SetRotationCenter()
1129 //default image rotation center is the center of the image
1130 QString xcord,ycord,zcord;
1131 std::vector<double> imageorigin;
1132 imageorigin=mInput1->GetImage()->GetOrigin();
1134 xcord=xcord.setNum(imageorigin[0]+mImageSize[0]*mInput1->GetImage()->GetSpacing()[0]/2, 'g', 3);
1135 ycord=ycord.setNum(imageorigin[1]+mImageSize[1]*mInput1->GetImage()->GetSpacing()[1]/2, 'g', 3);
1136 zcord=zcord.setNum(imageorigin[2]+mImageSize[2]*mInput1->GetImage()->GetSpacing()[2]/2, 'g', 3);
1138 Xval->setText(xcord);
1139 Yval->setText(ycord);
1140 Zval->setText(zcord);
1141 InitializeSliders(0,0,0,0,0,0,true);
1143 //------------------------------------------------------------------------------
1145 //------------------------------------------------------------------------------
1146 void vvToolRigidReg::InitializeSliders(double xtrans,double ytrans, double ztrans, double xrot, double yrot, double zrot,bool sliders)
1149 xtrans_sb->blockSignals(true);
1150 xtrans_sb->setSingleStep(mInput1->GetImage()->GetSpacing()[0]);
1151 xtrans_sb->setValue(xtrans);
1152 xtrans_sb->blockSignals(false);
1153 ytrans_sb->blockSignals(true);
1154 ytrans_sb->setSingleStep(mInput1->GetImage()->GetSpacing()[1]);
1155 ytrans_sb->setValue(ytrans);
1156 ytrans_sb->blockSignals(false);
1157 ztrans_sb->blockSignals(true);
1158 ztrans_sb->setSingleStep(mInput1->GetImage()->GetSpacing()[2]);
1159 ztrans_sb->setValue(ztrans);
1160 ztrans_sb->blockSignals(false);
1163 xtrans_slider->blockSignals(true);
1164 xtrans_slider->setValue(rint(xtrans/mInput1->GetImage()->GetSpacing()[0]));
1165 xtrans_slider->blockSignals(false);
1166 ytrans_slider->blockSignals(true);
1167 ytrans_slider->setValue(rint(ytrans/mInput1->GetImage()->GetSpacing()[1]));
1168 ytrans_slider->blockSignals(false);
1169 ztrans_slider->blockSignals(true);
1170 ztrans_slider->setValue(rint(ztrans/mInput1->GetImage()->GetSpacing()[2]));
1171 ztrans_slider->blockSignals(false);
1173 xrot_sb->blockSignals(true);
1174 xrot_sb->setValue(xrot);
1175 xrot_sb->blockSignals(false);
1176 yrot_sb->blockSignals(true);
1177 yrot_sb->setValue(yrot);
1178 yrot_sb->blockSignals(false);
1179 zrot_sb->blockSignals(true);
1180 zrot_sb->setValue(zrot);
1181 zrot_sb->blockSignals(false);
1182 xrot_slider->blockSignals(true);
1183 xrot_slider->setValue(xrot);
1184 xrot_slider->blockSignals(false);
1185 yrot_slider->blockSignals(true);
1186 yrot_slider->setValue(yrot);
1187 yrot_slider->blockSignals(false);
1188 zrot_slider->blockSignals(true);
1189 zrot_slider->setValue(zrot);
1190 zrot_slider->blockSignals(false);
1192 //------------------------------------------------------------------------------
1194 //------------------------------------------------------------------------------
1195 void vvToolRigidReg::SetSliderRanges()
1197 xtrans_slider->blockSignals(true);
1198 xtrans_slider->setRange(-2000,2000);
1199 xtrans_slider->blockSignals(false);
1201 ytrans_slider->blockSignals(true);
1202 ytrans_slider->setRange(-2000,2000);
1203 ytrans_slider->blockSignals(false);
1205 ztrans_slider->blockSignals(true);
1206 ztrans_slider->setRange(-2000,2000);
1207 ztrans_slider->blockSignals(false);
1209 xtrans_sb->blockSignals(true);
1210 xtrans_sb->setRange(-2000,2000);
1211 xtrans_sb->setDecimals(3);
1212 xtrans_sb->blockSignals(false);
1214 ytrans_sb->blockSignals(true);
1215 ytrans_sb->setRange(-2000,2000);
1216 ytrans_sb->setDecimals(3);
1217 ytrans_sb->blockSignals(false);
1219 ztrans_sb->blockSignals(true);
1220 ztrans_sb->setRange(-2000,2000);
1221 ztrans_sb->setDecimals(3);
1222 ztrans_sb->blockSignals(false);
1224 xrot_slider->blockSignals(true);
1225 xrot_slider->setRange(-360,360);
1226 xrot_slider->blockSignals(false);
1228 yrot_slider->blockSignals(true);
1229 yrot_slider->setRange(-360,360);
1230 yrot_slider->blockSignals(false);
1232 zrot_slider->blockSignals(true);
1233 zrot_slider->setRange(-360,360);
1234 zrot_slider->blockSignals(false);
1236 xrot_sb->blockSignals(true);
1237 xrot_sb->setRange(-360,360);
1238 xrot_sb->blockSignals(false);
1240 yrot_sb->blockSignals(true);
1241 yrot_sb->setRange(-360,360);
1242 yrot_sb->blockSignals(false);
1244 zrot_sb->blockSignals(true);
1245 zrot_sb->setRange(-360,360);
1246 zrot_sb->blockSignals(false);