Skip to content

Commit

Permalink
Merge pull request #456 from mlampert/develop
Browse files Browse the repository at this point in the history
Path: fixes issue 2865 and 2854
  • Loading branch information
wwmayer committed Jan 19, 2017
2 parents 632f1f5 + 81ae4f9 commit 4d5fab1
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 16 deletions.
48 changes: 33 additions & 15 deletions src/Mod/Path/PathScripts/PathDressupHoldingTags.py
Expand Up @@ -171,6 +171,7 @@ def __init__(self, x, y, width, height, angle, radius, enabled=True):
self.angle = math.fabs(angle)
self.radius = radius
self.enabled = enabled
self.isSquare = False

def fullWidth(self):
return 2 * self.toolRadius + self.width
Expand All @@ -194,6 +195,7 @@ def createSolidsAt(self, z, R):
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))
Expand Down Expand Up @@ -224,7 +226,7 @@ def createSolidsAt(self, z, R):
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)
Expand Down Expand Up @@ -287,10 +289,11 @@ def bbShow(self):


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 = []
Expand Down Expand Up @@ -484,9 +487,21 @@ def commandsForEdges(self):
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 []

Expand Down Expand Up @@ -551,7 +566,7 @@ def findBottomWire(self, edges):
(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
Expand Down Expand Up @@ -721,7 +736,7 @@ def __setstate__(self, state):
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:
Expand All @@ -740,7 +755,7 @@ def isValidTagStartIntersection(self, edge, i):
return False
return True

def createPath(self, obj, edges, tags, rapid):
def createPath(self, obj, pathData, tags):
#print("createPath")
commands = []
lastEdge = 0
Expand All @@ -760,11 +775,11 @@ def createPath(self, obj, edges, tags, rapid):
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

Expand All @@ -782,7 +797,7 @@ def createPath(self, obj, edges, tags, rapid):
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

Expand All @@ -791,7 +806,7 @@ def createPath(self, obj, edges, tags, rapid):
# 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:
Expand Down Expand Up @@ -837,7 +852,7 @@ def createTagsPositionDisabled(self, obj, positionsIn, disabledIn):
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):
Expand Down Expand Up @@ -890,7 +905,7 @@ def processTags(self, obj):
#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):
Expand Down Expand Up @@ -950,7 +965,8 @@ def preferencesPage(cls):
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
Expand Down Expand Up @@ -1030,6 +1046,7 @@ def updateTagsView(self):
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)
Expand Down Expand Up @@ -1112,7 +1129,8 @@ def editTag(self, item):
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())
Expand Down
4 changes: 3 additions & 1 deletion src/Mod/Path/PathScripts/PathKurveUtils.py
Expand Up @@ -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
Expand Down

0 comments on commit 4d5fab1

Please sign in to comment.