Enhanced isVertical/isHorizontal functions accepting a Vector, and Edge or a Face now.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user