From 9ea837fd901e27d47dda8ce3084cdbf0a62fa11e Mon Sep 17 00:00:00 2001 From: sliptonic Date: Thu, 17 Dec 2020 09:39:33 -0600 Subject: [PATCH] fixes 4466 --- .../Resources/panels/DlgJobTemplateExport.ui | 24 ++++++++- src/Mod/Path/PathScripts/PathJobCmd.py | 16 ++++-- src/Mod/Path/PathScripts/PathJobDlg.py | 21 ++++++-- src/Mod/Path/PathScripts/PathSetupSheet.py | 53 ++++++++++++------- 4 files changed, 85 insertions(+), 29 deletions(-) diff --git a/src/Mod/Path/Gui/Resources/panels/DlgJobTemplateExport.ui b/src/Mod/Path/Gui/Resources/panels/DlgJobTemplateExport.ui index fddb21dc45..0e55f17f46 100644 --- a/src/Mod/Path/Gui/Resources/panels/DlgJobTemplateExport.ui +++ b/src/Mod/Path/Gui/Resources/panels/DlgJobTemplateExport.ui @@ -119,6 +119,19 @@ + + + + <html><head/><body><p>Enable to include the default coolant mode in the template.</p></body></html> + + + Coolant Mode + + + true + + + @@ -192,7 +205,16 @@ - + + 0 + + + 0 + + + 0 + + 0 diff --git a/src/Mod/Path/PathScripts/PathJobCmd.py b/src/Mod/Path/PathScripts/PathJobCmd.py index 0a9efcb765..9b600dc32b 100644 --- a/src/Mod/Path/PathScripts/PathJobCmd.py +++ b/src/Mod/Path/PathScripts/PathJobCmd.py @@ -33,12 +33,15 @@ import os from PySide import QtCore, QtGui + # Qt translation handling def translate(context, text, disambig=None): return QtCore.QCoreApplication.translate(context, text, disambig) + PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) -#PathLog.trackModule(PathLog.thisModule()) +# PathLog.trackModule(PathLog.thisModule()) + class CommandJobCreate: ''' @@ -87,7 +90,6 @@ class CommandJobTemplateExport: on Job creation and be available for selection. ''' - def __init__(self): pass @@ -111,7 +113,6 @@ class CommandJobTemplateExport: return job return None - def IsActive(self): return self.GetJob() is not None @@ -163,7 +164,12 @@ class CommandJobTemplateExport: # setup sheet setupSheetAttrs = None if dialog: - setupSheetAttrs = job.Proxy.setupSheet.templateAttributes(dialog.includeSettingToolRapid(), dialog.includeSettingOperationHeights(), dialog.includeSettingOperationDepths(), dialog.includeSettingOpsSettings()) + setupSheetAttrs = job.Proxy.setupSheet.templateAttributes( + dialog.includeSettingToolRapid(), + dialog.includeSettingCoolant(), + dialog.includeSettingOperationHeights(), + dialog.includeSettingOperationDepths(), + dialog.includeSettingOpsSettings()) else: setupSheetAttrs = job.Proxy.setupSheet.templateAttributes(True, True, True) if setupSheetAttrs: @@ -174,10 +180,10 @@ class CommandJobTemplateExport: with open(PathUtil.toUnicode(path), 'w') as fp: json.dump(encoded, fp, sort_keys=True, indent=2) + if FreeCAD.GuiUp: # register the FreeCAD command FreeCADGui.addCommand('Path_Job', CommandJobCreate()) FreeCADGui.addCommand('Path_ExportTemplate', CommandJobTemplateExport()) FreeCAD.Console.PrintLog("Loading PathJobCmd... done\n") - diff --git a/src/Mod/Path/PathScripts/PathJobDlg.py b/src/Mod/Path/PathScripts/PathJobDlg.py index 6a303caa83..a28466eb3c 100644 --- a/src/Mod/Path/PathScripts/PathJobDlg.py +++ b/src/Mod/Path/PathScripts/PathJobDlg.py @@ -32,12 +32,15 @@ import os from PySide import QtCore, QtGui from collections import Counter + # Qt translation handling def translate(context, text, disambig=None): return QtCore.QCoreApplication.translate(context, text, disambig) + PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) -#PathLog.trackModule(PathLog.thisModule()) +# PathLog.trackModule(PathLog.thisModule()) + class _ItemDelegate(QtGui.QStyledItemDelegate): @@ -148,7 +151,6 @@ class JobCreate: self.model = QtGui.QStandardItemModel(self.dialog) self.model.setHorizontalHeaderLabels(['Model', 'Count']) - if self.itemsSolid.hasChildren(): self.model.appendRow(self.itemsSolid) if expandSolids or not (expand2Ds or expandJobs): @@ -244,7 +246,7 @@ class JobCreate: models = [] for i in range(self.itemsSolid.rowCount()): - for j in range(self.itemsSolid.child(i, 1).data(QtCore.Qt.EditRole)): # pylint: disable=unused-variable + for j in range(self.itemsSolid.child(i, 1).data(QtCore.Qt.EditRole)): # pylint: disable=unused-variable models.append(self.itemsSolid.child(i).data(self.DataObject)) for i in range(self.items2D.rowCount()): @@ -320,12 +322,14 @@ class JobTemplateExport: rapidChanged = not job.SetupSheet.Proxy.hasDefaultToolRapids() depthsChanged = not job.SetupSheet.Proxy.hasDefaultOperationDepths() heightsChanged = not job.SetupSheet.Proxy.hasDefaultOperationHeights() + coolantChanged = not job.SetupSheet.Proxy.hasDefaultCoolantMode() opsWithSettings = job.SetupSheet.Proxy.operationsWithSettings() - settingsChanged = rapidChanged or depthsChanged or heightsChanged or 0 != len(opsWithSettings) + settingsChanged = rapidChanged or depthsChanged or heightsChanged or coolantChanged or 0 != len(opsWithSettings) self.dialog.settingsGroup.setChecked(settingsChanged) self.dialog.settingToolRapid.setChecked(rapidChanged) self.dialog.settingOperationDepths.setChecked(depthsChanged) self.dialog.settingOperationHeights.setChecked(heightsChanged) + self.dialog.settingCoolant.setChecked(coolantChanged) self.dialog.settingsOpsList.clear() for op in opsWithSettings: @@ -358,20 +362,28 @@ class JobTemplateExport: def includeStock(self): return self.dialog.stockGroup.isChecked() + def includeStockExtent(self): return self.dialog.stockExtent.isChecked() + def includeStockPlacement(self): return self.dialog.stockPlacement.isChecked() def includeSettings(self): return self.dialog.settingsGroup.isChecked() + def includeSettingToolRapid(self): return self.dialog.settingToolRapid.isChecked() + def includeSettingOperationHeights(self): return self.dialog.settingOperationHeights.isChecked() + def includeSettingOperationDepths(self): return self.dialog.settingOperationDepths.isChecked() + def includeSettingCoolant(self): + return self.dialog.settingCoolant.isChecked() + def includeSettingOpsSettings(self): ops = [] for i in range(self.dialog.settingsOpsList.count()): @@ -382,4 +394,3 @@ class JobTemplateExport: def exec_(self): return self.dialog.exec_() - diff --git a/src/Mod/Path/PathScripts/PathSetupSheet.py b/src/Mod/Path/PathScripts/PathSetupSheet.py index 59f70967ac..87203d6a95 100644 --- a/src/Mod/Path/PathScripts/PathSetupSheet.py +++ b/src/Mod/Path/PathScripts/PathSetupSheet.py @@ -35,11 +35,13 @@ __doc__ = "A container for all default values and job specific configuration val _RegisteredOps = {} PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) -#PathLog.trackModule(PathLog.thisModule()) +# PathLog.trackModule(PathLog.thisModule()) + def translate(context, text, disambig=None): return PySide.QtCore.QCoreApplication.translate(context, text, disambig) + class Template: # pylint: disable=no-init @@ -59,7 +61,7 @@ class Template: def _traverseTemplateAttributes(attrs, codec): coded = {} - for key,value in PathUtil.keyValueIter(attrs): + for key, value in PathUtil.keyValueIter(attrs): if type(value) == dict: PathLog.debug("%s is a dict" % key) coded[key] = _traverseTemplateAttributes(value, codec) @@ -74,6 +76,7 @@ def _traverseTemplateAttributes(attrs, codec): coded[key] = value return coded + class SetupSheet: '''Property container object used by a Job to hold global reference values. ''' @@ -92,20 +95,20 @@ class SetupSheet: def __init__(self, obj): self.obj = obj - obj.addProperty('App::PropertySpeed', 'VertRapid', 'ToolController', translate('PathSetupSheet', 'Default speed for horizontal rapid moves.')) + obj.addProperty('App::PropertySpeed', 'VertRapid', 'ToolController', translate('PathSetupSheet', 'Default speed for horizontal rapid moves.')) obj.addProperty('App::PropertySpeed', 'HorizRapid', 'ToolController', translate('PathSetupSheet', 'Default speed for vertical rapid moves.')) obj.addProperty('App::PropertyStringList', 'CoolantModes', 'CoolantMode', translate('PathSetupSheet', 'Coolant Modes')) obj.addProperty('App::PropertyEnumeration', 'CoolantMode', 'CoolantMode', translate('PathSetupSheet', 'Default coolant mode.')) - obj.addProperty('App::PropertyLength', 'SafeHeightOffset', 'OperationHeights', translate('PathSetupSheet', 'The usage of this field depends on SafeHeightExpression - by default its value is added to StartDepth and used for SafeHeight of an operation.')) - obj.addProperty('App::PropertyString', 'SafeHeightExpression', 'OperationHeights', translate('PathSetupSheet', 'Expression set for the SafeHeight of new operations.')) - obj.addProperty('App::PropertyLength', 'ClearanceHeightOffset', 'OperationHeights', translate('PathSetupSheet', 'The usage of this field depends on ClearanceHeightExpression - by default is value is added to StartDepth and used for ClearanceHeight of an operation.')) + obj.addProperty('App::PropertyLength', 'SafeHeightOffset', 'OperationHeights', translate('PathSetupSheet', 'The usage of this field depends on SafeHeightExpression - by default its value is added to StartDepth and used for SafeHeight of an operation.')) + obj.addProperty('App::PropertyString', 'SafeHeightExpression', 'OperationHeights', translate('PathSetupSheet', 'Expression set for the SafeHeight of new operations.')) + obj.addProperty('App::PropertyLength', 'ClearanceHeightOffset', 'OperationHeights', translate('PathSetupSheet', 'The usage of this field depends on ClearanceHeightExpression - by default is value is added to StartDepth and used for ClearanceHeight of an operation.')) obj.addProperty('App::PropertyString', 'ClearanceHeightExpression', 'OperationHeights', translate('PathSetupSheet', 'Expression set for the ClearanceHeight of new operations.')) obj.addProperty('App::PropertyString', 'StartDepthExpression', 'OperationDepths', translate('PathSetupSheet', 'Expression used for StartDepth of new operations.')) obj.addProperty('App::PropertyString', 'FinalDepthExpression', 'OperationDepths', translate('PathSetupSheet', 'Expression used for FinalDepth of new operations.')) - obj.addProperty('App::PropertyString', 'StepDownExpression', 'OperationDepths', translate('PathSetupSheet', 'Expression used for StepDown of new operations.')) + obj.addProperty('App::PropertyString', 'StepDownExpression', 'OperationDepths', translate('PathSetupSheet', 'Expression used for StepDown of new operations.')) obj.SafeHeightOffset = self.decodeAttributeString(self.DefaultSafeHeightOffset) obj.ClearanceHeightOffset = self.decodeAttributeString(self.DefaultClearanceHeightOffset) @@ -154,31 +157,38 @@ class SetupSheet: return False return True + def hasDefaultCoolantMode(self): + return self.obj.CoolantMode == "None" + def setFromTemplate(self, attrs): '''setFromTemplate(attrs) ... sets the default values from the given dictionary.''' for name in Template.All: if attrs.get(name) is not None: setattr(self.obj, name, attrs[name]) - for opName,op in PathUtil.keyValueIter(_RegisteredOps): + for opName, op in PathUtil.keyValueIter(_RegisteredOps): opSetting = attrs.get(opName) if opSetting is not None: prototype = op.prototype(opName) for propName in op.properties(): value = opSetting.get(propName) - if not value is None: + if value is not None: prop = prototype.getProperty(propName) propertyName = OpPropertyName(opName, propName) propertyGroup = OpPropertyGroup(opName) prop.setupProperty(self.obj, propertyName, propertyGroup, prop.valueFromString(value)) - - def templateAttributes(self, includeRapids=True, includeCoolantMode=True, includeHeights=True, includeDepths=True, includeOps=None): + def templateAttributes(self, + includeRapids=True, + includeCoolantMode=True, + includeHeights=True, + includeDepths=True, + includeOps=None): '''templateAttributes(includeRapids, includeHeights, includeDepths) ... answers a dictionary with the default values.''' attrs = {} if includeRapids: - attrs[Template.VertRapid] = self.obj.VertRapid.UserString + attrs[Template.VertRapid] = self.obj.VertRapid.UserString attrs[Template.HorizRapid] = self.obj.HorizRapid.UserString if includeCoolantMode: @@ -232,6 +242,7 @@ class SetupSheet: def encodeAttributeString(self, attr): '''encodeAttributeString(attr) ... return the encoded string of a template attribute.''' return PathUtil.toUnicode(attr.replace(self.expressionReference(), self.TemplateReference)) + def decodeAttributeString(self, attr): '''decodeAttributeString(attr) ... return the decoded string of a template attribute.''' return PathUtil.toUnicode(attr.replace(self.TemplateReference, self.expressionReference())) @@ -247,7 +258,7 @@ class SetupSheet: def operationsWithSettings(self): '''operationsWithSettings() ... returns a list of operations which currently have some settings defined.''' ops = [] - for name,value in PathUtil.keyValueIter(_RegisteredOps): + for name, value in PathUtil.keyValueIter(_RegisteredOps): for prop in value.registeredPropertyNames(name): if hasattr(self.obj, prop): ops.append(name) @@ -262,9 +273,9 @@ class SetupSheet: propName = OpPropertyName(opName, prop) if hasattr(self.obj, propName): setattr(obj, prop, getattr(self.obj, propName)) - except Exception: # pylint: disable=broad-except + except Exception: PathLog.info("SetupSheet has no support for {}".format(opName)) - #traceback.print_exc() + # traceback.print_exc() def onDocumentRestored(self, obj): @@ -272,16 +283,17 @@ class SetupSheet: obj.addProperty('App::PropertyStringList', 'CoolantModes', 'CoolantMode', translate('PathSetupSheet', 'Coolant Modes')) obj.CoolantModes = self.DefaultCoolantModes - if not hasattr(obj, 'CoolantMode'): obj.addProperty('App::PropertyEnumeration', 'CoolantMode', 'CoolantMode', translate('PathSetupSheet', 'Default coolant mode.')) obj.CoolantMode = self.DefaultCoolantModes -def Create(name = 'SetupSheet'): + +def Create(name='SetupSheet'): obj = FreeCAD.ActiveDocument.addObject('App::FeaturePython', name) obj.Proxy = SetupSheet(obj) return obj + class _RegisteredOp(object): def __init__(self, factory, properties): @@ -296,14 +308,19 @@ class _RegisteredOp(object): self.factory("OpPrototype.%s" % name, ptt) return ptt + def RegisterOperation(name, objFactory, setupProperties): - global _RegisteredOps # pylint: disable=global-statement + global _RegisteredOps _RegisteredOps[name] = _RegisteredOp(objFactory, setupProperties) + def OpNamePrefix(name): return name.replace('Path', '').replace(' ', '').replace('_', '') + def OpPropertyName(opName, propName): return "{}{}".format(OpNamePrefix(opName), propName) + + def OpPropertyGroup(opName): return "Op {}".format(opName)