]> Creatis software - FrontAlgorithms.git/blobdiff - lib/fpa/VTK/Image2DObserver.hxx
Major refactoring
[FrontAlgorithms.git] / lib / fpa / VTK / Image2DObserver.hxx
index 7ebe52613e6b85e78fc85c25c4d8171fe1a64635..74e5f4c02052ab89d22891e6958beb05762d662d 100644 (file)
 // -------------------------------------------------------------------------
 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
+  */
 }
 
 // -------------------------------------------------------------------------
@@ -103,13 +105,13 @@ template< class F, class R >
 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] =
     {
@@ -131,58 +133,116 @@ Execute( const itk::Object* c, const itk::EventObject& e )
       {  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$