]> Creatis software - cpPlugins.git/blob - plugins/ImageMeshFilters/MarchingCubes.cxx
8273be77cd7dad5568d6f696210dda8f8d3e2fd4
[cpPlugins.git] / plugins / ImageMeshFilters / MarchingCubes.cxx
1 #include <ImageMeshFilters/MarchingCubes.h>
2 #include <cpPlugins/DataObjects/Image.h>
3 #include <cpPlugins/DataObjects/Mesh.h>
4
5 #include <vtkImageData.h>
6 #include <vtkMarchingCubes.h>
7 #include <vtkMarchingSquares.h>
8
9 // -------------------------------------------------------------------------
10 cpPluginsImageMeshFilters::MarchingCubes::
11 MarchingCubes( )
12   : Superclass( )
13 {
14   this->_ConfigureInput< cpPlugins::DataObjects::Image >( "Input", true, false );
15   this->_ConfigureOutput< cpPlugins::DataObjects::Mesh >( "Output" );
16   this->m_Parameters.ConfigureAsRealList( "Thresholds" );
17 }
18
19 // -------------------------------------------------------------------------
20 cpPluginsImageMeshFilters::MarchingCubes::
21 ~MarchingCubes( )
22 {
23 }
24
25 // -------------------------------------------------------------------------
26 void cpPluginsImageMeshFilters::MarchingCubes::
27 _GenerateData( )
28 {
29   // Get input
30   auto image = this->GetInput( "Input" );
31   vtkImageData* vtk_image = image->GetVTK< vtkImageData >( );
32   if( vtk_image == NULL )
33     this->_Error( "Input does not have a valid VTK conversion." );
34
35   std::vector< double > values =
36     this->m_Parameters.GetRealList( "Thresholds" );
37   vtkPolyData* pd = NULL;
38   if( vtk_image->GetDataDimension( ) == 2 )
39   {
40     vtkMarchingSquares* ms = this->_CreateVTK< vtkMarchingSquares >( );
41     ms->SetInputData( vtk_image );
42     for( unsigned int i = 0; i < values.size( ); ++i )
43       ms->SetValue( i, values[ i ] );
44     ms->Update( );
45     pd = ms->GetOutput( );
46   }
47   else if( vtk_image->GetDataDimension( ) == 3 )
48   {
49     vtkMarchingCubes* mc = this->_CreateVTK< vtkMarchingCubes >( );
50     mc->ComputeNormalsOff( );
51     mc->SetInputData( vtk_image );
52     for( unsigned int i = 0; i < values.size( ); ++i )
53       mc->SetValue( i, values[ i ] );
54     mc->Update( );
55     pd = mc->GetOutput( );
56   }
57   else
58     this->_Error( "Input data does not have a valid dimension." );
59
60   // Connect output
61   this->GetOutput( "Output" )->SetVTK( pd );
62 }
63
64 // eof - $RCSfile$