From 40145c06bfa6b0df8d5d1f35d9153d5316050d8a Mon Sep 17 00:00:00 2001 From: wmayer Date: Thu, 3 Dec 2020 14:50:20 +0100 Subject: [PATCH] Part: [skip ci] add method TopoShape::makeTorus --- src/Mod/Part/App/TopoShape.cpp | 44 ++++++++++++++++++++++++++++++++++ src/Mod/Part/App/TopoShape.h | 3 +++ 2 files changed, 47 insertions(+) diff --git a/src/Mod/Part/App/TopoShape.cpp b/src/Mod/Part/App/TopoShape.cpp index 0e523ef3a6..f4b080eb6d 100644 --- a/src/Mod/Part/App/TopoShape.cpp +++ b/src/Mod/Part/App/TopoShape.cpp @@ -78,6 +78,7 @@ # include # include # include +# include # include # include # include @@ -144,6 +145,7 @@ # include # include # include +# include # include # include # include @@ -2287,6 +2289,48 @@ TopoDS_Shape TopoShape::makeSweep(const TopoDS_Shape& profile, double tol, int f return mkBuilder.Face(); } +TopoDS_Shape TopoShape::makeTorus(Standard_Real radius1, Standard_Real radius2, + Standard_Real angle1, Standard_Real angle2, + Standard_Real angle3, Standard_Boolean isSolid) const +{ + // https://forum.freecadweb.org/viewtopic.php?f=3&t=1445 + // https://forum.freecadweb.org/viewtopic.php?f=3&t=52719 +#if 1 + // Build a torus + gp_Circ circle; + circle.SetRadius(radius2); + gp_Pnt pos(radius1,0,0); + gp_Dir dir(0,1,0); + circle.SetAxis(gp_Ax1(pos, dir)); + + BRepBuilderAPI_MakeEdge mkEdge(circle, Base::toRadians(angle1), + Base::toRadians(angle2)); + BRepBuilderAPI_MakeWire mkWire; + mkWire.Add(mkEdge.Edge()); + + if ((angle1 > -180.0 || angle2 < 180.0) && isSolid) { + BRepBuilderAPI_MakeVertex mkVertex(pos); + BRepBuilderAPI_MakeEdge mkEdge1(mkVertex.Vertex(), mkEdge.Vertex1()); + BRepBuilderAPI_MakeEdge mkEdge2(mkVertex.Vertex(), mkEdge.Vertex2()); + mkWire.Add(mkEdge1.Edge()); + mkWire.Add(mkEdge2.Edge()); + } + + BRepBuilderAPI_MakeFace mkFace(mkWire.Wire()); + BRepPrimAPI_MakeRevol mkRevol(mkFace.Face(), gp_Ax1(gp_Pnt(0,0,0), gp_Dir(0,0,1)), + Base::toRadians(angle3), Standard_True); + return mkRevol.Shape(); +#else + (void)isSolid; + BRepPrimAPI_MakeTorus mkTorus(radius1, + radius2, + Base::toRadians(angle1), + Base::toRadians(angle2), + Base::toRadians(angle3)); + return mkTorus.Solid(); +#endif +} + TopoDS_Shape TopoShape::makeHelix(Standard_Real pitch, Standard_Real height, Standard_Real radius, Standard_Real angle, Standard_Boolean leftHanded, diff --git a/src/Mod/Part/App/TopoShape.h b/src/Mod/Part/App/TopoShape.h index 650eebecf4..96ccb0df9f 100644 --- a/src/Mod/Part/App/TopoShape.h +++ b/src/Mod/Part/App/TopoShape.h @@ -247,6 +247,9 @@ public: TopoDS_Shape revolve(const gp_Ax1&, double d, Standard_Boolean isSolid=Standard_False) const; TopoDS_Shape makeSweep(const TopoDS_Shape& profile, double, int) const; TopoDS_Shape makeTube(double radius, double tol, int cont, int maxdeg, int maxsegm) const; + TopoDS_Shape makeTorus(Standard_Real radius1, Standard_Real radius2, + Standard_Real angle1, Standard_Real angle2, Standard_Real angle3, + Standard_Boolean isSolid=Standard_True) const; TopoDS_Shape makeHelix(Standard_Real pitch, Standard_Real height, Standard_Real radius, Standard_Real angle=0, Standard_Boolean left=Standard_False, Standard_Boolean style=Standard_False) const;