diff options
Diffstat (limited to 'src/ee/kicad/bom')
-rw-r--r-- | src/ee/kicad/bom/__init__.py | 58 | ||||
-rw-r--r-- | src/ee/kicad/bom/io.py | 44 |
2 files changed, 102 insertions, 0 deletions
diff --git a/src/ee/kicad/bom/__init__.py b/src/ee/kicad/bom/__init__.py new file mode 100644 index 0000000..1808357 --- /dev/null +++ b/src/ee/kicad/bom/__init__.py @@ -0,0 +1,58 @@ +__all__ = [ + 'Part', + 'Library', + 'Bom', + 'Comp', +] + +class Part: + def __init__(self, name): + self.name = name + +class Library: + def __init__(self, name): + self.name = name + self.parts = {} + + def add_part(self, part): + try: + return self.parts[part] + except KeyError: + p = Part(part) + self.parts[part] = p + return p + +class Bom: + def __init__(self): + self.libraries = {} + self.components = {} + + def add_component(self, component): + self.components[component.ref] = component + + def get_component(self, name): + return self.components[name] + + def get_components(self): + return self.components + + def find_library(self, name): + try: + return self.libraries[name] + except KeyError: + lib = Library(name) + self.libraries[name] = lib + return lib + +class Comp: + def __init__(self, ref, value, library, part, footprint): + self.ref = ref + self.value = value + self.footprint = footprint + self.library = library + self.part = part + self.fields = {} + + def add_field(self, key, value): + self.fields[key] = value + diff --git a/src/ee/kicad/bom/io.py b/src/ee/kicad/bom/io.py new file mode 100644 index 0000000..c7eef44 --- /dev/null +++ b/src/ee/kicad/bom/io.py @@ -0,0 +1,44 @@ +import xml.etree.ElementTree as ElementTree +from ee.kicad.bom import * + +def read_bom(path): + def child_text(e, child_tag): + child = e.find(child_tag) + + return child.text if child is not None else None + + def add_comp(b, comp): + ref = comp.get("ref") + value = child_text(comp, "value") + footprint = child_text(comp, "footprint") + libsource = comp.find("libsource") + l, p = (None, None) + if libsource is not None: + lib = libsource.get("lib") + part = libsource.get("part") + if lib is not None and part is not None: + l = b.find_library(lib) + p = l.add_part(part) + + c = Comp(ref, value, l, p, footprint) + + fields = comp.find("fields") + if fields is not None: + for f in fields.findall("field"): + key = f.get("name") + value = f.text + c.add_field(key, value) + + b.add_component(c) + return c + + with open(path) as f: + tree = ElementTree.parse(path) + root = tree.getroot() + + b = Bom() + comp = root.find("components").findall("comp") + for c in comp: + add_comp(b, c) + + return b |