7 #include "imstkVTKMeshIO.h" 8 #include "imstkGeometryUtilities.h" 9 #include "imstkHexahedralMesh.h" 10 #include "imstkImageData.h" 11 #include "imstkLineMesh.h" 12 #include "imstkLogger.h" 13 #include "imstkSurfaceMesh.h" 14 #include "imstkTetrahedralMesh.h" 16 #include <vtkBMPReader.h> 17 #include <vtkBMPWriter.h> 18 #include <vtkDICOMImageReader.h> 19 #include <vtkGenericDataObjectReader.h> 20 #include <vtkGenericDataObjectWriter.h> 21 #include <vtkImageData.h> 22 #include <vtkJPEGReader.h> 23 #include <vtkJPEGWriter.h> 24 #include <vtkMetaImageReader.h> 25 #include <vtkMetaImageWriter.h> 26 #include <vtkNIFTIImageReader.h> 27 #include <vtkNIFTIImageWriter.h> 28 #include <vtkNrrdReader.h> 29 #include <vtkOBJReader.h> 30 #include <vtkOBJWriter.h> 31 #include <vtkPLYReader.h> 32 #include <vtkPLYWriter.h> 33 #include <vtkPNGReader.h> 34 #include <vtkPNGWriter.h> 35 #include <vtkPolyDataWriter.h> 36 #include <vtkSTLReader.h> 37 #include <vtkSTLWriter.h> 38 #include <vtkTriangleFilter.h> 39 #include <vtkUnstructuredGrid.h> 40 #include <vtkXMLPolyDataReader.h> 41 #include <vtkXMLPolyDataWriter.h> 42 #include <vtkXMLUnstructuredGridReader.h> 43 #include <vtkXMLUnstructuredGridWriter.h> 47 std::shared_ptr<PointSet>
48 VTKMeshIO::read(
const std::string& filePath,
MeshFileType meshType)
52 case MeshFileType::VTK:
54 return VTKMeshIO::readVtkGenericFormatData<vtkGenericDataObjectReader>(filePath);
56 case MeshFileType::VTU:
58 return VTKMeshIO::readVtkUnstructuredGrid<vtkXMLUnstructuredGridReader>(filePath);
60 case MeshFileType::VTP:
62 return VTKMeshIO::readVtkPolyData<vtkXMLPolyDataReader>(filePath);
64 case MeshFileType::STL:
66 return VTKMeshIO::readVtkPolyData<vtkSTLReader>(filePath);
68 case MeshFileType::PLY:
70 return VTKMeshIO::readVtkPolyData<vtkPLYReader>(filePath);
72 case MeshFileType::OBJ:
74 return VTKMeshIO::readVtkPolyData<vtkOBJReader>(filePath);
76 case MeshFileType::DCM:
80 case MeshFileType::NRRD:
82 return VTKMeshIO::readVtkImageData<vtkNrrdReader>(filePath);
84 case MeshFileType::NII:
88 case MeshFileType::MHD:
90 return VTKMeshIO::readVtkImageData<vtkMetaImageReader>(filePath);
92 case MeshFileType::PNG:
94 return VTKMeshIO::readVtkImageData<vtkPNGReader>(filePath);
96 case MeshFileType::JPG:
98 return VTKMeshIO::readVtkImageData<vtkJPEGReader>(filePath);
100 case MeshFileType::BMP:
102 return VTKMeshIO::readVtkImageData<vtkBMPReader>(filePath);
106 LOG(FATAL) <<
"Error: file type not supported for input " << filePath;
115 if (
auto imgMesh = std::dynamic_pointer_cast<ImageData>(imstkMesh))
119 case MeshFileType::NII:
121 case MeshFileType::MHD:
123 case MeshFileType::PNG:
124 return VTKMeshIO::writeVtkImageData<vtkPNGWriter>(imgMesh, filePath);
125 case MeshFileType::JPG:
126 return VTKMeshIO::writeVtkImageData<vtkJPEGWriter>(imgMesh, filePath);
127 case MeshFileType::BMP:
128 return VTKMeshIO::writeVtkImageData<vtkBMPWriter>(imgMesh, filePath);
130 LOG(WARNING) <<
"Error: file type not supported for ImageData. Target path supplied:" << filePath;
134 else if (
auto tetMesh = std::dynamic_pointer_cast<TetrahedralMesh>(imstkMesh))
138 case MeshFileType::VTU:
139 return VTKMeshIO::writeVtkUnstructuredGrid<vtkXMLUnstructuredGridWriter>(tetMesh, filePath);
140 case MeshFileType::VTK:
141 return VTKMeshIO::writeVtkUnstructuredGrid<vtkGenericDataObjectWriter>(tetMesh, filePath);
143 LOG(WARNING) <<
"Error: file type not supported for TetrahedralMesh. Target path supplied:" << filePath;
147 else if (
auto hexMesh = std::dynamic_pointer_cast<HexahedralMesh>(imstkMesh))
151 case MeshFileType::VTU:
152 return VTKMeshIO::writeVtkUnstructuredGrid<vtkXMLUnstructuredGridWriter>(hexMesh, filePath);
153 case MeshFileType::VTK:
154 return VTKMeshIO::writeVtkUnstructuredGrid<vtkGenericDataObjectWriter>(hexMesh, filePath);
156 LOG(WARNING) <<
"Error: file type not supported for HexahedralMesh. Target path supplied:" << filePath;
160 else if (
auto sMesh = std::dynamic_pointer_cast<SurfaceMesh>(imstkMesh))
164 case MeshFileType::VTP:
165 return VTKMeshIO::writeVtkPolyData<vtkXMLPolyDataWriter>(sMesh, filePath);
166 case MeshFileType::STL:
167 return VTKMeshIO::writeVtkPolyData<vtkSTLWriter>(sMesh, filePath);
168 case MeshFileType::PLY:
169 return VTKMeshIO::writeVtkPolyData<vtkPLYWriter>(sMesh, filePath);
170 case MeshFileType::VTK:
171 return VTKMeshIO::writeVtkPolyData<vtkPolyDataWriter>(sMesh, filePath);
172 case MeshFileType::OBJ:
173 return VTKMeshIO::writeVtkPolyData<vtkOBJWriter>(sMesh, filePath);
175 LOG(WARNING) <<
"Error: file type not supported for SurfaceMesh. Target path supplied:" << filePath;
179 else if (
auto lMesh = std::dynamic_pointer_cast<LineMesh>(imstkMesh))
183 case MeshFileType::VTK:
184 return VTKMeshIO::writeVtkPolyData<vtkPolyDataWriter>(lMesh, filePath);
185 case MeshFileType::VTP:
186 return VTKMeshIO::writeVtkPolyData<vtkXMLPolyDataWriter>(lMesh, filePath);
188 LOG(WARNING) <<
"Error: file type not supported for LineMesh. Target path supplied:" << filePath;
192 else if (
auto ptMesh = std::dynamic_pointer_cast<PointSet>(imstkMesh))
196 case MeshFileType::VTK:
197 return VTKMeshIO::writeVtkPointSet<vtkGenericDataObjectWriter>(ptMesh, filePath);
199 LOG(WARNING) <<
"Error: file type not supported for PointSet. Target path supplied:" << filePath;
205 LOG(WARNING) <<
"Error: the provided mesh is not a surface or volumetric mesh. Target path supplied:" << filePath;
210 template<
typename ReaderType>
211 std::shared_ptr<PointSet>
212 VTKMeshIO::readVtkGenericFormatData(
const std::string& filePath)
214 auto reader = vtkSmartPointer<ReaderType>::New();
215 reader->SetFileName(filePath.c_str());
218 if (vtkSmartPointer<vtkPolyData> vtkMesh = reader->GetPolyDataOutput())
222 if (surfMesh->getNumCells() > 0)
227 if (lineMesh->getNumCells() > 0)
234 if (vtkUnstructuredGrid* vtkMesh = reader->GetUnstructuredGridOutput())
239 LOG(FATAL) <<
"Error: could not read with VTK reader for input " << filePath;
243 template<
typename ReaderType>
244 std::shared_ptr<SurfaceMesh>
245 VTKMeshIO::readVtkPolyData(
const std::string& filePath)
247 auto reader = vtkSmartPointer<ReaderType>::New();
248 reader->SetFileName(filePath.c_str());
251 auto triFilter = vtkSmartPointer<vtkTriangleFilter>::New();
252 triFilter->SetInputData(reader->GetOutput());
255 vtkSmartPointer<vtkPolyData> vtkMesh = triFilter->GetOutput();
259 template<
typename WriterType>
263 vtkSmartPointer<vtkImageData> vtkMesh = GeometryUtils::copyToVtkImageData(imstkMesh);
269 auto writer = vtkSmartPointer<WriterType>::New();
270 if (vtkMesh->GetDimensions()[2] == 1)
272 writer->SetFileDimensionality(2);
276 writer->SetFileDimensionality(3);
278 writer->SetInputData(vtkMesh);
279 writer->SetFileName(filePath.c_str());
285 template<
typename WriterType>
295 auto writer = vtkSmartPointer<WriterType>::New();
296 writer->SetInputData(vtkMesh);
297 writer->SetFileName(filePath.c_str());
303 template<
typename WriterType>
313 auto writer = vtkSmartPointer<WriterType>::New();
314 writer->SetInputData(vtkMesh);
315 writer->SetFileName(filePath.c_str());
321 template<
typename WriterType>
331 auto writer = vtkSmartPointer<WriterType>::New();
332 writer->SetInputData(vtkMesh);
333 writer->SetFileName(filePath.c_str());
339 template<
typename ReaderType>
340 std::shared_ptr<AbstractCellMesh>
343 auto reader = vtkSmartPointer<ReaderType>::New();
344 reader->SetFileName(filePath.c_str());
347 vtkSmartPointer<vtkUnstructuredGrid> vtkMesh = reader->GetOutput();
351 std::shared_ptr<ImageData>
356 CHECK(
MeshIO::fileExists(filePath, isDirectory)) <<
"Error: file " << filePath <<
" not found!";
360 return VTKMeshIO::readVtkImageData<vtkDICOMImageReader>(filePath);
363 auto reader = vtkSmartPointer<vtkDICOMImageReader>::New();
364 reader->SetDirectoryName(filePath.c_str());
367 std::shared_ptr<ImageData> imageData(
368 std::move(GeometryUtils::copyToImageData(reader->GetOutput())));
372 template<
typename WriterType>
380 LOG(WARNING) <<
"Error: conversion unsuccessful. Target path supplied:" << filePath;
384 auto writer = vtkSmartPointer<WriterType>::New();
385 writer->SetInputData(vtkMesh);
386 writer->SetFileName(filePath.c_str());
392 template<
typename WriterType>
400 LOG(WARNING) <<
"Error: conversion unsuccessful. Target path supplied:" << filePath;
404 auto writer = vtkSmartPointer<WriterType>::New();
405 writer->SetInputData(vtkMesh);
406 writer->SetFileName(filePath.c_str());
412 template<
typename ReaderType>
413 std::shared_ptr<ImageData>
416 auto reader = vtkSmartPointer<ReaderType>::New();
417 reader->SetFileName(filePath.c_str());
420 std::shared_ptr<ImageData> imageData(std::move(GeometryUtils::copyToImageData(reader->GetOutput())));
424 std::shared_ptr<ImageData>
427 auto reader = vtkSmartPointer<vtkNIFTIImageReader>::New();
428 reader->SetFileName(filePath.c_str());
429 reader->SetFileDimensionality(3);
432 std::shared_ptr<ImageData> imageData(std::move(GeometryUtils::copyToImageData(reader->GetOutput())));
440 auto vtkMesh = GeometryUtils::copyToVtkImageData(imageData);
443 LOG(WARNING) <<
"Error: conversion unsuccessful. Target path supplied:" << filePath;
447 auto writer = vtkSmartPointer<vtkNIFTIImageWriter>::New();
448 writer->SetFileName(filePath.c_str());
449 if (vtkMesh->GetDimensions()[2] == 1)
451 writer->SetFileDimensionality(2);
455 writer->SetFileDimensionality(3);
457 writer->SetInputData(vtkMesh);
465 vtkSmartPointer<vtkImageData> vtkImage = GeometryUtils::copyToVtkImageData(imageData);
468 LOG(WARNING) <<
"Error: conversion unsuccessful. Target path supplied:" << filePath;
472 auto writer = vtkSmartPointer<vtkMetaImageWriter>::New();
473 if (vtkImage->GetDimensions()[2] == 1)
475 writer->SetFileDimensionality(2);
479 writer->SetFileDimensionality(3);
481 writer->SetInputData(vtkImage);
482 writer->SetFileName(filePath.c_str());
483 writer->SetRAWFileName((filePath +
".raw").c_str());
vtkSmartPointer< vtkUnstructuredGrid > copyToVtkUnstructuredGrid(std::shared_ptr< TetrahedralMesh > imstkMesh)
Converts imstk tetrahedral mesh into a vtk unstructured grid.
static std::shared_ptr< AbstractCellMesh > readVtkUnstructuredGrid(const std::string &filePath)
Reads vtk unstructured grid. Drops cells that aren't of the last cell type.
static std::shared_ptr< ImageData > readVtkImageDataNIFTI(const std::string &filePath)
Reads nifti/nii format image data.
MeshFileType
Enumeration the mesh file type.
std::shared_ptr< LineMesh > copyToLineMesh(vtkSmartPointer< vtkPolyData > vtkMesh)
Converts vtk polydata into a imstk surface mesh.
static bool writeVtkPolyData(const std::shared_ptr< SurfaceMesh > imstkMesh, const std::string &filePath)
Writes the given surface mesh to given file path using the provided writer type.
vtkSmartPointer< vtkPolyData > copyToVtkPolyData(std::shared_ptr< LineMesh > imstkMesh)
Converts imstk line mesh into a vtk polydata.
static bool writeVtkImageData(const std::shared_ptr< ImageData > imstkMesh, const std::string &filePath)
Writes the given image data to given file path using the provided writer type.
static bool writeVtkImageDataNIFTI(std::shared_ptr< ImageData > imageData, const std::string &filePath)
Write nifti/nii format image data.
std::shared_ptr< AbstractCellMesh > copyToCellMesh(vtkSmartPointer< vtkUnstructuredGrid > vtkMesh)
Get imstk cell mesh given vtkUnstructuredGrid as input iMSTK only supports homogenous cells...
static bool write(const std::shared_ptr< PointSet > imstkMesh, const std::string &filePath, const MeshFileType meshType)
Writes the given mesh to the specified file path.
static std::shared_ptr< ImageData > readVtkImageDataDICOM(const std::string &filePath)
TODO.
vtkSmartPointer< vtkPointSet > copyToVtkPointSet(std::shared_ptr< PointSet > imstkMesh)
Converts imstk point set into a vtk polydata.
static bool writeVtkUnstructuredGrid(const std::shared_ptr< TetrahedralMesh > tetMesh, const std::string &filePath)
Writes the given volumetric mesh to given file path.
std::shared_ptr< SurfaceMesh > copyToSurfaceMesh(vtkSmartPointer< vtkPolyData > vtkMesh)
Converts vtk polydata into a imstk surface mesh.
static bool writeMetaImageData(std::shared_ptr< ImageData > imageData, const std::string &filePath)
Write meta/mhd format image data.
static bool writeVtkPointSet(const std::shared_ptr< PointSet > imstkMesh, const std::string &filePath)
Writes the given point set to given file path using the provided writer type.
std::shared_ptr< PointSet > copyToPointSet(vtkSmartPointer< vtkPointSet > vtkMesh)
Converts vtk polydata into a imstk point set.
static bool fileExists(const std::string &file, bool &isDirectory)
Returns true if the file exists, else false. Also sets isDirectory to true if the path is a directory...
static std::shared_ptr< ImageData > readVtkImageData(const std::string &filePath)
Reads vtk image data.