# -*- coding: utf-8 -*- # *************************************************************************** # * Copyright (c) 2019 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 * # * * # *************************************************************************** import FreeCAD import FreeCADGui import PathScripts.PathIconViewProvider as PathIconViewProvider import PathScripts.PathLog as PathLog import PathScripts.PathPreferences as PathPreferences import PathScripts.PathToolBit as PathToolBit import PathScripts.PathToolBitEdit as PathToolBitEdit import os from PySide import QtCore, QtGui __title__ = "Tool Bit UI" __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.INFO, PathLog.thisModule()) # PathLog.trackModule(PathLog.thisModule()) class ViewProvider(object): '''ViewProvider for a ToolBit. It's sole job is to provide an icon and invoke the TaskPanel on edit.''' def __init__(self, vobj, name): PathLog.track(name, vobj.Object) self.panel = None self.icon = name self.obj = vobj.Object self.vobj = vobj vobj.Proxy = self def attach(self, vobj): PathLog.track(vobj.Object) self.vobj = vobj self.obj = vobj.Object def getIcon(self): png = self.obj.Proxy.getBitThumbnail(self.obj) if png: pixmap = QtGui.QPixmap() pixmap.loadFromData(png, 'PNG') return QtGui.QIcon(pixmap) return ':/icons/Path_ToolBit.svg' def __getstate__(self): return None def __setstate__(self, state): # pylint: disable=unused-argument return None def onDelete(self, vobj, arg2=None): PathLog.track(vobj.Object.Label) vobj.Object.Proxy.onDelete(vobj.Object) def getDisplayMode(self, mode): # pylint: disable=unused-argument return 'Default' def _openTaskPanel(self, vobj, deleteOnReject): PathLog.track() self.panel = TaskPanel(vobj, deleteOnReject) FreeCADGui.Control.closeDialog() FreeCADGui.Control.showDialog(self.panel) self.panel.setupUi() def setCreate(self, vobj): PathLog.track() self._openTaskPanel(vobj, True) def setEdit(self, vobj, mode=0): # pylint: disable=unused-argument self._openTaskPanel(vobj, False) return True def unsetEdit(self, vobj, mode): # pylint: disable=unused-argument FreeCADGui.Control.closeDialog() self.panel = None return def claimChildren(self): if self.obj.BitBody: return [self.obj.BitBody] return [] def doubleClicked(self, vobj): if os.path.exists(vobj.Object.BitShape): self.setEdit(vobj) else: msg = translate('PathToolBit', 'Toolbit cannot be edited: Shapefile not found') diag = QtGui.QMessageBox(QtGui.QMessageBox.Warning, 'Error', msg) diag.setWindowModality(QtCore.Qt.ApplicationModal) diag.exec_() class TaskPanel: '''TaskPanel for the SetupSheet - if it is being edited directly.''' def __init__(self, vobj, deleteOnReject): PathLog.track(vobj.Object.Label) self.vobj = vobj self.obj = vobj.Object self.editor = PathToolBitEdit.ToolBitEditor(self.obj) self.form = self.editor.form self.deleteOnReject = deleteOnReject 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')) self.editor.reject() FreeCAD.ActiveDocument.removeObject(self.obj.Name) FreeCAD.ActiveDocument.commitTransaction() FreeCAD.ActiveDocument.recompute() def accept(self): self.editor.accept() FreeCAD.ActiveDocument.commitTransaction() FreeCADGui.ActiveDocument.resetEdit() FreeCADGui.Control.closeDialog() FreeCAD.ActiveDocument.recompute() def updateUI(self): PathLog.track() self.editor.updateUI() def updateModel(self): self.editor.updateTool() FreeCAD.ActiveDocument.recompute() def setupUi(self): self.editor.setupUI() class ToolBitGuiFactory(PathToolBit.ToolBitFactory): def Create(self, name='ToolBit', shapeFile=None, path=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.''' PathLog.track(name, shapeFile, path) FreeCAD.ActiveDocument.openTransaction(translate('PathToolBit', 'Create ToolBit')) tool = PathToolBit.ToolBitFactory.Create(self, name, shapeFile, path) PathIconViewProvider.Attach(tool.ViewObject, name) FreeCAD.ActiveDocument.commitTransaction() return tool def isValidFileName(filename): print(filename) try: with open(filename, "w") as tempfile: return True except Exception: return False def GetNewToolFile(parent=None): if parent is None: parent = QtGui.QApplication.activeWindow() foo = QtGui.QFileDialog.getSaveFileName(parent, 'Tool', PathPreferences.lastPathToolBit(), '*.fctb') if foo and foo[0]: if not isValidFileName(foo[0]): msgBox = QtGui.QMessageBox() msg = translate("Path", "Invalid Filename", None) msgBox.setText(msg) msgBox.exec_() else: PathPreferences.setLastPathToolBit(os.path.dirname(foo[0])) return foo[0] return None def GetToolFile(parent=None): if parent is None: parent = QtGui.QApplication.activeWindow() 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): if parent is None: parent = QtGui.QApplication.activeWindow() 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): if parent is None: parent = QtGui.QApplication.activeWindow() location = PathPreferences.lastPathToolShape() if os.path.isfile(location): location = os.path.split(location)[0] elif not os.path.isdir(location): location = PathPreferences.filePath() fname = QtGui.QFileDialog.getOpenFileName(parent, 'Select Tool Shape', location, '*.fcstd') if fname and fname[0]: if fname != location: newloc = os.path.dirname(fname[0]) PathPreferences.setLastPathToolShape(newloc) return fname[0] else: return None 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. ''' return [PathToolBit.Factory.CreateFrom(foo) for foo in GetToolFiles(parent)] # Set the factory so all tools are created with UI PathToolBit.Factory = ToolBitGuiFactory() PathIconViewProvider.RegisterViewProvider('ToolBit', ViewProvider)