1 #include "TriangleMeshToBinaryImageFilter.h"
2 #include <cpPlugins/Interface/Image.h>
3 #include <cpPlugins/Interface/Mesh.h>
6 #include <itkTriangleMeshToBinaryImageFilter.h>
8 // -------------------------------------------------------------------------
9 cpPlugins::BasicFilters::TriangleMeshToBinaryImageFilter::
10 TriangleMeshToBinaryImageFilter( )
13 this->_AddInput( "Input" );
14 this->_AddOutput< cpPlugins::Interface::Image >( "Output" );
16 this->m_Parameters->ConfigureAsUint( "InsideValue" );
17 this->m_Parameters->ConfigureAsUint( "OutsideValue" );
18 this->m_Parameters->ConfigureAsUint( "MinimumSize" );
20 this->m_Parameters->SetUint( "InsideValue", 1 );
21 this->m_Parameters->SetUint( "OutsideValue", 0 );
22 this->m_Parameters->SetUint( "MinimumSize", 100 );
25 // -------------------------------------------------------------------------
26 cpPlugins::BasicFilters::TriangleMeshToBinaryImageFilter::
27 ~TriangleMeshToBinaryImageFilter( )
31 // -------------------------------------------------------------------------
32 std::string cpPlugins::BasicFilters::TriangleMeshToBinaryImageFilter::
35 typedef itk::Mesh< float, 3 > _3F;
36 typedef itk::Mesh< double, 3 > _3D;
38 auto input = this->GetInputData< cpPlugins::Interface::Mesh >( "Input" );
39 auto in_3f = input->GetITK< _3F >( );
40 auto in_3d = input->GetITK< _3D >( );
41 if ( in_3f != NULL ) return( this->_GD0( in_3f ) );
42 else if( in_3d != NULL ) return( this->_GD0( in_3d ) );
44 return( "TriangleMeshToBinaryImageFilter: No valid input itk mesh." );
47 // -------------------------------------------------------------------------
49 std::string cpPlugins::BasicFilters::TriangleMeshToBinaryImageFilter::
53 this->_RealGD< M, itk::Image< unsigned char, M::PointDimension > >(
59 // -------------------------------------------------------------------------
60 template< class M, class I >
61 inline std::string cpPlugins::BasicFilters::TriangleMeshToBinaryImageFilter::
64 static const unsigned int PAD = 10;
66 typedef itk::TriangleMeshToBinaryImageFilter< M, I > _F;
68 _F* filter = this->_CreateITK< _F >( );
70 auto bb = mesh->GetBoundingBox( );
71 auto minBB = bb->GetMinimum( );
72 auto maxBB = bb->GetMaximum( );
74 double lx = double( maxBB[ 0 ] - minBB[ 0 ] );
75 double ly = double( maxBB[ 1 ] - minBB[ 1 ] );
76 double lz = double( maxBB[ 2 ] - minBB[ 2 ] );
77 double lm = ( lx < ly )? lx: ly;
78 lm = ( lm < lz )? lm: lz;
81 double mSpac = lm / double( this->m_Parameters->GetUint( "MinimumSize" ) );
82 typename I::SpacingType spac;
84 filter->SetSpacing( spac );
87 typename I::SizeType size;
88 size[ 0 ] = ( unsigned long )( std::ceil( lx / mSpac ) );
89 size[ 1 ] = ( unsigned long )( std::ceil( ly / mSpac ) );
90 size[ 2 ] = ( unsigned long )( std::ceil( lz / mSpac ) );
92 // ... add some padding pixels
96 filter->SetSize( size );
99 typename I::PointType origin = minBB;
100 origin[ 0 ] -= double( PAD >> 1 ) * spac[ 0 ];
101 origin[ 1 ] -= double( PAD >> 1 ) * spac[ 1 ];
102 origin[ 2 ] -= double( PAD >> 1 ) * spac[ 2 ];
103 filter->SetOrigin( origin );
106 typename I::DirectionType direction;
107 direction.SetIdentity( );
108 filter->SetDirection( direction );
110 typename I::IndexType index;
112 filter->SetIndex( index );
115 filter->SetInput( mesh );
119 auto out = this->GetOutputData< cpPlugins::Interface::Image >( "Output" );
120 out->SetITK( filter->GetOutput( ) );