Przeglądaj źródła

- added all the recognized extensions to the save dialog filters; latest extension used will be preselected next time a save operation occur

Marius Stanciu 6 lat temu
rodzic
commit
6c594d048e
3 zmienionych plików z 91 dodań i 11 usunięć
  1. 40 3
      FlatCAMApp.py
  2. 47 8
      FlatCAMObj.py
  3. 4 0
      README.md

+ 40 - 3
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)

+ 47 - 8
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)

+ 4 - 0
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