From af5fce007fca268429e05eec2630eec6901fdad1 Mon Sep 17 00:00:00 2001 From: mpv Date: Thu, 29 Nov 2018 11:55:17 +0300 Subject: [PATCH] Created a unit-test and user manual for the sketch drawer --- src/SketchPlugin/CMakeLists.txt | 1 + .../SketchPlugin_SketchDrawer.cpp | 7 -- src/SketchPlugin/Test/TestSketchDrawer.py | 62 ++++++++++++++++++ src/SketchPlugin/doc/SketchPlugin.rst | 1 + src/SketchPlugin/doc/images/SketchDrawer.png | Bin 0 -> 554 bytes .../doc/images/SketchDrawer_panel.png | Bin 0 -> 4522 bytes .../doc/images/SketchDrawer_res.png | Bin 0 -> 13295 bytes src/SketchPlugin/doc/sketchDrawer.rst | 53 +++++++++++++++ 8 files changed, 117 insertions(+), 7 deletions(-) create mode 100644 src/SketchPlugin/Test/TestSketchDrawer.py create mode 100644 src/SketchPlugin/doc/images/SketchDrawer.png create mode 100644 src/SketchPlugin/doc/images/SketchDrawer_panel.png create mode 100644 src/SketchPlugin/doc/images/SketchDrawer_res.png create mode 100644 src/SketchPlugin/doc/sketchDrawer.rst diff --git a/src/SketchPlugin/CMakeLists.txt b/src/SketchPlugin/CMakeLists.txt index d0c9f5f33..8a17e7fed 100644 --- a/src/SketchPlugin/CMakeLists.txt +++ b/src/SketchPlugin/CMakeLists.txt @@ -267,6 +267,7 @@ ADD_UNIT_TESTS( TestTrimCircleAndArc01.py TestTrimLine01.py TestTrimLine02.py + TestSketchDrawer.py ) if(${SKETCHER_CHANGE_RADIUS_WHEN_MOVE}) diff --git a/src/SketchPlugin/SketchPlugin_SketchDrawer.cpp b/src/SketchPlugin/SketchPlugin_SketchDrawer.cpp index 43f3f49a7..cc3b90f90 100644 --- a/src/SketchPlugin/SketchPlugin_SketchDrawer.cpp +++ b/src/SketchPlugin/SketchPlugin_SketchDrawer.cpp @@ -90,13 +90,6 @@ void SketchPlugin_SketchDrawer::execute() DocumentPtr aMyDoc = document(); std::shared_ptr aSketch = std::dynamic_pointer_cast(aMyDoc->addFeature(SketchPlugin_Sketch::ID())); - /*if (aPlaneContext->groupName() == ModelAPI_ResultConstruction::group()) { // by coordinates - std::dynamic_pointer_cast( - aSketch->attribute(SketchPlugin_Sketch::ORIGIN_ID()))->setValue(aPlane->location()); - std::dynamic_pointer_cast( - aSketch->attribute(SketchPlugin_Sketch::NORM_ID()))->setValue(aPlane->direction()); - - } else {*/ // by selection of plane aSketch->selection(SketchPlugin_SketchEntity::EXTERNAL_ID())-> setValue(selection(PLANE_ID())->context(), aPlaneShape); diff --git a/src/SketchPlugin/Test/TestSketchDrawer.py b/src/SketchPlugin/Test/TestSketchDrawer.py new file mode 100644 index 000000000..b90c9489c --- /dev/null +++ b/src/SketchPlugin/Test/TestSketchDrawer.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- + +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(-14.48008258397498, -13.79591274114419, 5.519917416025022, -13.79591274114419) +SketchLine_2 = Sketch_1.addLine(10.51991741602502, -8.795912741144186, 10.51991741602502, 18.20408725885581) +SketchLine_3 = Sketch_1.addLine(10.51991741602502, 18.20408725885581, -14.48008258397498, 13.79591274114419) +SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint()) +SketchConstraintCoincidence_1.setName("SketchConstraintCoincidence_2") +SketchLine_4 = Sketch_1.addLine(-14.48008258397498, 13.79591274114419, -14.48008258397498, -13.79591274114419) +SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_3.endPoint(), SketchLine_4.startPoint()) +SketchConstraintCoincidence_2.setName("SketchConstraintCoincidence_3") +SketchConstraintCoincidence_3 = Sketch_1.setCoincident(SketchLine_1.startPoint(), SketchLine_4.endPoint()) +SketchConstraintCoincidence_3.setName("SketchConstraintCoincidence_4") +SketchArc_1 = Sketch_1.addArc(5.519917416025022, -8.795912741144186, 5.519917416025022, -13.79591274114419, 10.51991741602502, -8.795912741144186, False) +SketchConstraintCoincidence_4 = Sketch_1.setCoincident(SketchArc_1.startPoint(), SketchLine_1.endPoint()) +SketchConstraintCoincidence_4.setName("SketchConstraintCoincidence_5") +SketchConstraintCoincidence_5 = Sketch_1.setCoincident(SketchArc_1.endPoint(), SketchLine_2.startPoint()) +SketchConstraintCoincidence_5.setName("SketchConstraintCoincidence_6") +SketchConstraintTangent_1 = Sketch_1.setTangent(SketchArc_1.results()[1], SketchLine_1.result()) +SketchConstraintTangent_2 = Sketch_1.setTangent(SketchArc_1.results()[1], SketchLine_2.result()) +SketchCircle_1 = Sketch_1.addCircle(0, 0, 5) +SketchConstraintHorizontal_1 = Sketch_1.setHorizontal(SketchLine_1.result()) +SketchConstraintVertical_1 = Sketch_1.setVertical(SketchLine_2.result()) +SketchConstraintAngle_1 = Sketch_1.setAngle(SketchLine_4.result(), SketchLine_3.result(), 100) +SketchConstraintLength_1 = Sketch_1.setLength(SketchLine_2.result(), 27) +SketchConstraintDistance_1 = Sketch_1.setDistance(SketchLine_1.startPoint(), SketchLine_2.result(), 25, True) +SketchConstraintRadius_1 = Sketch_1.setRadius(SketchArc_1.results()[1], 5) +SketchConstraintPerpendicular_1 = Sketch_1.setPerpendicular(SketchLine_1.result(), SketchLine_4.result()) +SketchConstraintDistance_2 = Sketch_1.setDistance(SketchLine_4.startPoint(), SketchCircle_1.center(), 20, True) +SketchConstraintDistance_3 = Sketch_1.setDistance(SketchLine_4.endPoint(), SketchCircle_1.center(), 20, True) +SketchProjection_1 = Sketch_1.addProjection(model.selection("VERTEX", "PartSet/Origin"), False) +SketchPoint_1 = SketchProjection_1.createdFeature() +SketchConstraintCoincidence_6 = Sketch_1.setCoincident(SketchAPI_Point(SketchPoint_1).coordinates(), SketchCircle_1.center()) +SketchConstraintCoincidence_6.setName("SketchConstraintCoincidence_7") +SketchConstraintRadius_2 = Sketch_1.setRadius(SketchCircle_1.results()[1], 5) +model.do() +Extrusion_1 = model.addExtrusion(Part_1_doc, [model.selection("FACE", "Sketch_1/Face-SketchLine_1r-SketchArc_1_2f-SketchLine_2f-SketchLine_3f-SketchLine_4f-SketchCircle_1_2r")], model.selection(), 10, 0) +model.do() +# create a drawer feature of the extrusion and upper face +Drawer = Part_1_doc.addFeature("SketchDrawer") +Drawer.selection("base_shape").setValue(Extrusion_1.feature(), None) +PlaneSelection = model.selection("FACE", "Extrusion_1_1/To_Face") +PlaneSelection.fillAttribute(Drawer.selection("plane")) +model.end() + +# check that a sketch is created with valid elements +assert(Part_1_doc.size("Construction") == 2) # two sketches: base of extrusion and this new one + +from ModelAPI import * +aFactory = ModelAPI_Session.get().validators() + +Sketch = objectToFeature(Part_1_doc.object("Features", 2)) # created sketch feature +assert(aFactory.validate(Sketch)) +assert(len(Sketch.results()) == 1) diff --git a/src/SketchPlugin/doc/SketchPlugin.rst b/src/SketchPlugin/doc/SketchPlugin.rst index fd95d68e9..627ca479a 100644 --- a/src/SketchPlugin/doc/SketchPlugin.rst +++ b/src/SketchPlugin/doc/SketchPlugin.rst @@ -154,3 +154,4 @@ The plug-in includes the following operations: mirrorFeature.rst translationFeature.rst rotationFeature.rst + sketchDrawer.rst diff --git a/src/SketchPlugin/doc/images/SketchDrawer.png b/src/SketchPlugin/doc/images/SketchDrawer.png new file mode 100644 index 0000000000000000000000000000000000000000..e3f53d13142171f0e1046e8e49f17bff5af89793 GIT binary patch literal 554 zcmV+_0@eMAP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGh)&Kwv)&Y=jd7J1;MAa*k@H7+qQF!XYv0004*Nkl;XYH)n35nvf z`{upx_sy?eD~ck^W_;YH;>xD{oKO+S+<%E5Xm9{?H{sYS*85E1U&IfXRa3<5ppP=C--V4yp z<9+5(u@q~Rm@r+q7MO~C?C|^ZwL(geNF$cjbc+C5?Azh?tT7*@(p34YG$uFS6t)7!$))_3l zgW8i>%M2u#oaBr s@q!VE_rX25MuRo^3A>&sWwnv@1%IbM)O0`v>;M1&07*qoM6N<$f&^0X4gdfE literal 0 HcmV?d00001 diff --git a/src/SketchPlugin/doc/images/SketchDrawer_panel.png b/src/SketchPlugin/doc/images/SketchDrawer_panel.png new file mode 100644 index 0000000000000000000000000000000000000000..8b786503df9652695d63377c2d26db4f609c78eb GIT binary patch literal 4522 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 fN0Q5 Sketch drawer* item or +#. click **Sketch drawer** button in Macros toolbar: + +.. image:: images/SketchDrawer.png + :align: center + +.. centered:: + **Sketch drawer** button + +The following property panel appears: + +.. image:: images/SketchDrawer_panel.png + :align: center + +.. centered:: + Sketch drawer + +Click in the view once to set the whole original model, then click a second time to set the +plane or planar face - a base of sketch. This can be plane on the original model. +On Apply button press the new sketch will be created in the Object Browser tree. + +Result +"""""" + +A resulting sketch will contain linear and circular edges as well as circular arcs corresponding to the +original model edges that lay in the sketch plane. Other types of edges are not supported. + +Radius, length, vertical, horizontal and points-coincidence constraints will be created +automatically where it is possible. The resulting sketch may be overconstrained or not fully +constrained. So, it is just a helper for the sketch creation, not universal tool. After this +sketch creation normally user must edit this sketch to input reasonable constraints and +parametrization, or remove not needed constraints or sketch lements. + +.. image:: images/SketchDrawer_res.png + :align: center + +.. centered:: + Drawn sketch -- 2.39.2