]> Creatis software - FrontAlgorithms.git/blobdiff - lib/fpa/VTK/Image3DObserver.hxx
Branches extraction algorithm from MSTs updated
[FrontAlgorithms.git] / lib / fpa / VTK / Image3DObserver.hxx
index d39fc0ba3a2dca5e20033366d5aff720ec6c5a08..6efa1202e149aca607c8d0f95793e2448d312340 100644 (file)
@@ -9,9 +9,6 @@
 #include <vtkRenderer.h>
 #include <vtkRendererCollection.h>
 
-#include <vtkPolyDataWriter.h>
-
-
 // -------------------------------------------------------------------------
 template< class F, class R >
 void fpa::VTK::Image3DObserver< F, R >::
@@ -20,46 +17,6 @@ SetRenderWindow( R* rw )
   this->m_RenderWindow = rw;
 }
 
-// -------------------------------------------------------------------------
-template< class F, class R >
-void fpa::VTK::Image3DObserver< F, R >::
-SetPixel(
-  typename TImage::IndexType idx,
-  unsigned char red,
-  unsigned char green,
-  unsigned char blue,
-  unsigned char alpha
-  )
-{
-  this->m_Stencil->SetScalarComponentFromDouble
-    ( idx[ 0 ], idx[ 1 ], idx[ 2 ], 0, red );
-  this->m_Stencil->SetScalarComponentFromDouble
-    ( idx[ 0 ], idx[ 1 ], idx[ 2 ], 1, green );
-  this->m_Stencil->SetScalarComponentFromDouble
-    ( idx[ 0 ], idx[ 1 ], idx[ 2 ], 2, blue );
-  this->m_Stencil->SetScalarComponentFromDouble
-    ( idx[ 0 ], idx[ 1 ], idx[ 2 ], 3, alpha );
-
-  int ijk[ 3 ];
-  ijk[ 0 ] = idx[ 0 ];
-  ijk[ 1 ] = idx[ 1 ];
-  ijk[ 2 ] = idx[ 2 ];
-  long id = this->m_Stencil->ComputePointId( ijk );
-  vtkUnsignedCharArray* pd_data =
-    dynamic_cast< vtkUnsignedCharArray* >(
-      this->m_PolyData->GetPointData( )->GetScalars( )
-      );
-  if( pd_data != NULL )
-  {
-    pd_data->SetTuple4( id, red, green, blue, alpha );
-
-  } // fi
-  this->m_Stencil->Modified( );
-  this->m_PolyData->Modified( );
-  this->m_PolyDataMapper->Modified( );
-  this->m_PolyDataActor->Modified( );
-}
-
 // -------------------------------------------------------------------------
 template< class F, class R >
 void fpa::VTK::Image3DObserver< F, R >::
@@ -109,86 +66,20 @@ Execute( const itk::Object* c, const itk::EventObject& e )
   const F* filter = dynamic_cast< const F* >( c );
   if( this->m_RenderWindow == NULL || filter == NULL )
     return;
+  auto image = filter->GetInput( );
+  if( image == NULL )
+    return;
 
   const _TStartEvent* startEvt = dynamic_cast< const _TStartEvent* >( &e );
   const _TStartBacktrackingEvent* startBackEvt =
     dynamic_cast< const _TStartBacktrackingEvent* >( &e );
   if( startEvt != NULL || startBackEvt != 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 );
-
-    vtkSmartPointer< vtkPoints > pd_points =
-      vtkSmartPointer< vtkPoints >::New( );
-    vtkSmartPointer< vtkCellArray > pd_verts =
-      vtkSmartPointer< vtkCellArray >::New( );
-    vtkSmartPointer< vtkUnsignedCharArray > pd_data =
-      vtkSmartPointer< vtkUnsignedCharArray >::New( );
-    long nPoints = this->m_Stencil->GetNumberOfPoints( );
-
-    pd_data->SetNumberOfComponents( 4 );
-    pd_data->SetNumberOfTuples( nPoints );
-    pd_points->SetNumberOfPoints( nPoints );
-    double point[ 3 ];
-    for( long pId = 0; pId < nPoints; ++pId )
-    {
-      this->m_Stencil->GetPoint( pId, point );
-      pd_points->InsertNextPoint( point );
-      pd_verts->InsertNextCell( 1 );
-      pd_verts->InsertCellPoint( pId );
-      pd_data->SetTuple4( pId, 0, 0, 0, 0 );
-
-    } // rof
-    this->m_PolyData->SetPoints( pd_points );
-    this->m_PolyData->SetVerts( pd_verts );
-    // this->m_PolyData->GetPointData( )->SetScalars( pd_data );
-
-    /*
-      vtkSmartPointer< vtkPolyDataWriter > w =
-      vtkSmartPointer< vtkPolyDataWriter >::New( );
-      w->SetInputData( this->m_PolyData );
-      w->SetFileName( "fpa.vtk" );
-      w->Update( );
-
-      std::exit( 1 );
-    */
-
-
-
-    this->m_PolyDataMapper->SetInputData( this->m_PolyData );
-    this->m_PolyDataActor->SetMapper( this->m_PolyDataMapper );
-
     this->m_Count = 0;
