// -------------------------------------------------------------------------
template< class F, class R >
void fpa::VTK::Image2DObserver< F, R >::
-SetImage( const TImage* img, R* rw )
+SetRenderWindow( R* rw )
{
- this->m_Image = img;
this->m_RenderWindow = rw;
- unsigned int minD = TImage::ImageDimension;
- minD = ( minD < 3 )? minD: 3;
-
- int e[ 6 ] = { 0 };
- typename TImage::RegionType reg = this->m_Image->GetRequestedRegion( );
- for( unsigned int i = 0; i < minD; i++ )
- {
- e[ ( i << 1 ) + 0 ] = reg.GetIndex( )[ i ];
- e[ ( i << 1 ) + 1 ] = reg.GetIndex( )[ i ] + reg.GetSize( )[ i ] - 1;
-
- } // rof
-
- typename TImage::SpacingType spac = this->m_Image->GetSpacing( );
- double s[ 3 ] = { 1, 1, 1 };
- for( unsigned int i = 0; i < minD; i++ )
- s[ i ] = double( spac[ i ] );
-
- typename TImage::PointType orig = this->m_Image->GetOrigin( );
- double o[ 3 ] = { 0 };
- for( unsigned int i = 0; i < minD; i++ )
- o[ i ] = double( orig[ i ] );
-
- this->m_Stencil->SetExtent( e );
- this->m_Stencil->SetSpacing( s );
- this->m_Stencil->SetOrigin( o );
- this->m_Stencil->AllocateScalars( VTK_UNSIGNED_CHAR, 4 );
- for( unsigned int i = 0; i < 3; i++ )
- this->m_Stencil->GetPointData( )->
- GetScalars( )->FillComponent( i, 255 );
- this->m_Stencil->GetPointData( )->GetScalars( )->FillComponent( 3, 0 );
-
- this->m_StencilActor->SetInputData( this->m_Stencil );
- this->m_StencilActor->InterpolateOff( );
-
- double nPix =
- double( this->m_Image->GetRequestedRegion( ).GetNumberOfPixels( ) );
- this->m_Percentage = ( unsigned long )( nPix * 0.01 );
- this->m_Number = 0;
-
- if( this->m_RenderWindow != NULL )
- {
- vtkRenderer* ren =
- this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
- ren->AddActor( this->m_StencilActor );
- this->Render( );
-
- } // fi
+ /* TODO
+ this->m_Image = img;
+ unsigned int minD = TImage::ImageDimension;
+ minD = ( minD < 3 )? minD: 3;
+
+ int e[ 6 ] = { 0 };
+ typename TImage::RegionType reg = this->m_Image->GetRequestedRegion( );
+ for( unsigned int i = 0; i < minD; i++ )
+ {
+ e[ ( i << 1 ) + 0 ] = reg.GetIndex( )[ i ];
+ e[ ( i << 1 ) + 1 ] = reg.GetIndex( )[ i ] + reg.GetSize( )[ i ] - 1;
+
+ } // rof
+
+ typename TImage::SpacingType spac = this->m_Image->GetSpacing( );
+ double s[ 3 ] = { 1, 1, 1 };
+ for( unsigned int i = 0; i < minD; i++ )
+ s[ i ] = double( spac[ i ] );
+
+ typename TImage::PointType orig = this->m_Image->GetOrigin( );
+ double o[ 3 ] = { 0 };
+ for( unsigned int i = 0; i < minD; i++ )
+ o[ i ] = double( orig[ i ] );
+
+ this->m_Stencil->SetExtent( e );
+ this->m_Stencil->SetSpacing( s );
+ this->m_Stencil->SetOrigin( o );
+ this->m_Stencil->AllocateScalars( VTK_UNSIGNED_CHAR, 4 );
+ for( unsigned int i = 0; i < 3; i++ )
+ this->m_Stencil->GetPointData( )->
+ GetScalars( )->FillComponent( i, 255 );
+ this->m_Stencil->GetPointData( )->GetScalars( )->FillComponent( 3, 0 );
+
+ this->m_StencilActor->SetInputData( this->m_Stencil );
+ this->m_StencilActor->InterpolateOff( );
+
+ double nPix =
+ double( this->m_Image->GetRequestedRegion( ).GetNumberOfPixels( ) );
+ this->m_Percentage = ( unsigned long )( nPix * 0.01 );
+ this->m_Number = 0;
+
+ if( this->m_RenderWindow != NULL )
+ {
+ vtkRenderer* ren =
+ this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
+ ren->AddActor( this->m_StencilActor );
+ this->Render( );
+
+ } // fi
+ */
}
// -------------------------------------------------------------------------
void fpa::VTK::Image2DObserver< F, R >::
Execute( const itk::Object* c, const itk::EventObject& e )
{
- typedef typename TImage::IndexType TIndex;
- typedef typename TImage::PointType TPoint;
- typedef typename TFilter::TEvent TEvent;
- typedef typename TFilter::TFrontEvent TFrontEvent;
- typedef typename TFilter::TMarkEvent TMarkEvent;
- typedef typename TFilter::TCollisionEvent TCollisionEvent;
- typedef typename TFilter::TEndEvent TEndEvent;
+ typedef typename F::TStartEvent TStartEvent;
+ typedef typename F::TStartLoopEvent TStartLoopEvent;
+ typedef typename F::TEndEvent TEndEvent;
+ typedef typename F::TEndLoopEvent TEndLoopEvent;
+ typedef typename F::TAliveEvent TAliveEvent;
+ typedef typename F::TFrontEvent TFrontEvent;
+ typedef typename F::TFreezeEvent TFreezeEvent;
static unsigned char Colors[][4] =
{
{ 63, 63, 127, 127 }
};
- if( this->m_RenderWindow == NULL )
+ const F* filter = dynamic_cast< const F* >( c );
+ if( this->m_RenderWindow == NULL || filter == NULL )
+ return;
+
+ const TStartEvent* startEvt = dynamic_cast< const TStartEvent* >( &e );
+ if( startEvt != NULL )
+ {
+ const typename F::TInputImage* img = filter->GetInput( );
+ unsigned int minD = F::TInputImage::ImageDimension;
+ minD = ( minD < 3 )? minD: 3;
+
+ int e[ 6 ] = { 0 };
+ typename F::TInputImage::RegionType reg = img->GetRequestedRegion( );
+ for( unsigned int i = 0; i < minD; i++ )
+ {
+ e[ ( i << 1 ) + 0 ] = reg.GetIndex( )[ i ];
+ e[ ( i << 1 ) + 1 ] = reg.GetIndex( )[ i ] + reg.GetSize( )[ i ] - 1;
+
+ } // rof
+
+ typename F::TInputImage::SpacingType spac = img->GetSpacing( );
+ double s[ 3 ] = { 1, 1, 1 };
+ for( unsigned int i = 0; i < minD; i++ )
+ s[ i ] = double( spac[ i ] );
+
+ typename F::TInputImage::PointType orig = img->GetOrigin( );
+ double o[ 3 ] = { 0 };
+ for( unsigned int i = 0; i < minD; i++ )
+ o[ i ] = double( orig[ i ] );
+
+ this->m_Stencil->SetExtent( e );
+ this->m_Stencil->SetSpacing( s );
+ this->m_Stencil->SetOrigin( o );
+ this->m_Stencil->AllocateScalars( VTK_UNSIGNED_CHAR, 4 );
+ for( unsigned int i = 0; i < 3; i++ )
+ this->m_Stencil->GetPointData( )->
+ GetScalars( )->FillComponent( i, 255 );
+ this->m_Stencil->GetPointData( )->GetScalars( )->FillComponent( 3, 0 );
+
+ this->m_StencilActor->SetInputData( this->m_Stencil );
+ this->m_StencilActor->InterpolateOff( );
+
+ this->m_Count = 0;
+ this->m_RenderCount = reg.GetNumberOfPixels( );
+
+ vtkRenderer* ren =
+ this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
+ ren->AddActor( this->m_StencilActor );
return;
- const TEvent* evt = dynamic_cast< const TEvent* >( &e );
- TFrontEvent fevt;
- TMarkEvent mevt;
- TCollisionEvent cevt;
- TEndEvent eevt;
- if( evt != NULL )
+ } // fi
+
+ const TAliveEvent* aliveEvt = dynamic_cast< const TAliveEvent* >( &e );
+ const TFrontEvent* frontEvt = dynamic_cast< const TFrontEvent* >( &e );
+ if( aliveEvt != NULL || frontEvt != NULL )
{
- if( mevt.CheckEvent( evt ) )
+ if( aliveEvt != NULL )
this->SetPixel(
- evt->Node.Vertex,
- Colors[ evt->Node.FrontId ][ 0 ],
- Colors[ evt->Node.FrontId ][ 1 ],
- Colors[ evt->Node.FrontId ][ 2 ],
- Colors[ evt->Node.FrontId ][ 3 ]
+ aliveEvt->Vertex,
+ Colors[ aliveEvt->FrontId ][ 0 ],
+ Colors[ aliveEvt->FrontId ][ 1 ],
+ Colors[ aliveEvt->FrontId ][ 2 ],
+ Colors[ aliveEvt->FrontId ][ 3 ]
);
- else if( fevt.CheckEvent( evt ) )
- this->SetPixel( evt->Node.Vertex, 255, 0, 0, 255 );
- if( cevt.CheckEvent( evt ) )
- this->SetPixel( evt->Node.Vertex, 100, 50, 25, 255 );
+ else if( frontEvt != NULL )
+ this->SetPixel( frontEvt->Vertex, 255, 0, 0, 255 );
+ this->m_Count++;
- // Update visualization
- if( this->m_Number == 0 || this->m_Percentage < 0 )
+ // Render visual debug
+ double per = double( this->m_RenderCount ) * this->m_RenderPercentage;
+ if( double( this->m_Count ) >= per )
this->Render( );
- this->m_Number++;
- this->m_Number %= this->m_Percentage;
+ if( double( this->m_Count ) >= per )
+ this->m_Count = 0;
- if( eevt.CheckEvent( evt ) )
- {
- if( this->m_RenderWindow != NULL )
- {
- /* TODO
- vtkRenderer* ren =
- this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
- ren->RemoveActor( this->m_StencilActor );
- */
- this->Render( );
-
- } // fi
-
- } // fi
- }
- else
+ return;
+
+ } // fi
+
+ const TEndEvent* endEvt = dynamic_cast< const TEndEvent* >( &e );
+ if( endEvt != NULL )
{
- // TODO: Remove all!
+ vtkRenderer* ren =
+ this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
+ ren->RemoveActor( this->m_StencilActor );
this->Render( );
+ return;
} // fi
}
+// -------------------------------------------------------------------------
+template< class F, class R >
+fpa::VTK::Image2DObserver< F, R >::
+Image2DObserver( )
+ : Superclass( ),
+ m_RenderWindow( NULL ),
+ m_RenderPercentage( double( 0.01 ) )
+{
+ this->m_Stencil = vtkSmartPointer< vtkImageData >::New( );
+ this->m_StencilActor = vtkSmartPointer< vtkImageActor >::New( );
+}
+
+// -------------------------------------------------------------------------
+template< class F, class R >
+fpa::VTK::Image2DObserver< F, R >::
+~Image2DObserver( )
+{
+}
+
#endif // __FPA__VTK__IMAGE2DOBSERVER__HXX__
// eof - $RCSfile$