From 81ae4f94aa30b7da59baf8baaa04c57e91b87449 Mon Sep 17 00:00:00 2001 From: Markus Lampert Date: Tue, 17 Jan 2017 23:10:00 -0800 Subject: [PATCH] Fixed z=0 issues; added rapid move for square tag that is at the maximum height (or higher). --- .../PathScripts/PathDressupHoldingTags.py | 48 +++++++++++++------ src/Mod/Path/PathScripts/PathKurveUtils.py | 4 +- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/Mod/Path/PathScripts/PathDressupHoldingTags.py b/src/Mod/Path/PathScripts/PathDressupHoldingTags.py index 7bb01d6ca..62666c591 100644 --- a/src/Mod/Path/PathScripts/PathDressupHoldingTags.py +++ b/src/Mod/Path/PathScripts/PathDressupHoldingTags.py @@ -171,6 +171,7 @@ class Tag: self.angle = math.fabs(angle) self.radius = radius self.enabled = enabled + self.isSquare = False def fullWidth(self): return 2 * self.toolRadius + self.width @@ -194,6 +195,7 @@ class Tag: radius = 0 if self.angle == 90 and height > 0: # cylinder + self.isSquare = True self.solid = Part.makeCylinder(r1, height) radius = min(min(self.radius, r1), self.height) debugPrint("Part.makeCone(%f, %f)" % (r1, height)) @@ -224,7 +226,7 @@ class Tag: debugPrint("solid.rotate(%f)" % angle) self.solid.rotate(FreeCAD.Vector(0,0,0), FreeCAD.Vector(0,0,1), angle) 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 if radius != 0: debugPrint("makeFillet(%.4f)" % radius) @@ -287,10 +289,11 @@ class Tag: 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)) self.tag = tag self.segm = segm + self.maxZ = maxZ if PathGeom.pointsCoincide(edge.valueAt(edge.FirstParameter), i): tail = edge self.commands = [] @@ -484,9 +487,21 @@ class MapWireToTag: if self.edges: shape = self.shell().common(self.tag.solid) commands = [] + rapid = None for e,flip in self.orderAndFlipEdges(self.cleanupEdges(shape.Edges)): debugEdge(e, '++++++++ %s' % ('<' if flip else '>'), False) - commands.extend(PathGeom.cmdsForEdge(e, flip, False, self.segm)) + 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)) + if rapid: + commands.append(Path.Command('G0', {'X': rapid.x, 'Y': rapid.y, 'Z': rapid.z})) + rapid = None return commands return [] @@ -551,7 +566,7 @@ class PathData: (minZ, maxZ) = self.findZLimits(edges) self.minZ = minZ 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) if wire.isClosed(): return wire @@ -721,7 +736,7 @@ class ObjectDressup: def generateTags(self, obj, count): if hasattr(self, "pathData"): 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 = [] return False else: @@ -740,7 +755,7 @@ class ObjectDressup: return False return True - def createPath(self, obj, edges, tags, rapid): + def createPath(self, obj, pathData, tags): #print("createPath") commands = [] lastEdge = 0 @@ -760,11 +775,11 @@ class ObjectDressup: self.mappers = [] 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))) if not edge: - edge = edges[lastEdge] - debugEdge(edge, "======= new edge: %d/%d" % (lastEdge, len(edges))) + edge = pathData.edges[lastEdge] + debugEdge(edge, "======= new edge: %d/%d" % (lastEdge, len(pathData.edges))) lastEdge += 1 sameTag = None @@ -782,7 +797,7 @@ class ObjectDressup: t += 1 i = tags[tIndex].intersects(edge, edge.FirstParameter) 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) edge = mapper.tail @@ -791,7 +806,7 @@ class ObjectDressup: # gone through all tags, consume edge and move on if edge: debugEdge(edge, '++++++++') - if rapid.isRapid(edge): + if pathData.rapid.isRapid(edge): v = edge.Vertexes[1] commands.append(Path.Command('G0', {'X': v.X, 'Y': v.Y, 'Z': v.Z})) else: @@ -837,7 +852,7 @@ class ObjectDressup: else: disabled.append(i) tags.append(tag) - positions.append(tag.originAt(0)) + positions.append(tag.originAt(self.pathData.minZ)) return (tags, positions, disabled) def execute(self, obj): @@ -890,7 +905,7 @@ class ObjectDressup: #else: # 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") def setup(self, obj, generate=False): @@ -950,7 +965,8 @@ PathPreferencesPathDressup.RegisterDressup(ObjectDressup) class TaskPanel: DataX = QtCore.Qt.ItemDataRole.UserRole 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): self.obj = obj @@ -1030,6 +1046,7 @@ class TaskPanel: item = QtGui.QListWidgetItem(lbl) item.setData(self.DataX, pos.x) item.setData(self.DataY, pos.y) + item.setData(self.DataZ, pos.z) item.setData(self.DataID, i) if i in self.obj.Disabled: item.setCheckState(QtCore.Qt.CheckState.Unchecked) @@ -1112,7 +1129,8 @@ class TaskPanel: self.editItem = item.data(self.DataID) x = item.data(self.DataX) 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): self.editTag(self.formTags.lwTags.currentItem()) diff --git a/src/Mod/Path/PathScripts/PathKurveUtils.py b/src/Mod/Path/PathScripts/PathKurveUtils.py index c10927840..34899ddf1 100644 --- a/src/Mod/Path/PathScripts/PathKurveUtils.py +++ b/src/Mod/Path/PathScripts/PathKurveUtils.py @@ -344,7 +344,9 @@ def profile2(curve, direction="on", radius=1.0, vertfeed=0.0, curve_cw = curve.IsClockwise() if cw != curve_cw: 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, extend_at_start, extend_at_end, lead_in_line_len, lead_out_line_len) using_area_for_offset = False