]> Creatis software - FrontAlgorithms.git/blobdiff - lib/fpa/VTK/Image3DObserver.hxx
Segmentation guided by a gaussian estimator added -- Not yet finished
[FrontAlgorithms.git] / lib / fpa / VTK / Image3DObserver.hxx
index e79bbbe24dc5e99e3badf6febd3fea399042193e..46ef743729d70197309dd18c9f505a1b395138f3 100644 (file)
@@ -1,85 +1,26 @@
 #ifndef __FPA__VTK__IMAGE3DOBSERVER__HXX__
 #define __FPA__VTK__IMAGE3DOBSERVER__HXX__
 
+#include <itkImageBase.h>
+
 #include <vtkCellArray.h>
+#include <vtkFloatArray.h>
+#include <vtkPointData.h>
 #include <vtkPoints.h>
-#include <vtkProperty.h>
 #include <vtkRenderer.h>
 #include <vtkRendererCollection.h>
+
 /*
   #include <vtkCellArray.h>
-  #include <vtkPolyDataMapper.h>
-  #include <vtkPoints.h>
-  #include <vtkPointData.h>
+  #include <vtkProperty.h>
 */
 
 // -------------------------------------------------------------------------
 template< class F, class R >
 void fpa::VTK::Image3DObserver< F, R >::
