PathEdit integration of the setup-sheet editor.

This commit is contained in:
markus
2018-08-29 14:42:38 -07:00
committed by Markus Lampert
parent 795842b71c
commit 84b681eb2b
4 changed files with 843 additions and 446 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>642</width>
<width>500</width>
<height>721</height>
</rect>
</property>
@@ -19,7 +19,7 @@
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tabWidgetPage1" native="true">
<widget class="QWidget" name="tabWidgetPage1">
<attribute name="title">
<string>Operation</string>
</attribute>
@@ -38,7 +38,7 @@
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="startDepthExpr">
<widget class="QLineEdit" name="setupStartDepthExpr">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Expression set as the StartDepth of a newly created operation.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Default: OpStartDepth&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
@@ -52,7 +52,7 @@
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="finalDepthExpr">
<widget class="QLineEdit" name="setupFinalDepthExpr">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Expression set as the FinalDepth for a newly created operation.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Default: OpFinalDepth&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
@@ -66,7 +66,7 @@
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="stepDownExpr">
<widget class="QLineEdit" name="setupStepDownExpr">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Expression set as the StepDown of a newly created operation.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Default: OpToolDiameter&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
@@ -96,21 +96,21 @@
</widget>
</item>
<item row="3" column="1" colspan="2">
<widget class="QLineEdit" name="safeHeightExpr">
<widget class="QLineEdit" name="setupSafeHeightExpr">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Expression set as SafeHeight for new operations.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Default: &amp;quot;OpStockZMax+SetupSheet.SafeHeightOffset&amp;quot;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="2">
<widget class="QLineEdit" name="clearanceHeightExpr">
<widget class="QLineEdit" name="setupClearanceHeightExpr">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Expression set as ClearanceHeight for new operations.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Default: &amp;quot;OpStockZMax+SetupSheet.ClearanceHeightOffset&amp;quot;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="Gui::QuantitySpinBox" name="clearanceHeightOffs">
<widget class="Gui::QuantitySpinBox" name="setupClearanceHeightOffs">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;ClearanceHeightOffset - can be used by expressions to set the default ClearanceHeight for new operations.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Default: &amp;quot;3 mm&amp;quot;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
@@ -137,7 +137,7 @@
</widget>
</item>
<item row="3" column="3">
<widget class="Gui::QuantitySpinBox" name="safeHeightOffs">
<widget class="Gui::QuantitySpinBox" name="setupSafeHeightOffs">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;SafeHeightOffset can be for expressions to set the SafeHeight for new operations.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Default: &amp;quot;5 mm&amp;quot;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
@@ -161,7 +161,7 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="tabWidgetPage2" native="true">
<widget class="QWidget" name="tabWidgetPage2">
<attribute name="title">
<string>Tool Controller</string>
</attribute>
@@ -180,7 +180,7 @@
</widget>
</item>
<item row="0" column="1">
<widget class="Gui::QuantitySpinBox" name="rapidHorizontal">
<widget class="Gui::QuantitySpinBox" name="setupRapidHorizontal">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
@@ -200,7 +200,7 @@
</widget>
</item>
<item row="1" column="1">
<widget class="Gui::QuantitySpinBox" name="rapidVertical">
<widget class="Gui::QuantitySpinBox" name="setupRapidVertical">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>

View File

@@ -31,6 +31,7 @@ import PathScripts.PathGeom as PathGeom
import PathScripts.PathGui as PathGui
import PathScripts.PathLog as PathLog
import PathScripts.PathPreferences as PathPreferences
import PathScripts.PathSetupSheetGui as PathSetupSheetGui
import PathScripts.PathStock as PathStock
import PathScripts.PathToolController as PathToolController
import PathScripts.PathToolLibraryManager as PathToolLibraryManager
@@ -489,6 +490,9 @@ class TaskPanel:
self.stockCreateCylinder = None
self.stockEdit = None
self.setupGlobal = PathSetupSheetGui.GlobalEditor(self.obj.SetupSheet, self.form)
self.setupOps = PathSetupSheetGui.OpsDefaultEditor(self.obj.SetupSheet, self.form.tabOpDefaults)
def preCleanup(self):
PathLog.track()
FreeCADGui.Selection.removeObserver(self)
@@ -499,12 +503,16 @@ class TaskPanel:
PathLog.track()
self.preCleanup()
self.getFields()
self.setupGlobal.accept()
self.setupOps.accept()
FreeCAD.ActiveDocument.commitTransaction()
self.cleanup(resetEdit)
def reject(self, resetEdit=True):
PathLog.track()
self.preCleanup()
self.setupGlobal.reject()
self.setupOps.reject()
FreeCAD.ActiveDocument.abortTransaction()
if self.deleteOnReject:
PathLog.info("Uncreate Job")
@@ -557,6 +565,9 @@ class TaskPanel:
self.obj.Proxy.execute(self.obj)
self.setupGlobal.getFields()
self.setupOps.getFields()
def selectComboBoxText(self, widget, text):
index = widget.findText(text, QtCore.Qt.MatchFixedString)
if index >= 0:
@@ -652,6 +663,8 @@ class TaskPanel:
self.updateToolController()
self.stockEdit.setFields(self.obj)
self.setupGlobal.setFields()
self.setupOps.setFields()
def setPostProcessorOutputFile(self):
filename = QtGui.QFileDialog.getSaveFileName(self.form, translate("Path_Job", "Select Output File"), None, translate("Path_Job", "All Files (*.*)"))
@@ -948,6 +961,8 @@ class TaskPanel:
def setupUi(self, activate):
self.setupGlobal.setupUi()
self.setupOps.setupUi()
self.updateStockEditor(-1)
self.setFields()
@@ -1035,6 +1050,6 @@ def Create(base, template=None):
return obj
except Exception as exc:
PathLog.error(sys.exc_info())
#traceback.print_exc(exc)
traceback.print_exc(exc)
FreeCAD.ActiveDocument.abortTransaction()

