From 7200a7ec838f50608e08446670e78b9e6a4c79f3 Mon Sep 17 00:00:00 2001 From: dbv Date: Thu, 23 Nov 2017 13:51:09 +0300 Subject: [PATCH] Issue #2304: 1.1.2.1 To modify Partition Now after partition faces and edges that are included as sub-shapes of other shapes does not included into result. --- src/FeaturesPlugin/CMakeLists.txt | 1 + src/FeaturesPlugin/Test/Test2304.py | 69 +++++++++++++++++++++++ src/GeomAlgoAPI/GeomAlgoAPI_Partition.cpp | 50 +++++++++++++++- src/ModelAPI/Test/Test2228.py | 9 +-- src/ModelAPI/Test/Test2241.py | 35 ++++++++---- 5 files changed, 143 insertions(+), 21 deletions(-) create mode 100644 src/FeaturesPlugin/Test/Test2304.py diff --git a/src/FeaturesPlugin/CMakeLists.txt b/src/FeaturesPlugin/CMakeLists.txt index 9fc5d6d3f..0ebd6b158 100644 --- a/src/FeaturesPlugin/CMakeLists.txt +++ b/src/FeaturesPlugin/CMakeLists.txt @@ -186,4 +186,5 @@ ADD_UNIT_TESTS(TestExtrusion.py Test2251.py Test2255.py Test2289.py + Test2304.py ) diff --git a/src/FeaturesPlugin/Test/Test2304.py b/src/FeaturesPlugin/Test/Test2304.py new file mode 100644 index 000000000..cd9c8d689 --- /dev/null +++ b/src/FeaturesPlugin/Test/Test2304.py @@ -0,0 +1,69 @@ +## 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 +## + +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(64.44596912521442, 49.72041166380789, -52.66552315608919, 49.72041166380789) +SketchLine_2 = Sketch_1.addLine(-52.66552315608919, 49.72041166380789, -52.66552315608919, -67.3910806174957) +SketchLine_3 = Sketch_1.addLine(-52.66552315608919, -67.3910806174957, 64.44596912521442, -67.3910806174957) +SketchLine_4 = Sketch_1.addLine(64.44596912521442, -67.3910806174957, 64.44596912521442, 49.72041166380789) +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(34.99485420240136, 11.60720411663807, -11.7804459691252, 11.60720411663807) +SketchLine_6 = Sketch_1.addLine(-11.7804459691252, 11.60720411663807, -11.7804459691252, -33.78216123499142) +SketchLine_7 = Sketch_1.addLine(-11.7804459691252, -33.78216123499142, 34.99485420240136, -33.78216123499142) +SketchLine_8 = Sketch_1.addLine(34.99485420240136, -33.78216123499142, 34.99485420240136, 11.60720411663807) +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("FACE", "Sketch_1/Face-SketchLine_5f-SketchLine_6f-SketchLine_7f-SketchLine_8f")], model.selection(), 100, 100) +Face_1 = model.addFace(Part_1_doc, [model.selection("EDGE", "Sketch_1/Edge-SketchLine_2"), model.selection("EDGE", "Sketch_1/Edge-SketchLine_1"), model.selection("EDGE", "Sketch_1/Edge-SketchLine_4"), model.selection("EDGE", "Sketch_1/Edge-SketchLine_3")]) +Partition_1 = model.addPartition(Part_1_doc, [model.selection("SOLID", "Extrusion_1_1"), model.selection("FACE", "Face_1_1")]) +model.do() +model.end() + +from GeomAPI import GeomAPI_Shape + +model.testNbResults(Partition_1, 1) +model.testNbSubResults(Partition_1, [2]) +model.testNbSubShapes(Partition_1, GeomAPI_Shape.SOLID, [2]) +model.testNbSubShapes(Partition_1, GeomAPI_Shape.FACE, [13]) +model.testNbSubShapes(Partition_1, GeomAPI_Shape.EDGE, [56]) +model.testNbSubShapes(Partition_1, GeomAPI_Shape.VERTEX, [112]) +model.testResultsVolumes(Partition_1, [424620.237783511402085423469543457]) + +assert(model.checkPythonDump()) diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Partition.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Partition.cpp index 4222649a8..de1551c6b 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Partition.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Partition.cpp @@ -25,10 +25,23 @@ #include +#include #include #include #include +//================================================================================================= +bool isSubShape(const TopoDS_Shape& theShape, const TopoDS_Shape& theSubShape) +{ + for(TopExp_Explorer anExp(theShape, theSubShape.ShapeType()); anExp.More(); anExp.Next()) { + if(theSubShape.IsSame(anExp.Current())) { + return true; + } + } + + return false; +} + //================================================================================================= std::shared_ptr GeomAlgoAPI_Partition::make(const ListOfShape& theObjects, const ListOfShape& theTools) @@ -78,8 +91,10 @@ void GeomAlgoAPI_Partition::build(const ListOfShape& theObjects, TopTools_MapOfShape ShapesMap; // Getting objects. - for(ListOfShape::const_iterator - anObjectsIt = theObjects.begin(); anObjectsIt != theObjects.end(); anObjectsIt++) { + for(ListOfShape::const_iterator anObjectsIt = theObjects.begin(); + anObjectsIt != theObjects.end(); + anObjectsIt++) + { const TopoDS_Shape& aShape = (*anObjectsIt)->impl(); // #2240: decompose compounds to get the valid result TopTools_ListOfShape aSimpleShapes; @@ -112,6 +127,37 @@ void GeomAlgoAPI_Partition::build(const ListOfShape& theObjects, #endif TopoDS_Shape aResult = anOperation->Shape(); + if(aResult.ShapeType() == TopAbs_COMPOUND) { + // Exclude faces and edges which are shared as another sub-shape. + NCollection_Vector aFacesAndEdges; + TopoDS_Compound aTempCompound; + TopoDS_Builder aBuilder; + aBuilder.MakeCompound(aTempCompound); + for(TopoDS_Iterator anIt(aResult); + anIt.More(); + anIt.Next()) { + const TopoDS_Shape& aSubShape = anIt.Value(); + if (aSubShape.ShapeType() == TopAbs_FACE || aSubShape.ShapeType() == TopAbs_EDGE) { + aFacesAndEdges.Append(aSubShape); + } else { + aBuilder.Add(aTempCompound, aSubShape); + } + } + + for (NCollection_Vector::Iterator anIt(aFacesAndEdges); + anIt.More(); + anIt.Next()) + { + const TopoDS_Shape& aSubShape = anIt.Value(); + if (!isSubShape(aTempCompound, aSubShape)) + { + aBuilder.Add(aTempCompound, aSubShape); + } + } + + aResult = aTempCompound; + } + if(aResult.ShapeType() == TopAbs_COMPOUND) { std::shared_ptr aGeomShape(new GeomAPI_Shape); aGeomShape->setImpl(new TopoDS_Shape(aResult)); diff --git a/src/ModelAPI/Test/Test2228.py b/src/ModelAPI/Test/Test2228.py index 8515a6f96..3b4f0a032 100644 --- a/src/ModelAPI/Test/Test2228.py +++ b/src/ModelAPI/Test/Test2228.py @@ -59,7 +59,7 @@ Extrusion_4 = model.addExtrusion(Part_1_doc, [model.selection("WIRE", "Sketch_1/ Boolean_2 = model.addCut(Part_1_doc, [model.selection("SOLID", "Extrusion_1_1")], [model.selection("SOLID", "Extrusion_4_1")]) Partition_1 = model.addPartition(Part_1_doc, [model.selection("SOLID", "Extrusion_1_1"), model.selection("SOLID", "Extrusion_2_1"), model.selection("FACE", "Face_1_1")]) Remove_SubShapes_1 = model.addRemoveSubShapes(Part_1_doc, model.selection("COMPOUND", "Extrusion_1_1")) -Remove_SubShapes_1.setSubShapesToKeep([model.selection("COMPSOLID", "Partition_1_1_1"), model.selection("FACE", "Partition_1_1_3"), model.selection("FACE", "Partition_1_1_4"), model.selection("FACE", "Partition_1_1_5"), model.selection("FACE", "Partition_1_1_6"), model.selection("FACE", "Partition_1_1_7")]) +Remove_SubShapes_1.setSubShapesToKeep([model.selection("COMPSOLID", "Partition_1_1_1")]) model.end() @@ -67,10 +67,5 @@ model.end() from ModelAPI import * aFactory = ModelAPI_Session.get().validators() assert(aFactory.validate(Remove_SubShapes_1.feature())) -assert(Remove_SubShapes_1.subshapes().size() == 6) +assert(Remove_SubShapes_1.subshapes().size() == 1) assert(Remove_SubShapes_1.subshapes().value(0).namingName() == "Partition_1_1_1") -assert(Remove_SubShapes_1.subshapes().value(1).namingName() == "Partition_1_1_3") -assert(Remove_SubShapes_1.subshapes().value(2).namingName() == "Partition_1_1_4") -assert(Remove_SubShapes_1.subshapes().value(3).namingName() == "Partition_1_1_5") -assert(Remove_SubShapes_1.subshapes().value(4).namingName() == "Partition_1_1_6") -assert(Remove_SubShapes_1.subshapes().value(5).namingName() == "Partition_1_1_7") diff --git a/src/ModelAPI/Test/Test2241.py b/src/ModelAPI/Test/Test2241.py index 168d1cd21..89c8a70ee 100644 --- a/src/ModelAPI/Test/Test2241.py +++ b/src/ModelAPI/Test/Test2241.py @@ -151,7 +151,7 @@ Shell_1 = model.addShell(Part_1_doc, [model.selection("FACE", "MultiTranslation_ Shell_1.result().setName("Shell_1_1") Partition_1 = model.addPartition(Part_1_doc, [model.selection("FACE", "Face_3_1"), model.selection("FACE", "Face_3_2"), model.selection("FACE", "Face_4_1"), model.selection("FACE", "Face_2_1"), model.selection("FACE", "Face_1_1"), model.selection("FACE", "Face_3_5"), model.selection("FACE", "Face_3_3"), model.selection("FACE", "Face_3_4"), model.selection("FACE", "Face_3_7"), model.selection("FACE", "Face_3_6"), model.selection("FACE", "Face_3_8"), model.selection("FACE", "Face_3_9"), model.selection("FACE", "Face_3_10"), model.selection("FACE", "Face_3_11"), model.selection("FACE", "Face_3_12"), model.selection("SHELL", "Shell_1_1")]) Remove_SubShapes_1 = model.addRemoveSubShapes(Part_1_doc, model.selection("COMPOUND", "Face_3_1")) -Remove_SubShapes_1.setSubShapesToKeep([model.selection("FACE", "Partition_1_1_2"), model.selection("FACE", "Partition_1_1_3"), model.selection("FACE", "Partition_1_1_4"), model.selection("FACE", "Partition_1_1_5"), model.selection("FACE", "Partition_1_1_6"), model.selection("FACE", "Partition_1_1_7"), model.selection("FACE", "Partition_1_1_8"), model.selection("FACE", "Partition_1_1_9"), model.selection("FACE", "Partition_1_1_10"), model.selection("FACE", "Partition_1_1_11"), model.selection("FACE", "Partition_1_1_12"), model.selection("FACE", "Partition_1_1_13"), model.selection("FACE", "Partition_1_1_14"), model.selection("FACE", "Partition_1_1_15"), model.selection("FACE", "Partition_1_1_16"), model.selection("FACE", "Partition_1_1_17"), model.selection("FACE", "Partition_1_1_18"), model.selection("FACE", "Partition_1_1_19"), model.selection("FACE", "Partition_1_1_20"), model.selection("FACE", "Partition_1_1_21"), model.selection("FACE", "Partition_1_1_22"), model.selection("FACE", "Partition_1_1_23"), model.selection("FACE", "Partition_1_1_24"), model.selection("FACE", "Partition_1_1_25"), model.selection("FACE", "Partition_1_1_26"), model.selection("FACE", "Partition_1_1_27"), model.selection("FACE", "Partition_1_1_28"), model.selection("FACE", "Partition_1_1_29"), model.selection("FACE", "Partition_1_1_30"), model.selection("FACE", "Partition_1_1_31"), model.selection("FACE", "Partition_1_1_32"), model.selection("FACE", "Partition_1_1_33"), model.selection("FACE", "Partition_1_1_34"), model.selection("FACE", "Partition_1_1_35"), model.selection("FACE", "Partition_1_1_36"), model.selection("FACE", "Partition_1_1_37"), model.selection("FACE", "Partition_1_1_38"), model.selection("FACE", "Partition_1_1_39"), model.selection("FACE", "Partition_1_1_40"), model.selection("FACE", "Partition_1_1_41"), model.selection("FACE", "Partition_1_1_42"), model.selection("FACE", "Partition_1_1_43"), model.selection("FACE", "Partition_1_1_44"), model.selection("FACE", "Partition_1_1_45"), model.selection("FACE", "Partition_1_1_46"), model.selection("FACE", "Partition_1_1_47"), model.selection("FACE", "Partition_1_1_48"), model.selection("FACE", "Partition_1_1_49"), model.selection("FACE", "Partition_1_1_50"), model.selection("FACE", "Partition_1_1_51"), model.selection("FACE", "Partition_1_1_52"), model.selection("FACE", "Partition_1_1_53"), model.selection("FACE", "Partition_1_1_54"), model.selection("FACE", "Partition_1_1_55"), model.selection("FACE", "Partition_1_1_56"), model.selection("FACE", "Partition_1_1_57")]) +Remove_SubShapes_1.setSubShapesToKeep([model.selection("FACE", "Partition_1_1_2"), model.selection("FACE", "Partition_1_1_3"), model.selection("FACE", "Partition_1_1_4"), model.selection("FACE", "Partition_1_1_5"), model.selection("FACE", "Partition_1_1_6"), model.selection("FACE", "Partition_1_1_7"), model.selection("FACE", "Partition_1_1_8"), model.selection("FACE", "Partition_1_1_9")]) model.end() # move groups @@ -161,16 +161,27 @@ Part_1_doc.moveFeature(Group_2.feature(), Group_1.feature()) Part_1_doc.moveFeature(Group_3.feature(), Group_2.feature()) model.end() -# check that groups 2 and 3 are correct, but Group_1 elements are removed (because shell is removed) +# check that group 2 is correct, but Group_1 and Group_3 elements are removed (because shell is removed) from ModelAPI import * aFactory = ModelAPI_Session.get().validators() -for Group in [Group_1, Group_2, Group_3]: - if Group != Group_1: - assert(aFactory.validate(Group.feature())) - assert(Group.groupList().size() != 0) - for a in range(Group.groupList().size()): - if Group == Group_1: - assert(len(Group.groupList().value(a).namingName()) == 0) - else: - assert(Group.groupList().value(a).value().shapeTypeStr() == "FACE") - assert(len(Group.groupList().value(a).namingName()) > 0) + +assert(Group_1.groupList().size() != 0) +for a in range(Group_1.groupList().size()): + assert(len(Group_1.groupList().value(a).namingName()) == 0) + +assert(aFactory.validate(Group_3.feature())) +assert(Group_3.groupList().size() != 0) +for a in range(Group_3.groupList().size()): + assert(Group_3.groupList().value(a).value().shapeTypeStr() == "FACE") + assert(len(Group_3.groupList().value(a).namingName()) > 0) + +# for Group in [Group_1, Group_2, Group_3]: +# if Group == Group_2: +# assert(aFactory.validate(Group.feature())) +# assert(Group.groupList().size() != 0) +# for a in range(Group.groupList().size()): +# if Group != Group_2: +# assert(len(Group.groupList().value(a).namingName()) == 0) +# else: +# assert(Group.groupList().value(a).value().shapeTypeStr() == "FACE") +# assert(len(Group.groupList().value(a).namingName()) > 0) -- 2.39.2