From f34b63f5701b785cf33c5911fadd4596f2e80fe7 Mon Sep 17 00:00:00 2001 From: Markus Lampert Date: Wed, 13 Sep 2017 21:53:02 -0700 Subject: [PATCH] Added full JSON file format support to ToolLibraryManager. --- .../PathScripts/PathToolLibraryManager.py | 71 +++++++++++++------ 1 file changed, 49 insertions(+), 22 deletions(-) diff --git a/src/Mod/Path/PathScripts/PathToolLibraryManager.py b/src/Mod/Path/PathScripts/PathToolLibraryManager.py index c0965348be..8f363c030d 100644 --- a/src/Mod/Path/PathScripts/PathToolLibraryManager.py +++ b/src/Mod/Path/PathScripts/PathToolLibraryManager.py @@ -143,6 +143,11 @@ 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)") + def __init__(self): self.prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Path") return @@ -236,20 +241,32 @@ class ToolLibraryManager(): # methods for importing and exporting def read(self, filename, listname): "imports a tooltable from a file" - parser = xml.sax.make_parser() - parser.setFeature(xml.sax.handler.feature_namespaces, 0) - if os.path.splitext(filename[0])[1].lower() == ".tooltable": - Handler = HeeksTooltableHandler() - else: - Handler = FreeCADTooltableHandler() try: - parser.setContentHandler(Handler) - parser.parse(unicode(filename[0])) - if not Handler.tooltable: - return None + fileExtension = os.path.splitext(filename[0])[1].lower() + xmlHandler = None + if fileExtension == '.tooltable': + xmlHandler = HeeksTooltableHandler() + if fileExtension == '.xml': + xmlHandler = FeeCADTooltableHandler() + + if xmlHandler: + parser = xml.sax.make_parser() + parser.setFeature(xml.sax.handler.feature_namespaces, 0) + parser.setContentHandler(xmlHandler) + parser.parse(unicode(filename[0])) + if not xmlHandler.tooltable: + return None + + ht = xmlHandler.tooltable + else: + with open(unicode(filename[0]), "rb") as fp: + stringAttrs = json.load(fp) + attrs = {} + for key, val in stringAttrs.iteritems(): + attrs[int(key)] = val + ht = Path.Tooltable(attrs) - ht = Handler.tooltable tt = self._findList(listname) for t in ht.Tools: newt = ht.getTool(t).copy() @@ -260,24 +277,34 @@ class ToolLibraryManager(): except Exception as e: print("could not parse file", e) + def write(self, filename, listname): "exports the tooltable to a file" tt = self._findList(listname) if tt: try: - file = open(unicode(filename[0]), "wb") + def openFileWithExtension(name, ext): + fext = os.path.splitext(name)[1].lower() + if fext != ext: + name = "{}{}".format(name, ext) + return (open(unicode(name), 'wb'), name) - if filename[1] == 'LinuxCNC tooltable (*.tbl)': + if filename[1] == self.TooltableTypeXML: + fp,fname = openFileWithExtension(filename[0], '.xml') + fp.write('\n') + fp.write(tt.Content) + elif filename[1] == self.TooltableTypeLinuxCNC: + fp,fname = openFileWithExtension(filename[0], '.tbl') for key in tt.Tools: t = tt.Tools[key] - file.write("T{} P{} Y{} Z{} A{} B{} C{} U{} V{} W{} D{} I{} J{} Q{} ;{}\n".format(key,key,0,t.LengthOffset,0,0,0,0,0,0,t.Diameter,0,0,0,t.Name)) - + fp.write("T{} P{} Y{} Z{} A{} B{} C{} U{} V{} W{} D{} I{} J{} Q{} ;{}\n".format(key,key,0,t.LengthOffset,0,0,0,0,0,0,t.Diameter,0,0,0,t.Name)) else: - file.write('\n') - file.write(tt.Content) + fp,fname = openFileWithExtension(filename[0], '.json') + attrs = tt.templateAttrs() + json.dump(attrs, fp, sort_keys=True, indent=2) - file.close() - print("Written ", unicode(filename[0])) + fp.close() + print("Written ", unicode(fname)) except Exception as e: print("Could not write file:", e) @@ -500,7 +527,7 @@ class EditorPanel(): def importFile(self): "imports a tooltable from a file" - filename = QtGui.QFileDialog.getOpenFileName(self.form, translate( "TooltableEditor", "Open tooltable", None), None, translate("TooltableEditor", "Tooltable XML (*.xml);;HeeksCAD tooltable (*.tooltable)", None)) + filename = QtGui.QFileDialog.getOpenFileName(self.form, translate( "TooltableEditor", "Open tooltable", None), None, "{};;{};;{}".format(ToolLibraryManager.TooltableTypeJSON, ToolLibraryManager.TooltableTypeXML, ToolLibraryManager.TooltableTypeHeekscad)) if filename[0]: listname = '
' if self.TLM.read(filename, listname): @@ -508,8 +535,8 @@ class EditorPanel(): def exportFile(self): - "imports a tooltable from a file" - filename = QtGui.QFileDialog.getSaveFileName(self.form, translate("TooltableEditor", "Save tooltable", None), None, translate("TooltableEditor", "Tooltable XML (*.xml);;LinuxCNC tooltable (*.tbl)", None)) + "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.form.listView.selectedIndexes()[0].data()