diff --git a/src/Mod/Path/PathScripts/PathEngraveBase.py b/src/Mod/Path/PathScripts/PathEngraveBase.py index abaf413dc8..978bcd39f3 100644 --- a/src/Mod/Path/PathScripts/PathEngraveBase.py +++ b/src/Mod/Path/PathScripts/PathEngraveBase.py @@ -29,22 +29,24 @@ import copy # lazily loaded modules from lazy_loader.lazy_loader import LazyLoader -DraftGeomUtils = LazyLoader('DraftGeomUtils', globals(), 'DraftGeomUtils') -Part = LazyLoader('Part', globals(), 'Part') + +DraftGeomUtils = LazyLoader("DraftGeomUtils", globals(), "DraftGeomUtils") +Part = LazyLoader("Part", globals(), "Part") from PySide import QtCore __doc__ = "Base class for all ops in the engrave family." PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) -#PathLog.trackModule(PathLog.thisModule()) +# PathLog.trackModule(PathLog.thisModule()) # Qt translation handling def translate(context, text, disambig=None): return QtCore.QCoreApplication.translate(context, text, disambig) + class ObjectOp(PathOp.ObjectOp): - '''Proxy base class for engrave operations.''' + """Proxy base class for engrave operations.""" def getZValues(self, obj): zValues = [] @@ -62,47 +64,79 @@ class ObjectOp(PathOp.ObjectOp): return zValues def buildpathocc(self, obj, wires, zValues, relZ=False, forward=True, start_idx=0): - '''buildpathocc(obj, wires, zValues, relZ=False) ... internal helper function to generate engraving commands.''' + """buildpathocc(obj, wires, zValues, relZ=False) ... internal helper function to generate engraving commands.""" PathLog.track(obj.Label, len(wires), zValues) for wire in wires: offset = wire # reorder the wire - if hasattr(obj, 'StartVertex'): + if hasattr(obj, "StartVertex"): start_idx = obj.StartVertex edges = copy.copy(PathOpTools.orientWire(offset, forward).Edges) - edges = Part.sortEdges(edges)[0]; + edges = Part.sortEdges(edges)[0] last = None for z in zValues: PathLog.debug(z) if last: - self.appendCommand(Path.Command('G1', {'X': last.x, 'Y': last.y, 'Z': last.z}), z, relZ, self.vertFeed) + self.appendCommand( + Path.Command("G1", {"X": last.x, "Y": last.y, "Z": last.z}), + z, + relZ, + self.vertFeed, + ) first = True - if start_idx > len(edges)-1: - start_idx = len(edges)-1 + if start_idx > len(edges) - 1: + start_idx = len(edges) - 1 edges = edges[start_idx:] + edges[:start_idx] for edge in edges: - PathLog.debug("points: {} -> {}".format(edge.Vertexes[0].Point, edge.Vertexes[-1].Point)) - PathLog.debug("valueat {} -> {}".format(edge.valueAt(edge.FirstParameter), edge.valueAt(edge.LastParameter))) + PathLog.debug( + "points: {} -> {}".format( + edge.Vertexes[0].Point, edge.Vertexes[-1].Point + ) + ) + PathLog.debug( + "valueat {} -> {}".format( + edge.valueAt(edge.FirstParameter), + edge.valueAt(edge.LastParameter), + ) + ) if first and (not last or not wire.isClosed()): - PathLog.debug('processing first edge entry') + PathLog.debug("processing first edge entry") # we set the first move to our first point last = edge.Vertexes[0].Point - self.commandlist.append(Path.Command('G0', {'Z': obj.ClearanceHeight.Value, 'F': self.vertRapid})) - self.commandlist.append(Path.Command('G0', {'X': last.x, 'Y': last.y, 'F': self.horizRapid})) - self.commandlist.append(Path.Command('G0', {'Z': obj.SafeHeight.Value, 'F': self.vertRapid})) - self.appendCommand(Path.Command('G1', {'X': last.x, 'Y': last.y, 'Z': last.z}), z, relZ, self.vertFeed) + self.commandlist.append( + Path.Command( + "G0", + {"Z": obj.ClearanceHeight.Value, "F": self.vertRapid}, + ) + ) + self.commandlist.append( + Path.Command( + "G0", {"X": last.x, "Y": last.y, "F": self.horizRapid} + ) + ) + self.commandlist.append( + Path.Command( + "G0", {"Z": obj.SafeHeight.Value, "F": self.vertRapid} + ) + ) + self.appendCommand( + Path.Command("G1", {"X": last.x, "Y": last.y, "Z": last.z}), + z, + relZ, + self.vertFeed, + ) first = False if PathGeom.pointsCoincide(last, edge.valueAt(edge.FirstParameter)): - #if PathGeom.pointsCoincide(last, edge.Vertexes[0].Point): + # if PathGeom.pointsCoincide(last, edge.Vertexes[0].Point): for cmd in PathGeom.cmdsForEdge(edge): self.appendCommand(cmd, z, relZ, self.horizFeed) last = edge.Vertexes[-1].Point @@ -110,17 +144,21 @@ class ObjectOp(PathOp.ObjectOp): for cmd in PathGeom.cmdsForEdge(edge, True): self.appendCommand(cmd, z, relZ, self.horizFeed) last = edge.Vertexes[0].Point - self.commandlist.append(Path.Command('G0', {'Z': obj.ClearanceHeight.Value, 'F': self.vertRapid})) + self.commandlist.append( + Path.Command( + "G0", {"Z": obj.ClearanceHeight.Value, "F": self.vertRapid} + ) + ) def appendCommand(self, cmd, z, relZ, feed): params = cmd.Parameters if relZ: - z = params['Z'] - z - params.update({'Z': z, 'F': feed}) + z = params["Z"] - z + params.update({"Z": z, "F": feed}) self.commandlist.append(Path.Command(cmd.Name, params)) def opSetDefaultValues(self, obj, job): - '''opSetDefaultValues(obj) ... set depths for engraving''' + """opSetDefaultValues(obj) ... set depths for engraving""" if PathOp.FeatureDepths & self.opFeatures(obj): if job and len(job.Model.Group) > 0: bb = job.Proxy.modelBoundBox(job) @@ -128,4 +166,3 @@ class ObjectOp(PathOp.ObjectOp): obj.OpFinalDepth = bb.ZMax - max(obj.StepDown.Value, 0.1) else: obj.OpFinalDepth = -0.1 - diff --git a/src/Mod/Path/PathScripts/PathEngraveGui.py b/src/Mod/Path/PathScripts/PathEngraveGui.py index 6301c4882d..b9a82596ca 100644 --- a/src/Mod/Path/PathScripts/PathEngraveGui.py +++ b/src/Mod/Path/PathScripts/PathEngraveGui.py @@ -22,7 +22,7 @@ import FreeCAD import FreeCADGui -import PathGui as PGui # ensure Path/Gui/Resources are loaded +import PathGui as PGui # ensure Path/Gui/Resources are loaded import PathScripts.PathEngrave as PathEngrave import PathScripts.PathLog as PathLog import PathScripts.PathOpGui as PathOpGui @@ -36,20 +36,26 @@ __url__ = "https://www.freecadweb.org" __doc__ = "Engrave operation page controller and command implementation." PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) -#PathLog.trackModule(PathLog.thisModule()) +# PathLog.trackModule(PathLog.thisModule()) + def translate(context, text, disambig=None): return QtCore.QCoreApplication.translate(context, text, disambig) + class TaskPanelBaseGeometryPage(PathOpGui.TaskPanelBaseGeometryPage): - '''Enhanced base geometry page to also allow special base objects.''' + """Enhanced base geometry page to also allow special base objects.""" def super(self): return super(TaskPanelBaseGeometryPage, self) def selectionSupportedAsBaseGeometry(self, selection, ignoreErrors): # allow selection of an entire 2D object, which is generally not the case - if len(selection) == 1 and not selection[0].HasSubObjects and selection[0].Object.isDerivedFrom('Part::Part2DObject'): + if ( + len(selection) == 1 + and not selection[0].HasSubObjects + and selection[0].Object.isDerivedFrom("Part::Part2DObject") + ): return True # Let general logic handle all other cases. return self.super().selectionSupportedAsBaseGeometry(selection, ignoreErrors) @@ -61,22 +67,31 @@ class TaskPanelBaseGeometryPage(PathOpGui.TaskPanelBaseGeometryPage): job = PathUtils.findParentJob(self.obj) base = job.Proxy.resourceClone(job, sel.Object) if not base: - PathLog.notice((translate("Path", "%s is not a Base Model object of the job %s")+"\n") % (sel.Object.Label, job.Label)) + PathLog.notice( + ( + translate("Path", "%s is not a Base Model object of the job %s") + + "\n" + ) + % (sel.Object.Label, job.Label) + ) continue if base in shapes: - PathLog.notice((translate("Path", "Base shape %s already in the list")+"\n") % (sel.Object.Label)) + PathLog.notice( + (translate("Path", "Base shape %s already in the list") + "\n") + % (sel.Object.Label) + ) continue - if base.isDerivedFrom('Part::Part2DObject'): + if base.isDerivedFrom("Part::Part2DObject"): if sel.HasSubObjects: # selectively add some elements of the drawing to the Base for sub in sel.SubElementNames: - if 'Vertex' in sub: + if "Vertex" in sub: PathLog.info(translate("Path", "Ignoring vertex")) else: self.obj.Proxy.addBase(self.obj, base, sub) else: # when adding an entire shape to BaseShapes we can take its sub shapes out of Base - self.obj.Base = [(p,el) for p,el in self.obj.Base if p != base] + self.obj.Base = [(p, el) for p, el in self.obj.Base if p != base] shapes.append(base) self.obj.BaseShapes = shapes added = True @@ -106,32 +121,35 @@ class TaskPanelBaseGeometryPage(PathOpGui.TaskPanelBaseGeometryPage): sub = item.data(self.super().DataObjectSub) if not sub: shapes.append(obj) - PathLog.debug("Setting new base shapes: %s -> %s" % (self.obj.BaseShapes, shapes)) + PathLog.debug( + "Setting new base shapes: %s -> %s" % (self.obj.BaseShapes, shapes) + ) self.obj.BaseShapes = shapes return self.super().updateBase() + class TaskPanelOpPage(PathOpGui.TaskPanelPage): - '''Page controller class for the Engrave operation.''' + """Page controller class for the Engrave operation.""" def getForm(self): - '''getForm() ... returns UI''' + """getForm() ... returns UI""" return FreeCADGui.PySideUic.loadUi(":/panels/PageOpEngraveEdit.ui") def getFields(self, obj): - '''getFields(obj) ... transfers values from UI to obj's proprties''' + """getFields(obj) ... transfers values from UI to obj's proprties""" if obj.StartVertex != self.form.startVertex.value(): obj.StartVertex = self.form.startVertex.value() self.updateToolController(obj, self.form.toolController) self.updateCoolant(obj, self.form.coolantController) def setFields(self, obj): - '''setFields(obj) ... transfers obj's property values to UI''' + """setFields(obj) ... transfers obj's property values to UI""" self.form.startVertex.setValue(obj.StartVertex) self.setupToolController(obj, self.form.toolController) self.setupCoolant(obj, self.form.coolantController) def getSignalsForUpdate(self, obj): - '''getSignalsForUpdate(obj) ... return list of signals for updating obj''' + """getSignalsForUpdate(obj) ... return list of signals for updating obj""" signals = [] signals.append(self.form.startVertex.editingFinished) signals.append(self.form.toolController.currentIndexChanged) @@ -139,15 +157,20 @@ class TaskPanelOpPage(PathOpGui.TaskPanelPage): return signals def taskPanelBaseGeometryPage(self, obj, features): - '''taskPanelBaseGeometryPage(obj, features) ... return page for adding base geometries.''' + """taskPanelBaseGeometryPage(obj, features) ... return page for adding base geometries.""" return TaskPanelBaseGeometryPage(obj, features) -Command = PathOpGui.SetupOperation('Engrave', - PathEngrave.Create, - TaskPanelOpPage, - 'Path_Engrave', - QtCore.QT_TRANSLATE_NOOP("PathEngrave", "Engrave"), - QtCore.QT_TRANSLATE_NOOP("PathEngrave", "Creates an Engraving Path around a Draft ShapeString"), - PathEngrave.SetupProperties) + +Command = PathOpGui.SetupOperation( + "Engrave", + PathEngrave.Create, + TaskPanelOpPage, + "Path_Engrave", + QtCore.QT_TRANSLATE_NOOP("PathEngrave", "Engrave"), + QtCore.QT_TRANSLATE_NOOP( + "PathEngrave", "Creates an Engraving Path around a Draft ShapeString" + ), + PathEngrave.SetupProperties, +) FreeCAD.Console.PrintLog("Loading PathEngraveGui... done\n")