Editing Works

This commit is contained in:
sliptonic
2020-11-02 10:39:30 -06:00
parent 0a2183fe4f
commit 7c4c25ceed
3 changed files with 134 additions and 152 deletions

View File

@@ -42,26 +42,31 @@ def translate(context, text, disambig=None):
class ToolBitEditor(object):
'''UI and controller for editing a ToolBit.
The controller embeds the UI to the parentWidget which has to have a layout attached to it.
The controller embeds the UI to the parentWidget which has to have a
layout attached to it.
'''
def __init__(self, tool, parentWidget=None, ondone=None):
def __init__(self, tool, parentWidget=None, loadBitBody=True):
PathLog.track()
self.form = FreeCADGui.PySideUic.loadUi(":/panels/ToolBitEditor.ui")
if parentWidget:
self.form.setParent(parentWidget)
parentWidget.layout().addWidget(self.form)
self.ondone = ondone
self.tool = tool
self.loadbitbody = loadBitBody
if not tool.BitShape:
self.tool.BitShape = 'endmill.fcstd'
self.tool.Proxy.loadBitBody(self.tool)
if self.loadbitbody:
self.tool.Proxy.loadBitBody(self.tool)
self.setupTool(self.tool)
self.setupAttributes(self.tool)
def setupTool(self, tool):
PathLog.track()
layout = self.form.bitParams.layout()
for i in range(layout.rowCount() - 1, -1, -1):
layout.removeRow(i)
@@ -71,7 +76,8 @@ class ToolBitEditor(object):
if tool.getGroupOfProperty(name) == PathToolBit.PropertyGroupBit:
qsb = ui.createWidget('Gui::QuantitySpinBox')
editor[name] = PathGui.QuantitySpinBox(qsb, tool, name)
label = QtGui.QLabel(re.sub('([A-Z][a-z]+)', r' \1', re.sub('([A-Z]+)', r' \1', name)))
label = QtGui.QLabel(re.sub('([A-Z][a-z]+)', r' \1',
re.sub('([A-Z]+)', r' \1', name)))
layout.addRow(label, qsb)
self.bitEditor = editor
img = tool.Proxy.getBitThumbnail(tool)
@@ -81,6 +87,7 @@ class ToolBitEditor(object):
self.form.image.setPixmap(QtGui.QPixmap())
def setupAttributes(self, tool):
PathLog.track()
self.proto = PathToolBit.AttributePrototype()
self.props = sorted(self.proto.properties)
self.delegate = PathSetupSheetGui.Delegate(self.form)
@@ -101,10 +108,15 @@ class ToolBitEditor(object):
else:
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, PathSetupSheetGui.Delegate.PropertyRole)
self.model.setData(self.model.index(i, 2), prop.displayString(), QtCore.Qt.DisplayRole)
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,
PathSetupSheetGui.Delegate.PropertyRole)
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('')
@@ -143,13 +155,15 @@ class ToolBitEditor(object):
self.model.dataChanged.connect(self.updateData)
def updateData(self, topLeft, bottomRight):
# pylint: disable=unused-argument
PathLog.track()
if 0 == topLeft.column():
isset = self.model.item(topLeft.row(), 0).checkState() == QtCore.Qt.Checked
isset = self.model.item(topLeft.row(),
0).checkState() == QtCore.Qt.Checked
self.model.item(topLeft.row(), 1).setEnabled(isset)
self.model.item(topLeft.row(), 2).setEnabled(isset)
def accept(self):
PathLog.track()
self.refresh()
self.tool.Proxy.unloadBitBody(self.tool)
@@ -158,11 +172,14 @@ class ToolBitEditor(object):
prop = self.proto.getProperty(name)
enabled = self.model.item(i, 0).checkState() == QtCore.Qt.Checked
if enabled and not prop.getValue() is None:
prop.setupProperty(self.tool, name, PathToolBit.PropertyGroupAttribute, prop.getValue())
prop.setupProperty(self.tool, name,
PathToolBit.PropertyGroupAttribute,
prop.getValue())
elif hasattr(self.tool, name):
self.tool.removeProperty(name)
def reject(self):
PathLog.track()
self.tool.Proxy.unloadBitBody(self.tool)
def updateUI(self):
@@ -174,6 +191,7 @@ class ToolBitEditor(object):
self.bitEditor[editor].updateSpinBox()
def updateShape(self):
PathLog.track()
self.tool.BitShape = str(self.form.shapePath.text())
self.setupTool(self.tool)
self.form.toolName.setText(self.tool.Label)
@@ -182,7 +200,6 @@ class ToolBitEditor(object):
self.bitEditor[editor].updateSpinBox()
def updateTool(self):
# pylint: disable=protected-access
PathLog.track()
self.tool.Label = str(self.form.toolName.text())
self.tool.BitShape = str(self.form.shapePath.text())
@@ -190,7 +207,7 @@ class ToolBitEditor(object):
for editor in self.bitEditor:
self.bitEditor[editor].updateProperty()
self.tool.Proxy._updateBitShape(self.tool)
# self.tool.Proxy._updateBitShape(self.tool)
def refresh(self):
PathLog.track()
@@ -200,21 +217,19 @@ class ToolBitEditor(object):
self.form.blockSignals(False)
def selectShape(self):
PathLog.track()
path = self.tool.BitShape
if not path:
path = PathPreferences.lastPathToolShape()
foo = QtGui.QFileDialog.getOpenFileName(self.form,
"Path - Tool Shape",
path,
"*.fcstd")
"Path - Tool Shape",
path,
"*.fcstd")
if foo and foo[0]:
PathPreferences.setLastPathToolShape(os.path.dirname(foo[0]))
self.form.shapePath.setText(foo[0])
self.updateShape()
def ok(self):
self.form.close()
def setupUI(self):
PathLog.track()
self.updateUI()
@@ -222,8 +237,3 @@ class ToolBitEditor(object):
self.form.toolName.editingFinished.connect(self.refresh)
self.form.shapePath.editingFinished.connect(self.updateShape)
self.form.shapeSet.clicked.connect(self.selectShape)
self.form.buttonBox.accepted.connect(self.ok)
self.form.buttonBox.rejected.connect(self.ok)
if self.ondone is not None:
self.form.buttonBox.rejected.connect(self.ondone)

