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