<div dir="ltr"><div><div>Hi everyone!</div><div>I'm having some problems working with meshes in ITK.</div><div><br></div><div>What I'm trying to do (by now) is just a brief test in which I read a .vtk mesh file from this database: <a href="http://www.spl.harvard.edu/publications/item/view/2037">http://www.spl.harvard.edu/publications/item/view/2037</a>, write it again to the disk and see if everything is ok. Very simple.</div>
<div><br></div><div>The problem is: if I try to do that using the itk::MeshReader and itk::MeshWriter classes, the program doesn't work as expected since the written mesh apparently loses all information about the original mesh's cells (I'm using Paraview and Slicer for visualization). The same thing happens if I use the itk::VTKPolyDataReader and itk::VTKPolyDataWriter classes for the mesh I/O. However, if I do the same test reading the .vtk mesh file provided by this example: <a href="http://itk.org/ITKExamples/src/IO/Mesh/ReadMesh/Documentation.html">http://itk.org/ITKExamples/src/IO/Mesh/ReadMesh/Documentation.html</a>, everything works fine in both cases. So I guess it could be a file format issue.</div>
<div><br></div><div>I also tried to use VTK instead of ITK for the mesh I/O (the vtkPolyDataReader and vtkPolyDataWriter classes). And with that, the program works fine even with the meshes from the brain database. But as I intend to work with deformable models algorithms in ITK, that approach requires me to convert the read vtkPolyData into a ITK simplex mesh, but such conversion makes my program crash (either an exception is thrown because of an invalid point or the program enters in an infinite loop). I'm using the vtkPolyDataToitkMesh class (from InsightApplications) to convert the VTK polydata to a ITK triangle mesh, and the itk::TriangleMeshToSimplexMeshFilter class to convert the latter to a simplex mesh.</div>
<div><br></div><div>Last, but not least: if I just do the following conversions: VTK polydata -> ITK triangle mesh -> VTK polydata and try to write the resulting polydata (using vtkPolyDataWriter), I get a segmentation fault. No clue about what causes it.</div>
<div><br></div><div>The more recent and complete version of my code (VTK + ITK) is below. If anyone could help me with any of these issues, I would be very grateful.</div><div><br></div><div>=============================================================================================</div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  // Set the ITK type definitions.</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  const int Dimension = 3;</font></div>
<div><font face="courier new, monospace">  typedef double PixelType;</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  typedef vtkPolyDataToitkMesh::TriangleMeshType                                         TriangleMeshType;</font></div>
<div><font face="courier new, monospace">  typedef itk::DefaultDynamicMeshTraits<PixelType, Dimension, Dimension, double, double> SimplexMeshTraits;</font></div><div><font face="courier new, monospace">  typedef itk::SimplexMesh<PixelType, Dimension, SimplexMeshTraits>                      SimplexMeshType;</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  typedef itk::TriangleMeshToSimplexMeshFilter<TriangleMeshType, SimplexMeshType> TriangleToSimplexFilterType;</font></div>
<div><font face="courier new, monospace">  typedef itk::SimplexMeshToTriangleMeshFilter<SimplexMeshType, TriangleMeshType> SimplexToTriangleFilterType;</font></div><div><font face="courier new, monospace"><br></font></div>
<div><font face="courier new, monospace">  typedef itk::SimplexMeshVolumeCalculator<SimplexMeshType> VolumeCalculatorType;</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  typedef itk::VTKPolyDataWriter<TriangleMeshType> WriterType;</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  // Read the input VTK polydata.</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  vtkSmartPointer<vtkPolyDataReader> reader = vtkSmartPointer<vtkPolyDataReader>::New();</font></div>
<div><font face="courier new, monospace">  reader->SetFileName(inputFileName.c_str());</font></div><div><font face="courier new, monospace">  reader->Update();</font></div><div><font face="courier new, monospace"><br>
</font></div><div><font face="courier new, monospace">  std::cout << "Polydata read ok\n";</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  // Convert the VTK polydata to a ITK mesh.</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  vtkPolyDataToitkMesh polyDataToMesh;</font></div><div><font face="courier new, monospace">  polyDataToMesh.SetInput(reader->GetOutput());</font></div>
<div><font face="courier new, monospace">  polyDataToMesh.ConvertvtkToitk();</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  std::cout << "Conversion to triangle mesh ok\n";</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  // Convert the triangle mesh to a simplex mesh.</font></div><div><font face="courier new, monospace"><br></font></div><div>
<font face="courier new, monospace">  TriangleToSimplexFilterType::Pointer triangleToSimplexFilter = TriangleToSimplexFilterType::New();</font></div><div><font face="courier new, monospace">  triangleToSimplexFilter->SetInput(polyDataToMesh.GetOutput());</font></div>
<div><font face="courier new, monospace">  triangleToSimplexFilter->Update();</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  std::cout << "Conversion to simplex mesh ok\n";</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  // Compute the simplex mesh volume.</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  VolumeCalculatorType::Pointer volumeCalculator = VolumeCalculatorType::New();</font></div>
<div><font face="courier new, monospace">  volumeCalculator->SetSimplexMesh(triangleToSimplexFilter->GetOutput());</font></div><div><font face="courier new, monospace">  volumeCalculator->Compute();</font></div><div>
<font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  std::cout << "Volume calculation ok (value = " << volumeCalculator->GetVolume() << ")\n";</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  // Convert the simplex mesh to triangle mesh.</font></div><div><font face="courier new, monospace"><br></font></div><div>
<font face="courier new, monospace">  SimplexToTriangleFilterType::Pointer simplexToTriangleFilter = SimplexToTriangleFilterType::New();</font></div><div><font face="courier new, monospace">  simplexToTriangleFilter->SetInput(triangleToSimplexFilter->GetOutput());</font></div>
<div><font face="courier new, monospace">  simplexToTriangleFilter->Update();</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  std::cout << "Conversion to triangle mesh ok\n";</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  // Convert the ITK mesh to VTK polydata.</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  itkMeshTovtkPolyData meshToPolyData;</font></div>
<div><font face="courier new, monospace">  meshToPolyData.SetInput(simplexToTriangleFilter->GetOutput());</font></div><div><font face="courier new, monospace">  meshToPolyData.ConvertitkTovtk();</font></div><div><font face="courier new, monospace"><br>
</font></div><div><font face="courier new, monospace">  std::cout << "Conversion to polydata ok\n";</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  // Write the output polydata.</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">  vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();</font></div><div><font face="courier new, monospace">  writer->SetFileName(outputFileName.c_str());</font></div>
<div><font face="courier new, monospace">  writer->SetInputData(meshToPolyData.GetOutput());</font></div><div><font face="courier new, monospace">  writer->Update();</font></div><div><font face="courier new, monospace">  </font></div>
<div><font face="courier new, monospace">  std::cout << "Polydata write ok\n";</font></div><div><br></div><div>=============================================================================================</div>
<div><br></div><div>Thanks in advance.</div><div>[]s</div></div><div><br></div>-- <br><div dir="ltr">Carlos Henrique Villa Pinto<div>Graduate Student in Computer Science</div><div>Federal University of São Carlos - Brazil</div>
<div>XCS</div></div>
</div>