]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkBlackBox.cxx
Clean code
[bbtk.git] / kernel / src / bbtkBlackBox.cxx
index dfdf6e5df63861b3c353e71d6e289b6e20ffdedd..ed57b5a6709cff088e79191c6d0fb6aee531a79d 100644 (file)
@@ -1,32 +1,39 @@
-/*=========================================================================                                                                               
+/*
+ # ---------------------------------------------------------------------
+ #
+ # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
+ #                        pour la SantÈ)
+ # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+ # Previous Authors : Laurent Guigues, Jean-Pierre Roux
+ # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+ #
+ #  This software is governed by the CeCILL-B license under French law and
+ #  abiding by the rules of distribution of free software. You can  use,
+ #  modify and/ or redistribute the software under the terms of the CeCILL-B
+ #  license as circulated by CEA, CNRS and INRIA at the following URL
+ #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ #  or in the file LICENSE.txt.
+ #
+ #  As a counterpart to the access to the source code and  rights to copy,
+ #  modify and redistribute granted by the license, users are provided only
+ #  with a limited warranty  and the software's author,  the holder of the
+ #  economic rights,  and the successive licensors  have only  limited
+ #  liability.
+ #
+ #  The fact that you are presently reading this means that you have had
+ #  knowledge of the CeCILL-B license and that you accept its terms.
+ # ------------------------------------------------------------------------ */
+
+
+/*=========================================================================
   Program:   bbtk
   Module:    $RCSfile: bbtkBlackBox.cxx,v $
   Language:  C++
-  Date:      $Date: 2011/07/22 17:42:50 $
-  Version:   $Revision: 1.54 $
+  Date:      $Date: 2012/11/16 08:49:01 $
+  Version:   $Revision: 1.56 $
 =========================================================================*/
 
-/* ---------------------------------------------------------------------
-
-* Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
-* Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
-*
-*  This software is governed by the CeCILL-B license under French law and 
-*  abiding by the rules of distribution of free software. You can  use, 
-*  modify and/ or redistribute the software under the terms of the CeCILL-B 
-*  license as circulated by CEA, CNRS and INRIA at the following URL 
-*  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html 
-*  or in the file LICENSE.txt.
-*
-*  As a counterpart to the access to the source code and  rights to copy,
-*  modify and redistribute granted by the license, users are provided only
-*  with a limited warranty  and the software's author,  the holder of the
-*  economic rights,  and the successive licensors  have only  limited
-*  liability. 
-*
-*  The fact that you are presently reading this means that you have had
-*  knowledge of the CeCILL-B license and that you accept its terms.
-* ------------------------------------------------------------------------ */                                                                         
+
 
 /**
  *  \file 
@@ -48,8 +55,8 @@
 
 namespace bbtk
 {
-  static bool bbmgSomeBoxExecuting = false;
-  static bool bbmgFreezeExecution = false;
+  static bool bbmgSomeBoxExecuting     = false;
+  static bool bbmgFreezeExecution      = false;
   static std::set<BlackBox::WeakPointer> bbmgExecutionList;
 
   //=========================================================================
@@ -86,14 +93,10 @@ namespace bbtk
        if (!pack.expired()) 
          {
            Package::ReleaseBlackBoxDescriptor(pack,desc);
-         }
-       else 
-         {
+         }     else {
            bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : descriptor package expired (was not held by a package and the box was the last instance)"<<std::endl);
          }
-      }
-    else
-      {
+      } else {
        bbtkDebugMessage("object",2,"##> BlackBox::Deleter(\""<<name<<"\") : descriptor expired : nothing to do (was not held by a package or the box is a complex black box prototype)"<<std::endl);
       }
     bbtkDebugMessage("object",2,"<## BlackBox::Deleter(\""<<name<<"\")"<<std::endl);
@@ -109,6 +112,7 @@ namespace bbtk
     bbmExecuting(false),
     bbmName(name),
     bbmBoxProcessMode("Pipeline"),
+       bbLetRecursiveExecuteManualMode(false),
     bbmParent()
     
   {
@@ -135,6 +139,7 @@ namespace bbtk
     bbmExecuting(false),
     bbmName(name), 
     bbmBoxProcessMode(from.bbmBoxProcessMode),
+       bbLetRecursiveExecuteManualMode(false),
     bbmParent()
     
   {
@@ -178,13 +183,11 @@ namespace bbtk
   std::string BlackBox::bbGetNameWithParent() const
   {
     if (bbmParent.lock()) 
-      {
-       return bbmParent.lock()->bbGetNameWithParent() + ":" + bbmName;
-      }
-    else 
-      {
-       return bbmName;
-      }
+       {
+               return bbmParent.lock()->bbGetNameWithParent() + ":" + bbmName;
+       } else {
+               return bbmName;
+    }
   } 
   //=========================================================================
 
@@ -378,13 +381,19 @@ namespace bbtk
         (p == "F") || (p == "f") ||
         (p == "Flash") || (p == "flash") ) return Flash;
     */
