]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Add a new primitive to create a tube with radii and height.
authorcg246364 <clarisse.genrault@cea.fr>
Wed, 21 Jul 2021 09:39:12 +0000 (11:39 +0200)
committercg246364 <clarisse.genrault@cea.fr>
Wed, 21 Jul 2021 09:39:12 +0000 (11:39 +0200)
39 files changed:
src/GeomAlgoAPI/CMakeLists.txt
src/GeomAlgoAPI/GeomAlgoAPI_Sphere.cpp
src/GeomAlgoAPI/GeomAlgoAPI_Tube.cpp [new file with mode: 0644]
src/GeomAlgoAPI/GeomAlgoAPI_Tube.h [new file with mode: 0644]
src/PrimitivesAPI/CMakeLists.txt
src/PrimitivesAPI/PrimitivesAPI.i
src/PrimitivesAPI/PrimitivesAPI_Torus.h
src/PrimitivesAPI/PrimitivesAPI_Tube.cpp [new file with mode: 0644]
src/PrimitivesAPI/PrimitivesAPI_Tube.h [new file with mode: 0644]
src/PrimitivesAPI/PrimitivesAPI_swig.h
src/PrimitivesPlugin/CMakeLists.txt
src/PrimitivesPlugin/PrimitivesPlugin_Plugin.cpp
src/PrimitivesPlugin/PrimitivesPlugin_Sphere.cpp
src/PrimitivesPlugin/PrimitivesPlugin_Sphere.h
src/PrimitivesPlugin/PrimitivesPlugin_Tube.cpp [new file with mode: 0644]
src/PrimitivesPlugin/PrimitivesPlugin_Tube.h [new file with mode: 0644]
src/PrimitivesPlugin/PrimitivesPlugin_msg_fr.ts
src/PrimitivesPlugin/box_widget.xml
src/PrimitivesPlugin/doc/PrimitivesPlugin.rst
src/PrimitivesPlugin/doc/TUI_tubeFeature.rst [new file with mode: 0644]
src/PrimitivesPlugin/doc/examples/tube.py [new file with mode: 0644]
src/PrimitivesPlugin/doc/images/Sphere.png [deleted file]
src/PrimitivesPlugin/doc/images/Sphere_button.png
src/PrimitivesPlugin/doc/images/Sphere_res.png [deleted file]
src/PrimitivesPlugin/doc/images/Tube.png [new file with mode: 0644]
src/PrimitivesPlugin/doc/images/Tube_button.png [new file with mode: 0755]
src/PrimitivesPlugin/doc/images/Tube_res.png [new file with mode: 0644]
src/PrimitivesPlugin/doc/images/sphere_32x32.png
src/PrimitivesPlugin/doc/images/sphere_part_32x32.png
src/PrimitivesPlugin/doc/tubeFeature.rst [new file with mode: 0644]
src/PrimitivesPlugin/icons/sphere.png [changed mode: 0644->0755]
src/PrimitivesPlugin/icons/sphere_32x32.png [changed mode: 0644->0755]
src/PrimitivesPlugin/icons/sphere_part_32x32.png [changed mode: 0644->0755]
src/PrimitivesPlugin/icons/tube.png [new file with mode: 0755]
src/PrimitivesPlugin/plugin-Primitives.xml
src/PrimitivesPlugin/tube_widget.xml [new file with mode: 0644]
src/PythonAPI/model/primitives/__init__.py
test.API/SHAPER/Primitives/TestTube.py [new file with mode: 0644]
test.API/SHAPER/tests.set

