Fixed flipping of b-spline and enabled unit test for it.

This commit is contained in:
Markus Lampert
2018-06-22 11:11:56 -07:00
parent d101111f64
commit a605b6ea73
3 changed files with 53 additions and 10 deletions

View File

@@ -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)

View File

@@ -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))

View File

@@ -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))