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