From dbbee7937840014d48217b67d906ab3f4cf0069f Mon Sep 17 00:00:00 2001 From: Markus Lampert Date: Mon, 7 Aug 2017 22:02:05 -0700 Subject: [PATCH] Split DrillingGui into its own file and base it off of PathOpGui. --- src/Mod/Path/CMakeLists.txt | 1 + src/Mod/Path/Gui/Resources/Path.qrc | 2 + .../panels/PageBaseHoleGeometryEdit.ui | 82 ++++ .../Resources/panels/PageOpDrillingEdit.ui | 127 ++++++ src/Mod/Path/InitGui.py | 2 +- src/Mod/Path/PathScripts/PathAreaOp.py | 8 +- src/Mod/Path/PathScripts/PathDrilling.py | 387 +----------------- src/Mod/Path/PathScripts/PathDrillingGui.py | 212 ++++++++++ src/Mod/Path/PathScripts/PathOp.py | 15 +- src/Mod/Path/PathScripts/PathOpGui.py | 108 +++-- src/Mod/Path/PathScripts/PathPocketBaseGui.py | 4 +- .../Path/PathScripts/PathProfileBaseGui.py | 4 +- src/Mod/Path/PathScripts/PathSelection.py | 15 +- 13 files changed, 534 insertions(+), 433 deletions(-) create mode 100644 src/Mod/Path/Gui/Resources/panels/PageBaseHoleGeometryEdit.ui create mode 100644 src/Mod/Path/Gui/Resources/panels/PageOpDrillingEdit.ui create mode 100644 src/Mod/Path/PathScripts/PathDrillingGui.py diff --git a/src/Mod/Path/CMakeLists.txt b/src/Mod/Path/CMakeLists.txt index fcacf432b2..5bebe54954 100644 --- a/src/Mod/Path/CMakeLists.txt +++ b/src/Mod/Path/CMakeLists.txt @@ -33,6 +33,7 @@ SET(PathScripts_SRCS PathScripts/PathDressupTagGui.py PathScripts/PathDressupTagPreferences.py PathScripts/PathDrilling.py + PathScripts/PathDrillingGui.py PathScripts/PathEngrave.py PathScripts/PathFacePocket.py PathScripts/PathFaceProfile.py diff --git a/src/Mod/Path/Gui/Resources/Path.qrc b/src/Mod/Path/Gui/Resources/Path.qrc index 503542bfe6..a0579984d0 100644 --- a/src/Mod/Path/Gui/Resources/Path.qrc +++ b/src/Mod/Path/Gui/Resources/Path.qrc @@ -62,8 +62,10 @@ panels/JobEdit.ui panels/MillFaceEdit.ui panels/PageBaseGeometryEdit.ui + panels/PageBaseHoleGeometryEdit.ui panels/PageDepthsEdit.ui panels/PageHeightsEdit.ui + panels/PageOpDrillingEdit.ui panels/PageOpPocketFullEdit.ui panels/PageOpProfileFullEdit.ui panels/PocketEdit.ui diff --git a/src/Mod/Path/Gui/Resources/panels/PageBaseHoleGeometryEdit.ui b/src/Mod/Path/Gui/Resources/panels/PageBaseHoleGeometryEdit.ui new file mode 100644 index 0000000000..628835c90f --- /dev/null +++ b/src/Mod/Path/Gui/Resources/panels/PageBaseHoleGeometryEdit.ui @@ -0,0 +1,82 @@ + + + Form + + + + 0 + 0 + 415 + 573 + + + + Form + + + + + + + + true + + + + Feature + + + + + Diameter + + + + + + + + Remove all custom objects and find holes from base object. + + + Reset + + + + + + + All objects will be processed using the same operation properties. + + + Qt::AutoText + + + true + + + + + + + Remove + + + + + + + Add selected items from Gui View to drill + + + Add + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/panels/PageOpDrillingEdit.ui b/src/Mod/Path/Gui/Resources/panels/PageOpDrillingEdit.ui new file mode 100644 index 0000000000..4b0cf5f6bd --- /dev/null +++ b/src/Mod/Path/Gui/Resources/panels/PageOpDrillingEdit.ui @@ -0,0 +1,127 @@ + + + Form + + + + 0 + 0 + 400 + 255 + + + + Form + + + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + ToolController + + + + + + + + + + + + + + + + Dwell + + + + + + + 0 sec + + + sec + + + + + + + mm + + + + + + + Retract Height + + + + + + + Peck + + + + + + + mm + + + + + + + Use Tip Length + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + Gui::InputField + QLineEdit +
Gui/InputField.h
+
+
+ + +
diff --git a/src/Mod/Path/InitGui.py b/src/Mod/Path/InitGui.py index 6c20ad6665..d817a6d8ab 100644 --- a/src/Mod/Path/InitGui.py +++ b/src/Mod/Path/InitGui.py @@ -52,7 +52,7 @@ class PathWorkbench (Workbench): from PathScripts import PathDressupDragknife from PathScripts import PathDressupRampEntry from PathScripts import PathDressupTagGui - from PathScripts import PathDrilling + from PathScripts import PathDrillingGui from PathScripts import PathEngrave from PathScripts import PathFacePocket from PathScripts import PathFaceProfile diff --git a/src/Mod/Path/PathScripts/PathAreaOp.py b/src/Mod/Path/PathScripts/PathAreaOp.py index 42a2dff5cb..330104f394 100644 --- a/src/Mod/Path/PathScripts/PathAreaOp.py +++ b/src/Mod/Path/PathScripts/PathAreaOp.py @@ -47,7 +47,7 @@ def translate(context, text, disambig=None): class ObjectOp(PathOp.ObjectOp): def opFeatures(self, obj): - return PathOp.FeatureTool | PathOp.FeatureDepths | PathOp.FeatureHeights | PathOp.FeatureStartPoint | self.areaOpFeatures(obj) + return PathOp.FeatureTool | PathOp.FeatureDepths | PathOp.FeatureStepDown | PathOp.FeatureHeights | PathOp.FeatureStartPoint | self.areaOpFeatures(obj) def initOperation(self, obj): PathLog.track() @@ -130,11 +130,13 @@ class ObjectOp(PathOp.ObjectOp): bb = shape.BoundBox obj.StartDepth = bb.ZMax obj.FinalDepth = bb.ZMin - obj.StepDown = 1.0 + if PathOp.FeatureStepDown & self.opFeatures(obj): + obj.StepDown = 1.0 else: obj.StartDepth = 1.0 obj.FinalDepth = 0.0 - obj.StepDown = 1.0 + if PathOp.FeatureStepDown & self.opFeatures(obj): + obj.StepDown = 1.0 if PathOp.FeatureHeights & self.opFeatures(obj): try: diff --git a/src/Mod/Path/PathScripts/PathDrilling.py b/src/Mod/Path/PathScripts/PathDrilling.py index f1a492ff30..5a7d21b6c5 100644 --- a/src/Mod/Path/PathScripts/PathDrilling.py +++ b/src/Mod/Path/PathScripts/PathDrilling.py @@ -34,22 +34,18 @@ import string import sys from PathScripts.PathUtils import fmt, waiting_effects -from PySide import QtCore, QtGui +from PySide import QtCore # xrange is not available in python3 if sys.version_info.major >= 3: xrange = range -if True: +if False: PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) PathLog.trackModule(PathLog.thisModule()) else: PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) -FreeCADGui = None -if FreeCAD.GuiUp: - import FreeCADGui - """Path Drilling object and FreeCAD command""" # Qt tanslation handling @@ -75,9 +71,6 @@ class ObjectDrilling(PathOp.ObjectOp): obj.addProperty("App::PropertyDistance", "RetractHeight", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "The height where feed starts and height during retract tool when path is finished")) - if FreeCAD.GuiUp: - _ViewProviderDrill(obj.ViewObject) - self.vertFeed = 0.0 self.horizFeed = 0.0 self.vertRapid = 0.0 @@ -277,379 +270,3 @@ def Create(name): obj = FreeCAD.ActiveDocument.addObject("Path::FeaturePython", name) proxy = ObjectDrilling(obj) return obj - -class _ViewProviderDrill: - def __init__(self, obj): - obj.Proxy = self - - def __getstate__(self): - return None - - def __setstate__(self, state): - return None - - def getIcon(self): - return ":/icons/Path-Drilling.svg" - - def onChanged(self, obj, prop): - # this is executed when a property of the VIEW PROVIDER changes - pass - - def updateData(self, obj, prop): - # this is executed when a property of the APP OBJECT changes - pass - - def deleteObjectsOnReject(self): - return hasattr(self, 'deleteOnReject') and self.deleteOnReject - - def setEdit(self, vobj, mode=0): - FreeCADGui.Control.closeDialog() - taskd = TaskPanel(vobj.Object, self.deleteObjectsOnReject()) - taskd.obj = vobj.Object - FreeCADGui.Control.showDialog(taskd) - taskd.setupUi() - self.deleteOnReject = False - return True - - def unsetEdit(self, vobj, mode): - # this is executed when the user cancels or terminates edit mode - pass - - -class CommandPathDrilling: - - def GetResources(self): - return {'Pixmap': 'Path-Drilling', - 'MenuText': QtCore.QT_TRANSLATE_NOOP("Path_Drilling", "Drilling"), - 'Accel': "P, D", - 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Path_Drilling", "Creates a Path Drilling object")} - - def IsActive(self): - if FreeCAD.ActiveDocument is not None: - for o in FreeCAD.ActiveDocument.Objects: - if o.Name[:3] == "Job": - return True - return False - - def Activated(self): - ztop = 10.0 - zbottom = 0.0 - - # if everything is ok, execute and register the transaction in the undo/redo stack - FreeCAD.ActiveDocument.openTransaction(translate("Path_Drilling", "Create Drilling")) - FreeCADGui.addModule("PathScripts.PathDrilling") - FreeCADGui.doCommand('obj = PathScripts.PathDrilling.Create("Drilling")') - FreeCADGui.doCommand('obj.ViewObject.Proxy.deleteOnReject = True') - - FreeCAD.ActiveDocument.commitTransaction() - FreeCADGui.doCommand('obj.ViewObject.startEditing()') - - -class TaskPanel: - DataFeatureName = QtCore.Qt.ItemDataRole.UserRole - - def __init__(self, obj, deleteOnReject): - FreeCAD.ActiveDocument.openTransaction(translate("Path_Drilling", "Drilling Operation")) - self.form = FreeCADGui.PySideUic.loadUi(":/panels/DrillingEdit.ui") - self.form = QtGui.QWidget() - self.formDrill = FreeCADGui.PySideUic.loadUi(":/panels/DrillingEdit.ui") - self.formPoint = FreeCADGui.PySideUic.loadUi(":/panels/PointEdit.ui") - self.layout = QtGui.QVBoxLayout(self.form) - self.formDrill.setWindowTitle(self.formDrill.windowTitle()) - self.formDrill.setSizePolicy(self.formDrill.sizePolicy()) - self.formDrill.setParent(self.form) - self.formPoint.setParent(self.form) - self.layout.addWidget(self.formDrill) - self.layout.addWidget(self.formPoint) - self.formPoint.hide() - - self.deleteOnReject = deleteOnReject - self.obj = obj - self.isDirty = True - - def accept(self): - FreeCADGui.Control.closeDialog() - FreeCADGui.ActiveDocument.resetEdit() - FreeCAD.ActiveDocument.commitTransaction() - if self.isDirty: - FreeCAD.ActiveDocument.recompute() - - def reject(self): - FreeCADGui.Control.closeDialog() - FreeCADGui.ActiveDocument.resetEdit() - FreeCAD.ActiveDocument.abortTransaction() - if self.deleteOnReject: - FreeCAD.ActiveDocument.openTransaction(translate("Path_Drilling", "Uncreate Drilling Operation")) - FreeCAD.ActiveDocument.removeObject(self.obj.Name) - FreeCAD.ActiveDocument.commitTransaction() - FreeCAD.ActiveDocument.recompute() - - def clicked(self, button): - if button == QtGui.QDialogButtonBox.Apply: - self.getFields() - FreeCAD.ActiveDocument.recompute() - self.isDirty = False - - def getFields(self): - PathLog.track() - if self.obj: - try: - if hasattr(self.obj, "StartDepth"): - self.obj.StartDepth = FreeCAD.Units.Quantity(self.form.startDepth.text()).Value - if hasattr(self.obj, "FinalDepth"): - self.obj.FinalDepth = FreeCAD.Units.Quantity(self.form.finalDepth.text()).Value - if hasattr(self.obj, "PeckDepth"): - if FreeCAD.Units.Quantity(self.form.peckDepth.text()).Value >= 0: - self.obj.PeckDepth = FreeCAD.Units.Quantity(self.form.peckDepth.text()).Value - else: - self.form.peckDepth.setText("0.00") - if hasattr(self.obj, "SafeHeight"): - self.obj.SafeHeight = FreeCAD.Units.Quantity(self.form.safeHeight.text()).Value - if hasattr(self.obj, "ClearanceHeight"): - self.obj.ClearanceHeight = FreeCAD.Units.Quantity(self.form.clearanceHeight.text()).Value - if hasattr(self.obj, "RetractHeight"): - self.obj.RetractHeight = FreeCAD.Units.Quantity(self.form.retractHeight.text()).Value - if hasattr(self.obj, "DwellTime"): - if FreeCAD.Units.Quantity(self.form.dwellTime.text()).Value >= 0: - self.obj.DwellTime = FreeCAD.Units.Quantity(self.form.dwellTime.text()).Value - else: - self.form.dwellTime.setText("0.00") - if hasattr(self.obj, "DwellEnabled"): - self.obj.DwellEnabled = self.form.dwellEnabled.isChecked() - if hasattr(self.obj, "PeckEnabled"): - self.obj.PeckEnabled = self.form.peckEnabled.isChecked() - if hasattr(self.obj, "ToolController"): - PathLog.debug("name: {}".format(self.form.uiToolController.currentText())) - tc = PathUtils.findToolController(self.obj, self.form.uiToolController.currentText()) - self.obj.ToolController = tc - if hasattr(self.obj, "AddTipLength"): - self.obj.AddTipLength = self.form.chkTipDepth.isChecked() - except ValueError: - self.setFields() - self.isDirty = True - - def updateFeatureList(self): - self.form.baseList.itemChanged.disconnect(self.checkedChanged) # disconnect this slot while creating objects - self.form.baseList.clear() - self.form.baseList.setColumnCount(2) - self.form.baseList.setRowCount(0) - self.form.baseList.setHorizontalHeaderLabels(["Feature", "Diameter"]) - self.form.baseList.horizontalHeader().setStretchLastSection(True) - self.form.baseList.resizeColumnToContents(0) - self.form.baseList.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) - for i, (base, subs) in enumerate(self.obj.Base): - for sub in subs: - self.form.baseList.insertRow(self.form.baseList.rowCount()) - - item = QtGui.QTableWidgetItem("%s.%s" % (base.Label, sub)) - item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable) - if self.obj.Proxy.isHoleEnabled(self.obj, base, sub): - item.setCheckState(QtCore.Qt.Checked) - else: - item.setCheckState(QtCore.Qt.Unchecked) - self.form.baseList.setItem(self.form.baseList.rowCount()-1, 0, item) - item.setData(self.DataFeatureName, "%s.%s" % (base.Name, sub)) - - item = QtGui.QTableWidgetItem("{:.3f}".format(self.obj.Proxy.holeDiameter(self.obj, base, sub))) - self.form.baseList.setItem(self.form.baseList.rowCount()-1, 1, item) - - self.form.baseList.resizeColumnToContents(0) - self.form.baseList.itemChanged.connect(self.checkedChanged) - - self.form.baseList.setSortingEnabled(True) - - def setFields(self): - PathLog.track() - self.form.startDepth.setText(FreeCAD.Units.Quantity(self.obj.StartDepth.Value, FreeCAD.Units.Length).UserString) - self.form.finalDepth.setText(FreeCAD.Units.Quantity(self.obj.FinalDepth.Value, FreeCAD.Units.Length).UserString) - self.form.peckDepth.setText(FreeCAD.Units.Quantity(self.obj.PeckDepth.Value, FreeCAD.Units.Length).UserString) - self.form.safeHeight.setText(FreeCAD.Units.Quantity(self.obj.SafeHeight.Value, FreeCAD.Units.Length).UserString) - self.form.clearanceHeight.setText(FreeCAD.Units.Quantity(self.obj.ClearanceHeight.Value, FreeCAD.Units.Length).UserString) - self.form.retractHeight.setText(FreeCAD.Units.Quantity(self.obj.RetractHeight.Value, FreeCAD.Units.Length).UserString) - self.form.dwellTime.setText(str(self.obj.DwellTime)) - - if self.obj.DwellEnabled: - self.form.dwellEnabled.setCheckState(QtCore.Qt.Checked) - else: - self.form.dwellEnabled.setCheckState(QtCore.Qt.Unchecked) - - if self.obj.PeckEnabled: - self.form.peckEnabled.setCheckState(QtCore.Qt.Checked) - else: - self.form.peckEnabled.setCheckState(QtCore.Qt.Unchecked) - - if self.obj.AddTipLength: - self.form.chkTipDepth.setCheckState(QtCore.Qt.Checked) - else: - self.form.chkTipDepth.setCheckState(QtCore.Qt.Unchecked) - - self.updateFeatureList() - - controllers = PathUtils.getToolControllers(self.obj) - labels = [c.Label for c in controllers] - self.form.uiToolController.blockSignals(True) - self.form.uiToolController.addItems(labels) - self.form.uiToolController.blockSignals(False) - - if self.obj.ToolController is not None: - index = self.form.uiToolController.findText( - self.obj.ToolController.Label, QtCore.Qt.MatchFixedString) - PathLog.debug("searching for TC label {}. Found Index: {}".format(self.obj.ToolController.Label, index)) - if index >= 0: - self.form.uiToolController.blockSignals(True) - self.form.uiToolController.setCurrentIndex(index) - self.form.uiToolController.blockSignals(False) - - def open(self): - pass - # self.s = SelObserver() - # FreeCADGui.Selection.addObserver(self.s) - - def itemActivated(self): - FreeCADGui.Selection.clearSelection() - slist = self.form.baseList.selectedItems() - # parentJob = PathUtils.findParentJob(self.obj) - for i in slist: - if i.column() == 0: - objstring = i.text().partition(".") - obj = FreeCAD.ActiveDocument.getObject(objstring[0]) - if obj is not None: - if objstring[2] != "": - FreeCADGui.Selection.addSelection(obj, objstring[2]) - else: - FreeCADGui.Selection.addSelection(obj) - - FreeCADGui.updateGui() - - def checkedChanged(self): - disabled = [] - for i in xrange(0, self.form.baseList.rowCount()): - item = self.form.baseList.item(i, 0) - if item.checkState() != QtCore.Qt.Checked: - disabled.append(item.data(self.DataFeatureName)) - self.obj.Disabled = disabled - FreeCAD.ActiveDocument.recompute() - - def enableAll(self): - for i in xrange(0, self.form.baseList.rowCount()): - self.form.baseList.item(i, 0).setCheckState(QtCore.Qt.Checked) - - def enableSelected(self): - slist = self.form.baseList.selectedItems() - for i in slist: - r = i.row() - self.form.baseList.item(r, 0).setCheckState(QtCore.Qt.Checked) - - def disableAll(self): - for i in xrange(0, self.form.baseList.rowCount()): - self.form.baseList.item(i, 0).setCheckState(QtCore.Qt.Unchecked) - - def disableSelected(self): - slist = self.form.baseList.selectedItems() - for i in slist: - r = i.row() - self.form.baseList.item(r, 0).setCheckState(QtCore.Qt.Unchecked) - - def findAll(self): - """ Reset the list of features by running the findHoles again """ - self.obj.Base = [] - self.obj.Disabled = [] - - self.obj.Proxy.execute(self.obj) - - self.setFields() - FreeCAD.ActiveDocument.recompute() - - def addSelected(self): - for sel in FreeCAD.Gui.Selection.getSelectionEx(): - - baseObjects = self.obj.Base - - objectname = sel.ObjectName - sobj = sel.Object - for i, sub in enumerate(sel.SubObjects): - if hasattr(sub, 'ShapeType'): - item = None - if sub.ShapeType == 'Vertex': - PathLog.debug("Selection is a vertex, lets drill that") - item = (sobj, sel.SubElementNames[i]) - elif sub.ShapeType == 'Edge': - if PathUtils.isDrillable(sobj, sub): - PathLog.debug("Selection is a drillable edge, lets drill that") - item = (sobj, sel.SubElementNames[i]) - # check for arcs - isDrillable ignores them. - elif type(sub.Curve) == Part.Circle: - PathLog.debug("Selection is an arc or circle edge, lets drill the center") - item = (sobj, sel.SubElementNames[i]) - elif sub.ShapeType == 'Face': - if PathUtils.isDrillable(sobj.Shape, sub): - PathLog.debug("Selection is a drillable face, lets drill that") - item = (sobj, sel.SubElementNames[i]) - if item and not item in self.obj.Base: - baseObjects.append(item) - - self.obj.Base = baseObjects - PathLog.debug("baseObjects=%s, obj.Base=%s" % (baseObjects, self.obj.Base)) - self.setFields() - - FreeCAD.ActiveDocument.recompute() - - def addCustom(self): - self.np.addCustom() - - def addCustomPoint(self, point, o): - if point is not None: - names = self.obj.Names - positions = self.obj.Positions - enabled = self.obj.Enabled - diameters = self.obj.Diameters - names.append('CustomX{:.3f}Y{:.3f}'.format(point.x, point.y)) - positions.append(FreeCAD.Vector(point.x, point.y, 0)) - enabled.append(1) - diameters.append(0) - self.obj.Names = names - self.obj.Positions = positions - self.obj.Enabled = enabled - self.obj.Diameters = diameters - - self.updateFeatureList() - FreeCAD.ActiveDocument.recompute() - - def getStandardButtons(self): - return int(QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Apply | QtGui.QDialogButtonBox.Cancel) - - def setupUi(self): - PathLog.track() - - # Connect Signals and Slots - self.form.startDepth.editingFinished.connect(self.getFields) - self.form.finalDepth.editingFinished.connect(self.getFields) - self.form.safeHeight.editingFinished.connect(self.getFields) - self.form.retractHeight.editingFinished.connect(self.getFields) - self.form.peckDepth.editingFinished.connect(self.getFields) - self.form.clearanceHeight.editingFinished.connect(self.getFields) - self.form.dwellTime.editingFinished.connect(self.getFields) - self.form.dwellEnabled.stateChanged.connect(self.getFields) - self.form.peckEnabled.stateChanged.connect(self.getFields) - self.form.chkTipDepth.stateChanged.connect(self.getFields) - - # buttons - self.form.uiEnableSelected.clicked.connect(self.enableSelected) - self.form.uiDisableSelected.clicked.connect(self.disableSelected) - self.form.uiFindAllHoles.clicked.connect(self.findAll) - self.form.uiAddSelected.clicked.connect(self.addSelected) - self.form.uiAddCustom.clicked.connect(self.addCustom) - - self.form.baseList.itemSelectionChanged.connect(self.itemActivated) - self.form.baseList.itemChanged.connect(self.checkedChanged) - - self.form.uiToolController.currentIndexChanged.connect(self.getFields) - - self.setFields() - - -if FreeCAD.GuiUp: - # register the FreeCAD command - FreeCADGui.addCommand('Path_Drilling', CommandPathDrilling()) - -FreeCAD.Console.PrintLog("Loading PathDrilling... done\n") diff --git a/src/Mod/Path/PathScripts/PathDrillingGui.py b/src/Mod/Path/PathScripts/PathDrillingGui.py new file mode 100644 index 0000000000..7f3e485d9c --- /dev/null +++ b/src/Mod/Path/PathScripts/PathDrillingGui.py @@ -0,0 +1,212 @@ +# -*- coding: utf-8 -*- + +# *************************************************************************** +# * * +# * Copyright (c) 2017 sliptonic * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +import FreeCAD +import FreeCADGui +import PathScripts.PathOpGui as PathOpGui +import PathScripts.PathDrilling as PathDrilling +import PathScripts.PathLog as PathLog +import PathScripts.PathPocketBaseGui as PathPocketBaseGui + +from PySide import QtCore, QtGui + +if True: + PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) + PathLog.trackModule(PathLog.thisModule()) +else: + PathLog.setLevel(PathLog.Level.NOTICE, PathLog.thisModule()) + +class TaskPanelHoleGeometryPage(PathOpGui.TaskPanelBaseGeometryPage): + DataFeatureName = QtCore.Qt.ItemDataRole.UserRole + DataObject = QtCore.Qt.ItemDataRole.UserRole + 1 + DataObjectSub = QtCore.Qt.ItemDataRole.UserRole + 2 + + def getForm(self): + return FreeCADGui.PySideUic.loadUi(":/panels/PageBaseHoleGeometryEdit.ui") + + def setFields(self, obj): + PathLog.track() + self.form.baseList.blockSignals(True) + self.form.baseList.clearContents() + self.form.baseList.setRowCount(0) + for i, (base, subs) in enumerate(self.obj.Base): + for sub in subs: + self.form.baseList.insertRow(self.form.baseList.rowCount()) + + item = QtGui.QTableWidgetItem("%s.%s" % (base.Label, sub)) + item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable) + if self.obj.Proxy.isHoleEnabled(self.obj, base, sub): + item.setCheckState(QtCore.Qt.Checked) + else: + item.setCheckState(QtCore.Qt.Unchecked) + name = "%s.%s" % (base.Name, sub) + item.setData(self.DataFeatureName, name) + item.setData(self.DataObject, base) + item.setData(self.DataObjectSub, sub) + self.form.baseList.setItem(self.form.baseList.rowCount()-1, 0, item) + + item = QtGui.QTableWidgetItem("{:.3f}".format(self.obj.Proxy.holeDiameter(self.obj, base, sub))) + item.setData(self.DataFeatureName, name) + item.setData(self.DataObject, base) + item.setData(self.DataObjectSub, sub) + item.setTextAlignment(QtCore.Qt.AlignHCenter) + self.form.baseList.setItem(self.form.baseList.rowCount()-1, 1, item) + + self.form.baseList.resizeColumnToContents(0) + self.form.baseList.blockSignals(False) + + def itemActivated(self): + PathLog.track() + FreeCADGui.Selection.clearSelection() + activatedRows = [] + for item in self.form.baseList.selectedItems(): + row = item.row() + if not row in activatedRows: + activatedRows.append(row) + obj = item.data(self.DataObject) + sub = str(item.data(self.DataObjectSub)) + PathLog.debug("itemActivated() -> %s.%s" % (obj.Label, sub)) + if sub: + FreeCADGui.Selection.addSelection(obj, sub) + else: + FreeCADGui.Selection.addSelection(obj) + #FreeCADGui.updateGui() + + def deleteBase(self): + PathLog.track() + deletedRows = [] + selected = self.form.baseList.selectedItems() + for item in selected: + row = self.form.baseList.row(item) + if not row in deletedRows: + deletedRows.append(row) + self.form.baseList.removeRow(row) + self.updateBase() + #self.obj.Proxy.execute(self.obj) + FreeCAD.ActiveDocument.recompute() + + def updateBase(self): + PathLog.track() + newlist = [] + for i in range(self.form.baseList.rowCount()): + item = self.form.baseList.item(i, 0) + obj = item.data(self.DataObject) + sub = str(item.data(self.DataObjectSub)) + base = (obj, sub) + PathLog.debug("keeping (%s.%s)" % (obj.Label, sub)) + newlist.append(base) + PathLog.debug("obj.Base=%s newlist=%s" % (self.obj.Base, newlist)) + self.obj.Base = newlist + + def checkedChanged(self): + PathLog.track() + disabled = [] + for i in xrange(0, self.form.baseList.rowCount()): + item = self.form.baseList.item(i, 0) + if item.checkState() != QtCore.Qt.Checked: + disabled.append(item.data(self.DataFeatureName)) + self.obj.Disabled = disabled + FreeCAD.ActiveDocument.recompute() + + def registerSignalHandlers(self, obj): + self.form.baseList.itemSelectionChanged.connect(self.itemActivated) + self.form.addBase.clicked.connect(self.addBase) + self.form.deleteBase.clicked.connect(self.deleteBase) + self.form.resetBase.clicked.connect(self.resetBase) + self.form.baseList.itemChanged.connect(self.checkedChanged) + + def resetBase(self): + self.obj.Base = [] + self.obj.Disabled = [] + + self.obj.Proxy.execute(self.obj) + FreeCAD.ActiveDocument.recompute() + + def updateData(self, obj, prop): + if prop in ['Base', 'Disabled']: + self.setFields(self.obj) + +class TaskPanelOpPage(PathOpGui.TaskPanelPage): + + def getForm(self): + return FreeCADGui.PySideUic.loadUi(":/panels/PageOpDrillingEdit.ui") + + def getFields(self, obj): + PathLog.track() + self.obj.PeckDepth = FreeCAD.Units.Quantity(self.form.peckDepth.text()).Value + self.obj.RetractHeight = FreeCAD.Units.Quantity(self.form.retractHeight.text()).Value + self.obj.DwellTime = FreeCAD.Units.Quantity(self.form.dwellTime.text()).Value + + self.obj.DwellEnabled = self.form.dwellEnabled.isChecked() + self.obj.PeckEnabled = self.form.peckEnabled.isChecked() + self.obj.AddTipLength = self.form.useTipLength.isChecked() + + self.updateToolController(obj, self.form.toolController) + + def setFields(self, obj): + PathLog.track() + + self.form.peckDepth.setText(FreeCAD.Units.Quantity(self.obj.PeckDepth.Value, FreeCAD.Units.Length).UserString) + self.form.retractHeight.setText(FreeCAD.Units.Quantity(self.obj.RetractHeight.Value, FreeCAD.Units.Length).UserString) + self.form.dwellTime.setText(str(self.obj.DwellTime)) + + if self.obj.DwellEnabled: + self.form.dwellEnabled.setCheckState(QtCore.Qt.Checked) + else: + self.form.dwellEnabled.setCheckState(QtCore.Qt.Unchecked) + + if self.obj.PeckEnabled: + self.form.peckEnabled.setCheckState(QtCore.Qt.Checked) + else: + self.form.peckEnabled.setCheckState(QtCore.Qt.Unchecked) + + if self.obj.AddTipLength: + self.form.useTipLength.setCheckState(QtCore.Qt.Checked) + else: + self.form.useTipLength.setCheckState(QtCore.Qt.Unchecked) + + self.setupToolController(self.obj, self.form.toolController) + + def getSignalsForUpdate(self, obj): + signals = [] + signals.append(self.form.retractHeight.editingFinished) + signals.append(self.form.peckDepth.editingFinished) + signals.append(self.form.dwellTime.editingFinished) + signals.append(self.form.dwellEnabled.stateChanged) + signals.append(self.form.peckEnabled.stateChanged) + signals.append(self.form.useTipLength.stateChanged) + return signals + + def taskPanelBaseGeometryPage(self, obj, features): + return TaskPanelHoleGeometryPage(obj, features) + +PathOpGui.SetupOperation('Drilling', + PathDrilling.Create, + TaskPanelOpPage, + 'Path-Drilling', + QtCore.QT_TRANSLATE_NOOP("PathDrilling", "Drilling"), + "P, O", + QtCore.QT_TRANSLATE_NOOP("PathDrilling", "Creates a Path Drilling object from a features of a base object")) + +FreeCAD.Console.PrintLog("Loading PathDrillingGui... done\n") diff --git a/src/Mod/Path/PathScripts/PathOp.py b/src/Mod/Path/PathScripts/PathOp.py index 2cc4a89d3d..f604a90c68 100644 --- a/src/Mod/Path/PathScripts/PathOp.py +++ b/src/Mod/Path/PathScripts/PathOp.py @@ -46,12 +46,13 @@ FeatureDepths = 0x0002 FeatureHeights = 0x0004 FeatureStartPoint = 0x0008 FeatureFinishDepth = 0x0010 -FeatureBaseFeatures = 0x1000 -FeatureBaseFaces = 0x2000 -FeatureBaseEdges = 0x4000 +FeatureStepDown = 0x0020 +FeatureBaseVertexes = 0x1000 +FeatureBaseEdges = 0x2000 +FeatureBaseFaces = 0x4000 FeatureBasePanels = 0x8000 -FeatureBaseGeometry = FeatureBaseFeatures | FeatureBaseFaces | FeatureBaseEdges | FeatureBasePanels +FeatureBaseGeometry = FeatureBaseVertexes | FeatureBaseFaces | FeatureBaseEdges | FeatureBasePanels class ObjectOp(object): @@ -69,10 +70,12 @@ class ObjectOp(object): obj.addProperty("App::PropertyLink", "ToolController", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "The tool controller that will be used to calculate the path")) if FeatureDepths & self.opFeatures(obj): - obj.addProperty("App::PropertyDistance", "StepDown", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "Incremental Step Down of Tool")) obj.addProperty("App::PropertyDistance", "StartDepth", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "Starting Depth of Tool- first cut depth in Z")) obj.addProperty("App::PropertyDistance", "FinalDepth", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "Final Depth of Tool- lowest value in Z")) + if FeatureStepDown & self.opFeatures(obj): + obj.addProperty("App::PropertyDistance", "StepDown", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "Incremental Step Down of Tool")) + if FeatureFinishDepth & self.opFeatures(obj): obj.addProperty("App::PropertyDistance", "FinishDepth", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "Maximum material removed on final pass.")) @@ -116,6 +119,8 @@ class ObjectOp(object): if FeatureDepths & self.opFeatures(obj): obj.StartDepth = 1.0 obj.FinalDepth = 0.0 + + if FeatureStepDown & self.opFeatures(obj): obj.StepDown = 1.0 if FeatureHeights & self.opFeatures(obj): diff --git a/src/Mod/Path/PathScripts/PathOpGui.py b/src/Mod/Path/PathScripts/PathOpGui.py index bc39cb3540..da21b49956 100644 --- a/src/Mod/Path/PathScripts/PathOpGui.py +++ b/src/Mod/Path/PathScripts/PathOpGui.py @@ -24,7 +24,6 @@ import FreeCAD import FreeCADGui -import PathScripts.PathAreaOp as PathAreaOp import PathScripts.PathLog as PathLog import PathScripts.PathSelection as PathSelection import PathScripts.PathOp as PathOp @@ -38,11 +37,12 @@ from PySide import QtCore, QtGui # 1 ... reverse order # 2 ... multi panel layout # 3 ... multi panel layout reverse -TaskPanelLayout = 2 +TaskPanelLayout = 0 -PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) -PathLog.trackModule(PathLog.thisModule()) +if False: + PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) + PathLog.trackModule(PathLog.thisModule()) def translate(context, text, disambig=None): return QtCore.QCoreApplication.translate(context, text, disambig) @@ -62,6 +62,7 @@ class ViewProvider(object): def attach(self, vobj): PathLog.track() self.Object = vobj.Object + self.panel = None return def deleteObjectsOnReject(self): @@ -70,15 +71,21 @@ class ViewProvider(object): def setEdit(self, vobj, mode=0): PathLog.track() - FreeCADGui.Control.closeDialog() page = self.getTaskPanelOpPage(vobj.Object) selection = self.getSelectionFactory() - taskd = TaskPanel(vobj.Object, self.deleteObjectsOnReject(), page, selection) - FreeCADGui.Control.showDialog(taskd) - taskd.setupUi() + self.setupTaskPanel(TaskPanel(vobj.Object, self.deleteObjectsOnReject(), page, selection)) self.deleteOnReject = False return True + def setupTaskPanel(self, panel): + self.panel = panel + FreeCADGui.Control.closeDialog() + FreeCADGui.Control.showDialog(panel) + panel.setupUi() + + def clearTaskPanel(self): + self.panel = None + def __getstate__(self): PathLog.track() state = {} @@ -105,6 +112,11 @@ class ViewProvider(object): def getSelectionFactory(self): return PathSelection.select(self.OpName) + def updateData(self, obj, prop): + # PathLog.track(obj.Label, prop) # Creates a lot of noise + if self.panel: + self.panel.updateData(obj, prop) + class TaskPanelPage(object): # task panel interaction framework @@ -132,6 +144,9 @@ class TaskPanelPage(object): signal.connect(self.pageGetFields) self.registerSignalHandlers(self.obj) + def pageUpdateData(self, obj, prop): + self.updateData(obj, prop) + def setTitle(self, title): self.title = title def getTitle(self, obj): @@ -150,6 +165,8 @@ class TaskPanelPage(object): return [] def registerSignalHandlers(self, obj): pass + def updateData(self, obj, prop): + pass # helpers def selectInComboBox(self, name, combo): @@ -171,14 +188,21 @@ class TaskPanelPage(object): if obj.ToolController is not None: self.selectInComboBox(obj.ToolController.Label, combo) + def updateToolController(self, obj, combo): + tc = PathUtils.findToolController(obj, combo.currentText()) + self.obj.ToolController = tc + class TaskPanelBaseGeometryPage(TaskPanelPage): DataObject = QtCore.Qt.ItemDataRole.UserRole DataObjectSub = QtCore.Qt.ItemDataRole.UserRole + 1 def getForm(self): return FreeCADGui.PySideUic.loadUi(":/panels/PageBaseGeometryEdit.ui") + def getTitle(self, obj): + return translate("PathOp", "Base Geometry") def getFields(self, obj): pass + def setFields(self, obj): self.form.baseList.blockSignals(True) self.form.baseList.clear() @@ -201,6 +225,8 @@ class TaskPanelBaseGeometryPage(TaskPanelPage): FreeCADGui.Selection.addSelection(obj) #FreeCADGui.updateGui() + def supportsVertexes(self): + return self.features & PathOp.FeatureBaseVertexes def supportsEdges(self): return self.features & PathOp.FeatureBaseEdges def supportsFaces(self): @@ -224,11 +250,14 @@ class TaskPanelBaseGeometryPage(TaskPanelPage): return False sel = selection[0] if sel.HasSubObjects: + if not self.supportsVertexes() and selection[0].SubObjects[0].ShapeType == "Vertex": + PathLog.error(translate("PathProject", "Vertexes are not supported")) + return False if not self.supportsEdges() and selection[0].SubObjects[0].ShapeType == "Edge": - PathLog.error(translate("PathProject", "Please select only %s of a solid" % self.featureName())) + PathLog.error(translate("PathProject", "Edges are not supported")) return False if not self.supportsFaces() and selection[0].SubObjects[0].ShapeType == "Face": - PathLog.error(translate("PathProject", "Please select only %s of a solid" % self.featureName())) + PathLog.error(translate("PathProject", "Faces are not supported")) return False else: if not self.supportsPanels() or not 'Panel' in sel.Object.Name: @@ -249,7 +278,7 @@ class TaskPanelBaseGeometryPage(TaskPanelPage): selected = self.form.baseList.selectedItems() for item in selected: self.form.baseList.takeItem(self.form.baseList.row(item)) - self.updateBase() + self.updateBase() #self.obj.Proxy.execute(self.obj) #FreeCAD.ActiveDocument.recompute() @@ -273,6 +302,11 @@ class TaskPanelBaseGeometryPage(TaskPanelPage): self.form.deleteBase.clicked.connect(self.deleteBase) self.form.updateBase.clicked.connect(self.updateBase) + def pageUpdateData(self, obj, prop): + if prop in ['Base']: + self.setFields(obj) + + class TaskPanelHeightsPage(TaskPanelPage): def getForm(self): return FreeCADGui.PySideUic.loadUi(":/panels/PageHeightsEdit.ui") @@ -287,44 +321,57 @@ class TaskPanelHeightsPage(TaskPanelPage): def getSignalsForUpdate(self, obj): return [self.form.safeHeight.editingFinished, self.form.clearanceHeight.editingFinished] + def pageUpdateData(self, obj, prop): + if prop in ['SafeHeight', 'ClearanceHeight']: + self.setFields(obj) + + class TaskPanelDepthsPage(TaskPanelPage): def getForm(self): return FreeCADGui.PySideUic.loadUi(":/panels/PageDepthsEdit.ui") def initPage(self, obj): - if PathOp.FeatureFinishDepth & self.features: - self.form.finishDepth.setEnabled(True) - self.form.finishDepthLabel.setEnabled(True) - else: + if not PathOp.FeatureStepDown & self.features: + self.form.stepDown.hide() + self.form.stepDownLabel.hide() + + if not PathOp.FeatureFinishDepth & self.features: self.form.finishDepth.hide() self.form.finishDepthLabel.hide() def getTitle(self, obj): - return translate("PathAreaOp", "Depths") + return translate("PathOp", "Depths") def getFields(self, obj): obj.StartDepth = FreeCAD.Units.Quantity(self.form.startDepth.text()).Value obj.FinalDepth = FreeCAD.Units.Quantity(self.form.finalDepth.text()).Value - obj.StepDown = FreeCAD.Units.Quantity(self.form.stepDown.text()).Value + if PathOp.FeatureStepDown & self.features: + obj.StepDown = FreeCAD.Units.Quantity(self.form.stepDown.text()).Value if PathOp.FeatureFinishDepth & self.features: obj.FinishDepth = FreeCAD.Units.Quantity(self.form.finishDepth.text()).Value def setFields(self, obj): self.form.startDepth.setText(FreeCAD.Units.Quantity(obj.StartDepth.Value, FreeCAD.Units.Length).UserString) self.form.finalDepth.setText(FreeCAD.Units.Quantity(obj.FinalDepth.Value, FreeCAD.Units.Length).UserString) - self.form.stepDown.setText(FreeCAD.Units.Quantity(obj.StepDown.Value, FreeCAD.Units.Length).UserString) + if PathOp.FeatureStepDown & self.features: + self.form.stepDown.setText(FreeCAD.Units.Quantity(obj.StepDown.Value, FreeCAD.Units.Length).UserString) if PathOp.FeatureFinishDepth & self.features: self.form.finishDepth.setText(FreeCAD.Units.Quantity(obj.FinishDepth.Value, FreeCAD.Units.Length).UserString) def getSignalsForUpdate(self, obj): signals = [] signals.append(self.form.startDepth.editingFinished) signals.append(self.form.finalDepth.editingFinished) - signals.append(self.form.stepDown.editingFinished) + if PathOp.FeatureStepDown & self.features: + signals.append(self.form.stepDown.editingFinished) if PathOp.FeatureFinishDepth & self.features: signals = super(self.__class__, self).getSignalsForUpdate(obj) signals.append(self.form.finishDepth.editingFinished) return signals + def pageUpdateData(self, obj, prop): + if prop in ['StartDepth', 'FinalDepth', 'StepDown', 'FinishDepth']: + self.setFields(obj) + class TaskPanel(object): def __init__(self, obj, deleteOnReject, opPage, selectionFactory): @@ -354,7 +401,7 @@ class TaskPanel(object): else: self.featurePages.append(TaskPanelHeightsPage(obj, features)) - opPage.setTitle(translate('PathAreaOp', 'Operation')) + opPage.setTitle(translate('PathOp', 'Operation')) self.featurePages.append(opPage) for page in self.featurePages: @@ -398,23 +445,27 @@ class TaskPanel(object): page.setClean() def accept(self): - FreeCADGui.Control.closeDialog() - FreeCADGui.ActiveDocument.resetEdit() FreeCAD.ActiveDocument.commitTransaction() - FreeCADGui.Selection.removeObserver(self.s) + self.cleanup() + if self.isDirty: + self.panelGetFields() FreeCAD.ActiveDocument.recompute() def reject(self): - FreeCADGui.Control.closeDialog() - FreeCADGui.ActiveDocument.resetEdit() FreeCAD.ActiveDocument.abortTransaction() - FreeCADGui.Selection.removeObserver(self.s) + self.cleanup() if self.deleteOnReject: FreeCAD.ActiveDocument.openTransaction(translate("Path_AreaOp", "Uncreate AreaOp Operation")) FreeCAD.ActiveDocument.removeObject(self.obj.Name) FreeCAD.ActiveDocument.commitTransaction() FreeCAD.ActiveDocument.recompute() + def cleanup(self): + self.obj.ViewObject.Proxy.clearTaskPanel() + FreeCADGui.Control.closeDialog() + FreeCADGui.ActiveDocument.resetEdit() + FreeCADGui.Selection.removeObserver(self.s) + def clicked(self, button): if button == QtGui.QDialogButtonBox.Apply: self.panelGetFields() @@ -453,6 +504,11 @@ class TaskPanel(object): for page in self.featurePages: page.pageRegisterSignalHandlers() + def updateData(self, obj, prop): + # PathLog.track(obj.Label, prop) # creates a lot of noise + for page in self.featurePages: + page.pageUpdateData(obj, prop) + class SelObserver: def __init__(self, factory): diff --git a/src/Mod/Path/PathScripts/PathPocketBaseGui.py b/src/Mod/Path/PathScripts/PathPocketBaseGui.py index c12a53b26f..3d5937de82 100644 --- a/src/Mod/Path/PathScripts/PathPocketBaseGui.py +++ b/src/Mod/Path/PathScripts/PathPocketBaseGui.py @@ -29,7 +29,6 @@ import PathScripts.PathOpGui as PathOpGui import PathScripts.PathPocket as PathPocket import PathScripts.PathSelection as PathSelection -from PathScripts import PathUtils from PySide import QtCore, QtGui def translate(context, text, disambig=None): @@ -57,8 +56,7 @@ class TaskPanelOpPage(PathOpGui.TaskPanelPage): self.obj.OffsetPattern = str(self.form.offsetPattern.currentText()) self.obj.ZigZagAngle = FreeCAD.Units.Quantity(self.form.zigZagAngle.text()).Value - tc = PathUtils.findToolController(self.obj, self.form.toolController.currentText()) - self.obj.ToolController = tc + self.updateToolController(self.obj, self.form.toolController) if FeaturePocket & self.pocketFeatures(): self.obj.MaterialAllowance = FreeCAD.Units.Quantity(self.form.extraOffset.text()).Value diff --git a/src/Mod/Path/PathScripts/PathProfileBaseGui.py b/src/Mod/Path/PathScripts/PathProfileBaseGui.py index 9f0a21bba0..e3333887f3 100644 --- a/src/Mod/Path/PathScripts/PathProfileBaseGui.py +++ b/src/Mod/Path/PathScripts/PathProfileBaseGui.py @@ -28,7 +28,6 @@ import PathScripts.PathLog as PathLog import PathScripts.PathOpGui as PathOpGui import PathScripts.PathProfileFaces as PathProfileFaces import PathScripts.PathSelection as PathSelection -import PathScripts.PathUtils as PathUtils from PySide import QtCore @@ -60,8 +59,7 @@ class TaskPanelOpPage(PathOpGui.TaskPanelPage): self.obj.UseStartPoint = self.form.useStartPoint.isChecked() self.obj.Direction = str(self.form.direction.currentText()) - tc = PathUtils.findToolController(self.obj, self.form.toolController.currentText()) - self.obj.ToolController = tc + self.updateToolController(self.obj, self.form.toolController) if FeatureSide & self.profileFeatures(): self.obj.Side = str(self.form.cutSide.currentText()) diff --git a/src/Mod/Path/PathScripts/PathSelection.py b/src/Mod/Path/PathScripts/PathSelection.py index f0e89dd352..6dd97650d5 100644 --- a/src/Mod/Path/PathScripts/PathSelection.py +++ b/src/Mod/Path/PathScripts/PathSelection.py @@ -28,9 +28,9 @@ import FreeCADGui import PathScripts.PathLog as PathLog import PathScripts.PathUtils as PathUtils -LOG_MODULE = 'PathSelection' -PathLog.setLevel(PathLog.Level.INFO, LOG_MODULE) -PathLog.trackModule('PathSelection') +if False: + PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) + PathLog.trackModule(PathLog.thisModule()) class EGate: @@ -60,10 +60,10 @@ class ENGRAVEGate: class DRILLGate: def allow(self, doc, obj, sub): PathLog.debug('obj: {} sub: {}'.format(obj, sub)) - if hasattr(obj, "Shape"): - obj = obj.Shape - subobj = obj.getElement(sub) - return PathUtils.isDrillable(obj, subobj) + if hasattr(obj, "Shape") and sub: + shape = obj.Shape + subobj = shape.getElement(sub) + return PathUtils.isDrillable(shape, subobj) else: return False @@ -163,6 +163,7 @@ def surfaceselect(): def select(op): opsel = {} opsel['Contour'] = contourselect + opsel['Drilling'] = drillselect opsel['MillFace'] = pocketselect opsel['Pocket'] = pocketselect opsel['Profile Edges'] = eselect