From a2082838bbc0f87d895c4c06e3f2e2982c8c451e Mon Sep 17 00:00:00 2001 From: wmayer Date: Mon, 10 Oct 2011 15:58:39 +0000 Subject: [PATCH] + alternative way of creating a torus to fix boolean operation problems git-svn-id: https://free-cad.svn.sourceforge.net/svnroot/free-cad/trunk@5001 e8eeb9e2-ec13-0410-a4a9-efa5cf37419d --- src/Mod/Part/App/PrimitiveFeature.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/Mod/Part/App/PrimitiveFeature.cpp b/src/Mod/Part/App/PrimitiveFeature.cpp index e6978e712..e958ec30e 100644 --- a/src/Mod/Part/App/PrimitiveFeature.cpp +++ b/src/Mod/Part/App/PrimitiveFeature.cpp @@ -27,6 +27,7 @@ # include # include # include +# include # include # include # include @@ -34,6 +35,7 @@ # include # include # include +# include # include # include # include @@ -421,13 +423,30 @@ App::DocumentObjectExecReturn *Torus::execute(void) if (Radius2.getValue() < Precision::Confusion()) return new App::DocumentObjectExecReturn("Radius of torus too small"); try { +#if 1 // Build a torus + gp_Circ circle; + circle.SetRadius(Radius2.getValue()); + gp_Pnt pos(Radius1.getValue(),0,0); + gp_Dir dir(0,1,0); + circle.SetAxis(gp_Ax1(pos, dir)); + + BRepBuilderAPI_MakeEdge mkEdge(circle, Base::toRadians(Angle1.getValue()+180.0f), + Base::toRadians(Angle2.getValue()+180.0f)); + BRepBuilderAPI_MakeWire mkWire; + mkWire.Add(mkEdge.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.getValue()), Standard_True); + TopoDS_Shape ResultShape = mkRevol.Shape(); +#else BRepPrimAPI_MakeTorus mkTorus(Radius1.getValue(), Radius2.getValue(), Angle1.getValue()/180.0f*Standard_PI, Angle2.getValue()/180.0f*Standard_PI, Angle3.getValue()/180.0f*Standard_PI); const TopoDS_Solid& ResultShape = mkTorus.Solid(); +#endif this->Shape.setValue(ResultShape); } catch (Standard_Failure) {