diff --git a/src/Mod/Path/PathTests/PathTestUtils.py b/src/Mod/Path/PathTests/PathTestUtils.py index 8ea63aa58e..b247aa0ab6 100644 --- a/src/Mod/Path/PathTests/PathTestUtils.py +++ b/src/Mod/Path/PathTests/PathTestUtils.py @@ -181,3 +181,9 @@ class PathTestBase(unittest.TestCase): self.assertCoincide(valueAt(e1, 0.80), valueAt(e2, 0.20)) self.assertCoincide(valueAt(e1, 0.90), valueAt(e2, 0.10)) + def assertPointsMatch(self, pts0, pts1): + """Verify that two arrays of points are the same, including their order.""" + self.assertEqual(len(pts0), len(pts1)) + for i in range(len(pts0)): + self.assertCoincide(pts0[i], pts1[i]) + diff --git a/src/Mod/Path/PathTests/TestPathOpTools.py b/src/Mod/Path/PathTests/TestPathOpTools.py index 7ee54417f9..e251bfd70c 100644 --- a/src/Mod/Path/PathTests/TestPathOpTools.py +++ b/src/Mod/Path/PathTests/TestPathOpTools.py @@ -72,6 +72,12 @@ def makeWire(pts): edges.append(Part.Edge(Part.LineSegment(last, first))) return Part.Wire(edges) +def wireMarkers(wire): + pts = [wire.Edges[0].valueAt(wire.Edges[0].FirstParameter)] + for edge in wire.Edges: + pts.append(edge.valueAt(edge.LastParameter)) + return pts + class TestPathOpTools(PathTestUtils.PathTestBase): @@ -780,3 +786,80 @@ class TestPathOpTools(PathTestUtils.PathTestBase): rEdges = [e for e in wire.Edges if Part.Circle == type(e.Curve)] self.assertEqual(0, len(rEdges)) + def test50(self): + '''Orient an already oriented wire''' + p0 = Vector() + p1 = Vector(1, 2, 3) + p2 = Vector(2, 3, 4) + pts = [p0, p1, p2] + + e0 = Part.Edge(Part.LineSegment(p0, p1)) + e1 = Part.Edge(Part.LineSegment(p1, p2)) + + wire = PathOpTools.orientWire(Part.Wire([e0, e1])) + wirePts = wireMarkers(wire) + + self.assertPointsMatch(wirePts, pts) + + def test51(self): + '''Orient a potentially misoriented wire''' + p0 = Vector() + p1 = Vector(1, 2, 3) + p2 = Vector(2, 3, 4) + pts = [p0, p1, p2] + + e0p = Part.Edge(Part.LineSegment(p0, p1)) + e0m = Part.Edge(Part.LineSegment(p1, p0)) + e1p = Part.Edge(Part.LineSegment(p1, p2)) + e1m = Part.Edge(Part.LineSegment(p2, p1)) + + wire = PathOpTools.orientWire(Part.Wire([e0p, e1p])) + self.assertPointsMatch(wireMarkers(wire), pts) + + wire = PathOpTools.orientWire(Part.Wire([e0p, e1m])) + self.assertPointsMatch(wireMarkers(wire), pts) + + wire = PathOpTools.orientWire(Part.Wire([e0m, e1p])) + self.assertPointsMatch(wireMarkers(wire), pts) + + wire = PathOpTools.orientWire(Part.Wire([e0m, e1m])) + self.assertPointsMatch(wireMarkers(wire), pts) + + def test52(self): + '''Orient a potentially misoriented longer wire''' + p0 = Vector() + p1 = Vector(1, 2, 3) + p2 = Vector(4, 5, 6) + p3 = Vector(7, 8, 9) + pts = [p0, p1, p2, p3] + + e0p = Part.Edge(Part.LineSegment(p0, p1)) + e0m = Part.Edge(Part.LineSegment(p1, p0)) + e1p = Part.Edge(Part.LineSegment(p1, p2)) + e1m = Part.Edge(Part.LineSegment(p2, p1)) + e2p = Part.Edge(Part.LineSegment(p2, p3)) + e2m = Part.Edge(Part.LineSegment(p3, p2)) + + wire = PathOpTools.orientWire(Part.Wire([e0p, e1p, e2p])) + self.assertPointsMatch(wireMarkers(wire), pts) + + wire = PathOpTools.orientWire(Part.Wire([e0p, e1m, e2p])) + self.assertPointsMatch(wireMarkers(wire), pts) + + wire = PathOpTools.orientWire(Part.Wire([e0m, e1p, e2p])) + self.assertPointsMatch(wireMarkers(wire), pts) + + wire = PathOpTools.orientWire(Part.Wire([e0m, e1m, e2p])) + self.assertPointsMatch(wireMarkers(wire), pts) + + wire = PathOpTools.orientWire(Part.Wire([e0p, e1p, e2m])) + self.assertPointsMatch(wireMarkers(wire), pts) + + wire = PathOpTools.orientWire(Part.Wire([e0p, e1m, e2m])) + self.assertPointsMatch(wireMarkers(wire), pts) + + wire = PathOpTools.orientWire(Part.Wire([e0m, e1p, e2m])) + self.assertPointsMatch(wireMarkers(wire), pts) + + wire = PathOpTools.orientWire(Part.Wire([e0m, e1m, e2m])) + self.assertPointsMatch(wireMarkers(wire), pts)