From 6e8ad427fa4d5d644b401a52b726c356c374f856 Mon Sep 17 00:00:00 2001 From: azv Date: Mon, 4 Jun 2018 17:13:05 +0300 Subject: [PATCH] Issue #2496: Wrong name in group of faces after load of a python dump Fix incorrect searching shapes which context has the same name (e.g. "Face_1_1/Face_1_1") --- src/Model/Model_Document.cpp | 19 +++++++----- src/ModelAPI/CMakeLists.txt | 1 + src/ModelAPI/Test/Test2496.py | 54 +++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 src/ModelAPI/Test/Test2496.py diff --git a/src/Model/Model_Document.cpp b/src/Model/Model_Document.cpp index cd276ffff..ae27c2af2 100755 --- a/src/Model/Model_Document.cpp +++ b/src/Model/Model_Document.cpp @@ -1412,35 +1412,40 @@ TDF_Label Model_Document::findNamingName(std::string theName, ResultPtr theConte if (theContext != myObjs->object(aLabIter->Father())) continue; } + // copy aSubName to avoid incorrect further processing after its suffix cutting + TCollection_ExtendedString aSubNameCopy(aSubName); // searching sub-labels with this name TDF_ChildIDIterator aNamesIter(*aLabIter, TDataStd_Name::GetID(), Standard_True); for(; aNamesIter.More(); aNamesIter.Next()) { Handle(TDataStd_Name) aName = Handle(TDataStd_Name)::DownCast(aNamesIter.Value()); - if (aName->Get() == aSubName) + if (aName->Get() == aSubNameCopy) return aName->Label(); } // If not found child label with the exact sub-name, then try to find compound with // such sub-name without suffix. - Standard_Integer aSuffixPos = aSubName.SearchFromEnd('_'); - if (aSuffixPos != -1 && aSuffixPos != aSubName.Length()) { - TCollection_ExtendedString anIndexStr = aSubName.Split(aSuffixPos); - aSubName.Remove(aSuffixPos); + Standard_Integer aSuffixPos = aSubNameCopy.SearchFromEnd('_'); + if (aSuffixPos != -1 && aSuffixPos != aSubNameCopy.Length()) { + TCollection_ExtendedString anIndexStr = aSubNameCopy.Split(aSuffixPos); + aSubNameCopy.Remove(aSuffixPos); aNamesIter.Initialize(*aLabIter, TDataStd_Name::GetID(), Standard_True); for(; aNamesIter.More(); aNamesIter.Next()) { Handle(TDataStd_Name) aName = Handle(TDataStd_Name)::DownCast(aNamesIter.Value()); - if (aName->Get() == aSubName) { + if (aName->Get() == aSubNameCopy) { return aName->Label(); } } // check also "this" label Handle(TDataStd_Name) aName; if (aLabIter->FindAttribute(TDataStd_Name::GetID(), aName)) { - if (aName->Get() == aSubName) { + if (aName->Get() == aSubNameCopy) { return aName->Label(); } } } } + // verify context's name is same as sub-component's and use context's label + if (aSubName.IsEqual(anObjName.c_str())) + return *(aFind->second.rbegin()); } } return TDF_Label(); // not found diff --git a/src/ModelAPI/CMakeLists.txt b/src/ModelAPI/CMakeLists.txt index d1633aa42..e1a25a71b 100644 --- a/src/ModelAPI/CMakeLists.txt +++ b/src/ModelAPI/CMakeLists.txt @@ -201,4 +201,5 @@ ADD_UNIT_TESTS(TestConstants.py Test2396.py Test2401.py Test2413.py + Test2496.py ) diff --git a/src/ModelAPI/Test/Test2496.py b/src/ModelAPI/Test/Test2496.py new file mode 100644 index 000000000..9fefd0831 --- /dev/null +++ b/src/ModelAPI/Test/Test2496.py @@ -0,0 +1,54 @@ +## Copyright (C) 2018-20xx CEA/DEN, EDF R&D +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## 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 +## +## See http:##www.salome-platform.org/ or +## email : webmaster.salome@opencascade.com +## + +from salome.shaper import model + +model.begin() +partSet = model.moduleDocument() +Part_1 = model.addPart(partSet) +Part_1_doc = Part_1.document() +Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY")) +SketchLine_1 = Sketch_1.addLine(85, -50, -60, -50) +SketchLine_2 = Sketch_1.addLine(-60, -50, -60, 45) +SketchLine_3 = Sketch_1.addLine(-60, 45, 85, 45) +SketchLine_4 = Sketch_1.addLine(85, 45, 85, -50) +SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_4.endPoint(), SketchLine_1.startPoint()) +SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchLine_2.startPoint()) +SketchConstraintCoincidence_3 = Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint()) +SketchConstraintCoincidence_4 = Sketch_1.setCoincident(SketchLine_3.endPoint(), SketchLine_4.startPoint()) +SketchConstraintHorizontal_1 = Sketch_1.setHorizontal(SketchLine_1.result()) +SketchConstraintVertical_1 = Sketch_1.setVertical(SketchLine_2.result()) +SketchConstraintHorizontal_2 = Sketch_1.setHorizontal(SketchLine_3.result()) +SketchConstraintVertical_2 = Sketch_1.setVertical(SketchLine_4.result()) +model.do() +Face_1 = model.addFace(Part_1_doc, [model.selection("FACE", "Sketch_1/Face-SketchLine_1r-SketchLine_2r-SketchLine_3r-SketchLine_4r")]) +Sketch_2 = model.addSketch(Part_1_doc, model.selection("FACE", "Sketch_1/Face-SketchLine_1r-SketchLine_2r-SketchLine_3r-SketchLine_4r")) +SketchCircle_1 = Sketch_2.addCircle(0, -10, 25) +model.do() +Face_2 = model.addFace(Part_1_doc, [model.selection("FACE", "Sketch_2/Face-SketchCircle_1_2f")]) +Partition_1 = model.addPartition(Part_1_doc, [model.selection("FACE", "Face_2_1"), model.selection("FACE", "Face_1_1")]) +Group_1 = model.addGroup(Part_1_doc, [model.selection("FACE", "Face_2_1/Face_2_1"), model.selection("FACE", "Partition_1_1_1")]) +model.do() + +assert(Group_1.feature().error() == "") + +model.end() + +assert(model.checkPythonDump()) -- 2.30.2