-    bbtkError(bbGetFullName()<<" : BoxProcessMode value '"<<p
+
+         if ( (p == "3") ||
+          (p == "M") || (p == "m") ||
+          (p == "Manual") || (p == "manual") ) return bbManual;
+         
+         bbtkError(bbGetFullName()<<" : BoxProcessMode value '"<<p
              <<"' unknown. Possible values : "
              <<"'0'/'P'/'p'/'Pipeline'/'pipeline' | "
              <<"'1'/'A'/'a'/'Always'/'always' | "
              <<"'2'/'R'/'r'/'Reactive'/'reactive'"
              //      <<"'3'/'F'/'f'/'Flash'/'flash'"
-             <<std::endl);
+             <<"'3'/'M'/'m'/'Manual'/'manual'"
+                 <<std::endl);
   }
   //=========================================================================
   
@@ -403,7 +412,13 @@ namespace bbtk
   //=========================================================================
 
 
-
+       //=========================================================================
+       bool  BlackBox::bbBoxProcessModeIsManual() const
+       {
+               return (bbGetBoxProcessModeValue() == bbManual);
+       }
+       //=========================================================================
+       
 
   //=========================================================================
   void BlackBox::bbAddOutputObserver(const std::string& output, 
@@ -442,17 +457,32 @@ namespace bbtk
       }
     */
 
+
     OutputConnectorMapType::const_iterator o;  
     for ( o = bbGetOutputConnectorMap().begin(); 
          o != bbGetOutputConnectorMap().end(); ++o )                   
-      {                                                                        
-       if (o->second->GetStatus()==UPTODATE) 
+      {
+
+
+       if (o->first=="BoxChange")
+       {
+               o->second->SetStatus(UPTODATE);
+       }
+
+
+
+//EED 24/08/2015
+// EED CASPITAS 2
+       if (o->second->GetStatus()==UPTODATE)
+//     if ((o->second->GetStatus()==UPTODATE) || (o->second->GetStatus()==OUTOFDATE))
+//     if ((o->second->GetStatus()==UPTODATE) || (o->second->GetStatus()==MODIFIED))
          {
            o->second->SetStatus(OUTOFDATE);
            o->second->SignalChange(GetThisPointer<BlackBox>(),o->first); 
-         }
-       }                                                               
+         } // if
+       } // for                                                        
     
+
     if (  ( bbBoxProcessModeIsReactive()
           || (c==bbGetInputConnectorMap().find("BoxExecute")->second))
           && (bbCanReact() ) )
@@ -460,7 +490,7 @@ namespace bbtk
        bbtkBlackBoxDebugMessage("change",2,
                         "-> Execution triggered by Reactive mode or BoxExecute input change"<<std::endl);
         bbGlobalAddToExecutionList( GetThisPointer<BlackBox>() );
-      }    
+      } // if
     bbtkBlackBoxDebugMessage("change",5,
                             "<= BlackBox::bbSetStatusAndPropagate(input)"
                             <<std::endl);
@@ -619,9 +649,22 @@ namespace bbtk
     // If force is true then update is triggered even if the box is UPTODATE
     //    if (force) bbSetModifiedStatus();
 
+       if ( bbBoxProcessModeIsManual() ) 
+       {
+               bbLetRecursiveExecuteManualMode = true;
+    }
+         
+         
     // Calls the main recursive execution method 
     bbRecursiveExecute(Connection::Pointer());
 
+         
+       if ( bbBoxProcessModeIsManual() ) 
+       {
+               bbLetRecursiveExecuteManualMode = false;
+       }
+         
+         
     bbtkBlackBoxDebugMessage("process",2,
                             "<= BlackBox::bbExecute()"
                             <<std::endl);
