From 02f6648ec5378aea69bdb633fe98d672f9dc0b6a Mon Sep 17 00:00:00 2001 From: mpv Date: Tue, 12 Feb 2019 10:05:47 +0300 Subject: [PATCH] Corrections and tests for the Fillet feature history: make generated faces present in the history as a generated named object --- src/FeaturesPlugin/CMakeLists.txt | 1 + src/FeaturesPlugin/FeaturesPlugin_Fillet.cpp | 69 +++++++-------- .../Test/TestBooleanCommon_SolidsHistory.py | 2 +- src/FeaturesPlugin/Test/TestFillet_History.py | 83 +++++++++++++++++++ src/Model/Model_AttributeSelection.cpp | 9 +- src/Model/Model_BodyBuilder.cpp | 9 +- src/Model/Model_BodyBuilder.h | 3 +- src/Model/Model_ResultBody.cpp | 9 +- src/Model/Model_ResultBody.h | 3 +- src/ModelAPI/ModelAPI_BodyBuilder.h | 3 +- src/ModelAPI/ModelAPI_ResultBody.h | 3 +- src/ModelAPI/Test/Test2358_2.py | 9 +- 12 files changed, 148 insertions(+), 55 deletions(-) create mode 100644 src/FeaturesPlugin/Test/TestFillet_History.py diff --git a/src/FeaturesPlugin/CMakeLists.txt b/src/FeaturesPlugin/CMakeLists.txt index d9e923df2..0ccf71b03 100644 --- a/src/FeaturesPlugin/CMakeLists.txt +++ b/src/FeaturesPlugin/CMakeLists.txt @@ -435,6 +435,7 @@ ADD_UNIT_TESTS(TestExtrusion.py TestFillet.py TestFillet1.py TestFillet_ErrorMsg.py + TestFillet_History.py TestScale1.py TestScale2.py Test1816.py diff --git a/src/FeaturesPlugin/FeaturesPlugin_Fillet.cpp b/src/FeaturesPlugin/FeaturesPlugin_Fillet.cpp index 6419dfe57..0782bbb12 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Fillet.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Fillet.cpp @@ -104,9 +104,9 @@ void FeaturesPlugin_Fillet::execute() if (!aCreationMethod) return; - GeomAPI_DataMapOfShapeMapOfShapes aSolidsAndSubs; + std::list > aSolidsAndSubs; - // getting objects and sort them accroding to parent solids + // getting objects and sort them according to parent solids AttributeSelectionListPtr anObjectsSelList = selectionList(OBJECT_LIST_ID()); for (int anObjectsIndex = 0; anObjectsIndex < anObjectsSelList->size(); ++anObjectsIndex) { AttributeSelectionPtr anObjectAttr = anObjectsSelList->value(anObjectsIndex); @@ -128,12 +128,26 @@ void FeaturesPlugin_Fillet::execute() if (!aParent) return; + // searching this parent is already in the list aSolidsAndSubs + std::list >::iterator aSearch = aSolidsAndSubs.begin(); + ListOfShape* aFound; + for(; aSearch != aSolidsAndSubs.end(); aSearch++) { + if (aSearch->first->isSame(aParent)) { + aFound = &(aSearch->second); + break; + } + } + if (aSearch == aSolidsAndSubs.end()) { // not found, so, add a new one + aSolidsAndSubs.push_back(std::pair(aParent, ListOfShape())); + aFound = &(aSolidsAndSubs.back().second); + } + ListOfShape anEdgesAndVertices; collectSubs(anObject, anEdgesAndVertices, GeomAPI_Shape::EDGE); collectSubs(anObject, anEdgesAndVertices, GeomAPI_Shape::VERTEX); for (ListOfShape::iterator aEIt = anEdgesAndVertices.begin(); aEIt != anEdgesAndVertices.end(); ++aEIt) - aSolidsAndSubs.add(aParent, *aEIt); + aFound->push_back(*aEIt); } bool isFixedRadius = true; @@ -155,10 +169,10 @@ void FeaturesPlugin_Fillet::execute() std::vector aResultBaseAlgoList; ListOfShape anOriginalShapesList, aResultShapesList; - GeomAPI_DataMapOfShapeMapOfShapes::iterator anIt = aSolidsAndSubs.begin(); + std::list >::iterator anIt = aSolidsAndSubs.begin(); for (; anIt != aSolidsAndSubs.end(); ++anIt) { - GeomShapePtr aSolid = anIt.first(); - ListOfShape aFilletEdgesAndVertices = anIt.second(); + GeomShapePtr aSolid = anIt->first; + ListOfShape aFilletEdgesAndVertices = anIt->second; ListOfShape aFilletEdges = selectEdges(aFilletEdgesAndVertices); if (isFixedRadius) @@ -190,6 +204,15 @@ void FeaturesPlugin_Fillet::execute() aResultBaseAlgoList.push_back(aRBA); aResultShapesList.push_back(aResult); anOriginalShapesList.push_back(aSolid); + + const std::string aFilletFaceName = "Fillet"; + ListOfShape::iterator aSelectedBase = aFilletEdges.begin(); + for(; aSelectedBase != aFilletEdges.end(); aSelectedBase++) { + GeomShapePtr aBase = *aSelectedBase; + // Store new faces generated from edges and vertices + aResultBody->loadGeneratedShapes( + aFilletBuilder, aBase, GeomAPI_Shape::EDGE, aFilletFaceName, true); + } } // Store deleted shapes after all results has been proceeded. This is to avoid issue when in one @@ -200,37 +223,3 @@ void FeaturesPlugin_Fillet::execute() removeResults(aResultIndex); } - -void FeaturesPlugin_Fillet::loadNamingDS( - std::shared_ptr theResultBody, - const std::shared_ptr theBaseShape, - const std::shared_ptr theResultShape, - const std::shared_ptr& theMakeShape) -{ - //load result - if(theBaseShape->isEqual(theResultShape)) { - theResultBody->store(theResultShape, false); - return; - } - - theResultBody->storeModified(theBaseShape, theResultShape); - - const std::string aFilletFaceName = "Fillet_Face"; - - // Store modified faces - theResultBody->loadModifiedShapes(theMakeShape, theBaseShape, GeomAPI_Shape::FACE); - - // Store new faces generated from edges and vertices - theResultBody->loadGeneratedShapes(theMakeShape, - theBaseShape, - GeomAPI_Shape::EDGE, - aFilletFaceName); - theResultBody->loadGeneratedShapes(theMakeShape, - theBaseShape, - GeomAPI_Shape::VERTEX, - aFilletFaceName); - - // Deleted shapes - theResultBody->loadDeletedShapes(theMakeShape, theBaseShape, GeomAPI_Shape::EDGE); - theResultBody->loadDeletedShapes(theMakeShape, theBaseShape, GeomAPI_Shape::FACE); -} diff --git a/src/FeaturesPlugin/Test/TestBooleanCommon_SolidsHistory.py b/src/FeaturesPlugin/Test/TestBooleanCommon_SolidsHistory.py index b59c0182c..5fd15d851 100644 --- a/src/FeaturesPlugin/Test/TestBooleanCommon_SolidsHistory.py +++ b/src/FeaturesPlugin/Test/TestBooleanCommon_SolidsHistory.py @@ -18,7 +18,7 @@ ## email : webmaster.salome@opencascade.com ## -# Test that the history of Common operation works correctly after movement of groups after this Common feature: +# Test that the history of Common operation works correctly after movement of groups after this Common feature # -*- coding: utf-8 -*- diff --git a/src/FeaturesPlugin/Test/TestFillet_History.py b/src/FeaturesPlugin/Test/TestFillet_History.py new file mode 100644 index 000000000..45f17b0aa --- /dev/null +++ b/src/FeaturesPlugin/Test/TestFillet_History.py @@ -0,0 +1,83 @@ +## 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 that the history of Fillet operation works correctly after movement of groups after this Fillet feature: +# Faces are modified, edges that were used for fillet are removed + +# -*- coding: utf-8 -*- + +from salome.shaper import model +from ModelAPI import * +from GeomAPI import * +from SketchAPI 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(23.0955987576144, 26.85924638608351, -23.50862068965518, 26.85924638608351) +SketchLine_2 = Sketch_1.addLine(-23.50862068965518, 26.85924638608351, -23.50862068965518, -11.11713209726581) +SketchLine_3 = Sketch_1.addLine(-23.50862068965518, -11.11713209726581, 23.0955987576144, -11.11713209726581) +SketchLine_4 = Sketch_1.addLine(23.0955987576144, -11.11713209726581, 23.0955987576144, 26.85924638608351) +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_3.endPoint(), SketchLine_4.startPoint()) +SketchConstraintCoincidence_3.setName("SketchConstraintCoincidence_4") +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(2.024890803123894, -11.11713209726581, 23.0955987576144, 26.85924638608351) +SketchConstraintCoincidence_4 = Sketch_1.setCoincident(SketchLine_1.startPoint(), SketchLine_5.endPoint()) +SketchConstraintCoincidence_4.setName("SketchConstraintCoincidence_6") +SketchConstraintCoincidence_5 = Sketch_1.setCoincident(SketchLine_5.startPoint(), SketchLine_3.result()) +SketchConstraintCoincidence_5.setName("SketchConstraintCoincidence_5") +SketchConstraintCoincidence_6 = Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint()) +SketchConstraintCoincidence_6.setName("SketchConstraintCoincidence_7") +model.do() +Extrusion_1 = model.addExtrusion(Part_1_doc, [model.selection("FACE", "Sketch_1/Face-SketchLine_3f-SketchLine_4f-SketchLine_5r"), model.selection("FACE", "Sketch_1/Face-SketchLine_1r-SketchLine_2f-SketchLine_3f-SketchLine_5f")], model.selection(), 10, 0) +Group_1_objects = [model.selection("FACE", "Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_2"), model.selection("FACE", "Extrusion_1_1_2/To_Face"), model.selection("FACE", "Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_3")] +Group_1 = model.addGroup(Part_1_doc, Group_1_objects) +Group_2_objects = [model.selection("EDGE", "[Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_2][Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_3]"), model.selection("EDGE", "[Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_2][Extrusion_1_1_2/To_Face]"), model.selection("EDGE", "[Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_1][Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_2]"), model.selection("EDGE", "[Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_5][Extrusion_1_1_2/To_Face]")] +Group_2 = model.addGroup(Part_1_doc, Group_2_objects) +Fillet_1_objects = [model.selection("EDGE", "[Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_2][Extrusion_1_1_2/To_Face]"), model.selection("EDGE", "[Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_1][Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_2]"), model.selection("EDGE", "[Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_2][Extrusion_1_1_2/From_Face]")] +Fillet_1 = model.addFillet(Part_1_doc, Fillet_1_objects, 2) +model.do() +# move groups after the Fillet +Part_1_doc.moveFeature(Group_1.feature(), Fillet_1.feature()) +Part_1_doc.moveFeature(Group_2.feature(), Group_1.feature()) +model.end() + +# check groups are correct +aFactory = ModelAPI_Session.get().validators() +selectionList = Group_1.feature().selectionList("group_list") +assert(selectionList.size() == 3) +assert(aFactory.validate(Group_1.feature())) +for i in range(3): + assert(Group_1.groupList().value(i).value().shapeType() == GeomAPI_Shape.FACE) + +selectionList = Group_2.feature().selectionList("group_list") +assert(selectionList.size() == 2) +assert(aFactory.validate(Group_2.feature())) +for i in range(2): + assert(Group_2.groupList().value(i).value().shapeType() == GeomAPI_Shape.EDGE) + +assert(model.checkPythonDump()) diff --git a/src/Model/Model_AttributeSelection.cpp b/src/Model/Model_AttributeSelection.cpp index 91bfa0608..b57449f13 100644 --- a/src/Model/Model_AttributeSelection.cpp +++ b/src/Model/Model_AttributeSelection.cpp @@ -1473,9 +1473,12 @@ void Model_AttributeSelection::updateInHistory(bool& theRemove) GeomAPI_Shape::ShapeType aListShapeType = GeomAPI_Shape::SHAPE; if (myParent) { - if (myParent->selectionType() == "VERTEX") aListShapeType = GeomAPI_Shape::VERTEX; - else if (myParent->selectionType() == "EDGE") aListShapeType = GeomAPI_Shape::EDGE; - else if (myParent->selectionType() == "FACE") aListShapeType = GeomAPI_Shape::FACE; + if (myParent->selectionType() == "VERTEX" || myParent->selectionType() == "Vertices") + aListShapeType = GeomAPI_Shape::VERTEX; + else if (myParent->selectionType() == "EDGE" || myParent->selectionType() == "Edges") + aListShapeType = GeomAPI_Shape::EDGE; + else if (myParent->selectionType() == "FACE" || myParent->selectionType() == "Faces") + aListShapeType = GeomAPI_Shape::FACE; } std::list::iterator aNewCont = aNewContexts.begin(); diff --git a/src/Model/Model_BodyBuilder.cpp b/src/Model/Model_BodyBuilder.cpp index 3d990c7d9..f65a38951 100755 --- a/src/Model/Model_BodyBuilder.cpp +++ b/src/Model/Model_BodyBuilder.cpp @@ -647,7 +647,8 @@ void Model_BodyBuilder::loadModifiedShapes(const GeomMakeShapePtr& theAlgo, void Model_BodyBuilder::loadGeneratedShapes(const GeomMakeShapePtr& theAlgo, const GeomShapePtr& theOldShape, const GeomAPI_Shape::ShapeType theShapeTypeToExplore, - const std::string& theName) + const std::string& theName, + const bool theSaveOldIfNotInTree) { GeomShapePtr aResultShape = shape(); TopTools_MapOfShape anAlreadyProcessedShapes; @@ -668,7 +669,11 @@ void Model_BodyBuilder::loadGeneratedShapes(const GeomMakeShapePtr& theAlgo, bool anOldSubShapeNotInTree = !isShapeInTree(aData->shapeLab(), anAccess2, anOldSubShape_, anOriginalLabel); if (anOldSubShapeAlreadyProcessed || anOldSubShapeNotInTree) { - continue; + if (theSaveOldIfNotInTree) { + std::string aSelectionName = theName + "Selected"; + generated(anOldSubShape, aSelectionName, false); + } else + continue; } // Get new shapes. diff --git a/src/Model/Model_BodyBuilder.h b/src/Model/Model_BodyBuilder.h index 17e7635ea..13c911517 100755 --- a/src/Model/Model_BodyBuilder.h +++ b/src/Model/Model_BodyBuilder.h @@ -112,7 +112,8 @@ public: virtual void loadGeneratedShapes(const GeomMakeShapePtr& theAlgo, const GeomShapePtr& theOldShape, const GeomAPI_Shape::ShapeType theShapeTypeToExplore, - const std::string& theName = "") override; + const std::string& theName = "", + const bool theSaveOldIfNotInTree = false) override; /// Loads shapes of the first level (to be used during shape import) MODEL_EXPORT virtual void loadFirstLevel(GeomShapePtr theShape, diff --git a/src/Model/Model_ResultBody.cpp b/src/Model/Model_ResultBody.cpp index 68e0c990d..3a7c77452 100644 --- a/src/Model/Model_ResultBody.cpp +++ b/src/Model/Model_ResultBody.cpp @@ -78,7 +78,8 @@ bool Model_ResultBody::generated(const GeomShapePtr& theNewShape, void Model_ResultBody::loadGeneratedShapes(const std::shared_ptr& theAlgo, const GeomShapePtr& theOldShape, const GeomAPI_Shape::ShapeType theShapeTypeToExplore, - const std::string& theName) + const std::string& theName, + const bool theSaveOldIfNotInTree) { if (mySubs.size()) { // consists of subs for (std::vector::const_iterator aSubIter = mySubs.cbegin(); @@ -86,10 +87,12 @@ void Model_ResultBody::loadGeneratedShapes(const std::shared_ptrloadGeneratedShapes(theAlgo, theOldShape, theShapeTypeToExplore, theName); + aSub->loadGeneratedShapes( + theAlgo, theOldShape, theShapeTypeToExplore, theName, theSaveOldIfNotInTree); } } else { // do for this directly - myBuilder->loadGeneratedShapes(theAlgo, theOldShape, theShapeTypeToExplore, theName); + myBuilder->loadGeneratedShapes( + theAlgo, theOldShape, theShapeTypeToExplore, theName, theSaveOldIfNotInTree); } } diff --git a/src/Model/Model_ResultBody.h b/src/Model/Model_ResultBody.h index 629b7c808..68ae62c3b 100644 --- a/src/Model/Model_ResultBody.h +++ b/src/Model/Model_ResultBody.h @@ -69,7 +69,8 @@ public: virtual void loadGeneratedShapes(const std::shared_ptr& theAlgo, const GeomShapePtr& theOldShape, const GeomAPI_Shape::ShapeType theShapeTypeToExplore, - const std::string& theName = "") override; + const std::string& theName = "", + const bool theSaveOldIfNotInTree = false) override; /// load modified shapes for sub-objects MODEL_EXPORT diff --git a/src/ModelAPI/ModelAPI_BodyBuilder.h b/src/ModelAPI/ModelAPI_BodyBuilder.h index 7fce455c6..10803b8c7 100755 --- a/src/ModelAPI/ModelAPI_BodyBuilder.h +++ b/src/ModelAPI/ModelAPI_BodyBuilder.h @@ -101,7 +101,8 @@ public: virtual void loadGeneratedShapes(const GeomMakeShapePtr& theAlgo, const GeomShapePtr& theOldShape, const GeomAPI_Shape::ShapeType theShapeTypeToExplore, - const std::string& theName = "") = 0; + const std::string& theName = "", + const bool theSaveOldIfNotInTree = false) = 0; /// load shapes of the first level (to be used during shape import) virtual void loadFirstLevel(GeomShapePtr theShape, diff --git a/src/ModelAPI/ModelAPI_ResultBody.h b/src/ModelAPI/ModelAPI_ResultBody.h index dc9ed31da..4918b2791 100644 --- a/src/ModelAPI/ModelAPI_ResultBody.h +++ b/src/ModelAPI/ModelAPI_ResultBody.h @@ -158,7 +158,8 @@ public: virtual void loadGeneratedShapes(const std::shared_ptr& theAlgo, const GeomShapePtr& theOldShape, const GeomAPI_Shape::ShapeType theShapeTypeToExplore, - const std::string& theName = "") = 0; + const std::string& theName = "", + const bool theSaveOldIfNotInTree = false) = 0; /// load shapes of the first level (to be used during shape import) MODELAPI_EXPORT virtual void loadFirstLevel(GeomShapePtr theShape, diff --git a/src/ModelAPI/Test/Test2358_2.py b/src/ModelAPI/Test/Test2358_2.py index 8dee86cf4..284b28a30 100644 --- a/src/ModelAPI/Test/Test2358_2.py +++ b/src/ModelAPI/Test/Test2358_2.py @@ -111,9 +111,14 @@ Sketch_3.result().setName("Sketch_4") ExtrusionCut_2 = model.addExtrusionCut(Part_1_doc, [model.selection("COMPOUND", "Sketch_4")], model.selection(), "h", 0, [model.selection("SOLID", "ExtrusionCut_1_1")]) Fillet_1_objects = [model.selection("EDGE", "[ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/To_Face][(ExtrusionCut_1_1/Modified_Face&Sketch_1/SketchLine_1)(ExtrusionCut_2_1/Modified_Face&Sketch_3/SketchLine_12)(ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/To_Face)]"), model.selection("EDGE", "[(ExtrusionCut_1_1/Modified_Face&Sketch_1/SketchLine_3)(ExtrusionCut_2_1/Modified_Face&Sketch_3/SketchLine_12)(ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/To_Face)][ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/To_Face]"), model.selection("EDGE", "[Extrusion_1_1/Generated_Face&Sketch_1/SketchLine_2][ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/To_Face]"), model.selection("EDGE", "[ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/From_Face][Extrusion_1_1/Generated_Face&Sketch_1/SketchLine_2]"), model.selection("EDGE", "[(ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/From_Face)(ExtrusionCut_2_1/Modified_Face&Sketch_3/SketchLine_9)(ExtrusionCut_1_1/Modified_Face&Sketch_1/SketchLine_3)][ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/From_Face]"), model.selection("EDGE", "[ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/From_Face][(ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/From_Face)(ExtrusionCut_2_1/Modified_Face&Sketch_3/SketchLine_9)(ExtrusionCut_1_1/Modified_Face&Sketch_1/SketchLine_1)]"), model.selection("EDGE", "[ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/From_Face][ExtrusionCut_1_1/Modified_Face&Sketch_1/SketchLine_3]"), model.selection("EDGE", "[ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/From_Face][ExtrusionCut_1_1/Modified_Face&Sketch_1/SketchLine_1]"), model.selection("EDGE", "[ExtrusionCut_1_1/Modified_Face&Sketch_1/SketchLine_3][ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/To_Face]"), model.selection("EDGE", "[ExtrusionCut_1_1/Modified_Face&Sketch_1/SketchLine_1][ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/To_Face]"), model.selection("EDGE", "[ExtrusionCut_1_1/Modified_Face&Sketch_1/SketchLine_3][(ExtrusionCut_1_1/Modified_Face&Sketch_1/SketchLine_3)(ExtrusionCut_2_1/Modified_Face&Sketch_3/SketchLine_12)(ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/To_Face)]"), model.selection("EDGE", "[(ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/From_Face)(ExtrusionCut_2_1/Modified_Face&Sketch_3/SketchLine_9)(ExtrusionCut_1_1/Modified_Face&Sketch_1/SketchLine_3)][ExtrusionCut_1_1/Modified_Face&Sketch_1/SketchLine_3]"), model.selection("EDGE", "[(ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/From_Face)(ExtrusionCut_2_1/Modified_Face&Sketch_3/SketchLine_9)(ExtrusionCut_1_1/Modified_Face&Sketch_1/SketchLine_1)][ExtrusionCut_1_1/Modified_Face&Sketch_1/SketchLine_1]"), model.selection("EDGE", "[ExtrusionCut_1_1/Modified_Face&Sketch_1/SketchLine_1][(ExtrusionCut_1_1/Modified_Face&Sketch_1/SketchLine_1)(ExtrusionCut_2_1/Modified_Face&Sketch_3/SketchLine_12)(ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/To_Face)]"), model.selection("EDGE", "[(ExtrusionCut_1_1/Modified_Face&Sketch_1/SketchLine_1)(ExtrusionCut_2_1/Modified_Face&Sketch_3/SketchLine_12)(ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/To_Face)][ExtrusionCut_2_1/Generated_Face&Sketch_4/SketchLine_16&weak_name_2]"), model.selection("EDGE", "[(ExtrusionCut_1_1/Modified_Face&Sketch_1/SketchLine_3)(ExtrusionCut_2_1/Modified_Face&Sketch_3/SketchLine_12)(ExtrusionCut_2_1/Modified_Face&Extrusion_1_1/To_Face)][ExtrusionCut_2_1/Generated_Face&Sketch_4/SketchLine_18&weak_name_2]")] Fillet_1 = model.addFillet(Part_1_doc, Fillet_1_objects, 2) -Group_1_objects = [model.selection("FACE", "Fillet_1_1/MF:Fillet_Face&Sketch_1/SketchLine_4&weak_name_1"), model.selection("FACE", "Fillet_1_1/MF:Fillet_Face&Sketch_1/SketchLine_4&weak_name_4"), model.selection("FACE", "Fillet_1_1/MF:Fillet_Face&Sketch_1/SketchLine_4&weak_name_2"), model.selection("FACE", "Fillet_1_1/MF:Fillet_Face&Sketch_1/SketchLine_4&weak_name_3")] +Group_1_objects = [ +model.selection("FACE", "(Fillet_1_1/GF:Fillet&Fillet_1_1/FilletSelected_14)(Fillet_1_1/MF:Fillet_Face&Sketch_3/SketchLine_12)(Fillet_1_1/GF:Fillet&Fillet_1_1/FilletSelected_15)(Fillet_1_1/GF:Fillet&Fillet_1_1/FilletSelected_1)"), +model.selection("FACE", "(Fillet_1_1/MF:Fillet_Face&Sketch_3/SketchLine_12)(Fillet_1_1/GF:Fillet&Fillet_1_1/FilletSelected_11)(Fillet_1_1/GF:Fillet&Fillet_1_1/FilletSelected_16)(Fillet_1_1/GF:Fillet&Fillet_1_1/FilletSelected_2)"), +model.selection("FACE", "(Fillet_1_1/MF:Fillet_Face&Sketch_3/SketchLine_9)(Fillet_1_1/GF:Fillet&Fillet_1_1/FilletSelected_13)(Fillet_1_1/GF:Fillet&Fillet_1_1/FilletSelected_6)"), +model.selection("FACE", "(Fillet_1_1/GF:Fillet&Fillet_1_1/FilletSelected_5)(Fillet_1_1/MF:Fillet_Face&Sketch_3/SketchLine_9)(Fillet_1_1/GF:Fillet&Fillet_1_1/FilletSelected_12)") +] Group_1 = model.addGroup(Part_1_doc, Group_1_objects) -Group_2 = model.addGroup(Part_1_doc, [model.selection("EDGE", "[(Fillet_1_1/MF:Fillet_Face&Sketch_1/SketchLine_3)(Fillet_1_1/MF:Fillet_Face&Extrusion_1_1/To_Face)][Fillet_1_1/MF:Fillet_Face&Extrusion_1_1/To_Face]"), model.selection("EDGE", "[Fillet_1_1/MF:Fillet_Face&Sketch_1/SketchLine_3][(Fillet_1_1/MF:Fillet_Face&Sketch_1/SketchLine_3)(Fillet_1_1/MF:Fillet_Face&Extrusion_1_1/To_Face)]")]) +Group_2 = model.addGroup(Part_1_doc, [model.selection("EDGE", "[Fillet_1_1/GF:Fillet&Fillet_1_1/FilletSelected_9][Fillet_1_1/MF:Fillet_Face&Extrusion_1_1/To_Face]"), model.selection("EDGE", "[Fillet_1_1/MF:Fillet_Face&Sketch_1/SketchLine_3][Fillet_1_1/GF:Fillet&Fillet_1_1/FilletSelected_9]")]) Group_3 = model.addGroup(Part_1_doc, [model.selection("VERTEX", "[Fillet_1_1/MF:Fillet_Face&Sketch_3/SketchLine_9][ExtrusionCut_1_1/Generated_Face&Sketch_3/SketchLine_13][Fillet_1_1/MF:Fillet_Face&Sketch_1/SketchLine_3]"), model.selection("VERTEX", "[ExtrusionCut_1_1/Generated_Face&Sketch_3/SketchLine_13][Fillet_1_1/MF:Fillet_Face&Sketch_1/SketchLine_3][Fillet_1_1/MF:Fillet_Face&Sketch_3/SketchLine_12]")]) model.do() -- 2.39.2