// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
//
//
#include <boost/shared_ptr.hpp>
using namespace boost;
+// mkr : PAL8150
+#define SYNCPUTINSTUDY(NodesName) \
+ for ( int n = 0; n < nodes->NodesName.length(); n++ ) { \
+ SUPERV_CNode aCNode = SUPERV::CNode::_narrow(nodes->NodesName[n]); \
+ SUPERV_Ports aPortList = aCNode->Ports(); \
+ for (int p = 0; p < aPortList->length(); p++) { \
+ SUPERV::Port_ptr aPort = aPortList[p].in(); \
+ if ( !aPort->IsInput() && !aPort->IsGate() ) { \
+ bool aInStudy = dynamic_cast<SUPERVGUI_CanvasPortOut*>( aMain->getCanvas()->getPort(aPort) )->isInStudy(); \
+ dynamic_cast<SUPERVGUI_CanvasPortOut*>( getCanvas()->getPort( getDataflow()->Node(aCNode->Name())->GetOutPort(aPort->Name()) ) )->setStudyState(aInStudy); \
+ } \
+ } \
+ }
+
SUPERVGUI_Main::SUPERVGUI_Main( SUPERVGraph_ViewFrame* theParent,
SUIT_Desktop* theDesktop, SUPERV_Graph theDataFlow )
: SUPERVGraph_View(theParent),
} else {
init(theDesktop);
}
+
+ syncPutInStudy(); // mkr : PAL8150
+
// mkr : IPAL11362
connect(this, SIGNAL(EventToSync()), this, SLOT(onObjectCreatedDeleted()));
}
SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( study->application() );
objectBrowser = app->objectBrowser();
-
+
myArray = new SUPERVGUI_CanvasArray( this, resMgr() );
myArrayView = new SUPERVGUI_ArrayView( myArray, this );
myCanvas = new SUPERVGUI_Canvas( this, resMgr() );
myCanvasView = new SUPERVGUI_CanvasView(myCanvas, this);
-
+
message = app->logWindow();
notification = new NOTIFICATION_Consumer();
sync();
show();
- if ( myLogged && !myLogFileName.isEmpty() && QFile::exists( myLogFileName ) ) {
+ if ( myLogged && !myLogFileName.isEmpty() /*&& QFile::exists( myLogFileName )*/ ) { // mkr : PAL7037
myLogFile = fopen( myLogFileName.latin1(), "a" );
if ( myLogFile == NULL )
myLogged = false;
SUIT_ViewManager* aVM = it.data()->getViewManager();
STD_Application* anApp = dynamic_cast<STD_Application*>( SUIT_Session::session()->activeApplication() );
if ( anApp ) anApp->removeViewManager(aVM);
- if ( aVM ) delete aVM;
+ //if ( aVM ) delete aVM; // mkr : IPAL11547
}
mySubGraphs.clear();
fclose( myLogFile );
}
myLogFile = NULL;
- if ( myLogged && !myLogFileName.isEmpty() && QFile::exists( myLogFileName ) ) {
+ if ( myLogged && !myLogFileName.isEmpty() /*&& QFile::exists( myLogFileName )*/ ) { // mkr : PAL7037
myLogFile = fopen( myLogFileName.latin1(), "a" );
if ( myLogFile == NULL ) {
myLogged = false;
//if ( aSupMod ) aSupMod->updateObjBrowser();
//else MESSAGE("NULL Supervision module!");
+ // update "Save" icon and menu state, if dataflow is published
+ _PTR(Study) aStudy = ((SalomeApp_Study*)study)->studyDS();
+ _PTR(SObject) aSO = aStudy->FindObjectIOR(dataflow->getIOR());
+ if (aSO) SUPERVGUI_Main::setModifiedFlag();
+
if (myCurrentView == CANVASTABLE) {
myArray->sync();
myArray->update();
if ( aStudyFrame ) {
SUPERVGraph_ViewFrame* aViewFrame = dynamic_cast<SUPERVGraph_ViewFrame*>( aStudyFrame );
if( aViewFrame ) {
- /*SUPERVGUI_Main* m = */new SUPERVGUI_Main(aViewFrame,
- aSupMod->application()->desktop(),//getDesktop(),
- aGraph);
+ new SUPERVGUI_Main(aViewFrame,
+ aSupMod->application()->desktop(),//getDesktop(),
+ aGraph);
// connect(aStudyFrame, SIGNAL(sfStudyFrameClosing(QAD_StudyFrame*)),
// this, SLOT(onSubGraphClosed(QAD_StudyFrame*)));
connect(aSupMod->application()->desktop(), SIGNAL(windowActivated( SUIT_ViewWindow* )),
}
}
+// mkr : IPAL11549
+void SUPERVGUI_Main::destroySubGraph(QString theSubGraphName)
+{
+ if ( mySubGraphs.contains(theSubGraphName) ) {
+ SUIT_ViewWindow* aStudyFrame = mySubGraphs[theSubGraphName];
+ onSubGraphClosed(aStudyFrame);
+ SUIT_ViewManager* aVM = aStudyFrame->getViewManager();
+ STD_Application* anApp = dynamic_cast<STD_Application*>( SUIT_Session::session()->activeApplication() );
+ if ( anApp ) anApp->removeViewManager(aVM);
+ }
+}
+
bool SUPERVGUI_Main::eventFilter( QObject* o, QEvent* e)
{
// workaround to get close event
// mkr : PAL8237 : synchronize many views of the same dataflow (objects creation/deletion)
void SUPERVGUI_Main::onObjectCreatedDeleted()
+{
+ if ( study ) {
+ if ( LightApp_Application* app = dynamic_cast<LightApp_Application*>( study->application() ) ) {
+ ViewManagerList aVMList;
+ app->viewManagers( SUPERVGraph_Viewer::Type(), aVMList );
+ SUIT_ViewManager* aVM;
+ for ( aVM = aVMList.first(); aVM; aVM = aVMList.next() ) {
+ QPtrVector<SUIT_ViewWindow> aVWList = aVM->getViews();
+ for ( int i = 0; i < aVWList.count(); i++ ) {
+ SUPERVGraph_ViewFrame* aVW = dynamic_cast<SUPERVGraph_ViewFrame*>( aVWList[i] );
+ QObjectList* aMainList = aVW->queryList("SUPERVGUI_Main");
+ if ( aMainList->count() == 1 ) {
+ SUPERVGUI_Main* aMain = dynamic_cast<SUPERVGUI_Main*>( aMainList->first() );
+ if ( aMain ) {
+ if (aMain != this &&
+ !CORBA::is_nil(aMain->getDataflow()) &&
+ !QString(aMain->getDataflow()->getIOR()).compare(getDataflow()->getIOR())) // equal dataflows
+ aMain->getCanvas()->merge();
+ }
+ }
+ }
+ }
+
+ // update "Save" icon and menu state, if dataflow is published
+ //_PTR(Study) aStudy = ((SalomeApp_Study*)study)->studyDS();
+ //_PTR(SObject) aSO = aStudy->FindObjectIOR(dataflow->getIOR());
+ //if (aSO) SUPERVGUI_Main::setModifiedFlag();
+ }
+ }
+}
+
+// mkr : PAL8150 : synchronize many views of the same dataflow ("Put In Study"/"Not In Study" operation)
+void SUPERVGUI_Main::onPutInStudy( QString* theNodePortName )
{
if ( study ) {
if ( STD_Application* app = dynamic_cast<STD_Application*>( study->application() ) ) {
if ( aMain )
if ( !QString(aMain->getDataflow()->getIOR()).compare(getDataflow()->getIOR()) // equal dataflows
&&
- aMain != this ) // not equal mains
- aMain->getCanvas()->merge();
+ aMain != this ) { // not equal mains
+ QString aNodeName = theNodePortName->left( theNodePortName->find('_') );
+ QString aPortName = theNodePortName->right( theNodePortName->length() - theNodePortName->find('_') - 1 );
+ bool anIsInStudy = dynamic_cast<SUPERVGUI_CanvasPortOut*>( getCanvas()->getPort( getDataflow()->Node( aNodeName )->GetOutPort( aPortName ) ) )->isInStudy();
+ dynamic_cast<SUPERVGUI_CanvasPortOut*>( aMain->getCanvas()->getPort( aMain->getDataflow()->Node( aNodeName )->GetOutPort( aPortName ) ) )->setStudyState( anIsInStudy );
+ }
+ }
+ }
+ }
+ //SUPERVGUI_Main::setModifiedFlag();
+ }
+ }
+}
+
+// mkr : PAL8150 : synchronize many views of the same dataflow ("Display" operation for dataflow)
+void SUPERVGUI_Main::syncPutInStudy()
+{
+ if ( study ) {
+ if ( STD_Application* app = dynamic_cast<STD_Application*>( study->application() ) ) {
+ ViewManagerList aVMList;
+ app->viewManagers( SUPERVGraph_Viewer::Type(), aVMList );
+ SUIT_ViewManager* aVM;
+ for ( aVM = aVMList.first(); aVM; aVM = aVMList.next() ) {
+ QPtrVector<SUIT_ViewWindow> aVWList = aVM->getViews();
+ for ( int i = 0; i < aVWList.count(); i++ ) {
+ SUPERVGraph_ViewFrame* aVW = dynamic_cast<SUPERVGraph_ViewFrame*>( aVWList[i] );
+ QObjectList* aMainList = aVW->queryList("SUPERVGUI_Main");
+ if ( aMainList->count() == 1 ) {
+ SUPERVGUI_Main* aMain = dynamic_cast<SUPERVGUI_Main*>( aMainList->first() );
+ if ( aMain )
+ if ( !CORBA::is_nil( aMain->getDataflow() )
+ &&
+ !QString(aMain->getDataflow()->getIOR()).compare(getDataflow()->getIOR()) // equal dataflows
+ &&
+ aMain != this ) { // not equal mains
+
+ // check "myInStudy" field of output ports of original main (i.e. this main)
+ // and synchronize this property for nodes' output ports of dublicate main (i.e. of aMain)
+ SUPERV_Nodes nodes = aMain->getDataflow()->Nodes();
+
+ SYNCPUTINSTUDY(CNodes);
+ SYNCPUTINSTUDY(FNodes);
+ SYNCPUTINSTUDY(INodes);
+ SYNCPUTINSTUDY(GNodes);
+ SYNCPUTINSTUDY(LNodes);
+ SYNCPUTINSTUDY(ELNodes);
+ SYNCPUTINSTUDY(SNodes);
+ SYNCPUTINSTUDY(ESNodes);
+ SYNCPUTINSTUDY(Graphs);
+
+ setRunTime( aMain->getRunTime() );
+
+ break;
+ }
}
}
}
myRunTime = QDateTime::currentDateTime();
const bool result = andSuspend ? dataflow->Start() : dataflow->Run();
if ( !result ) {
- QMessageBox::warning(SUIT_Session::session()->activeApplication()->desktop(), tr("ERROR"), tr("MSG_DF_BADEXECUTE"));
+ // PAL12902
+ QMessageBox::warning(SUIT_Session::session()->activeApplication()->desktop(), tr("ERROR"), tr("MSG_DF_BADEXECUTE") + QString(" : ") + QString(dataflow->Messages()));
if ( dataflow->State() == SUPERV::ErrorState ) {
- kill();
+ // PAL12902
+ if ( !dataflow->IsEditing() ) kill();
}
}
else {
QMessageBox::warning(SUIT_Session::session()->activeApplication()->desktop(), tr("ERROR"), tr("MSG_DF_NOTRUNNING"));
}
else if (dataflow->Kill()) {
- getMessage()->putMessage( tr("MSG_GRAPH_KILLED") );
+ // IPAL9273, 9369, 9731 : to avoid two equal messages about killing dataflow
+ // execution in the Message Console
+ //getMessage()->putMessage( tr("MSG_GRAPH_KILLED") );
sync();
}
else {
void SUPERVGUI_Main::suspendResume() {
Trace("SUPERVGUI_Main::suspendResume");
+
if ((SUPERV_isNull(dataflow))) return;
if (dataflow->IsEditing()) {
case CANVAS:
case CONTROLFLOW:
{
- SUPERVGUI_CanvasNode* aNode = new SUPERVGUI_CanvasComputeNode( resMgr(), myCanvas, this, theNode);
+ SUPERVGUI_CanvasNode* aNode = SUPERVGUI_CanvasComputeNode::Create(resMgr(), myCanvas, this, theNode);
aNode->move(theNode->X(), theNode->Y());
if (myCurrentView == CONTROLFLOW) aNode->hideAll();
aNode->show();
case CANVAS:
case CONTROLFLOW:
{
- SUPERVGUI_CanvasNode* aNode = new SUPERVGUI_CanvasGotoNode( resMgr(), myCanvas, this, theNode);
+ SUPERVGUI_CanvasNode* aNode = SUPERVGUI_CanvasGotoNode::Create(resMgr(), myCanvas, this, theNode);
aNode->move(theNode->X(), theNode->Y());
if (myCurrentView == CONTROLFLOW) aNode->hideAll();
aNode->show();
/**
* Add Control node
*/
-void SUPERVGUI_Main::addControlNode(SUPERV_CNode theStartNode, SUPERV_CNode theEndNode, bool Update) {
+void SUPERVGUI_Main::addControlNode(SUPERV_CNode theStartNode, SUPERV_CNode theEndNode, bool Update)
+{
switch (myCurrentView) {
case CANVASTABLE:
myArray->destroy();
case CANVAS:
case CONTROLFLOW:
{
- SUPERVGUI_CanvasStartNode* aStartNode = new SUPERVGUI_CanvasStartNode( resMgr(), myCanvas, this, theStartNode);
+ SUPERVGUI_CanvasStartNode* aStartNode =
+ SUPERVGUI_CanvasStartNode::Create(resMgr(), myCanvas, this, theStartNode);
aStartNode->move(theStartNode->X(), theStartNode->Y());
if (myCurrentView == CONTROLFLOW) aStartNode->hideAll();
- SUPERVGUI_CanvasEndNode* aEndNode = new SUPERVGUI_CanvasEndNode( resMgr(), myCanvas, this, theEndNode, aStartNode);
+ SUPERVGUI_CanvasEndNode* aEndNode =
+ SUPERVGUI_CanvasEndNode::Create(resMgr(), myCanvas, this, theEndNode, aStartNode);
aEndNode->move(theEndNode->X(), theEndNode->Y());
if (myCurrentView == CONTROLFLOW) aEndNode->hideAll();
case CANVAS:
case CONTROLFLOW:
{
- SUPERVGUI_CanvasNode* aNode = new SUPERVGUI_CanvasMacroNode( resMgr(), myCanvas, this, theNode);
+ SUPERVGUI_CanvasNode* aNode = SUPERVGUI_CanvasMacroNode::Create(resMgr(), myCanvas, this, theNode);
aNode->move(theNode->X(), theNode->Y());
if (myCurrentView == CONTROLFLOW) aNode->hideAll();
aNode->show();
_PTR(ChildIterator) anIterator ( theStudy->NewChildIterator(theSO) );
for (; anIterator->More(); anIterator->Next()) {
if (anIterator->Value()->FindAttribute(anAttr, "AttributeName")) {
- aName = anAttr;
+ aName = _PTR(AttributeName) ( anAttr );
if (strcmp(aName->Value().c_str(), theName) == 0) {
aResult = anIterator->Value();
break;
// add new SObject
aResult = theBuilder->NewObject( theSO );
anAttr = theBuilder->FindOrCreateAttribute(aResult, "AttributeName");
- aName = anAttr;
+ aName = _PTR(AttributeName) ( anAttr );
aName->SetValue(theName);
return aResult;
}
if ( !aComponent ) { // is supervision component not found, then create it
aComponent = aBuilder->NewComponent(STUDY_SUPERVISION);
anAttr = aBuilder->FindOrCreateAttribute(aComponent, "AttributeName");
- aName = anAttr;
+ aName = _PTR(AttributeName) ( anAttr );
aName->SetValue( (( CAM_Application* )(study->application()))->moduleTitle( "SUPERV" ).latin1() );
anAttr = aBuilder->FindOrCreateAttribute(aComponent, "AttributePixMap");
// create dataflow SObject ("aNewDataflow_1")
aSO = aBuilder->NewObject(aComponent);
anAttr = aBuilder->FindOrCreateAttribute(aSO, "AttributeName");
- aName = anAttr;
+ aName = _PTR(AttributeName) ( anAttr );
aName->SetValue(dataflow->Name());
anAttr = aBuilder->FindOrCreateAttribute(aSO, "AttributeIOR");
_PTR(AttributeIOR) anIORAttr ( anAttr );
if ( !myThread->running() )
aSupMod->updateObjBrowser();
+
+ aSupMod->getApp()->updateActions();
}
else {
MESSAGE( "ERROR: failed to find or create dataflow SObject" );
aSupMod->updateObjBrowser();
}
else MESSAGE("NULL Supervision module!");
-
+
+ SalomeApp_Application* app = (SalomeApp_Application*)(SUIT_Session::session()->activeApplication());
+ if(app) app->updateActions();
isIn = false;
return true;
}
long counter;
char* date;
long stamp;
-
+
while (notification->Receive(&graph, &node, &type, &message, &sender, &counter, &date, &stamp)) {
-// if (isFiltered(graph, node, type, message, sender, counter, date, stamp)) {
+ if (isFiltered(graph, node, type, message, sender, counter, date, stamp)) { // mkr : PAL7037
QString mess("");
mess += "NOTIF: "; mess += graph;
mess += " / " ; mess += node;
mess += " / " ; mess += type;
mess += " / " ; mess += message;
getMessage()->putMessage(mess.latin1());
-// };
+ };
};
}
bool b = false;
if (strcmp(getDataflow()->Name(), graph) == 0) {
SUPERVGUI_CanvasNode* n;
- QObjectList* nodes = queryList("SUPERVGUI_CanvasNode");
+ QObjectList* nodes;
+ // mkr : PAL7037 -->
+ if (myCurrentView == CANVASTABLE)
+ nodes = myArray->queryList("SUPERVGUI_CanvasNode");
+ else
+ nodes = myCanvas->queryList("SUPERVGUI_CanvasNode");
+ // mkr : PAL7037 <--
QObjectListIt i(*nodes);
while ((n=(SUPERVGUI_CanvasNode*)i.current()) != 0) {
++i;
getCanvasArray()->resize( theEvent->size().width(), theEvent->size().height() );
}
+/*!
+ Sets a modified flag in an active study
+ */
+void SUPERVGUI_Main::setModifiedFlag()
+{
+ SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
+ if(app) {
+ SalomeApp_Study* study = dynamic_cast<SalomeApp_Study*>(app->activeStudy());
+ if(study) {
+ _PTR(Study) studyDS = study->studyDS();
+ _PTR(SComponent) sco = studyDS->FindComponent(STUDY_SUPERVISION);
+ if(sco) {
+ _PTR(StudyBuilder) builder = studyDS->NewBuilder();
+ _PTR(GenericAttribute) ga;
+ ga = builder->FindOrCreateAttribute(sco, "AttributeParameter");
+ _PTR(AttributeParameter) ap(ga);
+ if(ap) {
+ ap->SetBool("SUPERVISOR_MODIFIED_FLAG",1);
+ app->updateActions();
+ }
+ }
+ }
+ }
+}
+
+
/******************************* SUPERVGUI_Thread class ****************************************/
SUPERVGUI_Thread::SUPERVGUI_Thread()
:QThread()
{
// in case node "said" something during changing state through notification mechanism - output it
myMain->syncNotification();
+ myMain->sync(); // mkr : NPAL14881
// "kill" or undefined event came
if (( aEvent == SUPERV::UndefinedEvent && aState == SUPERV::UndefinedState ) ||
// execution is finished. just set a "finished" message(s)
if ( !myIsActive ) {
+ QString aMess;
switch ( myMain->getDataflow()->State() ) {
case SUPERV_Editing :
myMain->getMessage()->putMessage( myMain->getDataflow()->IsReadOnly()?
break;
case SUPERV_Error :
myMain->getMessage()->putMessage( tr("MSG_GRAPH_ABORTED") );
+ // PAL12866 -->
+ aMess = QString(myMain->getDataflow()->Messages());
+ if ( !aMess.isEmpty() ) {
+ myMain->getMessage()->putMessage( tr("MSG_DF_BADEXECUTE") + QString(" : ") + aMess );
+ QMessageBox::warning(SUIT_Session::session()->activeApplication()->desktop(), tr("ERROR"),
+ tr("MSG_DF_BADEXECUTE") + QString(" : ") + aMess);
+ }
+ // PAL12866 <--
break;
case SUPERV_Kill:
myMain->getMessage()->putMessage( tr("MSG_GRAPH_KILLED") );
SUPERV_CNode aNode = NULL;
SUPERV::GraphEvent aEvent = SUPERV::UndefinedEvent ;
SUPERV::GraphState aState = SUPERV::UndefinedState ;
-
+
// blocking function of Engine. Return from there only after anEvent happens on node aNode
myMain->getDataflow()->Event(aNode, aEvent, aState);
-
+
ProcessVoidEvent( new TMainRunEvent( this, &SUPERVGUI_Thread::main_thread_run,aNode, aEvent, aState ) );
} // end of while( myIsActive )
Sets data function
*/
void SUPERVGUI_DSGraphParameters::setData() {
- double aDeltaTime;
- long aTimeOut;
+ CORBA::Double aDeltaTime;
+ CORBA::Long aTimeOut;
SUPERV::KindOfDataStreamTrace aDataStreamTrace;
// myGraph->StreamParams(aTimeOut, aDataStreamTrace, aDeltaTime);
}
QDialog::accept();
}
+