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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user