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