Explorar o código

- added support for Gerber format specification D (no zero suppression) - PCBWizard Gerber files support

Marius Stanciu %!s(int64=6) %!d(string=hai) anos
pai
achega
c623b8d63c
Modificáronse 4 ficheiros con 33 adicións e 20 borrados
  1. 6 4
      FlatCAMApp.py
  2. 4 0
      README.md
  3. 15 10
      camlib.py
  4. 8 6
      flatcamGUI/FlatCAMGUI.py

+ 6 - 4
FlatCAMApp.py

@@ -1810,9 +1810,11 @@ class App(QtCore.QObject):
         # Variable to store the GCODE that was edited
         self.gcode_edited = ""
 
-        self.grb_list = ['gbr', 'ger', 'gtl', 'gbl', 'gts', 'gbs', 'gtp', 'gbp', 'gto', 'gbo', 'gm1', 'gm2', 'gm3', 'gko',
-                    'cmp', 'sol', 'stc', 'sts', 'plc', 'pls', 'crc', 'crs', 'tsm', 'bsm', 'ly2', 'ly15', 'dim', 'mil',
-                    'grb', 'top', 'bot', 'smt', 'smb', 'sst', 'ssb', 'spt', 'spb', 'pho', 'gdo', 'art', 'gbd']
+        self.grb_list = ['gbr', 'ger', 'gtl', 'gbl', 'gts', 'gbs', 'gtp', 'gbp', 'gto', 'gbo', 'gm1', 'gm2', 'gm3',
+                         'gko', 'cmp', 'sol', 'stc', 'sts', 'plc', 'pls', 'crc', 'crs', 'tsm', 'bsm', 'ly2', 'ly15',
+                         'dim', 'mil', 'grb', 'top', 'bot', 'smt', 'smb', 'sst', 'ssb', 'spt', 'spb', 'pho', 'gdo',
+                         'art', 'gbd', 'gb0', 'gb1', 'gb2', 'gb3', 'g4', 'gb5', 'gb6', 'gb7', 'gb8', 'gb9'
+                         ]
         self.exc_list = ['drl', 'txt', 'xln', 'drd', 'tap', 'exc']
         self.gcode_list = ['nc', 'ncc', 'tap', 'gcode', 'cnc', 'ecs', 'fnc', 'dnc', 'ncg', 'gc', 'fan', 'fgc', 'din',
                       'xpi', 'hnc', 'h', 'i', 'ncp', 'min', 'gcd', 'rol', 'mpr', 'ply', 'out', 'eia', 'plt', 'sbp',
@@ -5592,7 +5594,7 @@ class App(QtCore.QObject):
 
         _filter_ = "Gerber Files (*.gbr *.ger *.gtl *.gbl *.gts *.gbs *.gtp *.gbp *.gto *.gbo *.gm1 *.gml *.gm3 *.gko " \
                    "*.cmp *.sol *.stc *.sts *.plc *.pls *.crc *.crs *.tsm *.bsm *.ly2 *.ly15 *.dim *.mil *.grb" \
-                   "*.top *.bot *.smt *.smb *.sst *.ssb *.spt *.spb *.pho *.gdo *.art *.gbd);;" \
+                   "*.top *.bot *.smt *.smb *.sst *.ssb *.spt *.spb *.pho *.gdo *.art *.gbd *.gb*);;" \
                    "Protel Files (*.gtl *.gbl *.gts *.gbs *.gto *.gbo *.gtp *.gbp *.gml *.gm1 *.gm3 *.gko);;" \
                    "Eagle Files (*.cmp *.sol *.stc *.sts *.plc *.pls *.crc *.crs *.tsm *.bsm *.ly2 *.ly15 *.dim *.mil);;" \
                    "OrCAD Files (*.top *.bot *.smt *.smb *.sst *.ssb *.spt *.spb);;" \

+ 4 - 0
README.md

@@ -9,6 +9,10 @@ CAD program, and create G-Code for Isolation routing.
 
 =================================================
 
+4.04.2019
+
+- added support for Gerber format specification D (no zero suppression) - PCBWizard Gerber files support
+
 3.04.2019
 
 - fixed plotting in Gerber Editor

+ 15 - 10
camlib.py

@@ -1951,9 +1951,9 @@ class Gerber (Geometry):
         #### Parser patterns ####
         # FS - Format Specification
         # The format of X and Y must be the same!
-        # L-omit leading zeros, T-omit trailing zeros
+        # L-omit leading zeros, T-omit trailing zeros, D-no zero supression
         # A-absolute notation, I-incremental notation
-        self.fmt_re = re.compile(r'%?FS([LT])([AI])X(\d)(\d)Y\d\d\*%?$')
+        self.fmt_re = re.compile(r'%?FS([LTD])([AI])X(\d)(\d)Y\d\d\*%?$')
         self.fmt_re_alt = re.compile(r'%FS([LT])([AI])X(\d)(\d)Y\d\d\*MO(IN|MM)\*%$')
         self.fmt_re_orcad = re.compile(r'(G\d+)*\**%FS([LT])([AI]).*X(\d)(\d)Y\d\d\*%$')
 
@@ -2289,8 +2289,8 @@ class Gerber (Geometry):
                     log.debug("Gerber format found. (%s) " % str(gline))
 
                     log.debug(
-                        "Gerber format found. Gerber zeros = %s (L-omit leading zeros, T-omit trailing zeros)" %
-                        self.gerber_zeros)
+                        "Gerber format found. Gerber zeros = %s (L-omit leading zeros, T-omit trailing zeros, "
+                        "D-no zero supression)" % self.gerber_zeros)
                     log.debug("Gerber format found. Coordinates type = %s (Absolute or Relative)" % absolute)
                     continue
 
