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)