From 5d3e20edc9f6f2a1fcef0fe2580afb91d380428f Mon Sep 17 00:00:00 2001 From: cg246364 Date: Fri, 2 Jul 2021 11:55:38 +0200 Subject: [PATCH] Add a new method to create a part of sphere with radii and angles. --- src/GeomAlgoAPI/GeomAlgoAPI_Box.cpp | 4 +- src/GeomAlgoAPI/GeomAlgoAPI_Box.h | 2 +- src/GeomAlgoAPI/GeomAlgoAPI_Sphere.cpp | 166 +++++++++++++++++- src/GeomAlgoAPI/GeomAlgoAPI_Sphere.h | 24 ++- src/PrimitivesAPI/PrimitivesAPI_Sphere.cpp | 86 ++++++++- src/PrimitivesAPI/PrimitivesAPI_Sphere.h | 51 +++++- src/PrimitivesPlugin/PrimitivesPlugin_Box.cpp | 6 +- src/PrimitivesPlugin/PrimitivesPlugin_Box.h | 8 +- .../PrimitivesPlugin_Sphere.cpp | 72 +++++++- .../PrimitivesPlugin_Sphere.h | 74 +++++++- .../doc/TUI_sphereFeature.rst | 9 +- src/PrimitivesPlugin/doc/TUI_spherePart.rst | 11 ++ src/PrimitivesPlugin/doc/boxFeature.rst | 6 +- .../doc/examples/{sphere.py => sphere1.py} | 0 src/PrimitivesPlugin/doc/examples/sphere2.py | 9 + 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 -> 466 bytes .../doc/images/Sphere_full.png | Bin 0 -> 9628 bytes .../doc/images/Sphere_part.png | Bin 0 -> 14711 bytes src/PrimitivesPlugin/doc/images/box.png | Bin 528 -> 0 bytes .../doc/images/sphere_32x32.png | Bin 0 -> 1725 bytes .../doc/images/sphere_part_32x32.png | Bin 0 -> 1265 bytes src/PrimitivesPlugin/doc/sphereFeature.rst | 82 +++++++-- src/PrimitivesPlugin/icons/sphere_32x32.png | Bin 0 -> 1725 bytes .../icons/sphere_part_32x32.png | Bin 0 -> 1265 bytes src/PrimitivesPlugin/sphere_widget.xml | 78 ++++++-- test.API/SHAPER/Primitives/TestAPI_Box.py | 12 +- test.API/SHAPER/Primitives/TestBox.py | 15 +- test.API/SHAPER/Primitives/TestSphere.py | 12 ++ 30 files changed, 652 insertions(+), 75 deletions(-) create mode 100644 src/PrimitivesPlugin/doc/TUI_spherePart.rst 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/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/box.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/icons/sphere_32x32.png create mode 100644 src/PrimitivesPlugin/icons/sphere_part_32x32.png diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Box.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Box.cpp index 21da9cb04..4ba9fd2ad 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Box.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Box.cpp @@ -189,12 +189,12 @@ void GeomAlgoAPI_Box::buildWithPoints() //================================================================================================= void GeomAlgoAPI_Box::buildWithPointAndDims() { - // Construct points from cordinates and dimensions to use the method with two points + // 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(); } diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Box.h b/src/GeomAlgoAPI/GeomAlgoAPI_Box.h index 44cdd1c69..888361bdd 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Box.h +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Box.h @@ -50,7 +50,7 @@ class GeomAlgoAPI_Box : public GeomAlgoAPI_MakeShape /// \param theSecondPoint The other extremity of the diagonal GEOMALGOAPI_EXPORT GeomAlgoAPI_Box(std::shared_ptr 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 diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Sphere.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Sphere.cpp index f2b8db42c..73ca13050 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Sphere.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Sphere.cpp @@ -17,32 +17,61 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// File: GeomAlgoAPI_Sphere.h +// File: GeomAlgoAPI_Sphere.cpp // Created: 16 Mar 2017 // Author: Clarisse Genrault (CEA) #include +#include + +#include +#include +#include + +#include #include //================================================================================================= GeomAlgoAPI_Sphere::GeomAlgoAPI_Sphere(std::shared_ptr theCenterPoint, const double theRadius) { + isSectionSphere = 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) +{ + isSectionSphere = 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 (isSectionSphere) { + 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,7 +80,17 @@ bool GeomAlgoAPI_Sphere::check() void GeomAlgoAPI_Sphere::build() { myCreatedFaces.clear(); + + if (isSectionSphere) { + buildSectionSphere(); + } else { + buildSphere(); + } +} +//================================================================================================= +void GeomAlgoAPI_Sphere::buildSphere() +{ const gp_Pnt& aCenterPoint = myCenterPoint->impl(); // Construct the sphere @@ -78,3 +117,114 @@ void GeomAlgoAPI_Sphere::build() setDone(true); } + +//================================================================================================= +void GeomAlgoAPI_Sphere::buildSectionSphere() +{ + 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); + + 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); + + aX = myRMin*sin(myThetaMin * M_PI/180.); + aZ = myRMin*cos(myThetaMin * M_PI/180.); + gp_Pnt aTopInnerStart(aX*cos(aStartPhiRad), aX*sin(aStartPhiRad), aZ); + + 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(); + + 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 = "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 = "Sphere builder :: section revolution did not succeed"; + } + if(!aRevolBuilder->IsDone()) { + myError = "Sphere builder :: section revolution did not succeed"; + return; + } + + // 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 (!(aResultShape).get() || aResultShape->isNull()) { + myError = "Sphere builder :: resulting shape is null."; + return; + } + + setImpl(aRevolBuilder); + setBuilderType(OCCT_BRepBuilderAPI_MakeShape); + + setDone(true); +} diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Sphere.h b/src/GeomAlgoAPI/GeomAlgoAPI_Sphere.h index 8fb449948..0966b5aef 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,19 @@ class GeomAlgoAPI_Sphere : public GeomAlgoAPI_MakeShape /// Builds the sphere. GEOMALGOAPI_EXPORT void build(); + /// Builds the sphere. + GEOMALGOAPI_EXPORT void buildSphere(); + + /// Builds the section of sphere. + GEOMALGOAPI_EXPORT void buildSectionSphere(); + private: - std::shared_ptr myCenterPoint; /// Center of the sphere. - double myRadius; + bool isSectionSphere; // Boolean to define if the second mode is used. + std::shared_ptr myCenterPoint; /// Center of the sphere for the first mode. + double myRadius; /// Radius of the sphere for the first mode. + double myRMin, myRMax; /// Inner and outer radius for the second mode. + double myPhiMin, myPhiMax; /// Lower and higher phi limit for the second mode. + double myThetaMin, myThetaMax; /// Lower and higher theta limit for the second mode. }; #endif // GEOMALGOAPI_SPHERE_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/PrimitivesPlugin/PrimitivesPlugin_Box.cpp b/src/PrimitivesPlugin/PrimitivesPlugin_Box.cpp index c9606b717..feea6763d 100644 --- a/src/PrimitivesPlugin/PrimitivesPlugin_Box.cpp +++ b/src/PrimitivesPlugin/PrimitivesPlugin_Box.cpp @@ -71,7 +71,7 @@ void PrimitivesPlugin_Box::execute() if (aMethodType == CREATION_METHOD_BY_TWO_POINTS()) createBoxByTwoPoints(); - + if (aMethodType == CREATION_METHOD_BY_ONE_POINT_AND_DIMS()) createBoxByOnePointAndDims(); } @@ -168,7 +168,7 @@ void PrimitivesPlugin_Box::createBoxByOnePointAndDims() 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(); @@ -176,7 +176,7 @@ void PrimitivesPlugin_Box::createBoxByOnePointAndDims() 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()) { diff --git a/src/PrimitivesPlugin/PrimitivesPlugin_Box.h b/src/PrimitivesPlugin/PrimitivesPlugin_Box.h index 0f3bc7f0f..6d2b64095 100644 --- a/src/PrimitivesPlugin/PrimitivesPlugin_Box.h +++ b/src/PrimitivesPlugin/PrimitivesPlugin_Box.h @@ -31,7 +31,7 @@ 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 + * 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. @@ -108,7 +108,7 @@ class PrimitivesPlugin_Box : public ModelAPI_Feature static const std::string MY_DZ_ID("dz"); return MY_DZ_ID; } - + /// Attribute name of the first coordinate of the center inline static const std::string& OX_ID() { @@ -129,7 +129,7 @@ class PrimitivesPlugin_Box : public ModelAPI_Feature 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() { @@ -178,7 +178,7 @@ 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 + ///Perform the creation of the box using a center and three half-lenths void createBoxByOnePointAndDims(); }; diff --git a/src/PrimitivesPlugin/PrimitivesPlugin_Sphere.cpp b/src/PrimitivesPlugin/PrimitivesPlugin_Sphere.cpp index 00ca224b0..26ed6511d 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,9 @@ 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 +64,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 +121,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 +137,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..348c1287c 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() { @@ -57,6 +79,48 @@ class PrimitivesPlugin_Sphere : public ModelAPI_Feature static const std::string MY_RADIUS_ID("radius"); 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() @@ -78,6 +142,12 @@ class PrimitivesPlugin_Sphere : public ModelAPI_Feature /// Load Naming data structure of the feature to the document 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(); }; diff --git a/src/PrimitivesPlugin/doc/TUI_sphereFeature.rst b/src/PrimitivesPlugin/doc/TUI_sphereFeature.rst index f4012bcce..31aee5680 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..c38cbe40f --- /dev/null +++ b/src/PrimitivesPlugin/doc/TUI_spherePart.rst @@ -0,0 +1,11 @@ + + .. _tui_create_part_sphere: + +Create part ofsphere +==================== + +.. literalinclude:: examples/sphere2.py + :linenos: + :language: python + +:download:`Download this script ` diff --git a/src/PrimitivesPlugin/doc/boxFeature.rst b/src/PrimitivesPlugin/doc/boxFeature.rst index 1171514af..e91466c20 100644 --- a/src/PrimitivesPlugin/doc/boxFeature.rst +++ b/src/PrimitivesPlugin/doc/boxFeature.rst @@ -1,16 +1,14 @@ -.. _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 3 algorithms for creation of a Box: 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/images/Sphere1.png b/src/PrimitivesPlugin/doc/images/Sphere1.png new file mode 100644 index 0000000000000000000000000000000000000000..87214a71368f0ab5ab4294b10cc2b559e756cf6f GIT binary patch literal 38084 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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..000d658ab846ac9fdd66be422f6ad446f88c8c52 100644 GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zKpodXn9)gNb_Gz7y~NYkmHhz=8y~;1#afBC3=E9%o-U3d7N^%v_Vs286ls%RuUl;H z(;Oif*fk|>OV@(EiX2UUnKrg6uD!iwrLXov-`5HT0xZ85qzbHE#LszAY0;TPsb}IG zR=P=SXZd-ocUM>5Z?8UQtIreJcVB#7!JRj%|7`3FzpzBOMNaZi4?Z#J$lJ%Z?l+T- zs(_GO`}Z+C2op*1+!QUw z@G@o9`z7Ji!!<%recKtTzvkfIrBPp#ZrJ{iZ}_^uIc#+tLkb`NFR68T>poW3f>f+Z zk8IDASTW0O@y$0}JGAW#tZkVaR%O0ub3Cr}l&f-I$=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/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/sphere_32x32.png b/src/PrimitivesPlugin/doc/images/sphere_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..484c384e80a7e7c90b2291ee51ddb876213c9fd4 GIT binary patch literal 1725 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 b#Y52Fyb@*{4q>R!00000NkvXXu0mjfC3Qn1 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/icons/sphere_32x32.png b/src/PrimitivesPlugin/icons/sphere_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..484c384e80a7e7c90b2291ee51ddb876213c9fd4 GIT binary patch literal 1725 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 b#Y52Fyb@*{4q>R!00000NkvXXu0mjfC3Qn1 literal 0 HcmV?d00001 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/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.") -- 2.39.2