X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSupervision%2FGraph_Impl.cxx;h=bbc0feca64336ecf870de88d2193f2b0efb15b24;hb=1f25d68b3c1179622df53d4403b253d3e0fb52da;hp=b6aee77e1bd8cb40d387be9bf2718c5316d2d8e0;hpb=b27a45845d224c2c005c02bcccb780df2cb7ea0f;p=modules%2Fsuperv.git diff --git a/src/Supervision/Graph_Impl.cxx b/src/Supervision/Graph_Impl.cxx index b6aee77..bbc0fec 100644 --- a/src/Supervision/Graph_Impl.cxx +++ b/src/Supervision/Graph_Impl.cxx @@ -17,7 +17,7 @@ // 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 // // // @@ -400,16 +400,31 @@ SUPERV::CNode_ptr Graph_Impl::CNode( const SALOME_ModuleCatalog::Service &NodeSe SUPERV::FNode_ptr Graph_Impl::FNode( const char * NodeComponentName , const char * NodeInterfaceName , - const SALOME_ModuleCatalog::Service &NodeService ) { + const SALOME_ModuleCatalog::Service &NodeService , + const SALOME_ModuleCatalog::ImplType ImplType ) { beginService( "Graph_Impl::FNode" ); SUPERV::FNode_var iobject = SUPERV::FNode::_nil() ; + bool isCimpl = true; + switch (ImplType) + { + case SALOME_ModuleCatalog::PY: + isCimpl = false; + break; + case SALOME_ModuleCatalog::SO: + case SALOME_ModuleCatalog::EXE: + default: + ; + } if ( DataFlowEditor()->IsEditing() && !DataFlowEditor()->IsReadOnly() && !IsMacro() ) { FNode_Impl * myNode = new FNode_Impl( _Orb , _Poa , _ContId , instanceName() , interfaceName() , DataFlowEditor() , NodeService , NodeComponentName , - NodeInterfaceName ) ; + NodeInterfaceName , + NULLSTRING , + SUPERV::FactoryNode , + isCimpl ) ; if ( myNode->DataFlowNode() ) { PortableServer::ObjectId * id = myNode->getId() ; CORBA::Object_var obj = _poa->id_to_reference(*id); @@ -512,12 +527,12 @@ SUPERV::LNode_ptr Graph_Impl::LNode( const char * InitName , SALOME_ModuleCatalog::Service aVoidService = SALOME_ModuleCatalog::Service() ; char * anEndName ; if ( strlen( InitName ) ) { - anEndName = new char( 3 + strlen( InitName ) + 1 ) ; + anEndName = new char[ 3 + strlen( InitName ) + 1 ]; strcpy( anEndName , "End" ) ; strcat( anEndName , InitName ) ; } else { - anEndName = new char( 3 + strlen( "Loop" ) + 1 ) ; + anEndName = new char[ 3 + strlen( "Loop" ) + 1 ]; strcpy( anEndName , "EndLoop" ) ; } ELNode_Impl * myEndNode = new ELNode_Impl( _Orb , _Poa , _ContId , @@ -585,10 +600,11 @@ SUPERV::SNode_ptr Graph_Impl::SNode( const char * FuncName , myEndNode->SetObjRef( SUPERV::ESNode::_duplicate( iendobject ) ) ; myNode->SetCoupled( myEndNode->BaseNode()->Name() ) ; myEndNode->SetCoupled( myNode->BaseNode()->Name() ) ; - if ( !Link( myNode->Port( "Default" ) , myEndNode->Port( "Default" ) ) ) { - iobject = SUPERV::SNode::_nil() ; - iendobject = SUPERV::ESNode::_nil() ; - } +//JR NPAL14793 05.02.2007 : do not add that link +// if ( !Link( myNode->Port( "Default" ) , myEndNode->Port( "Default" ) ) ) { +// iobject = SUPERV::SNode::_nil() ; +// iendobject = SUPERV::ESNode::_nil() ; +// } } } anEndOfSwitch = SUPERV::ESNode::_duplicate( iendobject ) ; @@ -808,6 +824,7 @@ SUPERV::Graph_var Graph_Impl::LoadDataFlows( GraphExecutor::DataFlow * aDataFlow GraphExecutor::DataFlow * aMacroGraphExecutor ; CreateExecutor( _Orb , instanceName() , aMacroGraphName , SUPERV::DataStreamGraph , dbgfile , &aMacroGraphExecutor ); + theAutomaton->Executed() ; // Decrement _GraphExecutingNumber for MacroSubGraph // set GraphMacroLevel for Executor's graph GraphBase::Graph* aMacroGraphExe = aMacroGraphExecutor->Graph(); @@ -1035,35 +1052,40 @@ SUPERV::Graph_ptr Graph_Impl::GraphMNode( SUPERV::Graph_ptr myMacroGraph ) { aDataFlowNode->SetObjRef( SUPERV::CNode::_duplicate( SUPERV::CNode::_narrow( obj ) ) ) ; aDataFlowNode->SetObjImpl( this ) ; + GraphBase::Graph * aSubGraph = NULL ; // GraphBase::Graph * aGraph = DataFlowEditor()->Automaton()->MapGraph( myMacroGraph->Name() ) ; - GraphBase::Graph * aGraph ; //DataFlowEditor()->Automaton()->GraphBase( &aGraph ) ; +//JR 20.09.2005 Debug SAB_data_1609_bugPAL.py from CEA (Anthony) +// Graph_Impl * aSubGraphImpl = dynamic_cast( _Poa->id_to_servant( *myMacroGraph->_Id ) ) ; + myMacroGraph->ping() ; + Graph_Impl * aSubGraphImpl = theAutomaton->GraphImpl() ; + aSubGraph = aSubGraphImpl->DataFlowEditor()->Graph() ; myMacroGraph->Coupled() ; GraphBase::Graph * aGraphOfMacroGraph = myMacroNode->DataFlowEditor()->Graph() ; GraphBase::Graph * aMacroGraph = myMacroNode->DataFlowNode()->GraphMacroNode() ; aMacroGraph->Kind( SUPERV::MacroNode ) ; aMacroGraph->GraphEditor( DataFlowEditor() ) ; // Creation of the Ports of the MacroNode from the ports of the GraphMacroNode - aMacroGraph->SetMacroPorts( aGraph ) ; + aMacroGraph->SetMacroPorts( aSubGraph ) ; // Valid ==> creation of Service and the ports of the current Graph DataFlowEditor()->IsValid() ; // Set the Input Datas from the GraphMacroNode to the current Graph - aMacroGraph->SetMacroDatas( aGraph , aGraphOfMacroGraph ) ; + aMacroGraph->SetMacroDatas( aSubGraph , aGraphOfMacroGraph ) ; // aMacroGraphDataFlowEditor->UnValid() ; - aGraph->GraphEditor()->UnValid() ; + aSubGraph->GraphEditor()->UnValid() ; // Set the MacroNode ObjRef in the GraphMacroNode - aGraph->CoupledNode( aMacroGraph ) ; - aGraph->MacroObject( SUPERV::Graph::_duplicate( macroiobject ) ) ; + aSubGraph->CoupledNode( aMacroGraph ) ; + aSubGraph->MacroObject( SUPERV::Graph::_duplicate( macroiobject ) ) ; // Set the GraphMacroNode ObjRef in the MacroNode aDataFlowNode->GraphMacroNode()->GraphMacroLevel( aGraphOfMacroGraph->GraphMacroLevel() + 1 ) ; - aMacroGraph->CoupledNode( aGraph ) ; + aMacroGraph->CoupledNode( aSubGraph ) ; aMacroGraph->MacroObject( SUPERV::Graph::_duplicate( iobject ) ) ; -// aDataFlowNode->CoupledNode( aGraph ) ; +// aDataFlowNode->CoupledNode( aSubGraph ) ; // aDataFlowNode->ComputingNode()->MacroObject( SUPERV::Graph::_duplicate( iobject ) ) ; // Set the MacroLevel of that graph - aGraph->GraphMacroLevel( aGraphOfMacroGraph->GraphMacroLevel() + 1 ) ; + aSubGraph->GraphMacroLevel( aGraphOfMacroGraph->GraphMacroLevel() + 1 ) ; aMacroGraph->Coordinates( 0 , 0 ) ; - MESSAGE( aGraph->Name() << "->CoupledNode()->GraphEditor() : " << aGraph->CoupledNode()->GraphEditor() ) ; + MESSAGE( aSubGraph->Name() << "->CoupledNode()->GraphEditor() : " << aSubGraph->CoupledNode()->GraphEditor() ) ; MESSAGE( aMacroGraph->Name() << "->CoupledNode()->GraphEditor() : " << aMacroGraph->CoupledNode()->GraphEditor() ) ; MESSAGE( "DataFlowNode Graph " << this << " DataFlowEditor " << DataFlowEditor() << " aDataFlowNode " @@ -1734,16 +1756,16 @@ bool Graph_Impl::IsReadOnly() { return RetVal ; } -long Graph_Impl::LevelMax() { +CORBA::Long Graph_Impl::LevelMax() { // beginService( "Graph_Impl::LevelMax" ); - long RetVal = 0 ; + CORBA::Long RetVal = 0 ; if ( !IsMacro() ) { RetVal = DataFlowEditor()->LevelMax() ; } // endService( "Graph_Impl::LevelMax" ); return RetVal ; } -SUPERV::ListOfNodes * Graph_Impl::LevelNodes(long aLevel ) { +SUPERV::ListOfNodes * Graph_Impl::LevelNodes(CORBA::Long aLevel ) { // beginService( "Graph_Impl::LevelNodes" ); SUPERV::ListOfNodes_var RetVal = new SUPERV::ListOfNodes; if ( !IsMacro() ) { @@ -1769,27 +1791,27 @@ SUPERV::ListOfNodes * Graph_Impl::LevelNodes(long aLevel ) { // endService( "Graph_Impl::LevelNodes" ); return ( RetVal._retn() ) ; } -long Graph_Impl::ThreadsMax() { +CORBA::Long Graph_Impl::ThreadsMax() { // beginService( "Graph_Impl::ThreadsMax" ); - long RetVal = 0 ; + CORBA::Long RetVal = 0 ; if ( !IsMacro() ) { RetVal = DataFlowEditor()->ThreadsMax() ; } // endService( "Graph_Impl::ThreadsMax" ); return RetVal ; } -long Graph_Impl::Threads() { +CORBA::Long Graph_Impl::Threads() { // beginService( "Node_Impl::Threads" ); - long RetVal = false ; + CORBA::Long RetVal = false ; if ( !IsMacro() ) { RetVal = DataFlowExecutor()->Threads() ; } // endService( "Node_Impl::Threads" ); return RetVal ; } -long Graph_Impl::SuspendedThreads() { +CORBA::Long Graph_Impl::SuspendedThreads() { // beginService( "Node_Impl::SuspendedThreads" ); - long RetVal = false ; + CORBA::Long RetVal = false ; if ( !IsMacro() ) { RetVal = DataFlowExecutor()->SuspendedThreads() ; } @@ -1799,6 +1821,13 @@ long Graph_Impl::SuspendedThreads() { bool Graph_Impl::Begin() { bool RetVal = false ; + // mkr : IPAL11408 : "Run()" method returns "0" after trying to start graph execution. + // If we call Run() method from Python script two times for one graph, we have to be sure, + // that first execution of this graph ended (i.e. GraphEditor::DataFlow::Editing() method was called). + // Otherwise, the second call of Run() method will return 0. Therefore, we have to waiting for + // the first execution finish. + // NB! From GUI we cann't run dataflow if its previous execution not finished. + while ( !DataFlowEditor()->IsEditing() ) {} // waiting for the previous execution of this graph ended if ( DataFlowEditor()->IsEditing() ) { if ( pthread_mutex_lock( &_MutexExecutorWait ) ) { perror("pthread_mutex_lock _MutexExecutorWait") ; @@ -2005,9 +2034,9 @@ bool Graph_Impl::EventW( SUPERV::CNode_out aNode , return RetVal ; } -long Graph_Impl::EventQSize() { +CORBA::Long Graph_Impl::EventQSize() { // beginService( "Graph_Impl::EventQSize" ); - long QSize = -1 ; + CORBA::Long QSize = -1 ; if ( pthread_mutex_lock( &_MutexExecutorWait ) ) { perror("pthread_mutex_lock _MutexExecutorWait") ; exit( 0 ) ; @@ -2023,13 +2052,13 @@ long Graph_Impl::EventQSize() { return QSize ; } -long Graph_Impl::LastLevelDone() { +CORBA::Long Graph_Impl::LastLevelDone() { // beginService( "Graph_Impl::LastLevelDone" ); if ( pthread_mutex_lock( &_MutexExecutorWait ) ) { perror("pthread_mutex_lock _MutexExecutorWait") ; exit( 0 ) ; } - long RetVal = 0 ; + CORBA::Long RetVal = 0 ; if ( DataFlowExecutor() && !IsMacro() ) { RetVal = DataFlowExecutor()->LastLevelDone() ; } @@ -2041,9 +2070,9 @@ long Graph_Impl::LastLevelDone() { return RetVal ; } -long Graph_Impl::SubGraphsNumber() { +CORBA::Long Graph_Impl::SubGraphsNumber() { // beginService( "Graph_Impl::SubGraphsNumber" ); - long RetVal = 0 ; + CORBA::Long RetVal = 0 ; if ( DataFlowEditor()->IsExecutable() && !IsMacro() ) { RetVal = DataFlowEditor()->SubGraphsNumber() ; } @@ -2051,7 +2080,7 @@ long Graph_Impl::SubGraphsNumber() { return RetVal ; } -SUPERV::ListOfNodes * Graph_Impl::SubGraphsNodes( const long aSubGraphNumber ) { +SUPERV::ListOfNodes * Graph_Impl::SubGraphsNodes( CORBA::Long aSubGraphNumber ) { beginService( "Graph_Impl::SubGraphsNodes" ); SUPERV::ListOfNodes_var RetVal = new SUPERV::ListOfNodes ; if ( DataFlowEditor()->IsEditing() && !IsMacro() ) { @@ -2171,9 +2200,12 @@ bool Graph_Impl::Merge(const SUPERV::Graph_ptr aGraph , map< string , int > & aM if ( RetVal ) { for ( i = 0 ; i < (int ) aGraphNodes->FNodes.length() ; i++ ) { SUPERV::FNode_var aNode = (aGraphNodes->FNodes)[ i ] ; + SALOME_ModuleCatalog::ImplType implType = SALOME_ModuleCatalog::SO; + if (!aNode->IsCimpl()) implType = SALOME_ModuleCatalog::PY; SUPERV::FNode_ptr myNode = FNode( aNode->GetComponentName() , aNode->GetInterfaceName() , - *(aNode->Service()) ) ; + *(aNode->Service()) , + implType ) ; // mkr : PAL11273 if ( !CORBA::is_nil( myNode ) ) { myNode->SetName( aNode->Name() ) ; myNode->SetAuthor( aNode->Author() ) ; @@ -2228,10 +2260,10 @@ bool Graph_Impl::Merge(const SUPERV::Graph_ptr aGraph , map< string , int > & aM SUPERV::ListOfStreamPorts myStreamPorts = *(aNode->StreamPorts()) ; for ( j = 0 ; j < (int ) myStreamPorts.length() ; j++ ) { if ( myStreamPorts[ j ]->IsInput() ) { - aPort = myNode->InStreamPort( myStreamPorts[ j ]->Name() , StringToDataStreamType( myStreamPorts[ j ]->Type() ) , myStreamPorts[ j ]->Dependency() ) ; + aPort = myNode->InStreamPort( myStreamPorts[ j ]->Name(), myStreamPorts[ j ]->Type(), myStreamPorts[ j ]->Dependency() ) ; } else { - aPort = myNode->OutStreamPort( myStreamPorts[ j ]->Name() , StringToDataStreamType( myStreamPorts[ j ]->Type() ) , myStreamPorts[ j ]->Dependency() ) ; + aPort = myNode->OutStreamPort( myStreamPorts[ j ]->Name(), myStreamPorts[ j ]->Type(), myStreamPorts[ j ]->Dependency() ) ; } } } @@ -2270,10 +2302,10 @@ bool Graph_Impl::Merge(const SUPERV::Graph_ptr aGraph , map< string , int > & aM SUPERV::ListOfStreamPorts myStreamPorts = *(aNode->StreamPorts()) ; for ( j = 0 ; j < (int ) myStreamPorts.length() ; j++ ) { if ( myStreamPorts[ j ]->IsInput() ) { - aPort = myNode->InStreamPort( myStreamPorts[ j ]->Name() , StringToDataStreamType( myStreamPorts[ j ]->Type() ) , myStreamPorts[ j ]->Dependency() ) ; + aPort = myNode->InStreamPort( myStreamPorts[ j ]->Name(), myStreamPorts[ j ]->Type(), myStreamPorts[ j ]->Dependency() ) ; } else { - aPort = myNode->OutStreamPort( myStreamPorts[ j ]->Name() , StringToDataStreamType( myStreamPorts[ j ]->Type() ) , myStreamPorts[ j ]->Dependency() ) ; + aPort = myNode->OutStreamPort( myStreamPorts[ j ]->Name(), myStreamPorts[ j ]->Type(), myStreamPorts[ j ]->Dependency() ) ; } } } @@ -2319,10 +2351,10 @@ bool Graph_Impl::Merge(const SUPERV::Graph_ptr aGraph , map< string , int > & aM SUPERV::ListOfStreamPorts myStreamPorts = *(aNode->StreamPorts()) ; for ( j = 0 ; j < (int ) myStreamPorts.length() ; j++ ) { if ( myStreamPorts[ j ]->IsInput() ) { - aPort = myNode->InStreamPort( myStreamPorts[ j ]->Name() , StringToDataStreamType( myStreamPorts[ j ]->Type() ) , myStreamPorts[ j ]->Dependency() ) ; + aPort = myNode->InStreamPort( myStreamPorts[ j ]->Name(), myStreamPorts[ j ]->Type(), myStreamPorts[ j ]->Dependency() ) ; } else { - aPort = myNode->OutStreamPort( myStreamPorts[ j ]->Name() , StringToDataStreamType( myStreamPorts[ j ]->Type() ) , myStreamPorts[ j ]->Dependency() ) ; + aPort = myNode->OutStreamPort( myStreamPorts[ j ]->Name(), myStreamPorts[ j ]->Type(), myStreamPorts[ j ]->Dependency() ) ; } } } @@ -2338,10 +2370,10 @@ bool Graph_Impl::Merge(const SUPERV::Graph_ptr aGraph , map< string , int > & aM SUPERV::ListOfStreamPorts myStreamLoopPorts = *(myEndOfLoop->StreamPorts()) ; for ( j = 0 ; j < (int ) myStreamLoopPorts.length() ; j++ ) { if ( myStreamLoopPorts[ j ]->IsInput() ) { - aPort = myNode->InStreamPort( myStreamLoopPorts[ j ]->Name() , StringToDataStreamType( myStreamLoopPorts[ j ]->Type() ) , myStreamLoopPorts[ j ]->Dependency() ) ; + aPort = myNode->InStreamPort( myStreamLoopPorts[ j ]->Name(), myStreamLoopPorts[ j ]->Type(), myStreamLoopPorts[ j ]->Dependency() ) ; } else { - aPort = myNode->OutStreamPort( myStreamLoopPorts[ j ]->Name() , StringToDataStreamType( myStreamLoopPorts[ j ]->Type() ) , myStreamLoopPorts[ j ]->Dependency() ) ; + aPort = myNode->OutStreamPort( myStreamLoopPorts[ j ]->Name(), myStreamLoopPorts[ j ]->Type(), myStreamLoopPorts[ j ]->Dependency() ) ; } } } @@ -2382,10 +2414,10 @@ bool Graph_Impl::Merge(const SUPERV::Graph_ptr aGraph , map< string , int > & aM SUPERV::ListOfStreamPorts myStreamPorts = *(aNode->StreamPorts()) ; for ( j = 0 ; j < (int ) myStreamPorts.length() ; j++ ) { if ( myStreamPorts[ j ]->IsInput() ) { - aPort = myNode->InStreamPort( myStreamPorts[ j ]->Name() , StringToDataStreamType( myStreamPorts[ j ]->Type() ) , myStreamPorts[ j ]->Dependency() ) ; + aPort = myNode->InStreamPort( myStreamPorts[ j ]->Name(), myStreamPorts[ j ]->Type(), myStreamPorts[ j ]->Dependency() ) ; } else { - aPort = myNode->OutStreamPort( myStreamPorts[ j ]->Name() , StringToDataStreamType( myStreamPorts[ j ]->Type() ) , myStreamPorts[ j ]->Dependency() ) ; + aPort = myNode->OutStreamPort( myStreamPorts[ j ]->Name(), myStreamPorts[ j ]->Type(), myStreamPorts[ j ]->Dependency() ) ; } } } @@ -2401,20 +2433,20 @@ bool Graph_Impl::Merge(const SUPERV::Graph_ptr aGraph , map< string , int > & aM myPorts = *(myEndOfSwitch->Ports()) ; for ( j = 0 ; j < (int ) myPorts.length() ; j++ ) { if ( myPorts[ j ]->IsInput() ) { - aPort = myNode->InPort( myPorts[ j ]->Name() , myPorts[ j ]->Type() ) ; + aPort = anEndOfSwitch->InPort( myPorts[ j ]->Name() , myPorts[ j ]->Type() ) ; // mkr : IPAL11394 (add port to !EndSwitch! node) } else { - aPort = myNode->OutPort( myPorts[ j ]->Name() , myPorts[ j ]->Type() ) ; + aPort = anEndOfSwitch->OutPort( myPorts[ j ]->Name() , myPorts[ j ]->Type() ) ; // mkr : IPAL11394 (add port to !EndSwitch! node) } } if ( DataFlowEditor()->Graph()->IsDataStreamNode() ) { SUPERV::ListOfStreamPorts myStreamSwitchPorts = *(myEndOfSwitch->StreamPorts()) ; for ( j = 0 ; j < (int ) myStreamSwitchPorts.length() ; j++ ) { if ( myStreamSwitchPorts[ j ]->IsInput() ) { - aPort = myNode->InStreamPort( myStreamSwitchPorts[ j ]->Name() , StringToDataStreamType( myStreamSwitchPorts[ j ]->Type() ) , myStreamSwitchPorts[ j ]->Dependency() ) ; + aPort = anEndOfSwitch->InStreamPort( myStreamSwitchPorts[ j ]->Name(), myStreamSwitchPorts[ j ]->Type(), myStreamSwitchPorts[ j ]->Dependency() ) ; // mkr : IPAL11394 (add port to !EndSwitch! node) } else { - aPort = myNode->OutStreamPort( myStreamSwitchPorts[ j ]->Name() , StringToDataStreamType( myStreamSwitchPorts[ j ]->Type() ) , myStreamSwitchPorts[ j ]->Dependency() ) ; + aPort = anEndOfSwitch->OutStreamPort( myStreamSwitchPorts[ j ]->Name(), myStreamSwitchPorts[ j ]->Type(), myStreamSwitchPorts[ j ]->Dependency() ) ; // mkr : IPAL11394 (add port to !EndSwitch! node) } } } @@ -2442,9 +2474,9 @@ bool Graph_Impl::Merge(const SUPERV::Graph_ptr aGraph , map< string , int > & aM DataFlowEditor()->Graph()->GetGraphNode( aMapOfNodes[ aLinkToNodeName->c_str() ] )->Name() , InPort->Name() ) ; if ( RetVal ) { - int j ; + CORBA::Long j ; for ( j = 1 ; j <= aLink->CoordsSize() ; j++ ) { - long X , Y ; + CORBA::Long X , Y ; RetVal = aLink->Coords( j , X , Y ) ; if ( !RetVal ) break ; @@ -2535,3 +2567,27 @@ void Graph_Impl::Editing() { } } +/** + * Returns the default name of container for C component + */ +char* Graph_Impl::DefaultCContainerName() { + return ( CORBA::string_dup( FACTORYSERVER ) ); +} + +/** + * Returns the default name of container for Python component + */ +char* Graph_Impl::DefaultPythonContainerName() { + return ( CORBA::string_dup( FACTORYSERVERPY ) ); +} + +/*! + * Returns the last container name associated with theComponentName component + */ +char* Graph_Impl::ContainerNameForComponent( const char * theComponentName ) { + const char* aContainer = DataFlowEditor()->Graph()->RetrieveFromMapOfComponentNameContainer(theComponentName); + if ( aContainer ) + return my_strdup(aContainer); + else + return ""; +}