X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGraphEditor%2FDataFlowEditor_OutNode.cxx;h=5221b4f8f01ffc09eb0b925e8236f1798842bc0d;hb=8793ad9354197cbcecd6cc552e614439471aa928;hp=95bd6c040df4b4b55e16e97a7060f0931fa6b6d1;hpb=787989820026cbd647c7bdb7159beed8e12e4944;p=modules%2Fsuperv.git diff --git a/src/GraphEditor/DataFlowEditor_OutNode.cxx b/src/GraphEditor/DataFlowEditor_OutNode.cxx index 95bd6c0..5221b4f 100644 --- a/src/GraphEditor/DataFlowEditor_OutNode.cxx +++ b/src/GraphEditor/DataFlowEditor_OutNode.cxx @@ -207,7 +207,7 @@ bool GraphEditor::OutNode::LoadDataFlow( const GraphBase::SGraph * aDataFlow ) { RetVal = LoadDatas( aMapOfNodes , (*aDataFlow).Datas ) ; } cdebug_out << "GraphEditor::OutNode::LoadDataFlow done GraphNodesSize " << Graph()->GraphNodesSize() - << " RetVal " << RetVal << endl; + << " _Valid " << _Valid << " _Executable " << _Executable << " RetVal " << RetVal << endl; return RetVal ; } @@ -648,6 +648,11 @@ GraphEditor::InNode * GraphEditor::OutNode::AddNode( GraphEditor::InNode *Nd = NULL ; char * aNodeName = NULLSTRING ; bool GeneratedName = false ; +//PAL9048 JR Debug : a node may not have the same name as the graph + bool GraphNodeSameName = false ; + if ( theNodeName && !strcmp( Graph()->Name() , theNodeName ) ) { + GraphNodeSameName = true ; + } if ( NodeKindOfNode == SUPERV::InLineNode || NodeKindOfNode == SUPERV::LoopNode || NodeKindOfNode == SUPERV::EndLoopNode || @@ -679,27 +684,36 @@ GraphEditor::InNode * GraphEditor::OutNode::AddNode( } theNodeName = NULLSTRING ; } - if ( theNodeName == NULLSTRING || strlen( theNodeName ) == 0 || Graph()->GetGraphNode( theNodeName ) ) { +//PAL9048 JR Debug : a node may not have the same name as the graph +// if ( theNodeName == NULLSTRING || strlen( theNodeName ) == 0 || Graph()->GetGraphNode( theNodeName ) ) { + if ( theNodeName == NULLSTRING || strlen( theNodeName ) == 0 || + Graph()->GetGraphNode( theNodeName ) || GraphNodeSameName ) { + cdebug << "OutNode::AddNode : '" << theNodeName << "' GraphNodeSameName " + << GraphNodeSameName << endl; aNodeName = new char[ strlen( NodeService.ServiceName )+1 ] ; strcpy( aNodeName , NodeService.ServiceName ) ; - if ( Graph()->GetGraphNode( NodeService.ServiceName ) ) { +// if ( Graph()->GetGraphNode( NodeService.ServiceName ) ) { + if ( Graph()->GetGraphNode( NodeService.ServiceName ) || GraphNodeSameName ) { GeneratedName = true ; - while ( Graph()->GetGraphNode( aNodeName ) ) { + while ( Graph()->GetGraphNode( aNodeName ) || GraphNodeSameName ) { + cdebug << "OutNode::AddNode : '" << aNodeName << "' exists or GraphNodeSameName " + << GraphNodeSameName << endl; if ( aNodeName ) { delete [] aNodeName ; } -// int num = Graph()->GetServiceNameNumber( NodeService ) ; - char * aServiceName = (CORBA::String_member ) NodeService.ServiceName ; - int num = Graph()->GetNewServiceInstanceNumber( aServiceName ) ; +//JR 09.08.2005 Debug : folowing line does not run with OMNIORB4 +// char * aServiceName = (CORBA::String_member ) NodeService.ServiceName ; + int num = Graph()->GetNewServiceInstanceNumber( (CORBA::String_member ) NodeService.ServiceName ) ; ostringstream astr ; astr << num << ends ; - const char * n_instance = astr.str().c_str() ; +// const char * n_instance = astr.str().c_str() ; int lname = strlen( NodeService.ServiceName ) + 1 + - strlen( n_instance ) + 1 ; + strlen( astr.str().c_str() ) + 1 ; aNodeName = new char[lname] ; strcpy( aNodeName , NodeService.ServiceName ) ; strcat( aNodeName , "_" ) ; - strcat( aNodeName , n_instance ) ; + strcat( aNodeName , astr.str().c_str() ) ; + GraphNodeSameName = !strcmp( Graph()->Name() , aNodeName ) ; } } } @@ -940,16 +954,19 @@ bool GraphEditor::OutNode::UnValid() { //JR Optional parameter kLoopSwitch (default = true) : //In some cases we do not need to check the validity of loops and switchs -bool GraphEditor::OutNode::Valid(bool kLoopSwitch ) { - if ( _Valid ) - return true ; - +//JR 07.07.2005 PAL9342 : that code is now in Executable() method instead of Valid() method +//bool GraphEditor::OutNode::Valid(bool kLoopSwitch ) { +bool GraphEditor::OutNode::Valid() { + bool RetVal = true ; cdebug_in << "GraphEditor::OutNode::Valid" << endl; +// if ( _Valid ) +// return true ; + _Executable = false ; if ( !Graph()->CreateService() ) { - cdebug_out << "GraphEditor::OutNode::Valid " << _Valid << endl; - return false ; + cdebug << "GraphEditor::OutNode::Valid ERROR _Valid " << _Valid << endl; + RetVal = false ; } if ( Graph()->GraphMacroLevel() != 0 ) { @@ -967,64 +984,104 @@ bool GraphEditor::OutNode::Valid(bool kLoopSwitch ) { Graph()->CoupledNode()->GraphEditor()->UnValid() ; } + Graph()->InLineServices() ; + +//JR 07.07.2005 PAL9342 : that code is now in Executable() method instead of Valid() method +#if 0 int SubStreamGraphsNumber = 0 ; if ( !Graph()->Sort( SubStreamGraphsNumber ) ) { cdebug_out << "This DataFlow is not valid." << endl ; - return false ; + RetVal = false ; } if ( Graph()->IsDataStreamNode() ) { StreamGraph()->SubStreamGraphsNumber( SubStreamGraphsNumber ) ; } - Graph()->InLineServices() ; +//JR Debug 24.08.2005 : InLineServices is needed for Export ==> it is executed above +// Graph()->InLineServices() ; if ( kLoopSwitch ) { if ( !Graph()->ValidLoops() ) { cdebug_out << "This DataFlow have not valid Loops." << endl ; - return false ; + RetVal = false ; } if ( !Graph()->ValidSwitchs() ) { cdebug_out << "This DataFlow have not valid Switchs." << endl ; - return false ; + RetVal = false ; } } -// CreateService() ; - Graph()->ComputingNodes() ; +#endif - if ( kLoopSwitch ) { + if ( RetVal ) { _Valid = true ; } - cdebug_out << "GraphEditor::OutNode::Valid " << _Valid << endl; - return true ; + cdebug_out << "GraphEditor::OutNode::Valid " << _Valid << " RetVal " << RetVal << endl; + return RetVal ; } bool GraphEditor::OutNode::Executable() { cdebug_in << "GraphEditor::OutNode::Executable" << endl; + bool RetVal = true ; bool NewLink ; // LinkLoopNodes manage input values of LoopNodes and EndLoopNodes if ( Graph()->LinkLoopNodes( NewLink ) ) { if ( NewLink ) { _Valid = false ; + RetVal = false ; } } else { - cdebug << "This DataFlow is not executable." << endl ; + cdebug << "Editor::OutNode::Executable This DataFlow is not executable(LinkLoopNodes)." << endl ; _Executable = false ; + RetVal = false ; } if ( !IsValid() ) { Valid() ; } if ( !IsValid() ) { - return false ; + RetVal = false ; + } + +//JR 07.07.2005 PAL9342 : that code is now in Executable() method instead of Valid() method + bool IsValid = true; + int SubStreamGraphsNumber = 0 ; + if ( !Graph()->Sort( SubStreamGraphsNumber ) ) { + cdebug << "Editor::OutNode::Executable This DataFlow is not valid(Sort)." << endl ; + RetVal = false ; + //mkr : 28.09.2005 : if dataflow is not valid => it is not executable + IsValid = false ; } + if ( Graph()->IsDataStreamNode() ) + StreamGraph()->SubStreamGraphsNumber( SubStreamGraphsNumber ) ; + + Graph()->InLineServices() ; + +// if ( kLoopSwitch ) { + if ( !Graph()->ValidLoops() ) { + cdebug << "Editor::OutNode::Executable This DataFlow have not valid Loops(ValidLoops)." << endl ; + RetVal = false ; + //mkr : 28.09.2005 : if dataflow is not valid => it is not executable + IsValid = false ; + } + if ( !Graph()->ValidSwitchs() ) { + cdebug << "Editor::OutNode::Executable This DataFlow have not valid Switchs(ValidSwitchs)." << endl ; + RetVal = false ; + //mkr : 28.09.2005 : if dataflow is not valid => it is not executable + IsValid = false ; + } +// } + + Graph()->ComputingNodes() ; + if ( Graph()->DataServerNodes() ) _Executable = true ; else { - cdebug << "This DataFlow is not executable." << endl ; + cdebug << "Editor::OutNode::Executable This DataFlow is not executable(DataServerNodes)." << endl ; _Executable = false ; + RetVal = false ; } if ( _Executable && Graph()->IsDataStreamNode() ) { @@ -1034,10 +1091,15 @@ bool GraphEditor::OutNode::Executable() { // asv : 13.12.04 : introducing check for compatibility of linked ports' types. if ( !IsLinksCompatible() ) { _Executable = false; + RetVal = false ; } - cdebug_out << "GraphEditor::OutNode::Executable" << endl; - return _Executable ; + //mkr : 28.09.2005 : if dataflow is not valid => it is not executable + if ( !IsValid ) _Executable = false ; + + cdebug_out << "GraphEditor::OutNode::Executable _Executable " << _Executable << " RetVal " << RetVal + << endl; + return RetVal ; } //JR 30.03.2005const CORBA::Any *GraphEditor::OutNode::GetInData( @@ -1132,9 +1194,24 @@ bool GraphEditor::OutNode::LinkSaveXML( QDomDocument & Graph , QDomElement & lin aLink.aLinkValue >>= retstr; // f << Tabs << " " << retstr << "" << endl ; QDomElement value = Graph.createElement( "value" ) ; - aField = Graph.createTextNode( retstr ) ; +//PAL9133 Debug JR : accept void strings + QDomCDATASection aCDATA ; + int i ; + for ( i = 0 ; i < (int ) strlen( retstr ) ; i++ ) { + if ( retstr[ i ] != ' ' ) { + break ; + } + } + if ( i == (int ) strlen( retstr ) ) { + aCDATA = Graph.createCDATASection( "?" ) ; + } + else { + aCDATA = Graph.createCDATASection( retstr ) ; + } +// aField = Graph.createTextNode( retstr ) ; datavalue.appendChild( value ) ; - value.appendChild( aField ) ; +// datavalue.appendChild( value ) ; + value.appendChild( aCDATA ) ; // MESSAGE( "ToString( string ) " << retstr ); break ; } @@ -1711,23 +1788,45 @@ bool GraphEditor::OutNode::SavePY( ostream & f , bool importSuperV ) { * Returns true if all are compatible. */ bool GraphEditor::OutNode::IsLinksCompatible() { + cdebug_in << "Editor::OutNode::IsLinksCompatible()" << endl ; + bool RetVal = true; + bool b ; const GraphBase::ListOfSLinks * Links = Graph()->GetLinks( true ) ; - bool b = true; - for ( int i = 0 ; i < (int ) Links->size() && b ; i++ ) { + cdebug_in << "Editor::OutNode::IsLinksCompatible() " << Links->size() << " Links" << endl ; +// for ( int i = 0 ; i < (int ) Links->size() && b ; i++ ) { + for ( int i = 0 ; i < (int ) Links->size() ; i++ ) { GraphBase::SLink aLink = (*Links)[i]; GraphBase::ComputingNode* anOutNode = Graph()->GetChangeGraphNode( aLink.FromNodeName.c_str() ); GraphBase::ComputingNode* anInNode = Graph()->GetChangeGraphNode( aLink.ToNodeName.c_str() ); const GraphBase::OutPort* anOutPort = anOutNode->GetOutPort( aLink.FromServiceParameterName.c_str() ); const GraphBase::InPort* anInPort = anInNode->GetInPort( aLink.ToServiceParameterName.c_str() ); b = IsCompatible( anOutPort->PortType(), anInPort->PortType() ); - cdebug << "GraphEditor::OutNode::IsLinksCompatible: "< "<PortType() + << " ) --> " << aLink.ToNodeName <<"( " << aLink.ToServiceParameterName << " " + << anInPort->PortType() << " ) = " << (b ? "OK" : "Not compatible (ERROR)") << endl; + if ( !b ) { + RetVal = false ; + MESSAGE( "Graph structure ERROR: type of port \"" << aLink.FromServiceParameterName + << "\" of node \"" << aLink.FromNodeName + << "\" is not compatible with type of linked port \"" + << aLink.ToServiceParameterName << "\" of node \"" << aLink.ToNodeName<<"\"" ) ; + ostringstream aTypeOutPortstr ; + aTypeOutPortstr << anOutPort->PortType() ; + ostringstream aTypeInPortstr ; + aTypeInPortstr << anInPort->PortType() ; + string anErrorMessage = string( "PortTypes of " ) + string( aLink.FromNodeName ) + + string( "( " ) + aLink.FromServiceParameterName + + string( " ) " ) + aTypeOutPortstr.str() + string( " and " ) + + string( aLink.ToNodeName ) + string( "( " ) + + string( aLink.ToServiceParameterName ) + + string( " ) " ) + aTypeInPortstr.str() + + string( " are not compatibles.\n" ) ; + Graph()->SetMessages( anErrorMessage ) ; + } + } + cdebug_out << "Editor::OutNode::IsLinksCompatible() RetVal " << RetVal << endl ; + return RetVal ; } static const char* gSimpleTypes[] =