index 0c549a45beac44842cd83805e74271b840623e7e..4073754d517e261a0e3c563ebaa8e00759461851 100644 (file)
@@ -91,6 +91,7 @@ SET(PROJECT_HEADERS
     GeomAlgoAPI_Chamfer.h
     GeomAlgoAPI_Defeaturing.h
     GeomAlgoAPI_BoundingBox.h
+    GeomAlgoAPI_Tube.h
 )
 
 SET(PROJECT_SOURCES
@@ -161,6 +162,7 @@ SET(PROJECT_SOURCES
     GeomAlgoAPI_Chamfer.cpp
     GeomAlgoAPI_Defeaturing.cpp
     GeomAlgoAPI_BoundingBox.cpp
+    GeomAlgoAPI_Tube.cpp
 )
 
 SET(PROJECT_LIBRARIES
index 73ca13050bd7dfd92439401ff13c1acf9b01eb0d..8a9a292ca32c69659465d2f0de23a1aa34affe50 100644 (file)
@@ -80,7 +80,7 @@ bool GeomAlgoAPI_Sphere::check()
 void GeomAlgoAPI_Sphere::build()
 {
   myCreatedFaces.clear();
-  
+
   if (isSectionSphere) {
     buildSectionSphere();
   } else {
@@ -129,7 +129,8 @@ void GeomAlgoAPI_Sphere::buildSectionSphere()
   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
+  // 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);
@@ -155,9 +156,11 @@ void GeomAlgoAPI_Sphere::buildSectionSphere()
     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)
+  // 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;
@@ -202,7 +205,9 @@ void GeomAlgoAPI_Sphere::buildSectionSphere()
   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);
+  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";
@@ -213,7 +218,8 @@ void GeomAlgoAPI_Sphere::buildSectionSphere()
   }
 
   // Get the shape, verify it, build a GeomAPI_Shape.
-  std::shared_ptr<GeomAPI_Shape> aResultShape =  std::shared_ptr<GeomAPI_Shape>(new GeomAPI_Shape()) ;
+  std::shared_ptr<GeomAPI_Shape> aResultShape =
+           std::shared_ptr<GeomAPI_Shape>(new GeomAPI_Shape());
   aResultShape->setImpl(new TopoDS_Shape(aRevolBuilder->Shape()));
   setShape(aResultShape);
 
diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Tube.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Tube.cpp
new file mode 100644 (file)
index 0000000..55296f3
--- /dev/null
@@ -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 <GeomAlgoAPI_Tube.h>
+
+#include <BRepAlgo_FaceRestrictor.hxx>
+
+#include <BRepBuilderAPI_MakeEdge.hxx>
+#include <BRepBuilderAPI_MakeFace.hxx>
+#include <BRepBuilderAPI_MakeWire.hxx>
+#include <BRepBuilderAPI_Transform.hxx>
+
+#include <BRepPrimAPI_MakePrism.hxx>
+
+#include <gp_Circ.hxx>
+
+#include <TopoDS_Wire.hxx>
+#include <TopoDS_Face.hxx>
+
+//=================================================================================================
+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<GeomAPI_Shape> aShape = std::shared_ptr<GeomAPI_Shape>(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 (file)
index 0000000..73cfe48
--- /dev/null
@@ -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 <GeomAlgoAPI_MakeShape.h>
+
+/**\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_
index 507b54c4530e920cd20127fcb852ae06f74c7180..e6df736f5b9edcd804bdbdc87a66a7e822e76564 100644 (file)
@@ -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
index 5fa74c454b6acc7c07266fcf572b1f6d8f07e088..3e6dc352134329fb42d75525b38c9b9246e58c9b 100644 (file)
@@ -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"
index b460da8263410719fdf6e61a9df243b70e8131db..9a65372a19d43627945c2fa029035e8766a5bb5a 100644 (file)
@@ -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<PrimitivesAPI_Torus> TorusPtr;
 
 /// \ingroup CPPHighAPI
-/// \brief Create primitive Cone feature.
+/// \brief Create primitive Torus feature.
 PRIMITIVESAPI_EXPORT
 TorusPtr addTorus(const std::shared_ptr<ModelAPI_Document>& thePart,
                   const ModelHighAPI_Selection& theBasePoint,
@@ -89,7 +89,7 @@ TorusPtr addTorus(const std::shared_ptr<ModelAPI_Document>& 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<ModelAPI_Document>& thePart,
                   const ModelHighAPI_Double& theRadius,
diff --git a/src/PrimitivesAPI/PrimitivesAPI_Tube.cpp b/src/PrimitivesAPI/PrimitivesAPI_Tube.cpp
new file mode 100644 (file)
index 0000000..8bdd639
--- /dev/null
@@ -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 <ModelHighAPI_Dumper.h>
+#include <ModelHighAPI_Tools.h>
+
+//==================================================================================================
+PrimitivesAPI_Tube::PrimitivesAPI_Tube(const std::shared_ptr<ModelAPI_Feature>& theFeature)
+: ModelHighAPI_Interface(theFeature)
+{
+  initialize();
+}
+
+//==================================================================================================
+PrimitivesAPI_Tube::PrimitivesAPI_Tube(const std::shared_ptr<ModelAPI_Feature>& 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<ModelAPI_Document>& thePart,
+                const ModelHighAPI_Double& theRMin,
+                const ModelHighAPI_Double& theRMax,
+                const ModelHighAPI_Double& theHeight)
+{
+  std::shared_ptr<ModelAPI_Feature> 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 (file)
index 0000000..dd582b1
--- /dev/null
@@ -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 <PrimitivesPlugin_Tube.h>
+
+#include <ModelHighAPI_Double.h>
+#include <ModelHighAPI_Interface.h>
+#include <ModelHighAPI_Macro.h>
+
+
+/// \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<ModelAPI_Feature>& theFeature);
+
+  /// Constructor with values.
+  PRIMITIVESAPI_EXPORT
+  explicit PrimitivesAPI_Tube(const std::shared_ptr<ModelAPI_Feature>& 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<PrimitivesAPI_Tube> TubePtr;
+
+/// \ingroup CPPHighAPI
+/// \brief Create primitive Tube feature.
+PRIMITIVESAPI_EXPORT
+TubePtr addTube(const std::shared_ptr<ModelAPI_Document>& thePart,
+                const ModelHighAPI_Double& theRMin,
+                const ModelHighAPI_Double& theRMax,
+                const ModelHighAPI_Double& theHeight);
+
+#endif // PRIMITIVESAPI_TUBE_H_
index 21934d3a08eecfbe21dd77c35878602e47d634ff..7473a911ba2264be2e026052aec2f76e4429c2a9 100644 (file)
@@ -28,5 +28,6 @@
   #include "PrimitivesAPI_Cylinder.h"
   #include "PrimitivesAPI_Sphere.h"
   #include "PrimitivesAPI_Torus.h"
+  #include "PrimitivesAPI_Tube.h"
 
 #endif // PRIMITIVESAPI_SWIG_H_
index 4504f17eea529c93373f03dd635d6261d649cdee..9c0272d1426cb449ea8b89d22e36f344eebafe79 100644 (file)
@@ -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
index 876f4dd9ad2ead88b2a668e02d5f26708cadaafd..5a248113390f4ee8159dd1ee5d661fe46bd6405a 100644 (file)
@@ -24,6 +24,7 @@
 #include <PrimitivesPlugin_Cylinder.h>
 #include <PrimitivesPlugin_Sphere.h>
 #include <PrimitivesPlugin_Torus.h>
+#include <PrimitivesPlugin_Tube.h>
 
 #include <ModelAPI_Session.h>
 
@@ -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();
index 26ed6511dc49196aa8ca93dadff92b6bc06be67f..f6da4b6cb8aa3690829b560288a271b8c87e3c2e 100644 (file)
@@ -44,7 +44,8 @@ PrimitivesPlugin_Sphere::PrimitivesPlugin_Sphere()
 //=================================================================================================
 void PrimitivesPlugin_Sphere::initAttributes()
 {
-  data()->addAttribute(PrimitivesPlugin_Sphere::CREATION_METHOD(), ModelAPI_AttributeString::typeId());
+  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(),
index 348c1287c037bfbaec423c952533ceda93ceb543..2e54765cde9c5c47c4426672ab02007b30c9cd34 100644 (file)
@@ -79,42 +79,42 @@ 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()
   {
@@ -142,11 +142,12 @@ class PrimitivesPlugin_Sphere : public ModelAPI_Feature
   /// Load Naming data structure of the feature to the document
   void loadNamingDS(std::shared_ptr<GeomAlgoAPI_Sphere> theSphereAlgo,
                     std::shared_ptr<ModelAPI_ResultBody> 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)
+
+  /// Perform the creation of the sphere using radii (inner and outer) and angle limits
+  /// (theta and phi)
   void createShereByDimensions();
 
 };
diff --git a/src/PrimitivesPlugin/PrimitivesPlugin_Tube.cpp b/src/PrimitivesPlugin/PrimitivesPlugin_Tube.cpp
new file mode 100644 (file)
index 0000000..d9a90d9
--- /dev/null
@@ -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 <PrimitivesPlugin_Tube.h>
+
+#include <ModelAPI_AttributeDouble.h>
+#include <ModelAPI_ResultBody.h>
+
+//=================================================================================================
+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<GeomAlgoAPI_Tube> 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<GeomAlgoAPI_Tube> theTubeAlgo,
+                                         std::shared_ptr<ModelAPI_ResultBody> 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<GeomAPI_Shape> > listOfFaces =
+    theTubeAlgo->getCreatedFaces();
+  for (std::map< std::string, std::shared_ptr<GeomAPI_Shape> >::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 (file)
index 0000000..c3af279
--- /dev/null
@@ -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 <GeomAlgoAPI_Tube.h>
+#include <ModelAPI_Feature.h>
+#include <PrimitivesPlugin.h>
+
+/**\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<GeomAlgoAPI_Tube> theTubeAlgo,
+                    std::shared_ptr<ModelAPI_ResultBody> theResultBox);
+};
+
+#endif
index 22d0de57f5bed891432a160f85a67128885d0db5..a046099c653bf6a4a57e3f6bd3353bc76f4434ab 100644 (file)
       <source>Torus</source>
       <translation>Tore</translation>
     </message>
+    <message>
+      <source>Tube</source>
+      <translation>Tube</translation>
+    </message>
   </context>
 
   <context>
       <source>By two points</source>
       <translation>Par deux points</translation>
     </message>
+    <message>
+      <source>By one point and dimensions</source>
+      <translation>Par un point et des dimensions</translation>
+    </message>
   </context>
   <context>
     <name>Box:FirstPoint</name>
       <translation>Dimension en Z</translation>
     </message>
   </context>
+  <context>
+    <name>Box:ox</name>
+    <message>
+      <source>OX</source>
+      <translation>OX</translation>
+    </message>
+    <message>
+      <source>Enter the coordinate X for the center</source>
+      <translation>Entrez la coodonnée en X du centre</translation>
+    </message>
+  </context>
+  <context>
+    <name>Box:oy</name>
+    <message>
+      <source>OY</source>
+      <translation>OY</translation>
+    </message>
+    <message>
+      <source>Enter the coordinate Y for the center</source>
+      <translation>Entrez la coodonnée en Y du centre</translation>
+    </message>
+  </context>
+  <context>
+    <name>Box:oz</name>
+    <message>
+      <source>OZ</source>
+      <translation>OZ</translation>
+    </message>
+    <message>
+      <source>Enter the coordinate Z for the center</source>
+      <translation>Entrez la coodonnée en Z du centre</translation>
+    </message>
+  </context>
+  <context>
+    <name>Box:half_dx</name>
+    <message>
+      <source>DX</source>
+      <translation>DX</translation>
+    </message>
+    <message>
+      <source>Enter the half length in X</source>
+      <translation>Entrez la demi-longueur en X</translation>
+    </message>
+  </context>
+  <context>
+    <name>Box:half_dy</name>
+    <message>
+      <source>DY</source>
+      <translation>DY</translation>
+    </message>
+    <message>
+      <source>Enter the half length in Y</source>
+      <translation>Entrez la demi-longueur en Y</translation>
+    </message>
+  </context>
+  <context>
+    <name>Box:half_dz</name>
+    <message>
+      <source>DZ</source>
+      <translation>DZ</translation>
+    </message>
+    <message>
+      <source>Enter the half length in Z</source>
+      <translation>Entrez la demi-longueur en Z</translation>
+    </message>
+  </context>
 
   <context>
     <name>Cone</name>
       <source>Sphere</source>
       <translation>Sphère</translation>
     </message>
+    <message>
+      <source>Dimensions</source>
+      <translation>Dimensions</translation>
+    </message>
+    <message>
+      <source>Phi/theta range</source>
+      <translation>Intervalles pour Phi/Theta</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sphere:CreationMethod</name>
+    <message>
+      <source>By point and radius</source>
+      <translation>Par un centre et un rayon</translation>
+    </message>
+    <message>
+      <source>By dimensions</source>
+      <translation>Par dimensions</translation>
+    </message>
   </context>
   <context>
     <name>Sphere:center_point</name>
       <translation>Rayon</translation>
     </message>
   </context>
+  <context>
+    <name>Sphere:rmin</name>
+    <message>
+      <source>Enter the inner radius</source>
+      <translation>Entrez le rayon interne</translation>
+    </message>
+    <message>
+      <source>rmin</source>
+      <translation>Rmin</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sphere:rmax</name>
+    <message>
+      <source>Enter the outer radius</source>
+      <translation>Entrez le rayon externe</translation>
+    </message>
+    <message>
+      <source>rmax</source>
+      <translation>Rmax</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sphere:phimin</name>
+    <message>
+      <source>Enter the azimuthal starting angle</source>
+      <translation>Entrez l&apos;angle azimutal de départ</translation>
+    </message>
+    <message>
+      <source>phimin</source>
+      <translation>Phi min</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sphere:phimax</name>
+    <message>
+      <source>Enter the azimuthal revolution angle</source>
+      <translation>Entrez l&apos;angle azimutal de révolution</translation>
+    </message>
+    <message>
+      <source>phimax</source>
+      <translation>Phi max</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sphere:thetamin</name>
+    <message>
+      <source>Enter the polar starting angle</source>
+      <translation>Entrez l&apos;angle polaire de départ</translation>
+    </message>
+    <message>
+      <source>thetamin</source>
+      <translation>Theta min</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sphere:thetamax</name>
+    <message>
+      <source>Enter the polar revolution angle</source>
+      <translation>Entrez l&apos;angle polaire de révolution</translation>
+    </message>
+    <message>
+      <source>thetamax</source>
+      <translation>Theta max</translation>
+    </message>
+  </context>
 
   <context>
     <name>Torus</name>
     </message>
   </context>
 
+  <context>
+    <name>Tube</name>
+    <message>
+      <source>Create a Tube
+      </source>
+      <translation>Créer un tube</translation>
+    </message>
+  </context>
+  <context>
+    <name>Tube:rmin</name>
+    <message>
+      <source>Enter the inner radius</source>
+      <translation>Entrez le rayon interne</translation>
+    </message>
+    <message>
+      <source>rmin</source>
+      <translation>rmin</translation>
+    </message>
+  </context>
+  <context>
+    <name>Tube:rmax</name>
+    <message>
+      <source>Enter the outer radius</source>
+      <translation>Entrez le rayon externe</translation>
+    </message>
+    <message>
+      <source>rmax</source>
+      <translation>rmax</translation>
+    </message>
+  </context>
+  <context>
+    <name>Tube:height</name>
+    <message>
+      <source>Enter the height</source>
+      <translation>Entrez la hauteur</translation>
+    </message>
+    <message>
+      <source>height</source>
+      <translation>height</translation>
+    </message>
+  </context>
+
 </TS>
index bcd5ba91aae5b528fb47194234905ef4a397905c..23ac51326ea41c56ebf264187edcbdef29467a1f 100644 (file)
           label="OX"
           step="1."
           default="0."
-          tooltip="Enter the coordinate X for the origin">
+          tooltip="Enter the coordinate X for the center">
         </doublevalue>
         <doublevalue
           id="oy"
           label="OY"
           step="1."
           default="0."
-          tooltip="Enter the coordinate Y for the origin">
+          tooltip="Enter the coordinate Y for the center">
         </doublevalue>
         <doublevalue
           id="oz"
           label="OZ"
           step="1."
           default="0."
-          tooltip="Enter the coordinate Z for the origin">
+          tooltip="Enter the coordinate Z for the center">
         </doublevalue>
       </groupbox>
       <groupbox title="Half-lengths">
index 364373d009333bba79ac55e9fac59664b5641536..02e0b8702525d2bb8a8d500e8d7915a379ee9601 100644 (file)
@@ -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_tubeFeature.rst b/src/PrimitivesPlugin/doc/TUI_tubeFeature.rst
new file mode 100644 (file)
index 0000000..7b871a1
--- /dev/null
@@ -0,0 +1,12 @@
+
+  .. _tui_create_tube:
+
+Create / Tube
+==============
+
+.. literalinclude:: examples/tube.py
+    :linenos:
+    :language: python
+
+:download:`Download this script <examples/tube.py>` 
+   
diff --git a/src/PrimitivesPlugin/doc/examples/tube.py b/src/PrimitivesPlugin/doc/examples/tube.py
new file mode 100644 (file)
index 0000000..99567f9
--- /dev/null
@@ -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/Sphere.png b/src/PrimitivesPlugin/doc/images/Sphere.png
deleted file mode 100644 (file)
index a507c8a..0000000
Binary files a/src/PrimitivesPlugin/doc/images/Sphere.png and /dev/null differ
index 000d658ab846ac9fdd66be422f6ad446f88c8c52..add03e29a5a0dbd6ee8459e52b14aac430aa87d8 100644 (file)
Binary files a/src/PrimitivesPlugin/doc/images/Sphere_button.png and b/src/PrimitivesPlugin/doc/images/Sphere_button.png differ
diff --git a/src/PrimitivesPlugin/doc/images/Sphere_res.png b/src/PrimitivesPlugin/doc/images/Sphere_res.png
deleted file mode 100644 (file)
index 1ffba02..0000000
Binary files a/src/PrimitivesPlugin/doc/images/Sphere_res.png and /dev/null differ
diff --git a/src/PrimitivesPlugin/doc/images/Tube.png b/src/PrimitivesPlugin/doc/images/Tube.png
new file mode 100644 (file)
index 0000000..314d232
Binary files /dev/null and b/src/PrimitivesPlugin/doc/images/Tube.png differ
diff --git a/src/PrimitivesPlugin/doc/images/Tube_button.png b/src/PrimitivesPlugin/doc/images/Tube_button.png
new file mode 100755 (executable)
index 0000000..3e27491
Binary files /dev/null and b/src/PrimitivesPlugin/doc/images/Tube_button.png differ
diff --git a/src/PrimitivesPlugin/doc/images/Tube_res.png b/src/PrimitivesPlugin/doc/images/Tube_res.png
new file mode 100644 (file)
index 0000000..69adee6
Binary files /dev/null and b/src/PrimitivesPlugin/doc/images/Tube_res.png differ
index 484c384e80a7e7c90b2291ee51ddb876213c9fd4..18dc864b2a20480e6caf5a7f5c5edb3464edccd3 100644 (file)
Binary files a/src/PrimitivesPlugin/doc/images/sphere_32x32.png and b/src/PrimitivesPlugin/doc/images/sphere_32x32.png differ
index ce9c5856be3f5940470c024a6b96b3ff9672e28b..c74269ac07fc0b7efe937085f0e186a72f586e8a 100644 (file)
Binary files a/src/PrimitivesPlugin/doc/images/sphere_part_32x32.png and b/src/PrimitivesPlugin/doc/images/sphere_part_32x32.png differ
diff --git a/src/PrimitivesPlugin/doc/tubeFeature.rst b/src/PrimitivesPlugin/doc/tubeFeature.rst
new file mode 100644 (file)
index 0000000..feb2ac4
--- /dev/null
@@ -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.
old mode 100644 (file)
new mode 100755 (executable)
index 000d658..add03e2
Binary files a/src/PrimitivesPlugin/icons/sphere.png and b/src/PrimitivesPlugin/icons/sphere.png differ
old mode 100644 (file)
new mode 100755 (executable)
index 484c384..18dc864
Binary files a/src/PrimitivesPlugin/icons/sphere_32x32.png and b/src/PrimitivesPlugin/icons/sphere_32x32.png differ
old mode 100644 (file)
new mode 100755 (executable)
index ce9c585..c74269a
Binary files a/src/PrimitivesPlugin/icons/sphere_part_32x32.png and b/src/PrimitivesPlugin/icons/sphere_part_32x32.png differ
diff --git a/src/PrimitivesPlugin/icons/tube.png b/src/PrimitivesPlugin/icons/tube.png
new file mode 100755 (executable)
index 0000000..3e27491
Binary files /dev/null and b/src/PrimitivesPlugin/icons/tube.png differ
index f250b587e9cd95b2ecf4c16192284ada1e166f7a..f743fef211e6d05d204d8d647333b42fb9d3ea19 100644 (file)
         <source path="cone_widget.xml"/>
       </feature>
     </group>
+    <group id="Primitives">
+      <feature id="Tube" title="Tube" tooltip="Create a Tube" icon="icons/Primitives/tube.png"
+               helpfile="tubeFeature.html">
+        <source path="tube_widget.xml"/>
+      </feature>
+    </group>
   </workbench>
 </plugin>
diff --git a/src/PrimitivesPlugin/tube_widget.xml b/src/PrimitivesPlugin/tube_widget.xml
new file mode 100644 (file)
index 0000000..4fc4293
--- /dev/null
@@ -0,0 +1,26 @@
+<source>
+  <doublevalue
+    id="rmin"
+    label="rmin"
+    step="1."
+    default="3."
+    min = "0."
+    tooltip="Enter the inner radius">
+  </doublevalue>
+  <doublevalue
+    id="rmax"
+    label = "rmax"
+    step="1."
+    default="5."
+    min="0."
+    tooltip="Enter the outer radius">
+  </doublevalue>
+  <doublevalue
+    id="height"
+    label="height"
+    step="1."
+    default="12."
+    min="0."
+    tooltip="Enter the height">
+  </doublevalue>
+</source>
index 6e2110eca9ac4a3a535ae2a524f77a2ac81f3807..3c2e749019f4e10feb2605a2b977532f376e596b 100644 (file)
@@ -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/TestTube.py b/test.API/SHAPER/Primitives/TestTube.py
new file mode 100644 (file)
index 0000000..b170cc4
--- /dev/null
@@ -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.")
index d3bd600bda0aae7aaee10bad66f402b78cfbe1bd..b36fa9d9d470f8a66e67d52e26fc807cc637f5ab 100644 (file)
@@ -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