-SetImage( const TImage* img, R* rw )
+SetRenderWindow( R* rw )
 {
-  this->m_Image = img;
   this->m_RenderWindow = rw;
-  this->m_Vertices.clear( );
-
-  /*
-    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.001 );
-  this->m_Number = 0;
-
-  if( this->m_RenderWindow != NULL )
-  {
-    vtkRenderer* ren =
-      this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
-    ren->AddActor( this->m_PolyDataActor );
-    this->Render( );
-
-  } // fi
-}
-
-// -------------------------------------------------------------------------
-template< class F, class R >
-void fpa::VTK::Image3DObserver< F, R >::
-Render( )
-{
-  if( this->m_RenderWindow != NULL )
-    this->m_RenderWindow->Render( );
 }
 
 // -------------------------------------------------------------------------
@@ -87,90 +28,162 @@ template< class F, class R >
 void fpa::VTK::Image3DObserver< 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 itk::ImageBase< 3 >               _TImage;
+  typedef typename F::TEvent                _TEvent;
+  typedef typename F::TFrontEvent           _TFrontEvent;
+  typedef typename F::TMarkEvent            _TMarkEvent;
+  typedef typename F::TCollisionEvent       _TCollisionEvent;
+  typedef typename F::TEndEvent             _TEndEvent;
+  typedef typename F::TBacktrackingEvent    _TBacktrackingEvent;
+  typedef typename F::TEndBacktrackingEvent _TEndBacktrackingEvent;
+
+  // Check inputs
   if( this->m_RenderWindow == NULL )
     return;
+  vtkRenderer* ren =
+    this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
+  if( ren == NULL )
+    return;
+  const F* filter = dynamic_cast< const F* >( c );
+  if( filter == NULL )
+    return;
+  const _TImage* image = filter->GetInput( );
+  if( image == NULL )
+    return;
 
-  const TEvent* evt = dynamic_cast< const TEvent* >( &e );
-  TFrontEvent fevt;
-  TMarkEvent mevt;
-  TCollisionEvent cevt;
-  TEndEvent eevt;
-  if( evt != NULL )
+  // Create actor
+  _TImage::RegionType reg = image->GetLargestPossibleRegion( );
+  _TImage::SizeType siz = reg.GetSize( );
+  if( this->m_Data.GetPointer( ) == NULL )
   {
-    typename TImage::PointType pnt;
-    this->m_Image->TransformIndexToPhysicalPoint( evt->Node.Vertex, pnt );
+    this->m_Data   = vtkSmartPointer< vtkPolyData >::New( );
+    this->m_Mapper = vtkSmartPointer< vtkPolyDataMapper >::New( );
+    this->m_Actor  = vtkSmartPointer< vtkActor >::New( );
+
+    vtkSmartPointer< vtkPoints > points =
+      vtkSmartPointer< vtkPoints >::New( );
+    vtkSmartPointer< vtkCellArray > vertices =
+      vtkSmartPointer< vtkCellArray >::New( );
+    vtkSmartPointer< vtkFloatArray > scalars =
+      vtkSmartPointer< vtkFloatArray >::New( );
+    this->m_Data->SetPoints( points );
+    this->m_Data->SetVerts( vertices );
+    this->m_Data->GetPointData( )->SetScalars( scalars );
+
+    this->m_Mapper->SetInputData( this->m_Data );
+    this->m_Actor->SetMapper( this->m_Mapper );
+    ren->AddActor( this->m_Actor );
+
+    this->m_Marks = TMarks::New( );
+    this->m_Marks->SetLargestPossibleRegion(
+      image->GetLargestPossibleRegion( )
+      );
+    this->m_Marks->SetRequestedRegion( image->GetRequestedRegion( ) );
+    this->m_Marks->SetBufferedRegion( image->GetBufferedRegion( ) );
+    this->m_Marks->SetOrigin( image->GetOrigin( ) );
+    this->m_Marks->SetSpacing( image->GetSpacing( ) );
+    this->m_Marks->SetDirection( image->GetDirection( ) );
+    this->m_Marks->Allocate( );
+    this->m_Marks->FillBuffer( -1 );
+    this->m_Count = 0;
+    this->m_RenderCount = reg.GetNumberOfPixels( );
 
+  } // fi
+
+  // Get possible events
+  const _TEvent* evt = dynamic_cast< const _TEvent* >( &e );
+  _TFrontEvent fevt;
+  _TMarkEvent mevt;
+  _TCollisionEvent cevt;
+  _TEndEvent eevt;
+
+  if( evt != NULL )
+  {
     if( fevt.CheckEvent( evt ) )
     {
-      if(
-        this->m_Vertices.find( evt->Node.Vertex ) == this->m_Vertices.end( )
-        )
+      if( this->m_Marks->GetPixel( evt->Node.Vertex ) == -1 )
       {
-        unsigned long pId = this->m_PolyData->GetPoints( )->InsertNextPoint(
-          double( pnt[ 0 ] ), double( pnt[ 1 ] ), double( pnt[ 2 ] )
-          );
-        unsigned long cId = this->m_PolyData->GetVerts( )->InsertNextCell( 1 );
-        this->m_PolyData->GetVerts( )->InsertCellPoint( pId );
-        this->m_PolyData->Modified( );
-        this->m_Vertices[ evt->Node.Vertex ] = TVertexIds( pId, cId );
-
-      } // rof
+        typename _TImage::PointType pnt;
+        image->TransformIndexToPhysicalPoint( evt->Node.Vertex, pnt );
+
+        long pId = this->m_Data->GetNumberOfPoints( );
+        this->m_Data->GetVerts( )->InsertNextCell( 1 );
+        this->m_Data->GetVerts( )->InsertCellPoint( pId );
+        this->m_Data->GetPoints( )->
+          InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
+        this->m_Data->GetPointData( )->
+          GetScalars( )->InsertNextTuple1( 0.5 );
+        this->m_Data->Modified( );
+
+        this->m_Marks->SetPixel( evt->Node.Vertex, pId );
+        this->m_Count++;
+
+        // Render visual debug
+        double per = double( this->m_RenderCount ) * this->m_RenderPercentage;
+        if( double( this->m_Count ) >= per )
+          this->m_RenderWindow->Render( );
+        if( double( this->m_Count ) >= per )
+          this->m_Count = 0;
+
+      } // fi
+      return;
     }
     else if( mevt.CheckEvent( evt ) )
     {
-      /*
-        typename TVertices::iterator vIt =
-        this->m_Vertices.find( evt->Node.Vertex );
-        if( vIt != this->m_Vertices.end( ) )
-        {
-        std::cout << "Erase " << evt->Node.Vertex << " " << vIt->second.second << std::endl;
-        } // fi
-      */
+      // TODO: std::cout << "mark" << std::endl;
+      return;
+
     } // fi
 
     if( cevt.CheckEvent( evt ) )
     {
-      // std::cout << "Collision";
+      // TODO: std::cout << "collision" << std::endl;
+      return;
+
     } // fi
