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" );
40 return( "TriangleMeshToBinaryImageFilter: No valid input mesh." );
42 auto in_3f = input->GetITK< _3F >( );
43 auto in_3d = input->GetITK< _3D >( );
44 if ( in_3f != NULL ) return( this->_GD0( in_3f ) );
45 else if( in_3d != NULL ) return( this->_GD0( in_3d ) );
47 return( "TriangleMeshToBinaryImageFilter: No valid input itk mesh." );
50 // -------------------------------------------------------------------------
52 std::string cpPlugins::BasicFilters::TriangleMeshToBinaryImageFilter::
56 this->_RealGD< M, itk::Image< unsigned char, M::PointDimension > >(
62 // -------------------------------------------------------------------------
63 template< class M, class I >
64 inline std::string cpPlugins::BasicFilters::TriangleMeshToBinaryImageFilter::
67 static const unsigned int PAD = 10;
69 typedef itk::TriangleMeshToBinaryImageFilter< M, I > _F;
71 _F* filter = this->_CreateITK< _F >( );
73 auto bb = mesh->GetBoundingBox( );
74 auto minBB = bb->GetMinimum( );
75 auto maxBB = bb->GetMaximum( );
77 double lx = double( maxBB[ 0 ] - minBB[ 0 ] );
78 double ly = double( maxBB[ 1 ] - minBB[ 1 ] );
79 double lz = double( maxBB[ 2 ] - minBB[ 2 ] );
80 double lm = ( lx < ly )? lx: ly;
81 lm = ( lm < lz )? lm: lz;
84 double mSpac = lm / double( this->m_Parameters->GetUint( "MinimumSize" ) );
85 typename I::SpacingType spac;
87 filter->SetSpacing( spac );
90 typename I::SizeType size;
91 size[ 0 ] = ( unsigned long )( std::ceil( lx / mSpac ) );
92 size[ 1 ] = ( unsigned long )( std::ceil( ly / mSpac ) );
93 size[ 2 ] = ( unsigned long )( std::ceil( lz / mSpac ) );
95 // ... add some padding pixels
99 filter->SetSize( size );
102 typename I::PointType origin = minBB;
103 origin[ 0 ] -= double( PAD >> 1 ) * spac[ 0 ];
104 origin[ 1 ] -= double( PAD >> 1 ) * spac[ 1 ];
105 origin[ 2 ] -= double( PAD >> 1 ) * spac[ 2 ];
106 filter->SetOrigin( origin );
109 typename I::DirectionType direction;
110 direction.SetIdentity( );
111 filter->SetDirection( direction );
113 typename I::IndexType index;
115 filter->SetIndex( index );
118 filter->SetInput( mesh );
122 auto out = this->GetOutputData< cpPlugins::Interface::Image >( "Output" );
125 out->SetITK< I >( filter->GetOutput( ) );
129 return( "TriangleMeshToBinaryImageFilter: output not correctly created." );