From 7687c08a185003291853ffc445f069a10a2ac43f Mon Sep 17 00:00:00 2001 From: Clarisse Genrault Date: Wed, 15 Apr 2020 15:08:25 +0200 Subject: [PATCH] Add a new mode for the box --- src/GeomAlgoAPI/GeomAlgoAPI_Box.cpp | 54 ++++++++++--- src/GeomAlgoAPI/GeomAlgoAPI_Box.h | 17 ++++ src/GeomAlgoAPI/GeomAlgoAPI_ShapeAPI.cpp | 10 +++ src/GeomAlgoAPI/GeomAlgoAPI_ShapeAPI.h | 13 +++ src/PrimitivesPlugin/PrimitivesPlugin_Box.cpp | 59 +++++++++++++- src/PrimitivesPlugin/PrimitivesPlugin_Box.h | 76 +++++++++++++++--- src/PrimitivesPlugin/box_widget.xml | 54 +++++++++++++ src/PrimitivesPlugin/doc/TUI_boxByPtDims.rst | 12 +++ src/PrimitivesPlugin/doc/boxFeature.rst | 45 ++++++++++- src/PrimitivesPlugin/doc/examples/box3.py | 9 +++ src/PrimitivesPlugin/doc/images/Box3.png | Bin 0 -> 4828 bytes .../doc/images/Box_2points.png | Bin 6785 -> 7755 bytes .../doc/images/Box_dimensions.png | Bin 9676 -> 9517 bytes .../icons/box_pt_dxyz_32x32.png | Bin 0 -> 1188 bytes 14 files changed, 321 insertions(+), 28 deletions(-) create mode 100644 src/PrimitivesPlugin/doc/TUI_boxByPtDims.rst create mode 100644 src/PrimitivesPlugin/doc/examples/box3.py create mode 100644 src/PrimitivesPlugin/doc/images/Box3.png create mode 100644 src/PrimitivesPlugin/icons/box_pt_dxyz_32x32.png diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Box.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Box.cpp index 8105c7bf2..450a54cec 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Box.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Box.cpp @@ -34,6 +34,7 @@ GeomAlgoAPI_Box::GeomAlgoAPI_Box(const double theDx, const double theDy, const d myDy = theDy; myDz = theDz; myMethodType = MethodType::BOX_DIM; + headError = "Box builder with dimensions"; } //================================================================================================= @@ -43,33 +44,48 @@ GeomAlgoAPI_Box::GeomAlgoAPI_Box(std::shared_ptr theFirstPoint, myFirstPoint = theFirstPoint; mySecondPoint = theSecondPoint; myMethodType = MethodType::BOX_POINTS; + headError = "Box builder with two points"; +} + +//================================================================================================= +GeomAlgoAPI_Box::GeomAlgoAPI_Box(const double theOx, const double theOy, const double theOz, + const double theDx, const double theDy, const double theDz) +{ + myOx = theOx; + myOy = theOy; + myOz = theOz; + myDx = theDx; + myDy = theDy; + myDz = theDz; + myMethodType = MethodType::BOX_POINT_DIMS; + headError = "Box builder with coordinates and dimensions"; } //================================================================================================= bool GeomAlgoAPI_Box::check() { - if (myMethodType == MethodType::BOX_DIM) { + if (myMethodType == MethodType::BOX_DIM || myMethodType == MethodType::BOX_POINT_DIMS) { if (myDx < Precision::Confusion()) { - myError = "Box builder with dimensions :: Dx is null or negative."; + myError = headError + " :: Dx is null or negative."; return false; } else if (myDy < Precision::Confusion()) { - myError = "Box builder with dimensions :: Dy is null or negative."; + myError = headError + " :: Dy is null or negative."; return false; } else if (myDz < Precision::Confusion()) { - myError = "Box builder with dimensions :: Dz is null or negative."; + myError = headError + " :: Dz is null or negative."; return false; } } else if (myMethodType == MethodType::BOX_POINTS) { if (!myFirstPoint.get()) { - myError = "Box builder with points :: the first point is not valid."; + myError = headError + " :: the first point is not valid."; return false; } if (!mySecondPoint.get()) { - myError = "Box builder with points :: the second point is not valid."; + myError = headError + " :: the second point is not valid."; return false; } if (myFirstPoint->distance(mySecondPoint) < Precision::Confusion()) { - myError = "Box builder with points :: the distance between the two points is null."; + myError = headError + " :: the distance between the two points is null."; return false; } double aDiffX = myFirstPoint->x() - mySecondPoint->x(); @@ -79,7 +95,7 @@ bool GeomAlgoAPI_Box::check() fabs(aDiffY) < Precision::Confusion() || fabs(aDiffZ) < Precision::Confusion()) { myError = - "Box builder with points :: the points belong both to one of the OXY, OYZ or OZX planes."; + headError + " :: the points belong both to one of the OXY, OYZ or OZX planes."; return false; } } else { @@ -96,6 +112,8 @@ void GeomAlgoAPI_Box::build() buildWithDimensions(); } else if (myMethodType == MethodType::BOX_POINTS) { buildWithPoints(); + } else if (myMethodType == MethodType::BOX_POINT_DIMS) { + buildWithPointAndDims(); } else { myError = "Box builder :: Method not implemented."; return; @@ -113,7 +131,7 @@ void GeomAlgoAPI_Box::buildWithDimensions() // Test the algorithm if (!aBoxMaker->IsDone()) { - myError = "Box builder with dimensions :: algorithm failed."; + myError = headError + " :: algorithm failed."; return; } @@ -124,7 +142,7 @@ void GeomAlgoAPI_Box::buildWithDimensions() // Test on the shapes if (!aShape.get() || aShape->isNull()) { - myError = "Box builder with dimensions :: resulting shape is null."; + myError = headError + " :: resulting shape is null."; return; } @@ -147,7 +165,7 @@ void GeomAlgoAPI_Box::buildWithPoints() // Test the algorithm if(!aBoxMaker->IsDone()) { - myError = "Box builder with two points :: algorithm failed."; + myError = headError + " :: algorithm failed."; return; } @@ -159,7 +177,7 @@ void GeomAlgoAPI_Box::buildWithPoints() // Tests on the shape if (!aShape.get() || aShape->isNull()) { - myError = "Box builder with two points :: resulting shape is null."; + myError = headError + " :: resulting shape is null."; return; } @@ -168,6 +186,18 @@ void GeomAlgoAPI_Box::buildWithPoints() setDone(true); } +//================================================================================================= +void GeomAlgoAPI_Box::buildWithPointAndDims() +{ + // Construct points from cordinates and dimensions to use the method with two points + myFirstPoint = + std::shared_ptr(new GeomAPI_Pnt(myOx - myDx, myOy - myDy, myOz - myDz)); + mySecondPoint = + std::shared_ptr(new GeomAPI_Pnt(myOx + myDx, myOy + myDy, myOz + myDz)); + + buildWithPoints(); +} + //================================================================================================= void GeomAlgoAPI_Box::prepareNamingFaces() { diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Box.h b/src/GeomAlgoAPI/GeomAlgoAPI_Box.h index 69236954f..8dfce4e55 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Box.h +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Box.h @@ -34,6 +34,7 @@ class GeomAlgoAPI_Box : public GeomAlgoAPI_MakeShape enum MethodType { BOX_DIM, ///< Box with dimensions BOX_POINTS, ///< Box with points + BOX_POINT_DIMS, /// theFirstPoint, std::shared_ptr theSecondPoint); + + /// Creates a box using coordinates of a point (the center of gravity) andthe dimensions. + /// \param theOx The X coordinate of the point + /// \param theOy The Y coordinate of the point + /// \param theOz The Z coordinate of the point + /// \param theDx The dimension on X + /// \param theDy The dimension on Y + /// \param theDz The dimension on Z + GEOMALGOAPI_EXPORT GeomAlgoAPI_Box(const double theOx, const double theOy, const double theOz, + const double theDx, const double theDy, const double theDz); /// Checks if data for the box construction is OK. GEOMALGOAPI_EXPORT bool check(); @@ -64,13 +75,19 @@ class GeomAlgoAPI_Box : public GeomAlgoAPI_MakeShape void buildWithDimensions(); /// Builds the box with two points void buildWithPoints(); + /// Buils the box with coordinates of a point and dimensions + void buildWithPointAndDims(); + double myOx; /// X coordinate of the point to create a box. + double myOy; /// Y coordinate of the point to create a box. + double myOz; /// Z coordinate of the point to create a box. double myDx; /// Dimension on X to create a box. double myDy; /// Dimension on Y to create a box. double myDz; /// Dimension Z to create a box. std::shared_ptr myFirstPoint; /// First point to create a box. std::shared_ptr mySecondPoint; /// Second point to create a box. MethodType myMethodType; /// Type of method used. + std::string headError; /// Head of the error message according to the method }; diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeAPI.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeAPI.cpp index 55567c40a..6536032ce 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeAPI.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeAPI.cpp @@ -85,6 +85,16 @@ namespace GeomAlgoAPI_ShapeAPI return runAlgoAndCheckShape(aBoxAlgo, aMsg); } + //=============================================================================================== + std::shared_ptr GeomAlgoAPI_ShapeAPI::makeBox( + const double theOx, const double theOy, const double theOz, + const double theDx, const double theDy, const double theDz) throw (GeomAlgoAPI_Exception) + { + static const std::string aMsg("Box builder with two points"); + GeomAlgoAPI_Box aBoxAlgo(theOx, theOy, theOz, theDx, theDy, theDz); + return runAlgoAndCheckShape(aBoxAlgo, aMsg); + } + //=============================================================================================== std::shared_ptr GeomAlgoAPI_ShapeAPI::makeCylinder( std::shared_ptr theBasePoint, std::shared_ptr theEdge, diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeAPI.h b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeAPI.h index fe1f86f2b..c34d077a3 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeAPI.h +++ b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeAPI.h @@ -52,6 +52,19 @@ public: static std::shared_ptr makeBox(std::shared_ptr theFirstPoint, std::shared_ptr theSecondPoint) throw (GeomAlgoAPI_Exception); + /// Creates a box using coordinates of a point and dimensions + /// \param theOx The X coordinate of the point + /// \param theOy The Y coordinate of the point + /// \param theOz The Z coordinate of the point + /// \param theDx The dimension on X + /// \param theDy The dimension on Y + /// \param theDz The dimension on Z + /// \return a shape + static std::shared_ptr makeBox(const double theOx, const double theOy, + const double theOz, const double theDx, + const double theDy, const double theDz) + throw (GeomAlgoAPI_Exception); + /// Creates a cylinder using a center, an axis, a radius and a height. /// \param theBasePoint The center of the lower base of the cylinder /// \param theEdge The axis of the cylinder diff --git a/src/PrimitivesPlugin/PrimitivesPlugin_Box.cpp b/src/PrimitivesPlugin/PrimitivesPlugin_Box.cpp index 8fce2cc9b..196872dc2 100644 --- a/src/PrimitivesPlugin/PrimitivesPlugin_Box.cpp +++ b/src/PrimitivesPlugin/PrimitivesPlugin_Box.cpp @@ -28,7 +28,6 @@ #include #include -#include //================================================================================================= PrimitivesPlugin_Box::PrimitivesPlugin_Box() // Nothing to do during instantiation @@ -40,14 +39,25 @@ void PrimitivesPlugin_Box::initAttributes() { data()->addAttribute(PrimitivesPlugin_Box::CREATION_METHOD(), ModelAPI_AttributeString::typeId()); + // Data for the first mode data()->addAttribute(PrimitivesPlugin_Box::DX_ID(), ModelAPI_AttributeDouble::typeId()); data()->addAttribute(PrimitivesPlugin_Box::DY_ID(), ModelAPI_AttributeDouble::typeId()); data()->addAttribute(PrimitivesPlugin_Box::DZ_ID(), ModelAPI_AttributeDouble::typeId()); + // Data for the second mode data()->addAttribute(PrimitivesPlugin_Box::POINT_FIRST_ID(), ModelAPI_AttributeSelection::typeId()); data()->addAttribute(PrimitivesPlugin_Box::POINT_SECOND_ID(), ModelAPI_AttributeSelection::typeId()); + + // Data for the third mode + data()->addAttribute(PrimitivesPlugin_Box::OX_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(PrimitivesPlugin_Box::OY_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(PrimitivesPlugin_Box::OZ_ID(), ModelAPI_AttributeDouble::typeId()); + + data()->addAttribute(PrimitivesPlugin_Box::HALF_DX_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(PrimitivesPlugin_Box::HALF_DY_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(PrimitivesPlugin_Box::HALF_DZ_ID(), ModelAPI_AttributeDouble::typeId()); } //================================================================================================= @@ -61,6 +71,9 @@ void PrimitivesPlugin_Box::execute() if (aMethodType == CREATION_METHOD_BY_TWO_POINTS()) createBoxByTwoPoints(); + + if (aMethodType == CREATION_METHOD_BY_ONE_POINT_AND_DIMS()) + createBoxByOnePointAndDims(); } //================================================================================================= @@ -148,6 +161,50 @@ void PrimitivesPlugin_Box::createBoxByTwoPoints() setResult(aResultBox, aResultIndex); } +//================================================================================================= +void PrimitivesPlugin_Box::createBoxByOnePointAndDims() +{ + // Getting dx, dy and dz + double aDx = real(PrimitivesPlugin_Box::HALF_DX_ID())->value(); + double aDy = real(PrimitivesPlugin_Box::HALF_DY_ID())->value(); + double aDz = real(PrimitivesPlugin_Box::HALF_DZ_ID())->value(); + + // Getting point coordinates + double x = real(PrimitivesPlugin_Box::OX_ID())->value(); + double y = real(PrimitivesPlugin_Box::OY_ID())->value(); + double z = real(PrimitivesPlugin_Box::OZ_ID())->value(); + + std::shared_ptr aBoxAlgo; + aBoxAlgo = std::shared_ptr(new GeomAlgoAPI_Box(x,y,z,aDx,aDy,aDz)); + + // These checks should be made to the GUI for the feature but + // the corresponding validator does not exist yet. + if (!aBoxAlgo->check()) { + setError(aBoxAlgo->getError()); + return; + } + + // Build the box + aBoxAlgo->build(); + + // Check if the creation of the box + if(!aBoxAlgo->isDone()) { + // The error is not displayed in a popup window. It must be in the message console. + setError(aBoxAlgo->getError()); + return; + } + if(!aBoxAlgo->checkValid("Box builder with one point and dimensions")) { + // The error is not displayed in a popup window. It must be in the message console. + setError(aBoxAlgo->getError()); + return; + } + + int aResultIndex = 0; + ResultBodyPtr aResultBox = document()->createBody(data(), aResultIndex); + loadNamingDS(aBoxAlgo, aResultBox); + setResult(aResultBox, aResultIndex); +} + //================================================================================================= void PrimitivesPlugin_Box::loadNamingDS(std::shared_ptr theBoxAlgo, std::shared_ptr theResultBox) diff --git a/src/PrimitivesPlugin/PrimitivesPlugin_Box.h b/src/PrimitivesPlugin/PrimitivesPlugin_Box.h index e9ab91cf5..8a56f8363 100644 --- a/src/PrimitivesPlugin/PrimitivesPlugin_Box.h +++ b/src/PrimitivesPlugin/PrimitivesPlugin_Box.h @@ -27,14 +27,14 @@ class GeomAPI_Shape; class ModelAPI_ResultBody; -/**\class PrimitivesPlugin_Box - * \ingroup Plugins - * \brief Feature for creation of a box primitive using various methods. - * - * Box creates a cuboid - Parallelepiped with 6 rectangular faces. It can be built via two - * methods : using two points that define a diagonal, or using 3 lengths that define the - * rectangular dimensions. - */ +/// \class PrimitivesPlugin_Box +/// \ingroup Plugins +/// \brief Feature for creation of a box primitive using various methods. +/// +/// Supported following methods: +/// * two points that define a diagonal, +/// * three lengths that define the rectangular dimensions, +/// * one point and three lengths that define the rectangular dimensions. class PrimitivesPlugin_Box : public ModelAPI_Feature { public: @@ -66,6 +66,13 @@ class PrimitivesPlugin_Box : public ModelAPI_Feature return MY_CREATION_METHOD_ID; } + /// Attribute name for creation method + inline static const std::string& CREATION_METHOD_BY_ONE_POINT_AND_DIMS() + { + static const std::string MY_CREATION_METHOD_ID("BoxByOnePointAndDims"); + return MY_CREATION_METHOD_ID; + } + /// Attribute name of first point inline static const std::string& POINT_FIRST_ID() { @@ -80,26 +87,68 @@ class PrimitivesPlugin_Box : public ModelAPI_Feature return MY_POINT_SECOND_ID; } - /// Attribute first coordinate + /// Attribute name of the X dimension inline static const std::string& DX_ID() { static const std::string MY_DX_ID("dx"); return MY_DX_ID; } - /// Attribute second coordinate + /// Attribute name of the Y dimension inline static const std::string& DY_ID() { static const std::string MY_DY_ID("dy"); return MY_DY_ID; } - /// Attribute third coordinate + /// Attribute name of the Z dimension inline static const std::string& DZ_ID() { static const std::string MY_DZ_ID("dz"); return MY_DZ_ID; } + + /// Attribute name of the coordinate X for the origin + inline static const std::string& OX_ID() + { + static const std::string MY_OX_ID("ox"); + return MY_OX_ID; + } + + /// Attribute name of the coordinate Y for the origin + inline static const std::string& OY_ID() + { + static const std::string MY_OY_ID("oy"); + return MY_OY_ID; + } + + /// Attribute name of the coordinate Z for the origin + inline static const std::string& OZ_ID() + { + static const std::string MY_OZ_ID("oz"); + return MY_OZ_ID; + } + + /// Attribute name of the half length in X + inline static const std::string& HALF_DX_ID() + { + static const std::string MY_HALF_DX_ID("half_dx"); + return MY_HALF_DX_ID; + } + + /// Attribute name of the half length in Y + inline static const std::string& HALF_DY_ID() + { + static const std::string MY_HALF_DY_ID("half_dy"); + return MY_HALF_DY_ID; + } + + /// Attribute name of the half length in Z + inline static const std::string& HALF_DZ_ID() + { + static const std::string MY_HALF_DZ_ID("half_dz"); + return MY_HALF_DZ_ID; + } /// Returns the kind of a feature PRIMITIVESPLUGIN_EXPORT virtual const std::string& getKind() @@ -125,9 +174,12 @@ class PrimitivesPlugin_Box : public ModelAPI_Feature ///Perform the creation of the box using two points defining a diagonal void createBoxByTwoPoints(); - ///Perform the creation of the box using three cordinates + ///Perform the creation of the box using three dimensions void createBoxByDimensions(); + ///Perform the creation of the box using one point and three dimensions + void createBoxByOnePointAndDims(); + }; diff --git a/src/PrimitivesPlugin/box_widget.xml b/src/PrimitivesPlugin/box_widget.xml index f968b5154..53eb9c0f2 100644 --- a/src/PrimitivesPlugin/box_widget.xml +++ b/src/PrimitivesPlugin/box_widget.xml @@ -8,6 +8,7 @@ default="10.0" icon="" tooltip="Dimension in X"> + + + @@ -40,5 +43,56 @@ shape_types="vertex"> + + + + + + + + + + + + + + + + + + + + + diff --git a/src/PrimitivesPlugin/doc/TUI_boxByPtDims.rst b/src/PrimitivesPlugin/doc/TUI_boxByPtDims.rst new file mode 100644 index 000000000..2b5aa3142 --- /dev/null +++ b/src/PrimitivesPlugin/doc/TUI_boxByPtDims.rst @@ -0,0 +1,12 @@ + + .. _tui_create_boxptdim: + +Create Box coordinates of a point and dimensions +================================================ + +.. literalinclude:: examples/box3.py + :linenos: + :language: python + +:download:`Download this script ` + diff --git a/src/PrimitivesPlugin/doc/boxFeature.rst b/src/PrimitivesPlugin/doc/boxFeature.rst index a0809eba8..be10b6443 100644 --- a/src/PrimitivesPlugin/doc/boxFeature.rst +++ b/src/PrimitivesPlugin/doc/boxFeature.rst @@ -11,16 +11,19 @@ To create a Box in the active part: #. select in the Main Menu *Primitives - > Box* item or #. click |box.icon| **Box** button in the toolbar: -There are 2 algorithms for creation of a Box: +There are 3 algorithms for creation of a Box: -.. image:: images/box_2pt_32x32.png +.. image:: images/box_dxyz_32x32.png :align: left **By dimensions** -.. image:: images/box_dxyz_32x32.png +.. image:: images/box_2pt_32x32.png :align: left **By two points** +.. image:: images/box_pt_dxyz_32x32.png + :align: left +**By coordinates of a point and dimensions** By dimensions ------------- @@ -88,3 +91,39 @@ A solid box based on two points and with edges parallel to the coordinate axes. Created boxes **See Also** a sample TUI Script of :ref:`tui_create_boxpnt` operation. + +By coordinates of a point and dimensions +---------------------------------------- + +Box is created by dimensions along X, Y, Z axis starting from the point of coordinates (x,y,z). + +.. image:: images/Box_ptAndDims.png + :align: center + +Input fields: + +- **OX**, **OY**, **OZ** define coordinates of the center of box. +- **DX**, **DY**, **DZ** define dimensions (hafl length) of the box along the corresponding coordinate axes. + +**TUI Command**: + +.. py:function:: model.addBox(Part_doc, OX, OY, OZ, DX, DY, DZ) + + :param part: The current part object. + :param real: X coordinate of the center point + :param real: Y coordinate of the center point + :param real: Z coordinate of the center point + :param real: Half size along X. + :param real: Half size along Y. + :param real: Half size along Z. + :return: Result object. + +Result +"""""" + +A solid box whose point coordinates are the center and the dimensions are half lengths on one side and the other on the axes relative to the center.. + +.. image:: images/Box3.png + :align: center + +**See Also** a sample TUI Script of :ref:`tui_create_boxptdim` operation. \ No newline at end of file diff --git a/src/PrimitivesPlugin/doc/examples/box3.py b/src/PrimitivesPlugin/doc/examples/box3.py new file mode 100644 index 000000000..493143920 --- /dev/null +++ b/src/PrimitivesPlugin/doc/examples/box3.py @@ -0,0 +1,9 @@ +from salome.shaper import model + +model.begin() +partSet = model.moduleDocument() +Part_1 = model.addPart(partSet) +Part_1_doc = Part_1.document() +Box_1 = model.addBox(Part_1_doc, 0, 0, 0, 20, 20, 20) +model.do() +model.end() diff --git a/src/PrimitivesPlugin/doc/images/Box3.png b/src/PrimitivesPlugin/doc/images/Box3.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b5e5fcec174bb54b17897e5c070345534fa0b3 GIT binary patch literal 4828 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 literal 0 HcmV?d00001 diff --git a/src/PrimitivesPlugin/doc/images/Box_2points.png b/src/PrimitivesPlugin/doc/images/Box_2points.png index 77bec595da76cdf9e2a1efbba0331c072b05c177..fa73200da002f7194253bad088aaa85dc0c69c35 100644 GIT binary patch literal 7755 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