@@ -664,12 +707,12 @@ namespace bbtk
                        <<std::endl);
 
     // If already executing : return
-    if (bbGetExecuting()) 
-      {
-       bbtkBlackBoxDebugMessage("process",3,
+       if (bbGetExecuting()) 
+       {
+               bbtkBlackBoxDebugMessage("process",3,
                         " -> already executing : abort"<<std::endl);
-       return; 
-      }
+               return; 
+       }
     
     // If not initialized do it
     bbInitializeProcessing();
@@ -682,23 +725,43 @@ namespace bbtk
     this->bbCreateWindow();
     
     // Updates its inputs
-    IOStatus s = bbUpdateInputs();
-    
-    if ( (s != UPTODATE) ||
-        bbBoxProcessModeIsAlways() )
+         
+//       IOStatus s;
+         IOStatus s=UPTODATE;
+//       IOStatus s=OUTOFDATE;
+//       IOStatus s=MODIFIED;
+                 
+
+         if ( ( bbBoxProcessModeIsManual()==false )  || 
+                  ( (bbBoxProcessModeIsManual()==true) && (bbLetRecursiveExecuteManualMode==true) ) )
+         {
+                 s = bbUpdateInputs();
+         }       
+                 
+    if ( (s != UPTODATE) ||  bbBoxProcessModeIsAlways() )
       {
          // Displays the window (WxBlackbox)
          //    bbShowWindow(caller);
 
          // Actual processing (virtual)
-         this->bbProcess();
-       
-       
-         // Update the I/O statuses
-         bbComputePostProcessStatus();
-      }
-    else 
-      {
+                 if ( ( bbBoxProcessModeIsManual()==false )  || 
+                          ( (bbBoxProcessModeIsManual()==true)&&(bbLetRecursiveExecuteManualMode==true) ) 
+                        )
+                       {
+ printf("EED BlackBox::bbRecursiveExecute bbProcess start %s \n", bbGetFullName().c_str() );
+                               this->bbProcess();              
+ printf("EED BlackBox::bbRecursiveExecute bbProcess end %s \n", bbGetFullName().c_str() );
+                   } // Manual analysis
+                 
+//EED ups                      if ((bbBoxProcessModeIsManual()==true) && (bbLetRecursiveExecuteManualMode==false))
+//EED ups                      {
+//EED ups                        bbSignalOutputModification(true);
+//EED ups                      }
+                 
+                 
+                 // Update the I/O statuses
+                 bbComputePostProcessStatus();
+      }  else  {
        // Test output status...
        OutputConnectorMapType::iterator o;
        for ( o = bbGetOutputConnectorMap().begin(); 
@@ -710,11 +773,11 @@ namespace bbtk
                            <<"all inputs are Up-to-date but output '"
                            <<o->first<<"' is Out-of-date ???");
              }
-         }
+         } // for
        
         bbtkBlackBoxDebugMessage("process",3," -> Up-to-date : nothing to do"
                         <<std::endl);
-      }
+      } // if
 
     // Shows the window if the black box has one
     this->bbShowWindow(); 
@@ -809,7 +872,19 @@ namespace bbtk
     for ( o = bbGetOutputConnectorMap().begin(); 
          o!= bbGetOutputConnectorMap().end(); ++o) 
       {
-       o->second->SetStatus(new_output_status);
+               
+//EED            if  ( ( bbBoxProcessModeIsManual()==false )  || 
+//EED                      ( (bbBoxProcessModeIsManual()==true) && (bbLetRecursiveExecuteManualMode==true) ) 
+//EED                    )
+//EED            {
+                         o->second->SetStatus(new_output_status);
+//EED            }  else  {
+//EED                    if  (( (bbBoxProcessModeIsManual()==true) && (bbLetRecursiveExecuteManualMode==false) )  ) 
+//EED                    {
+//EED                            o->second->SetStatus(UPTODATE);
+//EED                    }
+//EED            } // Manual analysis
+                         
       }
 
     bbtkBlackBoxDebugMessage("process",4,
@@ -1402,6 +1477,7 @@ namespace bbtk
                         <<std::endl);     
      
      bbmgGlobalProcessingExecutionList = false;
+
      
    }
   //=========================================================================