X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvToolRigidReg.cxx;h=e50ab7fda50ec3a927afc399a5796d98d038f550;hb=0b8e61cfe53d9d1f697b1d9d85c948ca27c29898;hp=28591ba05ed1b6c6cc8af79af440ef5eaea6eb37;hpb=65a613313ab43ff6efc452b378f7569e68e883a2;p=clitk.git diff --git a/vv/vvToolRigidReg.cxx b/vv/vvToolRigidReg.cxx index 28591ba..e50ab7f 100644 --- a/vv/vvToolRigidReg.cxx +++ b/vv/vvToolRigidReg.cxx @@ -19,17 +19,23 @@ // vv #include "vvToolRigidReg.h" #include "vvSlicer.h" +#include // vtk #include #include +#include #include +#include +#include +#include // itk #include // clitk #include "clitkTransformUtilities.h" +#include "clitkMatrix.h" // qt #include @@ -118,8 +124,9 @@ void vvToolRigidReg::InputIsSelected(vvSlicerManager *input) //backup original matrix for(int j=0; j<4; j++) for(int i=0; i<4; i++) - mInitialMatrix->SetElement(i,j, mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()->GetElement(i,j)); - QString origTransformString = dynamic_cast(mMainWindow)->Get4x4MatrixDoubleAsString(mInitialMatrix); + // TODO SR and BP: check on the list of transforms and not the first only + mInitialMatrix->SetElement(i,j, mCurrentSlicerManager->GetImage()->GetTransform()[0]->GetMatrix()->GetElement(i,j)); + QString origTransformString(clitk::Get4x4MatrixDoubleAsString(mInitialMatrix).c_str()); transformationLabel->setText(origTransformString); SetTransform(mInitialMatrix); @@ -171,7 +178,8 @@ bool vvToolRigidReg::close() msgBox.addButton(tr("Yes"), QMessageBox::AcceptRole); msgBox.addButton(tr("No"), QMessageBox::RejectRole); if (msgBox.exec() == QMessageBox::AcceptRole) { - SetTransform(mInitialMatrix); + if (mCurrentSlicerManager) + SetTransform(mInitialMatrix); return vvToolWidgetBase::close(); } return false; @@ -242,7 +250,8 @@ void vvToolRigidReg::SpinBoxChange(double newVal) } // Compute transform and set - vtkSmartPointer transform_final=mInput->GetImage()->GetTransform(); + // TODO SR and BP: check on the list of transforms and not the first only + vtkSmartPointer transform_final=mInput->GetImage()->GetTransform()[0]; transform_final->Identity(); transform_final->PostMultiply(); @@ -294,8 +303,9 @@ void vvToolRigidReg::SaveFile() QFile file(filename); if (file.open(QFile::WriteOnly | QFile::Truncate)) { - vtkMatrix4x4* matrix = mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix(); - QString matrixStr = dynamic_cast(mMainWindow)->Get4x4MatrixDoubleAsString(matrix,16); + // TODO SR and BP: check on the list of transforms and not the first only + vtkMatrix4x4* matrix = mCurrentSlicerManager->GetImage()->GetTransform()[0]->GetMatrix(); + QString matrixStr = clitk::Get4x4MatrixDoubleAsString(matrix,16).c_str(); QTextStream out(&file); out << matrixStr; } @@ -332,7 +342,8 @@ void vvToolRigidReg::LoadFile() //------------------------------------------------------------------------------ void vvToolRigidReg::ChangeOfRotationCenter() { - SetTransform(mCurrentSlicerManager->GetImage()->GetTransform()->GetMatrix()); + // TODO SR and BP: check on the list of transforms and not the first only + SetTransform(mCurrentSlicerManager->GetImage()->GetTransform()[0]->GetMatrix()); } //------------------------------------------------------------------------------ @@ -347,7 +358,8 @@ void vvToolRigidReg::ResetTransform() void vvToolRigidReg::SetTransform(vtkMatrix4x4 *matrix) { vtkSmartPointer transform=vtkSmartPointer::New(); - mCurrentSlicerManager->GetImage()->GetTransform()->SetMatrix(matrix); + // TODO SR and BP: check on the list of transforms and not the first only + mCurrentSlicerManager->GetImage()->GetTransform()[0]->SetMatrix(matrix); transform->Update(); Render(); dynamic_cast(mMainWindow)->ImageInfoChanged(); @@ -367,7 +379,21 @@ void vvToolRigidReg::SetTransform(vtkMatrix4x4 *matrix) itk::Euler3DTransform::Pointer euler; euler = itk::Euler3DTransform::New(); euler->SetCenter(center); - euler->SetMatrix(rotMat); + try { +#if ITK_VERSION_MAJOR > 4 || (ITK_VERSION_MAJOR == 4 && ITK_VERSION_MINOR > 6) + euler->SetMatrix(rotMat,0.00001); +#else + euler->SetMatrix(rotMat); +#endif + } catch (itk::ExceptionObject) { + QString warning = "The matrice is a non-orthogonal rotation matrix.\nThe manual registration doesn't work."; + QMessageBox msgBox(QMessageBox::Warning, tr("Reset transform"),warning, 0, this); + msgBox.addButton(tr("OK"), QMessageBox::AcceptRole); + if (msgBox.exec() == QMessageBox::AcceptRole) { + //SetTransform(mInitialMatrix); + vvToolWidgetBase::close(); + } + } euler->SetOffset(transVec); // Modify GUI according to the new parameters @@ -387,7 +413,7 @@ void vvToolRigidReg::SetTransform(vtkMatrix4x4 *matrix) double rad = (checkBoxDegrees->checkState()==Qt::Checked)?180./itk::Math::pi:1.; double angleDiff = euler->GetParameters()[i]-rotSBs[i]->value()/rad+2*itk::Math::pi; angleDiff = angleDiff - 2*itk::Math::pi*itk::Math::Round(angleDiff/(2*itk::Math::pi)); - if(angleDiff>1.e-4) { + if(abs(angleDiff)>1.e-4) { rotSBs[i]->blockSignals(true); rotSBs[i]->setValue( euler->GetParameters()[i]*rad ); rotSBs[i]->blockSignals(false); @@ -425,14 +451,34 @@ void vvToolRigidReg::GetSlidersAndSpinBoxes(std::vector&transSliders, } //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void vvToolRigidReg::ExtentMax(const double pointExtent[8][4], double maxExtent[2][3]) +{ + double max, min; + for (int i=0; i<3; ++i) { + max = pointExtent[0][i]; + min = pointExtent[0][i]; + for (int j=1; j<8; ++j) { + if (pointExtent[j][i] > max) { + max = pointExtent[j][i]; + } + if (pointExtent[j][i] < min) { + min = pointExtent[j][i]; + } + } + maxExtent[0][i] = min; + maxExtent[1][i] = max; + } +} +//------------------------------------------------------------------------------ + //------------------------------------------------------------------------------ void vvToolRigidReg::Render() { - for (int i=0; iGetNumberOfSlicers(); i++) - { +for (int i=0; iGetNumberOfSlicers(); i++) { mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent(); mCurrentSlicerManager->GetSlicer(i)->Render(); - } +} } //------------------------------------------------------------------------------