X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvToolRigidReg.cxx;h=e50ab7fda50ec3a927afc399a5796d98d038f550;hb=0b8e61cfe53d9d1f697b1d9d85c948ca27c29898;hp=5cc862d5aaf2b34fefac0a35b4a24cef2839f148;hpb=d6a6a206c0a533a60519e9b3e82fba48d1240c3e;p=clitk.git diff --git a/vv/vvToolRigidReg.cxx b/vv/vvToolRigidReg.cxx index 5cc862d..e50ab7f 100644 --- a/vv/vvToolRigidReg.cxx +++ b/vv/vvToolRigidReg.cxx @@ -19,6 +19,7 @@ // vv #include "vvToolRigidReg.h" #include "vvSlicer.h" +#include // vtk #include @@ -177,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; @@ -377,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 @@ -397,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); @@ -458,97 +474,11 @@ void vvToolRigidReg::ExtentMax(const double pointExtent[8][4], double maxExtent[ //------------------------------------------------------------------------------ void vvToolRigidReg::Render() -{ //out << __func__ << endl; -#if VTK_MAJOR_VERSION > 5 -vtkMatrix4x4* matrix = mCurrentSlicerManager->GetImage()->GetTransform()[0]->GetMatrix(); -vtkMatrix4x4* matrixTranspose = matrix->NewInstance(); -for (int i=0; i<3; ++i) { - for (int j=0; j<3; ++j) - { - matrixTranspose->SetElement(i,j,matrix->GetElement(j,i)); - } -} -for (int i=0; i<4; ++i) { - matrixTranspose->SetElement(3,i,matrix->GetElement(3,i)); -} -for (int i=0; i<4; ++i) { - matrixTranspose->SetElement(i,3,matrix->GetElement(i,3)); -} -#endif - for (int i=0; iGetNumberOfSlicers(); i++) - { -#if VTK_MAJOR_VERSION > 5 - double pointExtent[8][4], pointExtentUpdate[8][4]; - std::vector w_ext; - w_ext=mCurrentSlicerManager->GetImage()->GetSize(); - pointExtent[0][0] = 0.0; - pointExtent[0][1] = 0.0; - pointExtent[0][2] = 0.0; - pointExtent[0][3] = 1.0; - pointExtent[1][0] = w_ext[0]-1; - pointExtent[1][1] = w_ext[1]-1; - pointExtent[1][2] = w_ext[2]-1; - pointExtent[1][3] = 1.0; - pointExtent[2][0] = 0.0; - pointExtent[2][1] = w_ext[1]-1; - pointExtent[2][2] = w_ext[2]-1; - pointExtent[2][3] = 1.0; - pointExtent[3][0] = w_ext[0]-1; - pointExtent[3][1] = 0.0; - pointExtent[3][2] = w_ext[2]-1; - pointExtent[3][3] = 1.0; - pointExtent[4][0] = w_ext[0]-1; - pointExtent[4][1] = w_ext[1]-1; - pointExtent[4][2] = 0.0; - pointExtent[4][3] = 1.0; - pointExtent[5][0] = 0.0; - pointExtent[5][1] = 0.0; - pointExtent[5][2] = w_ext[2]-1; - pointExtent[5][3] = 1.0; - pointExtent[6][0] = 0.0; - pointExtent[6][1] = w_ext[1]-1; - pointExtent[6][2] = 0.0; - pointExtent[6][3] = 1.0; - pointExtent[7][0] = w_ext[0]-1; - pointExtent[7][1] = 0.0; - pointExtent[7][2] = 0.0; - pointExtent[7][3] = 1.0; - - for (int k=0; k<8; ++k) { - for (int j=0; j<3; ++j) - { - pointExtent[k][j] = mCurrentSlicerManager->GetImage()->GetOrigin()[j] + mCurrentSlicerManager->GetImage()->GetSpacing()[j] * pointExtent[k][j]; - } - matrixTranspose->MultiplyPoint(pointExtent[k], pointExtentUpdate[k]); - for (int j=0; j<3; ++j) - { - pointExtentUpdate[k][j] = (pointExtentUpdate[k][j] - mCurrentSlicerManager->GetImage()->GetOrigin()[j])/mCurrentSlicerManager->GetImage()->GetSpacing()[j]; - } - } -double extUpdateTemp[2][3]; -int extUpdate[6]; -ExtentMax(pointExtentUpdate, extUpdateTemp); -for (int j=0; j<3; ++j) { - extUpdate[2*j] = 0; - extUpdate[2*j+1] = itk::Math::Round(extUpdateTemp[1][j] - extUpdateTemp[0][j]); -} - mCurrentSlicerManager->GetSlicer(i)->SetRegisterExtent(extUpdate); - extUpdate[2*mCurrentSlicerManager->GetSlicer(i)->GetOrientation()] = mCurrentSlicerManager->GetSlicer(i)->GetSlice(); - extUpdate[2*mCurrentSlicerManager->GetSlicer(i)->GetOrientation()+1] = mCurrentSlicerManager->GetSlicer(i)->GetSlice(); - - vtkSmartPointer mapperOpenGL= vtkSmartPointer::New(); - try { - mapperOpenGL = dynamic_cast(mCurrentSlicerManager->GetSlicer(i)->GetImageActor()->GetMapper()); - } catch (const std::bad_cast& e) { - std::cerr << e.what() << std::endl; - std::cerr << "Conversion error" << std::endl; - return; - } - mapperOpenGL->SetCroppingRegion(extUpdate); -#endif +{ +for (int i=0; iGetNumberOfSlicers(); i++) { mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent(); mCurrentSlicerManager->GetSlicer(i)->Render(); - } +} } //------------------------------------------------------------------------------