1 #include <cpPluginsImageMeshFilters/TriangleMeshToBinaryImageFilter.h>
2 #include <cpPlugins/Image.h>
3 #include <cpPlugins/Mesh.h>
5 #include <cpPlugins_Instances/ImageMeshFilters.h>
7 // -------------------------------------------------------------------------
8 cpPluginsImageMeshFilters::TriangleMeshToBinaryImageFilter::
9 TriangleMeshToBinaryImageFilter( )
12 this->_AddInput( "Input" );
13 this->_AddOutput< cpPlugins::Image >( "Output" );
15 this->m_Parameters.ConfigureAsUint( "InsideValue" );
16 this->m_Parameters.ConfigureAsUint( "OutsideValue" );
17 this->m_Parameters.ConfigureAsUint( "MinimumSize" );
19 this->m_Parameters.SetUint( "InsideValue", 1 );
20 this->m_Parameters.SetUint( "OutsideValue", 0 );
21 this->m_Parameters.SetUint( "MinimumSize", 100 );
24 // -------------------------------------------------------------------------
25 cpPluginsImageMeshFilters::TriangleMeshToBinaryImageFilter::
26 ~TriangleMeshToBinaryImageFilter( )
30 // -------------------------------------------------------------------------
31 std::string cpPluginsImageMeshFilters::TriangleMeshToBinaryImageFilter::
34 typedef itk::Mesh< float, 3 > _3F;
35 typedef itk::Mesh< double, 3 > _3D;
37 auto _3f = this->GetInputData( "Input" )->GetITK< _3F >( );
38 auto _3d = this->GetInputData( "Input" )->GetITK< _3D >( );
39 if ( _3f != NULL ) return( this->_GD0( _3f ) );
40 else if( _3d != NULL ) return( this->_GD0( _3d ) );
42 return( "TriangleMeshToBinaryImageFilter: No valid input itk mesh." );
45 // -------------------------------------------------------------------------
46 template< class _TMesh >
47 std::string cpPluginsImageMeshFilters::TriangleMeshToBinaryImageFilter::
50 return( this->_GD1< _TMesh, unsigned char >( mesh ) );
53 // -------------------------------------------------------------------------
54 template< class _TMesh, class _TPixel >
55 std::string cpPluginsImageMeshFilters::TriangleMeshToBinaryImageFilter::
58 typedef itk::Image< _TPixel, _TMesh::PointDimension > _TImage;
59 typedef itk::TriangleMeshToBinaryImageFilter< _TMesh, _TImage > _TFilter;
61 static const unsigned int PAD = 10;
63 _TFilter* filter = this->_CreateITK< _TFilter >( );
65 auto bb = mesh->GetBoundingBox( );
66 auto minBB = bb->GetMinimum( );
67 auto maxBB = bb->GetMaximum( );
69 double lx = double( maxBB[ 0 ] - minBB[ 0 ] );
70 double ly = double( maxBB[ 1 ] - minBB[ 1 ] );
71 double lz = double( maxBB[ 2 ] - minBB[ 2 ] );
72 double lm = ( lx < ly )? lx: ly;
73 lm = ( lm < lz )? lm: lz;
76 double mSpac = lm / double( this->m_Parameters.GetUint( "MinimumSize" ) );
77 typename _TImage::SpacingType spac;
79 filter->SetSpacing( spac );
82 typename _TImage::SizeType size;
83 size[ 0 ] = ( unsigned long )( std::ceil( lx / mSpac ) );
84 size[ 1 ] = ( unsigned long )( std::ceil( ly / mSpac ) );
85 size[ 2 ] = ( unsigned long )( std::ceil( lz / mSpac ) );
87 // ... add some padding pixels
91 filter->SetSize( size );
94 typename _TImage::PointType origin = minBB;
95 origin[ 0 ] -= double( PAD >> 1 ) * spac[ 0 ];
96 origin[ 1 ] -= double( PAD >> 1 ) * spac[ 1 ];
97 origin[ 2 ] -= double( PAD >> 1 ) * spac[ 2 ];
98 filter->SetOrigin( origin );
101 typename _TImage::DirectionType direction;
102 direction.SetIdentity( );
103 filter->SetDirection( direction );
105 typename _TImage::IndexType index;
107 filter->SetIndex( index );
110 filter->SetInput( mesh );
111 filter->SetInsideValue( this->m_Parameters.GetUint( "InsideValue" ) );
112 filter->SetOutsideValue( this->m_Parameters.GetUint( "OutsideValue" ) );
116 auto out = this->GetOutputData( "Output" );
117 out->SetITK( filter->GetOutput( ) );