From 082f07c5a84968fbdc8df7f3e1c9e6c2b6a6f043 Mon Sep 17 00:00:00 2001 From: mpv Date: Tue, 23 Jan 2018 17:33:35 +0300 Subject: [PATCH] Fix for the issue #2415 : generation of wide naming structure for the Compound feature --- src/BuildPlugin/BuildPlugin_Compound.cpp | 38 +++++++----- src/BuildPlugin/CMakeLists.txt | 1 + src/BuildPlugin/Test/Test2415.py | 66 +++++++++++++++++++++ src/Model/Model_BodyBuilder.cpp | 7 ++- src/SketcherPrs/SketcherPrs_PositionMgr.cpp | 4 +- 5 files changed, 99 insertions(+), 17 deletions(-) create mode 100644 src/BuildPlugin/Test/Test2415.py diff --git a/src/BuildPlugin/BuildPlugin_Compound.cpp b/src/BuildPlugin/BuildPlugin_Compound.cpp index 4df84ee1f..69c8551bb 100644 --- a/src/BuildPlugin/BuildPlugin_Compound.cpp +++ b/src/BuildPlugin/BuildPlugin_Compound.cpp @@ -23,6 +23,7 @@ #include #include +#include #include @@ -56,28 +57,37 @@ void BuildPlugin_Compound::execute() for (int anIndex = 0; anIndex < aSelectionList->size(); ++anIndex) { AttributeSelectionPtr aSelection = aSelectionList->value(anIndex); GeomShapePtr aShape = aSelection->value(); - if (!aShape.get()) + if (!aShape.get()) { + if (!aSelection->context().get()) { + setError("Invalid selection"); + return; + } aShape = aSelection->context()->shape(); + } anOriginalShapes.push_back(aShape); } // Build compound. GeomShapePtr aCompound = GeomAlgoAPI_CompoundBuilder::compound(anOriginalShapes); - int anIndexToRemove = 0; - if (aCompound) { - ResultBodyPtr aResultBody = document()->createBody(data(), anIndexToRemove++); - aResultBody->store(aCompound); + // Copy shape. + GeomAlgoAPI_Copy aCopyAlgo(aCompound); + GeomShapePtr aCopyCompound = aCopyAlgo.shape(); -//// // Store faces -//// std::shared_ptr aMapOfSubs = theAlgorithm->mapOfSubShapes(); -//// int aModifiedTag = 1; -//// for(ListOfShape::const_iterator anIt = theOriginalShapes.cbegin(); -//// anIt != theOriginalShapes.cend(); ++anIt) { -//// GeomShapePtr aShape = *anIt; -//// aResultBody->loadAndOrientModifiedShapes(theAlgorithm.get(), aShape, GeomAPI_Shape::FACE, -//// aModifiedTag, "Modified_Face", *aMapOfSubs.get(), false, true, true); -//// } + int anIndexToRemove = 0; + if (aCopyCompound) { + std::shared_ptr aMapOfShapes = aCopyAlgo.mapOfSubShapes(); + ResultBodyPtr aResultBody = document()->createBody(data(), anIndexToRemove++); + aResultBody->store(aCopyCompound); + aResultBody->loadAndOrientModifiedShapes(&aCopyAlgo, aCompound, GeomAPI_Shape::VERTEX, + 1, "Modified_Vertex", *aMapOfShapes.get(), + true, false, true); + aResultBody->loadAndOrientModifiedShapes(&aCopyAlgo, aCompound, GeomAPI_Shape::EDGE, + 100000, "Modified_Edge", *aMapOfShapes.get(), + true, false, true); + aResultBody->loadAndOrientModifiedShapes(&aCopyAlgo, aCompound, GeomAPI_Shape::FACE, + 200000, "Modified_Face", *aMapOfShapes.get(), + true, false, true); setResult(aResultBody); } removeResults(anIndexToRemove); diff --git a/src/BuildPlugin/CMakeLists.txt b/src/BuildPlugin/CMakeLists.txt index afa4e6c00..f83476d8f 100644 --- a/src/BuildPlugin/CMakeLists.txt +++ b/src/BuildPlugin/CMakeLists.txt @@ -112,4 +112,5 @@ ADD_UNIT_TESTS(TestVertex.py TestFilling_Mixed.py Test1920.py Test2398.py + Test2415.py ) diff --git a/src/BuildPlugin/Test/Test2415.py b/src/BuildPlugin/Test/Test2415.py new file mode 100644 index 000000000..64e30318c --- /dev/null +++ b/src/BuildPlugin/Test/Test2415.py @@ -0,0 +1,66 @@ +## 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 SketchAPI import * + +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(0, 80, 0, 150) +SketchProjection_1 = Sketch_1.addProjection(model.selection("EDGE", "PartSet/OY"), False) +SketchLine_2 = SketchProjection_1.createdFeature() +SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_1.startPoint(), SketchLine_2.result()) +SketchLine_3 = Sketch_1.addLine(0, 150, 150, 150) +SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchLine_3.startPoint()) +SketchLine_4 = Sketch_1.addLine(150, 150, 150, 0) +SketchConstraintCoincidence_3 = Sketch_1.setCoincident(SketchLine_3.endPoint(), SketchLine_4.startPoint()) +SketchLine_5 = Sketch_1.addLine(150, 0, 80, 0) +SketchConstraintCoincidence_4 = Sketch_1.setCoincident(SketchLine_4.endPoint(), SketchLine_5.startPoint()) +SketchProjection_2 = Sketch_1.addProjection(model.selection("EDGE", "PartSet/OX"), False) +SketchLine_6 = SketchProjection_2.createdFeature() +SketchConstraintCoincidence_5 = Sketch_1.setCoincident(SketchLine_5.endPoint(), SketchLine_6.result()) +SketchConstraintHorizontal_1 = Sketch_1.setHorizontal(SketchLine_5.result()) +SketchConstraintVertical_1 = Sketch_1.setVertical(SketchLine_1.result()) +SketchConstraintPerpendicular_1 = Sketch_1.setPerpendicular(SketchLine_1.result(), SketchLine_3.result()) +SketchConstraintPerpendicular_2 = Sketch_1.setPerpendicular(SketchLine_4.result(), SketchLine_5.result()) +SketchConstraintEqual_1 = Sketch_1.setEqual(SketchLine_1.result(), SketchLine_5.result()) +SketchArc_1 = Sketch_1.addArc(0, 0, 80, 0, 0, 80, False) +SketchConstraintCoincidence_6 = Sketch_1.setCoincident(SketchLine_5.endPoint(), SketchArc_1.startPoint()) +SketchConstraintCoincidence_7 = Sketch_1.setCoincident(SketchLine_1.startPoint(), SketchArc_1.endPoint()) +SketchConstraintCoincidence_8 = Sketch_1.setCoincident(SketchAPI_Line(SketchLine_6).startPoint(), SketchArc_1.center()) +SketchConstraintRadius_1 = Sketch_1.setRadius(SketchArc_1.results()[1], 80) +SketchConstraintLength_1 = Sketch_1.setLength(SketchLine_3.result(), 150) +model.do() +Extrusion_1 = model.addExtrusion(Part_1_doc, [model.selection("FACE", "Sketch_1/Face-SketchLine_1r-SketchLine_3r-SketchLine_4r-SketchLine_5r-SketchArc_1_2r")], model.selection(), 200, 0) +Compound_1_objects = [model.selection("FACE", "Extrusion_1_1/To_Face_1"), model.selection("FACE", "Extrusion_1_1/Generated_Face_3"), model.selection("FACE", "Extrusion_1_1/Generated_Face_4")] +Compound_1 = model.addCompound(Part_1_doc, Compound_1_objects) +Compound_2_objects = [model.selection("EDGE", "Compound_1_1_2/Modified_Edge_2"), model.selection("EDGE", "Sketch_1/Edge-SketchLine_4"), model.selection("EDGE", "Compound_1_1_3/Modified_Edge_2")] +Compound_2 = model.addCompound(Part_1_doc, Compound_2_objects) +model.do() + +model.testHaveNamingSubshapes(Compound_2,model,Part_1_doc) + +model.end() + +assert(model.checkPythonDump()) diff --git a/src/Model/Model_BodyBuilder.cpp b/src/Model/Model_BodyBuilder.cpp index d17fb8bd6..66e03f1b6 100755 --- a/src/Model/Model_BodyBuilder.cpp +++ b/src/Model/Model_BodyBuilder.cpp @@ -421,7 +421,9 @@ void Model_BodyBuilder::loadAndOrientModifiedShapes ( for (; aShapeExplorer.More(); aShapeExplorer.Next ()) { const TopoDS_Shape& aRoot = aShapeExplorer.Current (); if (!aView.Add(aRoot)) continue; - if (TNaming_Tool::NamedShape(aRoot, builder(theTag)->NamedShape()->Label()).IsNull()) + bool aNotInTree = + TNaming_Tool::NamedShape(aRoot, builder(theTag)->NamedShape()->Label()).IsNull(); + if (aNotInTree && !theIsStoreSeparate) continue; // there is no sense to write history if old shape does not exist in the document ListOfShape aList; std::shared_ptr aRShape(new GeomAPI_Shape()); @@ -476,6 +478,9 @@ void Model_BodyBuilder::loadAndOrientModifiedShapes ( // Here we store shapes as generated, to avoid problem when one parent shape produce // several child shapes. In this case naming could not determine which shape to select. builder(aBuilderTag)->Generated(aRoot, aNewShape); + } else if (aNotInTree) { + // not in tree -> store as primitive (stored as separated) + builder(aBuilderTag)->Generated(aNewShape); } else { builder(aBuilderTag)->Modify(aRoot, aNewShape); } diff --git a/src/SketcherPrs/SketcherPrs_PositionMgr.cpp b/src/SketcherPrs/SketcherPrs_PositionMgr.cpp index 3238fb248..edf7140a8 100644 --- a/src/SketcherPrs/SketcherPrs_PositionMgr.cpp +++ b/src/SketcherPrs/SketcherPrs_PositionMgr.cpp @@ -288,8 +288,8 @@ std::list getCurves(const GeomPointPtr& thePnt, const SketcherPrs_Sym int aNbSubs = aOwner->numberOfSubs(); for (int i = 0; i < aNbSubs; i++) { FeaturePtr aFeature = aOwner->subFeature(i); - if (!aFeature->firstResult().get()) // There is no result - continue; + if (!aFeature->firstResult().get() || aFeature->firstResult()->isDisabled()) + continue; // There is no result if (aFeature->getKind() == SketchPlugin_Line::ID()) { AttributePoint2DPtr aSPnt1 = std::dynamic_pointer_cast( -- 2.39.2