]> Creatis software - FrontAlgorithms.git/blobdiff - lib/fpa/Base/Algorithm.hxx
...
[FrontAlgorithms.git] / lib / fpa / Base / Algorithm.hxx
index 3a52f789c1a60de280cc9ffedfc0b78ffbacbd2c..3a8b2d04aca27f44155f6112afc7575be1308bef 100644 (file)
@@ -6,13 +6,97 @@
 #ifndef __fpa__Base__Algorithm__hxx__
 #define __fpa__Base__Algorithm__hxx__
 
+// -------------------------------------------------------------------------
+template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
+fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent::
+TEvent( )
+  : Superclass( )
+{
+}
+
+// -------------------------------------------------------------------------
+template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
+fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent::
+TEvent( const TVertex& v, unsigned long fid, bool intoq )
+  : Superclass( ),
+    Vertex( v ),
+    FrontId( fid ),
+    IntoQueue( intoq )
+{
+}
+
+// -------------------------------------------------------------------------
+template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
+fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent::
+~TEvent( )
+{
+}
+
+// -------------------------------------------------------------------------
+template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
+const char* 
+fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent::
+GetEventName( ) const
+{
+  return( "fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent" );
+}
+
+// -------------------------------------------------------------------------
+template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
+bool
+fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent::
+CheckEvent( const itk::EventObject* e ) const
+{
+  return( dynamic_cast< const Self* >( e ) != NULL );
+}
+
+// -------------------------------------------------------------------------
+template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
+itk::EventObject* 
+fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::TEvent::
+MakeObject( ) const
+{
+  return( new Self );
+}
+
+// -------------------------------------------------------------------------
+template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
+void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
+InvokeEvent( const itk::EventObject& e )
+{
+  TEvent a;
+  if( a.CheckEvent( &e ) )
+  {
+    if( this->m_VisualDebug )
+      this->Superclass::InvokeEvent( e );
+  }
+  else
+    this->Superclass::InvokeEvent( e );
+}
+
+// -------------------------------------------------------------------------
+template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
+void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
+InvokeEvent( const itk::EventObject& e ) const
+{
+  TEvent a;
+  if( a.CheckEvent( &e ) )
+  {
+    if( this->m_VisualDebug )
+      this->Superclass::InvokeEvent( e );
+  }
+  else
+    this->Superclass::InvokeEvent( e );
+}
+
 // -------------------------------------------------------------------------
 template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
 fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
 Algorithm( )
   : Superclass( ),
     _TMarksInterface( this ),
-    _TSeedsInterface( this )
+    _TSeedsInterface( this ),
+    m_VisualDebug( false )
 {
 }
 
@@ -28,28 +112,41 @@ template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
 void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
 GenerateData( )
 {
+  this->InvokeEvent( itk::StartEvent( ) );
+
   // Init objects
+  this->_BeforeGenerateData( );
   this->_ConfigureOutput( this->m_InitValue );
-  this->_InitMarks( );
+  this->_InitMarks( this->GetSeeds( ).size( ) );
+  TNodes seeds = this->_UnifySeeds( );
+  this->_PrepareSeeds( seeds );
 
   // Init queue
   this->_QueueInit( );
-  typename TSeeds::const_iterator sIt = this->BeginSeeds( );
-  for( ; sIt != this->EndSeeds( ); ++sIt )
+  typename TNodes::const_iterator sIt = seeds.begin( );
+  for( ; sIt != seeds.end( ); ++sIt )
+  {
     this->_QueuePush( *sIt );
+    this->InvokeEvent( TEvent( sIt->Vertex, sIt->FrontId, true ) );
+
+  } // rof
 
   // Main loop
   while( this->_QueueSize( ) > 0 )
   {
     // Get next candidate
     TNode node = this->_QueuePop( );
-    if( !( this->_IsMarked( node ) ) )
+    this->InvokeEvent( TEvent( node.Vertex, node.FrontId, false ) );
+    if( !( this->_IsMarked( node.Vertex ) ) )
     {
       // Mark it
-      if( this->_Mark( node ) )
+      if( this->_Mark( node.Vertex, node.FrontId ) )
       {
+        // Update output value
+        this->_UpdateOutputValue( node );
+
         // Add neighborhood
-        TNeighborhood neighbors = this->_GetNeighbors( node );
+        TNeighborhood neighbors = this->_GetNeighbors( node.Vertex );
         typename TNeighborhood::const_iterator nIt = neighbors.begin( );
         bool coll = false;
         while( nIt != neighbors.end( ) && !coll )
@@ -57,7 +154,7 @@ GenerateData( )
           if( this->_IsMarked( *nIt ) )
           {
             // Invoke stop at collisions
-            if( this->_Collisions( node, *nIt ) )
+            if( this->_Collisions( node.Vertex, *nIt ) )
             {
               this->_QueueClear( );
               coll = true;
@@ -65,7 +162,19 @@ GenerateData( )
             } // fi
           }
           else
-            this->_QueuePush( *nIt );
+          {
+            TNode nnode;
+            nnode.Vertex = *nIt;
+            nnode.Parent = node.Vertex;
+            nnode.FrontId = node.FrontId;
+            if( this->_ComputeOutputValue( nnode ) )
+            {
+              this->_QueuePush( nnode );
+              this->InvokeEvent( TEvent( nnode.Vertex, nnode.FrontId, true ) );
+
+            } // fi
+
+          } // fi
           ++nIt;
 
         } // elihw
@@ -73,8 +182,42 @@ GenerateData( )
       } // fi
 
     } // fi
+    this->_FinishOneLoop( );
 
   } // elihw
+
+  // Finish
+  this->_AfterGenerateData( );
+  this->InvokeEvent( itk::EndEvent( ) );
+}
+
+// -------------------------------------------------------------------------
+template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
+void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
+_BeforeGenerateData( )
+{
+}
+
+// -------------------------------------------------------------------------
+template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
+void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
+_AfterGenerateData( )
+{
+}
+
+// -------------------------------------------------------------------------
+template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
+void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
+_FinishOneLoop( )
+{
+}
+
+// -------------------------------------------------------------------------
+template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
+void fpa::Base::Algorithm< _TFilter, _TMarksInterface, _TSeedsInterface >::
+_QueueInit( )
+{
+  this->_QueueClear( );
 }
 
 #endif // __fpa__Base__Algorithm__hxx__