From 252a8b06667f8ca9b26f8e10d7219da807e5a5b3 Mon Sep 17 00:00:00 2001 From: akondrat Date: Thu, 15 Sep 2022 10:36:12 +0300 Subject: [PATCH] [bos #20476][EDF] 22546 - sigsegv with offset. Add approximation checkbox. --- src/GeomAlgoAPI/GeomAlgoAPI_Offset.cpp | 4 +- src/GeomAlgoAPI/GeomAlgoAPI_Offset.h | 3 +- src/SketchAPI/SketchAPI_Offset.cpp | 7 +- src/SketchAPI/SketchAPI_Offset.h | 10 +- src/SketchAPI/SketchAPI_Sketch.cpp | 5 +- src/SketchAPI/SketchAPI_Sketch.h | 5 +- src/SketchPlugin/SketchPlugin_Offset.cpp | 14 +- src/SketchPlugin/SketchPlugin_Offset.h | 7 + src/SketchPlugin/SketchPlugin_msg_fr.ts | 4 + src/SketchPlugin/Test/TestOffset4.py | 419 +++++++++++++++++++ src/SketchPlugin/doc/images/Offset_panel.png | Bin 36402 -> 16552 bytes src/SketchPlugin/doc/offsetFeature.rst | 1 + src/SketchPlugin/plugin-Sketch.xml | 5 + src/SketchPlugin/tests.set | 1 + 14 files changed, 473 insertions(+), 12 deletions(-) create mode 100644 src/SketchPlugin/Test/TestOffset4.py diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Offset.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Offset.cpp index 6032c421a..def8ec569 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Offset.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Offset.cpp @@ -65,7 +65,8 @@ void GeomAlgoAPI_Offset::generated(const GeomShapePtr theOldShape, GeomAlgoAPI_Offset::GeomAlgoAPI_Offset(const GeomPlanePtr& thePlane, const GeomShapePtr& theEdgeOrWire, const double theOffsetValue, - const GeomAlgoAPI_OffsetJoint theJoint) + const GeomAlgoAPI_OffsetJoint theJoint, + const bool theIsApprox) { // 1. Make wire from edge, if need TopoDS_Wire aWire; @@ -101,6 +102,7 @@ GeomAlgoAPI_Offset::GeomAlgoAPI_Offset(const GeomPlanePtr& thePlane, Standard_Boolean isOpenResult = !aWire.Closed(); aParal->Init(aFace, aJoin, isOpenResult); + aParal->SetApprox(theIsApprox); aParal->Perform(theOffsetValue, 0.); if (aParal->IsDone()) { TopoDS_Shape anOffset = aParal->Shape(); diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Offset.h b/src/GeomAlgoAPI/GeomAlgoAPI_Offset.h index a4be309a7..1ce77dfcc 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Offset.h +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Offset.h @@ -54,7 +54,8 @@ public: (const std::shared_ptr& thePlane, const GeomShapePtr& theEdgeOrWire, const double theOffsetValue, - const GeomAlgoAPI_OffsetJoint theJoint = GeomAlgoAPI_OffsetJoint::KeepDistance); + const GeomAlgoAPI_OffsetJoint theJoint = GeomAlgoAPI_OffsetJoint::KeepDistance, + const bool theIsApprox = false); /// \return the list of shapes generated from the shape \a theShape. /// \param[in] theOldShape base shape. diff --git a/src/SketchAPI/SketchAPI_Offset.cpp b/src/SketchAPI/SketchAPI_Offset.cpp index 3be3b0c7d..38658ed68 100644 --- a/src/SketchAPI/SketchAPI_Offset.cpp +++ b/src/SketchAPI/SketchAPI_Offset.cpp @@ -35,7 +35,8 @@ SketchAPI_Offset::SketchAPI_Offset (const std::shared_ptr & th const std::list > & theObjects, const ModelHighAPI_Double & theOffsetValue, const bool theIsReversed, - const std::string & theJointType) + const std::string & theJointType, + const bool theIsApprox) : ModelHighAPI_Interface(theFeature) { if (initialize()) { @@ -43,6 +44,7 @@ SketchAPI_Offset::SketchAPI_Offset (const std::shared_ptr & th fillAttribute(theOffsetValue, value()); fillAttribute(theIsReversed, reversed()); fillAttribute(theJointType, joint()); + fillAttribute(theIsApprox, approx()); execute(); } @@ -75,6 +77,7 @@ void SketchAPI_Offset::dump (ModelHighAPI_Dumper& theDumper) const AttributeDoublePtr aValue = value(); AttributeBooleanPtr aReversed = reversed(); AttributeStringPtr aJoint = joint(); + AttributeBooleanPtr anApprox = approx(); // Check all attributes are already dumped. If not, store the feature as postponed. if (!theDumper.isDumped(aOffsetObjects)) { @@ -83,7 +86,7 @@ void SketchAPI_Offset::dump (ModelHighAPI_Dumper& theDumper) const } theDumper << aBase << " = " << aSketchName << ".addOffset(" << aOffsetObjects << ", " - << aValue << ", " << aReversed << ", " << aJoint << ")" << std::endl; + << aValue << ", " << aReversed << ", " << aJoint << ", " << anApprox << ")" << std::endl; // Dump variables for a list of created features theDumper << "["; diff --git a/src/SketchAPI/SketchAPI_Offset.h b/src/SketchAPI/SketchAPI_Offset.h index 6e201bd25..a2cb3fee5 100644 --- a/src/SketchAPI/SketchAPI_Offset.h +++ b/src/SketchAPI/SketchAPI_Offset.h @@ -51,12 +51,13 @@ public: const std::list > & theObjects, const ModelHighAPI_Double & theOffsetValue, const bool theIsReversed = false, - const std::string & theJointType = SketchPlugin_Offset::JOINT_KEEP_DISTANCE()); + const std::string & theJointType = SketchPlugin_Offset::JOINT_KEEP_DISTANCE(), + const bool theIsApprox = false); /// Destructor SKETCHAPI_EXPORT virtual ~SketchAPI_Offset(); - INTERFACE_4(SketchPlugin_Offset::ID(), + INTERFACE_5(SketchPlugin_Offset::ID(), edgesList, SketchPlugin_Offset::EDGES_ID(), ModelAPI_AttributeRefList, /** Offset edges list */, @@ -68,7 +69,10 @@ public: ModelAPI_AttributeBoolean, /** Negative value */, joint, SketchPlugin_Offset::JOINT_ID(), - ModelAPI_AttributeString, /** Joint type */ + ModelAPI_AttributeString, /** Joint type */, + + approx, SketchPlugin_Offset::APPROX_ID(), + ModelAPI_AttributeBoolean, /** Negative value */ ) /// List of created objects diff --git a/src/SketchAPI/SketchAPI_Sketch.cpp b/src/SketchAPI/SketchAPI_Sketch.cpp index 7ff5622b6..30d0e0c82 100644 --- a/src/SketchAPI/SketchAPI_Sketch.cpp +++ b/src/SketchAPI/SketchAPI_Sketch.cpp @@ -931,11 +931,12 @@ std::shared_ptr SketchAPI_Sketch::addOffset( const std::list > & theObjects, const ModelHighAPI_Double & theValue, const bool theReversed, - const std::string & theJointType) + const std::string & theJointType, + const bool theApprox) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Offset::ID()); - return OffsetPtr(new SketchAPI_Offset(aFeature, theObjects, theValue, theReversed, theJointType)); + return OffsetPtr(new SketchAPI_Offset(aFeature, theObjects, theValue, theReversed, theJointType, theApprox)); } //-------------------------------------------------------------------------------------- diff --git a/src/SketchAPI/SketchAPI_Sketch.h b/src/SketchAPI/SketchAPI_Sketch.h index 498a124e6..42933d09a 100644 --- a/src/SketchAPI/SketchAPI_Sketch.h +++ b/src/SketchAPI/SketchAPI_Sketch.h @@ -376,11 +376,12 @@ public: /// Add offset SKETCHAPI_EXPORT - std::shared_ptr addOffset( + std::shared_ptr addOffset( const std::list > & theObjects, const ModelHighAPI_Double & theValue, const bool theReversed = false, - const std::string & theJointType = SketchPlugin_Offset::JOINT_KEEP_DISTANCE()); + const std::string & theJointType = SketchPlugin_Offset::JOINT_KEEP_DISTANCE(), + const bool theApprox = false); /// Add translation SKETCHAPI_EXPORT diff --git a/src/SketchPlugin/SketchPlugin_Offset.cpp b/src/SketchPlugin/SketchPlugin_Offset.cpp index 27d957a51..65c7ed30d 100644 --- a/src/SketchPlugin/SketchPlugin_Offset.cpp +++ b/src/SketchPlugin/SketchPlugin_Offset.cpp @@ -79,6 +79,11 @@ void SketchPlugin_Offset::initAttributes() data()->addAttribute(VALUE_ID(), ModelAPI_AttributeDouble::typeId()); data()->addAttribute(REVERSED_ID(), ModelAPI_AttributeBoolean::typeId()); + // Always initialize approximation to false by default for backward compatibility + AttributeBooleanPtr approxAttr = std::dynamic_pointer_cast( + data()->addAttribute(APPROX_ID(), ModelAPI_AttributeBoolean::typeId())); + approxAttr->setValue(false); + // store original entities data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefList::typeId()); // store offset entities @@ -214,8 +219,15 @@ void SketchPlugin_Offset::execute() } // 5.d. Make offset for the wire + AttributeBooleanPtr anApproxAttr = boolean(APPROX_ID()); + if (!anApproxAttr->isInitialized()) + { + // It must be initialized at least by SketchPlugin_Offset::initAttributes() + return; + } + std::shared_ptr anOffsetShape - (new GeomAlgoAPI_Offset(aPlane, aWireShape, aValue*aSign, aJoint)); + (new GeomAlgoAPI_Offset(aPlane, aWireShape, aValue*aSign, aJoint, anApproxAttr->value())); if (anOffsetShape->isDone()) { if (aJoint == GeomAlgoAPI_OffsetJoint::Arcs) { diff --git a/src/SketchPlugin/SketchPlugin_Offset.h b/src/SketchPlugin/SketchPlugin_Offset.h index fd43ff721..8f21441f8 100644 --- a/src/SketchPlugin/SketchPlugin_Offset.h +++ b/src/SketchPlugin/SketchPlugin_Offset.h @@ -101,6 +101,13 @@ public: return ID; } + /// attribute to approx by segments and arcs + inline static const std::string& APPROX_ID() + { + static const std::string ID("approx"); + return ID; + } + /// name for add wire action inline static const std::string& ADD_WIRE_ACTION_ID() { diff --git a/src/SketchPlugin/SketchPlugin_msg_fr.ts b/src/SketchPlugin/SketchPlugin_msg_fr.ts index c6dedb0fc..841fa2abd 100644 --- a/src/SketchPlugin/SketchPlugin_msg_fr.ts +++ b/src/SketchPlugin/SketchPlugin_msg_fr.ts @@ -4004,6 +4004,10 @@ Reversed Renversé + + Approx by segments and arcs + Environ par segments et arcs + diff --git a/src/SketchPlugin/Test/TestOffset4.py b/src/SketchPlugin/Test/TestOffset4.py new file mode 100644 index 000000000..81a6d8265 --- /dev/null +++ b/src/SketchPlugin/Test/TestOffset4.py @@ -0,0 +1,419 @@ +# Copyright (C) 2020-2023 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 https://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +### Test offset using approximation +### bos #20476 EDF 22546 - sigsegv with offset + +from salome.shaper import model + +#========================================================================= +# Creation of a document and sketch +#========================================================================= + +model.begin() +partSet = model.moduleDocument() + +### Create Sketch +Sketch_1 = model.addSketch(partSet, model.defaultPlane("XOY")) + + +#========================================================================= +# Creation of a testing B-spline +#========================================================================= + +### Create SketchPoint +SketchPoint_1 = Sketch_1.addPoint(0, 0) +SketchPoint_1.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_2 = Sketch_1.addPoint(0.03453184, 0.15311942) +SketchPoint_2.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_3 = Sketch_1.addPoint(0.11839488, 0.28145762) +SketchPoint_3.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_4 = Sketch_1.addPoint(0.20229646, 0.3653592) +SketchPoint_4.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_5 = Sketch_1.addPoint(0.325663, 0.44425058) +SketchPoint_5.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_6 = Sketch_1.addPoint(0.44409642, 0.5083426) +SketchPoint_6.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_7 = Sketch_1.addPoint(0.5625298400000001, 0.5526636) +SketchPoint_7.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_8 = Sketch_1.addPoint(0.70069574, 0.5969460600000001) +SketchPoint_8.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_9 = Sketch_1.addPoint(0.8684989, 0.63132374) +SketchPoint_9.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_10 = Sketch_1.addPoint(1.02146416, 0.6509020600000001) +SketchPoint_10.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_11 = Sketch_1.addPoint(1.22873228, 0.65063228) +SketchPoint_11.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_12 = Sketch_1.addPoint(1.41129626, 0.6454293800000001) +SketchPoint_12.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_13 = Sketch_1.addPoint(1.58403254, 0.6205325399999999) +SketchPoint_13.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_14 = Sketch_1.addPoint(1.7369978, 0.60550194) +SketchPoint_14.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_15 = Sketch_1.addPoint(1.9244949, 0.5632621) +SketchPoint_15.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_16 = Sketch_1.addPoint(2.10709742, 0.5160891400000001) +SketchPoint_16.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_17 = Sketch_1.addPoint(2.27486204, 0.4763544) +SketchPoint_17.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_18 = Sketch_1.addPoint(2.4179996, 0.43661966) +SketchPoint_18.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_19 = Sketch_1.addPoint(2.55123238, 0.39692346) +SketchPoint_19.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_20 = Sketch_1.addPoint(2.70913076, 0.3522556) +SketchPoint_20.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_21 = Sketch_1.addPoint(2.89173328, 0.29768296) +SketchPoint_21.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_22 = Sketch_1.addPoint(3.04469854, 0.2530151) +SketchPoint_22.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_23 = Sketch_1.addPoint(3.19273068, 0.20341412) +SketchPoint_23.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_24 = Sketch_1.addPoint(3.35556218, 0.1537746) +SketchPoint_24.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_25 = Sketch_1.addPoint(3.50363286, 0.10914528) +SketchPoint_25.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_26 = Sketch_1.addPoint(3.63686564, 0.06944908000000001) +SketchPoint_26.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_27 = Sketch_1.addPoint(3.7404997, 0.03965766) +SketchPoint_27.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_28 = Sketch_1.addPoint(3.838584, 0.004933120000000001) +SketchPoint_28.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_29 = Sketch_1.addPoint(3.854, -0.009866240000000002) +SketchPoint_29.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_30 = Sketch_1.addPoint(3.77009842, -0.004817500000000001) +SketchPoint_30.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_31 = Sketch_1.addPoint(3.56040228, 0.01025164) +SketchPoint_31.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_32 = Sketch_1.addPoint(3.43946376, 0.00300612) +SketchPoint_32.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_33 = Sketch_1.addPoint(3.31609722, -0.02154386) +SketchPoint_33.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_34 = Sketch_1.addPoint(3.18779756, -0.05349352) +SketchPoint_34.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_35 = Sketch_1.addPoint(3.04963166, -0.09777598) +SketchPoint_35.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_36 = Sketch_1.addPoint(2.89173328, -0.15192468) +SketchPoint_36.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_37 = Sketch_1.addPoint(2.70913076, -0.22580586) +SketchPoint_37.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_38 = Sketch_1.addPoint(2.54629926, -0.2947539200000001) +SketchPoint_38.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_39 = Sketch_1.addPoint(2.39822858, -0.3588074) +SketchPoint_39.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_40 = Sketch_1.addPoint(2.26992892, -0.41299464) +SketchPoint_40.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_41 = Sketch_1.addPoint(2.12189678, -0.47704812) +SketchPoint_41.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_42 = Sketch_1.addPoint(1.8998293, -0.5558238799999999) +SketchPoint_42.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_43 = Sketch_1.addPoint(1.70246596, -0.6247334) +SketchPoint_43.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_44 = Sketch_1.addPoint(1.52479656, -0.6640442000000001) +SketchPoint_44.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_45 = Sketch_1.addPoint(1.33236634, -0.68847856) +SketchPoint_45.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_46 = Sketch_1.addPoint(1.15223038, -0.7006186600000001) +SketchPoint_46.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_47 = Sketch_1.addPoint(0.9819992000000001, -0.69792086) +SketchPoint_47.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_48 = Sketch_1.addPoint(0.83392852, -0.6730240200000001) +SketchPoint_48.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_49 = Sketch_1.addPoint(0.68589638, -0.63826094) +SketchPoint_49.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_50 = Sketch_1.addPoint(0.5403308, -0.59359308) +SketchPoint_50.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_51 = Sketch_1.addPoint(0.4144977, -0.52425962) +SketchPoint_51.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_52 = Sketch_1.addPoint(0.30593052, -0.4549647) +SketchPoint_52.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_53 = Sketch_1.addPoint(0.19243022, -0.37079334) +SketchPoint_53.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_54 = Sketch_1.addPoint(0.09866240000000001, -0.26199492) +SketchPoint_54.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_55 = Sketch_1.addPoint(0.04439808000000001, -0.17296752) +SketchPoint_55.setAuxiliary(True) + +### Create SketchPoint +SketchPoint_56 = Sketch_1.addPoint(0.009866240000000002, -0.08397866) +SketchPoint_56.setAuxiliary(True) + +### Create SketchBSpline +SketchBSpline_1_poles = [(0, 0), + (9.014752251795682e-05, 0.05451214529317949), + (0.02532271171862411, 0.15579971775632), + (0.1083431350565314, 0.2748971692083296), + (0.2055162110916063, 0.3762476714704591), + (0.3226869043516477, 0.4417758873955893), + (0.4396106030030269, 0.5114950821406695), + (0.5686113665746824, 0.5543315380381274), + (0.7080109281378321, 0.6032643908580265), + (0.8627418437966349, 0.6310529967664337), + (1.038760710497959, 0.658153841986185), + (1.22044861142381, 0.6481760900098785), + (1.409221724680022, 0.652722089409154), + (1.576578009046891, 0.6165884029638471), + (1.750622207371201, 0.6101568179490738), + (1.923498511038718, 0.5633997285939256), + (2.101468637706691, 0.5160168977121142), + (2.26756869845679, 0.4799182653430439), + (2.415109663038519, 0.4380247760586003), + (2.559003214216268, 0.3937264274604114), + (2.717970834232034, 0.3510185960290838), + (2.881379255194576, 0.2994130045705585), + (3.044331614256414, 0.2554589350745441), + (3.196663224032949, 0.2002205281261157), + (3.35069087314937, 0.1557508658621287), + (3.498630901739528, 0.1100749985226144), + (3.626758629069007, 0.07354615416618171), + (3.739427723854896, 0.03597634464461345), + (3.813716543275791, 0.02837078095396758), + (3.876876038873482, -0.02879298081488075), + (3.682323148493558, 0.01775150116288641), + (3.59938700895519, 0.01042701260276316), + (3.435447203044759, 0.007149079513330239), + (3.314513764134776, -0.02220772128681934), + (3.182869424552179, -0.05232760411385898), + (3.042896269666394, -0.100514554949581), + (2.881422363667536, -0.1529357624091178), + (2.715356347244389, -0.2233467064371046), + (2.550824101050389, -0.2921770145749832), + (2.405271709687486, -0.3565989754466863), + (2.262755596020973, -0.4148284616349733), + (2.100460548570712, -0.490254433165252), + (1.907228846355101, -0.5500679945331017), + (1.712805296160232, -0.627643180207678), + (1.521165382362285, -0.66728412705947), + (1.336949022926033, -0.6896647036620358), + (1.155869424658838, -0.7022133877004375), + (0.9881820016357848, -0.7038771014232653), + (0.8328845467272493, -0.6739914151454918), + (0.6860350214810707, -0.638614040735098), + (0.5400698242489836, -0.6015646418675653), + (0.4182804086275665, -0.5270754227323547), + (0.302266907807943, -0.4533758717656259), + (0.1873191972961234, -0.3753781603200299), + (0.1039872761267704, -0.2741082432964857), + (0.04328037620103962, -0.1770551690563165), + (0.006988972040230026, -0.08835445483623842), + (-0.0008115069204040052, -0.02871741534942534), + (0, 0) + ] +SketchBSpline_1 = Sketch_1.addSpline(degree = 3, poles = SketchBSpline_1_poles, weights = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], knots = [0, 0.01841877717868692, 0.03640857044229438, 0.0503319019589481, 0.06751503486217877, 0.08331688612829682, 0.09815550484724707, 0.1151806897007172, 0.1352802264972665, 0.1533760897133781, 0.1776976203324573, 0.1991289647725509, 0.2196078542088847, 0.2376437370925934, 0.2601966555045284, 0.2823272796231457, 0.3025579520551492, 0.3199893311119836, 0.3363024715699076, 0.3555578894595023, 0.3779215054846461, 0.3966205779803185, 0.4149403217914447, 0.43491563393835, 0.453062794308183, 0.4693759347661071, 0.4820291845192418, 0.4942387027706504, 0.496746319874324, 0.5066094106685624, 0.5312792857910991, 0.5454960476108249, 0.5602561299909423, 0.5757710096568369, 0.592796194510307, 0.6123837212555427, 0.6354982845523691, 0.6562477832463178, 0.6751789135618669, 0.6915216952124962, 0.7104486749233012, 0.7380977836510125, 0.762628078574017, 0.7839805979515587, 0.8067422887543781, 0.8279279725980087, 0.8479059568735401, 0.8655249471990413, 0.8833680589533851, 0.9012352967057089, 0.9180940098763235, 0.9332074432767975, 0.9497886416105058, 0.9666426179720728, 0.9788770179440802, 0.9900778977399243, 1], multiplicities = [4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4]) +Sketch_1.setCoincident(SketchPoint_1.coordinates(), SketchBSpline_1.startPoint()) +Sketch_1.setCoincident(SketchPoint_1.coordinates(), SketchBSpline_1.endPoint()) +Sketch_1.setCoincident(SketchPoint_2.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_3.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_4.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_5.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_6.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_7.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_8.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_9.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_10.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_11.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_12.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_13.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_14.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_15.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_16.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_17.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_18.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_19.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_20.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_21.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_22.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_23.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_24.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_25.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_26.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_27.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_28.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_29.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_30.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_31.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_32.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_33.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_34.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_35.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_36.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_37.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_38.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_39.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_40.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_41.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_42.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_43.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_44.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_45.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_46.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_47.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_48.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_49.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_50.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_51.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_52.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_53.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_54.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_55.coordinates(), SketchBSpline_1.result()) +Sketch_1.setCoincident(SketchPoint_56.coordinates(), SketchBSpline_1.result()) +model.do() + + +#========================================================================= +# Make offset for testing B-spline +#========================================================================= + +# This B-spline still failes on larger values and even smaller in reversed mode. +# But we still consider this as an impruvement because without approximation +# we have only "Offset algorithm failed" with the same conditions. + +# Common offset params +SketchOffset_1_objects = [ SketchBSpline_1 ] +jointType = "KeepDistance" +isApproximated = True + +# Test outside offset +offsetValue = 10 +isReversed = False + +SketchOffset_1 = Sketch_1.addOffset(SketchOffset_1_objects, offsetValue, isReversed, jointType, isApproximated) +model.do() + +# Hardcoded value was obtained by running the same script from SALOME Python Console. +assert(len(SketchOffset_1.offset()) == 124) + +# Test reversed offset +offsetValue = 0.5 +isReversed = True + +SketchOffset_2 = Sketch_1.addOffset(SketchOffset_1_objects, offsetValue, isReversed, jointType, isApproximated) +model.do() + +assert(len(SketchOffset_2.offset()) == 101) + +model.end() + diff --git a/src/SketchPlugin/doc/images/Offset_panel.png b/src/SketchPlugin/doc/images/Offset_panel.png index de9741e548eaf8e20bb5d2bb24bb127a467e044a..64ee00ad931d69168300f6e92ba25e4cb28f109e 100644 GIT binary patch literal 16552 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 literal 36402 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 Bd=CHs diff --git a/src/SketchPlugin/doc/offsetFeature.rst b/src/SketchPlugin/doc/offsetFeature.rst index 65af062c9..43d52e000 100644 --- a/src/SketchPlugin/doc/offsetFeature.rst +++ b/src/SketchPlugin/doc/offsetFeature.rst @@ -38,6 +38,7 @@ Property panel: Input fields: - Offset mode can be **Keep distance**, **Arcs** or **Lines** +- **Approx by segments and arcs** converts the input geometry of the offset algorithm to segments and arcs. - **Edges** is the list of segments (lines, circles, arcs) selected in the view. - **Offset value** is the offset distance. - **Reversed** sets the reversed offset side (inside a closed contour or to the left of an open one). diff --git a/src/SketchPlugin/plugin-Sketch.xml b/src/SketchPlugin/plugin-Sketch.xml index 86b234c51..6f665a49e 100644 --- a/src/SketchPlugin/plugin-Sketch.xml +++ b/src/SketchPlugin/plugin-Sketch.xml @@ -1051,6 +1051,11 @@ tooltip="Reverse the offset" default="false" obligatory="0"/> + diff --git a/src/SketchPlugin/tests.set b/src/SketchPlugin/tests.set index 2358fda07..b0881fb3a 100644 --- a/src/SketchPlugin/tests.set +++ b/src/SketchPlugin/tests.set @@ -170,6 +170,7 @@ SET(TEST_NAMES_PARA TestOffset1.py TestOffset2.py TestOffset3.py + TestOffset4.py TestPresentation.py TestProjection.py TestProjectionBSpline.py -- 2.39.2