From fc89d317fdd06ddfd5100874c6aaea2990f95023 Mon Sep 17 00:00:00 2001 From: Markus Lampert Date: Thu, 23 Aug 2018 23:40:31 -0700 Subject: [PATCH] Add properties to the setup sheet and initialise their editor from there. --- src/Mod/Path/PathScripts/PathSetupSheetGui.py | 48 ++++++++++++------- .../PathScripts/PathSetupSheetOpPrototype.py | 33 +++++++++---- 2 files changed, 55 insertions(+), 26 deletions(-) diff --git a/src/Mod/Path/PathScripts/PathSetupSheetGui.py b/src/Mod/Path/PathScripts/PathSetupSheetGui.py index 2d4d57a069..2abe9cf126 100644 --- a/src/Mod/Path/PathScripts/PathSetupSheetGui.py +++ b/src/Mod/Path/PathScripts/PathSetupSheetGui.py @@ -68,7 +68,6 @@ class ViewProvider: self.obj = vobj.Object def getIcon(self): - PathLog.track() return ":/icons/Path-SetupSheet.svg" def __getstate__(self): @@ -105,14 +104,6 @@ class Delegate(QtGui.QStyledItemDelegate): #def paint(self, painter, option, index): # #PathLog.track(index.column(), type(option)) - # if False and 2 == index.column(): - # PathLog.track(index.row(), index.data().toString()) - # option.text = index.data().toString() - # painter.drawText(option.rect, index.data().toString(), option) - # else: - # if 2 == index.column(): - # PathLog.track(index.row(), type(index.data(self.PropertyRole))) - # QtGui.QStyledItemDelegate.paint(self, painter, option, index) def createEditor(self, parent, option, index): if index.data(self.EditorRole) is None: @@ -128,7 +119,7 @@ class Delegate(QtGui.QStyledItemDelegate): PathLog.track(index.row(), index.column()) editor = index.data(self.EditorRole) editor.setModelData(widget) - index.model().setData(index, editor.prop.toString(), QtCore.Qt.DisplayRole) + index.model().setData(index, editor.prop.displayString(), QtCore.Qt.DisplayRole) def updateEditorGeometry(self, widget, option, index): widget.setGeometry(option.rect) @@ -143,7 +134,7 @@ class OpTaskPanel: self.form = FreeCADGui.PySideUic.loadUi(":/panels/SetupOp.ui") self.form.setWindowTitle(self.name) self.props = sorted(op.properties()) - self.prototype = PathSetupSheetOpPrototype.OpPrototype() + self.prototype = PathSetupSheetOpPrototype.OpPrototype(name) op.factory("OpPrototype.%s" % name, self.prototype) def updateData(self, topLeft, bottomRight): @@ -152,7 +143,6 @@ class OpTaskPanel: self.model.item(topLeft.row(), 1).setEnabled(isset) self.model.item(topLeft.row(), 2).setEnabled(isset) - def setupUi(self): PathLog.track() @@ -169,12 +159,16 @@ class OpTaskPanel: self.model.setData(self.model.index(i, 0), isset, QtCore.Qt.EditRole) self.model.setData(self.model.index(i, 1), name, QtCore.Qt.EditRole) self.model.setData(self.model.index(i, 2), prop, Delegate.PropertyRole) - self.model.setData(self.model.index(i, 2), prop.toString(), QtCore.Qt.DisplayRole) + self.model.setData(self.model.index(i, 2), prop.displayString(), QtCore.Qt.DisplayRole) self.model.item(i, 0).setCheckable(True) self.model.item(i, 0).setText('') self.model.item(i, 1).setEditable(False) - if not isset: + + if isset: + self.model.item(i, 0).setCheckState(QtCore.Qt.Checked) + else: + self.model.item(i, 0).setCheckState(QtCore.Qt.Unchecked) self.model.item(i, 1).setEnabled(False) self.model.item(i, 2).setEnabled(False) @@ -185,7 +179,24 @@ class OpTaskPanel: self.model.dataChanged.connect(self.updateData) def propertyName(self, prop): - return "%{}_%{}".format(self.prefix, prop) + return "{}{}".format(self.prefix, prop) + + def categoryName(self): + return "Op {}".format(self.name) + + def accept(self): + for i,name in enumerate(self.props): + prop = self.prototype.getProperty(name) + propName = self.propertyName(name) + enabled = self.model.item(i, 0).checkState() == QtCore.Qt.Checked + if enabled and not prop.getValue() is None: + prop.setupProperty(self.obj, propName, self.categoryName()) + setattr(self.obj, propName, prop.getValue()) + else: + if hasattr(self.obj, propName): + self.obj.removeProperty(propName) + return True + class TaskPanel: DataIds = QtCore.Qt.ItemDataRole.UserRole @@ -207,12 +218,17 @@ class TaskPanel: def accept(self): self.getFields() + [op.accept() for op in self.ops] + #if any([op.accept() for op in self.ops]): + # PathLog.track() + # self.obj.touch() FreeCAD.ActiveDocument.commitTransaction() FreeCADGui.ActiveDocument.resetEdit() FreeCADGui.Control.closeDialog() FreeCAD.ActiveDocument.recompute() #FreeCADGui.Selection.removeObserver(self.s) - #FreeCAD.ActiveDocument.recompute() + FreeCAD.ActiveDocument.recompute() + #self.vobj.update() def getFields(self): def updateExpression(name, widget): diff --git a/src/Mod/Path/PathScripts/PathSetupSheetOpPrototype.py b/src/Mod/Path/PathScripts/PathSetupSheetOpPrototype.py index 9badbb8706..2d83200adc 100644 --- a/src/Mod/Path/PathScripts/PathSetupSheetOpPrototype.py +++ b/src/Mod/Path/PathScripts/PathSetupSheetOpPrototype.py @@ -40,8 +40,9 @@ else: class Property(object): '''Base class for all prototype properties''' - def __init__(self, name, category, info): + def __init__(self, name, propType, category, info): self.name = name + self.propType = propType self.category = category self.info = info self.editorMode = 0 @@ -55,16 +56,24 @@ class Property(object): def setEditorMode(self, mode): self.editorMode = mode - def toString(self): - if not self.value is None: - return str(self.value) - t = self.typeString() - p = 'an' if t[0] in ['A', 'E', 'I', 'O', 'U'] else 'a' - return "%s %s" % (p, t) + def displayString(self): + if self.value is None: + t = self.typeString() + p = 'an' if t[0] in ['A', 'E', 'I', 'O', 'U'] else 'a' + return "%s %s" % (p, t) + return self.value def typeString(self): return "Property" + def setupProperty(self, obj, name, category): + if not hasattr(obj, name): + obj.addProperty(self.propType, name, category, self.info) + self.initProperty(obj, name) + + def initProperty(self, obj, name): + pass + class PropertyEnumeration(Property): def typeString(self): return "Enumeration" @@ -78,6 +87,9 @@ class PropertyEnumeration(Property): def getEnumValues(self): return self.enums + def initProperty(self, obj, name): + setattr(obj, name, self.enums) + class PropertyDistance(Property): def typeString(self): return "Distance" @@ -113,17 +125,18 @@ class OpPrototype(object): 'Part::PropertyPartShape': Property, } - def __init__(self): + def __init__(self, name): + self.name = name self.properties = {} self.DoNotSetDefaultValues = True def __setattr__(self, name, val): - if name in ['properties', 'DoNotSetDefaultValues']: + if name in ['name', 'properties', 'DoNotSetDefaultValues']: return super(self.__class__, self).__setattr__(name, val) self.properties[name].setValue(val) def addProperty(self, typeString, name, category, info = None): - prop = self.PropertyType[typeString](name, category, info) + prop = self.PropertyType[typeString](name, typeString, category, info) self.properties[name] = prop def setEditorMode(self, name, mode):