| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | import FreeCAD |
| | import Path |
| | import Path.Op.Base as PathOp |
| | import Path.Op.EngraveBase as PathEngraveBase |
| | import PathScripts.PathUtils as PathUtils |
| |
|
| | from PySide.QtCore import QT_TRANSLATE_NOOP |
| |
|
| | __doc__ = "Class and implementation of CAM Engrave operation" |
| |
|
| | if False: |
| | Path.Log.setLevel(Path.Log.Level.DEBUG, Path.Log.thisModule()) |
| | Path.Log.trackModule(Path.Log.thisModule()) |
| | else: |
| | Path.Log.setLevel(Path.Log.Level.INFO, Path.Log.thisModule()) |
| |
|
| | |
| | from lazy_loader.lazy_loader import LazyLoader |
| |
|
| | Part = LazyLoader("Part", globals(), "Part") |
| |
|
| |
|
| | class ObjectEngrave(PathEngraveBase.ObjectOp): |
| | """Proxy class for Engrave operation.""" |
| |
|
| | def __init__(self, obj, name, parentJob): |
| | super(ObjectEngrave, self).__init__(obj, name, parentJob) |
| | self.wires = [] |
| |
|
| | def opFeatures(self, obj): |
| | """opFeatures(obj) ... return all standard features and edges based geometries""" |
| | return ( |
| | PathOp.FeatureTool |
| | | PathOp.FeatureDepths |
| | | PathOp.FeatureHeights |
| | | PathOp.FeatureStepDown |
| | | PathOp.FeatureBaseEdges |
| | | PathOp.FeatureCoolant |
| | ) |
| |
|
| | def setupAdditionalProperties(self, obj): |
| | if not hasattr(obj, "BaseShapes"): |
| | obj.addProperty( |
| | "App::PropertyLinkList", |
| | "BaseShapes", |
| | "Path", |
| | QT_TRANSLATE_NOOP("App::Property", "Additional base objects to be engraved"), |
| | ) |
| | obj.setEditorMode("BaseShapes", 2) |
| |
|
| | def initOperation(self, obj): |
| | """initOperation(obj) ... create engraving specific properties.""" |
| | obj.addProperty( |
| | "App::PropertyInteger", |
| | "StartVertex", |
| | "Path", |
| | QT_TRANSLATE_NOOP("App::Property", "The vertex index to start the toolpath from"), |
| | ) |
| | self.setupAdditionalProperties(obj) |
| |
|
| | def opOnDocumentRestored(self, obj): |
| | |
| | self.setupAdditionalProperties(obj) |
| |
|
| | def opExecute(self, obj): |
| | """opExecute(obj) ... process engraving operation""" |
| | Path.Log.track() |
| |
|
| | jobshapes = [] |
| |
|
| | if obj.Base: |
| | |
| | Path.Log.track(len(obj.Base)) |
| | for base, subs in obj.Base: |
| | edges = [] |
| | wires = [] |
| | for feature in subs: |
| | sub = base.Shape.getElement(feature) |
| | if isinstance(sub, Part.Edge): |
| | edges.append(sub) |
| | elif sub.Wires: |
| | wires.extend(sub.Wires) |
| | else: |
| | wires.append(Part.Wire(sub.Edges)) |
| |
|
| | for sortedEdges in Part.sortEdges(edges): |
| | wires.append(Part.Wire(sortedEdges)) |
| |
|
| | jobshapes.append(Part.makeCompound(wires)) |
| |
|
| | elif obj.BaseShapes: |
| | |
| | jobshapes.extend([base.Shape for base in obj.BaseShapes]) |
| | else: |
| | |
| | Path.Log.track(self.model) |
| | for base in self.model: |
| | Path.Log.track(base.Label) |
| | if base.isDerivedFrom("Part::Part2DObject"): |
| | jobshapes.append(base.Shape) |
| | elif base.isDerivedFrom("Sketcher::SketchObject"): |
| | jobshapes.append(base.Shape) |
| | elif hasattr(base, "ArrayType"): |
| | jobshapes.append(base.Shape) |
| |
|
| | if jobshapes: |
| | Path.Log.debug("processing {} jobshapes".format(len(jobshapes))) |
| | wires = [] |
| | for shape in jobshapes: |
| | if isinstance(shape, Part.Edge): |
| | shapeWires = [Part.Wire(shape)] |
| | else: |
| | shapeWires = shape.Wires |
| | Path.Log.debug("jobshape has {} edges".format(len(shape.Edges))) |
| | self.commandlist.append( |
| | Path.Command("G0", {"Z": obj.ClearanceHeight.Value, "F": self.vertRapid}) |
| | ) |
| | self.buildpathocc(obj, shapeWires, self.getZValues(obj)) |
| | wires.extend(shapeWires) |
| | self.wires = wires |
| | Path.Log.debug("processing {} jobshapes -> {} wires".format(len(jobshapes), len(wires))) |
| | |
| | if self.commandlist: |
| | self.commandlist.pop() |
| |
|
| | def opUpdateDepths(self, obj): |
| | """updateDepths(obj) ... engraving is always done at the top most z-value""" |
| | job = PathUtils.findParentJob(obj) |
| | self.opSetDefaultValues(obj, job) |
| |
|
| |
|
| | def SetupProperties(): |
| | return ["StartVertex"] |
| |
|
| |
|
| | def Create(name, obj=None, parentJob=None): |
| | """Create(name) ... Creates and returns an Engrave operation.""" |
| | if obj is None: |
| | obj = FreeCAD.ActiveDocument.addObject("Path::FeaturePython", name) |
| | obj.Proxy = ObjectEngrave(obj, name, parentJob) |
| | return obj |
| |
|