From bd5922d131a1ec11928d7ceb612d5efc4caa2932 Mon Sep 17 00:00:00 2001 From: Markus Lampert Date: Mon, 21 Nov 2016 21:53:35 -0800 Subject: [PATCH] Tests and fixes for triangular shaped tags. --- .../PathScripts/PathDressupHoldingTags.py | 32 +- .../PathTests/TestPathDressupHoldingTags.py | 570 +++++++----------- src/Mod/Path/TestPathApp.py | 3 +- 3 files changed, 239 insertions(+), 366 deletions(-) diff --git a/src/Mod/Path/PathScripts/PathDressupHoldingTags.py b/src/Mod/Path/PathScripts/PathDressupHoldingTags.py index cc204d7bcf..2202b5b3a0 100644 --- a/src/Mod/Path/PathScripts/PathDressupHoldingTags.py +++ b/src/Mod/Path/PathScripts/PathDressupHoldingTags.py @@ -149,6 +149,9 @@ class Tag: def top(self): return self.z + self.actualHeight + def centerLine(self): + return Part.Line(self.originAt(self.bottom()), self.originAt(self.top())) + def createSolidsAt(self, z): self.z = z r1 = self.width / 2 @@ -210,30 +213,57 @@ class Tag: #print("\nplateau= %s - %s" %(pt1, pt2)) return Part.Edge(Part.Line(pt1, pt2)) - def intersectP0(self, edge): + def intersectP0Core(self, edge): #print("----- P0 (%s - %s)" % (edge.Curve.StartPoint, edge.Curve.EndPoint)) i = self.tag.nextIntersectionClosestTo(edge, self.tag.core, edge.Curve.StartPoint) if i: if pointsCoincide(i, edge.Curve.StartPoint): # if P0 and P1 are the same, we need to insert a segment for the rise + #print("------- insert vertical rise (%s)" % i) self.edges.append(Part.Edge(Part.Line(i, FreeCAD.Vector(i.x, i.y, self.tag.top())))) self.p1 = i self.state = self.P1 return edge if pointsCoincide(i, edge.Curve.EndPoint): + #print("------- consumed (%s)" % i) e = edge tail = None else: + #print("------- split at (%s)" % i) e, tail = self.tag.splitEdgeAt(edge, i) self.p1 = e.Curve.EndPoint self.edges.append(self.tag.mapEdgeToSolid(e)) self.state = self.P1 return tail # no intersection, the entire edge fits between P0 and P1 + #print("------- no intersection") self.edges.append(self.tag.mapEdgeToSolid(edge)) return None + def intersectP0(self, edge): + if self.tag.core: + return self.intersectP0Core(edge) + # if we have no core the tip is the origin of the Tag + line = Part.Edge(self.tag.centerLine()) + i = DraftGeomUtils.findIntersection(line, edge) + if i: + if pointsCoincide(i[0], edge.Curve.EndPoint): + e = edge + tail = None + else: + e, tail = self.tag.splitEdgeAt(edge, i[0]) + self.state = self.P2 # P1 and P2 are identical for triangular tags + self.p1 = i[0] + self.p2 = i[0] + else: + e = edge + tail = None + self.edges.append(self.tag.mapEdgeToSolid(e)) + return tail + + + def intersectP1(self, edge): #print("----- P1 (%s - %s)" % (edge.Curve.StartPoint, edge.Curve.EndPoint)) i = self.tag.nextIntersectionClosestTo(edge, self.tag.core, edge.Curve.EndPoint) diff --git a/src/Mod/Path/PathTests/TestPathDressupHoldingTags.py b/src/Mod/Path/PathTests/TestPathDressupHoldingTags.py index b4776f22ea..d6adb06d09 100644 --- a/src/Mod/Path/PathTests/TestPathDressupHoldingTags.py +++ b/src/Mod/Path/PathTests/TestPathDressupHoldingTags.py @@ -94,18 +94,15 @@ class TagTestCaseBase(unittest.TestCase): if math.fabs(v1 - v2) > slack: self.fail("%f != %f" % (v1, v2)) - def assertTrapezoid(self, edgs, tail, points): + def assertLines(self, edgs, tail, points): """Check that there are 5 edges forming a trapezoid.""" edges = list(edgs) if tail: edges.append(tail) - self.assertEqual(len(edges), 5) + self.assertEqual(len(edges), len(points) - 1) - self.assertLine(edges[0], points[0], points[1]) - self.assertLine(edges[1], points[1], points[2]) - self.assertLine(edges[2], points[2], points[3]) - self.assertLine(edges[3], points[3], points[4]) - self.assertLine(edges[4], points[4], points[5]) + for i in range(0, len(edges)): + self.assertLine(edges[i], points[i], points[i+1]) class TestTag00BasicHolding(TagTestCaseBase): """Some basid test cases.""" @@ -157,7 +154,7 @@ class TestTag01BasicTag(TagTestCaseBase): # ============= self.assertCylinderAt(tag.core, Vector(100, 200, 17), 2, 5) def test02(self): - """Verify an angled tag has a cone shape with a lid, and cylinder core.""" + """Verify trapezoidal tag has a cone shape with a lid, and cylinder core.""" tag = Tag(0, 0, 18, 5, 45, True) tag.createSolidsAt(0) @@ -185,7 +182,24 @@ class TestTag01BasicTag(TagTestCaseBase): # ============= self.assertIsNone(tag.core) - def test10(self): +class TestTag02SquareTag(TagTestCaseBase): # ============= + """Unit tests for square tags.""" + + def test00(self): + """Verify no intersection.""" + tag = Tag( 0, 0, 4, 7, 90, True, 0) + pt1 = Vector(+5, 5, 0) + pt2 = Vector(-5, 5, 0) + edge = Part.Edge(Part.Line(pt1, pt2)) + + i = tag.intersect(edge) + self.assertIsNotNone(i) + self.assertTrue(i.isComplete()) + self.assertIsNotNone(i.edges) + self.assertFalse(i.edges) + self.assertLine(i.tail, pt1, pt2) + + def test01(self): """Verify intersection of square tag with line ending at tag start.""" tag = Tag( 0, 0, 8, 3, 90, True, 0) edge = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(4, 0, 0))) @@ -196,7 +210,7 @@ class TestTag01BasicTag(TagTestCaseBase): # ============= self.assertLine(i.edges[0], edge.Curve.StartPoint, edge.Curve.EndPoint) self.assertIsNone(i.tail) - def test11(self): + def test02(self): """Verify intersection of square tag with line ending between P1 and P2.""" tag = Tag( 0, 0, 8, 3, 90, True, 0) edge = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(1, 0, 0))) @@ -221,7 +235,7 @@ class TestTag01BasicTag(TagTestCaseBase): # ============= self.assertLine(i.edges[3], p3, p4) self.assertIsNone(i.tail) - def test12(self): + def test03(self): """Verify intesection of square tag with line ending on P2.""" tag = Tag( 0, 0, 8, 3, 90, True, 0) edge = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(-4, 0, 0))) @@ -252,7 +266,7 @@ class TestTag01BasicTag(TagTestCaseBase): # ============= self.assertLine(i.edges[3], p2a, p3) self.assertIsNone(i.tail) - def test13(self): + def test04(self): """Verify plunge down is inserted for square tag on exit.""" tag = Tag( 0, 0, 8, 3, 90, True, 0) edge = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(-5, 0, 0))) @@ -274,8 +288,78 @@ class TestTag01BasicTag(TagTestCaseBase): # ============= self.assertIsNotNone(i.tail) self.assertLine(i.tail, p4, p5) - def test20(self): - """Veify intersection of angled tag with line ending before P1.""" + def test05(self): + """Verify all lines between P0 and P3 are added.""" + tag = Tag( 0, 0, 4, 7, 90, True, 0) + e0 = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(+2, 0, 0))) + e1 = Part.Edge(Part.Line(e0.Curve.EndPoint, Vector(+1, 0, 0))) + e2 = Part.Edge(Part.Line(e1.Curve.EndPoint, Vector(+0.5, 0, 0))) + e3 = Part.Edge(Part.Line(e2.Curve.EndPoint, Vector(-0.5, 0, 0))) + e4 = Part.Edge(Part.Line(e3.Curve.EndPoint, Vector(-1, 0, 0))) + e5 = Part.Edge(Part.Line(e4.Curve.EndPoint, Vector(-2, 0, 0))) + e6 = Part.Edge(Part.Line(e5.Curve.EndPoint, Vector(-5, 0, 0))) + + i = tag + for e in [e0, e1, e2, e3, e4, e5]: + i = i.intersect(e) + self.assertFalse(i.isComplete()) + i = i.intersect(e6) + self.assertTrue(i.isComplete()) + + pt0 = Vector(2, 0, 0) + pt1 = Vector(2, 0, 7) + pt2 = Vector(1, 0, 7) + pt3 = Vector(0.5, 0, 7) + pt4 = Vector(-0.5, 0, 7) + pt5 = Vector(-1, 0, 7) + pt6 = Vector(-2, 0, 7) + + self.assertEqual(len(i.edges), 8) + self.assertLines(i.edges, i.tail, [e0.Curve.StartPoint, pt0, pt1, pt2, pt3, pt4, pt5, pt6, e6.Curve.StartPoint, e6.Curve.EndPoint]) + self.assertIsNotNone(i.tail) + + def test06(self): + """Verify intersection of different z levels.""" + tag = Tag( 0, 0, 4, 7, 90, True, 0) + # for all lines below 7 we get the trapezoid + for i in range(0, 7): + p0 = Vector(5, 0, i) + p1 = Vector(2, 0, i) + p2 = Vector(2, 0, 7) + p3 = Vector(-2, 0, 7) + p4 = Vector(-2, 0, i) + p5 = Vector(-5, 0, i) + edge = Part.Edge(Part.Line(p0, p5)) + s = tag.intersect(edge) + self.assertTrue(s.isComplete()) + self.assertLines(s.edges, s.tail, [p0, p1, p2, p3, p4, p5]) + + # for all edges at height or above the original line is used + for i in range(7, 9): + edge = Part.Edge(Part.Line(Vector(5, 0, i), Vector(-5, 0, i))) + s = tag.intersect(edge) + self.assertTrue(s.isComplete()) + self.assertLine(s.tail, edge.Curve.StartPoint, edge.Curve.EndPoint) + +class TestTag03TrapezoidTag(TagTestCaseBase): # ============= + """Unit tests for trapezoid tags.""" + + def test00(self): + """Verify no intersection.""" + tag = Tag( 0, 0, 8, 3, 45, True, 0) + pt1 = Vector(+5, 5, 0) + pt2 = Vector(-5, 5, 0) + edge = Part.Edge(Part.Line(pt1, pt2)) + + i = tag.intersect(edge) + self.assertIsNotNone(i) + self.assertTrue(i.isComplete()) + self.assertIsNotNone(i.edges) + self.assertFalse(i.edges) + self.assertLine(i.tail, pt1, pt2) + + def test01(self): + """Veify intersection of trapezoid tag with line ending before P1.""" tag = Tag( 0, 0, 8, 3, 45, True, 0) edge = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(4, 0, 0))) @@ -309,8 +393,8 @@ class TestTag01BasicTag(TagTestCaseBase): # ============= self.assertLine(i.edges[2], p2, p3) self.assertIsNone(i.tail) - def test21(self): - """Verify intersection of angled tag with line ending between P1 and P2""" + def test02(self): + """Verify intersection of trapezoid tag with line ending between P1 and P2""" tag = Tag( 0, 0, 8, 3, 45, True, 0) edge = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(1, 0, 0))) @@ -332,21 +416,18 @@ class TestTag01BasicTag(TagTestCaseBase): # ============= self.assertLine(i.edges[2], p2, p3) self.assertIsNone(i.tail) - def test22(self): - """Verify intersection of angled tag with edge ending on P2.""" + def test03(self): + """Verify intersection of trapezoid tag with edge ending on P2.""" tag = Tag( 0, 0, 8, 3, 45, True, 0) edge = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(-1, 0, 0))) i = tag.intersect(edge) self.assertEqual(i.state, Tag.Intersection.P2) - self.assertEqual(len(i.edges), 3) p0 = Vector(edge.Curve.StartPoint) p1 = Vector(4, 0, 0) p2 = Vector(1, 0, 3) p3 = Vector(-1, 0, 3) - self.assertLine(i.edges[0], p0, p1) - self.assertLine(i.edges[1], p1, p2) - self.assertLine(i.edges[2], p2, p3) + self.assertLines(i.edges, i.tail, [p0, p1, p2, p3]) self.assertIsNone(i.tail) # make sure we get the same result if there's another edge @@ -355,10 +436,7 @@ class TestTag01BasicTag(TagTestCaseBase): # ============= edge = Part.Edge(Part.Line(edge.Curve.EndPoint, Vector(-1, 0, 0))) i = i.intersect(edge) self.assertEqual(i.state, Tag.Intersection.P2) - self.assertEqual(len(i.edges), 3) - self.assertLine(i.edges[0], p0, p1) - self.assertLine(i.edges[1], p1, p2) - self.assertLine(i.edges[2], p2, p3) + self.assertLines(i.edges, i.tail, [p0, p1, p2, p3]) self.assertIsNone(i.tail) # and also if the last segment doesn't cross the entire plateau @@ -367,31 +445,23 @@ class TestTag01BasicTag(TagTestCaseBase): # ============= edge = Part.Edge(Part.Line(edge.Curve.EndPoint, Vector(-1, 0, 0))) i = i.intersect(edge) self.assertEqual(i.state, Tag.Intersection.P2) - self.assertEqual(len(i.edges), 4) p2a = Vector(0.5, 0, 3) - self.assertLine(i.edges[0], p0, p1) - self.assertLine(i.edges[1], p1, p2) - self.assertLine(i.edges[2], p2, p2a) - self.assertLine(i.edges[3], p2a, p3) + self.assertLines(i.edges, i.tail, [p0, p1, p2, p2a, p3]) self.assertIsNone(i.tail) - def test23(self): - """Verify proper down plunge on angled tag exit.""" + def test04(self): + """Verify proper down plunge on trapezoid tag exit.""" tag = Tag( 0, 0, 8, 3, 45, True, 0) edge = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(-2, 0, 0))) i = tag.intersect(edge) self.assertEqual(i.state, Tag.Intersection.P2) - self.assertEqual(len(i.edges), 4) p0 = Vector(5, 0, 0) p1 = Vector(4, 0, 0) p2 = Vector(1, 0, 3) p3 = Vector(-1, 0, 3) p4 = Vector(-2, 0, 2) - self.assertLine(i.edges[0], p0, p1) - self.assertLine(i.edges[1], p1, p2) - self.assertLine(i.edges[2], p2, p3) - self.assertLine(i.edges[3], p3, p4) + self.assertLines(i.edges, i.tail, [p0, p1, p2, p3, p4]) self.assertIsNone(i.tail) # make sure adding another segment doesn't change the state @@ -418,11 +488,7 @@ class TestTag01BasicTag(TagTestCaseBase): # ============= i = tag.intersect(edge) self.assertEqual(i.state, Tag.Intersection.P3) self.assertTrue(i.isComplete()) - self.assertEqual(len(i.edges), 4) - self.assertLine(i.edges[0], p0, p1) - self.assertLine(i.edges[1], p1, p2) - self.assertLine(i.edges[2], p2, p3) - self.assertLine(i.edges[3], p3, p6) + self.assertLines(i.edges, i.tail, [p0, p1, p2, p3, p6]) self.assertIsNone(i.tail) # verify tail is added as well @@ -430,307 +496,10 @@ class TestTag01BasicTag(TagTestCaseBase): # ============= i = tag.intersect(edge) self.assertEqual(i.state, Tag.Intersection.P3) self.assertTrue(i.isComplete()) - self.assertEqual(len(i.edges), 4) - self.assertLine(i.edges[0], p0, p1) - self.assertLine(i.edges[1], p1, p2) - self.assertLine(i.edges[2], p2, p3) - self.assertLine(i.edges[3], p3, p6) + self.assertLines(i.edges, i.tail, [p0, p1, p2, p3, p6, edge.Curve.EndPoint]) self.assertIsNotNone(i.tail) - self.assertLine(i.tail, p6, edge.Curve.EndPoint) - -class TestTag02SquareTag(TagTestCaseBase): # ============= - """Unit tests for square tags.""" - - def test00(self): - """Verify no intersection.""" - tag = Tag( 0, 0, 4, 7, 90, True, 0) - pt1 = Vector(+5, 5, 0) - pt2 = Vector(-5, 5, 0) - edge = Part.Edge(Part.Line(pt1, pt2)) - - i = tag.intersect(edge) - self.assertIsNotNone(i) - self.assertTrue(i.isComplete()) - self.assertIsNotNone(i.edges) - self.assertFalse(i.edges) - self.assertLine(i.tail, pt1, pt2) - - def test01(self): - """Verify a straight line passing through tag is split up into 5 segments.""" - tag = Tag( 0, 0, 4, 7, 90, True, 0) - pt1 = Vector(+5, 0, 0) - pt2 = Vector(-5, 0, 0) - edge = Part.Edge(Part.Line(pt1, pt2)) - - i = tag.intersect(edge) - self.assertIsNotNone(i) - self.assertTrue(i.isComplete()) - - pt0a = Vector(+2, 0, 0) - pt0b = Vector(+2, 0, 7) - pt0c = Vector(-2, 0, 7) - pt0d = Vector(-2, 0, 0) - - self.assertEqual(len(i.edges), 4) - self.assertLine(i.edges[0], pt1, pt0a) - self.assertLine(i.edges[1], pt0a, pt0b) - self.assertLine(i.edges[2], pt0b, pt0c) - self.assertLine(i.edges[3], pt0c, pt0d) - self.assertLine(i.tail, pt0d, pt2) - - - def test02(self): - """Verify line is accounted for if it reaches P0.""" - tag = Tag( 0, 0, 4, 7, 90, True, 0) - edge = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(2, 0, 0))) - - i = tag.intersect(edge) - self.assertFalse(i.isComplete()) - - self.assertEqual(len(i.edges), 1) - self.assertLine(i.edges[0], edge.Curve.StartPoint, edge.Curve.EndPoint) - self.assertIsNone(i.tail) - - - def test03(self): - """Verify line is accounted for if it reaches beyond P1.""" - tag = Tag( 0, 0, 4, 7, 90, True, 0) - edge = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(1, 0, 0))) - - i = tag.intersect(edge) - self.assertFalse(i.isComplete()) - - pt0a = Vector(+2, 0, 0) - pt0b = Vector(+2, 0, 7) - pt1a = Vector(+1, 0, 7) - - self.assertEqual(len(i.edges), 3) - self.assertLine(i.edges[0], edge.Curve.StartPoint, pt0a) - self.assertLine(i.edges[1], pt0a, pt0b) - self.assertLine(i.edges[2], pt0b, pt1a) - self.assertIsNone(i.tail) - - - def test04(self): - """Verify line is accounted for if it reaches beyond P2.""" - tag = Tag( 0, 0, 4, 7, 90, True, 0) - edge = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(-1, 0, 0))) - - i = tag.intersect(edge) - self.assertFalse(i.isComplete()) - - pt0a = Vector(+2, 0, 0) - pt0b = Vector(+2, 0, 7) - pt1a = Vector(-1, 0, 7) - - self.assertEqual(len(i.edges), 3) - self.assertLine(i.edges[0], edge.Curve.StartPoint, pt0a) - self.assertLine(i.edges[1], pt0a, pt0b) - self.assertLine(i.edges[2], pt0b, pt1a) - self.assertIsNone(i.tail) def test05(self): - """Verify line is accounted for if it lies entirely between P1 and P2.""" - tag = Tag( 0, 0, 4, 7, 90, True, 0) - e1 = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(+1, 0, 0))) - - i = tag.intersect(e1) - self.assertFalse(i.isComplete()) - - e2 = Part.Edge(Part.Line(e1.Curve.EndPoint, Vector(0,0,0))) - i = i.intersect(e2) - - pt0a = Vector(+2, 0, 0) - pt0b = Vector(+2, 0, 7) - pt1a = Vector(+1, 0, 7) - pt1b = Vector( 0, 0, 7) - - self.assertEqual(len(i.edges), 4) - self.assertLine(i.edges[0], e1.Curve.StartPoint, pt0a) - self.assertLine(i.edges[1], pt0a, pt0b) - self.assertLine(i.edges[2], pt0b, pt1a) - self.assertLine(i.edges[3], pt1a, pt1b) - self.assertIsNone(i.tail) - - def test06(self): - """Verify all lines between P0 and P3 are added.""" - tag = Tag( 0, 0, 4, 7, 90, True, 0) - e0 = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(+2, 0, 0))) - e1 = Part.Edge(Part.Line(e0.Curve.EndPoint, Vector(+1, 0, 0))) - e2 = Part.Edge(Part.Line(e1.Curve.EndPoint, Vector(+0.5, 0, 0))) - e3 = Part.Edge(Part.Line(e2.Curve.EndPoint, Vector(-0.5, 0, 0))) - e4 = Part.Edge(Part.Line(e3.Curve.EndPoint, Vector(-1, 0, 0))) - e5 = Part.Edge(Part.Line(e4.Curve.EndPoint, Vector(-2, 0, 0))) - e6 = Part.Edge(Part.Line(e5.Curve.EndPoint, Vector(-5, 0, 0))) - - i = tag - for e in [e0, e1, e2, e3, e4, e5]: - i = i.intersect(e) - self.assertFalse(i.isComplete()) - i = i.intersect(e6) - self.assertTrue(i.isComplete()) - - pt0 = Vector(2, 0, 0) - pt1 = Vector(2, 0, 7) - pt2 = Vector(1, 0, 7) - pt3 = Vector(0.5, 0, 7) - pt4 = Vector(-0.5, 0, 7) - pt5 = Vector(-1, 0, 7) - pt6 = Vector(-2, 0, 7) - - self.assertEqual(len(i.edges), 8) - - self.assertLine(i.edges[0], e0.Curve.StartPoint, pt0) - self.assertLine(i.edges[1], pt0, pt1) - self.assertLine(i.edges[2], pt1, pt2) - self.assertLine(i.edges[3], pt2, pt3) - self.assertLine(i.edges[4], pt3, pt4) - self.assertLine(i.edges[5], pt4, pt5) - self.assertLine(i.edges[6], pt5, pt6) - self.assertLine(i.edges[7], pt6, e5.Curve.EndPoint) - self.assertTrue(i.isComplete()) - - self.assertIsNotNone(i.tail) - self.assertLine(i.tail, e6.Curve.StartPoint, e6.Curve.EndPoint) - - def test07(self): - """Verify intersection of different z levels.""" - tag = Tag( 0, 0, 4, 7, 90, True, 0) - # for all lines below 7 we get the trapezoid - for i in range(0, 7): - p0 = Vector(5, 0, i) - p1 = Vector(2, 0, i) - p2 = Vector(2, 0, 7) - p3 = Vector(-2, 0, 7) - p4 = Vector(-2, 0, i) - p5 = Vector(-5, 0, i) - edge = Part.Edge(Part.Line(p0, p5)) - s = tag.intersect(edge) - self.assertTrue(s.isComplete()) - self.assertTrapezoid(s.edges, s.tail, [p0, p1, p2, p3, p4, p5]) - - # for all edges at height or above the original line is used - for i in range(7, 9): - edge = Part.Edge(Part.Line(Vector(5, 0, i), Vector(-5, 0, i))) - s = tag.intersect(edge) - self.assertTrue(s.isComplete()) - self.assertLine(s.tail, edge.Curve.StartPoint, edge.Curve.EndPoint) - -class TestTag03AngledTag(TagTestCaseBase): # ============= - """Unit tests for trapezoid tags.""" - - def test00(self): - """Verify no intersection.""" - tag = Tag( 0, 0, 8, 3, 45, True, 0) - pt1 = Vector(+5, 5, 0) - pt2 = Vector(-5, 5, 0) - edge = Part.Edge(Part.Line(pt1, pt2)) - - i = tag.intersect(edge) - self.assertIsNotNone(i) - self.assertTrue(i.isComplete()) - self.assertIsNotNone(i.edges) - self.assertFalse(i.edges) - self.assertLine(i.tail, pt1, pt2) - - def test01(self): - """Verify a straight line passing through tag is split into 5 segments.""" - tag = Tag( 0, 0, 8, 3, 45, True, 0) - pt1 = Vector(+5, 0, 0) - pt2 = Vector(-5, 0, 0) - edge = Part.Edge(Part.Line(pt1, pt2)) - - i = tag.intersect(edge) - self.assertIsNotNone(i) - self.assertTrue(i.isComplete()) - - pt0a = Vector(+4, 0, 0) - pt0b = Vector(+1, 0, 3) - pt0c = Vector(-1, 0, 3) - pt0d = Vector(-4, 0, 0) - - self.assertEqual(len(i.edges), 4) - self.assertLine(i.edges[0], pt1, pt0a) - self.assertLine(i.edges[1], pt0a, pt0b) - self.assertLine(i.edges[2], pt0b, pt0c) - self.assertLine(i.edges[3], pt0c, pt0d) - self.assertLine(i.tail, pt0d, pt2) - - - def test02(self): - """Verify line is accounted for if it reaches P0.""" - tag = Tag( 0, 0, 8, 3, 45, True, 0) - edge = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(4, 0, 0))) - - i = tag.intersect(edge) - self.assertFalse(i.isComplete()) - - self.assertEqual(len(i.edges), 1) - self.assertLine(i.edges[0], edge.Curve.StartPoint, edge.Curve.EndPoint) - self.assertIsNone(i.tail) - - - def test03(self): - """Verify line is accounted for if it reaches beyond P1.""" - tag = Tag( 0, 0, 8, 3, 45, True, 0) - edge = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(0.5, 0, 0))) - - i = tag.intersect(edge) - self.assertFalse(i.isComplete()) - - pt0a = Vector(+4, 0, 0) - pt0b = Vector(+1, 0, 3) - pt1a = Vector(+0.5, 0, 3) - - self.assertEqual(len(i.edges), 3) - self.assertLine(i.edges[0], edge.Curve.StartPoint, pt0a) - self.assertLine(i.edges[1], pt0a, pt0b) - self.assertLine(i.edges[2], pt0b, pt1a) - self.assertIsNone(i.tail) - - - def test04(self): - """Verify line is accounted for if it reaches beyond P2.""" - tag = Tag( 0, 0, 8, 3, 45, True, 0) - edge = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(-1, 0, 0))) - - i = tag.intersect(edge) - self.assertFalse(i.isComplete()) - - pt0a = Vector(+4, 0, 0) - pt0b = Vector(+1, 0, 3) - pt1a = Vector(-1, 0, 3) - - self.assertEqual(len(i.edges), 3) - self.assertLine(i.edges[0], edge.Curve.StartPoint, pt0a) - self.assertLine(i.edges[1], pt0a, pt0b) - self.assertLine(i.edges[2], pt0b, pt1a) - self.assertIsNone(i.tail) - - def test05(self): - """Verify a line is accounted for if it lies entirely between P1 and P2.""" - tag = Tag( 0, 0, 8, 3, 45, True, 0) - e1 = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(+0.5, 0, 0))) - - i = tag.intersect(e1) - self.assertFalse(i.isComplete()) - - e2 = Part.Edge(Part.Line(e1.Curve.EndPoint, Vector(0,0,0))) - i = i.intersect(e2) - - pt0a = Vector(+4, 0, 0) - pt0b = Vector(+1, 0, 3) - pt1a = Vector(+0.5, 0, 3) - pt1b = Vector( 0, 0, 3) - - self.assertEqual(len(i.edges), 4) - self.assertLine(i.edges[0], e1.Curve.StartPoint, pt0a) - self.assertLine(i.edges[1], pt0a, pt0b) - self.assertLine(i.edges[2], pt0b, pt1a) - self.assertLine(i.edges[3], pt1a, pt1b) - self.assertIsNone(i.tail) - - def test06(self): """Verify all lines between P0 and P3 are added.""" tag = Tag( 0, 0, 8, 3, 45, True, 0) e0 = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(+4, 0, 0))) @@ -748,31 +517,19 @@ class TestTag03AngledTag(TagTestCaseBase): # ============= i = i.intersect(e6) self.assertTrue(i.isComplete()) - pt0 = Vector(4, 0, 0) - pt1 = Vector(2, 0, 2) - pt2 = Vector(1, 0, 3) - pt3 = Vector(0.5, 0, 3) - pt4 = Vector(-0.5, 0, 3) - pt5 = Vector(-1, 0, 3) - pt6 = Vector(-2, 0, 2) - pt7 = Vector(-4, 0, 0) - - #self.assertEqual(len(i.edges), 8) - - self.assertLine(i.edges[0], e0.Curve.StartPoint, pt0) - self.assertLine(i.edges[1], pt0, pt1) - self.assertLine(i.edges[2], pt1, pt2) - self.assertLine(i.edges[3], pt2, pt3) - self.assertLine(i.edges[4], pt3, pt4) - self.assertLine(i.edges[5], pt4, pt5) - self.assertLine(i.edges[6], pt5, pt6) - self.assertLine(i.edges[7], pt6, pt7) - self.assertTrue(i.isComplete()) + p0 = Vector(4, 0, 0) + p1 = Vector(2, 0, 2) + p2 = Vector(1, 0, 3) + p3 = Vector(0.5, 0, 3) + p4 = Vector(-0.5, 0, 3) + p5 = Vector(-1, 0, 3) + p6 = Vector(-2, 0, 2) + p7 = Vector(-4, 0, 0) + self.assertLines(i.edges, i.tail, [e0.Curve.StartPoint, p0, p1, p2, p3, p4, p5, p6, p7, e6.Curve.EndPoint]) self.assertIsNotNone(i.tail) - self.assertLine(i.tail, pt7, e6.Curve.EndPoint) - def test07(self): + def test06(self): """Verify intersection for different z levels.""" tag = Tag( 0, 0, 8, 3, 45, True, 0) # for all lines below 3 we get the trapezoid @@ -786,7 +543,7 @@ class TestTag03AngledTag(TagTestCaseBase): # ============= edge = Part.Edge(Part.Line(p0, p5)) s = tag.intersect(edge) self.assertTrue(s.isComplete()) - self.assertTrapezoid(s.edges, s.tail, [p0, p1, p2, p3, p4, p5]) + self.assertLines(s.edges, s.tail, [p0, p1, p2, p3, p4, p5]) # for all edges at height or above the original line is used for i in range(3, 5): @@ -795,3 +552,88 @@ class TestTag03AngledTag(TagTestCaseBase): # ============= self.assertTrue(s.isComplete()) self.assertLine(s.tail, edge.Curve.StartPoint, edge.Curve.EndPoint) + +class TestTag04TriangularTag(TagTestCaseBase): # ======================== + """Unit tests for tags that take on a triangular shape.""" + + def test00(self): + """Verify intersection of triangular tag with line ending at tag start.""" + tag = Tag( 0, 0, 8, 7, 45, True, 0) + edge = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(4, 0, 0))) + + i = tag.intersect(edge) + self.assertEqual(i.state, Tag.Intersection.P0) + self.assertEqual(len(i.edges), 1) + self.assertLine(i.edges[0], edge.Curve.StartPoint, edge.Curve.EndPoint) + self.assertIsNone(i.tail) + + def test01(self): + """Verify intersection of triangular tag with line ending between P0 and P1.""" + tag = Tag( 0, 0, 8, 7, 45, True, 0) + edge = Part.Edge(Part.Line(Vector(5, 0, 0), Vector(3, 0, 0))) + + i = tag.intersect(edge) + self.assertEqual(i.state, Tag.Intersection.P0) + p1 = Vector(4, 0, 0) + p2 = Vector(3, 0, 1) + self.assertLines(i.edges, i.tail, [edge.Curve.StartPoint, p1, p2]) + self.assertIsNone(i.tail) + + # verify we stay in P1 if we add another segment + edge = Part.Edge(Part.Line(edge.Curve.EndPoint, Vector(1, 0, 0))) + i = i.intersect(edge) + self.assertEqual(i.state, Tag.Intersection.P0) + self.assertEqual(len(i.edges), 3) + p3 = Vector(1, 0, 3) + self.assertLine(i.edges[2], p2, p3) + self.assertIsNone(i.tail) + + def test02(self): + """Verify proper down plunge on exit of triangular tag.""" + tag = Tag( 0, 0, 8, 7, 45, True, 0) + + p0 = Vector(5, 0, 0) + p1 = Vector(4, 0, 0) + p2 = Vector(0, 0, 4) + edge = Part.Edge(Part.Line(p0, FreeCAD.Vector(0,0,0))) + i = tag.intersect(edge) + self.assertEqual(i.state, Tag.Intersection.P2) + self.assertEqual(len(i.edges), 2) + self.assertLines(i.edges, i.tail, [p0, p1, p2]) + + # adding another segment doesn't make a difference + edge = Part.Edge(Part.Line(edge.Curve.EndPoint, FreeCAD.Vector(-3,0,0))) + i = i.intersect(edge) + self.assertEqual(i.state, Tag.Intersection.P2) + self.assertEqual(len(i.edges), 3) + p3 = Vector(-3, 0, 1) + self.assertLines(i.edges, i.tail, [p0, p1, p2, p3]) + + # same result if all is one line + edge = Part.Edge(Part.Line(p0, edge.Curve.EndPoint)) + i = tag.intersect(edge) + self.assertEqual(i.state, Tag.Intersection.P2) + self.assertLines(i.edges, i.tail, [p0, p1, p2, p3]) + + def test03(self): + """Verify triangular tag shap on intersection.""" + tag = Tag( 0, 0, 8, 7, 45, True, 0) + + p0 = Vector(5, 0, 0) + p1 = Vector(4, 0, 0) + p2 = Vector(0, 0, 4) + p3 = Vector(-4, 0, 0) + edge = Part.Edge(Part.Line(p0, p3)) + i = tag.intersect(edge) + self.assertTrue(i.isComplete()) + self.assertLines(i.edges, i.tail, [p0, p1, p2, p3]) + self.assertIsNone(i.tail) + + # this should also work if there is some excess, aka tail + p4 = Vector(-5, 0, 0) + edge = Part.Edge(Part.Line(p0, p4)) + i = tag.intersect(edge) + self.assertTrue(i.isComplete()) + self.assertLines(i.edges, i.tail, [p0, p1, p2, p3, p4]) + self.assertIsNotNone(i.tail) + diff --git a/src/Mod/Path/TestPathApp.py b/src/Mod/Path/TestPathApp.py index 0d3a7818b2..53da7186f2 100644 --- a/src/Mod/Path/TestPathApp.py +++ b/src/Mod/Path/TestPathApp.py @@ -29,5 +29,6 @@ from PathTests.TestPathPost import PathPostTestCases from PathTests.TestPathDressupHoldingTags import TestTag00BasicHolding from PathTests.TestPathDressupHoldingTags import TestTag01BasicTag from PathTests.TestPathDressupHoldingTags import TestTag02SquareTag -from PathTests.TestPathDressupHoldingTags import TestTag03AngledTag +from PathTests.TestPathDressupHoldingTags import TestTag03TrapezoidTag +from PathTests.TestPathDressupHoldingTags import TestTag04TriangularTag