def _get_working_edges(op, obj): """_get_working_edges(op, obj)... Compile all working edges from the Base Geometry selection (obj.Base) for the current operation. Additional modifications to selected region(face), such as extensions, should be placed within this function. """ regions = list() all_regions = list() edge_list = list() avoidFeatures = list() # Get extensions and identify faces to avoid extensions = FeatureExtensions.getExtensions(obj) for e in extensions: if e.avoid: avoidFeatures.append(e.feature) # Get faces selected by user for base, subs in obj.Base: for sub in subs: if sub not in avoidFeatures: if obj.UseOutline: face = base.Shape.getElement(sub) # get outline with wire_A method used in PocketShape, but it does not play nicely later # wire_A = TechDraw.findShapeOutline(face, 1, FreeCAD.Vector(0.0, 0.0, 1.0)) wire_B = face.Wires[0] shape = Part.Face(wire_B) else: shape = base.Shape.getElement(sub) regions.append(shape) # Efor # Return Extend Outline extension, OR regular edge extension all_regions = regions # Apply regular Extensions op.exts = [] # pylint: disable=attribute-defined-outside-init for ext in extensions: if not ext.avoid: wire = ext.getWire() if wire: for f in ext.getExtensionFaces(wire): op.exts.append(f) all_regions.append(f) # Second face-combining method attempted horizontal = PathGeom.combineHorizontalFaces(all_regions) for f in horizontal: for w in f.Wires: for e in w.Edges: edge_list.append([discretize(e)]) return edge_list
def areaOpShapes(self, obj): """areaOpShapes(obj) ... return shapes representing the solids to be removed.""" PathLog.track() self.removalshapes = [] # self.isDebug = True if PathLog.getLevel(PathLog.thisModule()) == 4 else False self.removalshapes = [] avoidFeatures = list() # Get extensions and identify faces to avoid extensions = FeatureExtensions.getExtensions(obj) for e in extensions: if e.avoid: avoidFeatures.append(e.feature) if obj.Base: PathLog.debug("base items exist. Processing...") self.horiz = [] self.vert = [] for (base, subList) in obj.Base: for sub in subList: if "Face" in sub: if sub not in avoidFeatures and not self.clasifySub( base, sub): PathLog.error( "Pocket does not support shape {}.{}".format( base.Label, sub)) # Convert horizontal faces to use outline only if requested if obj.UseOutline and self.horiz: horiz = [Part.Face(f.Wire1) for f in self.horiz] self.horiz = horiz # Check if selected vertical faces form a loop if len(self.vert) > 0: self.vertical = PathGeom.combineConnectedShapes(self.vert) self.vWires = [ TechDraw.findShapeOutline(shape, 1, FreeCAD.Vector(0, 0, 1)) for shape in self.vertical ] for wire in self.vWires: w = PathGeom.removeDuplicateEdges(wire) face = Part.Face(w) # face.tessellate(0.1) if PathGeom.isRoughly(face.Area, 0): PathLog.error( "Vertical faces do not form a loop - ignoring") else: self.horiz.append(face) # Add faces for extensions self.exts = [] # pylint: disable=attribute-defined-outside-init for ext in extensions: if not ext.avoid: wire = ext.getWire() if wire: faces = ext.getExtensionFaces(wire) for f in faces: self.horiz.append(f) self.exts.append(f) # check all faces and see if they are touching/overlapping and combine and simplify self.horizontal = PathGeom.combineHorizontalFaces(self.horiz) # Move all faces to final depth less buffer before extrusion # Small negative buffer is applied to compensate for internal significant digits/rounding issue if self.job.GeometryTolerance.Value == 0.0: buffer = 0.000001 else: buffer = self.job.GeometryTolerance.Value / 10.0 for h in self.horizontal: h.translate( FreeCAD.Vector( 0.0, 0.0, obj.FinalDepth.Value - h.BoundBox.ZMin - buffer)) # extrude all faces up to StartDepth plus buffer and those are the removal shapes extent = FreeCAD.Vector( 0, 0, obj.StartDepth.Value - obj.FinalDepth.Value + buffer) self.removalshapes = [(face.removeSplitter().extrude(extent), False) for face in self.horizontal] else: # process the job base object as a whole PathLog.debug("processing the whole job base object") self.outlines = [ Part.Face( TechDraw.findShapeOutline(base.Shape, 1, FreeCAD.Vector(0, 0, 1))) for base in self.model ] stockBB = self.stock.Shape.BoundBox self.bodies = [] for outline in self.outlines: outline.translate(FreeCAD.Vector(0, 0, stockBB.ZMin - 1)) body = outline.extrude( FreeCAD.Vector(0, 0, stockBB.ZLength + 2)) self.bodies.append(body) self.removalshapes.append((self.stock.Shape.cut(body), False)) # Tessellate all working faces # for (shape, hole) in self.removalshapes: # shape.tessellate(0.05) # originally 0.1 if self.removalshapes: obj.removalshape = Part.makeCompound( [tup[0] for tup in self.removalshapes]) return self.removalshapes