]> Creatis software - FrontAlgorithms.git/blob - plugins/fpa/BaseImageFilter.hxx
5ca267170ef2930c03793c592a9283bf2c909a1d
[FrontAlgorithms.git] / plugins / fpa / BaseImageFilter.hxx
1 #ifndef __FPAPLUGINS__BASEIMAGEFILTER__HXX__
2 #define __FPAPLUGINS__BASEIMAGEFILTER__HXX__
3
4 #include <cpPlugins/Image.h>
5 #include <fpa/VTK/Image2DObserver.h>
6 #include <fpa/VTK/Image3DObserver.h>
7 #include <vtkRenderWindowInteractor.h>
8
9 #include <fpa/VTK/Image2DObserver.hxx>
10 #include <fpa/VTK/Image3DObserver.hxx>
11 #include <itkSimpleDataObjectDecorator.h>
12
13 // -------------------------------------------------------------------------
14 template< class _TFilter >
15 _TFilter* fpaPlugins::BaseImageFilter::
16 _ConfigureFilter( )
17 {
18   typedef typename _TFilter::TInputImage                _TImage;
19   typedef typename _TImage::IndexType                   _TIndex;
20   typedef itk::Point< double, _TImage::ImageDimension > _TPoint;
21   typedef itk::SimpleDataObjectDecorator< std::vector< _TPoint > > _TPoints;
22   typedef itk::SimpleDataObjectDecorator< std::vector< _TIndex > > _TIndexes;
23
24   auto image = this->GetInputData( "Input" )->GetITK< _TImage >( );
25   if( image == NULL )
26     return( NULL );
27   auto points = this->GetInputData( "Seeds" )->GetITK< _TPoints >( );
28   auto indexes = this->GetInputData( "Seeds" )->GetITK< _TIndexes >( );
29
30   // Create filter and connect input
31   auto filter = this->_CreateITK< _TFilter >( );
32   filter->SetInput( image );
33
34   // Set numeric parameters
35   filter->SetNeighborhoodOrder(
36     this->m_Parameters.GetSelectedChoice( "NeighborhoodOrder" )[ 0 ] - '0'
37     );
38   filter->SetStopAtOneFront( this->m_Parameters.GetBool( "StopAtOneFront" ) );
39
40   // Assign seeds
41   filter->ClearSeeds( );
42   if( points != NULL )
43   {
44     for(
45       auto pIt = points->Get( ).begin( );
46       pIt != points->Get( ).end( );
47       ++pIt
48       )
49     {
50       _TIndex idx;
51       if( image->TransformPhysicalPointToIndex( *pIt, idx ) )
52         filter->AddSeed( idx, 0 );
53
54     } // rof
55   }
56   else if( indexes != NULL )
57   {
58     for(
59       auto iIt = indexes->Get( ).begin( );
60       iIt != indexes->Get( ).end( );
61       ++iIt
62       )
63       filter->AddSeed( *iIt, 0 );
64
65   } // fi
66
67   // Ok!
68   return( filter );
69 }
70
71 // -------------------------------------------------------------------------
72 template< class _TFilter >
73 void fpaPlugins::BaseImageFilter::
74 _ExecuteFilter( _TFilter* filter )
75 {
76   // Go!!!
77   this->_ConfigureDebugger( filter );
78   filter->Update( );
79   this->_DeconfigureDebugger( filter );
80
81   // Connect output
82   auto out = this->GetOutputData( "Output" );
83   out->SetITK( filter->GetOutput( ) );
84 }
85
86 // -------------------------------------------------------------------------
87 template< class _TFilter >
88 void fpaPlugins::BaseImageFilter::
89 _ConfigureDebugger( _TFilter* filter )
90 {
91   typedef typename _TFilter::TInputImage _TImage;
92   typedef fpa::VTK::Image2DObserver< _TFilter, vtkRenderWindow > _2D;
93   typedef fpa::VTK::Image3DObserver< _TFilter, vtkRenderWindow > _3D;
94
95   this->m_Observers.clear( );
96   if( this->m_Parameters.GetBool( "VisualDebug" ) )
97   {
98     if( this->m_MPRViewer != NULL )
99     {
100       if( _TImage::ImageDimension == 2 )
101       {
102         auto iren = this->m_MPRViewer->GetInteractor( 2 );
103         if( iren != NULL )
104         {
105           typename _2D::Pointer debugger = _2D::New( );
106           debugger->SetRenderWindow( iren->GetRenderWindow( ) );
107           debugger->SetRenderPercentage( 0.01 );
108           this->m_Observers.insert(
109             filter->AddObserver( itk::AnyEvent( ), debugger )
110             );
111           filter->ThrowEventsOn( );
112
113         } // fi
114       }
115       else if( _TImage::ImageDimension == 3 )
116       {
117         auto iren = this->m_MPRViewer->GetInteractor( 3 );
118         if( iren != NULL )
119         {
120           typename _3D::Pointer debugger = _3D::New( );
121           debugger->SetRenderWindow( iren->GetRenderWindow( ) );
122           debugger->SetRenderPercentage( 0.001 );
123           this->m_Observers.insert(
124             filter->AddObserver( itk::AnyEvent( ), debugger )
125             );
126           filter->ThrowEventsOn( );
127
128         } // fi
129
130       } // fi
131
132     } // fi
133
134     if( this->m_SingleInteractor != NULL )
135     {
136       if( _TImage::ImageDimension == 2 )
137       {
138       }
139       else if( _TImage::ImageDimension == 3 )
140       {
141       } // fi
142
143     } // fi
144
145   } // fi
146 }
147
148 // -------------------------------------------------------------------------
149 template< class F >
150 void fpaPlugins::BaseImageFilter::
151 _DeconfigureDebugger( F* filter )
152 {
153   if( filter != NULL )
154   {
155     auto oIt = this->m_Observers.begin( );
156     for( ; oIt != this->m_Observers.end( ); ++oIt )
157       filter->RemoveObserver( *oIt );
158
159   } // fi
160   this->m_Observers.clear( );
161 }
162
163 #endif // __FPAPLUGINS__BASEIMAGEFILTER__HXX__
164
165 // eof - $RCSfile$