Fixed z=0 issues; added rapid move for square tag that is at the maximum height (or higher).

This commit is contained in:
Markus Lampert 2017-01-17 23:10:00 -08:00
parent 0f4a5b4f95
commit 81ae4f94aa
2 changed files with 36 additions and 16 deletions

View File

@ -171,6 +171,7 @@ class Tag:
self.angle = math.fabs(angle) self.angle = math.fabs(angle)
self.radius = radius self.radius = radius
self.enabled = enabled self.enabled = enabled
self.isSquare = False
def fullWidth(self): def fullWidth(self):
return 2 * self.toolRadius + self.width return 2 * self.toolRadius + self.width
@ -194,6 +195,7 @@ class Tag:
radius = 0 radius = 0
if self.angle == 90 and height > 0: if self.angle == 90 and height > 0:
# cylinder # cylinder
self.isSquare = True
self.solid = Part.makeCylinder(r1, height) self.solid = Part.makeCylinder(r1, height)
radius = min(min(self.radius, r1), self.height) radius = min(min(self.radius, r1), self.height)
debugPrint("Part.makeCone(%f, %f)" % (r1, height)) debugPrint("Part.makeCone(%f, %f)" % (r1, height))
@ -224,7 +226,7 @@ class Tag:
debugPrint("solid.rotate(%f)" % angle) debugPrint("solid.rotate(%f)" % angle)
self.solid.rotate(FreeCAD.Vector(0,0,0), FreeCAD.Vector(0,0,1), angle) self.solid.rotate(FreeCAD.Vector(0,0,0), FreeCAD.Vector(0,0,1), angle)
debugPrint("solid.translate(%s)" % self.originAt(z)) debugPrint("solid.translate(%s)" % self.originAt(z))
self.solid.translate(self.originAt(z - 0.01 * height)) self.solid.translate(self.originAt(z - 0.01 * self.actualHeight))
self.realRadius = radius self.realRadius = radius
if radius != 0: if radius != 0:
debugPrint("makeFillet(%.4f)" % radius) debugPrint("makeFillet(%.4f)" % radius)
@ -287,10 +289,11 @@ class Tag:
class MapWireToTag: class MapWireToTag:
def __init__(self, edge, tag, i, segm): def __init__(self, edge, tag, i, segm, maxZ):
debugEdge(edge, 'MapWireToTag(%.2f, %.2f, %.2f)' % (i.x, i.y, i.z)) debugEdge(edge, 'MapWireToTag(%.2f, %.2f, %.2f)' % (i.x, i.y, i.z))
self.tag = tag self.tag = tag
self.segm = segm self.segm = segm
self.maxZ = maxZ
if PathGeom.pointsCoincide(edge.valueAt(edge.FirstParameter), i): if PathGeom.pointsCoincide(edge.valueAt(edge.FirstParameter), i):
tail = edge tail = edge
self.commands = [] self.commands = []
@ -484,9 +487,21 @@ class MapWireToTag:
if self.edges: if self.edges:
shape = self.shell().common(self.tag.solid) shape = self.shell().common(self.tag.solid)
commands = [] commands = []
rapid = None
for e,flip in self.orderAndFlipEdges(self.cleanupEdges(shape.Edges)): for e,flip in self.orderAndFlipEdges(self.cleanupEdges(shape.Edges)):
debugEdge(e, '++++++++ %s' % ('<' if flip else '>'), False) debugEdge(e, '++++++++ %s' % ('<' if flip else '>'), False)
p1 = e.valueAt(e.FirstParameter)
p2 = e.valueAt(e.LastParameter)
if self.tag.isSquare and (PathGeom.isRoughly(p1.z, self.maxZ) or p1.z > self.maxZ) and (PathGeom.isRoughly(p2.z, self.maxZ) or p2.z > self.maxZ):
rapid = p1 if flip else p2
else:
if rapid:
commands.append(Path.Command('G0', {'X': rapid.x, 'Y': rapid.y, 'Z': rapid.z}))
rapid = None
commands.extend(PathGeom.cmdsForEdge(e, flip, False, self.segm)) commands.extend(PathGeom.cmdsForEdge(e, flip, False, self.segm))
if rapid:
commands.append(Path.Command('G0', {'X': rapid.x, 'Y': rapid.y, 'Z': rapid.z}))
rapid = None
return commands return commands
return [] return []
@ -551,7 +566,7 @@ class PathData:
(minZ, maxZ) = self.findZLimits(edges) (minZ, maxZ) = self.findZLimits(edges)
self.minZ = minZ self.minZ = minZ
self.maxZ = maxZ self.maxZ = maxZ
bottom = [e for e in edges if e.Vertexes[0].Point.z == minZ and e.Vertexes[1].Point.z == minZ] bottom = [e for e in edges if PathGeom.isRoughly(e.Vertexes[0].Point.z, minZ) and PathGeom.isRoughly(e.Vertexes[1].Point.z, minZ)]
wire = Part.Wire(bottom) wire = Part.Wire(bottom)
if wire.isClosed(): if wire.isClosed():
return wire return wire
@ -721,7 +736,7 @@ class ObjectDressup:
def generateTags(self, obj, count): def generateTags(self, obj, count):
if hasattr(self, "pathData"): if hasattr(self, "pathData"):
self.tags = self.pathData.generateTags(obj, count, obj.Width.Value, obj.Height.Value, obj.Angle, obj.Radius.Value, None) self.tags = self.pathData.generateTags(obj, count, obj.Width.Value, obj.Height.Value, obj.Angle, obj.Radius.Value, None)
obj.Positions = [tag.originAt(0) for tag in self.tags] obj.Positions = [tag.originAt(self.pathData.minZ) for tag in self.tags]
obj.Disabled = [] obj.Disabled = []
return False return False
else: else:
@ -740,7 +755,7 @@ class ObjectDressup:
return False return False
return True return True
def createPath(self, obj, edges, tags, rapid): def createPath(self, obj, pathData, tags):
#print("createPath") #print("createPath")
commands = [] commands = []
lastEdge = 0 lastEdge = 0
@ -760,11 +775,11 @@ class ObjectDressup:
self.mappers = [] self.mappers = []
mapper = None mapper = None
while edge or lastEdge < len(edges): while edge or lastEdge < len(pathData.edges):
debugPrint("------- lastEdge = %d/%d.%d/%d" % (lastEdge, lastTag, t, len(tags))) debugPrint("------- lastEdge = %d/%d.%d/%d" % (lastEdge, lastTag, t, len(tags)))
if not edge: if not edge:
edge = edges[lastEdge] edge = pathData.edges[lastEdge]
debugEdge(edge, "======= new edge: %d/%d" % (lastEdge, len(edges))) debugEdge(edge, "======= new edge: %d/%d" % (lastEdge, len(pathData.edges)))
lastEdge += 1 lastEdge += 1
sameTag = None sameTag = None
@ -782,7 +797,7 @@ class ObjectDressup:
t += 1 t += 1
i = tags[tIndex].intersects(edge, edge.FirstParameter) i = tags[tIndex].intersects(edge, edge.FirstParameter)
if i and self.isValidTagStartIntersection(edge, i): if i and self.isValidTagStartIntersection(edge, i):
mapper = MapWireToTag(edge, tags[tIndex], i, segm) mapper = MapWireToTag(edge, tags[tIndex], i, segm, pathData.maxZ)
self.mappers.append(mapper) self.mappers.append(mapper)
edge = mapper.tail edge = mapper.tail
@ -791,7 +806,7 @@ class ObjectDressup:
# gone through all tags, consume edge and move on # gone through all tags, consume edge and move on
if edge: if edge:
debugEdge(edge, '++++++++') debugEdge(edge, '++++++++')
if rapid.isRapid(edge): if pathData.rapid.isRapid(edge):
v = edge.Vertexes[1] v = edge.Vertexes[1]
commands.append(Path.Command('G0', {'X': v.X, 'Y': v.Y, 'Z': v.Z})) commands.append(Path.Command('G0', {'X': v.X, 'Y': v.Y, 'Z': v.Z}))
else: else:
@ -837,7 +852,7 @@ class ObjectDressup:
else: else:
disabled.append(i) disabled.append(i)
tags.append(tag) tags.append(tag)
positions.append(tag.originAt(0)) positions.append(tag.originAt(self.pathData.minZ))
return (tags, positions, disabled) return (tags, positions, disabled)
def execute(self, obj): def execute(self, obj):
@ -890,7 +905,7 @@ class ObjectDressup:
#else: #else:
# debugCylinder(tag.originAt(self.pathData.minZ), tag.fullWidth()/2, tag.actualHeight, "tag-%02d" % tagID) # debugCylinder(tag.originAt(self.pathData.minZ), tag.fullWidth()/2, tag.actualHeight, "tag-%02d" % tagID)
obj.Path = self.createPath(obj, self.pathData.edges, self.tags, self.pathData.rapid) obj.Path = self.createPath(obj, self.pathData, self.tags)
#print("execute - done") #print("execute - done")
def setup(self, obj, generate=False): def setup(self, obj, generate=False):
@ -950,7 +965,8 @@ PathPreferencesPathDressup.RegisterDressup(ObjectDressup)
class TaskPanel: class TaskPanel:
DataX = QtCore.Qt.ItemDataRole.UserRole DataX = QtCore.Qt.ItemDataRole.UserRole
DataY = QtCore.Qt.ItemDataRole.UserRole + 1 DataY = QtCore.Qt.ItemDataRole.UserRole + 1
DataID = QtCore.Qt.ItemDataRole.UserRole + 2 DataZ = QtCore.Qt.ItemDataRole.UserRole + 2
DataID = QtCore.Qt.ItemDataRole.UserRole + 3
def __init__(self, obj, viewProvider, jvoVisibility=None): def __init__(self, obj, viewProvider, jvoVisibility=None):
self.obj = obj self.obj = obj
@ -1030,6 +1046,7 @@ class TaskPanel:
item = QtGui.QListWidgetItem(lbl) item = QtGui.QListWidgetItem(lbl)
item.setData(self.DataX, pos.x) item.setData(self.DataX, pos.x)
item.setData(self.DataY, pos.y) item.setData(self.DataY, pos.y)
item.setData(self.DataZ, pos.z)
item.setData(self.DataID, i) item.setData(self.DataID, i)
if i in self.obj.Disabled: if i in self.obj.Disabled:
item.setCheckState(QtCore.Qt.CheckState.Unchecked) item.setCheckState(QtCore.Qt.CheckState.Unchecked)
@ -1112,7 +1129,8 @@ class TaskPanel:
self.editItem = item.data(self.DataID) self.editItem = item.data(self.DataID)
x = item.data(self.DataX) x = item.data(self.DataX)
y = item.data(self.DataY) y = item.data(self.DataY)
self.getPoint(self.editTagAt, FreeCAD.Vector(x, y, 0)) z = item.data(self.DataZ)
self.getPoint(self.editTagAt, FreeCAD.Vector(x, y, z))
def editSelectedTag(self): def editSelectedTag(self):
self.editTag(self.formTags.lwTags.currentItem()) self.editTag(self.formTags.lwTags.currentItem())

View File

@ -344,7 +344,9 @@ def profile2(curve, direction="on", radius=1.0, vertfeed=0.0,
curve_cw = curve.IsClockwise() curve_cw = curve.IsClockwise()
if cw != curve_cw: if cw != curve_cw:
curve.Reverse() curve.Reverse()
set_good_start_point(curve, False) # once we know how what a good start point is
# we might want to set it here
#set_good_start_point(curve, False)
profile(curve, direction, 0.0, 0.0, roll_radius, roll_on, roll_off, depthparams, profile(curve, direction, 0.0, 0.0, roll_radius, roll_on, roll_off, depthparams,
extend_at_start, extend_at_end, lead_in_line_len, lead_out_line_len) extend_at_start, extend_at_end, lead_in_line_len, lead_out_line_len)
using_area_for_offset = False using_area_for_offset = False