X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvToolRigidReg.cxx;h=5a11c7f8e367dad022cf08bc8b54cf06a92e92ed;hb=HEAD;hp=644920b4435fa420e35c7d33664c5ad9697a5c2e;hpb=18243ee643931eb014e0bd3fef016d4a77009479;p=clitk.git diff --git a/vv/vvToolRigidReg.cxx b/vv/vvToolRigidReg.cxx index 644920b..5a11c7f 100644 --- a/vv/vvToolRigidReg.cxx +++ b/vv/vvToolRigidReg.cxx @@ -178,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; @@ -378,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 @@ -398,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(std::abs(angleDiff)>1.e-4) { rotSBs[i]->blockSignals(true); rotSBs[i]->setValue( euler->GetParameters()[i]*rad ); rotSBs[i]->blockSignals(false); @@ -459,200 +474,8 @@ void vvToolRigidReg::ExtentMax(const double pointExtent[8][4], double maxExtent[ //------------------------------------------------------------------------------ void vvToolRigidReg::Render() -{ //out << __func__ << endl; -#if VTK_MAJOR_VERSION > 5 -double translationValues[4], translationValuesUpdate[4]; -mCurrentSlicerManager->GetImage()->GetTransform()[0]->Print(cout); -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 j=0; j<3; ++j) { - translationValues[j] = matrix->GetElement(j,3); -} -translationValues[3] = 0.0; -matrix->MultiplyPoint(translationValues, translationValuesUpdate); -for (int i=0; i<3; ++i) { - matrixTranspose->SetElement(i,3,translationValuesUpdate[i]); -} -for (int i=0; i<4; ++i) { - matrixTranspose->SetElement(3,i,matrix->GetElement(3,i)); -} - -#endif for (int i=0; iGetNumberOfSlicers(); i++) { -#if VTK_MAJOR_VERSION > 5 - double pointExtent[8][4], pointExtentUpdate[8][4], pointOverlayExtent[8][4], pointOverlayExtentUpdate[8][4], centre[3], translation[3]; - 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; - - centre[0] = Xval->text().toDouble(); - centre[1] = Yval->text().toDouble(); - centre[2] = Zval->text().toDouble(); - - for (int k=0; k<8; ++k) { - for (int j=0; j<3; ++j) - { - pointOverlayExtent[k][j] = mCurrentSlicerManager->GetImage()->GetSpacing()[j]*pointExtent[k][j] - centre[j]; - } - pointOverlayExtent[k][3] = 0.0; - matrixTranspose->MultiplyPoint(pointOverlayExtent[k], pointOverlayExtentUpdate[k]); - for (int j=0; j<3; ++j) - { - pointOverlayExtentUpdate[k][j] = (pointOverlayExtentUpdate[k][j] + centre[j])/mCurrentSlicerManager->GetImage()->GetSpacing()[j]; - cout << pointOverlayExtentUpdate[k][j] << " "; - } - cout << endl; - } - cout << endl; - for (int k=0; k<8; ++k) { - for (int j=0; j<3; ++j) - { - pointExtent[k][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()->GetSpacing()[j]; - cout << pointExtentUpdate[k][j] << " "; - } - cout << endl; - } - double extUpdateTemp[2][3], extOverlayUpdateTemp[2][3]; - int extUpdate[6]; - ExtentMax(pointExtentUpdate, extUpdateTemp); - ExtentMax(pointOverlayExtentUpdate, extOverlayUpdateTemp); - 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; - } - cout << extUpdate[0] << " " << extUpdate[1] << " " << extUpdate[2] << " " << extUpdate[3] << " " << extUpdate[4] << " " << extUpdate[5] << endl; - mapperOpenGL->SetCroppingRegion(extUpdate); - - if (mCurrentSlicerManager->GetSlicer(i)->GetOverlay() && mCurrentSlicerManager->GetSlicer(i)->GetOverlayActor()->GetVisibility()) { - int extOverlayUpdate[6]; - for (int j=0; j<3; ++j) { //Rotation - if (extOverlayUpdateTemp[1][j] - extOverlayUpdateTemp[0][j] > w_ext[j]-1) { - extOverlayUpdate[2*j] = 0; - extOverlayUpdate[2*j+1] = w_ext[j]-1; - } else { - extOverlayUpdate[2*j] = itk::Math::Round(extOverlayUpdateTemp[0][j]); - extOverlayUpdate[2*j+1] = itk::Math::Round(extOverlayUpdateTemp[1][j]); - } - } - - //Compute translation - double pointOrigin[4], pointOriginUpdate[4]; - for (int j=0; j<3; ++j) - { - pointOrigin[j] = 0 - centre[j]; - } - pointOrigin[3] = 0.0; - matrix->MultiplyPoint(pointOrigin, pointOriginUpdate); - for (int j=0; j<3; ++j) - { - pointOriginUpdate[j] = (pointOriginUpdate[j] + centre[j])/mCurrentSlicerManager->GetImage()->GetSpacing()[j]; - translation[j] = matrix->GetElement(j,3) - pointOriginUpdate[j]*mCurrentSlicerManager->GetImage()->GetSpacing()[j]; - pointOrigin[j] = translation[j]; - } - pointOrigin[3] = 0.0; - matrixTranspose->MultiplyPoint(pointOrigin, pointOriginUpdate); - for (int j=0; j<3; ++j) - { - translation[j] = pointOriginUpdate[j]/mCurrentSlicerManager->GetImage()->GetSpacing()[j]; - } - - for (int j=0; j<3; ++j) { //Translation - if (0 < extOverlayUpdateTemp[0][j] - translation[j]) { - extOverlayUpdate[2*j] = itk::Math::Round(extOverlayUpdateTemp[0][j] - translation[j]); - } else { - extOverlayUpdate[2*j] = 0; - } - if (extOverlayUpdateTemp[1][j] - translation[j] < w_ext[j]-1) { - extOverlayUpdate[2*j+1] = itk::Math::Round(extOverlayUpdateTemp[1][j] - translation[j]); - } else { - extOverlayUpdate[2*j+1] = w_ext[j]-1; - } - } - extOverlayUpdate[2*mCurrentSlicerManager->GetSlicer(i)->GetOrientation()] += mCurrentSlicerManager->GetSlicer(i)->GetSlice(); - extOverlayUpdate[2*mCurrentSlicerManager->GetSlicer(i)->GetOrientation()+1] = extOverlayUpdate[2*mCurrentSlicerManager->GetSlicer(i)->GetOrientation()]; - vtkSmartPointer mapperOpenGL= vtkSmartPointer::New(); - try { - mapperOpenGL = dynamic_cast(mCurrentSlicerManager->GetSlicer(i)->GetOverlayActor()->GetMapper()); - } catch (const std::bad_cast& e) { - std::cerr << e.what() << std::endl; - std::cerr << "Conversion error" << std::endl; - return; - } - - //Slice number - double spacing[4],spacingUpdate[4]; - int sliceNumber; - spacing[0] = 240*mCurrentSlicerManager->GetImage()->GetSpacing()[0]-centre[0]; - spacing[1] = 179*mCurrentSlicerManager->GetImage()->GetSpacing()[1]-centre[1]; - spacing[2] = 22*mCurrentSlicerManager->GetImage()->GetSpacing()[2]-centre[2]; - spacing[3] = 0; - matrixTranspose->MultiplyPoint(spacing, spacingUpdate); - spacingUpdate[0] = (spacingUpdate[0]+centre[0])/mCurrentSlicerManager->GetImage()->GetSpacing()[0]; - spacingUpdate[1] = (spacingUpdate[1]+centre[1])/mCurrentSlicerManager->GetImage()->GetSpacing()[1]; - spacingUpdate[2] = (spacingUpdate[2]+centre[2])/mCurrentSlicerManager->GetImage()->GetSpacing()[2]; - cout << spacingUpdate[0] << " " << spacingUpdate[1] << " " << spacingUpdate[2] << endl; - sliceNumber = mCurrentSlicerManager->GetSlicer(i)->GetSlice()*spacingUpdate[mCurrentSlicerManager->GetSlicer(i)->GetOrientation()]/mCurrentSlicerManager->GetImage()->GetSpacing()[mCurrentSlicerManager->GetSlicer(i)->GetOrientation()]; - extOverlayUpdate[2*mCurrentSlicerManager->GetSlicer(i)->GetOrientation()] = 12;//sliceNumber; - extOverlayUpdate[2*mCurrentSlicerManager->GetSlicer(i)->GetOrientation()+1] = 12;//sliceNumber; - - mapperOpenGL->SetCroppingRegion(extOverlayUpdate); - } -#endif mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent(); mCurrentSlicerManager->GetSlicer(i)->Render(); }