Path: Fix feature selection and handling

Fix error when working with selections containing edges and faces.  This fix effectively processes edges and only passes faces on to next processing step.  This simplifies the code a bit and changes some `obj.Base` references to `otherBase` to improve readability.
Path: Improve `obj.Base` reading and processing

`obj.Base` is first read in `self._processEdges()`.  All edges are identified and processed there.  Remaining features are saved in `remainingObjBaseFeatures` to be processed in the next section of the Profile code.
Path: Change `if` to `elif`
This commit is contained in:
Russell Johnson
2021-02-19 23:01:59 -06:00
parent 91dd729d4e
commit 3a10ed5f27

View File

@@ -297,6 +297,7 @@ class ObjectProfile(PathAreaOp.ObjectOp):
baseSubsTuples = list()
allTuples = list()
edgeFaces = list()
remainingObjBaseFeatures = list()
subCount = 0
self.isDebug = True if PathLog.getLevel(PathLog.thisModule()) == 4 else False
self.inaccessibleMsg = translate('PathProfile', 'The selected edge(s) are inaccessible. If multiple, re-ordering selection might work.')
@@ -323,12 +324,15 @@ class ObjectProfile(PathAreaOp.ObjectOp):
# Pre-process Base Geometry to process edges
if obj.Base and len(obj.Base) > 0: # The user has selected subobjects from the base. Process each.
shapes.extend(self._processEdges(obj))
shapes.extend(self._processEdges(obj, remainingObjBaseFeatures))
if obj.Base and len(obj.Base) > 0: # The user has selected subobjects from the base. Process each.
if obj.Base and len(obj.Base) > 0 and not remainingObjBaseFeatures:
# Edges were already processed, or whole model targeted.
PathLog.debug("remainingObjBaseFeatures is False")
elif remainingObjBaseFeatures and len(remainingObjBaseFeatures) > 0: # Process remaining features after edges processed above.
if obj.EnableRotation != 'Off':
for p in range(0, len(obj.Base)):
(base, subsList) = obj.Base[p]
for p in range(0, len(remainingObjBaseFeatures)):
(base, subsList) = remainingObjBaseFeatures[p]
for sub in subsList:
subCount += 1
shape = getattr(base.Shape, sub)
@@ -353,12 +357,11 @@ class ObjectProfile(PathAreaOp.ObjectOp):
# Efor
else:
stock = PathUtils.findParentJob(obj).Stock
for (base, subList) in obj.Base:
for (base, subList) in remainingObjBaseFeatures:
baseSubsTuples.append((base, subList, 0.0, 'X', stock))
# Eif
# for base in obj.Base:
finish_step = obj.FinishDepth.Value if hasattr(obj, "FinishDepth") else 0.0
# for base in remainingObjBaseFeatures:
for (base, subsList, angle, axis, stock) in baseSubsTuples:
holes = []
faces = []
@@ -587,16 +590,15 @@ class ObjectProfile(PathAreaOp.ObjectOp):
return shapeTups
# Edges pre-processing
def _processEdges(self, obj):
def _processEdges(self, obj, remainingObjBaseFeatures):
shapes = list()
basewires = list()
delPairs = list()
ezMin = None
self.cutOut = self.tool.Diameter
for p in range(0, len(obj.Base)):
(base, subsList) = obj.Base[p]
tmpSubs = list()
keepFaces = list()
edgelist = list()
for sub in subsList:
shape = getattr(base.Shape, sub)
@@ -605,16 +607,14 @@ class ObjectProfile(PathAreaOp.ObjectOp):
edgelist.append(getattr(base.Shape, sub))
# save faces for regular processing
if isinstance(shape, Part.Face):
tmpSubs.append(sub)
keepFaces.append(sub)
if len(edgelist) > 0:
basewires.append((base, DraftGeomUtils.findWires(edgelist)))
if ezMin is None or base.Shape.BoundBox.ZMin < ezMin:
ezMin = base.Shape.BoundBox.ZMin
# If faces
if len(tmpSubs) == 0: # all edges in subsList = remove pair in obj.Base
delPairs.append(p)
elif len(edgelist) > 0: # some edges in subsList were extracted, return faces only to subsList
obj.Base[p] = (base, tmpSubs)
if len(keepFaces) > 0: # save faces for returning and processing
remainingObjBaseFeatures.append((base, keepFaces))
for base, wires in basewires:
for wire in wires:
@@ -669,11 +669,6 @@ class ObjectProfile(PathAreaOp.ObjectOp):
# Efor
# Efor
delPairs.sort(reverse=True)
for p in delPairs:
# obj.Base.pop(p)
pass
return shapes
def _flattenWire(self, obj, wire, trgtDep):