X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSelector%2FSelector_Container.cpp;h=e37c7fd7aabc8cffe253a9322380b9b3cdcab6d9;hb=77ce6d35ac8d2f0fdaecb4f23e0870bf74e36103;hp=f10fa46d68f6bd1c63c49e67a3a4e32e241ae475;hpb=3a5b3112ad7799da9cae19aa208ba30b972afb2f;p=modules%2Fshaper.git diff --git a/src/Selector/Selector_Container.cpp b/src/Selector/Selector_Container.cpp index f10fa46d6..e37c7fd7a 100644 --- a/src/Selector/Selector_Container.cpp +++ b/src/Selector/Selector_Container.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2024 CEA, EDF // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -12,10 +12,9 @@ // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include @@ -71,7 +70,6 @@ bool Selector_Container::restore() return false; myShapeType = TopAbs_ShapeEnum(aShapeTypeAttr->Get()); // restore sub-selectors - bool aSubResult = true; for(TDF_ChildIterator aSub(label(), false); aSub.More(); aSub.Next()) { Selector_Algo* aSubSel = restoreByLab(aSub.Value(), baseDocument()); if (!append(aSubSel, false)) { @@ -81,15 +79,26 @@ bool Selector_Container::restore() return true; } -TDF_Label Selector_Container::restoreByName(std::string theName, +TDF_Label Selector_Container::restoreByName(std::wstring theName, const TopAbs_ShapeEnum theShapeType, Selector_NameGenerator* theNameGenerator) { myShapeType = theShapeType; TDF_Label aContext; - for(size_t aStart = 0; aStart != std::string::npos; aStart = theName.find('[', aStart + 1)) { - size_t anEndPos = theName.find(']', aStart + 1); - if (anEndPos != std::string::npos) { - std::string aSubStr = theName.substr(aStart + 1, anEndPos - aStart - 1); + for(size_t aStart = 0; aStart != std::wstring::npos; aStart = theName.find('[', aStart + 1)) { + size_t anEndPos = theName.find(L']', aStart + 1); + if (anEndPos != std::wstring::npos) { + // there could be sub-intersections, so, [[...]] case; searching for other open-bracket + size_t aNextStart = theName.find(L'[', aStart + 1); + while(aNextStart != std::wstring::npos && aNextStart < anEndPos) { + anEndPos = theName.find(L']', anEndPos + 1); + if (anEndPos == std::wstring::npos) { + return TDF_Label(); // invalid parentheses + } + aNextStart = theName.find(L'[', aNextStart + 1); + } + if (anEndPos == std::wstring::npos) + return TDF_Label(); // invalid parentheses + std::wstring aSubStr = theName.substr(aStart + 1, anEndPos - aStart - 1); TopAbs_ShapeEnum aSubShapeType = TopAbs_FACE; switch (myShapeType) { case TopAbs_COMPSOLID: aSubShapeType = TopAbs_SOLID; break; @@ -98,8 +107,8 @@ TDF_Label Selector_Container::restoreByName(std::string theName, } TDF_Label aSubContext; Selector_Algo* aSubSel = - Selector_Algo::restoreByName( - newSubLabel(), baseDocument(), aSubStr, aSubShapeType, theNameGenerator, aSubContext); + Selector_Algo::restoreByName(newSubLabel(), baseDocument(), aSubStr, aSubShapeType, + geometricalNaming(), theNameGenerator, aSubContext); if (!append(aSubSel)) return TDF_Label(); @@ -116,6 +125,7 @@ TDF_Label Selector_Container::restoreByName(std::string theName, } } else return TDF_Label(); // invalid parentheses + aStart = anEndPos; // for recursive parenthesis set start on the current end } return aContext; } @@ -150,6 +160,8 @@ bool Selector_Container::solve(const TopoDS_Shape& theContext) aResult = aWire; break; } + default: + break; } TopoDS_ListOfShape aSubSelectorShapes; std::list::const_iterator aSubSel = list().cbegin(); @@ -166,9 +178,9 @@ bool Selector_Container::solve(const TopoDS_Shape& theContext) return false; } -std::string Selector_Container::name(Selector_NameGenerator* theNameGenerator) +std::wstring Selector_Container::name(Selector_NameGenerator* theNameGenerator) { - std::string aResult; + std::wstring aResult; // add names of sub-components one by one in "[]" std::list::const_iterator aSubSel = list().cbegin(); for(; aSubSel != list().cend(); aSubSel++) {