From 0a97996addaf64d0d691044cf90b9490e33f2465 Mon Sep 17 00:00:00 2001 From: mpv Date: Wed, 9 Nov 2016 13:52:34 +0300 Subject: [PATCH] Added a unit test and additional update for the issue #1757 --- src/Model/Model_AttributeSelection.cpp | 2 +- src/Model/Model_SelectionNaming.cpp | 20 +++++ src/ModelAPI/CMakeLists.txt | 4 +- src/ModelAPI/Test/Test1757.py | 110 +++++++++++++++++++++++++ 4 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 src/ModelAPI/Test/Test1757.py diff --git a/src/Model/Model_AttributeSelection.cpp b/src/Model/Model_AttributeSelection.cpp index 776460cba..54b3d0f83 100644 --- a/src/Model/Model_AttributeSelection.cpp +++ b/src/Model/Model_AttributeSelection.cpp @@ -979,7 +979,7 @@ void Model_AttributeSelection::selectSubShape( std::shared_ptr aShapeToBeSelected; ResultPtr aCont; if (aSelNaming.selectSubShape(theType, theSubShapeName, aDoc, aShapeToBeSelected, aCont)) { - // try to find the last context to find the up to dat shape + // try to find the last context to find the up to date shape if (aCont->shape().get() && !aCont->shape()->isNull() && aCont->groupName() == ModelAPI_ResultBody::group() && aDoc == owner()->document()) { const TopoDS_Shape aConShape = aCont->shape()->impl(); diff --git a/src/Model/Model_SelectionNaming.cpp b/src/Model/Model_SelectionNaming.cpp index a433e9960..b3090cef9 100644 --- a/src/Model/Model_SelectionNaming.cpp +++ b/src/Model/Model_SelectionNaming.cpp @@ -81,6 +81,26 @@ std::string Model_SelectionNaming::getShapeName( } } } + // if a shape is under another context, use this name, not theContext + std::shared_ptr aContextData = + std::dynamic_pointer_cast(theContext->data()); + // for constructions the naming is in arguments and has no evolution, so, apply this only + // for bodies + if (isNeedContextName && theContext->groupName() == ModelAPI_ResultBody::group() && + !aNS->Label().IsDescendant(aContextData->label())) { + isNeedContextName = false; + TDF_Label aNSDataLab = aNS->Label(); + while(aNSDataLab.Depth() != 7 && aNSDataLab.Depth() > 5) + aNSDataLab = aNSDataLab.Father(); + ObjectPtr aNewContext = theDoc->objects()->object(aNSDataLab); + if (!aNewContext.get() && aNSDataLab.Depth() == 7) { + aNSDataLab = aNSDataLab.Father().Father(); + aNewContext = theDoc->objects()->object(aNSDataLab); + } + if (aNewContext.get()) { + aName = aNewContext->data()->name() + "/" + aName; + } + } } } } diff --git a/src/ModelAPI/CMakeLists.txt b/src/ModelAPI/CMakeLists.txt index 1127806c7..d0890d819 100644 --- a/src/ModelAPI/CMakeLists.txt +++ b/src/ModelAPI/CMakeLists.txt @@ -133,4 +133,6 @@ ADD_UNIT_TESTS(TestConstants.py TestResults.py TestIntArray.py Test1512.py - TestDoubleArray.py) + TestDoubleArray.py + Test1757.py +) diff --git a/src/ModelAPI/Test/Test1757.py b/src/ModelAPI/Test/Test1757.py new file mode 100644 index 000000000..236eac9b4 --- /dev/null +++ b/src/ModelAPI/Test/Test1757.py @@ -0,0 +1,110 @@ +""" + Test1757.py + Unit test for testing the modification of base object after movement of the history line: + the referenced (that is disabled, after the current position of the history line) attribute + must be updated. + The test is created by modification of the dumped script. + +""" + +import model + +#========================================================================= +# Initialize a part +#========================================================================= +model.begin() +partSet = model.moduleDocument() +Part_1 = model.addPart(partSet) +Part_1_doc = Part_1.document() + +#========================================================================= +# Create a base box: rectangular sketch and extrusion +#========================================================================= +Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOZ")) +SketchLine_1 = Sketch_1.addLine(199.69219283509, 125.016366179415, -144.040270241704, 125.016366179415) +SketchLine_2 = Sketch_1.addLine(-144.040270241704, 125.016366179415, -144.040270241704, -111.365692746051) +SketchLine_3 = Sketch_1.addLine(-144.040270241704, -111.365692746051, 199.69219283509, -111.365692746051) +SketchLine_4 = Sketch_1.addLine(199.69219283509, -111.365692746051, 199.69219283509, 125.016366179415) +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()[0]) +SketchConstraintVertical_1 = Sketch_1.setVertical(SketchLine_2.result()[0]) +SketchConstraintHorizontal_2 = Sketch_1.setHorizontal(SketchLine_3.result()[0]) +SketchConstraintVertical_2 = Sketch_1.setVertical(SketchLine_4.result()[0]) +model.do() +Extrusion_1 = model.addExtrusion(Part_1_doc, [model.selection("FACE", "Sketch_1/Face-SketchLine_1f-SketchLine_2f-SketchLine_3f-SketchLine_4f")], model.selection(), 300, 0) + +#========================================================================= +# Cut another rectangle to make a groove +#========================================================================= +ExtrusionCut_1 = model.addExtrusionCut(Part_1_doc, [], model.selection(), model.selection(), 0, model.selection("FACE", "Extrusion_1_1/To_Face_1"), 0, [model.selection("SOLID", "Extrusion_1_1")]) +Sketch_2 = model.addSketch(Part_1_doc, model.selection("FACE", "Extrusion_1_1/From_Face_1")) +SketchLine_5 = Sketch_2.addLine(-47.794137712106, -188.943752610533, 90.842718875892, -188.943752610533) +SketchLine_6 = Sketch_2.addLine(90.842718875892, -188.943752610533, 90.842718875892, -51.567231082425) +SketchLine_7 = Sketch_2.addLine(90.842718875892, -51.567231082425, -47.794137712106, -51.567231082425) +SketchLine_8 = Sketch_2.addLine(-47.794137712106, -51.567231082425, -47.794137712106, -188.943752610533) +SketchConstraintCoincidence_5 = Sketch_2.setCoincident(SketchLine_8.endPoint(), SketchLine_5.startPoint()) +SketchConstraintCoincidence_6 = Sketch_2.setCoincident(SketchLine_5.endPoint(), SketchLine_6.startPoint()) +SketchConstraintCoincidence_7 = Sketch_2.setCoincident(SketchLine_6.endPoint(), SketchLine_7.startPoint()) +SketchConstraintCoincidence_8 = Sketch_2.setCoincident(SketchLine_7.endPoint(), SketchLine_8.startPoint()) +SketchConstraintHorizontal_3 = Sketch_2.setHorizontal(SketchLine_5.result()[0]) +SketchConstraintVertical_3 = Sketch_2.setVertical(SketchLine_6.result()[0]) +SketchConstraintHorizontal_4 = Sketch_2.setHorizontal(SketchLine_7.result()[0]) +SketchConstraintVertical_4 = Sketch_2.setVertical(SketchLine_8.result()[0]) +ExtrusionCut_1.setNestedSketch(Sketch_2) +model.do() + +#========================================================================= +# Make a cylindrical hole using one of the produced faces +#========================================================================= +ExtrusionCut_2 = model.addExtrusionCut(Part_1_doc, [], model.selection(), model.selection(), 0, model.selection("FACE", "Extrusion_1_1/Generated_Face_2"), 0, [model.selection("SOLID", "ExtrusionCut_1_1")]) +Sketch_3 = model.addSketch(Part_1_doc, model.selection("FACE", "ExtrusionCut_1_1/Modfied_4")) +SketchCircle_1 = Sketch_3.addCircle(143.412751420315, -228.52745656314, 32.158435160764) +ExtrusionCut_2.setNestedSketch(Sketch_3) + +#========================================================================= +# Move a history line before this hole creation to modify groove +#========================================================================= +Part_1.document().setCurrentFeature(ExtrusionCut_1.feature(), True) + +#========================================================================= +# Modify the cylindrical hole base face by another groove in the history before the hole is created +#========================================================================= +ExtrusionCut_3 = model.addExtrusionCut(Part_1_doc, [], model.selection(), model.selection(), 0, model.selection("FACE", "Extrusion_1_1/Generated_Face_3"), -50, [model.selection("SOLID", "ExtrusionCut_1_1")]) +Sketch_4 = model.addSketch(Part_1_doc, model.selection("FACE", "Extrusion_1_1/Generated_Face_1")) +SketchLine_9 = Sketch_4.addLine(-176.701443076057, -151.212050129331, -91.83965287802501, -151.212050129331) +SketchLine_10 = Sketch_4.addLine(-91.83965287802501, -151.212050129331, -91.83965287802501, -84.473709256573) +SketchLine_11 = Sketch_4.addLine(-91.83965287802501, -84.473709256573, -176.701443076057, -84.473709256573) +SketchLine_12 = Sketch_4.addLine(-176.701443076057, -84.473709256573, -176.701443076057, -151.212050129331) +SketchConstraintCoincidence_9 = Sketch_4.setCoincident(SketchLine_12.endPoint(), SketchLine_9.startPoint()) +SketchConstraintCoincidence_10 = Sketch_4.setCoincident(SketchLine_9.endPoint(), SketchLine_10.startPoint()) +SketchConstraintCoincidence_11 = Sketch_4.setCoincident(SketchLine_10.endPoint(), SketchLine_11.startPoint()) +SketchConstraintCoincidence_12 = Sketch_4.setCoincident(SketchLine_11.endPoint(), SketchLine_12.startPoint()) +SketchConstraintHorizontal_5 = Sketch_4.setHorizontal(SketchLine_9.result()[0]) +SketchConstraintVertical_5 = Sketch_4.setVertical(SketchLine_10.result()[0]) +SketchConstraintHorizontal_6 = Sketch_4.setHorizontal(SketchLine_11.result()[0]) +SketchConstraintVertical_6 = Sketch_4.setVertical(SketchLine_12.result()[0]) +model.do() +ExtrusionCut_3.setNestedSketch(Sketch_4) + +model.do() + +#========================================================================= +# Move a history line just to the end to recreate the cylindrical hole +#========================================================================= +Part_1.document().setCurrentFeature(ExtrusionCut_2.feature(), True) + +model.end() + +#========================================================================= +# Check that the circle-sketch and the cylindrical-hole are correctly updated +#========================================================================= +import ModelAPI + +assert(ModelAPI.ModelAPI_Session.get().validators().validate(Sketch_4.feature())) +assert(ModelAPI.ModelAPI_Session.get().validators().validate(ExtrusionCut_2.feature())) +assert(Sketch_3.feature().selection("External").namingName() == "ExtrusionCut_3_1/Modfied_6") + +assert(model.checkPythonDump()) -- 2.39.2