diff options
Diffstat (limited to 'trygvis/eda/cli/make_bom.py')
-rwxr-xr-x | trygvis/eda/cli/make_bom.py | 120 |
1 files changed, 102 insertions, 18 deletions
diff --git a/trygvis/eda/cli/make_bom.py b/trygvis/eda/cli/make_bom.py index 28059cb..39d664b 100755 --- a/trygvis/eda/cli/make_bom.py +++ b/trygvis/eda/cli/make_bom.py @@ -1,21 +1,105 @@ from trygvis.eda import cli -from trygvis.eda.digikey import * -from trygvis.eda.digikey import rdf as digikey_rdf -from trygvis.eda.kicad import rdf as kicad_rdf - -initNs = { - "rdf": RDF, - "rdfs": RDFS, - "dk": digikey_rdf.DIGIKEY, - "dk-attr-type": digikey_rdf.DIGIKEY_ATTRIBUTE_TYPE, - "dk-attr-value": digikey_rdf.DIGIKEY_ATTRIBUTE_VALUE, - "dk-part": digikey_rdf.DIGIKEY_PART, - "dk-p-c": digikey_rdf.DIGIKEY_PRODUCT_CATEGORY, - "kicad": kicad_rdf.KICAD, - "kicad-type": kicad_rdf.KICAD_TYPE} - - -def run(schematic_url, db_path, args): +import rdflib + + +class DigiKeyPart(object): + def __init__(self, part_number): + self.part_number = part_number + self.attributes = {} + + def set_attribute(self, key, value): + self.attributes[key] = value + + +class Component(object): + def __init__(self, ref, value): + self.ref = ref + self.value = value + self.fields = {} + + def set_field(self, field_name, field_value): + self.fields[field_name] = field_value + + +def run(schematic_url, db_path): g = cli.open_database(db_path) - cli.info('implement..') + components = {} + dkParts = {} + + cli.info("Loading components") + + res = cli.sparql(g, """ +SELECT + ?ref ?value +WHERE { + ?schematic a kicad-type:schematic ; + kicad:component ?cmp . + ?cmp a kicad-type:schematic_component ; + kicad:value ?value ; + rdfs:label ?ref . +} +ORDER BY ?ref +""", init_bindings={"schematic": rdflib.URIRef(schematic_url)}) + + for row in res: + c = Component(row.ref, row.value) + components[row.ref] = c + cli.info('ref=%s, value=%s' % (c.ref, c.value)) + + cli.info("Loading custom component attributes") + res = cli.sparql(g, """ +SELECT + ?ref ?field ?field_name ?field_value +WHERE { + ?schematic a kicad-type:schematic ; + kicad:component ?cmp . + ?cmp a kicad-type:schematic_component ; + rdfs:label ?ref ; + kicad:field ?field . + ?field a kicad-type:field ; kicad:field_name ?field_name . + ?field a kicad-type:field ; kicad:field_value ?field_value . +} +ORDER BY ?ref ?field_name +""", init_bindings={"schematic": rdflib.URIRef(schematic_url)}) + + for row in res: + c = components[row.ref] + assert isinstance(c, Component) + c.set_field(row.field_name, row.field_value) + cli.info('%5s: %-20s %s' % (c.ref, row.field_name + ':', row.field_value)) + + cli.info("Loading Digi-Key parts for schematic") + res = cli.sparql(g, """ +SELECT +?ref ?part_number ?type ?value +WHERE { + ?schematic kicad:component ?cmp . + ?cmp a kicad-type:schematic_component ; + rdfs:label ?ref ; + kicad:field ?d . + ?d kicad:field_name "digikey" ; + kicad:field_value ?part_number . + ?part a dk:part ; + rdfs:label ?label ; + dk:partNumber ?part_number ; + dk:attribute-value ?attr_value . + ?attr_value rdfs:label ?value . + ?attr_type a dk:attributeType ; + rdfs:label ?type ; + dk:value ?attr_value . +} +ORDER BY ?ref ?attr_type ?attr_value +""", init_bindings={"schematic": rdflib.URIRef(schematic_url)}) + + for row in res: + pn = row.part_number + + if not hasattr(dkParts, pn): + part = DigiKeyPart(pn) + dkParts[pn] = part + else: + part = dkParts[pn] + + part.set_attribute(row.type, row.value) + cli.info('%5s: %-20s %s' % (pn, row.type + ':', row.value)) |