@@ -2313,8 +2313,8 @@ class Gerber (Geometry):
                     self.frac_digits = int(match.group(4))
                     log.debug("Gerber format found. (%s) " % str(gline))
                     log.debug(
-                        "Gerber format found. Gerber zeros = %s (L-omit leading zeros, T-omit trailing zeros)" %
-                        self.gerber_zeros)
+                        "Gerber format found. Gerber zeros = %s (L-omit leading zeros, T-omit trailing zeros, "
+                        "D-no zero suppression)" % self.gerber_zeros)
                     log.debug("Gerber format found. Coordinates type = %s (Absolute or Relative)" % absolute)
 
                     gerber_units = match.group(1)
@@ -2337,8 +2337,8 @@ class Gerber (Geometry):
                         self.frac_digits = int(match.group(5))
                         log.debug("Gerber format found. (%s) " % str(gline))
                         log.debug(
-                            "Gerber format found. Gerber zeros = %s (L-omit leading zeros, T-omit trailing zeros)" %
-                            self.gerber_zeros)
+                            "Gerber format found. Gerber zeros = %s (L-omit leading zeros, T-omit trailing zeros, "
+                            "D-no zerosuppressionn)" % self.gerber_zeros)
                         log.debug("Gerber format found. Coordinates type = %s (Absolute or Relative)" % absolute)
 
                         gerber_units = match.group(1)
@@ -7175,17 +7175,22 @@ def parse_gerber_number(strnumber, int_digits, frac_digits, zeros):
     :param frac_digits: Number of digits used for the fractional
     part of the number
     :type frac_digits: int
-    :param zeros: If 'L', leading zeros are removed and trailing zeros are kept. If 'T', is in reverse.
+    :param zeros: If 'L', leading zeros are removed and trailing zeros are kept. Same situation for 'D' when
+    no zero suppression is done. If 'T', is in reverse.
     :type zeros: str
     :return: The number in floating point.
     :rtype: float
     """
-    if zeros == 'L':
+
+    ret_val = None
+
+    if zeros == 'L' or zeros == 'D':
         ret_val = int(strnumber) * (10 ** (-frac_digits))
 
     if zeros == 'T':
         int_val = int(strnumber)
         ret_val = (int_val * (10 ** ((int_digits + frac_digits) - len(strnumber)))) * (10 ** (-frac_digits))
+
     return ret_val
 
 

+ 8 - 6
flatcamGUI/FlatCAMGUI.py

@@ -2774,35 +2774,37 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
                 if self.filename == "":
                     self.app.inform.emit("Open cancelled.")
                 else:
-                    if self.filename.lower().rpartition('.')[-1] in self.app.grb_list:
+                    extension = self.filename.lower().rpartition('.')[-1]
+
+                    if extension in self.app.grb_list:
                         self.app.worker_task.emit({'fcn': self.app.open_gerber,
                                                    'params': [self.filename]})
                     else:
                         event.ignore()
 
-                    if self.filename.lower().rpartition('.')[-1] in self.app.exc_list:
+                    if extension in self.app.exc_list:
                         self.app.worker_task.emit({'fcn': self.app.open_excellon,
                                                    'params': [self.filename]})
                     else:
                         event.ignore()
 
-                    if self.filename.lower().rpartition('.')[-1] in self.app.gcode_list:
+                    if extension in self.app.gcode_list:
                         self.app.worker_task.emit({'fcn': self.app.open_gcode,
                                                    'params': [self.filename]})
                     else:
                         event.ignore()
 
-                    if self.filename.lower().rpartition('.')[-1] in self.app.svg_list:
+                    if extension in self.app.svg_list:
                         object_type = 'geometry'
                         self.app.worker_task.emit({'fcn': self.app.import_svg,
                                                    'params': [self.filename, object_type, None]})
 
-                    if self.filename.lower().rpartition('.')[-1] in self.app.dxf_list:
+                    if extension in self.app.dxf_list:
                         object_type = 'geometry'
                         self.app.worker_task.emit({'fcn': self.app.import_dxf,
                                                    'params': [self.filename, object_type, None]})
 
-                    if self.filename.lower().rpartition('.')[-1] in self.app.prj_list:
+                    if extension in self.app.prj_list:
                         # self.app.open_project() is not Thread Safe
                         self.app.open_project(self.filename)
                     else: