from typing import Iterable, Union
from xml.etree.ElementTree import Element
from ee.kicad.model import *
__all__ = ["to_bom", "to_bom_xml"]
def simple_element(parent, e, text):
if not text or len(text) == 0:
return
element = Element(e)
element.text = text
parent.append(element)
def field(f: ComponentField) -> Element:
field = Element("field", {"name": f.name})
field.text = f.value
return field
def comp(c: Component) -> Element:
comp = Element("comp", {"ref": c.ref})
simple_element(comp, "value", c.value)
simple_element(comp, "footprint", c.footprint)
#
#
# 561E4EAA
fields = Element("fields")
[fields.append(field(f)) for f in c.fields if f.index > 3]
if len(fields) > 0:
comp.append(fields)
return comp
def to_bom(schematic: Union[Schematic, Schematics], require_ref=True) -> Iterable[Component]:
bad_ref_types = ("#PWR", "#FLG")
cs = []
for c in sorted(schematic.components):
if require_ref and not c.has_ref_num:
continue
if c.ref_type in bad_ref_types:
continue
cs.append(c)
return cs
def to_bom_xml(schematic: Schematic) -> Element:
root = Element("export")
root.attrib["version"] = "D"
design = Element("design")
root.append(design)
components = Element("components")
root.append(components)
[components.append(comp(c)) for c in to_bom(schematic)]
return root