diff --git a/src/Mod/Path/PathScripts/PathSlot.py b/src/Mod/Path/PathScripts/PathSlot.py index ad4f8d3197..113e46260c 100644 --- a/src/Mod/Path/PathScripts/PathSlot.py +++ b/src/Mod/Path/PathScripts/PathSlot.py @@ -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)