]> Creatis software - cpPlugins.git/blob - plugins/cpPluginsImageMeshFilters/TriangleMeshToBinaryImageFilter.cxx
7e223a9cd83f390837a5111d459167d90f7617ed
[cpPlugins.git] / plugins / cpPluginsImageMeshFilters / TriangleMeshToBinaryImageFilter.cxx
1 #include <cpPluginsImageMeshFilters/TriangleMeshToBinaryImageFilter.h>
2 #include <cpPlugins/Image.h>
3 #include <cpPlugins/Mesh.h>
4
5 #include <itkTriangleMeshToBinaryImageFilter.h>
6 #include <itkTriangleMeshToBinaryImageFilter.hxx>
7
8 // -------------------------------------------------------------------------
9 cpPluginsImageMeshFilters::TriangleMeshToBinaryImageFilter::
10 TriangleMeshToBinaryImageFilter( )
11   : Superclass( )
12 {
13   this->_AddInput( "Input" );
14   this->_AddOutput< cpPlugins::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 cpPluginsImageMeshFilters::TriangleMeshToBinaryImageFilter::
27 ~TriangleMeshToBinaryImageFilter( )
28 {
29 }
30
31 // -------------------------------------------------------------------------
32 std::string cpPluginsImageMeshFilters::TriangleMeshToBinaryImageFilter::
33 _GenerateData( )
34 {
35   typedef itk::Mesh< float, 3 >  _3F;
36   typedef itk::Mesh< double, 3 > _3D;
37
38   auto _3f = this->GetInputData( "Input" )->GetITK< _3F >( );
39   auto _3d = this->GetInputData( "Input" )->GetITK< _3D >( );
40   if     ( _3f != NULL ) return( this->_GD0( _3f ) );
41   else if( _3d != NULL ) return( this->_GD0( _3d ) );
42   else
43     return( "TriangleMeshToBinaryImageFilter: No valid input itk mesh." );
44 }
45
46 // -------------------------------------------------------------------------
47 template< class _TMesh >
48 std::string cpPluginsImageMeshFilters::TriangleMeshToBinaryImageFilter::
49 _GD0( _TMesh* mesh )
50 {
51   return( this->_GD1< _TMesh, unsigned char >( mesh ) );
52 }
53
54 // -------------------------------------------------------------------------
55 template< class _TMesh, class _TPixel >
56 std::string cpPluginsImageMeshFilters::TriangleMeshToBinaryImageFilter::
57 _GD1( _TMesh* mesh )
58 {
59   typedef itk::Image< _TPixel, _TMesh::PointDimension > _TImage;
60   typedef itk::TriangleMeshToBinaryImageFilter< _TMesh, _TImage > _TFilter;
61
62   static const unsigned int PAD = 10;
63
64   _TFilter* filter = this->_CreateITK< _TFilter >( );
65
66   auto bb = mesh->GetBoundingBox( );
67   auto minBB = bb->GetMinimum( );
68   auto maxBB = bb->GetMaximum( );
69
70   double lx = double( maxBB[ 0 ] - minBB[ 0 ] );
71   double ly = double( maxBB[ 1 ] - minBB[ 1 ] );
72   double lz = double( maxBB[ 2 ] - minBB[ 2 ] );
73   double lm = ( lx < ly )? lx: ly;
74   lm = ( lm < lz )? lm: lz;
75
76   // Compute spacing
77   double mSpac = lm / double( this->m_Parameters.GetUint( "MinimumSize" ) );
78   typename _TImage::SpacingType spac;
79   spac.Fill( mSpac );
80   filter->SetSpacing( spac );
81
82   // Compute size
83   typename _TImage::SizeType size;
84   size[ 0 ] = ( unsigned long )( std::ceil( lx / mSpac ) );
85   size[ 1 ] = ( unsigned long )( std::ceil( ly / mSpac ) );
86   size[ 2 ] = ( unsigned long )( std::ceil( lz / mSpac ) );
87
88   // ... add some padding pixels
89   size[ 0 ] += PAD;
90   size[ 1 ] += PAD;
91   size[ 2 ] += PAD;
92   filter->SetSize( size );
93
94   // Set origin
95   typename _TImage::PointType origin = minBB;
96   origin[ 0 ] -= double( PAD >> 1 ) * spac[ 0 ];
97   origin[ 1 ] -= double( PAD >> 1 ) * spac[ 1 ];
98   origin[ 2 ] -= double( PAD >> 1 ) * spac[ 2 ];
99   filter->SetOrigin( origin );
100
101   // Remaining values
102   typename _TImage::DirectionType direction;
103   direction.SetIdentity( );
104   filter->SetDirection( direction );
105
106   typename _TImage::IndexType index;
107   index.Fill( 0 );
108   filter->SetIndex( index );
109
110   // Execute
111   filter->SetInput( mesh );
112   filter->SetInsideValue( this->m_Parameters.GetUint( "InsideValue" ) );
113   filter->SetOutsideValue( this->m_Parameters.GetUint( "OutsideValue" ) );
114   filter->Update( );
115
116   // Connect output
117   auto out = this->GetOutputData( "Output" );
118   out->SetITK( filter->GetOutput( ) );
119   return( "" );
120
121 }
122
123 // eof - $RCSfile$