From 6cd194703674268b313918b590f2bc483c641efa Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Fri, 8 Dec 2017 20:52:02 +0100 Subject: o Parsing pads and stuff. --- src/ee/kicad/pcb/__init__.py | 60 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/ee/kicad/pcb/__init__.py b/src/ee/kicad/pcb/__init__.py index bfd352f..10350c3 100644 --- a/src/ee/kicad/pcb/__init__.py +++ b/src/ee/kicad/pcb/__init__.py @@ -25,6 +25,12 @@ class Module(object): for k, v in kwargs.items(): setattr(self, k, v) +@auto_str +class Pad(object): + def __init__(self, **kwargs): + for k, v in kwargs.items(): + setattr(self, k, v) + def parse(path): count = 0 p = sexpr.parse(path) @@ -71,7 +77,7 @@ def parse(path): return KicadPcb(**args) - def _parse_text(optional = False, rparen = False): + def _parse_text(optional = False, rparen = False, to = None): (event, token) = next(p) if not optional: assert event == sexpr.EVENT_TEXT @@ -83,7 +89,8 @@ def parse(path): if rparen: (event, token) = next(p) assert event == sexpr.EVENT_RPAREN - return text + + return to(text) if to else text def _parse_general(): args = {} @@ -92,9 +99,9 @@ def parse(path): while event == sexpr.EVENT_LPAREN: (event, token) = next(p) if token == "no_connects": - args[token] =_parse_text(rparen = True) + args[token] =_parse_text(to=int, rparen = True) elif token == "area": - args[token] = (_parse_text(), _parse_text(), _parse_text(), _parse_text(rparen = True)) + args[token] = (_parse_text(to=float), _parse_text(to=float), _parse_text(to=float), _parse_text(to=float, rparen = True)) elif token == "thickness": args[token] = _parse_text(rparen = True) else: @@ -103,25 +110,58 @@ def parse(path): return General(**args) def _parse_module(): - args = {} + pads = [] + args = {} args["footprint"] = _parse_text() + args["pads"] = pads (event, token) = next(p) + while event == sexpr.EVENT_TEXT: + (event, token) = next(p) + while event == sexpr.EVENT_LPAREN: (event, token) = next(p) if token == "layer": - args[token] = _parse_text(rparen = True) + args[token] = _parse_text(rparen = True) elif token == "at": - x = _parse_text() - y = _parse_text() - rot = _parse_text(optional = True, rparen = True) - args[token] = (x, y, rot or 0) + args[token] = _parse_at() + elif token == "pad": + pads.append(_parse_pad()) else: _consume() (event, token) = next(p) return Module(**args) + def _parse_pad(): + texts = [] + + args = {} + args["footprint"] = _parse_text() + + (event, token) = next(p) + while event == sexpr.EVENT_TEXT: + texts.append(token) + (event, token) = next(p) + + while event == sexpr.EVENT_LPAREN: + (event, token) = next(p) + if token == "at": + args[token] = _parse_at() + if token == "size": + args[token] = (_parse_text(to=float), _parse_text(to=float)) + else: + _consume() + + return Pad(**args) + + + def _parse_at(): + x = _parse_text(to=float) + y = _parse_text(to=float) + rot = _parse_text(to=float, optional = True, rparen = True) + return (x, y, rot or 0) + kicad_pcb = _parse_kicad_pcb() # (event, token) = next(p) # assert event == sexpr.EVENT_END -- cgit v1.2.3