From 19287fc8a2e27bc2795cdffc48d534dc0ff648d7 Mon Sep 17 00:00:00 2001 From: Markus Lampert Date: Mon, 18 Sep 2017 00:44:06 -0700 Subject: [PATCH] Enhanced isVertical/isHorizontal functions accepting a Vector, and Edge or a Face now. --- src/Mod/Path/PathScripts/PathGeom.py | 45 ++++++++++++-- src/Mod/Path/PathTests/TestPathGeom.py | 86 ++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 6 deletions(-) diff --git a/src/Mod/Path/PathScripts/PathGeom.py b/src/Mod/Path/PathScripts/PathGeom.py index d6671c4f49..0d87340e8f 100644 --- a/src/Mod/Path/PathScripts/PathGeom.py +++ b/src/Mod/Path/PathScripts/PathGeom.py @@ -29,11 +29,16 @@ import Path import PathScripts.PathLog as PathLog from FreeCAD import Vector +from PySide import QtCore PathGeomTolerance = 0.000001 #PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) +# Qt tanslation handling +def translate(context, text, disambig=None): + return QtCore.QCoreApplication.translate(context, text, disambig) + class Side: """Class to determine and define the side a Path is on, or Vectors are in relation to each other.""" Left = +1 @@ -133,14 +138,42 @@ class PathGeom: return a @classmethod - def isVertical(cls, vector): - '''isVertical(vector) ... answer True if vector points into Z''' - return PathGeom.pointsCoincide(vector, FreeCAD.Vector(0, 0, 1)) or PathGeom.pointsCoincide(vector, FreeCAD.Vector(0, 0, -1)) + def isVertical(cls, obj): + '''isVertical(obj) ... answer True if obj points into Z''' + if type(obj) == FreeCAD.Vector: + return PathGeom.isRoughly(obj.x, 0) and PathGeom.isRoughly(obj.y, 0) + if obj.ShapeType == 'Face': + if type(obj.Surface) == Part.Plane: + return cls.isHorizontal(obj.Surface.Axis) + if type(obj.Surface) == Part.Cylinder: + return cls.isVertical(obj.Surface.Axis) + PathLog.error(translate('PathGeom', "isVertical(%s) not supported") % type(obj.Surface)) + if obj.ShapeType == 'Edge': + if type(obj.Curve) == Part.Line: + return cls.isVertical(obj.Vertexes[1].Point - obj.Vertexes[0].Point) + if type(obj.Curve) == Part.Circle: + return cls.isHorizontal(obj.Curve.Axis) + PathLog.error(translate('PathGeom', "isVertical(%s) not supported") % type(obj.Curve)) + PathLog.error(translate('PathGeom', "isVertical(%s) not supported") % obj) @classmethod - def isHorizontal(cls, vector): - '''isHorizontal(vector) ... answer True if vector points into X or Y''' - return PathGeom.pointsCoincide(vector, FreeCAD.Vector(1, 0, 0)) or PathGeom.pointsCoincide(vector, FreeCAD.Vector(-1, 0, 0)) or PathGeom.pointsCoincide(vector, FreeCAD.Vector(0, 1, 0)) or PathGeom.pointsCoincide(vector, FreeCAD.Vector(0, -1, 0)) + def isHorizontal(cls, obj): + '''isHorizontal(obj) ... answer True if obj points into X or Y''' + if type(obj) == FreeCAD.Vector: + return PathGeom.isRoughly(obj.z, 0) + if obj.ShapeType == 'Face': + if type(obj.Surface) == Part.Plane: + return cls.isVertical(obj.Surface.Axis) + if type(obj.Surface) == Part.Cylinder: + return cls.isHorizontal(obj.Surface.Axis) + PathLog.error(translate('PathGeom', "isHorizontal(%s) not supported") % type(obj.Surface)) + if obj.ShapeType == 'Edge': + if type(obj.Curve) == Part.Line: + return cls.isHorizontal(obj.Vertexes[1].Point - obj.Vertexes[0].Point) + if type(obj.Curve) == Part.Circle: + return cls.isVertical(obj.Curve.Axis) + PathLog.error(translate('PathGeom', "isHorizontal(%s) not supported") % type(obj.Curve)) + PathLog.error(translate('PathGeom', "isHorizontal(%s) not supported") % obj) @classmethod diff --git a/src/Mod/Path/PathTests/TestPathGeom.py b/src/Mod/Path/PathTests/TestPathGeom.py index 207df9b614..f75207cc90 100644 --- a/src/Mod/Path/PathTests/TestPathGeom.py +++ b/src/Mod/Path/PathTests/TestPathGeom.py @@ -73,6 +73,92 @@ class TestPathGeom(PathTestBase): self.assertRoughly(PathGeom.diffAngle(-math.pi/4, +3*math.pi/4, 'CCW') / math.pi, 4/4.) self.assertRoughly(PathGeom.diffAngle(-math.pi/4, -1*math.pi/4, 'CCW') / math.pi, 0/4.) + def test02(self): + """Verify isVertical/isHorizontal for Vector""" + self.assertTrue(PathGeom.isVertical(Vector(0, 0, 1))) + self.assertTrue(PathGeom.isVertical(Vector(0, 0, -1))) + self.assertFalse(PathGeom.isVertical(Vector(1, 0, 1))) + self.assertFalse(PathGeom.isVertical(Vector(1, 0, -1))) + + self.assertTrue(PathGeom.isHorizontal(Vector( 1, 0, 0))) + self.assertTrue(PathGeom.isHorizontal(Vector(-1, 0, 0))) + self.assertTrue(PathGeom.isHorizontal(Vector( 0, 1, 0))) + self.assertTrue(PathGeom.isHorizontal(Vector( 0, -1, 0))) + self.assertTrue(PathGeom.isHorizontal(Vector( 1, 1, 0))) + self.assertTrue(PathGeom.isHorizontal(Vector(-1, 1, 0))) + self.assertTrue(PathGeom.isHorizontal(Vector( 1, -1, 0))) + self.assertTrue(PathGeom.isHorizontal(Vector(-1, -1, 0))) + + self.assertFalse(PathGeom.isHorizontal(Vector(0, 1, 1))) + self.assertFalse(PathGeom.isHorizontal(Vector(0, -1, 1))) + self.assertFalse(PathGeom.isHorizontal(Vector(0, 1, -1))) + self.assertFalse(PathGeom.isHorizontal(Vector(0, -1, -1))) + + def test03(self): + """Verify isVertical/isHorizontal for Edges""" + + # lines + self.assertTrue(PathGeom.isVertical(Part.Edge(Part.LineSegment(Vector(-1, -1, -1), Vector(-1, -1, 8))))) + self.assertFalse(PathGeom.isVertical(Part.Edge(Part.LineSegment(Vector(-1, -1, -1), Vector(1, -1, 8))))) + self.assertFalse(PathGeom.isVertical(Part.Edge(Part.LineSegment(Vector(-1, -1, -1), Vector(-1, 1, 8))))) + + self.assertTrue(PathGeom.isHorizontal(Part.Edge(Part.LineSegment(Vector(1, -1, -1), Vector(-1, -1, -1))))) + self.assertTrue(PathGeom.isHorizontal(Part.Edge(Part.LineSegment(Vector(-1, 1, -1), Vector(-1, -1, -1))))) + self.assertTrue(PathGeom.isHorizontal(Part.Edge(Part.LineSegment(Vector(1, 1, -1), Vector(-1, -1, -1))))) + self.assertFalse(PathGeom.isHorizontal(Part.Edge(Part.LineSegment(Vector(1, -1, -1), Vector(1, -1, 8))))) + self.assertFalse(PathGeom.isHorizontal(Part.Edge(Part.LineSegment(Vector(-1, 1, -1), Vector(-1, 1, 8))))) + + # circles + self.assertTrue(PathGeom.isVertical(Part.Edge(Part.makeCircle(4, Vector(), Vector(0, 1, 0))))) + self.assertTrue(PathGeom.isVertical(Part.Edge(Part.makeCircle(4, Vector(), Vector(1, 0, 0))))) + self.assertTrue(PathGeom.isVertical(Part.Edge(Part.makeCircle(4, Vector(), Vector(1, 1, 0))))) + self.assertFalse(PathGeom.isVertical(Part.Edge(Part.makeCircle(4, Vector(), Vector(1, 1, 1))))) + + self.assertTrue(PathGeom.isHorizontal(Part.Edge(Part.makeCircle(4, Vector(), Vector(0, 0, 1))))) + self.assertFalse(PathGeom.isHorizontal(Part.Edge(Part.makeCircle(4, Vector(), Vector(0, 1, 1))))) + self.assertFalse(PathGeom.isHorizontal(Part.Edge(Part.makeCircle(4, Vector(), Vector(1, 0, 1))))) + self.assertFalse(PathGeom.isHorizontal(Part.Edge(Part.makeCircle(4, Vector(), Vector(1, 1, 1))))) + + def test04(self): + """Verify isVertical/isHorizontal for faces""" + + # planes + xPlane = Part.makePlane(100, 100, FreeCAD.Vector(), FreeCAD.Vector(1, 0, 0)) + yPlane = Part.makePlane(100, 100, FreeCAD.Vector(), FreeCAD.Vector(0, 1, 0)) + zPlane = Part.makePlane(100, 100, FreeCAD.Vector(), FreeCAD.Vector(0, 0, 1)) + xyPlane = Part.makePlane(100, 100, FreeCAD.Vector(), FreeCAD.Vector(1, 1, 0)) + xzPlane = Part.makePlane(100, 100, FreeCAD.Vector(), FreeCAD.Vector(1, 0, 1)) + yzPlane = Part.makePlane(100, 100, FreeCAD.Vector(), FreeCAD.Vector(0, 1, 1)) + + self.assertTrue(PathGeom.isVertical(xPlane)) + self.assertTrue(PathGeom.isVertical(yPlane)) + self.assertFalse(PathGeom.isVertical(zPlane)) + self.assertTrue(PathGeom.isVertical(xyPlane)) + self.assertFalse(PathGeom.isVertical(xzPlane)) + self.assertFalse(PathGeom.isVertical(yzPlane)) + + self.assertFalse(PathGeom.isHorizontal(xPlane)) + self.assertFalse(PathGeom.isHorizontal(yPlane)) + self.assertTrue(PathGeom.isHorizontal(zPlane)) + self.assertFalse(PathGeom.isHorizontal(xyPlane)) + self.assertFalse(PathGeom.isHorizontal(xzPlane)) + self.assertFalse(PathGeom.isHorizontal(yzPlane)) + + # cylinders + xCylinder = [f for f in Part.makeCylinder(1, 1, FreeCAD.Vector(), FreeCAD.Vector(1, 0, 0)).Faces if type(f.Surface) == Part.Cylinder][0] + yCylinder = [f for f in Part.makeCylinder(1, 1, FreeCAD.Vector(), FreeCAD.Vector(0, 1, 0)).Faces if type(f.Surface) == Part.Cylinder][0] + zCylinder = [f for f in Part.makeCylinder(1, 1, FreeCAD.Vector(), FreeCAD.Vector(0, 0, 1)).Faces if type(f.Surface) == Part.Cylinder][0] + xyCylinder = [f for f in Part.makeCylinder(1, 1, FreeCAD.Vector(), FreeCAD.Vector(1, 1, 0)).Faces if type(f.Surface) == Part.Cylinder][0] + xzCylinder = [f for f in Part.makeCylinder(1, 1, FreeCAD.Vector(), FreeCAD.Vector(1, 0, 1)).Faces if type(f.Surface) == Part.Cylinder][0] + yzCylinder = [f for f in Part.makeCylinder(1, 1, FreeCAD.Vector(), FreeCAD.Vector(0, 1, 1)).Faces if type(f.Surface) == Part.Cylinder][0] + + self.assertTrue(PathGeom.isHorizontal(xCylinder)) + self.assertTrue(PathGeom.isHorizontal(yCylinder)) + self.assertFalse(PathGeom.isHorizontal(zCylinder)) + self.assertTrue(PathGeom.isHorizontal(xyCylinder)) + self.assertFalse(PathGeom.isHorizontal(xzCylinder)) + self.assertFalse(PathGeom.isHorizontal(yzCylinder)) + def test10(self): """Verify proper geometry objects for G1 and G01 commands are created.""" spt = Vector(1,2,3)