X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvToolRigidReg.cxx;h=b5661efaa97a5c60416a5471dff95dd864e0de8c;hb=a4c7c3e6b24a06bfe248f935411e0136184faf97;hp=ec94832f32f66e4f97e7b097518f67c2a5afb0b1;hpb=cd7fda2931cecc65903f751d4b5689a6421b22f7;p=clitk.git diff --git a/vv/vvToolRigidReg.cxx b/vv/vvToolRigidReg.cxx index ec94832..b5661ef 100644 --- a/vv/vvToolRigidReg.cxx +++ b/vv/vvToolRigidReg.cxx @@ -15,21 +15,27 @@ - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html ======================================================================-====*/ + +// vv #include "vvToolRigidReg.h" -#include -#include -#include +#include "vvImageReader.h" +#include "vvSlicer.h" + +// vtk #include #include #include -#include "vvImage.h" -#include "vvSlicer.h" -#include -#include + +// clitk +#include "clitkTransformUtilities.h" +#include "clitkAffineRegistrationGenericFilter.h" +// qt #include -#include #include #include +#include +#include + //------------------------------------------------------------------------------ // Create the tool and automagically (I like this word) insert it in // the main window menu. @@ -44,13 +50,17 @@ vvToolRigidReg::vvToolRigidReg(vvMainWindowBase * parent, Qt::WindowFlags f): { // GUI Initialization Ui_vvToolRigidReg::setupUi(mToolWidget); + // QSize qsize; +// qsize.setHeight(470); +// qsize.setWidth(850); +// mToolWidget->setFixedSize(qsize); // Set how many inputs are needed for this tool - AddInputSelector("Select the Reference Image"); - AddInputSelector("Select the Target Image"); - mOrder=QString("Rotation Order: "); - - + mFilter = new clitk::AffineRegistrationGenericFilter; + + // Set how many inputs are needed for this tool + AddInputSelector("Select moving image",mFilter); + AddInputSelector("Select fixed image",mFilter); } //------------------------------------------------------------------------------ @@ -63,7 +73,8 @@ vvToolRigidReg::~vvToolRigidReg() //------------------------------------------------------------------------------ bool vvToolRigidReg::close() { - + ResetTransform(); + RemoveOverlay(); return vvToolWidgetBase::close(); } //------------------------------------------------------------------------------ @@ -71,94 +82,146 @@ bool vvToolRigidReg::close() //------------------------------------------------------------------------------ void vvToolRigidReg::reject() { - mInput2->Reload(); - for(int i=0;iNumberOfSlicers();i++) - { - mInput1->GetSlicer(i)->RemoveActor("overlay",0); - mInput1->SetColorMap(0); - mInput1->Render(); - } + return vvToolWidgetBase::reject(); } //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void vvToolRigidReg::GetArgsInfoFromGUI() +{ + QFont font=QFont("Times New Roman",10); + tab2textedit->setTextColor(QColor(255,0,0)); + tab2textedit->setCurrentFont(font); + tab2textedit->update(); + QString str; + QString file = QFileDialog::getOpenFileName( + this, + "Choose the Transformation Parameters file", + mMainWindow->GetInputPathName(), + "Text (*.conf *.txt *.rtf *.doc)"); + if (file.isEmpty()) + return; + QFile Qfile1(file); + // ifstream readfile; + std::string configfile= file.toStdString(); + cmdline_parser_clitkAffineRegistration_configfile(const_cast(configfile.c_str()),&mArgsInfo,1,1,1); + mArgsInfo.gradient_flag=1; + + //Read from File and display it on the TextBox 2 + ifstream readfile; + std::vector Qstr; + readfile.open(configfile.c_str()); + if (readfile.is_open()) + { + while (!readfile.eof()) + { + readfile >> configfile; + Qstr.push_back(QString(configfile.c_str())); + } + readfile.close(); + } + else { + cout << "Unable to open file"; + } + for(unsigned int i=0;itoPlainText(); + str.append(Qstr.at(i)); + tab2textedit->setText(str); + str.append("\n"); + tab2textedit->setText(str); + } +} +//------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ void vvToolRigidReg::InputIsSelected(std::vector & l) { //inputs mInput1 = l[0]; mInput2 = l[1]; + + UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),textEdit_2); + + for(int i =0;i<4;i++) + for(int j=0;j<4;j++) + mInitialMatrix[i*4+j]=mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()->GetElement(i,j); + + if(mInput1->GetFileName()==mInput2->GetFileName()) + { + QMessageBox::information(this, "Warning","Your Reference and Target Images are the same"); + } mTwoInputs = true; - SetOverlay(); - this->mImageSize=mCurrentSlicerManager->GetImage()->GetSize(); - + SetOverlay(mInput2->GetImage()); + mImageSize=mInput1->GetImage()->GetSize(); SetRotationCenter(); SetSliderRanges(); - - //connect all sigs to slots - connect(resetbutton, SIGNAL(pressed()), this, SLOT(ResetTransform())); - - connect(Xval, SIGNAL(editingFinished()), this, SLOT(SetXvalue())); - connect(Yval, SIGNAL(editingFinished()), this, SLOT(SetYvalue())); - connect(Zval, SIGNAL(editingFinished()), this, SLOT(SetZvalue())); - - connect(xtrans_slider, SIGNAL(sliderReleased()), this, SLOT(SetOrderXtrans())); - connect(ytrans_slider, SIGNAL(sliderReleased()), this, SLOT(SetOrderYtrans())); - connect(ztrans_slider, SIGNAL(sliderReleased()), this, SLOT(SetOrderZtrans())); - connect(xrot_slider, SIGNAL(sliderReleased()), this, SLOT(SetOrderXrot())); - connect(yrot_slider, SIGNAL(sliderReleased()), this, SLOT(SetOrderYrot())); - connect(zrot_slider, SIGNAL(sliderReleased()), this, SLOT(SetOrderZrot())); - - - connect(xtrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateXtranslider())); - - connect(ytrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateYtranslider())); - connect(ztrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateZtranslider())); - - - connect(xrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateXrotslider())); - connect(yrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateYrotslider())); - connect(zrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateZrotslider())); - - - connect(xtrans_sb, SIGNAL(valueChanged(int)), this, SLOT(UpdateXtransb())); - connect(ytrans_sb, SIGNAL(valueChanged(int)), this, SLOT(UpdateYtransb())); - connect(ztrans_sb, SIGNAL(valueChanged(int)), this, SLOT(UpdateZtransb())); - connect(xrot_sb, SIGNAL(valueChanged(int)), this, SLOT(UpdateXrotsb())); - connect(yrot_sb, SIGNAL(valueChanged(int)), this, SLOT(UpdateYrotsb())); - connect(zrot_sb, SIGNAL(valueChanged(int)), this, SLOT(UpdateZrotsb())); + + //connect all sigs to slots + connect(resetbutton, SIGNAL(pressed()), this, SLOT(ResetTransform())); + connect(tab2loadbutton, SIGNAL(pressed()), this, SLOT(GetArgsInfoFromGUI())); + connect(tab2applybutton, SIGNAL(pressed()), this, SLOT(AutoRegister())); + + + connect(Xval, SIGNAL(editingFinished()), this, SLOT(SetXvalue())); + connect(Yval, SIGNAL(editingFinished()), this, SLOT(SetYvalue())); + connect(Zval, SIGNAL(editingFinished()), this, SLOT(SetZvalue())); + + connect(xtrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders())); + connect(ytrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders())); + connect(ztrans_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders())); + + + connect(xrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders())); + connect(yrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders())); + connect(zrot_slider, SIGNAL(valueChanged(int)), this, SLOT(UpdateTransform_sliders())); + + connect(xtrans_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb())); + connect(ytrans_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb())); + connect(ztrans_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb())); + connect(xrot_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb())); + connect(yrot_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb())); + connect(zrot_sb, SIGNAL(valueChanged(double)), this, SLOT(UpdateTransform_sb())); - - connect(loadbutton, SIGNAL(pressed()), this, SLOT(ReadFile())); - connect(savebutton, SIGNAL(pressed()), this, SLOT(SaveFile())); + connect(loadbutton, SIGNAL(pressed()), this, SLOT(ReadFile())); + connect(savebutton, SIGNAL(pressed()), this, SLOT(SaveFile())); + } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ void vvToolRigidReg::apply() { - std::ostringstream osstream; - osstream << "Transformed_" - << mInput2->GetSlicer(0)->GetFileName() << ".mhd"; - AddImage(mInput2->GetImage(),osstream.str()); - QApplication::restoreOverrideCursor(); - close(); + RemoveOverlay(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolRigidReg::SetOverlay() +void vvToolRigidReg::SetOverlay(vvImage::Pointer Image) { - mCurrentSlicerManager=mInput2; - for (int i =0; iNumberOfSlicers(); i++) { - mInput1->GetSlicer(i)->SetOverlay(mInput2->GetImage()); - mInput1->GetSlicer(i)->SetActorVisibility("overlay",0,true); - mInput1->SetColorMap(); - mInput1->Render(); + for (int i =0; iNumberOfSlicers(); i++) { + mCurrentSlicerManager->GetSlicer(i)->SetOverlay(Image); + mCurrentSlicerManager->GetSlicer(i)->SetActorVisibility("overlay",0,true); + mCurrentSlicerManager->SetColorMap(); + mCurrentSlicerManager->Render(); } } //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void vvToolRigidReg::RemoveOverlay() +{ + for(int i=0;iNumberOfSlicers();i++) + { + mInput1->RemoveActor("overlay",0); + mInput1->SetColorMap(0); + mInput1->Render(); + hide(); + } +} +//------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ void vvToolRigidReg::SetXvalue() { @@ -181,10 +244,9 @@ void vvToolRigidReg::SetZvalue() //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolRigidReg::SetTransform(double tX, double tY, double tZ, double aX, double aY, double aZ) +void vvToolRigidReg::SetTransform(double tX, double tY, double tZ, double aX, double aY, double aZ,bool update) { - - vtkSmartPointer transform = mCurrentSlicerManager->GetImage()->GetTransform(); + vtkSmartPointer transform = mInput1->GetImage()->GetTransform(); transform->PostMultiply(); //Rotations if (aX!=0 || aY!=0 || aZ!=0) { @@ -200,48 +262,47 @@ void vvToolRigidReg::SetTransform(double tX, double tY, double tZ, double aX, do } //Translations if (tX!=0||tY!=0||tZ!=0) - transform->Translate(tX,tY,tZ); - - transform->Update(); - - for (int i=0; iNumberOfSlicers(); i++) { - mCurrentSlicerManager->GetImage()->UpdateReslice(); - mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent(); - mCurrentSlicerManager->GetSlicer(i)->Render(); - } + transform->Translate(tX*mInput1->GetImage()->GetSpacing()[0],tY*mInput1->GetImage()->GetSpacing()[1],tZ*mInput1->GetImage()->GetSpacing()[2]); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ void vvToolRigidReg::SetTransform(vtkMatrix4x4 *matrix) { - vtkSmartPointer transform =mCurrentSlicerManager->GetImage()->GetTransform(); - transform->SetMatrix(matrix); - // mCurrentSlicerManager->GetImage()->SetTransform(transform); - transform->PostMultiply(); - transform->Concatenate(matrix); - transform->Update(); - mCurrentSlicerManager->GetImage()->SetTransform(transform); + vtkSmartPointer transform=vtkSmartPointer::New(); + for(int i=0; i<4;i++) + for(int j=0;j<4;j++) + mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()->SetElement(i,j,matrix->GetElement(i,j)); + + Render(); +} +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +void vvToolRigidReg::Render() +{ for (int i=0; iNumberOfSlicers(); i++) { - mCurrentSlicerManager->GetImage()->UpdateReslice(); - mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent(); - mCurrentSlicerManager->GetSlicer(i)->Render(); - } + mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent(); + mCurrentSlicerManager->GetSlicer(i)->Render(); + } } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ - void vvToolRigidReg::UpdateTextEditor(vtkMatrix4x4 *matrix,QString SetOrder) + void vvToolRigidReg::UpdateTextEditor(vtkMatrix4x4 *matrix,QTextEdit* textEdit) { - QString str1,str2,str3; - + QFont font=QFont("Times New Roman",11); + textEdit->setCurrentFont(font); + textEdit->update(); + + QString str1,str2,str3; QColor color; textEdit->clear(); textEdit->setAcceptRichText(true); str2=textEdit->toPlainText(); - str2.append("Rotation Center(mm): \n"); + str2.append("#Rotation Center(mm): \n#"); textEdit->setText(str2); - + str2=textEdit->toPlainText(); textEdit->setTextColor(QColor(255,0,0)); str2.append(str3.append(Xval->text())); @@ -256,11 +317,11 @@ void vvToolRigidReg::SetTransform(vtkMatrix4x4 *matrix) str2.append(str3.append(Yval->text())); textEdit->setText(str2); str3.clear(); - + str2=textEdit->toPlainText(); str2.append("\t"); textEdit->setText(str2); - + str2=textEdit->toPlainText(); str2.append(str3.append(Zval->text())); @@ -270,331 +331,223 @@ void vvToolRigidReg::SetTransform(vtkMatrix4x4 *matrix) str2=textEdit->toPlainText(); str2.append("\n"); textEdit->setText(str2); - + str2=textEdit->toPlainText(); - str2.append("Transformation Matrix:\n"); + str2.append("#Transformation Matrix(mm):\n"); textEdit->setText(str2); - - for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { str2=textEdit->toPlainText(); - str2.append("\t"+str1.setNum(matrix->Element[i][j])); + // str2.append("\t"+str1.setNum(matrix->Element[i][j])); + str2.append(QString("%1\t").arg(str1.setNum(matrix->Element[i][j]),2)); textEdit->setText(str2); } str2=textEdit->toPlainText(); - str2.append("\n"); + str2.append("\n"); textEdit->setText(str2); } //QString str = QFileDialog::getOpenFileName(); textEdit->setTextColor(QColor(255,0,0)); textEdit->setFont(QFont("courrier new",12,4,true)); textEdit->toPlainText().toAscii(); - + str2=textEdit->toPlainText(); - mOrder+=SetOrder+QString(" "); - str2.append(mOrder); textEdit->setText(str2); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolRigidReg::SetOrderXtrans() -{ - if(mOrder.size()-mOrder.lastIndexOf("Tx")<10) //see if the same Transformation Parameter has been used back to back - mOrder.chop(mOrder.size()-mOrder.lastIndexOf("Tx")); - UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),QString("Tx: ")+xtrans_sb->text()); -} -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -void vvToolRigidReg::SetOrderYtrans() +void vvToolRigidReg::UpdateTransform_sliders() { - if(mOrder.size()-mOrder.lastIndexOf("Ty")<10) - mOrder.chop(mOrder.size()-mOrder.lastIndexOf("Ty")); - UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),QString("Ty: ")+ytrans_sb->text()); + InitializeSliders(xtrans_slider->value()*mInput1->GetImage()->GetSpacing()[0], + ytrans_slider->value()*mInput1->GetImage()->GetSpacing()[1], + ztrans_slider->value()*mInput1->GetImage()->GetSpacing()[2], + xrot_slider->value(),yrot_slider->value(),zrot_slider->value(),false); + UpdateTransform(true); + // Render(); } - //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolRigidReg::SetOrderZtrans() +void vvToolRigidReg::UpdateTransform_sb() { - if(mOrder.size()-mOrder.lastIndexOf("Tz")<10) - mOrder.chop(mOrder.size()-mOrder.lastIndexOf("Tz")); - UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),QString("Tz: ")+ztrans_sb->text()); + InitializeSliders(xtrans_sb->value(), + ytrans_sb->value(), + ztrans_sb->value(), + xrot_sb->value(),yrot_sb->value(),zrot_sb->value(),false); + DD(xtrans_sb->value()); + UpdateTransform(false); + // Render(); } - -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -void vvToolRigidReg::SetOrderXrot() -{ - if(mOrder.size()-mOrder.lastIndexOf("Rx")<10) - mOrder.chop(mOrder.size()-mOrder.lastIndexOf("Rx")); - UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),QString("Rx: ")+xrot_sb->text()); -} - //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolRigidReg::SetOrderYrot() -{ - if(mOrder.size()-mOrder.lastIndexOf("Ry")<10) //see if the same Transformation Parameter has been used back to back - mOrder.chop(mOrder.size()-mOrder.lastIndexOf("Ry")); - UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),QString("Ry: ")+yrot_sb->text()); -} - -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -void vvToolRigidReg::SetOrderZrot() -{ - if(mOrder.size()-mOrder.lastIndexOf("Rz")<10) //see if the same Transformation Parameter has been used back to back - mOrder.chop(mOrder.size()-mOrder.lastIndexOf("Rz")); - UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),QString("Rz: ")+zrot_sb->text()); -} -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -void vvToolRigidReg::UpdateXtransb() -{ - int diff=0; - diff=xtrans_sb->value()-xtrans_slider->value(); - this->SetTransform(diff, 0, 0, 0, 0, 0); - xtrans_slider->setValue(xtrans_sb->value()); - // UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),QString("Tx:")+xtrans_sb->text()); - -} -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -void vvToolRigidReg::UpdateXtranslider() -{ - int diff=0; - diff=xtrans_slider->value()-xtrans_sb->value(); - this->SetTransform(diff, 0, 0, 0, 0, 0); - xtrans_sb->setValue(xtrans_slider->value()); - //UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),QString("Tx:")+xtrans_sb->text()); -} -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -void vvToolRigidReg::UpdateYtransb() -{ - - int diff=0; - diff=ytrans_sb->value()-ytrans_slider->value(); - this->SetTransform(0, diff, 0, 0, 0, 0); - ytrans_slider->setValue(ytrans_sb->value()); -// UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),QString("Ty:")+ytrans_sb->text()); -} - -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -void vvToolRigidReg::UpdateYtranslider() -{ - int diff=0; - diff=ytrans_slider->value()-ytrans_sb->value(); - this->SetTransform(0, diff, 0, 0, 0, 0); - ytrans_sb->setValue(ytrans_slider->value()); -// UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),QString("Ty:")+ytrans_sb->text()); -} -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -void vvToolRigidReg::UpdateZtransb() -{ - - int diff=0; - diff=ztrans_sb->value()-ztrans_slider->value(); - this->SetTransform(0, 0, diff, 0, 0, 0); - ztrans_slider->setValue(ztrans_sb->value()); - // UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),QString("Tz:")+ztrans_sb->text()); -} - -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -void vvToolRigidReg::UpdateZtranslider() -{ - int diff=0; - diff=ztrans_slider->value()-ztrans_sb->value(); - this->SetTransform(0, 0, diff, 0, 0, 0); - ztrans_sb->setValue(ztrans_slider->value()); -// UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),QString("Tz:")+ztrans_sb->text()); -} -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -void vvToolRigidReg::UpdateXrotsb() -{ - - int diff=0; - diff=xrot_sb->value()-xrot_slider->value(); - this->SetTransform(0, 0, 0, diff, 0, 0); - xrot_slider->setValue(xrot_sb->value()); - // UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),QString("Rx:")+xrot_sb->text()); -} - -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -void vvToolRigidReg::UpdateXrotslider() -{ - int diff=0; - diff=xrot_slider->value()-xrot_sb->value(); - this->SetTransform(0, 0, 0, diff, 0, 0); - xrot_sb->setValue(xrot_slider->value()); - // UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),QString("Rx:")+xrot_sb->text()); -} -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -void vvToolRigidReg::UpdateYrotsb() -{ - - int diff=0; - diff=yrot_sb->value()-yrot_slider->value(); - this->SetTransform(0, 0, 0, 0, diff, 0); - yrot_slider->setValue(yrot_sb->value()); - // UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),QString("Ry:")+yrot_sb->text()); -} - -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -void vvToolRigidReg::UpdateYrotslider() -{ - int diff=0; - diff=yrot_slider->value()-yrot_sb->value(); - this->SetTransform(0, 0, 0, 0, diff, 0); - yrot_sb->setValue(yrot_slider->value()); -// UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),QString("Ry:")+yrot_sb->text()); +void vvToolRigidReg::AutoRegister() +{ + if (!mCurrentSlicerManager) close(); + QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + + std::vector inputs; + // Input + inputs.push_back(mInput1->GetImage()); + inputs.push_back(mInput2->GetImage()); + // Check input type + // Main filter + clitk::AffineRegistrationGenericFilter::Pointer filter = + clitk::AffineRegistrationGenericFilter::New(); + filter->SetInputVVImages(inputs); + filter->SetArgsInfo(mArgsInfo); + DD("ArgsInfo given in"); + filter->EnableReadOnDisk(false); + filter->Update(); + DD("I am done...! Updated"); + vvImage::Pointer output = filter->GetOutputVVImage(); + DD("filter getoutput done..."); + std::ostringstream osstream; + //osstream << "Registered" << "_ " + // << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd"; + //AddImage(output,osstream.str()); + SetOverlay(output); + + QApplication::restoreOverrideCursor(); + // close(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolRigidReg::UpdateZrotsb() +void vvToolRigidReg::UpdateTransform(bool slider_enabled) { - - int diff=0; - diff=zrot_sb->value()-zrot_slider->value(); - this->SetTransform(0, 0, 0, 0, 0,diff); - zrot_slider->setValue(zrot_sb->value()); - // UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),QString("Rz:")+zrot_sb->text()); + vtkSmartPointer transform_final=vtkSmartPointer::New(); + transform_final->SetMatrix(mInitialMatrix); + transform_final->PostMultiply(); + //Rotations + double x=0, y=0 ,z=0; + x= Xval->text().toDouble(); + y= Yval->text().toDouble(); + z= Zval->text().toDouble(); + transform_final->Translate(-x,-y,-z); + if(slider_enabled){ + transform_final->RotateY(yrot_slider->value()); + transform_final->RotateX(xrot_slider->value()); + transform_final->RotateZ(zrot_slider->value()); + } + else{ + transform_final->RotateY(yrot_sb->value()); + transform_final->RotateX(xrot_sb->value()); + transform_final->RotateZ(zrot_sb->value()); + } + transform_final->Translate(x,y,z); + transform_final->PreMultiply(); + if(slider_enabled){ + transform_final->Translate(xtrans_slider->value()*mInput1->GetImage()->GetSpacing()[0],0,0); + transform_final->Translate(0,ytrans_slider->value()*mInput1->GetImage()->GetSpacing()[1],0); + transform_final->Translate(0,0,ztrans_slider->value()*mInput1->GetImage()->GetSpacing()[2]); + } + else{ + transform_final->Translate(xtrans_sb->value(),0,0); + transform_final->Translate(0,ytrans_sb->value(),0); + transform_final->Translate(0,0,ztrans_sb->value()); + } + SetTransform(transform_final->GetMatrix()); + UpdateTextEditor(transform_final->GetMatrix(),textEdit); } - //------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ -void vvToolRigidReg::UpdateZrotslider() -{ - int diff=0; - diff=zrot_slider->value()-zrot_sb->value(); - this->SetTransform(0, 0, 0, 0, 0, diff); - zrot_sb->setValue(zrot_slider->value()); -// UpdateTextEditor(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(),QString("Rz:")+zrot_sb->text()); -} -//------------------------------------------------------------------------------ //------------------------------------------------------------------------------ void vvToolRigidReg::SaveFile() -{ - QString s = QFileDialog::getSaveFileName(this, tr("Save File"), - "/home/bharath/clitk3_27Apr/clitk3/build/bin/text.txt", - tr("Text (*.txt *.doc *.rtf)")); - QFile file(s); - if (file.open(QFile::WriteOnly | QFile::Truncate)) { - QTextStream out(&file); - out << textEdit->toPlainText() ; +{ + //Write the Transformation Matrix + QString f1 = QFileDialog::getSaveFileName(this, tr("Save Transformation Matrix File"), + mMainWindow->GetInputPathName(), + tr("Text (*.mat *.txt *.doc *.rtf)")); + QFile file1(f1); + std::vector transparameters; + QString line1; + + for(int i =0;i<4;i++) + for(int j=0;j<4;j++) + transparameters.push_back(line1.setNum(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()->Element[i][j])); + + if (file1.open(QFile::WriteOnly | QFile::Truncate)) { + QTextStream out1(&file1); + for(int i =0;i<4;i++){ + for(int j=0;j<4;j++) { + out1< transform = mCurrentSlicerManager->GetImage()->GetTransform(); - - - QString s = QFileDialog::getOpenFileName( + + //Open File to read the transformation parameters + QString file1 = QFileDialog::getOpenFileName( this, - "Choose a file", - "/home/bharath/clitk3_27Apr/clitk3/build/bin/", - "Text (*.txt *.rtf *.doc)"); - QFile file(s); - ifstream readfile; - std::string x; - std::vector Qstr; - - readfile.open("text.txt"); - if (readfile.is_open()) + "Choose the Transformation Parameters file", + mMainWindow->GetInputPathName(), + "Text (*.mat *.txt *.rtf *.doc)"); + if (file1.isEmpty()) + return; + QFile Qfile1(file1); + // ifstream readfile; + std::string transfile= file1.toStdString(); + std::string filename1(transfile); + std::ifstream f1(filename1.c_str()); + if(f1.is_open()) { - while (!readfile.eof()) - { - readfile >> x; - Qstr.push_back(QString(x.c_str())); - } - readfile.close(); + f1.close(); + itk::Matrix itkMat = clitk::ReadMatrix3D(transfile); + for(int j=0; j<4; j++) + for(int i=0; i<4; i++) + matrix->SetElement(i,j,itkMat[i][j]); } - else cout << "Unable to open file"; + UpdateTextEditor(matrix,textEdit); + transform->SetMatrix(matrix); + transform->GetOrientation(orientations); + transform->PostMultiply(); - //Obtain the Rotation Center - Xval->setText(Qstr.at(2)); - Yval->setText(Qstr.at(3)); - Zval->setText(Qstr.at(4)); + //Obtain the Rotation Center , set it to origin + Xval->setText(center.setNum(0)); + Yval->setText(center.setNum(0)); + Zval->setText(center.setNum(0)); + + //In the Order or Y X Z // + //now postmultiply for the rotations + SetTransform(0,0,0,0,0,-rint(orientations[2]),false); + SetTransform(0,0,0,-rint(orientations[0]),0,0,false); + SetTransform(0,0,0,0,-rint(orientations[1]),0,false); -// InitializeSliders(); - double * orientations=new double[4]; - double * translations=new double[3]; - transform->PostMultiply(); - //Works currently wit the ROtation order Y Z X transform->GetPosition(translations); - transform->GetOrientation(orientations); - /* xtrans_slider->setValue(Qstr.at(10).toDouble()); - UpdateXtranslider(); - ytrans_slider->setValue(Qstr.at(14).toDouble()); - UpdateYtranslider(); - ztrans_slider->setValue(Qstr.at(18).toDouble()); - UpdateZtranslider(); -*/ - DD(translations[0]); - DD(translations[1]); - DD(translations[2]); + transform->Identity(); + + DD(translations[0]/mInput1->GetImage()->GetSpacing()[0]); + DD(translations[1]/mInput1->GetImage()->GetSpacing()[1]); + DD(translations[2]/mInput1->GetImage()->GetSpacing()[2]); DD(orientations[0]); DD(orientations[1]); DD(orientations[2]); - DD(orientations[3]); - DD(*transform->GetMatrix()); - //Obtain the Transformation Matrix - /*QString str; - str=QString(value.at(10).c_str()); - DD(str.toStdString()); - */ -// DD(value[6]); - // DD(value[10]); - //put the streamed values in matrix array - /* for(int i=0;i<4;i++) - { - for(int j=0;j<4;j++) - { - matrix->Element[i][j]=value[i*4+j]; - } - } - SetTransform( matrix);*/ - - /*xtrans_slider->setValue(value.at(10)); - ytrans_slider->setValue(value.at(14)); - ztrans_slider->setValue(value.at(18)); - UpdateXtranslider(); - UpdateYtranslider(); - UpdateZtranslider();*/ + //set the sliders and spin box values + InitializeSliders(rint(translations[0]),rint(translations[1]) + ,rint(translations[2]),rint(orientations[0]),rint(orientations[1]),rint(orientations[2]),true); + SetTransform(matrix); } //------------------------------------------------------------------------------ @@ -602,14 +555,13 @@ void vvToolRigidReg::ReadFile() void vvToolRigidReg::ResetTransform() { vtkMatrix4x4 *matrix = vtkMatrix4x4::New(); - matrix->Identity(); - + for(int i=0;i<4;i++) + for(int j=0;j<4;j++) + matrix->SetElement(i,j,mInitialMatrix[i*4+j]); + SetTransform(matrix); SetRotationCenter(); SetSliderRanges(); - SetTransform(matrix); - mOrder.clear(); - mOrder=QString("Rotation Order: "); - UpdateTextEditor(matrix,mOrder); + UpdateTextEditor(matrix,textEdit); } //------------------------------------------------------------------------------ @@ -619,81 +571,119 @@ void vvToolRigidReg::SetRotationCenter() //default image rotation center is the center of the image QString xcord,ycord,zcord; std::vector imageorigin; - imageorigin=mCurrentSlicerManager->GetImage()->GetOrigin(); - - xcord=xcord.setNum(imageorigin[0]+mImageSize[0]*mCurrentSlicerManager->GetImage()->GetSpacing()[0]/2, 'g', 3); - ycord=ycord.setNum(imageorigin[1]+mImageSize[1]*mCurrentSlicerManager->GetImage()->GetSpacing()[1]/2, 'g', 3); - zcord=zcord.setNum(imageorigin[2]+mImageSize[2]*mCurrentSlicerManager->GetImage()->GetSpacing()[2]/2, 'g', 3); + imageorigin=mInput1->GetImage()->GetOrigin(); + DD("before bug"); + xcord=xcord.setNum(imageorigin[0]+mImageSize[0]*mInput1->GetImage()->GetSpacing()[0]/2, 'g', 3); + ycord=ycord.setNum(imageorigin[1]+mImageSize[1]*mInput1->GetImage()->GetSpacing()[1]/2, 'g', 3); + zcord=zcord.setNum(imageorigin[2]+mImageSize[2]*mInput1->GetImage()->GetSpacing()[2]/2, 'g', 3); Xval->setText(xcord); Yval->setText(ycord); Zval->setText(zcord); - InitializeSliders(); + InitializeSliders(0,0,0,0,0,0,true); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolRigidReg::InitializeSliders() +void vvToolRigidReg::InitializeSliders(double xtrans,double ytrans, double ztrans, double xrot, double yrot, double zrot,bool sliders) { - xtrans_slider->signalsBlocked(); - ytrans_slider->signalsBlocked(); - ztrans_slider->signalsBlocked(); - xtrans_sb->signalsBlocked(); - ytrans_sb->signalsBlocked(); - ztrans_sb->signalsBlocked(); - xrot_slider->signalsBlocked(); - yrot_slider->signalsBlocked(); - zrot_slider->signalsBlocked(); - xrot_sb->signalsBlocked(); - yrot_sb->signalsBlocked(); - zrot_sb->signalsBlocked(); - - xtrans_sb->setValue(0); - ytrans_sb->setValue(0); - ztrans_sb->setValue(0); - - xtrans_slider->setValue(0); - ytrans_slider->setValue(0); - ztrans_slider->setValue(0); - - xrot_sb->setValue(0); - yrot_sb->setValue(0); - zrot_sb->setValue(0); - xrot_slider->setValue(0); - yrot_slider->setValue(0); - zrot_slider->setValue(0); + xtrans_sb->blockSignals(true); + xtrans_sb->setSingleStep(mInput1->GetImage()->GetSpacing()[0]); + xtrans_sb->setValue(xtrans); + xtrans_sb->blockSignals(false); + ytrans_sb->blockSignals(true); + ytrans_sb->setSingleStep(mInput1->GetImage()->GetSpacing()[1]); + ytrans_sb->setValue(ytrans); + ytrans_sb->blockSignals(false); + ztrans_sb->blockSignals(true); + ztrans_sb->setSingleStep(mInput1->GetImage()->GetSpacing()[2]); + ztrans_sb->setValue(ztrans); + ztrans_sb->blockSignals(false); + + if(sliders){ + xtrans_slider->blockSignals(true); + xtrans_slider->setValue(rint(xtrans)); + xtrans_slider->blockSignals(false); + ytrans_slider->blockSignals(true); + ytrans_slider->setValue(rint(ytrans)); + ytrans_slider->blockSignals(false); + ztrans_slider->blockSignals(true); + ztrans_slider->setValue(rint(ztrans)); + ztrans_slider->blockSignals(false); + } + xrot_sb->blockSignals(true); + xrot_sb->setValue(xrot); + xrot_sb->blockSignals(false); + yrot_sb->blockSignals(true); + yrot_sb->setValue(yrot); + yrot_sb->blockSignals(false); + zrot_sb->blockSignals(true); + zrot_sb->setValue(zrot); + zrot_sb->blockSignals(false); + xrot_slider->blockSignals(true); + xrot_slider->setValue(xrot); + xrot_slider->blockSignals(false); + yrot_slider->blockSignals(true); + yrot_slider->setValue(yrot); + yrot_slider->blockSignals(false); + zrot_slider->blockSignals(true); + zrot_slider->setValue(zrot); + zrot_slider->blockSignals(false); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ void vvToolRigidReg::SetSliderRanges() { - xtrans_slider->setMaximum(1000); - xtrans_slider->setMinimum(-1000); - ytrans_slider->setMaximum(1000); - ytrans_slider->setMinimum(-1000); - ztrans_slider->setMaximum(1000); - ztrans_slider->setMinimum(-1000); - - xtrans_sb->setMaximum(1000); - xtrans_sb->setMinimum(-1000); - ytrans_sb->setMaximum(1000); - ytrans_sb->setMinimum(-1000); - ztrans_sb->setMaximum(1000); - ztrans_sb->setMinimum(-1000); - - xrot_slider->setMaximum(360); - xrot_slider->setMinimum(-360); - yrot_slider->setMaximum(360); - yrot_slider->setMinimum(-360); - zrot_slider->setMaximum(360); - zrot_slider->setMinimum(-360); - - xrot_sb->setMaximum(360); - xrot_sb->setMinimum(-360); - yrot_sb->setMaximum(360); - yrot_sb->setMinimum(-360); - zrot_sb->setMaximum(360); - zrot_sb->setMinimum(-360); + xtrans_slider->blockSignals(true); + xtrans_slider->setRange(-2000,2000); + xtrans_slider->blockSignals(false); + + ytrans_slider->blockSignals(true); + ytrans_slider->setRange(-2000,2000); + ytrans_slider->blockSignals(false); + + ztrans_slider->blockSignals(true); + ztrans_slider->setRange(-2000,2000); + ztrans_slider->blockSignals(false); + + xtrans_sb->blockSignals(true); + xtrans_sb->setRange(-2000,2000); + xtrans_sb->setDecimals(3); + xtrans_sb->blockSignals(false); + + ytrans_sb->blockSignals(true); + ytrans_sb->setRange(-2000,2000); + ytrans_sb->setDecimals(3); + ytrans_sb->blockSignals(false); + + ztrans_sb->blockSignals(true); + ztrans_sb->setRange(-2000,2000); + ztrans_sb->setDecimals(3); + ztrans_sb->blockSignals(false); + + xrot_slider->blockSignals(true); + xrot_slider->setRange(-360,360); + xrot_slider->blockSignals(false); + + yrot_slider->blockSignals(true); + yrot_slider->setRange(-360,360); + yrot_slider->blockSignals(false); + + zrot_slider->blockSignals(true); + zrot_slider->setRange(-360,360); + zrot_slider->blockSignals(false); + + xrot_sb->blockSignals(true); + xrot_sb->setRange(-360,360); + xrot_sb->blockSignals(false); + + yrot_sb->blockSignals(true); + yrot_sb->setRange(-360,360); + yrot_sb->blockSignals(false); + + zrot_sb->blockSignals(true); + zrot_sb->setRange(-360,360); + zrot_sb->blockSignals(false); }