diff --git a/src/Mod/Path/PathScripts/PathGeom.py b/src/Mod/Path/PathScripts/PathGeom.py index 32c05db21d..f0ce52fab2 100644 --- a/src/Mod/Path/PathScripts/PathGeom.py +++ b/src/Mod/Path/PathScripts/PathGeom.py @@ -468,8 +468,26 @@ def flipEdge(edge): return Part.makeCircle(edge.Curve.Radius, edge.Curve.Center, -edge.Curve.Axis, -math.degrees(edge.LastParameter), -math.degrees(edge.FirstParameter)) elif Part.BSplineCurve == type(edge.Curve): spline = edge.Curve - poles = [p for p in reversed(spline.getPoles())] - weights = [w for w in reversed(spline.getWeights())] - degree = spline.Degree - return Part.Edge(Part.BSplineCurve(poles, degree=degree, weights=weights)) + + mults = spline.getMultiplicities() + weights = spline.getWeights() + knots = spline.getKnots() + poles = spline.getPoles() + perio = spline.isPeriodic() + ratio = spline.isRational() + degree = spline.Degree + + ma = max(knots) + mi = min(knots) + knots = [ma+mi-k for k in knots] + + mults.reverse() + weights.reverse() + poles.reverse() + knots.reverse() + + flipped = Part.BSplineCurve() + flipped.buildFromPolesMultsKnots(poles, mults , knots, perio, degree, weights, ratio) + + return Part.Edge(flipped) diff --git a/src/Mod/Path/PathTests/PathTestUtils.py b/src/Mod/Path/PathTests/PathTestUtils.py index cf12ad48ff..9a2b65005b 100644 --- a/src/Mod/Path/PathTests/PathTestUtils.py +++ b/src/Mod/Path/PathTests/PathTestUtils.py @@ -136,7 +136,7 @@ class PathTestBase(unittest.TestCase): self.assertEqual(q1.UserString, q2.UserString) def assertEdgeShapesMatch(self,e1,e2): - """Verify that 2 edges have the same start/end points and the mid point matches too.""" + """Verify that 2 edges have the same shape, regardless of orientation.""" self.assertEqual(type(e1.Curve), type(e2.Curve)) self.assertEqual(len(e1.Vertexes), len(e2.Vertexes)) if not e1.Vertexes: @@ -150,12 +150,34 @@ class PathTestBase(unittest.TestCase): self.assertCoincide(e1.Curve.Center, e2.Curve.Center) self.assertCoincide(e1.Curve.Axis, -e2.Curve.Axis) else: + def valueAt(e, fraction): + return e.valueAt(e.FirstParameter + (e.LastParameter - e.FirstParameter)*fraction) + if PathGeom.pointsCoincide(e1.Vertexes[0].Point, e2.Vertexes[0].Point): self.assertCoincide(e1.Vertexes[-1].Point, e2.Vertexes[-1].Point) + self.assertCoincide(valueAt(e1, 0.10), valueAt(e2, 0.10)) + self.assertCoincide(valueAt(e1, 0.20), valueAt(e2, 0.20)) + self.assertCoincide(valueAt(e1, 0.25), valueAt(e2, 0.25)) + self.assertCoincide(valueAt(e1, 0.30), valueAt(e2, 0.30)) + self.assertCoincide(valueAt(e1, 0.40), valueAt(e2, 0.40)) + self.assertCoincide(valueAt(e1, 0.50), valueAt(e2, 0.50)) + self.assertCoincide(valueAt(e1, 0.60), valueAt(e2, 0.60)) + self.assertCoincide(valueAt(e1, 0.70), valueAt(e2, 0.70)) + self.assertCoincide(valueAt(e1, 0.75), valueAt(e2, 0.75)) + self.assertCoincide(valueAt(e1, 0.80), valueAt(e2, 0.80)) + self.assertCoincide(valueAt(e1, 0.90), valueAt(e2, 0.90)) else: self.assertCoincide(e1.Vertexes[0].Point, e2.Vertexes[-1].Point) self.assertCoincide(e1.Vertexes[-1].Point, e2.Vertexes[0].Point) - pm1 = e1.valueAt((e1.FirstParameter + e1.LastParameter)/2) - pm2 = e2.valueAt((e2.FirstParameter + e2.LastParameter)/2) - self.assertCoincide(pm1, pm2) + self.assertCoincide(valueAt(e1, 0.10), valueAt(e2, 0.90)) + self.assertCoincide(valueAt(e1, 0.20), valueAt(e2, 0.80)) + self.assertCoincide(valueAt(e1, 0.25), valueAt(e2, 0.75)) + self.assertCoincide(valueAt(e1, 0.30), valueAt(e2, 0.70)) + self.assertCoincide(valueAt(e1, 0.40), valueAt(e2, 0.60)) + self.assertCoincide(valueAt(e1, 0.50), valueAt(e2, 0.50)) + self.assertCoincide(valueAt(e1, 0.60), valueAt(e2, 0.40)) + self.assertCoincide(valueAt(e1, 0.70), valueAt(e2, 0.30)) + self.assertCoincide(valueAt(e1, 0.75), valueAt(e2, 0.25)) + self.assertCoincide(valueAt(e1, 0.80), valueAt(e2, 0.20)) + self.assertCoincide(valueAt(e1, 0.90), valueAt(e2, 0.10)) diff --git a/src/Mod/Path/PathTests/TestPathGeom.py b/src/Mod/Path/PathTests/TestPathGeom.py index 0bc0f70957..9a2dd4e86f 100644 --- a/src/Mod/Path/PathTests/TestPathGeom.py +++ b/src/Mod/Path/PathTests/TestPathGeom.py @@ -428,12 +428,15 @@ class TestPathGeom(PathTestBase): self.assertEdgeShapesMatch(edge, PathGeom.flipEdge(edge)) - def xtest75(self): + def test75(self): '''Flip a b-spline''' - # Disabling for now, there's a bit of a difference spline = Part.BSplineCurve() spline.interpolate([Vector(1,2,3), Vector(-3,0,7), Vector(-3,1,9), Vector(1, 3, 5)]) edge = Part.Edge(spline) self.assertEdgeShapesMatch(edge, PathGeom.flipEdge(edge)) + edge = Part.Edge(Part.BSplineCurve([Vector(-8,4,0), Vector(1,-5,0), Vector(5,11,0), Vector(12,-5,0)], weights=[2,3,5,7])) + self.assertEdgeShapesMatch(edge, PathGeom.flipEdge(edge)) + +