diff options
-rw-r--r-- | gerber/gerber_statements.py | 31 | ||||
-rw-r--r-- | gerber/rs274x.py | 32 |
2 files changed, 57 insertions, 6 deletions
diff --git a/gerber/gerber_statements.py b/gerber/gerber_statements.py index b56be0a..27066cd 100644 --- a/gerber/gerber_statements.py +++ b/gerber/gerber_statements.py @@ -760,6 +760,37 @@ class LNParamStmt(ParamStmt): return '<Level Name: %s>' % self.name +class DeprecatedStmt(Statement): + """ Unimportant deprecated statement, will be parsed but not emitted. + """ + @classmethod + def from_gerber(cls, line): + return cls(line) + + def __init__(self, line): + """ Initialize DeprecatedStmt class + + Parameters + ---------- + line : string + Deprecated statement text + + Returns + ------- + DeprecatedStmt + Initialized DeprecatedStmt class. + + """ + Statement.__init__(self, "DEPRECATED") + self.line = line + + def to_gerber(self, settings=None): + return '' + + def __str__(self): + return '<Deprecated Statement: \'%s\'>' % self.line + + class CoordStmt(Statement): """ Coordinate Data Block """ diff --git a/gerber/rs274x.py b/gerber/rs274x.py index 07fce17..fbedc77 100644 --- a/gerber/rs274x.py +++ b/gerber/rs274x.py @@ -160,23 +160,28 @@ class GerberParser(object): OF = r"(?P<param>OF)(A(?P<a>{decimal}))?(B(?P<b>{decimal}))?".format(decimal=DECIMAL) SF = r"(?P<param>SF)(?P<discarded>.*)" LN = r"(?P<param>LN)(?P<name>.*)" + DEPRECATED_UNIT = re.compile(r'(?P<mode>G7[01])\*') + DEPRECATED_FORMAT = re.compile(r'(?P<format>G9[01])\*') # end deprecated PARAMS = (FS, MO, LP, AD_CIRCLE, AD_RECT, AD_OBROUND, AD_POLY, AD_MACRO, AM, AS, IN, IP, IR, MI, OF, SF, LN) + PARAM_STMT = [re.compile(r"%?{0}\*%?".format(p)) for p in PARAMS] + COORD_FUNCTION = r"G0?[123]" + COORD_OP = r"D0?[123]" + COORD_STMT = re.compile(( r"(?P<function>{function})?" r"(X(?P<x>{number}))?(Y(?P<y>{number}))?" r"(I(?P<i>{number}))?(J(?P<j>{number}))?" - r"(?P<op>{op})?\*".format(number=NUMBER, function=FUNCTION, op=COORD_OP))) - - APERTURE_STMT = re.compile(r"(?P<deprecated>(G54)|G55)?D(?P<d>\d+)\*") + r"(?P<op>{op})?\*".format(number=NUMBER, function=COORD_FUNCTION, op=COORD_OP))) + APERTURE_STMT = re.compile(r"(?P<deprecated>(G54)|(G55))?D(?P<d>\d+)\*") - COMMENT_STMT = re.compile(r"G04(?P<comment>[^*]*)(\*)?") + COMMENT_STMT = re.compile(r"G0?4(?P<comment>[^*]*)(\*)?") - EOF_STMT = re.compile(r"(?P<eof>M02)\*") + EOF_STMT = re.compile(r"(?P<eof>M[0]?[012])\*") REGION_MODE_STMT = re.compile(r'(?P<mode>G3[67])\*') QUAD_MODE_STMT = re.compile(r'(?P<mode>G7[45])\*') @@ -330,6 +335,21 @@ class GerberParser(object): line = r continue + # deprecated codes (parsed but ignored) + (deprecated_unit, r) = _match_one(self.DEPRECATED_UNIT, line) + if deprecated_unit: + yield DeprecatedStmt.from_gerber(line) + line = r + did_something = True + continue + + (deprecated_format, r) = _match_one(self.DEPRECATED_FORMAT, line) + if deprecated_format: + yield DeprecatedStmt.from_gerber(line) + line = r + did_something = True + continue + # eof (eof, r) = _match_one(self.EOF_STMT, line) if eof: @@ -370,7 +390,7 @@ class GerberParser(object): elif isinstance(stmt, (RegionModeStmt, QuadrantModeStmt)): self._evaluate_mode(stmt) - elif isinstance(stmt, (CommentStmt, UnknownStmt, EofStmt)): + elif isinstance(stmt, (CommentStmt, UnknownStmt, DeprecatedStmt, EofStmt)): return else: |