From 6c594d048ec06ee12a9cba115f2f415d4b01c1ef Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Fri, 15 Nov 2019 17:12:39 +0200 Subject: [PATCH] - added all the recognized extensions to the save dialog filters; latest extension used will be preselected next time a save operation occur --- FlatCAMApp.py | 43 +++++++++++++++++++++++++++++++++++++--- FlatCAMObj.py | 55 +++++++++++++++++++++++++++++++++++++++++++-------- README.md | 4 ++++ 3 files changed, 91 insertions(+), 11 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 1cb56526..f4dd5925 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -498,6 +498,24 @@ class App(QtCore.QObject): "gerber_use_buffer_for_union": True, "gerber_def_units": 'IN', "gerber_def_zeros": 'L', + "gerber_save_filters": "Gerber File (*.gbr);;Gerber File (*.bot);;Gerber File (*.bsm);;" + "Gerber File (*.cmp);;Gerber File (*.crc);;Gerber File (*.crs);;" + "Gerber File (*.gb0);;Gerber File (*.gb1);;Gerber File (*.gb2);;" + "Gerber File (*.gb3);;Gerber File (*.gb4);;Gerber File (*.gb5);;" + "Gerber File (*.gb6);;Gerber File (*.gb7);;Gerber File (*.gb8);;" + "Gerber File (*.gb9);;Gerber File (*.gbd);;Gerber File (*.gbl);;" + "Gerber File (*.gbo);;Gerber File (*.gbp);;Gerber File (*.gbs);;" + "Gerber File (*.gdo);;Gerber File (*.ger);;Gerber File (*.gko);;" + "Gerber File (*.gm1);;Gerber File (*.gm2);;Gerber File (*.gm3);;" + "Gerber File (*.grb);;Gerber File (*.gtl);;Gerber File (*.gto);;" + "Gerber File (*.gtp);;Gerber File (*.gts);;Gerber File (*.ly15);;" + "Gerber File (*.ly2);;Gerber File (*.mil);;Gerber File (*.pho);;" + "Gerber File (*.plc);;Gerber File (*.pls);;Gerber File (*.smb);;" + "Gerber File (*.smt);;Gerber File (*.sol);;Gerber File (*.spb);;" + "Gerber File (*.spt);;Gerber File (*.ssb);;Gerber File (*.sst);;" + "Gerber File (*.stc);;Gerber File (*.sts);;Gerber File (*.top);;" + "Gerber File (*.tsm);;Gerber File (*.art)" + "All Files (*.*)", # Gerber Options "gerber_isotooldia": 0.00787402, @@ -558,6 +576,9 @@ class App(QtCore.QObject): "excellon_update": True, "excellon_optimization_type": 'B', "excellon_search_time": 3, + "excellon_save_filters": "Excellon File (*.txt);;Excellon File (*.drd);;Excellon File (*.drl);;" + "Excellon File (*.exc);;Excellon File (*.ncd);;Excellon File (*.tap);;" + "Excellon File (*.xln);;All Files (*.*)", # Excellon Options "excellon_drillz": -0.0590551, @@ -663,6 +684,16 @@ class App(QtCore.QObject): "cncjob_steps_per_circle": 128, "cncjob_footer": False, "cncjob_line_ending": False, + "cncjob_save_filters": "G-Code Files (*.nc);;G-Code Files (*.din);;G-Code Files (*.dnc);;" + "G-Code Files (*.ecs);;G-Code Files (*.eia);;G-Code Files (*.fan);;" + "G-Code Files (*.fgc);;G-Code Files (*.fnc);;G-Code Files (*.gc);;" + "G-Code Files (*.gcd);;G-Code Files (*.gcode);;G-Code Files (*.h);;" + "G-Code Files (*.hnc);;G-Code Files (*.i);;G-Code Files (*.min);;" + "G-Code Files (*.mpf);;G-Code Files (*.mpr);;G-Code Files (*.cnc);;" + "G-Code Files (*.ncc);;G-Code Files (*.ncg);;G-Code Files (*.ncp);;" + "G-Code Files (*.ngc);;G-Code Files (*.out);;G-Code Files (*.ply);;" + "G-Code Files (*.sbp);;G-Code Files (*.tap);;G-Code Files (*.xpi);;" + "All Files (*.*)", # CNC Job Options "cncjob_prepend": "", @@ -846,7 +877,7 @@ class App(QtCore.QObject): "fa_excellon": 'drd, drl, exc, ncd, tap, xln', "fa_gcode": 'cnc, din, dnc, ecs, eia, fan, fgc, fnc, gc, gcd, gcode, h, hnc, i, min, mpf, mpr, nc, ncc, ' 'ncg, ncp, ngc, out, plt, ply, rol, sbp, tap, xpi', - "fa_gerber": 'art, bot, bsm, cmp, crc, crs, dim, g4, gb0, gb1, gb2, gb3, gb5, gb6, gb7, gb8, gb9, gbd, ' + "fa_gerber": 'art, bot, bsm, cmp, crc, crs, dim, gb0, gb1, gb2, gb3, gb4, gb5, gb6, gb7, gb8, gb9, gbd, ' 'gbl, gbo, gbp, gbr, gbs, gdo, ger, gko, gm1, gm2, gm3, grb, gtl, gto, gtp, gts, ly15, ly2, ' 'mil, pho, plc, pls, smb, smt, sol, spb, spt, ssb, sst, stc, sts, top, tsm', # Keyword list @@ -9357,7 +9388,7 @@ class App(QtCore.QObject): name = self.collection.get_active().options["name"] - _filter = "Excellon File (*.DRL);;Excellon File (*.TXT);;All Files (*.*)" + _filter = self.defaults["excellon_save_filters"] try: filename, _f = QtWidgets.QFileDialog.getSaveFileName( caption=_("Export Excellon"), @@ -9373,6 +9404,9 @@ class App(QtCore.QObject): _("Export Excellon cancelled.")) return else: + used_extension = filename.rpartition('.')[2] + obj.update_filters(last_ext=used_extension, filter_string='excellon_save_filters') + self.export_excellon(name, filename) if self.defaults["global_open_style"] is False: self.file_opened.emit("Excellon", filename) @@ -9401,7 +9435,7 @@ class App(QtCore.QObject): name = self.collection.get_active().options["name"] - _filter_ = "Gerber File (*.GBR);;All Files (*.*)" + _filter_ = self.defaults['gerber_save_filters'] try: filename, _f = QtWidgets.QFileDialog.getSaveFileName( caption=_("Export Gerber"), @@ -9417,6 +9451,9 @@ class App(QtCore.QObject): _("Export Gerber cancelled.")) return else: + used_extension = filename.rpartition('.')[2] + obj.update_filters(last_ext=used_extension, filter_string='gerber_save_filters') + self.export_gerber(name, filename) if self.defaults["global_open_style"] is False: self.file_opened.emit("Gerber", filename) diff --git a/FlatCAMObj.py b/FlatCAMObj.py index 749b023b..0e862a77 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -412,6 +412,43 @@ class FlatCAMObj(QtCore.QObject): key = self.mark_shapes[apid].add(tolerance=self.drawing_tolerance, **kwargs) return key + def update_filters(self, last_ext, filter_string): + """ + Will modify the filter string that is used when saving a file (a list of file extensions) to have the last + used file extension as the first one in the special string + + :param last_ext: the file extension that was last used to save a file + :param filter_string: a key in self.app.defaults that holds a string with the filter from QFileDialog + used when saving a file + :return: None + """ + + filters = copy(self.app.defaults[filter_string]) + filter_list = filters.split(';;') + filter_list_enum_1 = enumerate(filter_list) + + # search for the last element in the filters which should always be "All Files (*.*)" + last_elem = '' + for elem in list(filter_list_enum_1): + if '(*.*)' in elem[1]: + last_elem = filter_list.pop(elem[0]) + + filter_list_enum = enumerate(filter_list) + for elem in list(filter_list_enum): + if '.' + last_ext in elem[1]: + used_ext = filter_list.pop(elem[0]) + + # sort the extensions back + filter_list.sort(key=lambda x: x.rpartition('.')[2]) + + # add as a first element the last used extension + filter_list.insert(0, used_ext) + # add back the element that should always be the last (All Files) + filter_list.append(last_elem) + + self.app.defaults[filter_string] = ';;'.join(filter_list) + return + @staticmethod def poly2rings(poly): return [poly.exterior] + [interior for interior in poly.interiors] @@ -6043,16 +6080,15 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): self.read_form() name = self.app.collection.get_active().options['name'] + save_gcode = False if 'Roland' in self.pp_excellon_name or 'Roland' in self.pp_geometry_name: - _filter_ = "RML1 Files (*.rol);;" \ - "All Files (*.*)" + _filter_ = "RML1 Files (*.rol);;All Files (*.*)" elif 'hpgl' in self.pp_geometry_name: - _filter_ = "HPGL Files (*.plt);;" \ - "All Files (*.*)" + _filter_ = "HPGL Files (*.plt);;All Files (*.*)" else: - _filter_ = "G-Code Files (*.nc);;G-Code Files (*.txt);;G-Code Files (*.tap);;G-Code Files (*.ngc);;" \ - "G-Code Files (*.cnc);;G-Code Files (*.g-code);;All Files (*.*)" + save_gcode = True + _filter_ = self.app.defaults['cncjob_save_filters'] try: dir_file_to_save = self.app.get_last_save_folder() + '/' + str(name) @@ -6067,9 +6103,12 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): filename = str(filename) if filename == '': - self.app.inform.emit('[WARNING_NOTCL] %s' % - _("Export Machine Code cancelled ...")) + self.app.inform.emit('[WARNING_NOTCL] %s' % _("Export Machine Code cancelled ...")) return + else: + if save_gcode is True: + used_extension = filename.rpartition('.')[2] + self.update_filters(last_ext=used_extension, filter_string='cncjob_save_filters') new_name = os.path.split(str(filename))[1].rpartition('.')[0] self.ui.name_entry.set_value(new_name) diff --git a/README.md b/README.md index c63dfbc6..2d70952b 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ CAD program, and create G-Code for Isolation routing. ================================================= +15.11.2019 + +- added all the recognized extensions to the save dialog filters; latest extension used will be preselected next time a save operation occur + 14.11.2019 - made sure that the 'default' postprocessor file is always loaded first such that this name is always first in the GUI comboboxes