From c623b8d63c327bb07b4f601367e08dfb6232d37f Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Thu, 4 Apr 2019 16:21:26 +0300 Subject: [PATCH] - added support for Gerber format specification D (no zero suppression) - PCBWizard Gerber files support --- FlatCAMApp.py | 10 ++++++---- README.md | 4 ++++ camlib.py | 25 +++++++++++++++---------- flatcamGUI/FlatCAMGUI.py | 14 ++++++++------ 4 files changed, 33 insertions(+), 20 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 3ded1418..31d68711 100644 --- a/FlatCAMApp.py +++ b/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);;" \ diff --git a/README.md b/README.md index 15b0da2e..912bfcfb 100644 --- a/README.md +++ b/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 diff --git a/camlib.py b/camlib.py index 0d3eef78..79285bf5 100644 --- a/camlib.py +++ b/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 diff --git a/flatcamGUI/FlatCAMGUI.py b/flatcamGUI/FlatCAMGUI.py index 9b86769a..347afe3e 100644 --- a/flatcamGUI/FlatCAMGUI.py +++ b/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: