+#include <itkCommand.h>
+#include <itkImage.h>
+#include <itkImageFileWriter.h>
+#include <fpa/Image/RegionGrow.h>
+
+// -------------------------------------------------------------------------
+typedef itk::Image< unsigned char, 2 > TImage;
+typedef fpa::Image::RegionGrow< TImage, TImage > TFilter;
+typedef itk::ImageFileWriter< TImage > TWriter;
+
+// -------------------------------------------------------------------------
+/**
+ */
+class MyObserver
+ : public itk::Command
+{
+public:
+ typedef TFilter::TStartEvent TStartEvent;
+ typedef TFilter::TEndEvent TEndEvent;
+ typedef TFilter::TStartLoopEvent TStartLoopEvent;
+ typedef TFilter::TEndLoopEvent TEndLoopEvent;
+ typedef TFilter::TPushEvent TPushEvent;
+ typedef TFilter::TPopEvent TPopEvent;
+ typedef TFilter::TMarkEvent TMarkEvent;
+
+public:
+ itkNewMacro( MyObserver );
+
+public:
+ virtual void Execute(
+ itk::Object* caller, const itk::EventObject& event
+ ) override
+ {
+ this->Execute( const_cast< const itk::Object* >( caller ), event );
+ }
+ virtual void Execute(
+ const itk::Object* object, const itk::EventObject& event
+ ) override
+ {
+ if( TStartEvent( ).CheckEvent( &event ) )
+ std::cout << "Start" << std::endl;
+ else if( TEndEvent( ).CheckEvent( &event ) )
+ std::cout << "End" << std::endl;
+ else if( TStartLoopEvent( ).CheckEvent( &event ) )
+ std::cout << "StartLoop" << std::endl;
+ else if( TEndLoopEvent( ).CheckEvent( &event ) )
+ std::cout << "EndLoop" << std::endl;
+ else if( TMarkEvent( ).CheckEvent( &event ) )
+ {
+ const TMarkEvent* mark = dynamic_cast< const TMarkEvent* >( &event );
+ std::cout << "Mark: " << mark->Vertex << std::endl;
+
+ } // fi
+ /* TODO
+ TPushEvent;
+ TPopEvent;
+ */
+ }
+};
+
+// -------------------------------------------------------------------------
+int main( int argc, char* argv[] )
+{
+ TImage::SizeType size;
+ size.Fill( 10 );
+
+ TImage::Pointer input = TImage::New( );
+ input->SetRegions( size );
+ input->Allocate( );
+ input->FillBuffer( 0 );
+
+ TImage::RegionType region = input->GetLargestPossibleRegion( );
+ TImage::PointType p0, p1, p2;
+ input->TransformIndexToPhysicalPoint( region.GetIndex( ), p0 );
+ input->TransformIndexToPhysicalPoint(
+ region.GetIndex( ) + region.GetSize( ), p1
+ );
+ p2 = ( p0.GetVectorFromOrigin( ) + p1.GetVectorFromOrigin( ) ) * 0.5;
+ TImage::IndexType seed;
+ input->TransformPhysicalPointToIndex( p2, seed );
+
+ TFilter::Pointer filter = TFilter::New( );
+ filter->SetInput( input );
+ filter->SetInsideValue( 255 );
+ filter->SetOutsideValue( 0 );
+ filter->AddSeed( seed, filter->GetInsideValue( ) );
+
+ MyObserver::Pointer obs = MyObserver::New( );
+ filter->AddObserver( itk::AnyEvent( ), obs );
+ filter->Update( );
+
+ TWriter::Pointer writer = TWriter::New( );
+ writer->SetInput( filter->GetOutput( ) );
+ writer->SetFileName( "RegionGrow_00.png" );
+ writer->Update( );
+
+ return( 0 );
+}
+
+// eof - $RCSfile$