View File

@@ -131,7 +131,7 @@ class OpTaskPanel:
self.obj = obj
self.op = op
self.form = FreeCADGui.PySideUic.loadUi(":/panels/SetupOp.ui")
self.form.setWindowTitle(self.name)
self.form.setWindowTitle("Op {}".format(self.name))
self.props = sorted(op.properties())
self.prototype = op.prototype(name)
@@ -200,39 +200,60 @@ class OpTaskPanel:
return propertiesCreatedRemoved
class TaskPanel:
DataIds = QtCore.Qt.ItemDataRole.UserRole
DataKey = QtCore.Qt.ItemDataRole.UserRole + 1
class OpsDefaultEditor:
def __init__(self, vobj):
self.vobj = vobj
self.obj = vobj.Object
PathLog.track(self.obj.Label)
self.globalForm = FreeCADGui.PySideUic.loadUi(":/panels/SetupGlobal.ui")
def __init__(self, obj, parent):
self.obj = obj
self.ops = sorted([OpTaskPanel(self.obj, name, op) for name, op in PathUtil.keyValueIter(PathSetupSheet._RegisteredOps)], key = lambda op: op.name)
self.form = [self.globalForm] + [op.form for op in self.ops]
FreeCAD.ActiveDocument.openTransaction(translate("Path_SetupSheet", "Edit SetupSheet"))
if parent:
self.toolbox = QtGui.QToolBox(parent)
for op in self.ops:
self.toolbox.addItem(op.form, op.form.windowTitle())
self.toolbox.setParent(parent)
parent.layout().addWidget(self.toolbox)
def reject(self):
FreeCAD.ActiveDocument.abortTransaction()
FreeCADGui.Control.closeDialog()
FreeCAD.ActiveDocument.recompute()
pass
def accept(self):
self.getFields()
[op.accept() for op in self.ops]
if any([op.accept() for op in self.ops]):
PathLog.track()
#sel = FreeCADGui.Selection.getSelection()
#FreeCADGui.Selection.clearSelection()
#for o in sel:
# FreeCADGui.Selection.addSelection(o)
FreeCAD.ActiveDocument.commitTransaction()
FreeCADGui.ActiveDocument.resetEdit()
FreeCADGui.Control.closeDialog()
FreeCAD.ActiveDocument.recompute()
#FreeCADGui.Selection.removeObserver(self.s)
#FreeCAD.ActiveDocument.recompute()
def getFields(self):
pass
def updateUI(self):
pass
def updateModel(self, recomp = True):
PathLog.track()
self.getFields()
self.updateUI()
if recomp:
FreeCAD.ActiveDocument.recompute()
def setFields(self):
self.updateUI()
def setupUi(self):
for op in self.ops:
op.setupUi()
class GlobalEditor(object):
def __init__(self, obj, form):
self.form = form
self.obj = obj
def reject(self):
pass
def accept(self):
self.getFields()
def getFields(self):
def updateExpression(name, widget):
@@ -241,11 +262,11 @@ class TaskPanel:
if val != value:
PathGui.setProperty(self.obj, name, value)
updateExpression('StartDepthExpression', self.globalForm.startDepthExpr)
updateExpression('FinalDepthExpression', self.globalForm.finalDepthExpr)
updateExpression('StepDownExpression', self.globalForm.stepDownExpr)
updateExpression('ClearanceHeightExpression', self.globalForm.clearanceHeightExpr)
updateExpression('SafeHeightExpression', self.globalForm.safeHeightExpr)
updateExpression('StartDepthExpression', self.form.setupStartDepthExpr)
updateExpression('FinalDepthExpression', self.form.setupFinalDepthExpr)
updateExpression('StepDownExpression', self.form.setupStepDownExpr)
updateExpression('ClearanceHeightExpression', self.form.setupClearanceHeightExpr)
updateExpression('SafeHeightExpression', self.form.setupSafeHeightExpr)
self.clearanceHeightOffs.updateProperty()
self.safeHeightOffs.updateProperty()
self.rapidVertical.updateProperty()
@@ -253,43 +274,83 @@ class TaskPanel:
def updateUI(self):
PathLog.track()
self.globalForm.startDepthExpr.setText( self.obj.StartDepthExpression)
self.globalForm.finalDepthExpr.setText( self.obj.FinalDepthExpression)
self.globalForm.stepDownExpr.setText( self.obj.StepDownExpression)
self.globalForm.clearanceHeightExpr.setText( self.obj.ClearanceHeightExpression)
self.globalForm.safeHeightExpr.setText( self.obj.SafeHeightExpression)
self.form.setupStartDepthExpr.setText( self.obj.StartDepthExpression)
self.form.setupFinalDepthExpr.setText( self.obj.FinalDepthExpression)
self.form.setupStepDownExpr.setText( self.obj.StepDownExpression)
self.form.setupClearanceHeightExpr.setText( self.obj.ClearanceHeightExpression)
self.form.setupSafeHeightExpr.setText( self.obj.SafeHeightExpression)
self.clearanceHeightOffs.updateSpinBox()
self.safeHeightOffs.updateSpinBox()
self.rapidVertical.updateSpinBox()
self.rapidHorizontal.updateSpinBox()
def updateModel(self):
def updateModel(self, recomp = True):
PathLog.track()
self.getFields()
self.updateUI()
FreeCAD.ActiveDocument.recompute()
def setupCombo(self, combo, text, items):
if items and len(items) > 0:
for i in range(combo.count(), -1, -1):
combo.removeItem(i)
combo.addItems(items)
index = combo.findText(text, QtCore.Qt.MatchFixedString)
if index >= 0:
combo.setCurrentIndex(index)
if recomp:
FreeCAD.ActiveDocument.recompute()
def setFields(self):
self.updateUI()
def setupUi(self):
self.clearanceHeightOffs = PathGui.QuantitySpinBox(self.globalForm.clearanceHeightOffs, self.obj, 'ClearanceHeightOffset')
self.safeHeightOffs = PathGui.QuantitySpinBox(self.globalForm.safeHeightOffs, self.obj, 'SafeHeightOffset')
self.rapidHorizontal = PathGui.QuantitySpinBox(self.globalForm.rapidHorizontal, self.obj, 'HorizRapid')
self.rapidVertical = PathGui.QuantitySpinBox(self.globalForm.rapidVertical, self.obj, 'VertRapid')
self.clearanceHeightOffs = PathGui.QuantitySpinBox(self.form.setupClearanceHeightOffs, self.obj, 'ClearanceHeightOffset')
self.safeHeightOffs = PathGui.QuantitySpinBox(self.form.setupSafeHeightOffs, self.obj, 'SafeHeightOffset')
self.rapidHorizontal = PathGui.QuantitySpinBox(self.form.setupRapidHorizontal, self.obj, 'HorizRapid')
self.rapidVertical = PathGui.QuantitySpinBox(self.form.setupRapidVertical, self.obj, 'VertRapid')
self.setFields()
for op in self.ops:
op.setupUi()
class TaskPanel:
def __init__(self, vobj):
self.vobj = vobj
self.obj = vobj.Object
PathLog.track(self.obj.Label)
self.globalForm = FreeCADGui.PySideUic.loadUi(":/panels/SetupGlobal.ui")
self.globalEditor = GlobalEditor(self.obj, self.globalForm)
self.opsEditor = OpsDefaultEditor(self.obj, None)
self.form = [op.form for op in self.opsEditor.ops] + [self.globalForm]
FreeCAD.ActiveDocument.openTransaction(translate("Path_SetupSheet", "Edit SetupSheet"))
def reject(self):
self.globalEditor.reject()
self.opsEditor.reject()
FreeCAD.ActiveDocument.abortTransaction()
FreeCADGui.Control.closeDialog()
FreeCAD.ActiveDocument.recompute()
def accept(self):
self.globalEditor.accept()
self.opsEditor.accept()
FreeCAD.ActiveDocument.commitTransaction()
FreeCADGui.ActiveDocument.resetEdit()
FreeCADGui.Control.closeDialog()
FreeCAD.ActiveDocument.recompute()
#FreeCADGui.Selection.removeObserver(self.s)
#FreeCAD.ActiveDocument.recompute()
def getFields(self):
self.globalEditor.getFields()
self.opsEditor.getFields()
def updateUI(self):
self.globalEditor.updateUI()
self.opsEditor.updateUI()
def updateModel(self):
self.globalEditor.updateModel(False)
self.opsEditor.updateModel(False)
FreeCAD.ActiveDocument.recompute()
def setFields(self):
self.globalEditor.setFields()
self.opsEditor.setFields()
def setupUi(self):
self.globalEditor.setupUi()
self.opsEditor.setupUi()
def Create(name = 'SetupSheet'):
'''Create(name = 'SetupSheet') ... creates a new setup sheet'''