]> Creatis software - cpPlugins.git/blob - lib/cpPlugins/Plugins/BasicFilters/TriangleMeshToBinaryImageFilter.cxx
...
[cpPlugins.git] / lib / cpPlugins / Plugins / BasicFilters / TriangleMeshToBinaryImageFilter.cxx
1 #include "TriangleMeshToBinaryImageFilter.h"
2 #include <cpPlugins/Interface/Image.h>
3 #include <cpPlugins/Interface/Mesh.h>
4
5 #include <itkMesh.h>
6 #include <itkTriangleMeshToBinaryImageFilter.h>
7
8 // -------------------------------------------------------------------------
9 cpPlugins::BasicFilters::TriangleMeshToBinaryImageFilter::
10 TriangleMeshToBinaryImageFilter( )
11   : Superclass( )
12 {
13   this->_AddInput( "Input" );
14   this->_AddOutput< cpPlugins::Interface::Image >( "Output" );
15
16   this->m_Parameters->ConfigureAsUint( "InsideValue" );
17   this->m_Parameters->ConfigureAsUint( "OutsideValue" );
18   this->m_Parameters->ConfigureAsUint( "MinimumSize" );
19
20   this->m_Parameters->SetUint( "InsideValue", 1 );
21   this->m_Parameters->SetUint( "OutsideValue", 0 );
22   this->m_Parameters->SetUint( "MinimumSize", 100 );
23 }
24
25 // -------------------------------------------------------------------------
26 cpPlugins::BasicFilters::TriangleMeshToBinaryImageFilter::
27 ~TriangleMeshToBinaryImageFilter( )
28 {
29 }
30
31 // -------------------------------------------------------------------------
32 std::string cpPlugins::BasicFilters::TriangleMeshToBinaryImageFilter::
33 _GenerateData( )
34 {
35   typedef itk::Mesh< float, 3 > _3F;
36   typedef itk::Mesh< double, 3 > _3D;
37
38   auto input = this->GetInputData< cpPlugins::Interface::Mesh >( "Input" );
39   if( input == NULL )
40     return( "TriangleMeshToBinaryImageFilter: No valid input mesh." );
41
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 ) );
46   else
47     return( "TriangleMeshToBinaryImageFilter: No valid input itk mesh." );
48 }
49
50 // -------------------------------------------------------------------------
51 template< class M >
52 std::string cpPlugins::BasicFilters::TriangleMeshToBinaryImageFilter::
53 _GD0( M* mesh )
54 {
55   return(
56     this->_RealGD< M, itk::Image< unsigned char, M::PointDimension > >(
57       mesh
58       )
59     );
60 }
61
62 // -------------------------------------------------------------------------
63 template< class M, class I >
64 inline std::string cpPlugins::BasicFilters::TriangleMeshToBinaryImageFilter::
65 _RealGD( M* mesh )
66 {
67   static const unsigned int PAD = 10;
68
69   typedef itk::TriangleMeshToBinaryImageFilter< M, I > _F;
70
71   _F* filter = this->_CreateITK< _F >( );
72
73   auto bb = mesh->GetBoundingBox( );
74   auto minBB = bb->GetMinimum( );
75   auto maxBB = bb->GetMaximum( );
76
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;
82
83   // Compute spacing
84   double mSpac = lm / double( this->m_Parameters->GetUint( "MinimumSize" ) );
85   typename I::SpacingType spac;
86   spac.Fill( mSpac );
87   filter->SetSpacing( spac );
88
89   // Compute size
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 ) );
94
95   // ... add some padding pixels
96   size[ 0 ] += PAD;
97   size[ 1 ] += PAD;
98   size[ 2 ] += PAD;
99   filter->SetSize( size );
100
101   // Set origin
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 );
107
108   // Remaining values
109   typename I::DirectionType direction;
110   direction.SetIdentity( );
111   filter->SetDirection( direction );
112
113   typename I::IndexType index;
114   index.Fill( 0 );
115   filter->SetIndex( index );
116
117   // Execute
118   filter->SetInput( mesh );
119   filter->Update( );
120
121   // Connect output
122   auto out = this->GetOutputData< cpPlugins::Interface::Image >( "Output" );
123   if( out != NULL )
124   {
125     out->SetITK< I >( filter->GetOutput( ) );
126     return( "" );
127   }
128   else
129     return( "TriangleMeshToBinaryImageFilter: output not correctly created." );
130 }
131
132 // eof - $RCSfile$