+ 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();