From: mpv Date: Fri, 8 Feb 2019 12:52:19 +0000 (+0300) Subject: Fix for the issue #2854 : Group of faces in error after modification of a sketch... X-Git-Tag: V9_3_0a1~17 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=b5ea4f782aa21dd9542e1c5520b81bc8e0e52dc6;p=modules%2Fshaper.git Fix for the issue #2854 : Group of faces in error after modification of a sketch. Now an order of results of extrusion depend only on order of creation of sketch elements in selected sketch faces. --- diff --git a/src/FeaturesPlugin/CMakeLists.txt b/src/FeaturesPlugin/CMakeLists.txt index 76d3aa6e7..2862540e1 100644 --- a/src/FeaturesPlugin/CMakeLists.txt +++ b/src/FeaturesPlugin/CMakeLists.txt @@ -447,4 +447,5 @@ ADD_UNIT_TESTS(TestExtrusion.py Test2617.py Test2729.py Test2751.py + Test2854.py ) diff --git a/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp b/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp index 1c16b04fc..fdc01668f 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp @@ -222,13 +222,8 @@ void FeaturesPlugin_CompositeSketch::getBaseShapes(ListOfShape& theBaseShapesLis // Searching faces with common edges. if(theIsMakeShells && aBaseFacesList.size() > 1) { - ListOfShape aShells; - ListOfShape aFreeFaces; GeomShapePtr aFacesCompound = GeomAlgoAPI_CompoundBuilder::compound(aBaseFacesList); - GeomAlgoAPI_ShapeTools::combineShapes(aFacesCompound, GeomAPI_Shape::SHELL, - aShells, aFreeFaces); - theBaseShapesList.insert(theBaseShapesList.end(), aFreeFaces.begin(), aFreeFaces.end()); - theBaseShapesList.insert(theBaseShapesList.end(), aShells.begin(), aShells.end()); + GeomAlgoAPI_ShapeTools::combineShapes(aFacesCompound, GeomAPI_Shape::SHELL, theBaseShapesList); } else { theBaseShapesList.insert(theBaseShapesList.end(), aBaseFacesList.begin(), aBaseFacesList.end()); diff --git a/src/FeaturesPlugin/FeaturesPlugin_Pipe.cpp b/src/FeaturesPlugin/FeaturesPlugin_Pipe.cpp index b81823597..c5b91cd58 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Pipe.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Pipe.cpp @@ -147,14 +147,9 @@ void FeaturesPlugin_Pipe::execute() // Searching faces with common edges. if(aCreationMethod == CREATION_METHOD_SIMPLE()) { - ListOfShape aShells; - ListOfShape aFreeFaces; std::shared_ptr aFacesCompound = GeomAlgoAPI_CompoundBuilder::compound(aBaseFacesList); - GeomAlgoAPI_ShapeTools::combineShapes(aFacesCompound, GeomAPI_Shape::SHELL, - aShells, aFreeFaces); - aBaseShapesList.insert(aBaseShapesList.end(), aFreeFaces.begin(), aFreeFaces.end()); - aBaseShapesList.insert(aBaseShapesList.end(), aShells.begin(), aShells.end()); + GeomAlgoAPI_ShapeTools::combineShapes(aFacesCompound, GeomAPI_Shape::SHELL, aBaseShapesList); } else { aBaseShapesList.insert(aBaseShapesList.end(), aBaseFacesList.begin(), aBaseFacesList.end()); } @@ -168,7 +163,7 @@ void FeaturesPlugin_Pipe::execute() std::shared_ptr aPathShape = std::dynamic_pointer_cast(aPathSelection->value()); if(!aPathShape.get() && aPathSelection->context().get()) { - // Probaply it is a construction. + // Probably it is a construction. aPathShape = aPathSelection->context()->shape(); } if(!aPathShape.get() || aPathShape->isNull()) { diff --git a/src/FeaturesPlugin/FeaturesPlugin_Validators.cpp b/src/FeaturesPlugin/FeaturesPlugin_Validators.cpp index 0c9afd4a6..f8193c2a8 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Validators.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Validators.cpp @@ -1117,14 +1117,10 @@ bool FeaturesPlugin_ValidatorUnionArguments::isValid( // Make compound and find connected. GeomShapePtr aCompound = GeomAlgoAPI_CompoundBuilder::compound(aBaseShapesList); - ListOfShape aCombined, aFree; - GeomAlgoAPI_ShapeTools::combineShapes( - aCompound, - aType, - aCombined, - aFree); - - if(aFree.size() > 0 || aCombined.size() > 1) { + ListOfShape aResults; + GeomAlgoAPI_ShapeTools::combineShapes(aCompound, aType, aResults); + + if(aResults.size() > 1 || (aResults.size() == 1 && aResults.front()->shapeType() > aType)) { theError = "Error: Not all shapes have shared topology."; return false; } diff --git a/src/FeaturesPlugin/Test/Test1915.py b/src/FeaturesPlugin/Test/Test1915.py index 388ccab83..9b9797e17 100644 --- a/src/FeaturesPlugin/Test/Test1915.py +++ b/src/FeaturesPlugin/Test/Test1915.py @@ -35,7 +35,7 @@ Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY")) SketchCircle_2 = Sketch_2.addCircle(-111.0503834053735, -148.4878232655183, 89.21253106334201) model.do() Extrusion_1 = model.addExtrusion(Part_1_doc, [model.selection("COMPOUND", "Sketch_1"), model.selection("COMPOUND", "Sketch_2")], model.selection(), 10, 0) -Cut_1 = model.addCut(Part_1_doc, [model.selection("SOLID", "Extrusion_1_2_2"), model.selection("SOLID", "Extrusion_1_2_1")], [model.selection("SOLID", "Extrusion_1_1")]) +Cut_1 = model.addCut(Part_1_doc, [model.selection("SOLID", "Extrusion_1_1_2"), model.selection("SOLID", "Extrusion_1_1_1")], [model.selection("SOLID", "Extrusion_1_2")]) model.do() model.end() diff --git a/src/FeaturesPlugin/Test/Test2854.py b/src/FeaturesPlugin/Test/Test2854.py new file mode 100644 index 000000000..4e24debcb --- /dev/null +++ b/src/FeaturesPlugin/Test/Test2854.py @@ -0,0 +1,73 @@ +## Copyright (C) 2014-2017 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 +## + +# Test for the order of extrusion results: even compsolids or solids, they depend on the order +# of created sketch entities + +from salome.shaper import model +from GeomAPI import * + +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(20.52339901477833, 44.52955665024631, -23.88177339901478, 44.52955665024631) +SketchLine_2 = Sketch_1.addLine(-23.88177339901478, 44.52955665024631, -23.88177339901478, 15.29926108374386) +SketchLine_3 = Sketch_1.addLine(-23.88177339901478, 15.29926108374386, 20.52339901477833, 15.29926108374386) +SketchLine_4 = Sketch_1.addLine(20.52339901477833, 15.29926108374386, 20.52339901477833, 44.52955665024631) +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()) +SketchLine_5 = Sketch_1.addLine(29.23029556650247, 27.36453201970445, -5.970443349753695, 27.36453201970445) +SketchLine_6 = Sketch_1.addLine(-5.970443349753695, 27.36453201970445, -5.970443349753695, -13.80665024630542) +SketchLine_7 = Sketch_1.addLine(-5.970443349753695, -13.80665024630542, 29.23029556650247, -13.80665024630542) +SketchLine_8 = Sketch_1.addLine(29.23029556650247, -13.80665024630542, 29.23029556650247, 27.36453201970445) +SketchConstraintCoincidence_5 = Sketch_1.setCoincident(SketchLine_8.endPoint(), SketchLine_5.startPoint()) +SketchConstraintCoincidence_6 = Sketch_1.setCoincident(SketchLine_5.endPoint(), SketchLine_6.startPoint()) +SketchConstraintCoincidence_7 = Sketch_1.setCoincident(SketchLine_6.endPoint(), SketchLine_7.startPoint()) +SketchConstraintCoincidence_8 = Sketch_1.setCoincident(SketchLine_7.endPoint(), SketchLine_8.startPoint()) +SketchConstraintHorizontal_3 = Sketch_1.setHorizontal(SketchLine_5.result()) +SketchConstraintVertical_3 = Sketch_1.setVertical(SketchLine_6.result()) +SketchConstraintHorizontal_4 = Sketch_1.setHorizontal(SketchLine_7.result()) +SketchConstraintVertical_4 = Sketch_1.setVertical(SketchLine_8.result()) +model.do() +Extrusion_1 = model.addExtrusion(Part_1_doc, [model.selection("COMPOUND", "all-in-Sketch_1")], model.selection(), 10, 0) +Group_1_objects = [model.selection("FACE", "Extrusion_1_1_3/Generated_Face&Sketch_1/SketchLine_7"), model.selection("FACE", "Extrusion_1_1_3/Generated_Face&Sketch_1/SketchLine_8"), model.selection("FACE", "Extrusion_1_1_3/Generated_Face&Sketch_1/SketchLine_3"), model.selection("FACE", "Extrusion_1_1_3/Generated_Face&Sketch_1/SketchLine_6"), model.selection("FACE", "Extrusion_1_1_3/From_Face"), model.selection("FACE", "Extrusion_1_1_3/To_Face"), model.selection("FACE", "Extrusion_1_1_3/Generated_Face&Sketch_1/SketchLine_4"), model.selection("FACE", "Extrusion_1_1_3/Generated_Face&Sketch_1/SketchLine_5"), model.selection("FACE", "Extrusion_1_1_1/Generated_Face&Sketch_1/SketchLine_3"), model.selection("FACE", "Extrusion_1_1_1/Generated_Face&Sketch_1/SketchLine_2"), model.selection("FACE", "Extrusion_1_1_1/Generated_Face&Sketch_1/SketchLine_6"), model.selection("FACE", "Extrusion_1_1_1/To_Face"), model.selection("FACE", "Extrusion_1_1_1/From_Face"), model.selection("FACE", "Extrusion_1_1_1/Generated_Face&Sketch_1/SketchLine_5"), model.selection("FACE", "Extrusion_1_1_1/Generated_Face&Sketch_1/SketchLine_1"), model.selection("FACE", "Extrusion_1_1_1/Generated_Face&Sketch_1/SketchLine_4"), model.selection("FACE", "Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_6"), model.selection("FACE", "Extrusion_1_1_2/From_Face"), model.selection("FACE", "Extrusion_1_1_2/To_Face"), model.selection("FACE", "Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_5"), model.selection("FACE", "Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_3"), model.selection("FACE", "Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_4")] +Group_1 = model.addGroup(Part_1_doc, Group_1_objects) +model.do() +# add a circle to the sketch +SketchCircle_1 = Sketch_1.addCircle(-26.84625185927467, -13.07763963304469, 9.031583682868897) +model.end() + +# check group is valid +from ModelAPI import * +aFactory = ModelAPI_Session.get().validators() +assert(aFactory.validate(Group_1.feature())) + +selectionList = Group_1.feature().selectionList("group_list") +assert(selectionList.size() == 22) +for i in range(22): + assert(Group_1.groupList().value(i).value().shapeType() == GeomAPI_Shape.FACE) diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.cpp index c9d9524c4..e30ce1ce9 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Boolean.cpp @@ -117,11 +117,10 @@ void GeomAlgoAPI_Boolean::build(const ListOfShape& theObjects, if(aResult.ShapeType() == TopAbs_COMPOUND) { std::shared_ptr aGeomShape(new GeomAPI_Shape); aGeomShape->setImpl(new TopoDS_Shape(aResult)); - ListOfShape aCompSolids, aFreeSolids; + ListOfShape aResults; aGeomShape = GeomAlgoAPI_ShapeTools::combineShapes(aGeomShape, GeomAPI_Shape::COMPSOLID, - aCompSolids, - aFreeSolids); + aResults); aResult = aGeomShape->impl(); } diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_PaveFiller.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_PaveFiller.cpp index de0eee7eb..6fd48b7db 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_PaveFiller.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_PaveFiller.cpp @@ -73,11 +73,10 @@ void GeomAlgoAPI_PaveFiller::build(const ListOfShape& theListOfShape, if(theIsMakeCompSolids && aResult.ShapeType() == TopAbs_COMPOUND) { std::shared_ptr aGeomShape(new GeomAPI_Shape); aGeomShape->setImpl(new TopoDS_Shape(aResult)); - ListOfShape aCompSolids, aFreeSolids; + ListOfShape aResults; aGeomShape = GeomAlgoAPI_ShapeTools::combineShapes(aGeomShape, GeomAPI_Shape::COMPSOLID, - aCompSolids, - aFreeSolids); + aResults); aResult = aGeomShape->impl(); } diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Prism.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Prism.cpp index d7d6e5b7a..0001717d6 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Prism.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Prism.cpp @@ -412,11 +412,10 @@ void GeomAlgoAPI_Prism::build(const GeomShapePtr& theBaseShape, if(aResult.ShapeType() == TopAbs_COMPOUND) { std::shared_ptr aGeomShape(new GeomAPI_Shape); aGeomShape->setImpl(new TopoDS_Shape(aResult)); - ListOfShape aCompSolids, aFreeSolids; + ListOfShape aResults; aGeomShape = GeomAlgoAPI_ShapeTools::combineShapes(aGeomShape, GeomAPI_Shape::COMPSOLID, - aCompSolids, - aFreeSolids); + aResults); aResult = aGeomShape->impl(); } } diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Revolution.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Revolution.cpp index e7a035cc1..ff194accf 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Revolution.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Revolution.cpp @@ -314,11 +314,10 @@ void GeomAlgoAPI_Revolution::build(const GeomShapePtr& theBaseSh if(aResult.ShapeType() == TopAbs_COMPOUND) { std::shared_ptr aGeomShape(new GeomAPI_Shape); aGeomShape->setImpl(new TopoDS_Shape(aResult)); - ListOfShape aCompSolids, aFreeSolids; + ListOfShape aResults; aGeomShape = GeomAlgoAPI_ShapeTools::combineShapes(aGeomShape, GeomAPI_Shape::COMPSOLID, - aCompSolids, - aFreeSolids); + aResults); aResult = aGeomShape->impl(); } @@ -484,11 +483,10 @@ void GeomAlgoAPI_Revolution::build(const GeomShapePtr& theBaseSh if(aResult.ShapeType() == TopAbs_COMPOUND) { std::shared_ptr aGeomShape(new GeomAPI_Shape); aGeomShape->setImpl(new TopoDS_Shape(aResult)); - ListOfShape aCompSolids, aFreeSolids; + ListOfShape aResults; aGeomShape = GeomAlgoAPI_ShapeTools::combineShapes(aGeomShape, GeomAPI_Shape::COMPSOLID, - aCompSolids, - aFreeSolids); + aResults); aResult = aGeomShape->impl(); } diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp index 6919c0e5a..7d9abbaae 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp @@ -200,9 +200,12 @@ double GeomAlgoAPI_ShapeTools::minimalDistance(const GeomShapePtr& theShape1, std::shared_ptr GeomAlgoAPI_ShapeTools::combineShapes( const std::shared_ptr theCompound, const GeomAPI_Shape::ShapeType theType, - ListOfShape& theCombinedShapes, - ListOfShape& theFreeShapes) + ListOfShape& theResuts) { + + ListOfShape aResCombinedShapes; + ListOfShape aResFreeShapes; + GeomShapePtr aResult = theCompound; if(!theCompound.get()) { @@ -220,17 +223,25 @@ std::shared_ptr GeomAlgoAPI_ShapeTools::combineShapes( aTA = TopAbs_SOLID; } - theCombinedShapes.clear(); - theFreeShapes.clear(); + // map from the resulting shapes to minimal index of the used shape from theCompound list + std::map anInputOrder; + // map from ancestors-shapes to the index of shapes in theCompound + NCollection_DataMap anAncestorsOrder; // Get free shapes. + int anOrder = 0; const TopoDS_Shape& aShapesComp = theCompound->impl(); - for(TopoDS_Iterator anIter(aShapesComp); anIter.More(); anIter.Next() ) { + for(TopoDS_Iterator anIter(aShapesComp); anIter.More(); anIter.Next(), anOrder++) { const TopoDS_Shape& aShape = anIter.Value(); if(aShape.ShapeType() > aTA) { std::shared_ptr aGeomShape(new GeomAPI_Shape); aGeomShape->setImpl(new TopoDS_Shape(aShape)); - theFreeShapes.push_back(aGeomShape); + aResFreeShapes.push_back(aGeomShape); + anInputOrder[aGeomShape] = anOrder; + } else { + for(TopExp_Explorer anExp(aShape, aTA); anExp.More(); anExp.Next()) { + anAncestorsOrder.Bind(anExp.Current(), anOrder); + } } } @@ -240,6 +251,7 @@ std::shared_ptr GeomAlgoAPI_ShapeTools::combineShapes( if(aMapSA.IsEmpty()) { return aResult; } + theResuts.clear(); // Get all shapes with common sub-shapes and free shapes. NCollection_Map aFreeShapes; @@ -305,6 +317,7 @@ std::shared_ptr GeomAlgoAPI_ShapeTools::combineShapes( TopoDS_Shell aShell; TopoDS_CompSolid aCSolid; TopoDS_Builder aBuilder; + anOrder = -1; theType == GeomAPI_Shape::COMPSOLID ? aBuilder.MakeCompSolid(aCSolid) : aBuilder.MakeShell(aShell); NCollection_Map& aShapesMap = anIter.ChangeValue(); @@ -314,56 +327,49 @@ std::shared_ptr GeomAlgoAPI_ShapeTools::combineShapes( theType == GeomAPI_Shape::COMPSOLID ? aBuilder.Add(aCSolid, aShape) : aBuilder.Add(aShell, aShape); aShapesMap.Remove(aShape); + int aThisOrder = anAncestorsOrder.Find(aShape); + if (anOrder == -1 || aThisOrder < anOrder) + anOrder = aThisOrder; // take the minimum order position } } std::shared_ptr aGeomShape(new GeomAPI_Shape); TopoDS_Shape* aSh = theType == GeomAPI_Shape::COMPSOLID ? new TopoDS_Shape(aCSolid) : new TopoDS_Shape(aShell); aGeomShape->setImpl(aSh); - theCombinedShapes.push_back(aGeomShape); - } - - // Adding free shapes in the same order as they are in the initial compound - NCollection_Map aFreeSimple; - for(ListOfShape::iterator aFree = theFreeShapes.begin(); aFree != theFreeShapes.end(); aFree++) { - aFreeSimple.Add((*aFree)->impl()); + aResCombinedShapes.push_back(aGeomShape); + anInputOrder[aGeomShape] = anOrder; } - theFreeShapes.clear(); - for(TopoDS_Iterator anIter(aShapesComp); anIter.More(); anIter.Next() ) { - const TopoDS_Shape& aShape = anIter.Value(); - if((aShape.ShapeType() > aTA && aFreeSimple.Contains(aShape)) || - (aShape.ShapeType() == aTA && aFreeShapes.Contains(aShape))) { + // Adding free shapes. + for(TopExp_Explorer anExp(aShapesComp, aTA); anExp.More(); anExp.Next()) { + const TopoDS_Shape& aShape = anExp.Current(); + if(aFreeShapes.Contains(aShape)) { std::shared_ptr aGeomShape(new GeomAPI_Shape); aGeomShape->setImpl(new TopoDS_Shape(aShape)); - theFreeShapes.push_back(aGeomShape); - } else if (aShape.ShapeType() < aTA) { - for(TopExp_Explorer anExp(aShape, aTA); anExp.More(); anExp.Next()) { - const TopoDS_Shape& aSubShape = anExp.Current(); - if (aFreeShapes.Contains(aSubShape)) { - std::shared_ptr aGeomShape(new GeomAPI_Shape); - aGeomShape->setImpl(new TopoDS_Shape(aSubShape)); - theFreeShapes.push_back(aGeomShape); - } - } + aResFreeShapes.push_back(aGeomShape); + anInputOrder[aGeomShape] = anAncestorsOrder.Find(aShape); } } - if(theCombinedShapes.size() == 1 && theFreeShapes.size() == 0) { - aResult = theCombinedShapes.front(); - } else if(theCombinedShapes.size() == 0 && theFreeShapes.size() == 1) { - aResult = theFreeShapes.front(); + if(aResCombinedShapes.size() == 1 && aResFreeShapes.size() == 0) { + aResult = aResCombinedShapes.front(); + theResuts.push_back(aResult); + } else if(aResCombinedShapes.size() == 0 && aResFreeShapes.size() == 1) { + aResult = aResFreeShapes.front(); + theResuts.push_back(aResult); } else { TopoDS_Compound aResultComp; TopoDS_Builder aBuilder; aBuilder.MakeCompound(aResultComp); - for(ListOfShape::const_iterator anIter = theCombinedShapes.cbegin(); - anIter != theCombinedShapes.cend(); anIter++) { - aBuilder.Add(aResultComp, (*anIter)->impl()); - } - for(ListOfShape::const_iterator anIter = theFreeShapes.cbegin(); - anIter != theFreeShapes.cend(); anIter++) { - aBuilder.Add(aResultComp, (*anIter)->impl()); + // put to result compound and result list in accordance to the order numbers + std::map::iterator anInputIter = anInputOrder.begin(); + std::map aNums; + for(; anInputIter != anInputOrder.end(); anInputIter++) + aNums[anInputIter->second] = anInputIter->first; + std::map::iterator aNumsIter = aNums.begin(); + for(; aNumsIter != aNums.end(); aNumsIter++) { + aBuilder.Add(aResultComp, (aNumsIter->second)->impl()); + theResuts.push_back(aNumsIter->second); } aResult->setImpl(new TopoDS_Shape(aResultComp)); } @@ -503,7 +509,7 @@ std::shared_ptr GeomAlgoAPI_ShapeTools::groupSharedTopology( TopoDS_Compound aCompound; BRep_Builder aBuilder; aBuilder.MakeCompound(aCompound); - ListOfShape aCompSolids, aFreeSolids; + ListOfShape aSolids; for (NCollection_Vector::Iterator anIt(aGroups); anIt.More(); anIt.Next()) { const TopTools_MapOfShape& aGroup = anIt.ChangeValue(); GeomShapePtr aGeomShape(new GeomAPI_Shape()); @@ -521,8 +527,7 @@ std::shared_ptr GeomAlgoAPI_ShapeTools::groupSharedTopology( aGeomShape->setImpl(new TopoDS_Shape(makeCompound(anOrderedGoup))); aGeomShape = GeomAlgoAPI_ShapeTools::combineShapes(aGeomShape, GeomAPI_Shape::COMPSOLID, - aCompSolids, - aFreeSolids); + aSolids); } aBuilder.Add(aCompound, aGeomShape->impl()); } diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.h b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.h index 4c80a6e7c..46f41cf43 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.h +++ b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.h @@ -70,13 +70,10 @@ public: /// \brief Combines faces with common edges to shells, or solids to compsolids. /// \param[in] theCompound compound of shapes. /// \param[in] theType type of combine. - /// \param[out] theCombinedShapes resulting shapes. - /// \param[out] theFreeShapes shapes that does not have common subshapes. + /// \param[out] theResults resulting shapes. GEOMALGOAPI_EXPORT static std::shared_ptr combineShapes( const std::shared_ptr theCompound, - const GeomAPI_Shape::ShapeType theType, - ListOfShape& theCombinedShapes, - ListOfShape& theFreeShapes); + const GeomAPI_Shape::ShapeType theType, ListOfShape& theResults); /// \brief Groups shapes with shared topology to compounds. /// \param[in] theCompound compound of shapes. diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_UnifySameDomain.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_UnifySameDomain.cpp index ee9c6feca..b72e747df 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_UnifySameDomain.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_UnifySameDomain.cpp @@ -48,18 +48,18 @@ void GeomAlgoAPI_UnifySameDomain::build(const ListOfShape& theShapes) // Make compound. GeomShapePtr aCompound = GeomAlgoAPI_CompoundBuilder::compound(theShapes); - ListOfShape aCombined, aFree; + ListOfShape aResults; GeomAlgoAPI_ShapeTools::combineShapes( aCompound, GeomAPI_Shape::SHELL, - aCombined, - aFree); + aResults); - if(aFree.size() > 0 || aCombined.size() > 1) { + if(aResults.size() > 1 || + (aResults.size() == 1 && aResults.front()->shapeType() > GeomAPI_Shape::SHELL)) { return; } - const TopoDS_Shape& aShell = aCombined.front()->impl(); + const TopoDS_Shape& aShell = aResults.front()->impl(); std::shared_ptr aShape(new GeomAPI_Shape()); aShape->setImpl(new TopoDS_Shape(aShell));