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