diff --git a/src/Mod/Path/PathScripts/PathEngrave.py b/src/Mod/Path/PathScripts/PathEngrave.py index 6c214446ba..557d4c1f11 100644 --- a/src/Mod/Path/PathScripts/PathEngrave.py +++ b/src/Mod/Path/PathScripts/PathEngrave.py @@ -57,7 +57,8 @@ class ObjectEngrave(PathOp.ObjectOp): def initOperation(self, obj): '''initOperation(obj) ... create engraving specific properties.''' - obj.addProperty("App::PropertyInteger", "StartVertex", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "The vertex index to start the path from")) + obj.addProperty("App::PropertyInteger", "StartVertex", "Path", QtCore.QT_TRANSLATE_NOOP("PathEngrave", "The vertex index to start the path from")) + obj.addProperty("App::PropertyLinkList", "BaseShapes", "Path", QtCore.QT_TRANSLATE_NOOP("PathEngrave", "Additional base objects to be engraved")) def opExecute(self, obj): '''opExecute(obj) ... process engraving operation''' @@ -109,9 +110,16 @@ class ObjectEngrave(PathOp.ObjectOp): wires.extend(TechDraw.edgeWalker(edges)) output += self.buildpathocc(obj, wires, zValues) self.wires = wires - else: + elif not obj.BaseShapes: + PathLog.info("base object: %s" % (obj.Base)) raise ValueError('Unknown baseobject type for engraving') + if obj.BaseShapes: + wires = [] + for shape in obj.BaseShapes: + output += self.buildpathocc(obj, shape.Shape.Wires, zValues) + wires.extend(shape.Shape.Wires) + self.wires = wires output += "G0 Z" + PathUtils.fmt(obj.ClearanceHeight.Value) + "F " + PathUtils.fmt(self.vertRapid) + "\n" self.commandlist.append(Path.Command('G0', {'Z': obj.ClearanceHeight.Value, 'F': self.vertRapid})) diff --git a/src/Mod/Path/PathScripts/PathEngraveGui.py b/src/Mod/Path/PathScripts/PathEngraveGui.py index bc9d25851d..b227d5568e 100644 --- a/src/Mod/Path/PathScripts/PathEngraveGui.py +++ b/src/Mod/Path/PathScripts/PathEngraveGui.py @@ -36,9 +36,57 @@ __author__ = "sliptonic (Brad Collette)" __url__ = "http://www.freecadweb.org" __doc__ = "Engrave operation page controller and command implementation." +if False: + PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) + PathLog.trackModule(PathLog.thisModule()) +else: + PathLog.setLevel(PathLog.Level.INFO, 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.''' + + def super(self): + return super(TaskPanelBaseGeometryPage, self) + + def addBaseGeometry(self, selection): + if 1 == len(selection) and selection[0].Object.isDerivedFrom('Part::Part2DObject'): + sel = selection[0] + if sel.HasSubObjects: + for sub in sel.SubElementNames: + self.obj.Proxy.addBase(self.obj, sel.Object, sub) + else: + shapes = self.obj.BaseShapes + shapes.append(sel.Object) + self.obj.BaseShapes = shapes + return True + return self.super().addBaseGeometry(selection) + + def setFields(self, obj): + self.super().setFields(obj) + self.form.baseList.blockSignals(True) + for shape in self.obj.BaseShapes: + item = QtGui.QListWidgetItem(shape.Label) + item.setData(self.super().DataObject, shape) + item.setData(self.super().DataObjectSub, None) + self.form.baseList.addItem(item) + self.form.baseList.blockSignals(False) + + def updateBase(self): + PathLog.track() + shapes = [] + for i in range(self.form.baseList.count()): + item = self.form.baseList.item(i) + obj = item.data(self.super().DataObject) + sub = itme.data(self.super().DataObjectSub) + if not sub: + shapes.append(obj) + 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.''' @@ -64,6 +112,10 @@ class TaskPanelOpPage(PathOpGui.TaskPanelPage): signals.append(self.form.toolController.currentIndexChanged) return signals + def taskPanelBaseGeometryPage(self, obj, features): + '''taskPanelBaseGeometryPage(obj, features) ... return page for adding base geometries.''' + return TaskPanelBaseGeometryPage(obj, features) + Command = PathOpGui.SetupOperation('Engrave', PathEngrave.Create, TaskPanelOpPage, diff --git a/src/Mod/Path/PathScripts/PathOpGui.py b/src/Mod/Path/PathScripts/PathOpGui.py index 3c72ca7cf8..b5c072abfb 100644 --- a/src/Mod/Path/PathScripts/PathOpGui.py +++ b/src/Mod/Path/PathScripts/PathOpGui.py @@ -427,8 +427,9 @@ class TaskPanelBaseGeometryPage(TaskPanelPage): item = self.form.baseList.item(i) obj = item.data(self.DataObject) sub = str(item.data(self.DataObjectSub)) - base = (obj, sub) - newlist.append(base) + if sub: + base = (obj, sub) + newlist.append(base) PathLog.debug("Setting new base: %s -> %s" % (self.obj.Base, newlist)) self.obj.Base = newlist