-    this->m_RenderCount = reg.GetNumberOfPixels( );
+    this->m_RenderCount =
+      image->GetLargestPossibleRegion( ).GetNumberOfPixels( );
+    this->m_PointsToReplace.clear( );
+    this->m_PointsInFront.clear( );
 
     vtkRenderer* ren =
       this->m_RenderWindow->GetRenderers( )->GetFirstRenderer( );
@@ -197,23 +88,34 @@ Execute( const itk::Object* c, const itk::EventObject& e )
 
   } // fi
 
-  const _TAliveEvent* aliveEvt = dynamic_cast< const _TAliveEvent* >( &e );
   const _TFrontEvent* frontEvt = dynamic_cast< const _TFrontEvent* >( &e );
-  if( aliveEvt != NULL || frontEvt != NULL )
+  if( frontEvt != NULL )
   {
-    if( aliveEvt != NULL )
-      this->SetPixel(
-        aliveEvt->Vertex,
-        Colors[ aliveEvt->FrontId ][ 0 ],
-        Colors[ aliveEvt->FrontId ][ 1 ],
-        Colors[ aliveEvt->FrontId ][ 2 ],
-        Colors[ aliveEvt->FrontId ][ 3 ]
-        );
-    else if( frontEvt != NULL )
-      this->SetPixel( frontEvt->Vertex, 255, 0, 0, 255 );
-    this->m_Count++;
+    typename F::TInputImage::PointType pnt;
+    image->TransformIndexToPhysicalPoint( frontEvt->Vertex, pnt );
+    if( this->m_PointsToReplace.empty( ) )
+    {
+      unsigned long nPoints = this->m_PolyData->GetNumberOfPoints( );
+      this->m_PolyData->GetPoints( )->
+        InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
+      this->m_PolyData->GetVerts( )->InsertNextCell( 1 );
+      this->m_PolyData->GetVerts( )->InsertCellPoint( nPoints );
+      this->m_PointsInFront[ frontEvt->Vertex ] = nPoints;
+    }
+    else
+    {
+      auto pIt = this->m_PointsToReplace.begin( );
+      this->m_PolyData->GetPoints( )->
+        SetPoint( pIt->second, pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] );
+      this->m_PointsToReplace.erase( pIt );
+
+    } // fi
+    this->m_PolyData->Modified( );
+    this->m_PolyDataMapper->Modified( );
+    this->m_PolyDataActor->Modified( );
 
     // Render visual debug
+    this->m_Count++;
     double per = double( this->m_RenderCount ) * this->m_RenderPercentage;
     if( double( this->m_Count ) >= per )
       this->Render( );
@@ -224,6 +126,20 @@ Execute( const itk::Object* c, const itk::EventObject& e )
 
   } // fi
 
