]> SALOME platform Git repositories - modules/yacs.git/blobdiff - src/engine/ForLoop.cxx
Salome HOME
[EDF27816] Management of double foreach and management of proxyfile lifecycle
[modules/yacs.git] / src / engine / ForLoop.cxx
index 31b5c36a1e999cfe64aaf2c90ab77d92fcd9f5ba..79c2b0dfae5e0a74281873d4da271c76911e0651 100644 (file)
@@ -1,9 +1,9 @@
-// Copyright (C) 2006-2012  CEA/DEN, EDF R&D
+// Copyright (C) 2006-2023  CEA, EDF
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -67,7 +67,7 @@ Node *ForLoop::simpleClone(ComposedNode *father, bool editionOnly) const
   return new ForLoop(*this,father,editionOnly);
 }
 
-InputPort* ForLoop::getInputPort(const std::string& name) const throw(YACS::Exception)
+InputPort* ForLoop::getInputPort(const std::string& name) const
 {
     if(name == NAME_OF_NSTEPS_NUMBER)return (InputPort*)&_nbOfTimesPort;
     return Loop::getInputPort(name);
@@ -91,6 +91,7 @@ void ForLoop::init(bool start)
   Any* tmp=AtomAny::New(_nbOfTurns);
   _indexPort.put(tmp);
   tmp->decrRef();
+  exUpdateProgress();
 }
 
 //! Update the state of the for loop
@@ -145,6 +146,7 @@ void ForLoop::exUpdateState()
 YACS::Event ForLoop::updateStateOnFinishedEventFrom(Node *node)
 {
   DEBTRACE("ForLoop::updateStateOnFinishedEventFrom " << node->getName());
+  exUpdateProgress();
   if((++_nbOfTurns)>=_nbOfTimesPort.getIntValue())
     {
       setState(YACS::DONE);
@@ -162,6 +164,12 @@ YACS::Event ForLoop::updateStateOnFinishedEventFrom(Node *node)
   return YACS::NOEVENT;
 }
 
+void ForLoop::exUpdateProgress()
+{
+  // emit notification to all observers registered with the dispatcher on any change of the node's state
+  sendEvent("progress");
+}
+
 void ForLoop::accept(Visitor *visitor)
 {
   visitor->visitForLoop(this);
@@ -174,14 +182,14 @@ std::list<InputPort *> ForLoop::getLocalInputPorts() const
   return ret;
 }
 
-OutPort *ForLoop::getOutPort(const std::string& name) const throw(YACS::Exception)
+OutPort *ForLoop::getOutPort(const std::string& name) const
 {
   if(name==NAME_OF_INDEX)
     return (OutPort *)&_indexPort;
   return Loop::getOutPort(name);
 }
 
-OutputPort *ForLoop::getOutputPort(const std::string& name) const throw(YACS::Exception)
+OutputPort *ForLoop::getOutputPort(const std::string& name) const
 {
   if(name==NAME_OF_INDEX)
     return (OutputPort *)&_indexPort;
@@ -257,3 +265,51 @@ std::list<OutputPort *> ForLoop::getSetOfOutputPort() const
   return ret;
 }
 
+
+int ForLoop::getNbSteps() const
+{
+  AnyInputPort* aNbStepsPort = (AnyInputPort*)&_nbOfTimesPort;
+  int nbSteps = 0;
+  if (aNbStepsPort && !aNbStepsPort->isEmpty())
+    nbSteps = aNbStepsPort->getIntValue();
+  return nbSteps;
+}
+
+std::string ForLoop::getProgress() const
+{
+  std::stringstream aProgress;
+  aProgress << "0";
+  int nbSteps = getNbSteps();
+  if (nbSteps > 0 && _nbOfTurns >= 0)
+    {
+      aProgress.str("");
+      aProgress << _nbOfTurns << "/" << nbSteps;
+    }
+  return aProgress.str();
+}
+
+//! Get the progress weight for all elementary nodes
+/*!
+ * Only elementary nodes have weight. For each node in the loop, the weight done is multiplied
+ * by the number of steps done and the weight total by the number total of steps
+ *
+ */
+list<ProgressWeight> ForLoop::getProgressWeight() const
+{
+  list<ProgressWeight> ret;
+  list<Node *> setOfNode=edGetDirectDescendants();
+  int nbStepsDone=getNbOfTurns();
+  int nbStepsTotal=getNbSteps();
+  for(list<Node *>::const_iterator iter=setOfNode.begin();iter!=setOfNode.end();iter++)
+    {
+      list<ProgressWeight> myCurrentSet=(*iter)->getProgressWeight();
+        for(list<ProgressWeight>::iterator iter=myCurrentSet.begin();iter!=myCurrentSet.end();iter++)
+          {
+            (*iter).weightDone=((*iter).weightTotal) * nbStepsDone;
+            (*iter).weightTotal*=nbStepsTotal;
+          }
+        ret.insert(ret.end(),myCurrentSet.begin(),myCurrentSet.end());
+    }
+  return ret;
+}
+