#pragma once /*========================================================================= medInria Copyright (c) INRIA 2013 - 2020. All rights reserved. See LICENSE.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. =========================================================================*/ #include #include #include #include #include #include class medAbstractData; class vtkMatrix4x4; class vtkMetaDataSet; class vtkTransform; namespace medTransform { void convert(const QMatrix4x4& source, vtkMatrix4x4& target); void convert(const vtkMatrix4x4& source, QMatrix4x4& target); // Functions using vtkMatrix4x4 void getTransform(itk::Object& object, vtkMatrix4x4& transform); template void getTransform(itk::ImageBase<3>& imageBase, vtkMatrix4x4& transform); void setTransform(itk::Object& object, const vtkMatrix4x4& transform); template void setTransform(itk::ImageBase<3>& imageBase, const vtkMatrix4x4& transform); void applyTransform(medAbstractData& data, const vtkMatrix4x4& transform); void applyTransform(itk::Object& object, const vtkMatrix4x4& transform); template void applyTransform(itk::ImageBase<3>& imageBase, const vtkMatrix4x4& transform); void applyTransform(vtkMetaDataSet& mesh, const vtkMatrix4x4& transform); // Functions using QMatrix4x4 void getTransform(itk::Object& object, QMatrix4x4& transform); template void getTransform(itk::ImageBase<3>& object, QMatrix4x4& transform); void setTransform(itk::Object& object, const QMatrix4x4& transform); template void setTransform(itk::ImageBase<3>&, const QMatrix4x4& transform); void applyTransform(medAbstractData& data, const QMatrix4x4& transform); void applyTransform(itk::Object& object, const QMatrix4x4& transform); template void applyTransform(itk::ImageBase<3>& imageBase, const QMatrix4x4& transform); void applyTransform(vtkMetaDataSet& mesh, const QMatrix4x4& transform); void convert(const QMatrix4x4& source, vtkMatrix4x4& target) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { target.SetElement(i, j, source(i, j)); } } } void convert(const vtkMatrix4x4& source, QMatrix4x4& target) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { target(i, j) = source.GetElement(i, j); } } } vtkSmartPointer toVTKMatrix(const QMatrix4x4& matrix) { vtkSmartPointer vtkMatrix = vtkSmartPointer::New(); convert(matrix, *vtkMatrix); return vtkMatrix; } template void getTransform(itk::ImageBase<3>& imageBase, vtkMatrix4x4& transform) { typedef itk::Image ImageType; ImageType& image = static_cast(imageBase); typename ImageType::DirectionType orientation; typename ImageType::PointType origin; orientation = image.GetDirection(); origin = image.GetOrigin(); transform.Identity(); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { transform.SetElement(i, j, orientation(i, j)); } transform.SetElement(i, 3, origin[i]); } } void getTransform(itk::Object& object, vtkMatrix4x4& transform) { itk::ImageBase<3>& imageBase = dynamic_cast&>(object); if (dynamic_cast*>(&imageBase)) { return getTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return getTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return getTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return getTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return getTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return getTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return getTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return getTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return getTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return getTransform(imageBase, transform); } } template void setTransform(itk::ImageBase<3>& imageBase, const vtkMatrix4x4& transform) { typedef itk::Image ImageType; ImageType& image = static_cast(imageBase); typename ImageType::DirectionType orientation; typename ImageType::PointType origin; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { orientation(i, j) = transform.GetElement(i, j); } origin[i] = transform.GetElement(i, 3); } image.SetDirection(orientation); image.SetOrigin(origin); } void setTransform(itk::Object& object, const vtkMatrix4x4& transform) { itk::ImageBase<3>& imageBase = dynamic_cast&>(object); if (dynamic_cast*>(&imageBase)) { return setTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return setTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return setTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return setTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return setTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return setTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return setTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return setTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return setTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return setTransform(imageBase, transform); } } template void applyTransform(itk::ImageBase<3>& imageBase, const vtkMatrix4x4& transform) { typedef itk::Image ImageType; ImageType& image = static_cast(imageBase); vtkSmartPointer imageTransform = vtkSmartPointer::New(); getTransform(image, *imageTransform); vtkMatrix4x4::Multiply4x4(&transform, imageTransform, imageTransform); setTransform(image, *imageTransform); } void applyTransform(vtkMetaDataSet& mesh, const vtkMatrix4x4& transform) { vtkSmartPointer transformCopy = vtkSmartPointer::New(); transformCopy->DeepCopy(&transform); vtkSmartPointer matrixToTransform = vtkSmartPointer::New(); matrixToTransform->SetInput(transformCopy); vtkSmartPointer transformFilter = vtkSmartPointer::New(); transformFilter->SetInputData(mesh.GetDataSet()); transformFilter->SetTransform(matrixToTransform); transformFilter->Update(); mesh.SetDataSet(transformFilter->GetOutput()); } void applyTransform(itk::Object& object, const vtkMatrix4x4& transform) { itk::ImageBase<3>& imageBase = dynamic_cast&>(object); if (dynamic_cast*>(&imageBase)) { return applyTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return applyTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return applyTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return applyTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return applyTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return applyTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return applyTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return applyTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return applyTransform(imageBase, transform); } if (dynamic_cast*>(&imageBase)) { return applyTransform(imageBase, transform); } } void applyTransform(medAbstractData& data, const vtkMatrix4x4& transform) { QString identifier = data.identifier(); if (identifier.startsWith("itkDataImage")) { return applyTransform(*static_cast(data.data()), transform); } else if (identifier.startsWith("vtkDataMesh")) { return applyTransform(*vtkMetaDataSet::SafeDownCast(static_cast(data.data())), transform); } } void getTransform(itk::Object& object, QMatrix4x4& transform) { vtkSmartPointer vtkMatrix = vtkSmartPointer::New(); getTransform(object, *vtkMatrix); convert(*vtkMatrix, transform); } template void getTransform(itk::ImageBase<3>& object, QMatrix4x4& transform) { vtkSmartPointer vtkMatrix = vtkSmartPointer::New(); getTransform(object, vtkMatrix); convert(*vtkMatrix, transform); } void setTransform(itk::Object& object, const QMatrix4x4& transform) { setTransform(dynamic_cast&>(object), *toVTKMatrix(transform)); } template void setTransform(itk::ImageBase<3>& imageBase, const QMatrix4x4& transform) { setTransform(imageBase, *toVTKMatrix(transform)); } void applyTransform(medAbstractData& data, const QMatrix4x4& transform) { applyTransform(data, *toVTKMatrix(transform)); } void applyTransform(itk::Object& object, const QMatrix4x4& transform) { applyTransform(object, *toVTKMatrix(transform)); } template void applyTransform(itk::ImageBase<3>& imageBase, const QMatrix4x4 transform) { applyTransform(imageBase, *toVTKMatrix(transform)); } void applyTransform(vtkMetaDataSet& mesh, const QMatrix4x4& transform) { applyTransform(mesh, *toVTKMatrix(transform)); } }