x+Y>9o6|Fj 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 diff --git a/src/PrimitivesPlugin/icons/box_pt_dxyz_32x32.png b/src/PrimitivesPlugin/icons/box_pt_dxyz_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..db199ea7b2e76b8ad13b1590a4aca86f25527446 GIT binary patch literal 1188 zcmV;V1Y7%wP);t6w@9EA`FA1tb1w{n%RRlg z@O0rmm-~S5qVM)>=RD{4oX_{1-#NcWph02Lu?a$o(?Echc&!p}Q+R}L*}g{zvH-8S zggcqg1{XqLTCoyuoo?2!8x6lRJUle%o!i;MqT=2bNCmz#Hl7!ri<~t)`%BkR~e?Fb=jy6s3>`S?n{#vfU zcgDuE{E-NC1D@cw8XKs;UPgb z!4(5q;6+!yTw7tnxF`fKr>oi3-Azl|ooV4`bIxm?mZqq z(3=Wi$VS}O*I1YEuFLq|1N$5kduywh^HSeuqW_Np-GG(V`x8Jqu3cbl6%l7XR1cO? zvjI(s(hUxH{E~Gm+aPAC@>Gk{*yx7s1Se=w01b*$U zJn;QDO6=B-7IH>LsLs#jP(vMuPGk@ozQpa^;=!ox5I!9q0zEj2R5nrDkH@91TG2$#Zy(j9?2`;PSoku~m5c_`19=E-&TtuP!1T z2icBfzp8<+vraQ;?x4hK!N+Q0%+HUi%v|n1``=&9?&FJH1>#O66=lwF2_&}_=H<8; z7#p+EXYQb*y_J`MpY(bv)Lxi(erlYHfy1d8vjR?)#cG*oN+4McKFL7y?Z5aqM>XbN-$Jg-G`V2ly8!6U8#6v7%%E0000