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