]> Creatis software - cpPlugins.git/blob - lib/cpPlugins/Plugins/BasicFilters/MarchingCubes.cxx
Widget integration (step 5/6): generic widget controller finished and tested on linux...
[cpPlugins.git] / lib / cpPlugins / Plugins / BasicFilters / MarchingCubes.cxx
1 #include "MarchingCubes.h"
2 #include <cpPlugins/Interface/Image.h>
3 #include <cpPlugins/Interface/Mesh.h>
4
5 #include <vtkImageData.h>
6 #include <vtkMarchingCubes.h>
7 #include <vtkMarchingSquares.h>
8
9 // -------------------------------------------------------------------------
10 cpPlugins::BasicFilters::MarchingCubes::
11 MarchingCubes( )
12   : Superclass( )
13 {
14   this->SetNumberOfInputs( 1 );
15   this->SetNumberOfOutputs( 1 );
16   this->_MakeOutput< cpPlugins::Interface::Mesh >( 0 );
17
18   using namespace cpPlugins::Interface;
19   this->m_DefaultParameters.Configure( Parameters::RealList, "Thresholds" );
20   this->m_Parameters = this->m_DefaultParameters;
21 }
22
23 // -------------------------------------------------------------------------
24 cpPlugins::BasicFilters::MarchingCubes::
25 ~MarchingCubes( )
26 {
27 }
28
29 // -------------------------------------------------------------------------
30 std::string cpPlugins::BasicFilters::MarchingCubes::
31 _GenerateData( )
32 {
33   // Get input
34   cpPlugins::Interface::Image* image =
35     this->GetInput< cpPlugins::Interface::Image >( 0 );
36   if( image == NULL )
37     return( "MarchingCubes: Input data is not a valid image." );
38   vtkImageData* vtk_image = image->GetVTK< vtkImageData >( );
39   if( vtk_image == NULL )
40     return( "MarchingCubes: Input does not have a valid VTK conversion." );
41
42   std::vector< double > values;
43   this->m_Parameters.GetValueAsRealList( values, "Thresholds" );
44   vtkPolyData* pd = NULL;
45   if( vtk_image->GetDataDimension( ) == 2 )
46   {
47     vtkMarchingSquares* ms = this->_CreateVTK< vtkMarchingSquares >( );
48     ms->SetInputData( vtk_image );
49     for( unsigned int i = 0; i < values.size( ); ++i )
50       ms->SetValue( i, values[ i ] );
51     ms->Update( );
52     pd = ms->GetOutput( );
53   }
54   else if( vtk_image->GetDataDimension( ) == 3 )
55   {
56     vtkMarchingCubes* mc = this->_CreateVTK< vtkMarchingCubes >( );
57     mc->ComputeNormalsOff( );
58     mc->SetInputData( vtk_image );
59     for( unsigned int i = 0; i < values.size( ); ++i )
60       mc->SetValue( i, values[ i ] );
61     mc->Update( );
62     pd = mc->GetOutput( );
63   }
64   else
65     return( "MarchingCubes: Input data does not have a valid dimension." );
66
67   // Execute filter
68   cpPlugins::Interface::Mesh* out =
69     this->GetOutput< cpPlugins::Interface::Mesh >( 0 );
70   out->SetVTK( pd );
71   return( "" );
72 }
73
74 // eof - $RCSfile$