View File

@@ -36,12 +36,14 @@ __author__ = "sliptonic (Brad Collette)"
__url__ = "https://www.freecadweb.org"
__doc__ = "Task panel editor for a ToolBit"
# Qt translation handling
def translate(context, text, disambig=None):
return QtCore.QCoreApplication.translate(context, text, disambig)
#PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule())
#PathLog.trackModule(PathLog.thisModule())
# PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule())
# PathLog.trackModule(PathLog.thisModule())
class ViewProvider(object):
'''ViewProvider for a ToolBit.
@@ -58,7 +60,7 @@ class ViewProvider(object):
def attach(self, vobj):
PathLog.track(vobj.Object)
self.vobj = vobj
self.obj = vobj.Object
self.obj = vobj.Object
def getIcon(self):
png = self.obj.Proxy.getBitThumbnail(self.obj)
@@ -113,6 +115,7 @@ class ViewProvider(object):
def doubleClicked(self, vobj):
self.setEdit(vobj)
class TaskPanel:
'''TaskPanel for the SetupSheet - if it is being edited directly.'''
@@ -123,14 +126,16 @@ class TaskPanel:
self.editor = PathToolBitEdit.ToolBitEditor(self.obj)
self.form = self.editor.form
self.deleteOnReject = deleteOnReject
FreeCAD.ActiveDocument.openTransaction(translate('PathToolBit', 'Edit ToolBit'))
FreeCAD.ActiveDocument.openTransaction(translate('PathToolBit',
'Edit ToolBit'))
def reject(self):
FreeCAD.ActiveDocument.abortTransaction()
self.editor.reject()
FreeCADGui.Control.closeDialog()
if self.deleteOnReject:
FreeCAD.ActiveDocument.openTransaction(translate('PathToolBit', 'Uncreate ToolBit'))
FreeCAD.ActiveDocument.openTransaction(translate('PathToolBit',
'Uncreate ToolBit'))
self.editor.reject()
FreeCAD.ActiveDocument.removeObject(self.obj.Name)
FreeCAD.ActiveDocument.commitTransaction()
@@ -155,132 +160,47 @@ class TaskPanel:
self.editor.setupUI()
class ToolBitSelector(object):
ToolRole = QtCore.Qt.UserRole + 1
def __init__(self):
self.buttons = None
self.editor = None
self.dialog = None
self.form = FreeCADGui.PySideUic.loadUi(':/panels/ToolBitSelector.ui')
self.setupUI()
def updateTools(self, selected=None):
PathLog.track()
selItem = None
self.form.tools.setUpdatesEnabled(False)
if selected is None and self.form.tools.currentItem():
selected = self.form.tools.currentItem().text()
self.form.tools.clear()
for tool in sorted(self.loadedTools(), key=lambda t: t.Label):
icon = None
if tool.ViewObject and tool.ViewObject.Proxy:
icon = tool.ViewObject.Proxy.getIcon()
if icon and isinstance(icon, QtGui.QIcon):
item = QtGui.QListWidgetItem(icon, tool.Label)
else:
item = QtGui.QListWidgetItem(tool.Label)
item.setData(self.ToolRole, tool)
if selected == tool.Label:
selItem = item
self.form.tools.addItem(item)
if selItem:
self.form.tools.setCurrentItem(selItem)
self.updateSelection()
self.form.tools.setUpdatesEnabled(True)
def getTool(self):
PathLog.track()
self.updateTools()
res = self.form.exec_()
if 1 == res and self.form.tools.currentItem():
return self.form.tools.currentItem().data(self.ToolRole)
return None
def loadedTools(self):
PathLog.track()
if FreeCAD.ActiveDocument:
return [o for o in FreeCAD.ActiveDocument.Objects if hasattr(o, 'Proxy') and isinstance(o.Proxy, PathToolBit.ToolBit)]
return []
def loadTool(self):
PathLog.track()
tool = LoadTool(self.form)
if tool:
self.updateTools(tool.Label)
def createTool(self):
PathLog.track()
tool = PathToolBit.Factory.Create()
def accept():
self.editor.accept()
self.dialog.done(1)
self.updateTools(tool.Label)
def reject():
FreeCAD.ActiveDocument.openTransaction(translate('PathToolBit', 'Uncreate ToolBit'))
self.editor.reject()
self.dialog.done(0)
FreeCAD.ActiveDocument.removeObject(tool.Name)
FreeCAD.ActiveDocument.commitTransaction()
self.dialog = QtGui.QDialog(self.form)
layout = QtGui.QVBoxLayout(self.dialog)
self.editor = PathToolBitEdit.ToolBitEditor(tool, self.dialog)
self.editor.setupUI()
self.buttons = QtGui.QDialogButtonBox(
QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel,
QtCore.Qt.Horizontal, self.dialog)
layout.addWidget(self.buttons)
self.buttons.accepted.connect(accept)
self.buttons.rejected.connect(reject)
print(self.dialog.exec_())
def updateSelection(self):
PathLog.track()
if self.form.tools.selectedItems():
self.form.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(True)
else:
self.form.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(False)
def setupUI(self):
PathLog.track()
self.form.toolCreate.clicked.connect(self.createTool)
self.form.toolLoad.clicked.connect(self.loadTool)
self.form.tools.itemSelectionChanged.connect(self.updateSelection)
self.form.tools.doubleClicked.connect(self.form.accept)
class ToolBitGuiFactory(PathToolBit.ToolBitFactory):
def Create(self, name='ToolBit', shapeFile=None):
'''Create(name = 'ToolBit') ... creates a new tool bit.
It is assumed the tool will be edited immediately so the internal bit body is still attached.'''
FreeCAD.ActiveDocument.openTransaction(translate('PathToolBit', 'Create ToolBit'))
'''
Create(name = 'ToolBit') ... creates a new tool bit.
It is assumed the tool will be edited immediately so the internal
bit body is still attached.
'''
FreeCAD.ActiveDocument.openTransaction(translate('PathToolBit',
'Create ToolBit'))
tool = PathToolBit.ToolBitFactory.Create(self, name, shapeFile)
PathIconViewProvider.Attach(tool.ViewObject, name)
FreeCAD.ActiveDocument.commitTransaction()
return tool
def GetToolFile(parent = None):
def GetToolFile(parent=None):
if parent is None:
parent = QtGui.QApplication.activeWindow()
foo = QtGui.QFileDialog.getOpenFileName(parent, 'Tool', PathPreferences.lastPathToolBit(), '*.fctb')
foo = QtGui.QFileDialog.getOpenFileName(parent, 'Tool',
PathPreferences.lastPathToolBit(),
'*.fctb')
if foo and foo[0]:
PathPreferences.setLastPathToolBit(os.path.dirname(foo[0]))
return foo[0]
return None
def GetToolFiles(parent = None):
def GetToolFiles(parent=None):
if parent is None:
parent = QtGui.QApplication.activeWindow()
foo = QtGui.QFileDialog.getOpenFileNames(parent, 'Tool', PathPreferences.lastPathToolBit(), '*.fctb')
foo = QtGui.QFileDialog.getOpenFileNames(parent, 'Tool',
PathPreferences.lastPathToolBit(),
'*.fctb')
if foo and foo[0]:
PathPreferences.setLastPathToolBit(os.path.dirname(foo[0][0]))
return foo[0]
return []
def GetToolShapeFile(parent = None):
def GetToolShapeFile(parent=None):
if parent is None:
parent = QtGui.QApplication.activeWindow()
@@ -290,7 +210,8 @@ def GetToolShapeFile(parent = None):
elif not os.path.isdir(location):
location = PathPreferences.filePath()
fname = QtGui.QFileDialog.getOpenFileName(parent, 'Select Tool Shape', location, '*.fcstd')
fname = QtGui.QFileDialog.getOpenFileName(parent, 'Select Tool Shape',
location, '*.fcstd')
if fname and fname[0]:
if fname != location:
PathPreferences.setLastPathToolShape(location)
@@ -298,15 +219,22 @@ def GetToolShapeFile(parent = None):
else:
return None
def LoadTool(parent = None):
'''LoadTool(parent=None) ... Open a file dialog to load a tool from a file.'''
def LoadTool(parent=None):
'''
LoadTool(parent=None) ... Open a file dialog to load a tool from a file.
'''
foo = GetToolFile(parent)
return PathToolBit.Factory.CreateFrom(foo) if foo else foo
def LoadTools(parent = None):
'''LoadTool(parent=None) ... Open a file dialog to load a tool from a file.'''
def LoadTools(parent=None):
'''
LoadTool(parent=None) ... Open a file dialog to load a tool from a file.
'''
return [PathToolBit.Factory.CreateFrom(foo) for foo in GetToolFiles(parent)]
# Set the factory so all tools are created with UI
PathToolBit.Factory = ToolBitGuiFactory()

View File

@@ -40,8 +40,8 @@ import traceback
import uuid as UUID
from functools import partial
PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule())
PathLog.trackModule(PathLog.thisModule())
# PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule())
# PathLog.trackModule(PathLog.thisModule())
_UuidRole = PySide.QtCore.Qt.UserRole + 1
_PathRole = PySide.QtCore.Qt.UserRole + 2
@@ -355,6 +355,7 @@ class ToolBitLibrary(object):
def __init__(self):
PathLog.track()
self.factory = ModelFactory()
self.temptool = None
self.toolModel = PySide.QtGui.QStandardItemModel(0, len(self.columnNames()))
self.listModel = PySide.QtGui.QStandardItemModel()
self.form = FreeCADGui.PySideUic.loadUi(':/panels/ToolBitLibraryEdit.ui')
@@ -415,7 +416,6 @@ class ToolBitLibrary(object):
self.toolModel.removeRows(row, 1)
def toolSelect(self, selected, deselected):
# pylint: disable=unused-argument
sel = len(self.toolTableView.selectedIndexes()) > 0
self.form.toolDelete.setEnabled(sel)
@@ -440,26 +440,70 @@ class ToolBitLibrary(object):
PathPreferences.setLastPathToolLibrary(path)
self.loadData()
def cleanupDocument(self):
# This feels like a hack. Remove the toolbit object
# remove the editor from the dialog
# re-enable all the controls
self.temptool.Document.removeObject(self.temptool.Name)
self.temptool = None
widget = self.form.toolTableGroup.children()[-1]
widget.setParent(None)
self.editor = None
self.lockoff()
def accept(self):
self.temptool.Proxy.saveToFile(self.temptool, self.temptool.File)
self.loadData()
self.cleanupDocument()
def reject(self):
self.cleanupDocument()
def lockon(self):
self.toolTableView.setEnabled(False)
self.form.toolCreate.setEnabled(False)
self.form.toolDelete.setEnabled(False)
self.form.toolAdd.setEnabled(False)
self.form.TableList.setEnabled(False)
self.form.libraryOpen.setEnabled(False)
self.form.libraryExport.setEnabled(False)
self.form.addToolTable.setEnabled(False)
self.form.librarySave.setEnabled(False)
def lockoff(self):
self.toolTableView.setEnabled(True)
self.form.toolCreate.setEnabled(True)
self.form.toolDelete.setEnabled(True)
self.form.toolAdd.setEnabled(True)
self.form.toolTable.setEnabled(True)
self.form.TableList.setEnabled(True)
self.form.libraryOpen.setEnabled(True)
self.form.libraryExport.setEnabled(True)
self.form.addToolTable.setEnabled(True)
self.form.librarySave.setEnabled(True)
def toolEdit(self, selected):
item = self.toolModel.item(selected.row(), 0)
if self.temptool is not None:
self.temptool.Document.removeObject(self.temptool.Name)
if selected.column() == 0: # editing Nr
pass
else:
tbpath = item.data(_PathRole)
temptool = PathToolBit.ToolBitFactory().CreateFrom(tbpath, 'temptool')
self.editor = PathToolBitEdit.ToolBitEditor(temptool,
self.form.toolTableGroup, ondone=self.toolEditDone)
self.temptool = PathToolBit.ToolBitFactory().CreateFrom(tbpath, 'temptool')
self.editor = PathToolBitEdit.ToolBitEditor(self.temptool, self.form.toolTableGroup, loadBitBody=False)
QBtn = QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel
buttonBox = QtGui.QDialogButtonBox(QBtn)
# self.buttonBox.accepted.connect(self.accept)
# self.buttonBox.rejected.connect(self.reject)
buttonBox.accepted.connect(self.accept)
buttonBox.rejected.connect(self.reject)
layout = self.editor.form.layout() #QVBoxLayout()
layout = self.editor.form.layout()
layout.addWidget(buttonBox)
#self.setLayout(self.layout)
self.lockon()
self.editor.setupUI()
def toolEditDone(self, success=True):
FreeCAD.ActiveDocument.removeObject("temptool")