-    /*
-      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 ]
-      );
-      else if( mevt.CheckEvent( evt ) )
-      this->SetPixel( evt->Node.Vertex, 255, 0, 0, 255 );
-
-      if( cevt.CheckEvent( evt ) )
-      this->SetPixel( evt->Node.Vertex, 100, 50, 25, 255 );
-    */
-    
-    // Update visualization
-    if( this->m_Number == 0 || this->m_Percentage < 0 )
-      this->Render( );
-    this->m_Number++;
-    this->m_Number %= this->m_Percentage;
 
     if( eevt.CheckEvent( evt ) )
     {
-      if( this->m_RenderWindow != NULL )
-      {
-        vtkRenderer* ren =
-          this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
-        ren->RemoveActor( this->m_PolyDataActor );
-        this->Render( );
+      this->m_RenderWindow->Render( );
+      ren->RemoveActor( this->m_Actor );
+      this->m_RenderWindow->Render( );
+      this->m_Marks = NULL;
+      this->m_Data = NULL;
+      this->m_Mapper = NULL;
+      this->m_Actor = NULL;
+      return;
 
-      } // fi
+    } // fi
+  }
+  else
+  {
+    const _TBacktrackingEvent* bevt =
+      dynamic_cast< const _TBacktrackingEvent* >( &e );
+    const _TEndBacktrackingEvent* ebevt =
+      dynamic_cast< const _TEndBacktrackingEvent* >( &e );
+    if( bevt != NULL )
+    {
+      static const unsigned long nColors = 10;
+      double back_id = double( bevt->BackId % nColors ) / double( nColors );
+      typename _TImage::PointType pnt;
+      image->TransformIndexToPhysicalPoint( bevt->Node, pnt );
+
+      long pId = this->m_Data->GetNumberOfPoints( );
+      this->m_Data->GetVerts( )->InsertNextCell( 1 );
+      this->m_Data->GetVerts( )->InsertCellPoint( pId );
+      this->m_Data->GetPoints( )->
+        InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
+      this->m_Data->GetPointData( )->
+        GetScalars( )->InsertNextTuple1( back_id );
+      this->m_Data->Modified( );
+      return;
+
+    } // fi
+
+    if( ebevt != NULL )
+    {
+      this->m_RenderWindow->Render( );
+      return;
 
     } // fi
 
@@ -183,19 +196,8 @@ fpa::VTK::Image3DObserver< F, R >::
 Image3DObserver( )
   : Superclass( ),
     m_RenderWindow( NULL ),
-    m_Number( 0 ),
-    m_Percentage( 0 )
+    m_RenderPercentage( double( 0.0001 ) )
 {
-  this->m_PolyData = vtkSmartPointer< vtkPolyData >::New( );
-  this->m_PolyDataMapper = vtkSmartPointer< vtkPolyDataMapper >::New( );
-  this->m_PolyDataActor = vtkSmartPointer< vtkActor >::New( );
-
-  this->m_PolyData->SetPoints( vtkPoints::New( ) );
-  this->m_PolyData->SetVerts( vtkCellArray::New( ) );
-
-  this->m_PolyDataMapper->SetInputData( this->m_PolyData );
-  this->m_PolyDataActor->SetMapper( this->m_PolyDataMapper );
-  this->m_PolyDataActor->GetProperty( )->SetColor( 0, 0, 1 );
 }
 
 #endif // __FPA__VTK__IMAGE3DOBSERVER__HXX__