Salome HOME
Fix for PAL7164: after analysis of the bug, it was found out that PublishInStudy...
authorasv <asv@opencascade.com>
Wed, 26 Jan 2005 13:38:37 +0000 (13:38 +0000)
committerasv <asv@opencascade.com>
Wed, 26 Jan 2005 13:38:37 +0000 (13:38 +0000)
If an event is "Node has successfully finished execution", then its CanvasOutPorts are analized, and if some port has "myIsInStudy" flag - then value of this port is put into study.
It fixes the bug, since execute() is called exactly once on every event (controlled by Supervisor Engine).

src/SUPERVGUI/SUPERVGUI_CanvasPort.cxx
src/SUPERVGUI/SUPERVGUI_Main.cxx

index 198c5ed0a91bcfb7ed2e2f8941b77a2c3140908f..756bd008dd9dd6fa745a758cd9f8e2a4364e8071 100644 (file)
@@ -80,7 +80,7 @@ QPopupMenu* SUPERVGUI_CanvasPort::getPopupMenu(QWidget* theParent)
                            && !myPort->Node()->IsMacro())
     popup->insertItem(tr("ITM_COPY_PORT"), this, SLOT(copy()));
 
-//int anItem = popup->insertItem(tr("MSG_BROWSE"), this, SLOT(browse()));
+  /*int anItem = */popup->insertItem(tr("MSG_BROWSE"), this, SLOT(browse()));
 //   if (getEngine()->IsLinked())
 //     popup->setItemEnabled(anItem, getEngine()->State() == SUPERV_Ready);
 //   else 
@@ -272,10 +272,17 @@ QPopupMenu* SUPERVGUI_CanvasPortOut::getPopupMenu(QWidget* theParent)
 
 void SUPERVGUI_CanvasPortOut::sync() 
 {
+  /* asv : 26.01.05 : Bug PAL7164 : sometimes CanvasPortOut::sync() is called twice (or maybe even more)
+           by mistake.  It happens because of incorrect Qt events, or other reason, but it is not a
+          stable feature (bug). Adding an object in the study in sync() is therefore called more than once
+          which is a BUG.  I decided to move call to putDataStudy() method to Event handling function.
+          When a node successfully finishes execution - check the ports and put out-value to study,
+          if the corresponding flag is set.
   bool ok = getEngine()->State() == SUPERV_Ready;
   if (ok && myInStudy) {
     myInStudy = getMain()->putDataStudy(getEngine(), STUDY_PORT_OUT);
   }
+  */
   SUPERVGUI_CanvasPort::update();
 }
 
index 0efe33ad38bc30174dd181a466150c46748ef625..667670f50c7d8459b3235889f7a5556724f19e17 100644 (file)
@@ -49,6 +49,7 @@ using namespace std;
 #include "SUPERVGUI_Notification.h"
 #include "SUPERVGUI_Information.h"
 #include "SUPERVGUI_CanvasControlNode.h"
+#include "SUPERVGUI_CanvasPort.h"
 
 #include <qvalidator.h>
 #include <qlayout.h>
@@ -228,7 +229,7 @@ void SUPERVGUI_Main::syncAsync() {
 /**
  * Called by thread when dataflow is executing
  */
-void SUPERVGUI_Main::execute(char *  theNodeName, SUPERV::GraphState theNodeState) {
+void SUPERVGUI_Main::execute( char *  theNodeName, SUPERV::GraphState theNodeState ) {
   if (myCurrentView == CANVAS || myCurrentView == CONTROLFLOW) {
     SUPERVGUI_CanvasNode* aNode = (SUPERVGUI_CanvasNode*) myCanvas->child(theNodeName, "SUPERVGUI_CanvasNode");
     if ( aNode ) {
@@ -239,6 +240,29 @@ void SUPERVGUI_Main::execute(char *  theNodeName, SUPERV::GraphState theNodeStat
     SUPERVGUI_CanvasCellNode* aNode = (SUPERVGUI_CanvasCellNode*) myArray->child(theNodeName, "SUPERVGUI_CanvasCellNode");
     if (aNode) aNode->sync();
   }
+
+  // asv : 26.01.05 : Bug PAL7164 : puting out-value to study if the "put_to_Study" flag is set on a 
+  // CanvasPort the functionality was moved from SUPERVGUI_CanvasPortOut::sync() method please, see 
+  // comment in that method for details.
+  if ( theNodeState == SUPERV::DoneState ) {
+    SUPERVGUI_CanvasNode* aNode = (SUPERVGUI_CanvasNode*) myCanvas->child(theNodeName, "SUPERVGUI_CanvasNode");
+    if ( aNode ) {
+      //cout << " *** theNode " << theNodeName << " received DONE_STATE *** " << endl;
+      SUPERVGUI_CanvasPortOut* aPortOut;
+      QObjectList* aPortList = aNode->queryList("SUPERVGUI_CanvasPortOut");
+      QObjectListIt aPortIt(*aPortList);
+      while ((aPortOut=(SUPERVGUI_CanvasPortOut*)aPortIt.current()) != 0) {
+       ++aPortIt;
+       if ( aPortOut->isInStudy() && aPortOut->getEngine()->State() == SUPERV::ReadyState ) {
+         //cout << " *** " << theNodeName << "[" << aPortOut->name() << "]--> goes into study *** " << endl;
+         putDataStudy( aPortOut->getEngine(), STUDY_PORT_OUT );
+       }
+      }
+      delete aPortList;      
+    } 
+    //else //normal case if Node is not found is when node is a graph!  it can receive DoneState as well!  
+    //  MESSAGE( "ERROR in SUPERVGUI_Main::execute() : CanvasNode \"" << theNodeName << "\" NOT FOUND in myCanvas" );
+  }
 }