import argparse import rdflib import rdflib.term from trygvis.eda import cli from trygvis.eda.digikey import * class DigikeyDownloadForProjectCommand(cli.CliCommand): def __init__(self): super().__init__("digikey-download-for-project", "Download missing data from digikey.com") def run(self, argv): p = argparse.ArgumentParser(prog=self.key, description=self.description) p.add_argument("--project", required=False) p.add_argument("-f", "--force", default=False, action='store_true') args = p.parse_args(argv) run(args) def work(project_url, force, g): client = DigikeyClient() db = DigikeyDatabase() download_category_tree(db, client) res = cli.sparql(g, "SELECT ?project WHERE {?project a kicad:project}") print("Found %d projects in database" % len(res)) for row in res: print("project: %s" % row.project) res = cli.sparql(g, "SELECT ?dk_part ?dk_part_number WHERE {?dk_part a dk:part ; dk:partNumber ?dk_part_number}") print("Found %d Digikey parts in database" % len(res)) for row in res: print("Part: url=%s, partNumber=%s" % (row.dk_part, row.dk_part_number)) res = cli.sparql(g, """ SELECT ?digikey_pn (group_concat(distinct ?ref;separator=";") as ?refs) WHERE { ?project_url kicad:component ?cmp . ?cmp rdfs:label ?ref ; kicad:value ?value . OPTIONAL { ?cmp kicad:field ?d . ?d kicad:field_name "digikey" ; kicad:field_value ?digikey_pn . OPTIONAL { ?dk_part a dk:part ; dk:partNumber ?digikey_pn . } } } GROUP BY ?digikey_pn ORDER BY ?digikey_pn """, init_bindings={'project_url': rdflib.term.URIRef(project_url)}) size = len(res) if size == 0: cli.info('Could not find an parts for the project, did you use the correct URL: %s?' % project_url) for row in res: pn = row.digikey_pn if pn is None: continue refs = row.refs.split(';') cli.info("Part \"%s\" is used by %s" % (pn, refs)) filename = 'ttl/digikey-part-' + normalize_filename(pn + ".ttl") def download_graph(): cli.info("Downloading product: " + pn) product = download_product(client, db, pn) g = cli.create_graph(digikey=True) [g.add(node) for node in product.to_nodes()] return g cli.write_graph(download_graph, filename, force_write=force) def run(args): config = cli.read_config() project_url = config['project']['url'] cli.info("Project: %s" % project_url) cli.with_database(lambda g: work(project_url, args.force, g))