From 2e3ce0cb16568b8e3f6e2b5d91782b1207c84067 Mon Sep 17 00:00:00 2001 From: cg246364 Date: Fri, 18 Mar 2022 10:22:34 +0100 Subject: [PATCH] Add a new mode for creating a box by a center and dimensions. (TestBox.py) Add a new mode for creating a sphere part. (TestSphere.py) Add a new "Tube" primitive. (TestTube.py) --- src/GeomAlgoAPI/CMakeLists.txt | 2 + src/GeomAlgoAPI/GeomAlgoAPI_Box.cpp | 54 +++-- src/GeomAlgoAPI/GeomAlgoAPI_Box.h | 17 ++ src/GeomAlgoAPI/GeomAlgoAPI_Sphere.cpp | 188 ++++++++++++++-- src/GeomAlgoAPI/GeomAlgoAPI_Sphere.h | 17 ++ src/GeomAlgoAPI/GeomAlgoAPI_Tube.cpp | 132 ++++++++++++ src/GeomAlgoAPI/GeomAlgoAPI_Tube.h | 57 +++++ src/PrimitivesAPI/CMakeLists.txt | 2 + src/PrimitivesAPI/PrimitivesAPI.i | 2 + src/PrimitivesAPI/PrimitivesAPI_Box.cpp | 73 ++++++- src/PrimitivesAPI/PrimitivesAPI_Box.h | 51 ++++- src/PrimitivesAPI/PrimitivesAPI_Sphere.cpp | 86 +++++++- src/PrimitivesAPI/PrimitivesAPI_Sphere.h | 51 ++++- src/PrimitivesAPI/PrimitivesAPI_Torus.h | 8 +- src/PrimitivesAPI/PrimitivesAPI_Tube.cpp | 91 ++++++++ src/PrimitivesAPI/PrimitivesAPI_Tube.h | 86 ++++++++ src/PrimitivesAPI/PrimitivesAPI_swig.h | 1 + src/PrimitivesPlugin/CMakeLists.txt | 3 + src/PrimitivesPlugin/PrimitivesPlugin_Box.cpp | 57 +++++ src/PrimitivesPlugin/PrimitivesPlugin_Box.h | 57 ++++- .../PrimitivesPlugin_Plugin.cpp | 3 + .../PrimitivesPlugin_Sphere.cpp | 73 ++++++- .../PrimitivesPlugin_Sphere.h | 75 ++++++- .../PrimitivesPlugin_Tube.cpp | 78 +++++++ src/PrimitivesPlugin/PrimitivesPlugin_Tube.h | 88 ++++++++ .../PrimitivesPlugin_msg_fr.ts | 201 ++++++++++++++++++ src/PrimitivesPlugin/box_widget.xml | 51 +++++ src/PrimitivesPlugin/doc/PrimitivesPlugin.rst | 1 + src/PrimitivesPlugin/doc/TUI_boxByPtDims.rst | 12 ++ src/PrimitivesPlugin/doc/TUI_coneFeature.rst | 4 +- .../doc/TUI_cylinderFeature.rst | 4 +- .../doc/TUI_cylinderPortion.rst | 2 +- .../doc/TUI_sphereFeature.rst | 9 +- src/PrimitivesPlugin/doc/TUI_spherePart.rst | 11 + src/PrimitivesPlugin/doc/TUI_torusFeature.rst | 4 +- src/PrimitivesPlugin/doc/TUI_tubeFeature.rst | 12 ++ src/PrimitivesPlugin/doc/boxFeature.rst | 54 ++++- src/PrimitivesPlugin/doc/examples/box3.py | 9 + .../doc/examples/{sphere.py => sphere1.py} | 0 src/PrimitivesPlugin/doc/examples/sphere2.py | 9 + src/PrimitivesPlugin/doc/examples/tube.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 .../doc/images/Box_ptAndDims.png | Bin 0 -> 14590 bytes src/PrimitivesPlugin/doc/images/Sphere.png | Bin 6430 -> 0 bytes src/PrimitivesPlugin/doc/images/Sphere1.png | Bin 0 -> 38084 bytes src/PrimitivesPlugin/doc/images/Sphere2.png | Bin 0 -> 19655 bytes .../doc/images/Sphere_button.png | Bin 643 -> 1831 bytes .../doc/images/Sphere_full.png | Bin 0 -> 9628 bytes .../doc/images/Sphere_part.png | Bin 0 -> 14711 bytes .../doc/images/Sphere_res.png | Bin 17454 -> 0 bytes src/PrimitivesPlugin/doc/images/Tube.png | Bin 0 -> 5163 bytes .../doc/images/Tube_button.png | Bin 0 -> 1789 bytes src/PrimitivesPlugin/doc/images/Tube_res.png | Bin 0 -> 6622 bytes src/PrimitivesPlugin/doc/images/box.png | Bin 528 -> 0 bytes .../doc/images/box_pt_dxyz_32x32.png | Bin 0 -> 1188 bytes .../doc/images/sphere_32x32.png | Bin 0 -> 2832 bytes .../doc/images/sphere_part_32x32.png | Bin 0 -> 2484 bytes src/PrimitivesPlugin/doc/sphereFeature.rst | 82 +++++-- src/PrimitivesPlugin/doc/tubeFeature.rst | 46 ++++ .../icons/box_pt_dxyz_32x32.png | Bin 0 -> 1188 bytes src/PrimitivesPlugin/icons/sphere.png | Bin 466 -> 1831 bytes src/PrimitivesPlugin/icons/sphere_32x32.png | Bin 0 -> 2832 bytes .../icons/sphere_part_32x32.png | Bin 0 -> 2484 bytes src/PrimitivesPlugin/icons/tube.png | Bin 0 -> 1789 bytes src/PrimitivesPlugin/plugin-Primitives.xml | 6 + src/PrimitivesPlugin/sphere_widget.xml | 78 +++++-- src/PrimitivesPlugin/tube_widget.xml | 26 +++ src/PythonAPI/model/primitives/__init__.py | 2 +- test.API/SHAPER/Primitives/TestAPI_Box.py | 12 +- test.API/SHAPER/Primitives/TestBox.py | 15 +- test.API/SHAPER/Primitives/TestSphere.py | 12 ++ test.API/SHAPER/Primitives/TestTube.py | 66 ++++++ test.API/SHAPER/tests.set | 1 + 75 files changed, 1983 insertions(+), 107 deletions(-) create mode 100644 src/GeomAlgoAPI/GeomAlgoAPI_Tube.cpp create mode 100644 src/GeomAlgoAPI/GeomAlgoAPI_Tube.h create mode 100644 src/PrimitivesAPI/PrimitivesAPI_Tube.cpp create mode 100644 src/PrimitivesAPI/PrimitivesAPI_Tube.h create mode 100644 src/PrimitivesPlugin/PrimitivesPlugin_Tube.cpp create mode 100644 src/PrimitivesPlugin/PrimitivesPlugin_Tube.h create mode 100644 src/PrimitivesPlugin/doc/TUI_boxByPtDims.rst create mode 100644 src/PrimitivesPlugin/doc/TUI_spherePart.rst create mode 100644 src/PrimitivesPlugin/doc/TUI_tubeFeature.rst create mode 100644 src/PrimitivesPlugin/doc/examples/box3.py rename src/PrimitivesPlugin/doc/examples/{sphere.py => sphere1.py} (100%) create mode 100644 src/PrimitivesPlugin/doc/examples/sphere2.py create mode 100644 src/PrimitivesPlugin/doc/examples/tube.py create mode 100644 src/PrimitivesPlugin/doc/images/Box3.png create mode 100644 src/PrimitivesPlugin/doc/images/Box_ptAndDims.png delete mode 100644 src/PrimitivesPlugin/doc/images/Sphere.png create mode 100644 src/PrimitivesPlugin/doc/images/Sphere1.png create mode 100644 src/PrimitivesPlugin/doc/images/Sphere2.png create mode 100644 src/PrimitivesPlugin/doc/images/Sphere_full.png create mode 100644 src/PrimitivesPlugin/doc/images/Sphere_part.png delete mode 100644 src/PrimitivesPlugin/doc/images/Sphere_res.png create mode 100644 src/PrimitivesPlugin/doc/images/Tube.png create mode 100755 src/PrimitivesPlugin/doc/images/Tube_button.png create mode 100644 src/PrimitivesPlugin/doc/images/Tube_res.png delete mode 100644 src/PrimitivesPlugin/doc/images/box.png create mode 100644 src/PrimitivesPlugin/doc/images/box_pt_dxyz_32x32.png create mode 100644 src/PrimitivesPlugin/doc/images/sphere_32x32.png create mode 100644 src/PrimitivesPlugin/doc/images/sphere_part_32x32.png create mode 100644 src/PrimitivesPlugin/doc/tubeFeature.rst create mode 100644 src/PrimitivesPlugin/icons/box_pt_dxyz_32x32.png create mode 100755 src/PrimitivesPlugin/icons/sphere_32x32.png create mode 100755 src/PrimitivesPlugin/icons/sphere_part_32x32.png create mode 100755 src/PrimitivesPlugin/icons/tube.png create mode 100644 src/PrimitivesPlugin/tube_widget.xml create mode 100644 test.API/SHAPER/Primitives/TestTube.py diff --git a/src/GeomAlgoAPI/CMakeLists.txt b/src/GeomAlgoAPI/CMakeLists.txt index 19ace76ed..17eec671e 100644 --- a/src/GeomAlgoAPI/CMakeLists.txt +++ b/src/GeomAlgoAPI/CMakeLists.txt @@ -92,6 +92,7 @@ SET(PROJECT_HEADERS GeomAlgoAPI_Defeaturing.h GeomAlgoAPI_BoundingBox.h GeomAlgoAPI_NormalToFace.h + GeomAlgoAPI_Tube.h ) SET(PROJECT_SOURCES @@ -163,6 +164,7 @@ SET(PROJECT_SOURCES GeomAlgoAPI_Defeaturing.cpp GeomAlgoAPI_BoundingBox.cpp GeomAlgoAPI_NormalToFace.cpp + GeomAlgoAPI_Tube.cpp ) SET(PROJECT_LIBRARIES diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Box.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Box.cpp index 1dcc9fa97..4ba9fd2ad 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 c6f1269f1..b64131f9b 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_Sphere.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Sphere.cpp index f2b8db42c..7a045049f 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Sphere.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Sphere.cpp @@ -23,26 +23,55 @@ #include +#include + +#include +#include +#include + +#include #include //================================================================================================= GeomAlgoAPI_Sphere::GeomAlgoAPI_Sphere(std::shared_ptr theCenterPoint, const double theRadius) { + isRootGeo = false; myCenterPoint = theCenterPoint; myRadius = theRadius; } +//================================================================================================= +GeomAlgoAPI_Sphere::GeomAlgoAPI_Sphere(const double theRMin, const double theRMax, + const double thePhiMin, const double thePhiMax, + const double theThetaMin, const double theThetaMax) +{ + isRootGeo = true; + myRMin = theRMin; + myRMax = theRMax; + myPhiMin = thePhiMin; + myPhiMax = thePhiMax; + myThetaMin = theThetaMin; + myThetaMax = theThetaMax; +} + //================================================================================================= bool GeomAlgoAPI_Sphere::check() { - if (!myCenterPoint) { - myError = "Sphere builder :: center is not valid."; - return false; - } - if (myRadius < Precision::Confusion()) { - myError = "Sphere builder :: radius is negative or null."; - return false; + if (isRootGeo) { + if ((myRMin-myRMax) > Precision::Confusion()) { + myError = "Sphere builder :: RMin is larger than RMax."; + return false; + } + } else { + if (!myCenterPoint) { + myError = "Sphere builder :: center is not valid."; + return false; + } + if (myRadius < Precision::Confusion()) { + myError = "Sphere builder :: radius is negative or null."; + return false; + } } return true; } @@ -51,30 +80,151 @@ bool GeomAlgoAPI_Sphere::check() void GeomAlgoAPI_Sphere::build() { myCreatedFaces.clear(); + if (isRootGeo) { + buildRootSphere(); + } else { + const gp_Pnt& aCenterPoint = myCenterPoint->impl(); + + // Construct the sphere + BRepPrimAPI_MakeSphere *aSphereMaker = new BRepPrimAPI_MakeSphere(aCenterPoint, myRadius); + + aSphereMaker->Build(); + + if (!aSphereMaker->IsDone()) { + return; + } + + TopoDS_Shape aResult = aSphereMaker->Shape(); + std::shared_ptr aShape(new GeomAPI_Shape()); + aShape->setImpl(new TopoDS_Shape(aResult)); + setShape(aShape); + + // Test on the shapes + if (!aShape.get() || aShape->isNull()) { + myError = "Sphere builder :: resulting shape is null."; + return; + } + + setImpl(aSphereMaker); + + setDone(true); + } +} + +//================================================================================================= +void GeomAlgoAPI_Sphere::buildRootSphere() +{ + myCreatedFaces.clear(); + + const double aStartPhiRad = myPhiMin * M_PI / 180.; + BRepBuilderAPI_MakeWire aWireBuilder; + + gp_Pnt anOrigin(0., 0., 0.); + gp_Dir aNormal(-sin(aStartPhiRad), cos(aStartPhiRad), 0.); + + + // The section is defined by 4 points and up to 4 wires. In the rmin = 0 case, two of the points + // will actually be the origin + double aX = myRMax*sin(myThetaMin * M_PI/180.); + double aZ = myRMax*cos(myThetaMin * M_PI/180.); + gp_Pnt aTopOuterStart(aX*cos(aStartPhiRad), aX*sin(aStartPhiRad), aZ); - const gp_Pnt& aCenterPoint = myCenterPoint->impl(); + aX = myRMax*sin((myThetaMin+myThetaMax) * M_PI/180.); + aZ = myRMax*cos((myThetaMin+myThetaMax) * M_PI/180.); + gp_Pnt aBaseOuterEnd(aX*cos(aStartPhiRad), aX*sin(aStartPhiRad), aZ); - // Construct the sphere - BRepPrimAPI_MakeSphere *aSphereMaker = new BRepPrimAPI_MakeSphere(aCenterPoint, myRadius); + aX = myRMin*sin(myThetaMin * M_PI/180.); + aZ = myRMin*cos(myThetaMin * M_PI/180.); + gp_Pnt aTopInnerStart(aX*cos(aStartPhiRad), aX*sin(aStartPhiRad), aZ); - aSphereMaker->Build(); + aX = myRMin*sin((myThetaMin+myThetaMax) * M_PI/180.); + aZ = myRMin*cos((myThetaMin+myThetaMax) * M_PI/180.); + gp_Pnt aBaseInnerEnd(aX*cos(aStartPhiRad), aX*sin(aStartPhiRad), aZ); + + // There will always be the rmax arc since rmax can't be zero + gp_Circ anOuterCircle(gp_Ax2(anOrigin, aNormal), myRMax); + BRepBuilderAPI_MakeEdge anArcOuterBuilder; + if (aTopOuterStart.IsEqual(aBaseOuterEnd, Precision::Confusion())) + anArcOuterBuilder = BRepBuilderAPI_MakeEdge(anOuterCircle); + else + anArcOuterBuilder = BRepBuilderAPI_MakeEdge(anOuterCircle, aTopOuterStart, aBaseOuterEnd); + anArcOuterBuilder.Build(); + + // Two cases : either we need four edges (one being an arc with curvature radius rmin) or we + // need three (if rmin=0). + // In the later case the top and bottom edges intersect at the origin + // Add the edges to the wire in consecutive order (very important for the face to make sense + // topologically) + if(myRMin >= Precision::Confusion()){ + gp_Circ anInnerCircle(gp_Ax2(anOrigin, aNormal), myRMin); + BRepBuilderAPI_MakeEdge anArcInnerBuilder; + if (aTopInnerStart.IsEqual(aBaseInnerEnd, Precision::Confusion())) + anArcInnerBuilder = BRepBuilderAPI_MakeEdge(anInnerCircle); + else + anArcInnerBuilder = BRepBuilderAPI_MakeEdge(anInnerCircle, aTopInnerStart, aBaseInnerEnd); + anArcInnerBuilder.Build(); + + BRepBuilderAPI_MakeEdge anEdgeStartBuilder(aTopInnerStart, aTopOuterStart); + anEdgeStartBuilder.Build(); + BRepBuilderAPI_MakeEdge anEdgeEndBuilder(aBaseInnerEnd, aBaseOuterEnd); + anEdgeEndBuilder.Build(); + + aWireBuilder.Add(anEdgeStartBuilder.Edge()); + aWireBuilder.Add(anArcOuterBuilder.Edge()); + aWireBuilder.Add(anEdgeEndBuilder.Edge()); + aWireBuilder.Add(anArcInnerBuilder.Edge()); + } + else{ + BRepBuilderAPI_MakeEdge anEdgeStartBuilder(anOrigin, aTopOuterStart); + anEdgeStartBuilder.Build(); + BRepBuilderAPI_MakeEdge anEdgeEndBuilder(anOrigin, aBaseOuterEnd); + anEdgeEndBuilder.Build(); - if (!aSphereMaker->IsDone()) { + aWireBuilder.Add(anArcOuterBuilder.Edge()); + aWireBuilder.Add(anEdgeStartBuilder.Edge()); + aWireBuilder.Add(anEdgeEndBuilder.Edge()); + } + + // Make a face from the wire + aWireBuilder.Build(); + BRepBuilderAPI_MakeFace aFaceBuilder(aWireBuilder.Wire()); + aFaceBuilder.Build(); + + if (!aFaceBuilder.IsDone()){ + myError = "GDML sphere builder :: section is not valid"; + return; + } + + // Mathematical tool objects needed by the revolution builder + gp_Dir aZDir(0., 0., 1.); + gp_Ax1 aZAxis(anOrigin, aZDir); + + // Build the solid using the section face we've created and a revolution builder + BRepPrimAPI_MakeRevol* aRevolBuilder = + new BRepPrimAPI_MakeRevol(aFaceBuilder.Face(), aZAxis, myPhiMax * M_PI / 180., Standard_True); + if(!aRevolBuilder) { + return; + myError = "GDML Sphere builder :: section revolution did not succeed"; + } + if(!aRevolBuilder->IsDone()) { + myError = "GDML Sphere builder :: section revolution did not succeed"; return; } - TopoDS_Shape aResult = aSphereMaker->Shape(); - std::shared_ptr aShape(new GeomAPI_Shape()); - aShape->setImpl(new TopoDS_Shape(aResult)); - setShape(aShape); + // Get the shape, verify it, build a GeomAPI_Shape. + std::shared_ptr aResultShape = + std::shared_ptr(new GeomAPI_Shape()); + aResultShape->setImpl(new TopoDS_Shape(aRevolBuilder->Shape())); + setShape(aResultShape); // Test on the shapes - if (!aShape.get() || aShape->isNull()) { - myError = "Sphere builder :: resulting shape is null."; + if (!(aResultShape).get() || aResultShape->isNull()) { + myError = "GDML Sphere builder :: resulting shape is null."; return; } - setImpl(aSphereMaker); + setImpl(aRevolBuilder); + setBuilderType(OCCT_BRepBuilderAPI_MakeShape); setDone(true); } diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Sphere.h b/src/GeomAlgoAPI/GeomAlgoAPI_Sphere.h index 8fb449948..1f29859bc 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Sphere.h +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Sphere.h @@ -40,6 +40,16 @@ class GeomAlgoAPI_Sphere : public GeomAlgoAPI_MakeShape /// \param theRadius The radius of the sphere GEOMALGOAPI_EXPORT GeomAlgoAPI_Sphere(std::shared_ptr theCenterPoint, const double theRadius); + /// Creates a sphere. + /// \param theRMin The inner radius of the sphere + /// \param theRMax The outer radius of the sphere + /// \param thePhiMin The lower phi limit + /// \param thePhiMax The higher phi limit + /// \param theThetaMin The lower theta limit + /// \param theThetaMax The higher theta limit + GEOMALGOAPI_EXPORT GeomAlgoAPI_Sphere(const double theRMin, const double theRMax, + const double thePhiMin, const double thePhiMax, + const double theThetaMin, const double theThetaMax); /// Checks if data for the sphere construction is OK. GEOMALGOAPI_EXPORT bool check(); @@ -47,9 +57,16 @@ class GeomAlgoAPI_Sphere : public GeomAlgoAPI_MakeShape /// Builds the sphere. GEOMALGOAPI_EXPORT void build(); + /// Builds the sphere. + GEOMALGOAPI_EXPORT void buildRootSphere(); + private: + bool isRootGeo; std::shared_ptr myCenterPoint; /// Center of the sphere. double myRadius; + double myRMin, myRMax; + double myPhiMin, myPhiMax; + double myThetaMin, myThetaMax; }; #endif // GEOMALGOAPI_SPHERE_H_ diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Tube.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Tube.cpp new file mode 100644 index 000000000..55296f33f --- /dev/null +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Tube.cpp @@ -0,0 +1,132 @@ +// Copyright (C) 2014-2021 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 +// + +#include + +#include + +#include +#include +#include +#include + +#include + +#include + +#include +#include + +//================================================================================================= +GeomAlgoAPI_Tube::GeomAlgoAPI_Tube() +{ +} + +//================================================================================================= +GeomAlgoAPI_Tube::GeomAlgoAPI_Tube(const double theRMin, const double theRMax, const double theZ) +{ + myRMin = theRMin; + myRMax = theRMax; + myZ = theZ; +} + +//================================================================================================= +bool GeomAlgoAPI_Tube::check() +{ + if ((myRMax -myRMin) < Precision::Confusion()) { + myError = "Tube builder :: rmin is greater then or equal to rmax."; + return false; + } else if (myRMin < 0.) { + myError = "Tube builder :: rmin is negative."; + return false; + } else if (myZ < Precision::Confusion()) { + myError = "Tube builder :: z is negative or null."; + return false; + } + + return true; +} + +//================================================================================================= +void GeomAlgoAPI_Tube::build() +{ + buildTube(); +} + +//================================================================================================= +void GeomAlgoAPI_Tube::buildTube() +{ + myCreatedFaces.clear(); + + // Construct the inner and outer circles + gp_Pnt anOrigin(0., 0., 0.); + gp_Dir aNormal(0., 0., 1.); + gp_Circ anInnerCircle(gp_Ax2(anOrigin, aNormal), myRMin); + gp_Circ anOuterCircle(gp_Ax2(anOrigin, aNormal), myRMax); + + // Construct the inner wire + BRepBuilderAPI_MakeEdge anInnerCircleBuilder(anInnerCircle); + anInnerCircleBuilder.Build(); + BRepBuilderAPI_MakeWire anInnerWireBuilder; + anInnerWireBuilder.Add(anInnerCircleBuilder.Edge()); + anInnerWireBuilder.Build(); + TopoDS_Wire anInnerWire(anInnerWireBuilder.Wire()); + + // Construct the outer wire + BRepBuilderAPI_MakeEdge anOuterCircleBuilder(anOuterCircle); + anOuterCircleBuilder.Build(); + BRepBuilderAPI_MakeWire anOuterWireBuilder; + anOuterWireBuilder.Add(anOuterCircleBuilder.Edge()); + anOuterWireBuilder.Build(); + TopoDS_Wire anOuterWire(anOuterWireBuilder.Wire()); + + // Construct the face withe the outer wire + BRepBuilderAPI_MakeFace aFaceBuilder(anOuterWire); + aFaceBuilder.Build(); + TopoDS_Face aFace(aFaceBuilder.Face()); + + // Construct the hole face + BRepAlgo_FaceRestrictor aFaceRestrictor; + aFaceRestrictor.Init(aFace, Standard_False, Standard_True); + aFaceRestrictor.Add(anInnerWire); + aFaceRestrictor.Add(anOuterWire); + aFaceRestrictor.Perform(); + aFace = TopoDS_Face(aFaceRestrictor.Current()); + + // Construct the tube + gp_Vec aVec(aNormal); + gp_Trsf aTrsf; + aTrsf.SetTranslation(aVec * -myZ/2); + BRepBuilderAPI_Transform *aTranformBuilder = new BRepBuilderAPI_Transform(aFace, aTrsf); + if (!aTranformBuilder || !aTranformBuilder->IsDone()) { + myError = "Tube builder :: algorithm failed"; + return; + } + TopoDS_Shape aMovedBase = aTranformBuilder->Shape(); + BRepPrimAPI_MakePrism *aPrismBuilder = new BRepPrimAPI_MakePrism(aMovedBase, aVec * myZ); + + std::shared_ptr aShape = std::shared_ptr(new GeomAPI_Shape()); + aShape->setImpl(new TopoDS_Shape(aPrismBuilder->Shape())); + setShape(aShape); + + setImpl(aPrismBuilder); + setBuilderType(OCCT_BRepBuilderAPI_MakeShape); + + setDone(true); +} diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Tube.h b/src/GeomAlgoAPI/GeomAlgoAPI_Tube.h new file mode 100644 index 000000000..73cfe4881 --- /dev/null +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Tube.h @@ -0,0 +1,57 @@ +// Copyright (C) 2017-2021 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 +// + +#ifndef GEOMALGOAPI_TUBE_H_ +#define GEOMALGOAPI_TUBE_H_ + +#include + +/**\class GeomAlgoAPI_Tube + * \ingroup DataAlgo + * \brief Allows to create Tube Primitives + */ +class GeomAlgoAPI_Tube : public GeomAlgoAPI_MakeShape +{ + public: + GEOMALGOAPI_EXPORT GeomAlgoAPI_Tube(); + + /// Creates a tube. + /// \param theRMin The inside radius + /// \param theRMax The outside radius + /// \param theZ The heigth + GEOMALGOAPI_EXPORT GeomAlgoAPI_Tube(const double theRMin, + const double theRMax, + const double theZ); + + /// Checks if data for the torus construction is OK. + GEOMALGOAPI_EXPORT bool check(); + + /// Builds the torus. + GEOMALGOAPI_EXPORT void build(); + +private: + /// Builds the the tube with the inside radius, the outside radius and the height. + void buildTube(); + + double myRMin; /// inside radius to create a tube. + double myRMax; /// outside radius to create a tube. + double myZ; /// height to create a tube. +}; + +#endif // GEOMALGOAPI_TUBE_H_ diff --git a/src/PrimitivesAPI/CMakeLists.txt b/src/PrimitivesAPI/CMakeLists.txt index 507b54c45..e6df736f5 100644 --- a/src/PrimitivesAPI/CMakeLists.txt +++ b/src/PrimitivesAPI/CMakeLists.txt @@ -26,6 +26,7 @@ SET(PROJECT_HEADERS PrimitivesAPI_Cylinder.h PrimitivesAPI_Sphere.h PrimitivesAPI_Torus.h + PrimitivesAPI_Tube.h ) SET(PROJECT_SOURCES @@ -34,6 +35,7 @@ SET(PROJECT_SOURCES PrimitivesAPI_Cylinder.cpp PrimitivesAPI_Sphere.cpp PrimitivesAPI_Torus.cpp + PrimitivesAPI_Tube.cpp ) SET(PROJECT_LIBRARIES diff --git a/src/PrimitivesAPI/PrimitivesAPI.i b/src/PrimitivesAPI/PrimitivesAPI.i index 5fa74c454..3e6dc3521 100644 --- a/src/PrimitivesAPI/PrimitivesAPI.i +++ b/src/PrimitivesAPI/PrimitivesAPI.i @@ -43,6 +43,7 @@ %shared_ptr(PrimitivesAPI_Cylinder) %shared_ptr(PrimitivesAPI_Sphere) %shared_ptr(PrimitivesAPI_Torus) +%shared_ptr(PrimitivesAPI_Tube) // all supported interfaces %include "PrimitivesAPI_Box.h" @@ -50,3 +51,4 @@ %include "PrimitivesAPI_Cylinder.h" %include "PrimitivesAPI_Sphere.h" %include "PrimitivesAPI_Torus.h" +%include "PrimitivesAPI_Tube.h" diff --git a/src/PrimitivesAPI/PrimitivesAPI_Box.cpp b/src/PrimitivesAPI/PrimitivesAPI_Box.cpp index 04b73f6ee..67fbe3396 100644 --- a/src/PrimitivesAPI/PrimitivesAPI_Box.cpp +++ b/src/PrimitivesAPI/PrimitivesAPI_Box.cpp @@ -50,6 +50,29 @@ PrimitivesAPI_Box::PrimitivesAPI_Box(const std::shared_ptr& th setPoints(theFirstPoint, theSecondPoint); } +//================================================================================================== +PrimitivesAPI_Box::PrimitivesAPI_Box(const std::shared_ptr& theFeature, + const ModelHighAPI_Double& theOx, + const ModelHighAPI_Double& theOy, + const ModelHighAPI_Double& theOz, + const ModelHighAPI_Double& theHalfX, + const ModelHighAPI_Double& theHalfY, + const ModelHighAPI_Double& theHalfZ) +: ModelHighAPI_Interface(theFeature) +{ + if (initialize()) + { + fillAttribute(PrimitivesPlugin_Box::CREATION_METHOD_BY_ONE_POINT_AND_DIMS(), creationMethod()); + fillAttribute(theOx, ox()); + fillAttribute(theOy, oy()); + fillAttribute(theOz, oz()); + fillAttribute(theHalfX, halfdx()); + fillAttribute(theHalfY, halfdy()); + fillAttribute(theHalfZ, halfdz()); + execute(); + } +} + //================================================================================================== PrimitivesAPI_Box::~PrimitivesAPI_Box() { @@ -80,6 +103,30 @@ void PrimitivesAPI_Box::setPoints(const ModelHighAPI_Selection& theFirstPoint, execute(); } +//================================================================================================== +void PrimitivesAPI_Box::setOrigin(const ModelHighAPI_Double& theOx, + const ModelHighAPI_Double& theOy, + const ModelHighAPI_Double& theOz) +{ + fillAttribute(theOx, ox()); + fillAttribute(theOy, oy()); + fillAttribute(theOz, oz()); + + execute(); +} + +//================================================================================================== +void PrimitivesAPI_Box::setHalfLengths(const ModelHighAPI_Double& theHalfLengthX, + const ModelHighAPI_Double& theHalfLengthY, + const ModelHighAPI_Double& theHalfLengthZ) +{ + fillAttribute(theHalfLengthX, halfdx()); + fillAttribute(theHalfLengthY, halfdy()); + fillAttribute(theHalfLengthZ, halfdz()); + + execute(); +} + //================================================================================================== void PrimitivesAPI_Box::dump(ModelHighAPI_Dumper& theDumper) const { @@ -101,6 +148,16 @@ void PrimitivesAPI_Box::dump(ModelHighAPI_Dumper& theDumper) const AttributeSelectionPtr anAttrSecondPnt = aBase->selection(PrimitivesPlugin_Box::POINT_SECOND_ID()); theDumper << ", " << anAttrFirstPnt << ", " << anAttrSecondPnt; + } else if (aCreationMethod == PrimitivesPlugin_Box::CREATION_METHOD_BY_ONE_POINT_AND_DIMS()) { + AttributeDoublePtr anAttrOx = aBase->real(PrimitivesPlugin_Box::OX_ID()); + AttributeDoublePtr anAttrOy = aBase->real(PrimitivesPlugin_Box::OY_ID()); + AttributeDoublePtr anAttrOz = aBase->real(PrimitivesPlugin_Box::OZ_ID()); + AttributeDoublePtr anAttrHalfLengthX = aBase->real(PrimitivesPlugin_Box::HALF_DX_ID()); + AttributeDoublePtr anAttrHalfLengthY = aBase->real(PrimitivesPlugin_Box::HALF_DY_ID()); + AttributeDoublePtr anAttrHalfLengthZ = aBase->real(PrimitivesPlugin_Box::HALF_DZ_ID()); + theDumper << ", " << anAttrOx << ", " << anAttrOy << ", " << anAttrOz; + theDumper << ", " << anAttrHalfLengthX << ", " << anAttrHalfLengthY; + theDumper << ", " << anAttrHalfLengthZ; } theDumper << ")" << std::endl; @@ -123,4 +180,18 @@ BoxPtr addBox(const std::shared_ptr& thePart, { std::shared_ptr aFeature = thePart->addFeature(PrimitivesAPI_Box::ID()); return BoxPtr(new PrimitivesAPI_Box(aFeature, theFirstPoint, theSecondPoint)); -} \ No newline at end of file +} + +//================================================================================================== +BoxPtr addBox(const std::shared_ptr& thePart, + const ModelHighAPI_Double& theOx, + const ModelHighAPI_Double& theOy, + const ModelHighAPI_Double& theOz, + const ModelHighAPI_Double& theHalfLengthX, + const ModelHighAPI_Double& theHalfLengthY, + const ModelHighAPI_Double& theHalfLengthZ) +{ + std::shared_ptr aFeature = thePart->addFeature(PrimitivesAPI_Box::ID()); + return BoxPtr(new PrimitivesAPI_Box(aFeature, theOx, theOy, theOz, theHalfLengthX, + theHalfLengthY, theHalfLengthZ)); +} diff --git a/src/PrimitivesAPI/PrimitivesAPI_Box.h b/src/PrimitivesAPI/PrimitivesAPI_Box.h index 2fda32494..33b412bea 100644 --- a/src/PrimitivesAPI/PrimitivesAPI_Box.h +++ b/src/PrimitivesAPI/PrimitivesAPI_Box.h @@ -53,11 +53,21 @@ public: const ModelHighAPI_Selection& theFirstPoint, const ModelHighAPI_Selection& theSecondPoint); + /// Constructor with values. + PRIMITIVESAPI_EXPORT + explicit PrimitivesAPI_Box(const std::shared_ptr& theFeature, + const ModelHighAPI_Double& theOx, + const ModelHighAPI_Double& theOy, + const ModelHighAPI_Double& theOz, + const ModelHighAPI_Double& theHalfX, + const ModelHighAPI_Double& theHalfY, + const ModelHighAPI_Double& theHalfZ); + /// Destructor. PRIMITIVESAPI_EXPORT virtual ~PrimitivesAPI_Box(); - INTERFACE_6(PrimitivesPlugin_Box::ID(), + INTERFACE_12(PrimitivesPlugin_Box::ID(), creationMethod, PrimitivesPlugin_Box::CREATION_METHOD(), ModelAPI_AttributeString, /** Creation method */, dx, PrimitivesPlugin_Box::DX_ID(), @@ -69,7 +79,19 @@ public: firstPoint, PrimitivesPlugin_Box::POINT_FIRST_ID(), ModelAPI_AttributeSelection, /** First point */, secondPoint, PrimitivesPlugin_Box::POINT_SECOND_ID(), - ModelAPI_AttributeSelection, /** Second point */) + ModelAPI_AttributeSelection, /** Second point */, + ox, PrimitivesPlugin_Box::OX_ID(), + ModelAPI_AttributeDouble, /** X coordinate for origin*/, + oy, PrimitivesPlugin_Box::OY_ID(), + ModelAPI_AttributeDouble, /** Y coordinate for origin*/, + oz, PrimitivesPlugin_Box::OZ_ID(), + ModelAPI_AttributeDouble, /** Z coordinate for origin*/, + halfdx, PrimitivesPlugin_Box::HALF_DX_ID(), + ModelAPI_AttributeDouble, /** Half length in X*/, + halfdy, PrimitivesPlugin_Box::HALF_DY_ID(), + ModelAPI_AttributeDouble, /** Half length in Y*/, + halfdz, PrimitivesPlugin_Box::HALF_DZ_ID(), + ModelAPI_AttributeDouble, /** Half length in Z*/) /// Set dimensions PRIMITIVESAPI_EXPORT @@ -82,6 +104,18 @@ public: void setPoints(const ModelHighAPI_Selection& theFirstPoint, const ModelHighAPI_Selection& theSecondPoint); + /// Set origin point + PRIMITIVESAPI_EXPORT + void setOrigin(const ModelHighAPI_Double& theOx, + const ModelHighAPI_Double& theOy, + const ModelHighAPI_Double& theOz); + + /// Set half lengths + PRIMITIVESAPI_EXPORT + void setHalfLengths(const ModelHighAPI_Double& theHalfLengthX, + const ModelHighAPI_Double& theHalfLengthY, + const ModelHighAPI_Double& theHalfLengthZ); + /// Dump wrapped feature PRIMITIVESAPI_EXPORT virtual void dump(ModelHighAPI_Dumper& theDumper) const; @@ -105,4 +139,15 @@ BoxPtr addBox(const std::shared_ptr& thePart, const ModelHighAPI_Selection& theFirstPoint, const ModelHighAPI_Selection& theSecondPoint); -#endif // PRIMITIVESAPI_BOX_H_ \ No newline at end of file +/// \ingroup CPPHighAPI +/// \brief Create primitive Box feature. +PRIMITIVESAPI_EXPORT +BoxPtr addBox(const std::shared_ptr& thePart, + const ModelHighAPI_Double& theOx, + const ModelHighAPI_Double& theOy, + const ModelHighAPI_Double& theOz, + const ModelHighAPI_Double& theHalfLengthX, + const ModelHighAPI_Double& theHalfLengthY, + const ModelHighAPI_Double& theHalfLengthZ); + +#endif // PRIMITIVESAPI_BOX_H_ diff --git a/src/PrimitivesAPI/PrimitivesAPI_Sphere.cpp b/src/PrimitivesAPI/PrimitivesAPI_Sphere.cpp index 4b3b594ad..20e9cbd1c 100644 --- a/src/PrimitivesAPI/PrimitivesAPI_Sphere.cpp +++ b/src/PrimitivesAPI/PrimitivesAPI_Sphere.cpp @@ -41,11 +41,34 @@ PrimitivesAPI_Sphere::PrimitivesAPI_Sphere(const std::shared_ptr& theFeature, + const ModelHighAPI_Double& theRMin, + const ModelHighAPI_Double& theRMax, + const ModelHighAPI_Double& thePhiMin, + const ModelHighAPI_Double& thePhiMax, + const ModelHighAPI_Double& theThetaMin, + const ModelHighAPI_Double& theThetaMax) +: ModelHighAPI_Interface(theFeature) +{ + if (initialize()) { + fillAttribute(PrimitivesPlugin_Sphere::CREATION_METHOD_BY_DIMENSIONS(), creationMethod()); + fillAttribute(theRMin, rmin()); + fillAttribute(theRMax, rmax()); + fillAttribute(thePhiMin, phimin()); + fillAttribute(thePhiMax, phimax()); + fillAttribute(theThetaMin, thetamin()); + fillAttribute(theThetaMax, thetamax()); + execute(); + } +} + //================================================================================================== PrimitivesAPI_Sphere::~PrimitivesAPI_Sphere() { @@ -65,6 +88,33 @@ void PrimitivesAPI_Sphere::setRadius(const ModelHighAPI_Double& theRadius) execute(); } +//================================================================================================== +void PrimitivesAPI_Sphere::setRadius(const ModelHighAPI_Double& theRMin, + const ModelHighAPI_Double& theRMax) +{ + fillAttribute(theRMin, rmin()); + fillAttribute(theRMax, rmax()); + execute(); +} + +//================================================================================================== +void PrimitivesAPI_Sphere::setPhi(const ModelHighAPI_Double& thePhiMin, + const ModelHighAPI_Double& thePhiMax) +{ + fillAttribute(thePhiMin, phimin()); + fillAttribute(thePhiMax, phimax()); + execute(); +} + +//================================================================================================== +void PrimitivesAPI_Sphere::setTheta(const ModelHighAPI_Double& theThetaMin, + const ModelHighAPI_Double& theThetaMax) +{ + fillAttribute(theThetaMin, thetamin()); + fillAttribute(theThetaMax, thetamax()); + execute(); +} + //================================================================================================== void PrimitivesAPI_Sphere::dump(ModelHighAPI_Dumper& theDumper) const { @@ -73,10 +123,24 @@ void PrimitivesAPI_Sphere::dump(ModelHighAPI_Dumper& theDumper) const theDumper << aBase << " = model.addSphere(" << aDocName; - AttributeSelectionPtr anAttrCenterPoint = - aBase->selection(PrimitivesPlugin_Sphere::CENTER_POINT_ID()); - AttributeDoublePtr anAttrRadius = aBase->real(PrimitivesPlugin_Sphere::RADIUS_ID()); - theDumper << ", " << anAttrCenterPoint << ", " << anAttrRadius; + std::string aCreationMethod = aBase->string(PrimitivesPlugin_Sphere::CREATION_METHOD())->value(); + + if(aCreationMethod == PrimitivesPlugin_Sphere::CREATION_METHOD_BY_PT_RADIUS()) { + AttributeSelectionPtr anAttrCenterPoint = + aBase->selection(PrimitivesPlugin_Sphere::CENTER_POINT_ID()); + AttributeDoublePtr anAttrRadius = aBase->real(PrimitivesPlugin_Sphere::RADIUS_ID()); + theDumper << ", " << anAttrCenterPoint << ", " << anAttrRadius; + } else if(aCreationMethod == PrimitivesPlugin_Sphere::CREATION_METHOD_BY_DIMENSIONS()) { + AttributeDoublePtr anAttrRMin = aBase->real(PrimitivesPlugin_Sphere::RMIN_ID()); + AttributeDoublePtr anAttrRMax = aBase->real(PrimitivesPlugin_Sphere::RMAX_ID()); + AttributeDoublePtr anAttrPhiMin = aBase->real(PrimitivesPlugin_Sphere::PHIMIN_ID()); + AttributeDoublePtr anAttrPhiMax = aBase->real(PrimitivesPlugin_Sphere::PHIMAX_ID()); + AttributeDoublePtr anAttrThetaMin = aBase->real(PrimitivesPlugin_Sphere::THETAMIN_ID()); + AttributeDoublePtr anAttrThetaMax = aBase->real(PrimitivesPlugin_Sphere::THETAMAX_ID()); + theDumper << ", " << anAttrRMin << ", " << anAttrRMax; + theDumper << ", " << anAttrPhiMin << ", " << anAttrPhiMax; + theDumper << ", " << anAttrThetaMin << ", " << anAttrThetaMax; + } theDumper << ")" << std::endl; } @@ -98,3 +162,17 @@ SpherePtr addSphere(const std::shared_ptr& thePart, std::shared_ptr aFeature = thePart->addFeature(PrimitivesAPI_Sphere::ID()); return SpherePtr(new PrimitivesAPI_Sphere(aFeature, aCenterPoint, theRadius)); } + +//================================================================================================== +SpherePtr addSphere(const std::shared_ptr& thePart, + const ModelHighAPI_Double& theRMin, + const ModelHighAPI_Double& theRMax, + const ModelHighAPI_Double& thePhiMin, + const ModelHighAPI_Double& thePhiMax, + const ModelHighAPI_Double& theThetaMin, + const ModelHighAPI_Double& theThetaMax) +{ + std::shared_ptr aFeature = thePart->addFeature(PrimitivesAPI_Sphere::ID()); + return SpherePtr(new PrimitivesAPI_Sphere(aFeature, theRMin, theRMax, thePhiMin, thePhiMax, + theThetaMin, theThetaMax)); +} diff --git a/src/PrimitivesAPI/PrimitivesAPI_Sphere.h b/src/PrimitivesAPI/PrimitivesAPI_Sphere.h index 68e0ca5df..3c4691a46 100644 --- a/src/PrimitivesAPI/PrimitivesAPI_Sphere.h +++ b/src/PrimitivesAPI/PrimitivesAPI_Sphere.h @@ -50,15 +50,39 @@ public: const ModelHighAPI_Selection& theCenterPoint, const ModelHighAPI_Double& theRadius); + /// Constructor with values. + PRIMITIVESAPI_EXPORT + explicit PrimitivesAPI_Sphere(const std::shared_ptr& theFeature, + const ModelHighAPI_Double& theRMin, + const ModelHighAPI_Double& theRMax, + const ModelHighAPI_Double& thePhiMin, + const ModelHighAPI_Double& thePhiMax, + const ModelHighAPI_Double& theThetaMin, + const ModelHighAPI_Double& theThetaMax); + /// Destructor. PRIMITIVESAPI_EXPORT virtual ~PrimitivesAPI_Sphere(); - INTERFACE_2(PrimitivesPlugin_Sphere::ID(), + INTERFACE_9(PrimitivesPlugin_Sphere::ID(), + creationMethod, PrimitivesPlugin_Sphere::CREATION_METHOD(), + ModelAPI_AttributeString, /** Creation method */, centerPoint, PrimitivesPlugin_Sphere::CENTER_POINT_ID(), ModelAPI_AttributeSelection, /** Center point */, radius, PrimitivesPlugin_Sphere::RADIUS_ID(), - ModelAPI_AttributeDouble, /** Radius */) + ModelAPI_AttributeDouble, /** Radius */, + rmin, PrimitivesPlugin_Sphere::RMIN_ID(), + ModelAPI_AttributeDouble, /** The minimum radius*/, + rmax, PrimitivesPlugin_Sphere::RMAX_ID(), + ModelAPI_AttributeDouble, /** The maximum radius*/, + phimin, PrimitivesPlugin_Sphere::PHIMIN_ID(), + ModelAPI_AttributeDouble, /** The minimum phi*/, + phimax, PrimitivesPlugin_Sphere::PHIMAX_ID(), + ModelAPI_AttributeDouble, /** The maximum phi*/, + thetamin, PrimitivesPlugin_Sphere::THETAMIN_ID(), + ModelAPI_AttributeDouble, /** The minimum theta*/, + thetamax,PrimitivesPlugin_Sphere::THETAMAX_ID(), + ModelAPI_AttributeDouble, /** The maximum theta*/) /// Set center point PRIMITIVESAPI_EXPORT @@ -68,6 +92,18 @@ public: PRIMITIVESAPI_EXPORT void setRadius(const ModelHighAPI_Double& theRadius); + /// Set minimum and maximum radius + PRIMITIVESAPI_EXPORT + void setRadius(const ModelHighAPI_Double& theRMin, const ModelHighAPI_Double& theRMax); + + /// Set minimum and maximum phi + PRIMITIVESAPI_EXPORT + void setPhi(const ModelHighAPI_Double& thePhiMin, const ModelHighAPI_Double& thePhiMax); + + /// Set minimum and maximum theta + PRIMITIVESAPI_EXPORT + void setTheta(const ModelHighAPI_Double& theThetaMin, const ModelHighAPI_Double& theThetaMax); + /// Dump wrapped feature PRIMITIVESAPI_EXPORT virtual void dump(ModelHighAPI_Dumper& theDumper) const; @@ -89,4 +125,15 @@ PRIMITIVESAPI_EXPORT SpherePtr addSphere(const std::shared_ptr& thePart, const ModelHighAPI_Double& theRadius); +/// \ingroup CPPHighAPI +/// \brief Create primitive Sphere feature. +PRIMITIVESAPI_EXPORT +SpherePtr addSphere(const std::shared_ptr& thePart, + const ModelHighAPI_Double& theRMin, + const ModelHighAPI_Double& theRMax, + const ModelHighAPI_Double& thePhiMin, + const ModelHighAPI_Double& thePhiMax, + const ModelHighAPI_Double& theThetaMin, + const ModelHighAPI_Double& theThetaMax); + #endif // PRIMITIVESAPI_SPHERE_H_ diff --git a/src/PrimitivesAPI/PrimitivesAPI_Torus.h b/src/PrimitivesAPI/PrimitivesAPI_Torus.h index b460da826..9a65372a1 100644 --- a/src/PrimitivesAPI/PrimitivesAPI_Torus.h +++ b/src/PrimitivesAPI/PrimitivesAPI_Torus.h @@ -36,7 +36,7 @@ class ModelHighAPI_Selection; /// \class PrimitivesAPI_Torus /// \ingroup CPPHighAPI -/// \brief Interface for primitive Cone feature. +/// \brief Interface for primitive Torus feature. class PrimitivesAPI_Torus: public ModelHighAPI_Interface { public: @@ -76,11 +76,11 @@ public: virtual void dump(ModelHighAPI_Dumper& theDumper) const; }; -/// Pointer on primitive Cone object +/// Pointer on primitive Torus object typedef std::shared_ptr TorusPtr; /// \ingroup CPPHighAPI -/// \brief Create primitive Cone feature. +/// \brief Create primitive Torus feature. PRIMITIVESAPI_EXPORT TorusPtr addTorus(const std::shared_ptr& thePart, const ModelHighAPI_Selection& theBasePoint, @@ -89,7 +89,7 @@ TorusPtr addTorus(const std::shared_ptr& thePart, const ModelHighAPI_Double& theRingRadius); /// \ingroup CPPHighAPI -/// \brief Create primitive Cone feature. +/// \brief Create primitive Torus feature. PRIMITIVESAPI_EXPORT TorusPtr addTorus(const std::shared_ptr& thePart, const ModelHighAPI_Double& theRadius, diff --git a/src/PrimitivesAPI/PrimitivesAPI_Tube.cpp b/src/PrimitivesAPI/PrimitivesAPI_Tube.cpp new file mode 100644 index 000000000..8bdd639f5 --- /dev/null +++ b/src/PrimitivesAPI/PrimitivesAPI_Tube.cpp @@ -0,0 +1,91 @@ +// Copyright (C) 2017-2021 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 +// + +#include "PrimitivesAPI_Tube.h" + +#include +#include + +//================================================================================================== +PrimitivesAPI_Tube::PrimitivesAPI_Tube(const std::shared_ptr& theFeature) +: ModelHighAPI_Interface(theFeature) +{ + initialize(); +} + +//================================================================================================== +PrimitivesAPI_Tube::PrimitivesAPI_Tube(const std::shared_ptr& theFeature, + const ModelHighAPI_Double& theRMin, + const ModelHighAPI_Double& theRMax, + const ModelHighAPI_Double& theHeight) +: ModelHighAPI_Interface(theFeature) +{ + if (initialize()) { + fillAttribute(theRMin, rmin()); + fillAttribute(theRMax, rmax()); + setHeight(theHeight); + } +} + +//================================================================================================== +PrimitivesAPI_Tube::~PrimitivesAPI_Tube() +{ +} + +//================================================================================================== +void PrimitivesAPI_Tube::setRadius(const ModelHighAPI_Double& theRMin, + const ModelHighAPI_Double& theRMax) +{ + fillAttribute(theRMin, rmin()); + fillAttribute(theRMax, rmax()); + execute(); +} + +//================================================================================================== +void PrimitivesAPI_Tube::setHeight(const ModelHighAPI_Double& theHeight) +{ + fillAttribute(theHeight, height()); + execute(); +} + +//================================================================================================== +void PrimitivesAPI_Tube::dump(ModelHighAPI_Dumper& theDumper) const +{ + FeaturePtr aBase = feature(); + const std::string& aDocName = theDumper.name(aBase->document()); + + theDumper << aBase << " = model.addTube(" << aDocName; + + AttributeDoublePtr anAttrRMin = aBase->real(PrimitivesPlugin_Tube::RMIN_ID()); + AttributeDoublePtr anAttrRMax = aBase->real(PrimitivesPlugin_Tube::RMAX_ID()); + AttributeDoublePtr anAttrHeight = aBase->real(PrimitivesPlugin_Tube::HEIGHT_ID()); + theDumper << ", " << anAttrRMin << ", " << anAttrRMax << ", " << anAttrHeight; + + theDumper << ")" << std::endl; +} + +//================================================================================================== +TubePtr addTube(const std::shared_ptr& thePart, + const ModelHighAPI_Double& theRMin, + const ModelHighAPI_Double& theRMax, + const ModelHighAPI_Double& theHeight) +{ + std::shared_ptr aFeature = thePart->addFeature(PrimitivesAPI_Tube::ID()); + return TubePtr(new PrimitivesAPI_Tube(aFeature, theRMin, theRMax, theHeight)); +} diff --git a/src/PrimitivesAPI/PrimitivesAPI_Tube.h b/src/PrimitivesAPI/PrimitivesAPI_Tube.h new file mode 100644 index 000000000..dd582b18f --- /dev/null +++ b/src/PrimitivesAPI/PrimitivesAPI_Tube.h @@ -0,0 +1,86 @@ +// Copyright (C) 2017-2021 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 +// + +#ifndef PRIMITIVESAPI_TUBE_H_ +#define PRIMITIVESAPI_TUBE_H_ + +#include "PrimitivesAPI.h" + +#include + +#include +#include +#include + + +/// \class PrimitivesAPI_Tube +/// \ingroup CPPHighAPI +/// \brief Interface for primitive Tube feature. +class PrimitivesAPI_Tube: public ModelHighAPI_Interface +{ +public: + /// Constructor without values. + PRIMITIVESAPI_EXPORT + explicit PrimitivesAPI_Tube(const std::shared_ptr& theFeature); + + /// Constructor with values. + PRIMITIVESAPI_EXPORT + explicit PrimitivesAPI_Tube(const std::shared_ptr& theFeature, + const ModelHighAPI_Double& theRMin, + const ModelHighAPI_Double& theRMax, + const ModelHighAPI_Double& theHeight); + + /// Destructor. + PRIMITIVESAPI_EXPORT + virtual ~PrimitivesAPI_Tube(); + + INTERFACE_3(PrimitivesPlugin_Tube::ID(), + rmin, PrimitivesPlugin_Tube::RMIN_ID(), + ModelAPI_AttributeDouble, /** Inner radius */, + rmax, PrimitivesPlugin_Tube::RMAX_ID(), + ModelAPI_AttributeDouble, /** Outer radius */, + height, PrimitivesPlugin_Tube::HEIGHT_ID(), + ModelAPI_AttributeDouble, /** Height */) + + /// Set radius + PRIMITIVESAPI_EXPORT + void setRadius(const ModelHighAPI_Double& theRMin, + const ModelHighAPI_Double& theRMax); + + /// Set height + PRIMITIVESAPI_EXPORT + void setHeight(const ModelHighAPI_Double& theHeight); + + /// Dump wrapped feature + PRIMITIVESAPI_EXPORT + virtual void dump(ModelHighAPI_Dumper& theDumper) const; +}; + +/// Pointer on primitive Tube object +typedef std::shared_ptr TubePtr; + +/// \ingroup CPPHighAPI +/// \brief Create primitive Tube feature. +PRIMITIVESAPI_EXPORT +TubePtr addTube(const std::shared_ptr& thePart, + const ModelHighAPI_Double& theRMin, + const ModelHighAPI_Double& theRMax, + const ModelHighAPI_Double& theHeight); + +#endif // PRIMITIVESAPI_TUBE_H_ diff --git a/src/PrimitivesAPI/PrimitivesAPI_swig.h b/src/PrimitivesAPI/PrimitivesAPI_swig.h index 21934d3a0..7473a911b 100644 --- a/src/PrimitivesAPI/PrimitivesAPI_swig.h +++ b/src/PrimitivesAPI/PrimitivesAPI_swig.h @@ -28,5 +28,6 @@ #include "PrimitivesAPI_Cylinder.h" #include "PrimitivesAPI_Sphere.h" #include "PrimitivesAPI_Torus.h" + #include "PrimitivesAPI_Tube.h" #endif // PRIMITIVESAPI_SWIG_H_ diff --git a/src/PrimitivesPlugin/CMakeLists.txt b/src/PrimitivesPlugin/CMakeLists.txt index 4504f17ee..9c0272d14 100644 --- a/src/PrimitivesPlugin/CMakeLists.txt +++ b/src/PrimitivesPlugin/CMakeLists.txt @@ -25,6 +25,7 @@ SET(PROJECT_HEADERS PrimitivesPlugin_Cylinder.h PrimitivesPlugin_Sphere.h PrimitivesPlugin_Torus.h + PrimitivesPlugin_Tube.h ) SET(PROJECT_SOURCES @@ -34,6 +35,7 @@ SET(PROJECT_SOURCES PrimitivesPlugin_Cylinder.cpp PrimitivesPlugin_Sphere.cpp PrimitivesPlugin_Torus.cpp + PrimitivesPlugin_Tube.cpp ) SET(XML_RESOURCES @@ -43,6 +45,7 @@ SET(XML_RESOURCES cylinder_widget.xml sphere_widget.xml torus_widget.xml + tube_widget.xml ) SET(TEXT_RESOURCES diff --git a/src/PrimitivesPlugin/PrimitivesPlugin_Box.cpp b/src/PrimitivesPlugin/PrimitivesPlugin_Box.cpp index 30caf171d..feea6763d 100644 --- a/src/PrimitivesPlugin/PrimitivesPlugin_Box.cpp +++ b/src/PrimitivesPlugin/PrimitivesPlugin_Box.cpp @@ -40,14 +40,24 @@ 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 252cf52f3..6d2b64095 100644 --- a/src/PrimitivesPlugin/PrimitivesPlugin_Box.h +++ b/src/PrimitivesPlugin/PrimitivesPlugin_Box.h @@ -31,8 +31,9 @@ class ModelAPI_ResultBody; * \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 + * Box creates a cuboid - Parallelepiped with 6 rectangular faces. It can be built via three + * methods : using two points that define a diagonal, a point that define a center and 3 lengths + * that define the half-lengths on X, Y and Z-axes, or using 3 lengths that define the * rectangular dimensions. */ class PrimitivesPlugin_Box : public ModelAPI_Feature @@ -66,6 +67,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() { @@ -101,6 +109,48 @@ class PrimitivesPlugin_Box : public ModelAPI_Feature return MY_DZ_ID; } + /// Attribute name of the first coordinate of the center + inline static const std::string& OX_ID() + { + static const std::string MY_OX_ID("ox"); + return MY_OX_ID; + } + + /// Attribute name of the second coordinate of the center + inline static const std::string& OY_ID() + { + static const std::string MY_OY_ID("oy"); + return MY_OY_ID; + } + + /// Attribute name of the third coordinate of the center + 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 on X axis + 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 on Y axis + 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 on Z axis + 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() { @@ -128,6 +178,9 @@ class PrimitivesPlugin_Box : public ModelAPI_Feature ///Perform the creation of the box using three cordinates void createBoxByDimensions(); + ///Perform the creation of the box using a center and three half-lenths + void createBoxByOnePointAndDims(); + }; diff --git a/src/PrimitivesPlugin/PrimitivesPlugin_Plugin.cpp b/src/PrimitivesPlugin/PrimitivesPlugin_Plugin.cpp index 876f4dd9a..5a2481133 100644 --- a/src/PrimitivesPlugin/PrimitivesPlugin_Plugin.cpp +++ b/src/PrimitivesPlugin/PrimitivesPlugin_Plugin.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include @@ -52,6 +53,8 @@ FeaturePtr PrimitivesPlugin_Plugin::createFeature(std::string theFeatureID) return FeaturePtr(new PrimitivesPlugin_Sphere); } else if (theFeatureID == PrimitivesPlugin_Torus::ID()) { return FeaturePtr(new PrimitivesPlugin_Torus); + } else if (theFeatureID == PrimitivesPlugin_Tube::ID()) { + return FeaturePtr(new PrimitivesPlugin_Tube); } // feature of such kind is not found return FeaturePtr(); diff --git a/src/PrimitivesPlugin/PrimitivesPlugin_Sphere.cpp b/src/PrimitivesPlugin/PrimitivesPlugin_Sphere.cpp index 00ca224b0..f6da4b6cb 100644 --- a/src/PrimitivesPlugin/PrimitivesPlugin_Sphere.cpp +++ b/src/PrimitivesPlugin/PrimitivesPlugin_Sphere.cpp @@ -17,7 +17,7 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// File: PrimitivesPlugin_Sphere.h +// File: PrimitivesPlugin_Sphere.cpp // Created: 15 Mar 2017 // Author: Clarisse Genrault (CEA) @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -43,6 +44,10 @@ PrimitivesPlugin_Sphere::PrimitivesPlugin_Sphere() //================================================================================================= void PrimitivesPlugin_Sphere::initAttributes() { + data()->addAttribute(PrimitivesPlugin_Sphere::CREATION_METHOD(), + ModelAPI_AttributeString::typeId()); + + // data for the first mode : by a point and a radius data()->addAttribute(PrimitivesPlugin_Sphere::CENTER_POINT_ID(), ModelAPI_AttributeSelection::typeId()); @@ -60,10 +65,32 @@ void PrimitivesPlugin_Sphere::initAttributes() aCenterPoint->setValue(aPointRes, std::shared_ptr()); } } + + // data for the second mode : by dimensions + data()->addAttribute(PrimitivesPlugin_Sphere::RMIN_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(PrimitivesPlugin_Sphere::RMAX_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(PrimitivesPlugin_Sphere::PHIMIN_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(PrimitivesPlugin_Sphere::PHIMAX_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(PrimitivesPlugin_Sphere::THETAMIN_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(PrimitivesPlugin_Sphere::THETAMAX_ID(), ModelAPI_AttributeDouble::typeId()); } //================================================================================================= void PrimitivesPlugin_Sphere::execute() +{ + AttributeStringPtr aMethodTypeAttr = string(PrimitivesPlugin_Sphere::CREATION_METHOD()); + std::string aMethodType = aMethodTypeAttr->value(); + + if (aMethodType == CREATION_METHOD_BY_PT_RADIUS()) + createSphereByPtRadius(); + + if (aMethodType == CREATION_METHOD_BY_DIMENSIONS()) + createShereByDimensions(); +} + + +//================================================================================================= +void PrimitivesPlugin_Sphere::createSphereByPtRadius() { // Getting point. std::shared_ptr aCenterPoint; @@ -95,7 +122,7 @@ void PrimitivesPlugin_Sphere::execute() // Build the sphere aSphereAlgo->build(); - // Check if the creation of the cylinder + // Check if the creation of the sphere is OK if(!aSphereAlgo->isDone()) { setError(aSphereAlgo->getError()); return; @@ -111,6 +138,48 @@ void PrimitivesPlugin_Sphere::execute() setResult(aResultBox, aResultIndex); } +//================================================================================================= +void PrimitivesPlugin_Sphere::createShereByDimensions() +{ + // Getting rmin, rmax, phimin, phimax, thetamin et thetamax + double aRMin = real(PrimitivesPlugin_Sphere::RMIN_ID())->value(); + double aRMax = real(PrimitivesPlugin_Sphere::RMAX_ID())->value(); + double aPhiMin = real(PrimitivesPlugin_Sphere::PHIMIN_ID())->value(); + double aPhiMax = real(PrimitivesPlugin_Sphere::PHIMAX_ID())->value(); + double aThetaMin = real(PrimitivesPlugin_Sphere::THETAMIN_ID())->value(); + double aThetaMax = real(PrimitivesPlugin_Sphere::THETAMAX_ID())->value(); + + std::shared_ptr aSphereAlgo = std::shared_ptr( + new GeomAlgoAPI_Sphere(aRMin, aRMax, aPhiMin, aPhiMax, aThetaMin, aThetaMax)); + + // These checks should be made to the GUI for the feature but + // the corresponding validator does not exist yet. + if (!aSphereAlgo->check()) { + setError(aSphereAlgo->getError()); + return; + } + + // Build the sphere + aSphereAlgo->build(); + + // Check if the creation of the sphere is OK + if(!aSphereAlgo->isDone()) { + // The error is not displayed in a popup window. It must be in the message console. + setError(aSphereAlgo->getError()); + return; + } + if(!aSphereAlgo->checkValid("Sphere Builder")) { + // The error is not displayed in a popup window. It must be in the message console. + setError(aSphereAlgo->getError()); + return; + } + + int aResultIndex = 0; + ResultBodyPtr aResultBox = document()->createBody(data(), aResultIndex); + loadNamingDS(aSphereAlgo, aResultBox); + setResult(aResultBox, aResultIndex); +} + //================================================================================================= void PrimitivesPlugin_Sphere::loadNamingDS(std::shared_ptr theSphereAlgo, std::shared_ptr theResultSphere) diff --git a/src/PrimitivesPlugin/PrimitivesPlugin_Sphere.h b/src/PrimitivesPlugin/PrimitivesPlugin_Sphere.h index 2f00e989e..2e54765cd 100644 --- a/src/PrimitivesPlugin/PrimitivesPlugin_Sphere.h +++ b/src/PrimitivesPlugin/PrimitivesPlugin_Sphere.h @@ -30,9 +30,10 @@ /**\class PrimitivesPlugin_Sphere * \ingroup Plugins - * \brief Feature for creation of a sphere. + * \brief Feature for creation of a sphere primitive using various methods. * - * Creates a sphere from a radius and a center point defaulting to the origin + * It can be built via two methods : using a radius and a center point defaulting to the origin, + * or radii (inner and outer) and angle limits (theta and phi). */ class PrimitivesPlugin_Sphere : public ModelAPI_Feature { @@ -44,6 +45,27 @@ class PrimitivesPlugin_Sphere : public ModelAPI_Feature return MY_SPHERE_ID; } + /// Attribute name for creation method + inline static const std::string& CREATION_METHOD() + { + static const std::string MY_CREATION_METHOD_ID("CreationMethod"); + return MY_CREATION_METHOD_ID; + } + + /// Attribute name for creation method + inline static const std::string& CREATION_METHOD_BY_PT_RADIUS() + { + static const std::string MY_CREATION_METHOD_ID("SphereByPointRadius"); + return MY_CREATION_METHOD_ID; + } + + /// Attribute name for creation method + inline static const std::string& CREATION_METHOD_BY_DIMENSIONS() + { + static const std::string MY_CREATION_METHOD_ID("SphereByDimensions"); + return MY_CREATION_METHOD_ID; + } + /// Attribute name of the base point inline static const std::string& CENTER_POINT_ID() { @@ -58,6 +80,48 @@ class PrimitivesPlugin_Sphere : public ModelAPI_Feature return MY_RADIUS_ID; } + /// attribute name of the inner radius + inline static const std::string& RMIN_ID() + { + static const std::string MY_RMIN_ID("rmin"); + return MY_RMIN_ID; + } + + /// attribute name of the outer radius + inline static const std::string& RMAX_ID() + { + static const std::string MY_RMAX_ID("rmax"); + return MY_RMAX_ID; + } + + /// attribute name of the lower phi limit + inline static const std::string& PHIMIN_ID() + { + static const std::string MY_PHIMIN_ID("phimin"); + return MY_PHIMIN_ID; + } + + /// attribute name of the higher phi limit + inline static const std::string& PHIMAX_ID() + { + static const std::string MY_PHIMAX_ID("phimax"); + return MY_PHIMAX_ID; + } + + /// attribute name of the lower theta limit + inline static const std::string& THETAMIN_ID() + { + static const std::string MY_THETAMIN_ID("thetamin"); + return MY_THETAMIN_ID; + } + + /// attribute name of the higher theta limit + inline static const std::string& THETAMAX_ID() + { + static const std::string MY_THETAMAX_ID("thetamax"); + return MY_THETAMAX_ID; + } + /// Returns the kind of a feature PRIMITIVESPLUGIN_EXPORT virtual const std::string& getKind() { @@ -79,6 +143,13 @@ class PrimitivesPlugin_Sphere : public ModelAPI_Feature void loadNamingDS(std::shared_ptr theSphereAlgo, std::shared_ptr theResultSphere); + /// Perform the creation of the sphere using a point and a radius + void createSphereByPtRadius(); + + /// Perform the creation of the sphere using radii (inner and outer) and angle limits + /// (theta and phi) + void createShereByDimensions(); + }; #endif // PRIMITIVESPLUGIN_SPHERE_H_ diff --git a/src/PrimitivesPlugin/PrimitivesPlugin_Tube.cpp b/src/PrimitivesPlugin/PrimitivesPlugin_Tube.cpp new file mode 100644 index 000000000..d9a90d9ff --- /dev/null +++ b/src/PrimitivesPlugin/PrimitivesPlugin_Tube.cpp @@ -0,0 +1,78 @@ +// 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 +// + +#include + +#include +#include + +//================================================================================================= +PrimitivesPlugin_Tube::PrimitivesPlugin_Tube() // Nothing to do during instantiation +{ +} + +//================================================================================================= +void PrimitivesPlugin_Tube::initAttributes() +{ + data()->addAttribute(PrimitivesPlugin_Tube::RMIN_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(PrimitivesPlugin_Tube::RMAX_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(PrimitivesPlugin_Tube::HEIGHT_ID(), ModelAPI_AttributeDouble::typeId()); +} + +//================================================================================================= +void PrimitivesPlugin_Tube::execute() +{ + double aRMin = real(PrimitivesPlugin_Tube::RMIN_ID())->value(); + double aRMax = real(PrimitivesPlugin_Tube::RMAX_ID())->value(); + double aZ = real(PrimitivesPlugin_Tube::HEIGHT_ID())->value(); + + std::shared_ptr aTubeAlgo(new GeomAlgoAPI_Tube(aRMin,aRMax,aZ)); + + // These checks should be made to the GUI for the feature but + // the corresponding validator does not exist yet. + if (!aTubeAlgo->check()) { + setError(aTubeAlgo->getError()); + return; + } + + // Build the tube + aTubeAlgo->build(); + + int aResultIndex = 0; + ResultBodyPtr aResultTube = document()->createBody(data(), aResultIndex); + loadNamingDS(aTubeAlgo, aResultTube); + setResult(aResultTube, aResultIndex); +} + +//================================================================================================= +void PrimitivesPlugin_Tube::loadNamingDS(std::shared_ptr theTubeAlgo, + std::shared_ptr theResultTube) +{ + // Load the result + theResultTube->store(theTubeAlgo->shape()); + + // Prepare the naming + theTubeAlgo->prepareNamingFaces(); + + // Insert to faces + int num = 1; + std::map< std::string, std::shared_ptr > listOfFaces = + theTubeAlgo->getCreatedFaces(); + for (std::map< std::string, std::shared_ptr >::iterator it = listOfFaces.begin(); + it != listOfFaces.end(); + ++it) + { + theResultTube->generated((*it).second, (*it).first); + } +} diff --git a/src/PrimitivesPlugin/PrimitivesPlugin_Tube.h b/src/PrimitivesPlugin/PrimitivesPlugin_Tube.h new file mode 100644 index 000000000..c3af279e1 --- /dev/null +++ b/src/PrimitivesPlugin/PrimitivesPlugin_Tube.h @@ -0,0 +1,88 @@ +// Copyright (C) 2014-2021 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 +// + +#ifndef PrimitivesPlugin_Tube_H_ +#define PrimitivesPlugin_Tube_H_ + +#include +#include +#include + +/**\class PrimitivesPlugin_Tube + * \ingroup Plugins + * \brief Feature for creation of a tube primitive using various methods. + * + * Tube creates a tuboid - Holed cylinder. It can be built via two methods : + * using an inner raidus, an outer radius and a heigth or radii (inner and outer) + * and angles. + */ +class PrimitivesPlugin_Tube : public ModelAPI_Feature +{ + public: + /// Tube kind + inline static const std::string& ID() + { + static const std::string MY_TUBE_ID("Tube"); + return MY_TUBE_ID; + } + + /// Attrinute name of the inner radius + inline static const std::string& RMIN_ID() + { + static const std::string MY_RMIN_ID("rmin"); + return MY_RMIN_ID; + } + + /// Attrinute name of the outer radius + inline static const std::string& RMAX_ID() + { + static const std::string MY_RMAX_ID("rmax"); + return MY_RMAX_ID; + } + + /// Attrinute name of the height + inline static const std::string& HEIGHT_ID() + { + static const std::string MY_HEIGHT_ID("height"); + return MY_HEIGHT_ID; + } + + /// Returns the kind of a feature + PRIMITIVESPLUGIN_EXPORT virtual const std::string& getKind() + { + static std::string MY_KIND = PrimitivesPlugin_Tube::ID(); + return MY_KIND; + } + + /// Performs the algorithm and stores results it in the data structure + PRIMITIVESPLUGIN_EXPORT virtual void execute(); + + /// Request for initialization of data model of the feature: adding all attributes + PRIMITIVESPLUGIN_EXPORT virtual void initAttributes(); + + /// Use plugin manager for features creation. + PrimitivesPlugin_Tube(); + + private: + /// Load naming data structure of the feature to the document + void loadNamingDS(std::shared_ptr theTubeAlgo, + std::shared_ptr theResultBox); +}; + +#endif diff --git a/src/PrimitivesPlugin/PrimitivesPlugin_msg_fr.ts b/src/PrimitivesPlugin/PrimitivesPlugin_msg_fr.ts index 22d0de57f..a046099c6 100644 --- a/src/PrimitivesPlugin/PrimitivesPlugin_msg_fr.ts +++ b/src/PrimitivesPlugin/PrimitivesPlugin_msg_fr.ts @@ -28,6 +28,10 @@ Torus Tore + + Tube + Tube + @@ -51,6 +55,10 @@ By two points Par deux points + + By one point and dimensions + Par un point et des dimensions + Box:FirstPoint @@ -121,6 +129,72 @@ Dimension en Z + + Box:ox + + OX + OX + + + Enter the coordinate X for the center + Entrez la coodonnée en X du centre + + + + Box:oy + + OY + OY + + + Enter the coordinate Y for the center + Entrez la coodonnée en Y du centre + + + + Box:oz + + OZ + OZ + + + Enter the coordinate Z for the center + Entrez la coodonnée en Z du centre + + + + Box:half_dx + + DX + DX + + + Enter the half length in X + Entrez la demi-longueur en X + + + + Box:half_dy + + DY + DY + + + Enter the half length in Y + Entrez la demi-longueur en Y + + + + Box:half_dz + + DZ + DZ + + + Enter the half length in Z + Entrez la demi-longueur en Z + + Cone @@ -313,6 +387,25 @@ Sphere Sphère + + Dimensions + Dimensions + + + Phi/theta range + Intervalles pour Phi/Theta + + + + Sphere:CreationMethod + + By point and radius + Par un centre et un rayon + + + By dimensions + Par dimensions + Sphere:center_point @@ -340,6 +433,72 @@ Rayon + + Sphere:rmin + + Enter the inner radius + Entrez le rayon interne + + + rmin + Rmin + + + + Sphere:rmax + + Enter the outer radius + Entrez le rayon externe + + + rmax + Rmax + + + + Sphere:phimin + + Enter the azimuthal starting angle + Entrez l'angle azimutal de départ + + + phimin + Phi min + + + + Sphere:phimax + + Enter the azimuthal revolution angle + Entrez l'angle azimutal de révolution + + + phimax + Phi max + + + + Sphere:thetamin + + Enter the polar starting angle + Entrez l'angle polaire de départ + + + thetamin + Theta min + + + + Sphere:thetamax + + Enter the polar revolution angle + Entrez l'angle polaire de révolution + + + thetamax + Theta max + + Torus @@ -405,4 +564,46 @@ + + Tube + + Create a Tube + + Créer un tube + + + + Tube:rmin + + Enter the inner radius + Entrez le rayon interne + + + rmin + rmin + + + + Tube:rmax + + Enter the outer radius + Entrez le rayon externe + + + rmax + rmax + + + + Tube:height + + Enter the height + Entrez la hauteur + + + height + height + + + diff --git a/src/PrimitivesPlugin/box_widget.xml b/src/PrimitivesPlugin/box_widget.xml index f968b5154..23ac51326 100644 --- a/src/PrimitivesPlugin/box_widget.xml +++ b/src/PrimitivesPlugin/box_widget.xml @@ -40,5 +40,56 @@ shape_types="vertex"> + + + + + + + + + + + + + + + + + + + + + diff --git a/src/PrimitivesPlugin/doc/PrimitivesPlugin.rst b/src/PrimitivesPlugin/doc/PrimitivesPlugin.rst index 364373d00..02e0b8702 100644 --- a/src/PrimitivesPlugin/doc/PrimitivesPlugin.rst +++ b/src/PrimitivesPlugin/doc/PrimitivesPlugin.rst @@ -15,3 +15,4 @@ The Primitives plug-in contains features for creation of geometrical primitives. cylinderFeature.rst sphereFeature.rst torusFeature.rst + tubeFeature.rst 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/TUI_coneFeature.rst b/src/PrimitivesPlugin/doc/TUI_coneFeature.rst index aa95fa132..4c5b3ffdc 100644 --- a/src/PrimitivesPlugin/doc/TUI_coneFeature.rst +++ b/src/PrimitivesPlugin/doc/TUI_coneFeature.rst @@ -1,8 +1,8 @@ .. _tui_create_cone: -Create / Cone -============= +Create Cone +=========== .. literalinclude:: examples/cone.py :linenos: diff --git a/src/PrimitivesPlugin/doc/TUI_cylinderFeature.rst b/src/PrimitivesPlugin/doc/TUI_cylinderFeature.rst index dc326819c..bb9030e53 100644 --- a/src/PrimitivesPlugin/doc/TUI_cylinderFeature.rst +++ b/src/PrimitivesPlugin/doc/TUI_cylinderFeature.rst @@ -1,8 +1,8 @@ .. _tui_create_cylinder: -Create cylinder -================ +Create Cylinder +=============== .. literalinclude:: examples/cylinder1.py :linenos: diff --git a/src/PrimitivesPlugin/doc/TUI_cylinderPortion.rst b/src/PrimitivesPlugin/doc/TUI_cylinderPortion.rst index 8d2bad8fb..5014c936d 100644 --- a/src/PrimitivesPlugin/doc/TUI_cylinderPortion.rst +++ b/src/PrimitivesPlugin/doc/TUI_cylinderPortion.rst @@ -1,7 +1,7 @@ .. _tui_create_cylportion: -Create portion of cylinder +Create Portion of cylinder ========================== .. literalinclude:: examples/cylinder2.py diff --git a/src/PrimitivesPlugin/doc/TUI_sphereFeature.rst b/src/PrimitivesPlugin/doc/TUI_sphereFeature.rst index f4012bcce..45a63db54 100644 --- a/src/PrimitivesPlugin/doc/TUI_sphereFeature.rst +++ b/src/PrimitivesPlugin/doc/TUI_sphereFeature.rst @@ -1,12 +1,11 @@ .. _tui_create_sphere: -Create / Sphere -=============== +Create Sphere +============= -.. literalinclude:: examples/sphere.py +.. literalinclude:: examples/sphere1.py :linenos: :language: python -:download:`Download this script ` - +:download:`Download this script ` diff --git a/src/PrimitivesPlugin/doc/TUI_spherePart.rst b/src/PrimitivesPlugin/doc/TUI_spherePart.rst new file mode 100644 index 000000000..56b3447b4 --- /dev/null +++ b/src/PrimitivesPlugin/doc/TUI_spherePart.rst @@ -0,0 +1,11 @@ + + .. _tui_create_part_sphere: + +Create Part of sphere +===================== + +.. literalinclude:: examples/sphere2.py + :linenos: + :language: python + +:download:`Download this script ` diff --git a/src/PrimitivesPlugin/doc/TUI_torusFeature.rst b/src/PrimitivesPlugin/doc/TUI_torusFeature.rst index 5c4a63261..07a422740 100644 --- a/src/PrimitivesPlugin/doc/TUI_torusFeature.rst +++ b/src/PrimitivesPlugin/doc/TUI_torusFeature.rst @@ -1,8 +1,8 @@ .. _tui_create_torus: -Create / Torus -============== +Create Torus +============ .. literalinclude:: examples/torus.py :linenos: diff --git a/src/PrimitivesPlugin/doc/TUI_tubeFeature.rst b/src/PrimitivesPlugin/doc/TUI_tubeFeature.rst new file mode 100644 index 000000000..551c85415 --- /dev/null +++ b/src/PrimitivesPlugin/doc/TUI_tubeFeature.rst @@ -0,0 +1,12 @@ + + .. _tui_create_tube: + +Create Tube +=========== + +.. literalinclude:: examples/tube.py + :linenos: + :language: python + +:download:`Download this script ` + diff --git a/src/PrimitivesPlugin/doc/boxFeature.rst b/src/PrimitivesPlugin/doc/boxFeature.rst index 759fc9eb8..e91466c20 100644 --- a/src/PrimitivesPlugin/doc/boxFeature.rst +++ b/src/PrimitivesPlugin/doc/boxFeature.rst @@ -1,18 +1,16 @@ -.. _box_feature: +.. |Box_button.icon| image:: images/Box_button.png Box === -.. |box.icon| image:: images/box.png - Box feature creates a box solid. 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: +#. click |Box_button.icon| **Box** button in the toolbar: -There are 2 algorithms for creation of a Box: +There are 3 algorithms for creation of a Box: .. figure:: images/box_dxyz_32x32.png :align: left @@ -26,6 +24,12 @@ There are 2 algorithms for creation of a Box: **By two points** +.. figure:: images/box_pt_dxyz_32x32.png + :align: left + :height: 24px + +**By coordinates of a point and dimensions** + -------------------------------------------------------------------------------- By dimensions @@ -81,8 +85,6 @@ Input fields: :param object: Second vertex of diagonal. :return: Result object. -**Arguments**: Part + 2 selected points (opposite vertices of the box) - Result """""" @@ -94,3 +96,41 @@ 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). + +.. figure:: 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. + +.. figure:: images/Box3.png + :align: center + + Created boxes + +**See Also** a sample TUI Script of :ref:`tui_create_boxptdim` operation. 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/examples/sphere.py b/src/PrimitivesPlugin/doc/examples/sphere1.py similarity index 100% rename from src/PrimitivesPlugin/doc/examples/sphere.py rename to src/PrimitivesPlugin/doc/examples/sphere1.py diff --git a/src/PrimitivesPlugin/doc/examples/sphere2.py b/src/PrimitivesPlugin/doc/examples/sphere2.py new file mode 100644 index 000000000..81f469ea2 --- /dev/null +++ b/src/PrimitivesPlugin/doc/examples/sphere2.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() +Sphere_1 = model.addSphere(Part_1_doc,5,10,180,245,0,90) +model.do() +model.end() diff --git a/src/PrimitivesPlugin/doc/examples/tube.py b/src/PrimitivesPlugin/doc/examples/tube.py new file mode 100644 index 000000000..99567f94a --- /dev/null +++ b/src/PrimitivesPlugin/doc/examples/tube.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() +Torus_1 = model.addTube(Part_1_doc, 3, 5, 12) +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/doc/images/Box_ptAndDims.png b/src/PrimitivesPlugin/doc/images/Box_ptAndDims.png new file mode 100644 index 0000000000000000000000000000000000000000..3fedaf7dfda746631209fbfac42f5ad0e772b29b GIT binary patch literal 14590 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 Qb7P{alGc+_Ma#GU3&dj>2LJ#7 literal 0 HcmV?d00001 diff --git a/src/PrimitivesPlugin/doc/images/Sphere.png b/src/PrimitivesPlugin/doc/images/Sphere.png deleted file mode 100644 index a507c8afe5d94cce144b545829477dd8ea50ef08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6430 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 z 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 literal 0 HcmV?d00001 diff --git a/src/PrimitivesPlugin/doc/images/Sphere2.png b/src/PrimitivesPlugin/doc/images/Sphere2.png new file mode 100644 index 0000000000000000000000000000000000000000..b2ad67a628e10a77dbbc39f050e59bd1283d3dd0 GIT binary patch literal 19655 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 Yhq`Hkj}G+#jANkVN1bi!Nxmun2J4s)2><{9 literal 0 HcmV?d00001 diff --git a/src/PrimitivesPlugin/doc/images/Sphere_button.png b/src/PrimitivesPlugin/doc/images/Sphere_button.png index fb13d34b0bd2fabae5d537415f0cae279ea97ae8..add03e29a5a0dbd6ee8459e52b14aac430aa87d8 100644 GIT binary patch literal 1831 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU`)((b`HpPc6ZLt$u9~nNK8(3 z$t*6&NvsSoW?;~mn4FLhOO|GKyppK57poIDp2l!g{@FekYb)G!R z+Q-Of=b*}CASGI}``7`FMf$Is&RD6MZuQ(6ci?)`vJY3g*SpL%xVo5O-IObjQWXBO zcLY!7?(&k5kO*$bdHQJ*lfZ7~6JnZ7R$M3MF()l|z9H@KMup=yM})7(1mg*{%qPM; z&UvuRI{1V6#5GSRA%FKI=eMkkdDG84YMOJztCb;{X`L$blqF$P8Zw^$X*#v&%$FV^ zR`&#rrCJrwRA0Z;kdTy^Wo*!JNM_NmVg(Bw$)o2Kj?8**Y;fb?O%wui|m2PtC zY;4!6|NpNK0|wOmGY3ADANv1)zxdz(|H};nKFhMTF;_B(DyF_OJ$~^wFw84bBRtc5 zeHpZXYz_uiMm7d!Ad8WK2}npWu!7kP3|@@VaCQ)*20~4HCIbspO%#v@ffgWUgwsq5 znBXb|7BC~&Af<**WQFI*v z8Tlpoz>q7-O!mwxNi8ZU0)`^kMworLRiK-Nusk#`v&0T&0GcpVmyJFs$dG~%56)YB>c*j2ykz>$nQ76~67oXj|MwOgQ<(ZzEsi|Q-^Zn5U2vsn!{ZFTUz zop|hfnvSB>bXrv03D|M$N4wh!c!Hb#gnc&vZu&%*UtD+04G^FJ-RW7+tSrNc?e zC9q_DYxKvt(k+|KH(90$FKBf>{OReco-?l_Z_ebrdV5vk=DlqvL)w{|8Mi4)@3HeQ zh!oMakF%5Qb>8uV?b)AgUcJx4exJ3DxqQ!UiexW`>!J#48y4qAM)leK$^DhvFFlmV z=X~`=e$hKm^WLe9UweI@b#=Li>u)t&nPuwmDd}WLU|eJC0U$|f(RLZ(eu z@9piM`8??JF2lDxMQW2Z6$2O77X5O`_Ul|&psZ-X)5vgaZK#B#WZV7!qRV8}mMmS; zl-#mL^7#|Pr5j%`N?&++BgM68-%`nABvf?<_HLUN~|OY8)p z(5D+Y)H5sRo%itboAf5=&9ZAoOQyIi6>3uOSQ;3tcrs*ZkgkNlmkkN5sz;3$)##LV z@Xypp$~x6~Xi?Il=_mjEvWj5c?iO?K)1gZyJD*2r?D=-u=W5ZmEu5+?~}_^ zv-!o?-ROGcN9nb!t?M?+tuF0lzoWePz2~eVF`-5uL#G$7syb?F8MjT??$E0ACb_I8 znzQnRzO!`i&4M2}-wzykbz=$hlAz3%B*QyzGmiiHBcnHO|AxS6ryslgm%i<#Ahy#f zc4_&6-*fB&mw(^AXJ2#VOet3rG1v5TcBP3NdGWg)tzF`_bo9@EQ*r0AvHipE^Ez++ z`t{;rQTU6#j;j9;nRjws{rl(5nxNc1zO7rW1H(7V3dh?$w){B%Q&sHdizilY_!b!1@J*w6hZkrl}2EbxddW?X?_wfUrhg8C({5hX6E#mPmP1tppJ zc?{v1c`5nj3eGu+#l=<%!Hz!uzOM1Xsl~-WNg!QRmRht@#t7sFS&-I{%#xf`28c2R z3q4ak0|i}$=-`slluEEamT;hp^F+u!5$Y*I{W8otI3#oQfSN?RXT zXmAVPiQ3I^>JXpA{<`0Nmzlm!s4&n~Q#v$Z{ygSo=VNTnZ>V@`)Yh4Mm*?tQUY_;$ z_AsvAxid|1h8w$uE`#K{ypcYjpsL6ynws$A_j~!nKTnHGrs>T%Jz@5&g9lC@ zKD{CJd0CtH^>qnbS@LBXc*Mnpn?ETu%AdIC#l?Bg1r{DxW!)tU#ag$yqb` ztukovw!M~8mHX6YL-)MB6^!R1ZXDR@EiQ3oO6b9y304!TCfJp1F8Ia3axL%Pfe)Xq zYHRQ_Ifym!u&7>)-(P2Vr~Zq;8b0xaKVN=wpNqK4<W Sn>c|H%i!ti=d#Wzp$P!clJw~S diff --git a/src/PrimitivesPlugin/doc/images/Sphere_full.png b/src/PrimitivesPlugin/doc/images/Sphere_full.png new file mode 100644 index 0000000000000000000000000000000000000000..4b5351b9dc87ea3e1982022d7f5503d0587de4c3 GIT binary patch literal 9628 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 Wn!zfpWCS0h0_0%IQWX*=A^!^sx?Yt4 literal 0 HcmV?d00001 diff --git a/src/PrimitivesPlugin/doc/images/Sphere_part.png b/src/PrimitivesPlugin/doc/images/Sphere_part.png new file mode 100644 index 0000000000000000000000000000000000000000..15007d69d6c58be1c260b36cda7bdbc3ac44af4d GIT binary patch literal 14711 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 literal 0 HcmV?d00001 diff --git a/src/PrimitivesPlugin/doc/images/Sphere_res.png b/src/PrimitivesPlugin/doc/images/Sphere_res.png deleted file mode 100644 index 1ffba02ec5e184349669b9015fc9595c9e02768b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17454 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 diff --git a/src/PrimitivesPlugin/doc/images/Tube.png b/src/PrimitivesPlugin/doc/images/Tube.png new file mode 100644 index 0000000000000000000000000000000000000000..314d232d9e704a390245a56ccaf9df811571103b GIT binary patch literal 5163 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 literal 0 HcmV?d00001 diff --git a/src/PrimitivesPlugin/doc/images/Tube_button.png b/src/PrimitivesPlugin/doc/images/Tube_button.png new file mode 100755 index 0000000000000000000000000000000000000000..26db05d57efa2fbbf5f3d47e1229fd6621ca7c7b GIT binary patch literal 1789 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU`)((b`HpPc6ZLt$u9~nNK8(3 z$t*6&NvsSoW?;~mn4FLhOO|GKyppK57poIDp2l!g{@FekYb)G!R z+Q-Of=b*}CASGI}``7`FMf$Is&RD6MZuQ(6ci?)`vJY3g*SpL%xVo5O-IObjQWXBO zcLY!7?(&k5kO*$bdHQJ*lfZ7~6JnZ7R$M3MF()l|z9H@KMup=yM})7(1mg*{%qPM; z&UvuRI{1V6#5GSRA%FKI=eMkkdDG84YMOJztCb;{X`L$blqF$P8Zw^$X*#v&%$FV^ zR`&#rrCJrwRA0Z;kdTy^Wo*!JNM_NmVg(Bw$)o2Kj?8**Y;fb?O%wui|m2PtC zY;4!6|NpNK0|wOmGY3ADANv1)zxdz(|H};nKFhMTF;_B(DyF_OJ$~^wFw84bBRtc5 zeHpZXYz_uiMm7d!Ad8WK2}npWu!7kP3|@@VaCQ)*20~4HCIbspO%#v@ffgWUgwsq5 znBXb|7BC~&Af<**WQFI*v z8Tlpoz>q7-O!mwxNi8ZU0)`^kMworLRiK-Nusk#`v&0T&0GcpVmyJFs$dG~%5VZR&lpD=!T_jVbL ziBew4tLhC(q}(Kw&wp+axKk_yt>h6oAx94~Ln`r&$Q19+Xf3Dt6 z%6mG!!gznq5O& z1@{kRq&H+wn{Xn=&{Szng-ze4@0%{%lVenoR%4MUPE0KoRlDcM;B;eMSJC@xcjheh z*wWBxv0LQUF30Po6(4>m&RE8|Z4ZOyqWhwrMwM(uvn?5Q9JUH%Ow>Co%y4t#?*+lk zPKwM93IdzfJ~!JFzCM1^#q8@3Uw%%v*wXIlaPi84k2CaC9G8YQZ!3sc%EfV7=!x%_ zuk#cn6yw>QOpb6^c{P~M)pk6?7krE*@^4-EL=n!3Q5Jp7a-Ri`vP+tn3ds1hPJGrZ z8ZdMHravdHvpfyrv?zF(xoh|S+eN)+(n2g}9{8^M;uXsvB zKm^)72SLdf+_xq7ca%|MX7^mC&yA5njGsCq*PrQ9% z|M$f6KOCUb;~o7&E6{oT2%n{-W7j UbC*iL;Rcmgp00i_>zopr0G`;IF8}}l literal 0 HcmV?d00001 diff --git a/src/PrimitivesPlugin/doc/images/Tube_res.png b/src/PrimitivesPlugin/doc/images/Tube_res.png new file mode 100644 index 0000000000000000000000000000000000000000..69adee651531c375d70154a82a75483f72fda0de GIT binary patch literal 6622 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 literal 0 HcmV?d00001 diff --git a/src/PrimitivesPlugin/doc/images/box.png b/src/PrimitivesPlugin/doc/images/box.png deleted file mode 100644 index 2b0757b055f0b982a04cb52ab53c3379201c1720..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 528 zcmV+r0`L8aP)JbVQ%cRr!A&B|pKN<0S6TADd;jclklM62=H^q+<@gwOR+B!^n@>TR2>pR;iRgul~ zD|EDWS2Cne-7T({{_dU%tHpv`@8U-JYJ!xzOhDc z^ZDfk)>$>#31HaRqEcG&Io zT@(QT903azn9OSU_^2X$d?e~^mn6|TGd^W<@I1}TIRIpScCOHBvFN!_6a^#G6H*z^ z8^6zJE+HTOalzyB6BwZWsUVh!V{vs^VvKmWpTB4GkceYpc~MGfs#`b+M)E3nh{xa$ zEJ?Dax`q8<1o*szU%|krKd>aqvg{TPLnmK3;ak1W3@G`jfDoi8HMC{Q0Pq3wp^%jP S=9FOo0000=Iz)3 diff --git a/src/PrimitivesPlugin/doc/images/box_pt_dxyz_32x32.png b/src/PrimitivesPlugin/doc/images/box_pt_dxyz_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..db199ea7b2e76b8ad13b1590a4aca86f25527446 GIT binary patch literal 1188 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 literal 0 HcmV?d00001 diff --git a/src/PrimitivesPlugin/doc/images/sphere_part_32x32.png b/src/PrimitivesPlugin/doc/images/sphere_part_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..c74269ac07fc0b7efe937085f0e186a72f586e8a GIT binary patch literal 2484 zcmZ`*dpy%^AO6i4LwTOIa>!vViySr-*{U_p-IU( zQ4Y0o$oUYF;-LddNe+)hc{i1wx6k|DpU-`NzxVaKuIu}|zxO|Pj2+Qpouq;!008R< zmgWwEh!9Q*h+t(NKRzc2Af|)G9-yd0@r_^;=|v`Z+t>gaf?NU+13>_=kOGJZ76m|T zH3tAI(B`$=0i^zu6YT?te&zuXdNV85`jP%F+9C-4(9v5%LO}Q2b#_}iqXYlu^1gajGmshfT7I{3t+j0Y6md4elz*uWA4TDVE6>GeCPoP zp|6`eJ(y*TL<$S7jc@7gTU%h_Tb`0=g z;eQzX0)JN-VT29)M+3jz&MGRn9=xOxX6>r+lCMoDz5oCzA(;P*M20pv`Orv?aQuRH zdCjFFmN%7JahbS%W4^k24g|7aQ!c2uyQ)!cIa^f$Mcp9LtuZRQ%{^yC1iBCQClWyx zrNXm0BIgmV>Pjt$5MFs_M&+T-j5oB)M5&nW4DYG1@hi-_4_BDOwZ*{7EW#1a0WXA>M~7Z`g*C=Z_~4R-UkZm&8oTnJ8{obdQ>(qlr>d&B?A|bYiSt z$BQaat$7*!4OY9DTCK9L#(Mrp`K?I3niya*D4$?ihEhmNeyCyLqI7I1gr=Bzb3X-2 zeybdSj5L^4luGQ!crvWLQ%3-+7^@f))hMLWy)229r_54I-rLf1)|+H1=?jPr?dJ^| zAEb+F1`G-_g%3K?W z*UW>&DNr{n*MdolNv>T5wwSuK*M{p)s}GJIf$MEmb|k%i5moFAA#p1rABc%P(gZI# z*X?bEmR}%pM}t!wjmO<2++0GZK@XUU-io{SrAzn1&r(l5zRASi2|N7dj9EwCSSraL z&W)R)t&F^)k4!+eHyD`p-o@#j*SMK+!TvpS|I}8=e&!19#OF=0+)7beh4}q1P3fx1ch*H?{h7D~S;xIG z^$+5g8*{I12WjLH!3i(*r*G}ty0vU#>TFcT(cUuYR&)g?wQq#Q$bFuhND$f0jtaER z!N}FW4-XkciT}-?xZq@G8B0S2>8r@TD1WjGQ#*|$Z`*jb^kS>F_3-A86}?yjuzS;y ztNIG?+lO!9`|w-Ro)+|EY$;8K8(ut9nQ;&*{jeo+OM&*|%&}L#)>dG5f@f@=vYfKA zf`9sFT1UJ10b;-nUuo<`{aT{9-@&3MdiBXKmWx|16U}Y}DS+@gEcpf7N)@C0!#iX2 zTnRA!t~c`z?d|0UJUlO?Ks9bt-Nxdm@5Ov27>m`ePkPLodnBq76`@;tey1F?GCCdJ z|8n8+IXH-Lk)Vo-gzK3FZpcmT0Nx0v0^op8yio8;@ksp6#D5y2g@(Fg~ z86rAp$0zsPtOsRUXO_~YZ#{+~W}Gz-&hStvFTeKhJn~Wc;f$l^v~r605_GO7d&Yvay|Yx8H4i7EwJGB)h_3e>LuM8Vs2bN6N+9QQQ*G_?>9j zukm?vKd=2GDwhvLAgYL&IErr@PdsA0^Uxy%Hw;qkE5p%9Jz9MNZ8+9ZmpY(zuxj@9 zv;C9f7`f%q>Fg1@+P`J3Xbn2aG2~4<7?)m!?+;q5vXQULj3PH?+ltaU`!;%HuCgNNEFo4ausUU&8AX9jqzZGC)v zTe|$Y#s{;zb^7XtuQCozo<4a%CxZGuzsJMYbZA)&RZV4QeOe@63!W;h)D0DnlQHp~ z?>UmzjCD$b4}6^GXvxcc94NPVH&pE}HZJwN%6}oDV*yXa_-f*=sHqg5xCenvK3#6O zSU-uARGWMWw?L)OLqMH@9AohIDHpbr#N_;){+&J(O$k}v23q;8eCz4{)Kn#t<{`pD|5Bmlex>XfCLHH&PMp6w_kq6X8aUBX=0!&@%*(9r;oR7c z3jJ{Yt1F@%UpUg78hN*1sV1c50@5DdSd*QMzqCP&_iTJY)a6K@r{^u_q>{sBIc?`C z+YBzfG0f?%(>(Q=2cFKgn3_G#^J_NUX}(gY)O7vbbqB|Rb7^U2j;Wm4qNxez93^qs zI(s<(<-EJf8`3d9Sn;KBNY`J(Q!0ifUr>7;k2G3%Kg_e`R`{FLRlpWJI#IhmflrlC z{F{pJLd)N4^q%}X-_HJ|nA><3p2?Z38nT}M(>G@*{OMHe&=Qp&TpB$lJJu1*4*9gL zgJLiTuPq!sjU}Dc7EKqaxi+(HBRu(<@`(r%RzseD%nIH(zQ8{});BV{Snm>MsIrnP zxuPkWb7(rHpz9bsl(1rGQ185TxlP&(SwsB5CJo#PNGmXeOS*SI8XT_Gw&Aqjvv3vF z#oM@)nJ0nYT1UNB;d>X>Pc^+u(yOuWUzqZv$W|^DkH@WB0pC4*+$#vVXexZV5cU$y Ji}tui{0IC47+?SZ literal 0 HcmV?d00001 diff --git a/src/PrimitivesPlugin/doc/sphereFeature.rst b/src/PrimitivesPlugin/doc/sphereFeature.rst index 71688a999..ade524999 100644 --- a/src/PrimitivesPlugin/doc/sphereFeature.rst +++ b/src/PrimitivesPlugin/doc/sphereFeature.rst @@ -3,29 +3,46 @@ Sphere ====== -Sphere feature creates a sphere solid. +Sphere feature creates a sphere solid or a part of a sphere solid. To create a Sphere in the active part: #. select in the Main Menu *Primitives - > Sphere* item or #. click |Sphere_button.icon| **Sphere** button in the toolbar -The following property panel appears. +There are 2 algorithms for creation of a Sphere -.. figure:: images/Sphere.png +.. figure:: images/sphere_32x32.png + :align: left + :height: 24px + +**By a center and a radius** + +.. figure:: images/sphere_part_32x32.png + :align: left + :height: 24px + +**By radii (inner and outer) and angle limits (theta and phi)** + +-------------------------------------------------------------------------------- + +By a center and a radius +------------------------ + +Sphere is created by a center (origin by default) and a radius. + +.. figure:: images/Sphere_full.png :align: center - Sphere property panel - Input fields: - **Point** defines the center of the sphere selected in 3D OCC viewer or object browser; - **Radius** defines the radius. - + **TUI Command**: .. py:function:: model.addSphere(Part_doc, Point, Radius) - + :param part: The current part object. :param object: Vertex. :param real: Radius. @@ -34,11 +51,52 @@ Input fields: Result """""" -An example is shown below. +A solid sphere based on the origin and a radius. -.. figure:: images/Sphere_res.png +.. figure:: images/Sphere1.png :align: center - - Sphere created -**See Also** a sample TUI Script of :ref:`tui_create_sphere` operation. +**See Also** a sample TUI Script of a :ref:`tui_create_sphere` operation. + +By radii (inner and outer) and angle limits (theta and phi) +----------------------------------------------------------- + +Part of sphere is created by radii (inner and outer) and angle limits (phi and theta). + +.. figure:: images/Sphere_part.png + :align: center + +Input fields: + +- **RMin** defines the inner radius; +- **RMax** defines the outer radius; +- **PhiMin** defines the lower phi limit; +- **PhiMax** defines the higher phi limit; +- **ThetaMin** defines the lower theta limit; +- **ThetaMax** defines the higher theta limit. + +**TUI Command**: + +.. py:function:: model.addSphere(Part_doc, RMin, RMax, PhiMin, PhiMax, ThetaMin, ThetaMax) + + :param part: The current part object. + :param real: Inner radius. + :param real: Outer radius. + :param real: Lower phi. + :param real: Hiher phi. + :param real: Lower theta. + :param real: Hiher theta. + :return: Result object. + +Result +"""""" + +A solid sphere based on the origin with radii (inner and outer) and angles (phi and theta). + +.. figure:: images/Sphere2.png + :align: center + +**See Also** a sample TUI Script of a :ref:`tui_create_part_sphere` operation. + + + diff --git a/src/PrimitivesPlugin/doc/tubeFeature.rst b/src/PrimitivesPlugin/doc/tubeFeature.rst new file mode 100644 index 000000000..feb2ac468 --- /dev/null +++ b/src/PrimitivesPlugin/doc/tubeFeature.rst @@ -0,0 +1,46 @@ +.. |Tube_button.icon| image:: images/Tube_button.png + +Tube +==== + +Tube feature creates a tube solid. + +To create a Tube in the active part: + +#. select in the Main Menu *Primitives - > Tube* item or +#. click |Tube_button.icon| **Tube** button in the toolbar + +The following property panel appears. + +.. figure:: images/Tube.png + :align: center + + Tube + +Input fields: + +- **rmin** defines the inner radius of the the tube; +- **rmax** defines the outer radius of the the tube; +- **height** defines the height of the the tube; + +**TUI Command**: + +.. py:function:: model.addTube(Part_doc, rmin, rmax, height) + + :param part: The current part object. + :param real: rmin. + :param real: rmax. + :param real: height. + :return: Result object. + +Result +"""""" + +An example is shown below. + +.. figure:: images/Tube_res.png + :align: center + + Tube created + +**See Also** a sample TUI Script of :ref:`tui_create_tube` operation. 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 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 literal 0 HcmV?d00001 diff --git a/src/PrimitivesPlugin/icons/sphere_part_32x32.png b/src/PrimitivesPlugin/icons/sphere_part_32x32.png new file mode 100755 index 0000000000000000000000000000000000000000..c74269ac07fc0b7efe937085f0e186a72f586e8a GIT binary patch literal 2484 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 Ji}tui{0IC47+?SZ literal 0 HcmV?d00001 diff --git a/src/PrimitivesPlugin/icons/tube.png b/src/PrimitivesPlugin/icons/tube.png new file mode 100755 index 0000000000000000000000000000000000000000..26db05d57efa2fbbf5f3d47e1229fd6621ca7c7b GIT binary patch literal 1789 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU`)((b`HpPc6ZLt$u9~nNK8(3 z$t*6&NvsSoW?;~mn4FLhOO|GKyppK57poIDp2l!g{@FekYb)G!R z+Q-Of=b*}CASGI}``7`FMf$Is&RD6MZuQ(6ci?)`vJY3g*SpL%xVo5O-IObjQWXBO zcLY!7?(&k5kO*$bdHQJ*lfZ7~6JnZ7R$M3MF()l|z9H@KMup=yM})7(1mg*{%qPM; z&UvuRI{1V6#5GSRA%FKI=eMkkdDG84YMOJztCb;{X`L$blqF$P8Zw^$X*#v&%$FV^ zR`&#rrCJrwRA0Z;kdTy^Wo*!JNM_NmVg(Bw$)o2Kj?8**Y;fb?O%wui|m2PtC zY;4!6|NpNK0|wOmGY3ADANv1)zxdz(|H};nKFhMTF;_B(DyF_OJ$~^wFw84bBRtc5 zeHpZXYz_uiMm7d!Ad8WK2}npWu!7kP3|@@VaCQ)*20~4HCIbspO%#v@ffgWUgwsq5 znBXb|7BC~&Af<**WQFI*v z8Tlpoz>q7-O!mwxNi8ZU0)`^kMworLRiK-Nusk#`v&0T&0GcpVmyJFs$dG~%5VZR&lpD=!T_jVbL ziBew4tLhC(q}(Kw&wp+axKk_yt>h6oAx94~Ln`r&$Q19+Xf3Dt6 z%6mG!!gznq5O& z1@{kRq&H+wn{Xn=&{Szng-ze4@0%{%lVenoR%4MUPE0KoRlDcM;B;eMSJC@xcjheh z*wWBxv0LQUF30Po6(4>m&RE8|Z4ZOyqWhwrMwM(uvn?5Q9JUH%Ow>Co%y4t#?*+lk zPKwM93IdzfJ~!JFzCM1^#q8@3Uw%%v*wXIlaPi84k2CaC9G8YQZ!3sc%EfV7=!x%_ zuk#cn6yw>QOpb6^c{P~M)pk6?7krE*@^4-EL=n!3Q5Jp7a-Ri`vP+tn3ds1hPJGrZ z8ZdMHravdHvpfyrv?zF(xoh|S+eN)+(n2g}9{8^M;uXsvB zKm^)72SLdf+_xq7ca%|MX7^mC&yA5njGsCq*PrQ9% z|M$f6KOCUb;~o7&E6{oT2%n{-W7j UbC*iL;Rcmgp00i_>zopr0G`;IF8}}l literal 0 HcmV?d00001 diff --git a/src/PrimitivesPlugin/plugin-Primitives.xml b/src/PrimitivesPlugin/plugin-Primitives.xml index f250b587e..f743fef21 100644 --- a/src/PrimitivesPlugin/plugin-Primitives.xml +++ b/src/PrimitivesPlugin/plugin-Primitives.xml @@ -30,5 +30,11 @@ + + + + + diff --git a/src/PrimitivesPlugin/sphere_widget.xml b/src/PrimitivesPlugin/sphere_widget.xml index d2f29ce1e..389d8c5bc 100644 --- a/src/PrimitivesPlugin/sphere_widget.xml +++ b/src/PrimitivesPlugin/sphere_widget.xml @@ -1,15 +1,65 @@ - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + diff --git a/src/PrimitivesPlugin/tube_widget.xml b/src/PrimitivesPlugin/tube_widget.xml new file mode 100644 index 000000000..4fc429339 --- /dev/null +++ b/src/PrimitivesPlugin/tube_widget.xml @@ -0,0 +1,26 @@ + + + + + + + + diff --git a/src/PythonAPI/model/primitives/__init__.py b/src/PythonAPI/model/primitives/__init__.py index 6e2110eca..3c2e74901 100644 --- a/src/PythonAPI/model/primitives/__init__.py +++ b/src/PythonAPI/model/primitives/__init__.py @@ -19,4 +19,4 @@ """Package for Primitives plugin for the Parametric Geometry API of the Modeler. """ -from PrimitivesAPI import addBox, addCone, addCylinder, addSphere, addTorus +from PrimitivesAPI import addBox, addCone, addCylinder, addSphere, addTorus, addTube diff --git a/test.API/SHAPER/Primitives/TestAPI_Box.py b/test.API/SHAPER/Primitives/TestAPI_Box.py index f4711ed19..856192817 100644 --- a/test.API/SHAPER/Primitives/TestAPI_Box.py +++ b/test.API/SHAPER/Primitives/TestAPI_Box.py @@ -62,32 +62,32 @@ Box_8 = shaperpy.makeBox(pnt1,pnt2) try : Box_9 = shaperpy.makeBox(pnt1,pnt1) except myExcept as ec: - assert(ec.what() == "Box builder with points :: the distance between the two points is null.") + assert(ec.what() == "Box builder with two points :: the distance between the two points is null.") try : pnt3 = pnt(0.,50.,50.) Box_10 = shaperpy.makeBox(pnt1,pnt3) except myExcept as ec: - assert(ec.what() == "Box builder with points :: the points belong both to one of the OXY, OYZ or OZX planes.") + assert(ec.what() == "Box builder with two points :: the points belong both to one of the OXY, OYZ or OZX planes.") try : pnt4 = pnt(50.,0.,50.) Box_11 = shaperpy.makeBox(pnt1,pnt4) except myExcept as ec: - assert(ec.what() == "Box builder with points :: the points belong both to one of the OXY, OYZ or OZX planes.") + assert(ec.what() == "Box builder with two points :: the points belong both to one of the OXY, OYZ or OZX planes.") try : pnt5 = pnt(50.,50.,0.) Box_12 = shaperpy.makeBox(pnt1,pnt5) except myExcept as ec: - assert(ec.what() == "Box builder with points :: the points belong both to one of the OXY, OYZ or OZX planes.") + assert(ec.what() == "Box builder with two points :: the points belong both to one of the OXY, OYZ or OZX planes.") try : Box_13 = shaperpy.makeBox(None, pnt2) except myExcept as ec: - assert(ec.what() == "Box builder with points :: the first point is not valid.") + assert(ec.what() == "Box builder with two points :: the first point is not valid.") try : Box_14 = shaperpy.makeBox(pnt2, None) except myExcept as ec: - assert(ec.what() == "Box builder with points :: the second point is not valid.") \ No newline at end of file + assert(ec.what() == "Box builder with two points :: the second point is not valid.") diff --git a/test.API/SHAPER/Primitives/TestBox.py b/test.API/SHAPER/Primitives/TestBox.py index 7d228addc..c3c58a2fe 100644 --- a/test.API/SHAPER/Primitives/TestBox.py +++ b/test.API/SHAPER/Primitives/TestBox.py @@ -84,6 +84,7 @@ Box_15 = model.addBox(Part_1_doc, model.selection("VERTEX", "Sketch_1/SketchLine Box_16 = model.addBox(Part_1_doc, model.selection("VERTEX", "[Extrusion_1_1/Generated_Face&Sketch_1/SketchLine_3][Extrusion_1_1/Generated_Face&Sketch_1/SketchLine_4][Extrusion_1_1/To_Face]"), model.selection("VERTEX", "[Extrusion_2_1/Generated_Face&Sketch_2/SketchLine_6][Extrusion_2_1/Generated_Face&Sketch_2/SketchLine_7][Extrusion_2_1/To_Face]")) Box_17 = model.addBox(Part_1_doc, model.selection("VERTEX", "Vertex_1_1"), model.selection("VERTEX", "Vertex_2_1")) Box_18 = model.addBox(Part_1_doc, "dx", "dy", "dz") +Box_19 = model.addBox(Part_1_doc, 0, 0, 0, 20, 20 ,20) model.do() model.end() @@ -126,6 +127,12 @@ model.testNbSubShapes(Box_18, GeomAPI_Shape.SOLID, [1]) model.testNbSubShapes(Box_18, GeomAPI_Shape.FACE, [6]) model.testHaveNamingFaces(Box_18, model, Part_1_doc) +model.testNbResults(Box_19, 1) +model.testNbSubResults(Box_19, [0]) +model.testNbSubShapes(Box_19, GeomAPI_Shape.SOLID, [1]) +model.testNbSubShapes(Box_19, GeomAPI_Shape.FACE, [6]) +model.testHaveNamingFaces(Box_19, model, Part_1_doc) + model.testNbResults(Box_2, 0) assert(Box_2.feature().error() == "Box builder with dimensions :: Dx is null or negative.") @@ -145,16 +152,16 @@ model.testNbResults(Box_7, 0) assert(Box_7.feature().error() == "Box builder with dimensions :: Dz is null or negative.") model.testNbResults(Box_9, 0) -assert(Box_9.feature().error() == "Box builder with points :: the distance between the two points is null.") +assert(Box_9.feature().error() == "Box builder with two points :: the distance between the two points is null.") model.testNbResults(Box_10, 0) -assert(Box_10.feature().error() == "Box builder with points :: the points belong both to one of the OXY, OYZ or OZX planes.") +assert(Box_10.feature().error() == "Box builder with two points :: the points belong both to one of the OXY, OYZ or OZX planes.") model.testNbResults(Box_11, 0) -assert(Box_11.feature().error() == "Box builder with points :: the points belong both to one of the OXY, OYZ or OZX planes.") +assert(Box_11.feature().error() == "Box builder with two points :: the points belong both to one of the OXY, OYZ or OZX planes.") model.testNbResults(Box_12, 0) -assert(Box_12.feature().error() == "Box builder with points :: the points belong both to one of the OXY, OYZ or OZX planes.") +assert(Box_12.feature().error() == "Box builder with two points :: the points belong both to one of the OXY, OYZ or OZX planes.") model.testNbResults(Box_13, 0) assert(Box_13.feature().error() == "Attribute \"FirstPoint\" is not initialized.") diff --git a/test.API/SHAPER/Primitives/TestSphere.py b/test.API/SHAPER/Primitives/TestSphere.py index 33782eadb..36a820856 100644 --- a/test.API/SHAPER/Primitives/TestSphere.py +++ b/test.API/SHAPER/Primitives/TestSphere.py @@ -41,6 +41,9 @@ Sphere_6 = model.addSphere(Part_1_doc, model.selection("VERTEX", "PartSet/Origin Sphere_7 = model.addSphere(Part_1_doc, 10) Sphere_7.setCenterPoint(Point_1) +Sphere_8 = model.addSphere(Part_1_doc,10,40,0,180,0,180) +Sphere_9 = model.addSphere(Part_1_doc,40,10,0,180,0,180) + model.do() model.end() @@ -71,6 +74,12 @@ model.testNbSubShapes(Sphere_7, GeomAPI_Shape.SOLID, [1]) model.testNbSubShapes(Sphere_7, GeomAPI_Shape.FACE, [1]) model.testHaveNamingFaces(Sphere_7, model, Part_1_doc) +model.testNbResults(Sphere_8, 1) +model.testNbSubResults(Sphere_8, [0]) +model.testNbSubShapes(Sphere_8, GeomAPI_Shape.SOLID, [1]) +model.testNbSubShapes(Sphere_8, GeomAPI_Shape.FACE, [4]) +model.testHaveNamingFaces(Sphere_8, model, Part_1_doc) + model.testNbResults(Sphere_2, 0) assert(Sphere_2.feature().error() == "Sphere builder :: radius is negative or null.") @@ -79,3 +88,6 @@ assert(Sphere_3.feature().error() == "Sphere builder :: radius is negative or nu model.testNbResults(Sphere_5, 0) assert(Sphere_5.feature().error() == "Attribute \"center_point\" is not initialized.") + +model.testNbResults(Sphere_9, 0) +assert(Sphere_9.feature().error() == "Sphere builder :: RMin is larger than RMax.") diff --git a/test.API/SHAPER/Primitives/TestTube.py b/test.API/SHAPER/Primitives/TestTube.py new file mode 100644 index 000000000..b170cc4c0 --- /dev/null +++ b/test.API/SHAPER/Primitives/TestTube.py @@ -0,0 +1,66 @@ +# Copyright (C) 2017-2021 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 +# +from salome.shaper import model + +model.begin() +partSet = model.moduleDocument() +Part_1 = model.addPart(partSet) +Part_1_doc = Part_1.document() + +# Parameters +model.addParameter(Part_1_doc, "rmin", "10") +model.addParameter(Part_1_doc, "rmax", "12") +model.addParameter(Part_1_doc, "h", "20.5") + +# Tests +Tube_1 = model.addTube(Part_1_doc, 3, 5, 12) +Tube_2 = model.addTube(Part_1_doc, "rmin", "rmax", "h") +Tube_3 = model.addTube(Part_1_doc, 5, 3, 12) +Tube_4 = model.addTube(Part_1_doc, -2.5, 5, 12) +Tube_5 = model.addTube(Part_1_doc, 3, 5, -10) + +model.do() +model.end() + +# Checks +from GeomAPI import GeomAPI_Shape + +model.testNbResults(Tube_1, 1) +model.testNbSubResults(Tube_1, [0]) +model.testNbSubShapes(Tube_1, GeomAPI_Shape.SOLID, [1]) +model.testNbSubShapes(Tube_1, GeomAPI_Shape.FACE, [4]) +model.testHaveNamingFaces(Tube_1, model, Part_1_doc) + +model.testNbResults(Tube_2, 1) +model.testNbSubResults(Tube_2, [0]) +model.testNbSubShapes(Tube_2, GeomAPI_Shape.SOLID, [1]) +model.testNbSubShapes(Tube_2, GeomAPI_Shape.FACE, [4]) +model.testHaveNamingFaces(Tube_2, model, Part_1_doc) + +model.testNbResults(Tube_3, 0) +print(Tube_3.feature().error()) +assert(Tube_3.feature().error() == "Tube builder :: rmin is greater then or equal to rmax.") + +model.testNbResults(Tube_4, 0) +print(Tube_4.feature().error()) +assert(Tube_4.feature().error() == "Tube builder :: rmin is negative.") + +model.testNbResults(Tube_5, 0) +print(Tube_5.feature().error()) +assert(Tube_5.feature().error() == "Tube builder :: z is negative or null.") diff --git a/test.API/SHAPER/tests.set b/test.API/SHAPER/tests.set index d3bd600bd..b36fa9d9d 100644 --- a/test.API/SHAPER/tests.set +++ b/test.API/SHAPER/tests.set @@ -23,6 +23,7 @@ SET(TEST_NAMES Primitives/TestCylinder.py Primitives/TestSphere.py Primitives/TestTorus.py + Primitives/TestTube.py Primitives/TestAPI_Box.py Primitives/TestAPI_Cone.py Primitives/TestAPI_Cylinder.py -- 2.39.2