X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FSMESH_I%2FSMESH_2smeshpy.cxx;h=6734c0d2f5419bed23f3493fd9d18990be4c148f;hb=c5c930fa65901110f5157ef099891c5a1e0d4dfb;hp=10673f51161f30c5f29fe881244d4b2360b19709;hpb=ddec989c2fb5982e993bb635080de49f1b2f1a1a;p=modules%2Fsmesh.git diff --git a/src/SMESH_I/SMESH_2smeshpy.cxx b/src/SMESH_I/SMESH_2smeshpy.cxx index 10673f511..6734c0d2f 100644 --- a/src/SMESH_I/SMESH_2smeshpy.cxx +++ b/src/SMESH_I/SMESH_2smeshpy.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -20,7 +20,6 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses // File : SMESH_2smeshpy.cxx // Created : Fri Nov 18 13:20:10 2005 // Author : Edward AGAPOV (eap) @@ -228,6 +227,11 @@ namespace { // - FT_EqualEdges = 15 // - FT_EqualFaces = 16 // - FT_EqualVolumes = 17 + // v 6.6.0: FT_Undefined == 44, new items: + // - FT_BallDiameter = 37 + // + // It's necessary to continue recording this history and to fill + // undef2newItems (see below) accordingly. typedef map< int, vector< int > > TUndef2newItems; static TUndef2newItems undef2newItems; @@ -242,6 +246,8 @@ namespace { undef2newItems[ 39 ].assign( items, items+6 ); } { int items[] = { 14, 15, 16, 17 }; undef2newItems[ 43 ].assign( items, items+4 ); } + { int items[] = { 37 }; + undef2newItems[ 44 ].assign( items, items+1 ); } } int iType = Type.IntegerValue(); @@ -456,6 +462,13 @@ Handle(_pyCommand) _pyGen::AddCommand( const TCollection_AsciiString& theCommand if ( objID.IsEmpty() ) return aCommand; + // Prevent moving a command creating a sub-mesh to the end of the script + // if the sub-mesh is used in theCommand as argument + if ( _pySubMesh::CanBeArgOfMethod( aCommand->GetMethod() )) + { + PlaceSubmeshAfterItsCreation( aCommand ); + } + // Find an object to process theCommand // SMESH_Gen method? @@ -511,7 +524,10 @@ Handle(_pyCommand) _pyGen::AddCommand( const TCollection_AsciiString& theCommand method == "DoubleNodeGroupNew" || method == "DoubleNodeGroupsNew" || method == "DoubleNodeElemGroupNew" || - method == "DoubleNodeElemGroupsNew" ) + method == "DoubleNodeElemGroupsNew"|| + method == "DoubleNodeElemGroup2New"|| + method == "DoubleNodeElemGroups2New" + ) groups = aCommand->GetResultValue(); else if ( method == "MakeBoundaryMesh" ) groups = aCommand->GetResultValue(2); @@ -641,10 +657,10 @@ Handle(_pyCommand) _pyGen::AddCommand( const TCollection_AsciiString& theCommand if ( Type == "SMESH.FT_ElemGeomType" && Threshold.IsIntegerValue() ) { // set SMESH.GeometryType instead of a numerical Threshold - const char* types[SMESH::Geom_POLYHEDRA+1] = { + const char* types[SMESH::Geom_BALL+1] = { "Geom_POINT", "Geom_EDGE", "Geom_TRIANGLE", "Geom_QUADRANGLE", "Geom_POLYGON", "Geom_TETRA", "Geom_PYRAMID", "Geom_HEXA", "Geom_PENTA", "Geom_HEXAGONAL_PRISM", - "Geom_POLYHEDRA" + "Geom_POLYHEDRA", "Geom_BALL" }; int iGeom = Threshold.IntegerValue(); if ( -1 < iGeom && iGeom < SMESH::Geom_POLYHEDRA+1 ) @@ -718,7 +734,7 @@ void _pyGen::Process( const Handle(_pyCommand)& theCommand ) { for(int ind = 0;indGetNbResultValues();ind++) { - const _pyID& meshID = theCommand->GetResultValue(ind+1); + _pyID meshID = theCommand->GetResultValue(ind+1); if ( !theCommand->IsStudyEntry( meshID ) ) continue; Handle(_pyMesh) mesh = new _pyMesh( theCommand, theCommand->GetResultValue(ind+1)); myMeshes.insert( make_pair( mesh->GetID(), mesh )); @@ -881,6 +897,34 @@ void _pyGen::Flush() myCommands.push_back( myLastCommand ); } +//================================================================================ +/*! + * \brief Prevent moving a command creating a sub-mesh to the end of the script + * if the sub-mesh is used in theCmdUsingSubmesh as argument + */ +//================================================================================ + +void _pyGen::PlaceSubmeshAfterItsCreation( Handle(_pyCommand) theCmdUsingSubmesh ) const +{ + map< _pyID, Handle(_pyObject) >::const_iterator id_obj = myObjects.begin(); + for ( ; id_obj != myObjects.end(); ++id_obj ) + { + if ( !id_obj->second->IsKind( STANDARD_TYPE( _pySubMesh ))) continue; + for ( int iArg = theCmdUsingSubmesh->GetNbArgs(); iArg; --iArg ) + { + const _pyID& arg = theCmdUsingSubmesh->GetArg( iArg ); + if ( arg.IsEmpty() || arg.Value( 1 ) == '"' || arg.Value( 1 ) == '\'' ) + continue; + list< _pyID > idList = theCmdUsingSubmesh->GetStudyEntries( arg ); + list< _pyID >::iterator id = idList.begin(); + for ( ; id != idList.end(); ++id ) + if ( id_obj->first == *id ) + // _pySubMesh::Process() does what we need + Handle(_pySubMesh)::DownCast( id_obj->second )->Process( theCmdUsingSubmesh ); + } + } +} + //================================================================================ /*! * \brief Clean commmands of removed objects depending on myIsPublished flag @@ -1231,7 +1275,8 @@ bool _pyGen::IsGeomObject(const _pyID& theObjID) const if ( myGeomIDNb ) { return ( myGeomIDIndex <= theObjID.Length() && - int( theObjID.Value( myGeomIDIndex )) == myGeomIDNb); + int( theObjID.Value( myGeomIDIndex )) == myGeomIDNb && + _pyCommand::IsStudyEntry( theObjID )); } return false; } @@ -1437,12 +1482,6 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) mySubmeshes.push_back( subMesh ); } } - else if ( method == "RemoveSubMesh" ) { // move submesh creation before its removal - Handle(_pySubMesh) subMesh = theGen->FindSubMesh( theCommand->GetArg(1) ); - if ( !subMesh.IsNull() ) - subMesh->Process( theCommand ); - AddMeshAccess( theCommand ); - } // ---------------------------------------------------------------------- else if ( method == "AddHypothesis" ) { // mesh.AddHypothesis(geom, HYPO ) myAddHypCmds.push_back( theCommand ); @@ -1500,26 +1539,44 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) // ---------------------------------------------------------------------- else if ( method == "RemoveHypothesis" ) // (geom, hyp) { - _pyID hypID = theCommand->GetArg( 2 ); + _pyID hypID = theCommand->GetArg( 2 ); + _pyID geomID = theCommand->GetArg( 1 ); + bool isLocal = ( geomID != GetGeom() ); // check if this mesh still has corresponding addition command - bool hasAddCmd = false; - list< Handle(_pyCommand) >::iterator cmd = myAddHypCmds.begin(); - while ( cmd != myAddHypCmds.end() ) + Handle(_pyCommand) addCmd; + list< Handle(_pyCommand) >::iterator cmd; + list< Handle(_pyCommand) >* addCmds[2] = { &myAddHypCmds, &myNotConvertedAddHypCmds }; + for ( int i = 0; i < 2; ++i ) { - // AddHypothesis(geom, hyp) - if ( hypID == (*cmd)->GetArg( 2 )) { // erase both (add and remove) commands - theCommand->Clear(); - (*cmd)->Clear(); - cmd = myAddHypCmds.erase( cmd ); - hasAddCmd = true; - } - else { - ++cmd; + list< Handle(_pyCommand )> & addHypCmds = *(addCmds[i]); + for ( cmd = addHypCmds.begin(); cmd != addHypCmds.end(); ) + { + bool sameHyp = true; + if ( hypID != (*cmd)->GetArg( 1 ) && hypID != (*cmd)->GetArg( 2 )) + sameHyp = false; // other hyp + if ( (*cmd)->GetNbArgs() == 2 && + geomID != (*cmd)->GetArg( 1 ) && geomID != (*cmd)->GetArg( 2 )) + sameHyp = false; // other geom + if ( (*cmd)->GetNbArgs() == 1 && isLocal ) + sameHyp = false; // other geom + if ( sameHyp ) + { + addCmd = *cmd; + cmd = addHypCmds.erase( cmd ); + if ( !theGen->IsToKeepAllCommands() ) { + addCmd->Clear(); + theCommand->Clear(); + } + } + else + { + ++cmd; + } } } Handle(_pyHypothesis) hyp = theGen->FindHyp( hypID ); - if ( ! hasAddCmd && hypID.Length() != 0 ) { // hypo addition already wrapped + if ( !theCommand->IsEmpty() && !hypID.IsEmpty() ) { // RemoveHypothesis(geom, hyp) --> RemoveHypothesis( hyp, geom=0 ) _pyID geom = theCommand->GetArg( 1 ); theCommand->RemoveArgs(); @@ -1701,6 +1758,7 @@ void _pyMesh::Flush() addCmd->SetArg( 1, algoID ); if ( isLocalAlgo ) addCmd->SetArg( 2, geom ); + myNotConvertedAddHypCmds.push_back( addCmd ); } } @@ -1721,6 +1779,7 @@ void _pyMesh::Flush() addCmd->SetArg( 1, hypID ); if ( geom != GetGeom() ) addCmd->SetArg( 2, geom ); + myNotConvertedAddHypCmds.push_back( addCmd ); } } @@ -1875,7 +1934,7 @@ void _pyMeshEditor::Process( const Handle(_pyCommand)& theCommand) static TStringSet sameMethods; if ( sameMethods.empty() ) { const char * names[] = { - "RemoveElements","RemoveNodes","RemoveOrphanNodes","AddNode","Add0DElement","AddEdge","AddFace","AddPolygonalFace", + "RemoveElements","RemoveNodes","RemoveOrphanNodes","AddNode","Add0DElement","AddEdge","AddFace","AddPolygonalFace","AddBall", "AddVolume","AddPolyhedralVolume","AddPolyhedralVolumeByFaces","MoveNode", "MoveClosestNodeToPoint", "InverseDiag","DeleteDiag","Reorient","ReorientObject","TriToQuad","SplitQuad","SplitQuadObject", "BestSplit","Smooth","SmoothObject","SmoothParametric","SmoothParametricObject", @@ -1891,7 +1950,7 @@ void _pyMeshEditor::Process( const Handle(_pyCommand)& theCommand) "GetLastCreatedElems", "MirrorMakeMesh","MirrorObjectMakeMesh","TranslateMakeMesh", "TranslateObjectMakeMesh","RotateMakeMesh","RotateObjectMakeMesh","MakeBoundaryMesh", - "MakeBoundaryElements" + "MakeBoundaryElements", "SplitVolumesIntoTetra" ,"" }; // <- mark of the end sameMethods.Insert( names ); } @@ -1944,7 +2003,7 @@ void _pyMeshEditor::Process( const Handle(_pyCommand)& theCommand) if ( !isPyMeshMethod && ( method == "ExtrusionSweep0D" || method == "ExtrusionSweepObject0D" )) { - isPyMeshMethod=true; + isPyMeshMethod = true; theCommand->SetMethod( method.SubString( 1, method.Length()-2)); theCommand->SetArg(theCommand->GetNbArgs()+1,"False"); //sets flag "MakeGroups = False" theCommand->SetArg(theCommand->GetNbArgs()+1,"True"); //sets flag "IsNode = True" @@ -1952,47 +2011,53 @@ void _pyMeshEditor::Process( const Handle(_pyCommand)& theCommand) // set "ExtrusionAlongPathX()" instead of "ExtrusionAlongPathObjX()" if ( !isPyMeshMethod && method == "ExtrusionAlongPathObjX") { - isPyMeshMethod=true; + isPyMeshMethod = true; theCommand->SetMethod("ExtrusionAlongPathX"); } // set "FindCoincidentNodesOnPart()" instead of "FindCoincidentNodesOnPartBut()" if ( !isPyMeshMethod && method == "FindCoincidentNodesOnPartBut") { - isPyMeshMethod=true; + isPyMeshMethod = true; theCommand->SetMethod("FindCoincidentNodesOnPart"); } - // DoubleNodeElemGroupNew() -> DoubleNodeElemGroup() - // DoubleNodeGroupNew() -> DoubleNodeGroup() - // DoubleNodeGroupsNew() -> DoubleNodeGroups() - // DoubleNodeElemGroupsNew() -> DoubleNodeElemGroups() + // DoubleNode...New(...) -> DoubleNode...(...,True) if ( !isPyMeshMethod && ( method == "DoubleNodeElemGroupNew" || method == "DoubleNodeElemGroupsNew" || method == "DoubleNodeGroupNew" || - method == "DoubleNodeGroupsNew")) + method == "DoubleNodeGroupsNew" || + method == "DoubleNodeElemGroup2New" || + method == "DoubleNodeElemGroups2New")) { - isPyMeshMethod=true; - theCommand->SetMethod( method.SubString( 1, method.Length()-3)); - theCommand->SetArg(theCommand->GetNbArgs()+1,"True"); + isPyMeshMethod = true; + const int excessLen = 3 + int( method.Value( method.Length()-3 ) == '2' ); + theCommand->SetMethod( method.SubString( 1, method.Length()-excessLen)); + if ( excessLen == 3 ) + { + theCommand->SetArg(theCommand->GetNbArgs()+1,"True"); + } + else if ( theCommand->GetArg(4) == "0" || + theCommand->GetArg(5) == "0" ) + { + // [ nothing, Group ] = DoubleNodeGroup2New(,,,False, True) -> + // Group = DoubleNodeGroup2New(,,,False, True) + _pyID groupID = theCommand->GetResultValue( 1 + int( theCommand->GetArg(4) == "0")); + theCommand->SetResultValue( groupID ); + } } // ConvertToQuadraticObject(bool,obj) -> ConvertToQuadratic(bool,obj) // ConvertFromQuadraticObject(obj) -> ConvertFromQuadratic(obj) if ( !isPyMeshMethod && ( method == "ConvertToQuadraticObject" || method == "ConvertFromQuadraticObject" )) { - isPyMeshMethod=true; + isPyMeshMethod = true; theCommand->SetMethod( method.SubString( 1, method.Length()-6)); - // prevent moving creation of the converted sub-mesh to the end of the script - bool isFromQua = ( method.Value( 8 ) == 'F' ); - Handle(_pySubMesh) sm = theGen->FindSubMesh( theCommand->GetArg( isFromQua ? 1 : 2 )); - if ( !sm.IsNull() ) - sm->Process( theCommand ); } // FindAmongElementsByPoint(meshPart, x, y, z, elementType) -> // FindElementsByPoint(x, y, z, elementType, meshPart) if ( !isPyMeshMethod && method == "FindAmongElementsByPoint" ) { - isPyMeshMethod=true; + isPyMeshMethod = true; theCommand->SetMethod( "FindElementsByPoint" ); // make the 1st arg be the last one _pyID partID = theCommand->GetArg( 1 ); @@ -2001,6 +2066,22 @@ void _pyMeshEditor::Process( const Handle(_pyCommand)& theCommand) theCommand->SetArg( i-1, theCommand->GetArg( i )); theCommand->SetArg( nbArgs, partID ); } + // Reorient2D( mesh, dir, face, point ) -> Reorient2D( mesh, dir, faceORpoint ) + if ( !isPyMeshMethod && method == "Reorient2D" ) + { + isPyMeshMethod = true; + _AString mesh = theCommand->GetArg( 1 ); + _AString dir = theCommand->GetArg( 2 ); + _AString face = theCommand->GetArg( 3 ); + _AString point = theCommand->GetArg( 4 ); + theCommand->RemoveArgs(); + theCommand->SetArg( 1, mesh ); + theCommand->SetArg( 2, dir ); + if ( face.Value(1) == '-' || face.Value(1) == '0' ) // invalid: face <= 0 + theCommand->SetArg( 3, point ); + else + theCommand->SetArg( 3, face ); + } // meshes made by *MakeMesh() methods are not wrapped by _pyMesh, // so let _pyMesh care of it (TMP?) @@ -2295,7 +2376,7 @@ void _pyHypothesis::Assign( const Handle(_pyHypothesis)& theOther, myGeom = theOther->myGeom; myMesh = theMesh; myAlgoType2CreationMethod = theOther->myAlgoType2CreationMethod; - //myArgCommands = theOther->myArgCommands; + myAccumulativeMethods = theOther->myAccumulativeMethods; //myUnusedCommands = theOther->myUnusedCommands; // init myCurCrMethod GetCreationMethod( theOther->GetAlgoType() ); @@ -2424,7 +2505,9 @@ bool _pyHypothesis::GetReferredMeshesAndGeom( list< Handle(_pyMesh) >& meshes ) void _pyHypothesis::rememberCmdOfParameter( const Handle(_pyCommand) & theCommand ) { // parameters are discriminated by method name - TCollection_AsciiString method = theCommand->GetMethod(); + _AString method = theCommand->GetMethod(); + if ( myAccumulativeMethods.count( method )) + return; // this method adds values and not override the previus value // discriminate commands setting different parameters via one method // by passing parameter names like e.g. SetOption("size", "0.2") @@ -2442,7 +2525,7 @@ void _pyHypothesis::rememberCmdOfParameter( const Handle(_pyCommand) & theComman } } // parameters are discriminated by method name - list< Handle(_pyCommand)>& cmds = myMeth2Commands[ theCommand->GetMethod() ]; + list< Handle(_pyCommand)>& cmds = myMeth2Commands[ method /*theCommand->GetMethod()*/ ]; if ( !cmds.empty() && !isCmdUsedForCompute( cmds.back() )) { cmds.back()->Clear(); // previous parameter value has not been used @@ -3027,22 +3110,25 @@ const int _pyCommand::GetNbResultValues() //================================================================================ /*! * \brief Return substring of python command looking like - * ResultValue1 , ResultValue1,... = Obj.Meth() with res index + * ResultValue1 , ResultValue2,... = Obj.Meth() with res index * \retval const TCollection_AsciiString & - ResultValue with res index substring */ //================================================================================ -const TCollection_AsciiString & _pyCommand::GetResultValue(int res) +TCollection_AsciiString _pyCommand::GetResultValue(int res) { int begPos = 1; - int Nb=0; + if ( SkipSpaces( myString, begPos ) && myString.Value( begPos ) == '[' ) + ++begPos; // skip [, else the whole list is returned int endPos = myString.Location( "=", 1, Length() ); + int Nb=0; while ( begPos < endPos) { - myRes = GetWord( myString, begPos, true ); - begPos = begPos + myRes.Length(); + _AString result = GetWord( myString, begPos, true ); + begPos = begPos + result.Length(); Nb++; - if(res == Nb){ - myRes.RemoveAll('[');myRes.RemoveAll(']'); - return myRes; + if(res == Nb) { + result.RemoveAll('['); + result.RemoveAll(']'); + return result; } if(Nb>res) break; @@ -3240,10 +3326,10 @@ static inline bool isWord(const char c, const bool dotIsWord) */ //================================================================================ -TCollection_AsciiString _pyCommand::GetWord( const TCollection_AsciiString & theString, - int & theStartPos, - const bool theForward, - const bool dotIsWord ) +TCollection_AsciiString _pyCommand::GetWord( const _AString & theString, + int & theStartPos, + const bool theForward, + const bool dotIsWord ) { int beg = theStartPos, end = theStartPos; theStartPos = EMPTY; @@ -3350,8 +3436,6 @@ std::list< _pyID > _pyCommand::GetStudyEntries( const TCollection_AsciiString& s * \param theString - The string * \param thePos - The position to search from and which returns result * \retval bool - false if there are only space after thePos in theString - * - * */ //================================================================================ @@ -3646,6 +3730,49 @@ _pySubMesh::_pySubMesh(const Handle(_pyCommand)& theCreationCmd): myMesh = ObjectToMesh( theGen->FindObject( theCreationCmd->GetObject() )); } +//================================================================================ +/*! + * \brief Return true if a sub-mesh can be used as argument of the given method + */ +//================================================================================ + +bool _pySubMesh::CanBeArgOfMethod(const _AString& theMethodName) +{ + // names of all methods where a sub-mesh can be used as argument + static TStringSet methods; + if ( methods.empty() ) { + const char * names[] = { + // methods of SMESH_Gen + "CopyMesh", + // methods of SMESH_Group + "AddFrom", + // methods of SMESH_Measurements + "MinDistance", + // methods of SMESH_Mesh + "ExportPartToMED","ExportCGNS","ExportPartToDAT","ExportPartToUNV","ExportPartToSTL", + "RemoveSubMesh", + // methods of SMESH_MeshEditor + "ReorientObject","Reorient2D","TriToQuadObject","QuadToTriObject","SplitQuadObject", + "SplitVolumesIntoTetra","SmoothObject","SmoothParametricObject","ConvertFromQuadraticObject", + "RotationSweepObject","RotationSweepObjectMakeGroups","RotationSweepObject1D", + "RotationSweepObject1DMakeGroups","RotationSweepObject2D","RotationSweepObject2DMakeGroups", + "ExtrusionSweepObject","ExtrusionSweepObjectMakeGroups","ExtrusionSweepObject0D", + "ExtrusionSweepObject0DMakeGroups","ExtrusionSweepObject1D","ExtrusionSweepObject2D", + "ExtrusionSweepObject1DMakeGroups","ExtrusionSweepObject2DMakeGroups", + "ExtrusionAlongPathObjX","ExtrusionAlongPathObject","ExtrusionAlongPathObjectMakeGroups", + "ExtrusionAlongPathObject1D","ExtrusionAlongPathObject1DMakeGroups", + "ExtrusionAlongPathObject2D","ExtrusionAlongPathObject2DMakeGroups","MirrorObject", + "MirrorObjectMakeGroups","MirrorObjectMakeMesh","TranslateObject","Scale", + "TranslateObjectMakeGroups","TranslateObjectMakeMesh","ScaleMakeGroups","ScaleMakeMesh", + "RotateObject","RotateObjectMakeGroups","RotateObjectMakeMesh","FindCoincidentNodesOnPart", + "FindCoincidentNodesOnPartBut","FindEqualElements","FindAmongElementsByPoint", + "MakeBoundaryMesh", + "" }; // <- mark of end + methods.Insert( names ); + } + return methods.Contains( theMethodName ); +} + //================================================================================ /*! * \brief count invoked commands @@ -3685,6 +3812,8 @@ _pyGroup::_pyGroup(const Handle(_pyCommand)& theCreationCmd, const _pyID & id) if ( !id.IsEmpty() ) setID( id ); + myCanClearCreationCmd = true; + const _AString& method = theCreationCmd->GetMethod(); if ( method == "CreateGroup" ) // CreateGroup() --> CreateEmptyGroup() { @@ -3727,6 +3856,12 @@ _pyGroup::_pyGroup(const Handle(_pyCommand)& theCreationCmd, const _pyID & id) } myFilter = filter; } + else + { + // theCreationCmd does something else apart from creation of this group + // and thus it can't be cleared if this group is removed + myCanClearCreationCmd = false; + } } //================================================================================ @@ -3803,6 +3938,23 @@ void _pyGroup::Process( const Handle(_pyCommand)& theCommand) theGen->AddMeshAccessorMethod( theCommand ); } +//================================================================================ +/*! + * \brief Prevent clearing "DoubleNode...() command if a group created by it is removed + * + * + */ +//================================================================================ + +void _pyGroup::Flush() +{ + if ( !theGen->IsToKeepAllCommands() && + myCreationCmd && !myCanClearCreationCmd ) + { + myCreationCmd.Nullify(); // this way myCreationCmd won't be cleared + } +} + //================================================================================ /*! * \brief Constructor of _pyFilter @@ -3893,69 +4045,8 @@ bool _pyFilter::CanClear() _pyHypothesisReader::_pyHypothesisReader() { - // Get paths to xml files of plugins - vector< string > xmlPaths; - string sep; - if ( const char* meshersList = getenv("SMESH_MeshersList") ) - { - string meshers = meshersList, plugin; - string::size_type from = 0, pos; - while ( from < meshers.size() ) - { - // cut off plugin name - pos = meshers.find( ':', from ); - if ( pos != string::npos ) - plugin = meshers.substr( from, pos-from ); - else - plugin = meshers.substr( from ), pos = meshers.size(); - from = pos + 1; - - // get PLUGIN_ROOT_DIR path - string rootDirVar, pluginSubDir = plugin; - if ( plugin == "StdMeshers" ) - rootDirVar = "SMESH", pluginSubDir = "smesh"; - else - for ( pos = 0; pos < plugin.size(); ++pos ) - rootDirVar += toupper( plugin[pos] ); - rootDirVar += "_ROOT_DIR"; - - const char* rootDir = getenv( rootDirVar.c_str() ); - if ( !rootDir || strlen(rootDir) == 0 ) - { - rootDirVar = plugin + "_ROOT_DIR"; // HexoticPLUGIN_ROOT_DIR - rootDir = getenv( rootDirVar.c_str() ); - if ( !rootDir || strlen(rootDir) == 0 ) continue; - } - - // get a separator from rootDir - for ( pos = strlen( rootDir )-1; pos >= 0 && sep.empty(); --pos ) - if ( rootDir[pos] == '/' || rootDir[pos] == '\\' ) - { - sep = rootDir[pos]; - break; - } - if (sep.empty() ) sep = "/"; - - // get a path to resource file - string xmlPath = rootDir; - if ( xmlPath[ xmlPath.size()-1 ] != sep[0] ) - xmlPath += sep; - xmlPath += "share" + sep + "salome" + sep + "resources" + sep; - for ( pos = 0; pos < pluginSubDir.size(); ++pos ) - xmlPath += tolower( pluginSubDir[pos] ); - xmlPath += sep + plugin + ".xml"; - bool fileOK; -#ifdef WNT - fileOK = (GetFileAttributes(xmlPath.c_str()) != INVALID_FILE_ATTRIBUTES); -#else - fileOK = (access(xmlPath.c_str(), F_OK) == 0); -#endif - if ( fileOK ) - xmlPaths.push_back( xmlPath ); - } - } - // Read xml files + vector< string > xmlPaths = SMESH_Gen::GetPluginXMLPaths(); LDOMParser xmlParser; for ( size_t i = 0; i < xmlPaths.size(); ++i ) { @@ -3977,7 +4068,7 @@ _pyHypothesisReader::_pyHypothesisReader() LDOM_NodeList algoNodeList = xmlDoc.getElementsByTagName( "algorithm" ); for ( int i = 0; i < algoNodeList.getLength(); ++i ) { - LDOM_Node algoNode = algoNodeList.item( i ); + LDOM_Node algoNode = algoNodeList.item( i ); LDOM_Element& algoElem = (LDOM_Element&) algoNode; LDOM_NodeList pyAlgoNodeList = algoElem.getElementsByTagName( "algo" ); if ( pyAlgoNodeList.getLength() < 1 ) continue; @@ -4039,7 +4130,43 @@ _pyHypothesisReader::_pyHypothesisReader() } } } - } + // + // + // + // SetEnforcedVertex, + // SetEnforcedVertexNamed + // + // + // + // + LDOM_NodeList hypNodeList = xmlDoc.getElementsByTagName( "hypothesis" ); + for ( int i = 0; i < hypNodeList.getLength(); ++i ) + { + LDOM_Node hypNode = hypNodeList.item( i ); + LDOM_Element& hypElem = (LDOM_Element&) hypNode; + _AString hypType = hypElem.getAttribute("type"); + LDOM_NodeList methNodeList = hypElem.getElementsByTagName( "accumulative-methods" ); + if ( methNodeList.getLength() != 1 || hypType.IsEmpty() ) continue; + + map<_AString, Handle(_pyHypothesis)>::const_iterator type2hyp = myType2Hyp.find( hypType ); + if ( type2hyp == myType2Hyp.end() ) continue; + + LDOM_Node methNode = methNodeList.item( 0 ); + LDOM_Node textNode = methNode.getFirstChild(); + _AString text = textNode.getNodeValue(); + _AString method; + int pos = 1; + do { + method = _pyCommand::GetWord( text, pos, /*forward= */true ); + pos += method.Length(); + type2hyp->second->AddAccumulativeMethod( method ); + } + while ( !method.IsEmpty() ); + } + + } // loop on xmlPaths } //================================================================================