Path: Fixes to path generation for certain selections

Fixes path generation for selection of two non-parallel edges.
Fixes path generation for selection of single, bottom face of slot with two non-parallel ends.
Fixes path generation for selection of two parallel, bottom bounding edges of slot.
This commit is contained in:
Russell Johnson
2020-12-17 22:18:27 -06:00
parent 6bf18f93c3
commit a02306d6ac

View File

@@ -607,11 +607,27 @@ class ObjectSlot(PathOp.ObjectOp):
BE = self.bottomEdges[0]
pnts = self._processSingleVertFace(obj, BE)
perpZero = False
elif self.shapeType1 == 'Edge' and self.shapeType2 == 'Edge':
PathLog.debug('_finishLine() Perp, featureCnt == 2')
if perpZero:
(p1, p2) = pnts
pnts = self._makePerpendicular(p1, p2, 10.0) # 10.0 offset below
else:
perpZero = False
# Modify path points if user selected two parallel edges
if (featureCnt == 2 and self.shapeType1 == 'Edge' and
self.shapeType2 == 'Edge' and self._isParallel(self.dYdX1, self.dYdX2)):
(p1, p2) = pnts
edg1_len = self.shape1.Length
edg2_len = self.shape2.Length
set_length = max(edg1_len, edg2_len)
pnts = self._makePerpendicular(p1, p2, 10.0 + set_length) # 10.0 offset below
if edg1_len != edg2_len:
msg = obj.Label + ' '
msg += translate('PathSlot',
'Verify slot path start and end points.')
FreeCAD.Console.PrintWarning(msg + '\n')
else:
perpZero = False
# Reverse direction of path if requested
if obj.ReverseDirection:
@@ -769,11 +785,16 @@ class ObjectSlot(PathOp.ObjectOp):
# Sort tuples by edge angle
eTups.sort(key=lambda tup: tup[2])
# Identify parallel edges
pairs = list()
parallel_edge_pairs = list()
parallel_edge_flags = list()
flag = 1
eCnt = len(shape.Edges)
lstE = eCnt - 1
for i in range(0, eCnt):
for i in range(0, eCnt): # populate empty parrallel edge flag list
parallel_edge_flags.append(0)
for i in range(0, eCnt): # Cycle through edges to identify parallel pairs
if i < lstE:
ni = i + 1
A = eTups[i]
@@ -788,19 +809,24 @@ class ObjectSlot(PathOp.ObjectOp):
if eB.Curve.TypeId not in lineTypes:
debug = eB.Curve.TypeId
else:
pairs.append((eA, eB))
parallel_edge_pairs.append((eA, eB))
# set parallel flags for this pair of edges
parallel_edge_flags[A[0]] = flag
parallel_edge_flags[B[0]] = flag
flag += 1
if debug:
msg = 'Erroneous Curve.TypeId: {}'.format(debug)
PathLog.debug(msg)
pairCnt = len(pairs)
pairCnt = len(parallel_edge_pairs)
if pairCnt > 1:
pairs.sort(key=lambda tup: tup[0].Length, reverse=True)
parallel_edge_pairs.sort(key=lambda tup: tup[0].Length, reverse=True)
if self.isDebug:
PathLog.debug(' -pairCnt: {}'.format(pairCnt))
for (a, b) in pairs:
for (a, b) in parallel_edge_pairs:
PathLog.debug(' -pair: {}, {}'.format(round(a.Length, 4), round(b.Length,4)))
PathLog.debug(' -parallel_edge_flags: {}'.format(parallel_edge_flags))
if pairCnt == 0:
msg = translate('PathSlot',
@@ -808,12 +834,24 @@ class ObjectSlot(PathOp.ObjectOp):
FreeCAD.Console.PrintError(msg + '\n')
return False
elif pairCnt == 1:
same = pairs[0]
# One pair of parallel edges identified
if eCnt == 4:
flag_set = list()
for i in range(0, 4):
e = parallel_edge_flags[i]
if e == 0:
flag_set.append(shape.Edges[i])
if len(flag_set) == 2:
same = (flag_set[0], flag_set[1])
else:
same = parallel_edge_pairs[0]
else:
same = parallel_edge_pairs[0]
else:
if obj.Reference1 == 'Long Edge':
same = pairs[1]
same = parallel_edge_pairs[1]
elif obj.Reference1 == 'Short Edge':
same = pairs[0]
same = parallel_edge_pairs[0]
else:
msg = 'Reference1 '
msg += translate('PathSlot',
@@ -862,6 +900,12 @@ class ObjectSlot(PathOp.ObjectOp):
b1 = v0.sub(perpVect)
b2 = v1.sub(perpVect)
(p1, p2) = self._getCutSidePoints(obj, v0, v1, a1, a2, b1, b2)
msg = obj.Label + ' '
msg += translate('PathSlot',
'Verify slot path start and end points.')
FreeCAD.Console.PrintWarning(msg + '\n')
return (p1, p2)
def _processSingleEdge(self, obj, edge):
@@ -1005,12 +1049,13 @@ class ObjectSlot(PathOp.ObjectOp):
# Parallel check for twin face, and face-edge cases
if dYdX1 and dYdX2:
PathLog.debug('dYdX1, dYdX2: {}, {}'.format(dYdX1, dYdX2))
if not self._isParallel(dYdX1, dYdX2):
PathLog.debug('dYdX1, dYdX2: {}, {}'.format(dYdX1, dYdX2))
msg = translate('PathSlot',
'Selected geometry not parallel.')
FreeCAD.Console.PrintError(msg + '\n')
return False
if self.shapeType1 != 'Edge' or self.shapeType2 != 'Edge':
msg = translate('PathSlot',
'Selected geometry not parallel.')
FreeCAD.Console.PrintError(msg + '\n')
return False
if p2:
return (p1, p2)