diff --git a/src/Mod/Path/PathScripts/PathGeom.py b/src/Mod/Path/PathScripts/PathGeom.py index 1645931cd0..07f7f1a96a 100644 --- a/src/Mod/Path/PathScripts/PathGeom.py +++ b/src/Mod/Path/PathScripts/PathGeom.py @@ -465,16 +465,12 @@ def flipEdge(edge): elif Part.Line == type(edge.Curve) or Part.LineSegment == type(edge.Curve): return Part.Edge(Part.LineSegment(edge.Vertexes[-1].Point, edge.Vertexes[0].Point)) elif Part.Circle == type(edge.Curve): - r = edge.Curve.Radius - c = edge.Curve.Center - d = edge.Curve.Axis - a = math.degrees(edge.Curve.AngleXU) - f = math.degrees(edge.FirstParameter) - l = math.degrees(edge.LastParameter) - if 0 > d.z: - a = a + 180 - PathLog.track(r, c, d, a, f, l) - arc = Part.makeCircle(r, c, -d, -l-a, -f-a) + # Create an inverted circle + circle = Part.Circle(edge.Curve.Center, -edge.Curve.Axis, edge.Curve.Radius) + # Rotate the circle appropriately so it starts at edge.valueAt(edge.LastParameter) + circle.rotate(FreeCAD.Placement(circle.Center, circle.Axis, 180 - math.degrees(edge.LastParameter + edge.Curve.AngleXU))) + # Now the edge always starts at 0 and LastParameter is the value range + arc = Part.Edge(circle, 0, edge.LastParameter - edge.FirstParameter) return arc elif Part.BSplineCurve == type(edge.Curve): spline = edge.Curve diff --git a/src/Mod/Path/PathTests/TestPathGeom.py b/src/Mod/Path/PathTests/TestPathGeom.py index d4d961c70c..5ab8884b9b 100644 --- a/src/Mod/Path/PathTests/TestPathGeom.py +++ b/src/Mod/Path/PathTests/TestPathGeom.py @@ -395,6 +395,7 @@ class TestPathGeom(PathTestBase): self.assertEdgeShapesMatch(edge, PathGeom.flipEdge(edge)) edge = Part.Edge(Part.LineSegment(Vector(4,2,1), Vector(-3, -7, 9))) self.assertEdgeShapesMatch(edge, PathGeom.flipEdge(edge)) + edge = Part.makeLine(Vector(1,0,3), Vector(3, 2, 1)) self.assertEdgeShapesMatch(edge, PathGeom.flipEdge(edge)) @@ -402,6 +403,7 @@ class TestPathGeom(PathTestBase): '''Flip a circle''' edge = Part.makeCircle(3, Vector(1, 3, 2), Vector(0, 0, 1)) self.assertEdgeShapesMatch(edge, PathGeom.flipEdge(edge)) + edge = Part.makeCircle(3, Vector(1, 3, 2), Vector(0, 0, -1)) self.assertEdgeShapesMatch(edge, PathGeom.flipEdge(edge)) @@ -410,10 +412,13 @@ class TestPathGeom(PathTestBase): # make sure all 4 quadrants work edge = Part.makeCircle(3, Vector(1, 3, 2), Vector(0, 0, 1), 45, 90) self.assertEdgeShapesMatch(edge, PathGeom.flipEdge(edge)) + edge = Part.makeCircle(3, Vector(1, 3, 2), Vector(0, 0, 1), 100, 170) self.assertEdgeShapesMatch(edge, PathGeom.flipEdge(edge)) + edge = Part.makeCircle(3, Vector(1, 3, 2), Vector(0, 0, 1), 200, 250) self.assertEdgeShapesMatch(edge, PathGeom.flipEdge(edge)) + edge = Part.makeCircle(3, Vector(1, 3, 2), Vector(0, 0, 1), 300, 340) self.assertEdgeShapesMatch(edge, PathGeom.flipEdge(edge))