+#include <VTKFilters/MarchingCubes.h>
+#include <cpInstances/Image.h>
+#include <cpInstances/Mesh.h>
+
+#include <vtkImageData.h>
+#include <vtkMarchingCubes.h>
+#include <vtkMarchingSquares.h>
+
+// -------------------------------------------------------------------------
+cpPluginsVTKFilters::MarchingCubes::
+MarchingCubes( )
+ : Superclass( )
+{
+ this->_ConfigureInput< cpInstances::Image >( "Input", true, false );
+ this->_ConfigureOutput< cpInstances::Mesh >( "Output" );
+ this->m_Parameters.ConfigureAsRealList( "Thresholds" );
+}
+
+// -------------------------------------------------------------------------
+cpPluginsVTKFilters::MarchingCubes::
+~MarchingCubes( )
+{
+}
+
+// -------------------------------------------------------------------------
+void cpPluginsVTKFilters::MarchingCubes::
+_GenerateData( )
+{
+ // Get input
+ auto image = this->GetInput( "Input" );
+ vtkImageData* vtk_image = image->GetVTK< vtkImageData >( );
+ if( vtk_image == NULL )
+ this->_Error( "Input does not have a valid VTK conversion." );
+
+ std::vector< double > values =
+ this->m_Parameters.GetRealList( "Thresholds" );
+ vtkPolyData* pd = NULL;
+ if( vtk_image->GetDataDimension( ) == 2 )
+ {
+ vtkMarchingSquares* ms = this->_CreateVTK< vtkMarchingSquares >( );
+ ms->SetInputData( vtk_image );
+ for( unsigned int i = 0; i < values.size( ); ++i )
+ ms->SetValue( i, values[ i ] );
+ ms->Update( );
+ pd = ms->GetOutput( );
+ }
+ else if( vtk_image->GetDataDimension( ) == 3 )
+ {
+ vtkMarchingCubes* mc = this->_CreateVTK< vtkMarchingCubes >( );
+ mc->ComputeNormalsOff( );
+ mc->SetInputData( vtk_image );
+ for( unsigned int i = 0; i < values.size( ); ++i )
+ mc->SetValue( i, values[ i ] );
+ mc->Update( );
+ pd = mc->GetOutput( );
+ }
+ else
+ this->_Error( "Input data does not have a valid dimension." );
+
+ // Connect output
+ this->GetOutput( "Output" )->SetVTK( pd );
+}
+
+// eof - $RCSfile$