+#ifndef __FPAPLUGINS__BASEIMAGEFILTER__HXX__
+#define __FPAPLUGINS__BASEIMAGEFILTER__HXX__
+
+#include <cpPlugins/Interface/Image.h>
+#include <cpPlugins/Interface/PointList.h>
+#include <cpPlugins/Interface/SimpleMPRWidget.h>
+
+#include <fpa/VTK/Image2DObserver.h>
+#include <fpa/VTK/Image3DObserver.h>
+
+#include <vtkRenderWindowInteractor.h>
+
+// -------------------------------------------------------------------------
+template< class F >
+F* fpaPlugins::BaseImageFilter::
+_ConfigureFilter( )
+{
+ typedef typename F::TInputImage _I;
+ typedef typename _I::PointType _P;
+
+ auto image =
+ this->GetInputData< cpPlugins::Interface::Image >( "Input" )->
+ GetITK< _I >( );
+ auto seeds =
+ this->GetInputData< cpPlugins::Interface::PointList >( "Seeds" );
+
+ // Create filter and connect input
+ F* filter = this->_CreateITK< F >( );
+ filter->SetInput( image );
+
+ // Set numeric parameters
+ Superclass::TParameters* params = this->m_Parameters;
+ filter->SetNeighborhoodOrder(
+ params->GetSelectedChoice( "NeighborhoodOrder" )[ 0 ] - '0'
+ );
+ filter->SetStopAtOneFront( params->GetBool( "StopAtOneFront" ) );
+
+ // Assign seeds
+ filter->ClearSeeds( );
+ for( unsigned int s = 0; s < seeds->GetNumberOfPoints( ); ++s )
+ {
+ _P pnt = seeds->GetPoint< _P >( s );
+ typename _I::IndexType idx;
+ if( image->TransformPhysicalPointToIndex( pnt, idx ) )
+ filter->AddSeed( idx, 0 );
+
+ } // rof
+
+ // Ok!
+ return( filter );
+}
+
+// -------------------------------------------------------------------------
+template< class F >
+void fpaPlugins::BaseImageFilter::
+_ExecuteFilter( F* filter )
+{
+ // Go!!!
+ this->_ConfigureDebugger( filter );
+ filter->Update( );
+ this->_DeconfigureDebugger( filter );
+
+ // Connect output
+ auto out =
+ this->GetOutputData< cpPlugins::Interface::Image >( "Output" );
+ out->SetITK( filter->GetOutput( ) );
+}
+
+// -------------------------------------------------------------------------
+template< class F >
+void fpaPlugins::BaseImageFilter::
+_ConfigureDebugger( F* filter )
+{
+ typedef typename F::TInputImage _I;
+ typedef fpa::VTK::Image2DObserver< F, vtkRenderWindow > _2D;
+ typedef fpa::VTK::Image3DObserver< F, vtkRenderWindow > _3D;
+
+ this->m_Observers.clear( );
+ if( this->m_Parameters->GetBool( "VisualDebug" ) )
+ {
+ if( this->m_MPRViewer != NULL )
+ {
+ if( _I::ImageDimension == 2 )
+ {
+ auto iren = this->m_MPRViewer->GetInteractor( 2 );
+ if( iren != NULL )
+ {
+ typename _2D::Pointer debugger = _2D::New( );
+ debugger->SetRenderWindow( iren->GetRenderWindow( ) );
+ debugger->SetRenderPercentage( 0.01 );
+ this->m_Observers.insert(
+ filter->AddObserver( itk::AnyEvent( ), debugger )
+ );
+ filter->ThrowEventsOn( );
+
+ } // fi
+ }
+ else if( _I::ImageDimension == 3 )
+ {
+ auto iren = this->m_MPRViewer->GetInteractor( 2 );
+ if( iren != NULL )
+ {
+ typename _3D::Pointer debugger = _3D::New( );
+ debugger->SetRenderWindow( iren->GetRenderWindow( ) );
+ debugger->SetRenderPercentage( 0.001 );
+ this->m_Observers.insert(
+ filter->AddObserver( itk::AnyEvent( ), debugger )
+ );
+ filter->ThrowEventsOn( );
+
+ } // fi
+
+ } // fi
+
+ } // fi
+
+ if( this->m_SingleInteractor != NULL )
+ {
+ if( _I::ImageDimension == 2 )
+ {
+ }
+ else if( _I::ImageDimension == 3 )
+ {
+ } // fi
+
+ } // fi
+
+ } // fi
+}
+
+// -------------------------------------------------------------------------
+template< class F >
+void fpaPlugins::BaseImageFilter::
+_DeconfigureDebugger( F* filter )
+{
+ if( filter != NULL )
+ {
+ auto oIt = this->m_Observers.begin( );
+ for( ; oIt != this->m_Observers.end( ); ++oIt )
+ filter->RemoveObserver( *oIt );
+
+ } // fi
+ this->m_Observers.clear( );
+}
+
+#endif // __FPAPLUGINS__BASEIMAGEFILTER__HXX__
+
+// eof - $RCSfile$