+  const _TAliveEvent* aliveEvt = dynamic_cast< const _TAliveEvent* >( &e );
+  if( aliveEvt != NULL )
+  {
+    auto pIt = this->m_PointsInFront.find( aliveEvt->Vertex );
+    if( pIt != this->m_PointsInFront.end( ) )
+    {
+      this->m_PointsToReplace[ pIt->first ] = pIt->second;
+      this->m_PointsInFront.erase( pIt );
+
+    } // fi
+    return;
+
+  } // fi
+
   const _TEndEvent* endEvt = dynamic_cast< const _TEndEvent* >( &e );
   if( endEvt != NULL )
   {
@@ -241,7 +157,7 @@ Execute( const itk::Object* c, const itk::EventObject& e )
     dynamic_cast< const _TEndBacktrackingEvent* >( &e );
   if( backEvt != NULL )
   {
-    this->SetPixel( backEvt->Vertex, 0, 0, 255, 255 );
+    // TODO: 
     return;
 
   } // fi
@@ -249,6 +165,7 @@ Execute( const itk::Object* c, const itk::EventObject& e )
   if( endBackEvt != NULL )
   {
     this->m_RenderWindow->Render( );
+
     /* TODO: DEBUG
        std::cout << "Press enter: " << std::ends;
        int aux;
@@ -267,211 +184,27 @@ Image3DObserver( )
     m_RenderWindow( NULL ),
     m_RenderPercentage( double( 0.001 ) )
 {
-  this->m_Stencil = vtkSmartPointer< vtkImageData >::New( );
   this->m_PolyData = vtkSmartPointer< vtkPolyData >::New( );
   this->m_PolyDataMapper = vtkSmartPointer< vtkPolyDataMapper >::New( );
   this->m_PolyDataActor =vtkSmartPointer< vtkActor >::New( );
-}
-
-// -------------------------------------------------------------------------
-template< class F, class R >
-fpa::VTK::Image3DObserver< F, R >::
-~Image3DObserver( )
-{
-}
-
-/*
-#include <vtkCellArray.h>
-#include <vtkFloatArray.h>
-#include <vtkPointData.h>
-#include <vtkPoints.h>
-#include <vtkRenderer.h>
-#include <vtkRendererCollection.h>
 
-// -------------------------------------------------------------------------
-template< class F, class R >
-void fpa::VTK::Image3DObserver< F, R >::
-SetRenderWindow( R* rw )
-{
-  this->m_RenderWindow = rw;
-}
-
-// -------------------------------------------------------------------------
-template< class F, class R >
-void fpa::VTK::Image3DObserver< F, R >::
-Execute( const itk::Object* c, const itk::EventObject& e )
-{
-  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;
-
-  typedef typename F::TStartBacktrackingEvent _TStartBacktrackingEvent;
-  typedef typename F::TEndBacktrackingEvent   _TEndBacktrackingEvent;
-  typedef typename F::TBacktrackingEvent      _TBacktrackingEvent;
-
-  // 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 _TStartEvent* startEvt = dynamic_cast< const _TStartEvent* >( &e );
-  const _TStartBacktrackingEvent* startBackEvt =
-    dynamic_cast< const _TStartBacktrackingEvent* >( &e );
-  if( startEvt != NULL || startBackEvt != NULL )
-  {
-    // Create actor
-    _TImage::RegionType reg = image->GetLargestPossibleRegion( );
-    _TImage::SizeType siz = reg.GetSize( );
-    if( this->m_Data.GetPointer( ) == NULL )
-    {
-      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
-    return;
-
-  } // fi
-
-  const _TAliveEvent* aliveEvt = dynamic_cast< const _TAliveEvent* >( &e );
-  const _TFrontEvent* frontEvt = dynamic_cast< const _TFrontEvent* >( &e );
-  if( aliveEvt != NULL || frontEvt != NULL )
-  {
-    _TImage::IndexType vertex;
-    if( aliveEvt != NULL )
-      vertex = aliveEvt->Vertex;
-    else if( frontEvt != NULL )
-      vertex = frontEvt->Vertex;
-
-    if( this->m_Marks->GetPixel( vertex ) == -1 )
-    {
-      typename _TImage::PointType pnt;
-      image->TransformIndexToPhysicalPoint( 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( 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;
-
-  } // fi
-
-  const _TEndEvent* endEvt = dynamic_cast< const _TEndEvent* >( &e );
-  if( endEvt != NULL )
-  {
-    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
-
-  const _TBacktrackingEvent* backEvt =
-    dynamic_cast< const _TBacktrackingEvent* >( &e );
-  const _TEndBacktrackingEvent* endBackEvt =
-    dynamic_cast< const _TEndBacktrackingEvent* >( &e );
-  if( backEvt != NULL )
-  {
-      static const unsigned long nColors = 10;
-      double back_id =
-        double( backEvt->FrontId % nColors ) / double( nColors );
-      typename _TImage::PointType pnt;
-      image->TransformIndexToPhysicalPoint( backEvt->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( back_id );
-      this->m_Data->Modified( );
-      return;
-
-    } // fi
-
-    if( endBackEvt != NULL )
-    {
-      this->m_RenderWindow->Render( );
-         std::cout << "Press enter: " << std::ends;
-         int aux;
-         std::cin >> aux;
-      return;
-
-    } // fi
+  vtkSmartPointer< vtkPoints > points =
+    vtkSmartPointer< vtkPoints >::New( );
+  vtkSmartPointer< vtkCellArray > verts =
+    vtkSmartPointer< vtkCellArray >::New( );
+  this->m_PolyData->SetPoints( points );
+  this->m_PolyData->SetVerts( verts );
+  this->m_PolyDataMapper->SetInputData( this->m_PolyData );
+  this->m_PolyDataActor->SetMapper( this->m_PolyDataMapper );
+  this->m_PolyDataActor->GetProperty( )->SetColor( 0, 1, 0 );
 }
 
 // -------------------------------------------------------------------------
 template< class F, class R >
 fpa::VTK::Image3DObserver< F, R >::
-Image3DObserver( )
-  : Superclass( ),
-    m_RenderWindow( NULL ),
-    m_RenderPercentage( double( 0.0001 ) )
+~Image3DObserver( )
 {
 }
-*/
 
 #endif // __FPA__VTK__IMAGE3DOBSERVER__HXX__