From e8ff138767d40b650896bb8ff593cf3de3832b57 Mon Sep 17 00:00:00 2001 From: Daniel Wood Date: Mon, 2 Sep 2019 19:41:56 +0100 Subject: [PATCH 1/6] Only show essential tool data in the tool table --- src/Mod/Path/PathScripts/PathToolLibraryManager.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/Mod/Path/PathScripts/PathToolLibraryManager.py b/src/Mod/Path/PathScripts/PathToolLibraryManager.py index a34f267244..a3148a454a 100644 --- a/src/Mod/Path/PathScripts/PathToolLibraryManager.py +++ b/src/Mod/Path/PathScripts/PathToolLibraryManager.py @@ -334,7 +334,7 @@ class ToolLibraryManager(): return None tt = self.getTableFromName(tablename) - headers = ["","Tool Num.","Name","Tool Type","Material","Diameter","Length Offset","Flat Radius","Corner Radius","Cutting Edge Angle","Cutting Edge Height"] + headers = ["","Tool Num.","Name","Tool Type","Diameter"] model = QtGui.QStandardItemModel() model.setHorizontalHeaderLabels(headers) @@ -353,15 +353,9 @@ class ToolLibraryManager(): itemNumber = QtGui.QStandardItem(str(number)) itemName = QtGui.QStandardItem(t.Name) itemToolType = QtGui.QStandardItem(t.ToolType) - itemMaterial = QtGui.QStandardItem(t.Material) itemDiameter = QtGui.QStandardItem(unitconv(t.Diameter)) - itemLengthOffset = QtGui.QStandardItem(unitconv(t.LengthOffset)) - itemFlatRadius = QtGui.QStandardItem(unitconv(t.FlatRadius)) - itemCornerRadius = QtGui.QStandardItem(unitconv(t.CornerRadius)) - itemCuttingEdgeAngle = QtGui.QStandardItem(str(t.CuttingEdgeAngle)) - itemCuttingEdgeHeight = QtGui.QStandardItem(unitconv(t.CuttingEdgeHeight)) - row = [itemcheck, itemNumber, itemName, itemToolType, itemMaterial, itemDiameter, itemLengthOffset, itemFlatRadius, itemCornerRadius, itemCuttingEdgeAngle, itemCuttingEdgeHeight] + row = [itemcheck, itemNumber, itemName, itemToolType, itemDiameter] model.appendRow(row) return model From 6e641822656bdfd785b777b8cc4dbcb927bf80d4 Mon Sep 17 00:00:00 2001 From: Daniel Wood Date: Mon, 2 Sep 2019 22:24:16 +0100 Subject: [PATCH 2/6] Allow editing and duplication of tools --- src/Mod/Path/Gui/Resources/Path.qrc | 1 + .../Resources/icons/Path-ToolDuplicate.svg | 856 ++++++++++++++++++ .../Gui/Resources/panels/ToolLibraryEditor.ui | 543 ++++++----- .../PathScripts/PathToolLibraryManager.py | 42 +- 4 files changed, 1201 insertions(+), 241 deletions(-) create mode 100644 src/Mod/Path/Gui/Resources/icons/Path-ToolDuplicate.svg diff --git a/src/Mod/Path/Gui/Resources/Path.qrc b/src/Mod/Path/Gui/Resources/Path.qrc index 71d2d0cfa3..ecca417fd2 100644 --- a/src/Mod/Path/Gui/Resources/Path.qrc +++ b/src/Mod/Path/Gui/Resources/Path.qrc @@ -50,6 +50,7 @@ icons/Path-Stop.svg icons/Path-ToolChange.svg icons/Path-ToolController.svg + icons/Path-ToolDuplicate.svg icons/Path-Toolpath.svg icons/Path-ToolTable.svg icons/Path-Area.svg diff --git a/src/Mod/Path/Gui/Resources/icons/Path-ToolDuplicate.svg b/src/Mod/Path/Gui/Resources/icons/Path-ToolDuplicate.svg new file mode 100644 index 0000000000..8880eed31b --- /dev/null +++ b/src/Mod/Path/Gui/Resources/icons/Path-ToolDuplicate.svg @@ -0,0 +1,856 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + Path-ToolChange + 2016-01-20 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-ToolChange.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Mod/Path/Gui/Resources/panels/ToolLibraryEditor.ui b/src/Mod/Path/Gui/Resources/panels/ToolLibraryEditor.ui index ed3cdf6bd5..7f9d7bc2a6 100644 --- a/src/Mod/Path/Gui/Resources/panels/ToolLibraryEditor.ui +++ b/src/Mod/Path/Gui/Resources/panels/ToolLibraryEditor.ui @@ -39,258 +39,333 @@ - + - - - - 225 - 16777215 - - - - - 0 - - - 0 - - - 6 - - - 0 - - - + + + + + + 225 + 16777215 + + + + + 0 + + + 0 + + + 6 + + + 0 + - - - Tool Tables - - + + + + + Tool Tables + + + + + + + Qt::Horizontal + + + + 20 + 20 + + + + + + + + + + + 32 + 32 + + + + + + + + :/icons/FreeCAD-default/scalable/edit-edit.svg:/icons/FreeCAD-default/scalable/edit-edit.svg + + + + + + + + 32 + 32 + + + + + + + + :/icons/FreeCAD-default/scalable/list-remove.svg + + + + + + + + + 32 + 32 + + + + + + + + :/icons/FreeCAD-default/scalable/list-add.svg + + + + + + + - - - Qt::Horizontal + + + + 0 + 0 + - + + + 16777215 + 16777215 + + + + + 0 + 0 + + + + true + + 20 20 - - - - - - - - - 32 - 32 - - - - - - - - :/icons/FreeCAD-default/scalable/edit-edit.svg:/icons/FreeCAD-default/scalable/edit-edit.svg - - - - - - - - 32 - 32 - - - - - - - - :/icons/FreeCAD-default/scalable/list-remove.svg - - - - - - - - - 32 - 32 - - - - - - - - :/icons/FreeCAD-default/scalable/list-add.svg - - - - - + - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - - 0 - 0 - - - - true - - - - 20 - 20 - - - - - - + + + + + + false + + + false + + + QAbstractItemView::NoDragDrop + + + Qt::IgnoreAction + + + true + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + false + + + false + + + false + + + false + + + + - - - false - - - false - - - QAbstractItemView::NoDragDrop - - - Qt::IgnoreAction - - - true - - - QAbstractItemView::SingleSelection - - - QAbstractItemView::SelectRows - - - false - - - true - - - false - - - false - - + + + + + New Tool + + + + :/icons/Path-ToolController.svg:/icons/Path-ToolController.svg + + + + + + + false + + + + 0 + 0 + + + + + + + Delete + + + + :/icons/delete.svg:/icons/delete.svg + + + + + + + false + + + false + + + Edit + + + + :/icons/edit-edit.svg:/icons/edit-edit.svg + + + + + + + false + + + false + + + Duplicate + + + + :/icons/Path-ToolDuplicate.svg:/icons/Path-ToolDuplicate.svg + + + + + + + false + + + Move up + + + + :/icons/button_up.svg:/icons/button_up.svg + + + false + + + false + + + false + + + + + + + false + + + false + + + Move down + + + + :/icons/button_down.svg:/icons/button_down.svg + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + - - - - - - 0 - 0 - - - - Create Tool Controllers for the selected tools - - - Create Tool Controller(s) - - - - :/icons/Path-LengthOffset.svg:/icons/Path-LengthOffset.svg - - - - - - - New Tool - - - - :/icons/Path-ToolController.svg:/icons/Path-ToolController.svg - - - - - - - Delete - - - - :/icons/delete.svg:/icons/delete.svg - - - - - - - Move up - - - - :/icons/button_up.svg:/icons/button_up.svg - - - false - - - false - - - false - - - - - - - Move down - - - - :/icons/button_down.svg:/icons/button_down.svg - - - - + + + false + + + + 0 + 0 + + + + Create Tool Controllers for the selected tools + + + Create Tool Controller(s) + + + + :/icons/Path-LengthOffset.svg:/icons/Path-LengthOffset.svg + + diff --git a/src/Mod/Path/PathScripts/PathToolLibraryManager.py b/src/Mod/Path/PathScripts/PathToolLibraryManager.py index a3148a454a..1d61f03ecd 100644 --- a/src/Mod/Path/PathScripts/PathToolLibraryManager.py +++ b/src/Mod/Path/PathScripts/PathToolLibraryManager.py @@ -499,6 +499,19 @@ class ToolLibraryManager(): self.saveMainLibrary() return True, target + def duplicate(self, number, listname): + ''' duplicates the selected tool in the selected tool table ''' + tt = self.getTableFromName(listname) + tool = tt.getTool(number).copy() + tt.addTools(tool) + + newID = list(tt.Tools)[-1] + + if listname == self.getCurrentTableName(): + self.saveMainLibrary() + return True, newID + + def delete(self, number, listname): '''deletes a tool from the current list''' tt = self.getTableFromName(listname) @@ -591,6 +604,9 @@ class EditorPanel(): def editTool(self, currItem): '''load the tool edit dialog''' + if not currItem: + currItem = self.form.ToolsList.selectedIndexes()[1] + row = currItem.row() value = currItem.sibling(row, 1).data() listname = self.TLM.getCurrentTableName() @@ -626,6 +642,17 @@ class EditorPanel(): self.loadTable(listname) self.updateSelection(newNum) + def duplicate(self): + '''duplicated the selected tool in the current tool table''' + item = self.form.ToolsList.selectedIndexes()[1].data() + if item: + number = int(item) + listname = self.TLM.getCurrentTableName() + success, newNum = self.TLM.duplicate(number, listname) + if success: + self.loadTable(listname) + self.updateSelection(newNum) + def updateSelection(self, number): '''update the tool list selection to track moves''' model = self.form.ToolsList.model() @@ -661,6 +688,8 @@ class EditorPanel(): self.form.ButtonDelete.setEnabled(False) self.form.ButtonUp.setEnabled(False) self.form.ButtonDown.setEnabled(False) + self.form.ButtonEdit.setEnabled(False) + self.form.ButtonDuplicate.setEnabled(False) model = self.form.ToolsList.model() checkCount = 0 @@ -679,6 +708,8 @@ class EditorPanel(): self.form.ButtonDelete.setEnabled(True) self.form.ButtonUp.setEnabled(True) self.form.ButtonDown.setEnabled(True) + self.form.ButtonEdit.setEnabled(True) + self.form.ButtonDuplicate.setEnabled(True) if len(PathUtils.GetJobs()) == 0: self.form.btnCopyTools.setEnabled(False) @@ -744,8 +775,9 @@ class EditorPanel(): if tooldata: self.form.ToolsList.setModel(tooldata) self.form.ToolsList.resizeColumnsToContents() + self.form.ToolsList.horizontalHeader().setResizeMode(self.form.ToolsList.model().columnCount() - 1, QtGui.QHeaderView.Stretch) self.setCurrentToolTableByName(name) - + def addNewToolTable(self): ''' adds new tool to selected tool table ''' @@ -819,6 +851,8 @@ class EditorPanel(): self.form.ButtonDown.clicked.connect(self.moveDown) self.form.ButtonUp.clicked.connect(self.moveUp) self.form.ButtonDelete.clicked.connect(self.delete) + self.form.ButtonEdit.clicked.connect(self.editTool) + self.form.ButtonDuplicate.clicked.connect(self.duplicate) self.form.ToolsList.doubleClicked.connect(self.editTool) self.form.ToolsList.clicked.connect(self.toolSelected) @@ -837,12 +871,6 @@ class EditorPanel(): self.form.ButtonRenameToolTable.clicked.connect(self.initTableRename) self.form.ButtonRenameToolTable.setToolTip(translate("TooltableEditor","Rename Selected Tool Table")) - - self.form.btnCopyTools.setEnabled(False) - self.form.ButtonDelete.setEnabled(False) - self.form.ButtonUp.setEnabled(False) - self.form.ButtonDown.setEnabled(False) - self.setFields() class CommandToolLibraryEdit(): From aac07898e19798b606324073b3bc4ed8d45ebf32 Mon Sep 17 00:00:00 2001 From: Daniel Wood Date: Mon, 2 Sep 2019 22:25:53 +0100 Subject: [PATCH 3/6] clean up comments --- src/Mod/Path/PathScripts/PathToolLibraryManager.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Mod/Path/PathScripts/PathToolLibraryManager.py b/src/Mod/Path/PathScripts/PathToolLibraryManager.py index 1d61f03ecd..4d31968b18 100644 --- a/src/Mod/Path/PathScripts/PathToolLibraryManager.py +++ b/src/Mod/Path/PathScripts/PathToolLibraryManager.py @@ -145,8 +145,6 @@ class ToolLibraryManager(): preferences and all or part of the library can be exported to other formats ''' - #TODO: copy & Duplicate tools between lists - TooltableTypeJSON = translate("TooltableEditor", "Tooltable JSON (*.json)") TooltableTypeXML = translate("TooltableEditor", "Tooltable XML (*.xml)") TooltableTypeHeekscad = translate("TooltableEditor", "HeeksCAD tooltable (*.tooltable)") @@ -587,12 +585,11 @@ class EditorPanel(): if r: editor.accept() listname = self.TLM.getCurrentTableName() - self.TLM.addnew(listname, editor.Tool) # is True: + self.TLM.addnew(listname, editor.Tool) self.loadTable(listname) def delete(self): '''deletes the selected tool''' - #listname = self.form.listView.selectedIndexes()[0].data() listname = self.TLM.getCurrentTableName() model = self.form.ToolsList.model() for i in range(model.rowCount()): @@ -670,8 +667,6 @@ class EditorPanel(): listname = self.TLM.getNextToolTableName() if self.TLM.read(filename, listname): self.loadToolTables() - #self.loadTable(listname) - def exportFile(self): '''export a tooltable to a file''' From 743086d02ac0a96c3ad29860be19ec65e197f006 Mon Sep 17 00:00:00 2001 From: Daniel Wood Date: Thu, 5 Sep 2019 21:01:26 +0100 Subject: [PATCH 4/6] Enable tool duplication and moving Adds tool duplication and drag and drop for moving tools to other tool tables --- .../Gui/Resources/panels/ToolLibraryEditor.ui | 11 +- .../PathScripts/PathToolLibraryManager.py | 122 ++++++++++++++---- 2 files changed, 106 insertions(+), 27 deletions(-) diff --git a/src/Mod/Path/Gui/Resources/panels/ToolLibraryEditor.ui b/src/Mod/Path/Gui/Resources/panels/ToolLibraryEditor.ui index 7f9d7bc2a6..22a5c6d953 100644 --- a/src/Mod/Path/Gui/Resources/panels/ToolLibraryEditor.ui +++ b/src/Mod/Path/Gui/Resources/panels/ToolLibraryEditor.ui @@ -164,6 +164,15 @@ 0 + + false + + + QAbstractItemView::NoDragDrop + + + Qt::IgnoreAction + true @@ -187,7 +196,7 @@ false - QAbstractItemView::NoDragDrop + QAbstractItemView::DragOnly Qt::IgnoreAction diff --git a/src/Mod/Path/PathScripts/PathToolLibraryManager.py b/src/Mod/Path/PathScripts/PathToolLibraryManager.py index 4d31968b18..05839997dc 100644 --- a/src/Mod/Path/PathScripts/PathToolLibraryManager.py +++ b/src/Mod/Path/PathScripts/PathToolLibraryManager.py @@ -509,6 +509,13 @@ class ToolLibraryManager(): self.saveMainLibrary() return True, newID + def moveToTable(self, number, listname): + ''' Moves the tool to selected tool table ''' + fromTable = self.getTableFromName(self.getCurrentTableName()) + toTable = self.getTableFromName(listname) + tool = fromTable.getTool(number).copy() + toTable.addTools(tool) + fromTable.deleteTool(number) def delete(self, number, listname): '''deletes a tool from the current list''' @@ -598,6 +605,7 @@ class EditorPanel(): t = model.index(i, 1) self.TLM.delete(int(t.data()) ,listname) self.loadTable(listname) + self.toolSelectionChanged() def editTool(self, currItem): '''load the tool edit dialog''' @@ -675,9 +683,10 @@ class EditorPanel(): listname = self.TLM.getCurrentTableName() self.TLM.write(filename, listname) - def toolSelected(self, index): + def toolSelectionChanged(self, index=None): ''' updates the ui when tools are selected''' - self.form.ToolsList.selectRow(index.row()) + if index: + self.form.ToolsList.selectRow(index.row()) self.form.btnCopyTools.setEnabled(False) self.form.ButtonDelete.setEnabled(False) @@ -761,7 +770,7 @@ class EditorPanel(): def tableSelected(self, index): ''' loads the tools for the selected tool table ''' - name = self.form.TableList.itemFromIndex(index).text() + name = self.form.TableList.itemWidget(self.form.TableList.itemFromIndex(index)).getTableName() self.loadTable(name) def loadTable(self, name): @@ -773,7 +782,6 @@ class EditorPanel(): self.form.ToolsList.horizontalHeader().setResizeMode(self.form.ToolsList.model().columnCount() - 1, QtGui.QHeaderView.Stretch) self.setCurrentToolTableByName(name) - def addNewToolTable(self): ''' adds new tool to selected tool table ''' name = self.TLM.addNewToolTable() @@ -788,36 +796,51 @@ class EditorPanel(): model.clear() if len(self.TLM.getToolTables()) > 0: for table in self.TLM.getToolTables(): - listItem = QtGui.QListWidgetItem(table.Name) - listItem.setIcon(QtGui.QIcon(':/icons/Path-ToolTable.svg')) - listItem.setFlags(listItem.flags() | QtCore.Qt.ItemIsEditable) - listItem.setSizeHint(QtCore.QSize(0,40)) - self.form.TableList.addItem(listItem) - self.loadTable(self.TLM.getToolTables()[0].Name) + listWidgetItem = QtGui.QListWidgetItem() + listItem = ToolTableListWidgetItem(self.TLM) + listItem.setTableName(table.Name) + listItem.setIcon(QtGui.QPixmap(':/icons/Path-ToolTable.svg')) + listItem.toolMoved.connect(self.reloadReset) + listWidgetItem.setSizeHint(QtCore.QSize(0,40)) + self.form.TableList.addItem(listWidgetItem) + self.form.TableList.setItemWidget(listWidgetItem, listItem) + #Load the first tooltable + self.loadTable(self.TLM.getCurrentTableName()) + + def reloadReset(self): + ''' reloads the current tooltable''' + name = self.TLM.getCurrentTableName() + self.loadTable(name) def setCurrentToolTableByName(self, name): ''' get the current tool table ''' - item = self.form.TableList.findItems(name, QtCore.Qt.MatchExactly)[0] - self.form.TableList.setCurrentItem(item) + item = self.getToolTableByName(name) + if item: + self.form.TableList.setCurrentItem(item) + + def getToolTableByName(self, name): + ''' returns the listWidgetItem for the selected name''' + for i in range(self.form.TableList.count()): + tableName = self.form.TableList.itemWidget(self.form.TableList.item(i)).getTableName() + if tableName == name: + return self.form.TableList.item(i) + return False def removeToolTable(self): ''' delete the selected tool table ''' self.TLM.deleteToolTable() self.loadToolTables() - def initTableRename(self): - ''' update the tool table list entry to allow renaming ''' + def renameTable(self): + ''' provides dialog for new tablename and renames teh selected tool table''' name = self.TLM.getCurrentTableName() - item = self.form.TableList.findItems(name, QtCore.Qt.MatchExactly)[0] - self.form.TableList.editItem(item) - - def renameTable(self, listItem): - ''' rename the selected too table ''' - newName = listItem.text() - index = self.form.TableList.indexFromItem(listItem).row() - reloadTables = self.TLM.renameToolTable(newName, index) - if reloadTables: - self.loadToolTables() + newName, ok = QtGui.QInputDialog.getText(None, translate("TooltableEditor","Rename Tooltable"),translate("TooltableEditor","Enter Name:"),QtGui.QLineEdit.Normal,name) + if ok and newName: + index = self.form.TableList.indexFromItem(self.getToolTableByName(name)).row() + reloadTables = self.TLM.renameToolTable(newName, index) + if reloadTables: + self.loadToolTables() + self.loadTable(newName) def getStandardButtons(self): return int(QtGui.QDialogButtonBox.Ok) @@ -850,7 +873,7 @@ class EditorPanel(): self.form.ButtonDuplicate.clicked.connect(self.duplicate) self.form.ToolsList.doubleClicked.connect(self.editTool) - self.form.ToolsList.clicked.connect(self.toolSelected) + self.form.ToolsList.clicked.connect(self.toolSelectionChanged) self.form.btnCopyTools.clicked.connect(self.copyTools) @@ -858,16 +881,63 @@ class EditorPanel(): self.form.TableList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) #self.form.TableList.customContextMenuRequested.connect(self.openMenu) self.form.TableList.itemChanged.connect(self.renameTable) + self.form.ButtonAddToolTable.clicked.connect(self.addNewToolTable) self.form.ButtonAddToolTable.setToolTip(translate("TooltableEditor","Add New Tool Table")) self.form.ButtonRemoveToolTable.clicked.connect(self.removeToolTable) self.form.ButtonRemoveToolTable.setToolTip(translate("TooltableEditor","Delete Selected Tool Table")) - self.form.ButtonRenameToolTable.clicked.connect(self.initTableRename) + self.form.ButtonRenameToolTable.clicked.connect(self.renameTable) self.form.ButtonRenameToolTable.setToolTip(translate("TooltableEditor","Rename Selected Tool Table")) self.setFields() +class ToolTableListWidgetItem(QtGui.QWidget): + + toolMoved = QtCore.Signal() + + def __init__(self, TLM): + super(ToolTableListWidgetItem, self).__init__() + + self.tlm = TLM + self.setAcceptDrops(True) + + self.mainLayout = QtGui.QHBoxLayout() + self.iconQLabel = QtGui.QLabel() + self.tableNameLabel = QtGui.QLabel() + self.mainLayout.addWidget(self.iconQLabel, 0) + self.mainLayout.addWidget(self.tableNameLabel, 1) + self.setLayout(self.mainLayout) + + def setTableName (self, text): + self.tableNameLabel.setText(text) + + def getTableName(self): + return self.tableNameLabel.text() + + def setIcon (self, icon): + icon = icon.scaled(24, 24) + self.iconQLabel.setPixmap(icon) + + def dragEnterEvent(self, e): + currentToolTable = self.tlm.getCurrentTableName() + thisToolTable = self.getTableName() + + if not currentToolTable == thisToolTable: + e.accept() + else: + e.ignore() + + def dropEvent(self, e): + selectedTools = e.source().selectedIndexes() + if selectedTools: + toolData = selectedTools[1].data() + + if toolData: + self.tlm.moveToTable(int(toolData), self.getTableName()) + self.toolMoved.emit() + + class CommandToolLibraryEdit(): def __init__(self): pass From 7394414ad5e025c4b9b06d285b6816a35dce12f5 Mon Sep 17 00:00:00 2001 From: Daniel Wood Date: Thu, 5 Sep 2019 21:04:40 +0100 Subject: [PATCH 5/6] Tidy up / remove unused code --- .../PathScripts/PathToolLibraryManager.py | 25 +++---------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/src/Mod/Path/PathScripts/PathToolLibraryManager.py b/src/Mod/Path/PathScripts/PathToolLibraryManager.py index 05839997dc..ebe4384927 100644 --- a/src/Mod/Path/PathScripts/PathToolLibraryManager.py +++ b/src/Mod/Path/PathScripts/PathToolLibraryManager.py @@ -845,22 +845,6 @@ class EditorPanel(): def getStandardButtons(self): return int(QtGui.QDialogButtonBox.Ok) - # def openMenu(self, position): - # menu = QtGui.QMenu() - # newAction = menu.addAction("New Tool Table") - # deleteAction = menu.addAction("Delete") - # renameAction = menu.addAction("Rename") - # action = menu.exec_(self.form.TableList.mapToGlobal(position)) - # if action == newAction: - # self.addNewToolTable() - # pass - # if action == deleteAction: - # self.removeToolTable() - # pass - # if action == renameAction: - # self.initTableRename() - # pass - def setupUi(self): # Connect Signals and Slots self.form.ButtonNewTool.clicked.connect(self.addTool) @@ -871,17 +855,14 @@ class EditorPanel(): self.form.ButtonDelete.clicked.connect(self.delete) self.form.ButtonEdit.clicked.connect(self.editTool) self.form.ButtonDuplicate.clicked.connect(self.duplicate) - + self.form.btnCopyTools.clicked.connect(self.copyTools) + self.form.ToolsList.doubleClicked.connect(self.editTool) self.form.ToolsList.clicked.connect(self.toolSelectionChanged) - - self.form.btnCopyTools.clicked.connect(self.copyTools) - + self.form.TableList.clicked.connect(self.tableSelected) self.form.TableList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) - #self.form.TableList.customContextMenuRequested.connect(self.openMenu) self.form.TableList.itemChanged.connect(self.renameTable) - self.form.ButtonAddToolTable.clicked.connect(self.addNewToolTable) self.form.ButtonAddToolTable.setToolTip(translate("TooltableEditor","Add New Tool Table")) From ac1a567ef6c408977864df2e8723961d60394c88 Mon Sep 17 00:00:00 2001 From: Daniel Wood Date: Thu, 5 Sep 2019 21:28:48 +0100 Subject: [PATCH 6/6] Move the ToolLibraryEditor code to its own file --- src/Mod/Path/CMakeLists.txt | 1 + src/Mod/Path/PathScripts/PathGuiInit.py | 1 + src/Mod/Path/PathScripts/PathJobGui.py | 4 +- .../Path/PathScripts/PathToolLibraryEditor.py | 464 ++++++++++++++++++ .../PathScripts/PathToolLibraryManager.py | 435 +--------------- 5 files changed, 473 insertions(+), 432 deletions(-) create mode 100644 src/Mod/Path/PathScripts/PathToolLibraryEditor.py diff --git a/src/Mod/Path/CMakeLists.txt b/src/Mod/Path/CMakeLists.txt index 5cc34e9cc7..f8d7479b5e 100644 --- a/src/Mod/Path/CMakeLists.txt +++ b/src/Mod/Path/CMakeLists.txt @@ -103,6 +103,7 @@ SET(PathScripts_SRCS PathScripts/PathToolControllerGui.py PathScripts/PathToolEdit.py PathScripts/PathToolLibraryManager.py + PathScripts/PathToolLibraryEditor.py PathScripts/PathUtil.py PathScripts/PathUtils.py PathScripts/PathUtilsGui.py diff --git a/src/Mod/Path/PathScripts/PathGuiInit.py b/src/Mod/Path/PathScripts/PathGuiInit.py index 002f1d0591..7ca84d5a1a 100644 --- a/src/Mod/Path/PathScripts/PathGuiInit.py +++ b/src/Mod/Path/PathScripts/PathGuiInit.py @@ -77,6 +77,7 @@ def Startup(): from PathScripts import PathToolController from PathScripts import PathToolControllerGui from PathScripts import PathToolLibraryManager + from PathScripts import PathToolLibraryEditor from PathScripts import PathUtilsGui Processed = True else: diff --git a/src/Mod/Path/PathScripts/PathJobGui.py b/src/Mod/Path/PathScripts/PathJobGui.py index 11efdef192..2c6107d711 100644 --- a/src/Mod/Path/PathScripts/PathJobGui.py +++ b/src/Mod/Path/PathScripts/PathJobGui.py @@ -36,7 +36,7 @@ import PathScripts.PathPreferences as PathPreferences import PathScripts.PathSetupSheetGui as PathSetupSheetGui import PathScripts.PathStock as PathStock import PathScripts.PathToolControllerGui as PathToolControllerGui -import PathScripts.PathToolLibraryManager as PathToolLibraryManager +import PathScripts.PathToolLibraryEditor as PathToolLibraryEditor import PathScripts.PathUtil as PathUtil import PathScripts.PathUtils as PathUtils import math @@ -854,7 +854,7 @@ class TaskPanel: self.toolControllerSelect() def toolControllerAdd(self): - PathToolLibraryManager.CommandToolLibraryEdit().edit(self.obj, self.updateToolController) + PathToolLibraryEditor.CommandToolLibraryEdit().edit(self.obj, self.updateToolController) def toolControllerDelete(self): self.objectDelete(self.form.toolControllerList) diff --git a/src/Mod/Path/PathScripts/PathToolLibraryEditor.py b/src/Mod/Path/PathScripts/PathToolLibraryEditor.py new file mode 100644 index 0000000000..5c61828309 --- /dev/null +++ b/src/Mod/Path/PathScripts/PathToolLibraryEditor.py @@ -0,0 +1,464 @@ +# -*- coding: utf-8 -*- + +# *************************************************************************** +# * * +# * Copyright (c) 2014 sliptonic * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +from __future__ import print_function + +import FreeCAD +import FreeCADGui +import Path +import PathScripts +import PathScripts.PathLog as PathLog +import PathScripts.PathToolEdit as PathToolEdit +import PathScripts.PathUtils as PathUtils +import PathScripts.PathToolLibraryManager as ToolLibraryManager + +from PySide import QtCore, QtGui + +PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) +#PathLog.trackModule(PathLog.thisModule()) + +def translate(context, text, disambig=None): + return QtCore.QCoreApplication.translate(context, text, disambig) + +class EditorPanel(): + + def __init__(self, job, cb): + self.form = FreeCADGui.PySideUic.loadUi(":/panels/ToolLibraryEditor.ui") + self.TLM = ToolLibraryManager.ToolLibraryManager() + listname = self.TLM.getCurrentTableName() + + if listname: + self.loadToolTables() + + self.job = job + self.cb = cb + + def toolEditor(self, tool): + dialog = FreeCADGui.PySideUic.loadUi(":/panels/DlgToolEdit.ui") + editor = PathToolEdit.ToolEditor(tool, dialog.toolEditor, dialog) + editor.setupUI() + return editor + + def accept(self): + pass + + def reject(self): + FreeCADGui.Control.closeDialog() + FreeCAD.ActiveDocument.recompute() + + def getFields(self): + pass + + def setFields(self): + pass + + def open(self): + pass + + def getType(self, tooltype): + "gets a combobox index number for a given type or viceversa" + toolslist = Path.Tool.getToolTypes(Path.Tool()) + if isinstance(tooltype, str): + if tooltype in toolslist: + return toolslist.index(tooltype) + else: + return 0 + else: + return toolslist[tooltype] + + def getMaterial(self, material): + '''gets a combobox index number for a given material or viceversa''' + matslist = Path.Tool.getToolMaterials(Path.Tool()) + if isinstance(material, str): + if material in matslist: + return matslist.index(material) + else: + return 0 + else: + return matslist[material] + + def addTool(self): + '''adds new tool to the current tool table''' + tool = Path.Tool() + editor = self.toolEditor(tool) + + r = editor.Parent.exec_() + if r: + editor.accept() + listname = self.TLM.getCurrentTableName() + self.TLM.addnew(listname, editor.Tool) + self.loadTable(listname) + + def delete(self): + '''deletes the selected tool''' + listname = self.TLM.getCurrentTableName() + model = self.form.ToolsList.model() + for i in range(model.rowCount()): + item = model.item(i, 0) + if item.checkState(): + t = model.index(i, 1) + self.TLM.delete(int(t.data()) ,listname) + self.loadTable(listname) + self.toolSelectionChanged() + + def editTool(self, currItem): + '''load the tool edit dialog''' + if not currItem: + currItem = self.form.ToolsList.selectedIndexes()[1] + + row = currItem.row() + value = currItem.sibling(row, 1).data() + listname = self.TLM.getCurrentTableName() + toolnum = int(value) + tool = self.TLM.getTool(listname, toolnum) + editor = self.toolEditor(tool) + + r = editor.Parent.exec_() + if r: + editor.accept() + if self.TLM.updateTool(listname, toolnum, editor.Tool) is True: + self.loadTable(listname) + + def moveUp(self): + '''moves a tool to a lower number, if possible''' + item = self.form.ToolsList.selectedIndexes()[1].data() + if item: + number = int(item) + listname = self.TLM.getCurrentTableName() + success, newNum = self.TLM.moveup(number, listname) + if success: + self.loadTable(listname) + self.updateSelection(newNum) + + def moveDown(self): + '''moves a tool to a higher number, if possible''' + item = self.form.ToolsList.selectedIndexes()[1].data() + if item: + number = int(item) + listname = self.TLM.getCurrentTableName() + success, newNum = self.TLM.movedown(number, listname) + if success: + self.loadTable(listname) + self.updateSelection(newNum) + + def duplicate(self): + '''duplicated the selected tool in the current tool table''' + item = self.form.ToolsList.selectedIndexes()[1].data() + if item: + number = int(item) + listname = self.TLM.getCurrentTableName() + success, newNum = self.TLM.duplicate(number, listname) + if success: + self.loadTable(listname) + self.updateSelection(newNum) + + def updateSelection(self, number): + '''update the tool list selection to track moves''' + model = self.form.ToolsList.model() + for i in range(model.rowCount()): + if int(model.index(i, 1).data()) == number: + self.form.ToolsList.selectRow(i) + self.form.ToolsList.model().item(i, 0).setCheckState(QtCore.Qt.Checked) + return + + + def importFile(self): + '''imports a tooltable from a file''' + filename = QtGui.QFileDialog.getOpenFileName(self.form, translate( "TooltableEditor", "Open tooltable", None), None, "{};;{};;{}".format(self.TLM.TooltableTypeJSON, self.TLM.TooltableTypeXML, self.TLM.TooltableTypeHeekscad)) + if filename[0]: + listname = self.TLM.getNextToolTableName() + if self.TLM.read(filename, listname): + self.loadToolTables() + + def exportFile(self): + '''export a tooltable to a file''' + filename = QtGui.QFileDialog.getSaveFileName(self.form, translate("TooltableEditor", "Save tooltable", None), None, "{};;{};;{}".format(self.TLM.TooltableTypeJSON, self.TLM.TooltableTypeXML, self.TLM.TooltableTypeLinuxCNC)) + if filename[0]: + listname = self.TLM.getCurrentTableName() + self.TLM.write(filename, listname) + + def toolSelectionChanged(self, index=None): + ''' updates the ui when tools are selected''' + if index: + self.form.ToolsList.selectRow(index.row()) + + self.form.btnCopyTools.setEnabled(False) + self.form.ButtonDelete.setEnabled(False) + self.form.ButtonUp.setEnabled(False) + self.form.ButtonDown.setEnabled(False) + self.form.ButtonEdit.setEnabled(False) + self.form.ButtonDuplicate.setEnabled(False) + + model = self.form.ToolsList.model() + checkCount = 0 + checkList = [] + for i in range(model.rowCount()): + item = model.item(i, 0) + if item.checkState(): + checkCount += 1 + checkList.append(i) + self.form.btnCopyTools.setEnabled(True) + + # only allow moving or deleting a single tool at a time. + if checkCount == 1: + #make sure the row is highlighted when the check box gets ticked + self.form.ToolsList.selectRow(checkList[0]) + self.form.ButtonDelete.setEnabled(True) + self.form.ButtonUp.setEnabled(True) + self.form.ButtonDown.setEnabled(True) + self.form.ButtonEdit.setEnabled(True) + self.form.ButtonDuplicate.setEnabled(True) + + if len(PathUtils.GetJobs()) == 0: + self.form.btnCopyTools.setEnabled(False) + + def copyTools(self): + ''' copy selected tool ''' + tools = [] + model = self.form.ToolsList.model() + for i in range(model.rowCount()): + item = model.item(i, 0) + if item.checkState(): + item = model.index(i, 1) + tools.append(item.data()) + if len(tools) == 0: + return + + targets = self.TLM.getJobList() + currList = self.TLM.getCurrentTableName() + + for target in targets: + if target == currList: + targets.remove(target) + + if len(targets) == 0: + FreeCAD.Console.PrintWarning("No Path Jobs in current document") + return + elif len(targets) == 1: + targetlist = targets[0] + else: + form = FreeCADGui.PySideUic.loadUi(":/panels/DlgToolCopy.ui") + form.cboTarget.addItems(targets) + r = form.exec_() + if r is False: + return None + else: + targetlist = form.cboTarget.currentText() + + for toolnum in tools: + tool = self.TLM.getTool(currList, int(toolnum)) + PathLog.debug('tool: {}, toolnum: {}'.format(tool, toolnum)) + if self.job: + label = "T{}: {}".format(toolnum, tool.Name) + tc = PathScripts.PathToolController.Create(label, tool=tool, toolNumber=int(toolnum)) + self.job.Proxy.addToolController(tc) + else: + for job in FreeCAD.ActiveDocument.findObjects("Path::Feature"): + if isinstance(job.Proxy, PathScripts.PathJob.ObjectJob) and job.Label == targetlist: + label = "T{}: {}".format(toolnum, tool.Name) + tc = PathScripts.PathToolController.Create(label, tool=tool, toolNumber=int(toolnum)) + job.Proxy.addToolController(tc) + if self.cb: + self.cb() + FreeCAD.ActiveDocument.recompute() + + def tableSelected(self, index): + ''' loads the tools for the selected tool table ''' + name = self.form.TableList.itemWidget(self.form.TableList.itemFromIndex(index)).getTableName() + self.loadTable(name) + + def loadTable(self, name): + ''' loads the tools for the selected tool table ''' + tooldata = self.TLM.getTools(name) + if tooldata: + self.form.ToolsList.setModel(tooldata) + self.form.ToolsList.resizeColumnsToContents() + self.form.ToolsList.horizontalHeader().setResizeMode(self.form.ToolsList.model().columnCount() - 1, QtGui.QHeaderView.Stretch) + self.setCurrentToolTableByName(name) + + def addNewToolTable(self): + ''' adds new tool to selected tool table ''' + name = self.TLM.addNewToolTable() + self.loadToolTables() + self.loadTable(name) + + def loadToolTables(self): + ''' Load list of available tool tables ''' + self.form.TableList.clear() + model = self.form.ToolsList.model() + if model: + model.clear() + if len(self.TLM.getToolTables()) > 0: + for table in self.TLM.getToolTables(): + listWidgetItem = QtGui.QListWidgetItem() + listItem = ToolTableListWidgetItem(self.TLM) + listItem.setTableName(table.Name) + listItem.setIcon(QtGui.QPixmap(':/icons/Path-ToolTable.svg')) + listItem.toolMoved.connect(self.reloadReset) + listWidgetItem.setSizeHint(QtCore.QSize(0,40)) + self.form.TableList.addItem(listWidgetItem) + self.form.TableList.setItemWidget(listWidgetItem, listItem) + #Load the first tooltable + self.loadTable(self.TLM.getCurrentTableName()) + + def reloadReset(self): + ''' reloads the current tooltable''' + name = self.TLM.getCurrentTableName() + self.loadTable(name) + + def setCurrentToolTableByName(self, name): + ''' get the current tool table ''' + item = self.getToolTableByName(name) + if item: + self.form.TableList.setCurrentItem(item) + + def getToolTableByName(self, name): + ''' returns the listWidgetItem for the selected name''' + for i in range(self.form.TableList.count()): + tableName = self.form.TableList.itemWidget(self.form.TableList.item(i)).getTableName() + if tableName == name: + return self.form.TableList.item(i) + return False + + def removeToolTable(self): + ''' delete the selected tool table ''' + self.TLM.deleteToolTable() + self.loadToolTables() + + def renameTable(self): + ''' provides dialog for new tablename and renames teh selected tool table''' + name = self.TLM.getCurrentTableName() + newName, ok = QtGui.QInputDialog.getText(None, translate("TooltableEditor","Rename Tooltable"),translate("TooltableEditor","Enter Name:"),QtGui.QLineEdit.Normal,name) + if ok and newName: + index = self.form.TableList.indexFromItem(self.getToolTableByName(name)).row() + reloadTables = self.TLM.renameToolTable(newName, index) + if reloadTables: + self.loadToolTables() + self.loadTable(newName) + + def getStandardButtons(self): + return int(QtGui.QDialogButtonBox.Ok) + + def setupUi(self): + # Connect Signals and Slots + self.form.ButtonNewTool.clicked.connect(self.addTool) + self.form.ButtonImport.clicked.connect(self.importFile) + self.form.ButtonExport.clicked.connect(self.exportFile) + self.form.ButtonDown.clicked.connect(self.moveDown) + self.form.ButtonUp.clicked.connect(self.moveUp) + self.form.ButtonDelete.clicked.connect(self.delete) + self.form.ButtonEdit.clicked.connect(self.editTool) + self.form.ButtonDuplicate.clicked.connect(self.duplicate) + self.form.btnCopyTools.clicked.connect(self.copyTools) + + self.form.ToolsList.doubleClicked.connect(self.editTool) + self.form.ToolsList.clicked.connect(self.toolSelectionChanged) + + self.form.TableList.clicked.connect(self.tableSelected) + self.form.TableList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) + self.form.TableList.itemChanged.connect(self.renameTable) + + self.form.ButtonAddToolTable.clicked.connect(self.addNewToolTable) + self.form.ButtonAddToolTable.setToolTip(translate("TooltableEditor","Add New Tool Table")) + self.form.ButtonRemoveToolTable.clicked.connect(self.removeToolTable) + self.form.ButtonRemoveToolTable.setToolTip(translate("TooltableEditor","Delete Selected Tool Table")) + self.form.ButtonRenameToolTable.clicked.connect(self.renameTable) + self.form.ButtonRenameToolTable.setToolTip(translate("TooltableEditor","Rename Selected Tool Table")) + + self.setFields() + +class ToolTableListWidgetItem(QtGui.QWidget): + + toolMoved = QtCore.Signal() + + def __init__(self, TLM): + super(ToolTableListWidgetItem, self).__init__() + + self.tlm = TLM + self.setAcceptDrops(True) + + self.mainLayout = QtGui.QHBoxLayout() + self.iconQLabel = QtGui.QLabel() + self.tableNameLabel = QtGui.QLabel() + self.mainLayout.addWidget(self.iconQLabel, 0) + self.mainLayout.addWidget(self.tableNameLabel, 1) + self.setLayout(self.mainLayout) + + def setTableName (self, text): + self.tableNameLabel.setText(text) + + def getTableName(self): + return self.tableNameLabel.text() + + def setIcon (self, icon): + icon = icon.scaled(24, 24) + self.iconQLabel.setPixmap(icon) + + def dragEnterEvent(self, e): + currentToolTable = self.tlm.getCurrentTableName() + thisToolTable = self.getTableName() + + if not currentToolTable == thisToolTable: + e.accept() + else: + e.ignore() + + def dropEvent(self, e): + selectedTools = e.source().selectedIndexes() + if selectedTools: + toolData = selectedTools[1].data() + + if toolData: + self.tlm.moveToTable(int(toolData), self.getTableName()) + self.toolMoved.emit() + + +class CommandToolLibraryEdit(): + def __init__(self): + pass + + def edit(self, job=None, cb=None): + editor = EditorPanel(job, cb) + editor.setupUi() + + r = editor.form.exec_() + if r: + pass + + def GetResources(self): + return {'Pixmap' : 'Path-ToolTable', + 'MenuText': QtCore.QT_TRANSLATE_NOOP("Path_ToolTable","Tool Manager"), + 'Accel': "P, T", + 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Path_ToolTable","Tool Manager")} + + def IsActive(self): + return not FreeCAD.ActiveDocument is None + + def Activated(self): + + self.edit() + +if FreeCAD.GuiUp: + # register the FreeCAD command + FreeCADGui.addCommand('Path_ToolLibraryEdit',CommandToolLibraryEdit()) diff --git a/src/Mod/Path/PathScripts/PathToolLibraryManager.py b/src/Mod/Path/PathScripts/PathToolLibraryManager.py index ebe4384927..8280b6ff1f 100644 --- a/src/Mod/Path/PathScripts/PathToolLibraryManager.py +++ b/src/Mod/Path/PathScripts/PathToolLibraryManager.py @@ -29,9 +29,7 @@ import FreeCADGui import Path import PathScripts import PathScripts.PathLog as PathLog -import PathScripts.PathToolEdit as PathToolEdit import PathScripts.PathUtil as PathUtil -import PathScripts.PathUtils as PathUtils import json import os import xml.sax @@ -145,10 +143,10 @@ class ToolLibraryManager(): preferences and all or part of the library can be exported to other formats ''' - TooltableTypeJSON = translate("TooltableEditor", "Tooltable JSON (*.json)") - TooltableTypeXML = translate("TooltableEditor", "Tooltable XML (*.xml)") - TooltableTypeHeekscad = translate("TooltableEditor", "HeeksCAD tooltable (*.tooltable)") - TooltableTypeLinuxCNC = translate("TooltableEditor", "LinuxCNC tooltable (*.tbl)") + TooltableTypeJSON = translate("PathToolLibraryManager", "Tooltable JSON (*.json)") + TooltableTypeXML = translate("PathToolLibraryManager", "Tooltable XML (*.xml)") + TooltableTypeHeekscad = translate("PathToolLibraryManager", "HeeksCAD tooltable (*.tooltable)") + TooltableTypeLinuxCNC = translate("PathToolLibraryManager", "LinuxCNC tooltable (*.tbl)") PreferenceMainLibraryXML = "ToolLibrary" PreferenceMainLibraryJSON = "ToolLibrary-Main" @@ -523,427 +521,4 @@ class ToolLibraryManager(): tt.deleteTool(number) if listname == self.getCurrentTableName(): self.saveMainLibrary() - return True - - -class EditorPanel(): - - def __init__(self, job, cb): - self.form = FreeCADGui.PySideUic.loadUi(":/panels/ToolLibraryEditor.ui") - self.TLM = ToolLibraryManager() - listname = self.TLM.getCurrentTableName() - - if listname: - self.loadToolTables() - - self.job = job - self.cb = cb - - def toolEditor(self, tool): - dialog = FreeCADGui.PySideUic.loadUi(":/panels/DlgToolEdit.ui") - editor = PathToolEdit.ToolEditor(tool, dialog.toolEditor, dialog) - editor.setupUI() - return editor - - def accept(self): - pass - - def reject(self): - FreeCADGui.Control.closeDialog() - FreeCAD.ActiveDocument.recompute() - - def getFields(self): - pass - - def setFields(self): - pass - - def open(self): - pass - - def getType(self, tooltype): - "gets a combobox index number for a given type or viceversa" - toolslist = Path.Tool.getToolTypes(Path.Tool()) - if isinstance(tooltype, str): - if tooltype in toolslist: - return toolslist.index(tooltype) - else: - return 0 - else: - return toolslist[tooltype] - - def getMaterial(self, material): - '''gets a combobox index number for a given material or viceversa''' - matslist = Path.Tool.getToolMaterials(Path.Tool()) - if isinstance(material, str): - if material in matslist: - return matslist.index(material) - else: - return 0 - else: - return matslist[material] - - def addTool(self): - '''adds new tool to the current tool table''' - tool = Path.Tool() - editor = self.toolEditor(tool) - - r = editor.Parent.exec_() - if r: - editor.accept() - listname = self.TLM.getCurrentTableName() - self.TLM.addnew(listname, editor.Tool) - self.loadTable(listname) - - def delete(self): - '''deletes the selected tool''' - listname = self.TLM.getCurrentTableName() - model = self.form.ToolsList.model() - for i in range(model.rowCount()): - item = model.item(i, 0) - if item.checkState(): - t = model.index(i, 1) - self.TLM.delete(int(t.data()) ,listname) - self.loadTable(listname) - self.toolSelectionChanged() - - def editTool(self, currItem): - '''load the tool edit dialog''' - if not currItem: - currItem = self.form.ToolsList.selectedIndexes()[1] - - row = currItem.row() - value = currItem.sibling(row, 1).data() - listname = self.TLM.getCurrentTableName() - toolnum = int(value) - tool = self.TLM.getTool(listname, toolnum) - editor = self.toolEditor(tool) - - r = editor.Parent.exec_() - if r: - editor.accept() - if self.TLM.updateTool(listname, toolnum, editor.Tool) is True: - self.loadTable(listname) - - def moveUp(self): - '''moves a tool to a lower number, if possible''' - item = self.form.ToolsList.selectedIndexes()[1].data() - if item: - number = int(item) - listname = self.TLM.getCurrentTableName() - success, newNum = self.TLM.moveup(number, listname) - if success: - self.loadTable(listname) - self.updateSelection(newNum) - - def moveDown(self): - '''moves a tool to a higher number, if possible''' - item = self.form.ToolsList.selectedIndexes()[1].data() - if item: - number = int(item) - listname = self.TLM.getCurrentTableName() - success, newNum = self.TLM.movedown(number, listname) - if success: - self.loadTable(listname) - self.updateSelection(newNum) - - def duplicate(self): - '''duplicated the selected tool in the current tool table''' - item = self.form.ToolsList.selectedIndexes()[1].data() - if item: - number = int(item) - listname = self.TLM.getCurrentTableName() - success, newNum = self.TLM.duplicate(number, listname) - if success: - self.loadTable(listname) - self.updateSelection(newNum) - - def updateSelection(self, number): - '''update the tool list selection to track moves''' - model = self.form.ToolsList.model() - for i in range(model.rowCount()): - if int(model.index(i, 1).data()) == number: - self.form.ToolsList.selectRow(i) - self.form.ToolsList.model().item(i, 0).setCheckState(QtCore.Qt.Checked) - return - - - def importFile(self): - '''imports a tooltable from a file''' - filename = QtGui.QFileDialog.getOpenFileName(self.form, translate( "TooltableEditor", "Open tooltable", None), None, "{};;{};;{}".format(ToolLibraryManager.TooltableTypeJSON, ToolLibraryManager.TooltableTypeXML, ToolLibraryManager.TooltableTypeHeekscad)) - if filename[0]: - listname = self.TLM.getNextToolTableName() - if self.TLM.read(filename, listname): - self.loadToolTables() - - def exportFile(self): - '''export a tooltable to a file''' - filename = QtGui.QFileDialog.getSaveFileName(self.form, translate("TooltableEditor", "Save tooltable", None), None, "{};;{};;{}".format(ToolLibraryManager.TooltableTypeJSON, ToolLibraryManager.TooltableTypeXML, ToolLibraryManager.TooltableTypeLinuxCNC)) - if filename[0]: - listname = self.TLM.getCurrentTableName() - self.TLM.write(filename, listname) - - def toolSelectionChanged(self, index=None): - ''' updates the ui when tools are selected''' - if index: - self.form.ToolsList.selectRow(index.row()) - - self.form.btnCopyTools.setEnabled(False) - self.form.ButtonDelete.setEnabled(False) - self.form.ButtonUp.setEnabled(False) - self.form.ButtonDown.setEnabled(False) - self.form.ButtonEdit.setEnabled(False) - self.form.ButtonDuplicate.setEnabled(False) - - model = self.form.ToolsList.model() - checkCount = 0 - checkList = [] - for i in range(model.rowCount()): - item = model.item(i, 0) - if item.checkState(): - checkCount += 1 - checkList.append(i) - self.form.btnCopyTools.setEnabled(True) - - # only allow moving or deleting a single tool at a time. - if checkCount == 1: - #make sure the row is highlighted when the check box gets ticked - self.form.ToolsList.selectRow(checkList[0]) - self.form.ButtonDelete.setEnabled(True) - self.form.ButtonUp.setEnabled(True) - self.form.ButtonDown.setEnabled(True) - self.form.ButtonEdit.setEnabled(True) - self.form.ButtonDuplicate.setEnabled(True) - - if len(PathUtils.GetJobs()) == 0: - self.form.btnCopyTools.setEnabled(False) - - def copyTools(self): - ''' copy selected tool ''' - tools = [] - model = self.form.ToolsList.model() - for i in range(model.rowCount()): - item = model.item(i, 0) - if item.checkState(): - item = model.index(i, 1) - tools.append(item.data()) - if len(tools) == 0: - return - - targets = self.TLM.getJobList() - currList = self.TLM.getCurrentTableName() - - for target in targets: - if target == currList: - targets.remove(target) - - if len(targets) == 0: - FreeCAD.Console.PrintWarning("No Path Jobs in current document") - return - elif len(targets) == 1: - targetlist = targets[0] - else: - form = FreeCADGui.PySideUic.loadUi(":/panels/DlgToolCopy.ui") - form.cboTarget.addItems(targets) - r = form.exec_() - if r is False: - return None - else: - targetlist = form.cboTarget.currentText() - - for toolnum in tools: - tool = self.TLM.getTool(currList, int(toolnum)) - PathLog.debug('tool: {}, toolnum: {}'.format(tool, toolnum)) - if self.job: - label = "T{}: {}".format(toolnum, tool.Name) - tc = PathScripts.PathToolController.Create(label, tool=tool, toolNumber=int(toolnum)) - self.job.Proxy.addToolController(tc) - else: - for job in FreeCAD.ActiveDocument.findObjects("Path::Feature"): - if isinstance(job.Proxy, PathScripts.PathJob.ObjectJob) and job.Label == targetlist: - label = "T{}: {}".format(toolnum, tool.Name) - tc = PathScripts.PathToolController.Create(label, tool=tool, toolNumber=int(toolnum)) - job.Proxy.addToolController(tc) - if self.cb: - self.cb() - FreeCAD.ActiveDocument.recompute() - - def tableSelected(self, index): - ''' loads the tools for the selected tool table ''' - name = self.form.TableList.itemWidget(self.form.TableList.itemFromIndex(index)).getTableName() - self.loadTable(name) - - def loadTable(self, name): - ''' loads the tools for the selected tool table ''' - tooldata = self.TLM.getTools(name) - if tooldata: - self.form.ToolsList.setModel(tooldata) - self.form.ToolsList.resizeColumnsToContents() - self.form.ToolsList.horizontalHeader().setResizeMode(self.form.ToolsList.model().columnCount() - 1, QtGui.QHeaderView.Stretch) - self.setCurrentToolTableByName(name) - - def addNewToolTable(self): - ''' adds new tool to selected tool table ''' - name = self.TLM.addNewToolTable() - self.loadToolTables() - self.loadTable(name) - - def loadToolTables(self): - ''' Load list of available tool tables ''' - self.form.TableList.clear() - model = self.form.ToolsList.model() - if model: - model.clear() - if len(self.TLM.getToolTables()) > 0: - for table in self.TLM.getToolTables(): - listWidgetItem = QtGui.QListWidgetItem() - listItem = ToolTableListWidgetItem(self.TLM) - listItem.setTableName(table.Name) - listItem.setIcon(QtGui.QPixmap(':/icons/Path-ToolTable.svg')) - listItem.toolMoved.connect(self.reloadReset) - listWidgetItem.setSizeHint(QtCore.QSize(0,40)) - self.form.TableList.addItem(listWidgetItem) - self.form.TableList.setItemWidget(listWidgetItem, listItem) - #Load the first tooltable - self.loadTable(self.TLM.getCurrentTableName()) - - def reloadReset(self): - ''' reloads the current tooltable''' - name = self.TLM.getCurrentTableName() - self.loadTable(name) - - def setCurrentToolTableByName(self, name): - ''' get the current tool table ''' - item = self.getToolTableByName(name) - if item: - self.form.TableList.setCurrentItem(item) - - def getToolTableByName(self, name): - ''' returns the listWidgetItem for the selected name''' - for i in range(self.form.TableList.count()): - tableName = self.form.TableList.itemWidget(self.form.TableList.item(i)).getTableName() - if tableName == name: - return self.form.TableList.item(i) - return False - - def removeToolTable(self): - ''' delete the selected tool table ''' - self.TLM.deleteToolTable() - self.loadToolTables() - - def renameTable(self): - ''' provides dialog for new tablename and renames teh selected tool table''' - name = self.TLM.getCurrentTableName() - newName, ok = QtGui.QInputDialog.getText(None, translate("TooltableEditor","Rename Tooltable"),translate("TooltableEditor","Enter Name:"),QtGui.QLineEdit.Normal,name) - if ok and newName: - index = self.form.TableList.indexFromItem(self.getToolTableByName(name)).row() - reloadTables = self.TLM.renameToolTable(newName, index) - if reloadTables: - self.loadToolTables() - self.loadTable(newName) - - def getStandardButtons(self): - return int(QtGui.QDialogButtonBox.Ok) - - def setupUi(self): - # Connect Signals and Slots - self.form.ButtonNewTool.clicked.connect(self.addTool) - self.form.ButtonImport.clicked.connect(self.importFile) - self.form.ButtonExport.clicked.connect(self.exportFile) - self.form.ButtonDown.clicked.connect(self.moveDown) - self.form.ButtonUp.clicked.connect(self.moveUp) - self.form.ButtonDelete.clicked.connect(self.delete) - self.form.ButtonEdit.clicked.connect(self.editTool) - self.form.ButtonDuplicate.clicked.connect(self.duplicate) - self.form.btnCopyTools.clicked.connect(self.copyTools) - - self.form.ToolsList.doubleClicked.connect(self.editTool) - self.form.ToolsList.clicked.connect(self.toolSelectionChanged) - - self.form.TableList.clicked.connect(self.tableSelected) - self.form.TableList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) - self.form.TableList.itemChanged.connect(self.renameTable) - - self.form.ButtonAddToolTable.clicked.connect(self.addNewToolTable) - self.form.ButtonAddToolTable.setToolTip(translate("TooltableEditor","Add New Tool Table")) - self.form.ButtonRemoveToolTable.clicked.connect(self.removeToolTable) - self.form.ButtonRemoveToolTable.setToolTip(translate("TooltableEditor","Delete Selected Tool Table")) - self.form.ButtonRenameToolTable.clicked.connect(self.renameTable) - self.form.ButtonRenameToolTable.setToolTip(translate("TooltableEditor","Rename Selected Tool Table")) - - self.setFields() - -class ToolTableListWidgetItem(QtGui.QWidget): - - toolMoved = QtCore.Signal() - - def __init__(self, TLM): - super(ToolTableListWidgetItem, self).__init__() - - self.tlm = TLM - self.setAcceptDrops(True) - - self.mainLayout = QtGui.QHBoxLayout() - self.iconQLabel = QtGui.QLabel() - self.tableNameLabel = QtGui.QLabel() - self.mainLayout.addWidget(self.iconQLabel, 0) - self.mainLayout.addWidget(self.tableNameLabel, 1) - self.setLayout(self.mainLayout) - - def setTableName (self, text): - self.tableNameLabel.setText(text) - - def getTableName(self): - return self.tableNameLabel.text() - - def setIcon (self, icon): - icon = icon.scaled(24, 24) - self.iconQLabel.setPixmap(icon) - - def dragEnterEvent(self, e): - currentToolTable = self.tlm.getCurrentTableName() - thisToolTable = self.getTableName() - - if not currentToolTable == thisToolTable: - e.accept() - else: - e.ignore() - - def dropEvent(self, e): - selectedTools = e.source().selectedIndexes() - if selectedTools: - toolData = selectedTools[1].data() - - if toolData: - self.tlm.moveToTable(int(toolData), self.getTableName()) - self.toolMoved.emit() - - -class CommandToolLibraryEdit(): - def __init__(self): - pass - - def edit(self, job=None, cb=None): - editor = EditorPanel(job, cb) - editor.setupUi() - - r = editor.form.exec_() - if r: - pass - - def GetResources(self): - return {'Pixmap' : 'Path-ToolTable', - 'MenuText': QtCore.QT_TRANSLATE_NOOP("Path_ToolTable","Tool Manager"), - 'Accel': "P, T", - 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Path_ToolTable","Tool Manager")} - - def IsActive(self): - return not FreeCAD.ActiveDocument is None - - def Activated(self): - - self.edit() - -if FreeCAD.GuiUp: - # register the FreeCAD command - FreeCADGui.addCommand('Path_ToolLibraryEdit',CommandToolLibraryEdit()) + return True \ No newline at end of file