From d8c8bb05d9a5c1ab759e8155d10dba3a64139714 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sun, 8 Jan 2017 00:23:24 +0100 Subject: Starting on a KiCAD ontology. o Supporting many version of a single project. --- trygvis/eda/cli/kicad_import_project.py | 92 +++++++++++++++++++++++---------- 1 file changed, 66 insertions(+), 26 deletions(-) (limited to 'trygvis/eda/cli/kicad_import_project.py') diff --git a/trygvis/eda/cli/kicad_import_project.py b/trygvis/eda/cli/kicad_import_project.py index 288b7fc..422f24a 100755 --- a/trygvis/eda/cli/kicad_import_project.py +++ b/trygvis/eda/cli/kicad_import_project.py @@ -1,10 +1,11 @@ import os.path from operator import attrgetter import itertools +from uuid import uuid4, UUID +import datetime import rdflib from rdflib import Literal, URIRef -from rdflib.namespace import RDF, RDFS # from ..kicad import rdf as kicad_rdf from . import * @@ -27,6 +28,9 @@ class KicadImportProjectCommand(CliCommand): def run(args): config = read_config() + version = None + timestamp = None # type: datetime.datetime + if args.input is "-": src = sys.stdin else: @@ -40,30 +44,49 @@ def run(args): raise CliException("No such file: %s. Did you export the BOM?" % filename) src = open(filename, 'r') + s = os.stat(filename) + timestamp = datetime.datetime.fromtimestamp(s.st_mtime) project_url = config['project']['url'] + if version is None: + if timestamp is None: + version = uuid4() + timestamp = datetime.datetime.now() + else: + from random import Random + r = Random(timestamp.year + timestamp.month + timestamp.day + timestamp.hour + timestamp.minute + + timestamp.second + timestamp.microsecond) + s = ["0123456789abcdef"[int(r.random() * 16)] for _ in range(0, 32)] + version = UUID(''.join(s)) + + info("Version: %s, timestamp=%s" % (version, timestamp)) + with src: - project = export_to_graph(src, project_url) + (version, project_g) = export_to_graph(src, project_url, version, timestamp) - debug('Loaded %s tuples' % len(project)) + debug('Loaded %s tuples' % len(project_g)) + + project_g.add((URIRef(project_url), RDF.type, kicad_rdf.KICAD['project'])) + project_g.add((URIRef(project_url), kicad_rdf.KICAD['version'], version)) if args.output_dir is not None: parent = args.output_dir if not os.path.exists(parent): os.mkdir(parent) - output_file = os.path.join(parent, "project.ttl") - with open(output_file, 'wb') as dst: - project.serialize(destination=dst, encoding='utf-8', format='turtle') + + v = timestamp.strftime("%Y-%m-%d %H:%M:%S") + output_file = os.path.join(parent, "project-%s.ttl" % v) + write_graph(lambda: project_g, filename=output_file, force_write=True) def import_project(g): - for idx, t in enumerate(project.triples((None, None, None))): + for idx, t in enumerate(project_g.triples((None, None, None))): g.add(t) with_database(import_project) -def export_to_graph(src: object, project_url: str) -> rdflib.Graph: +def export_to_graph(src: object, project_url: str, version: str, timestamp: datetime.datetime) -> (str, rdflib.Graph): export = Export.from_xml_file(src) # print('components:') @@ -135,8 +158,11 @@ def export_to_graph(src: object, project_url: str) -> rdflib.Graph: g = create_graph(kicad=True) - project = URIRef(project_url) - g.add((project, RDF.type, kicad_rdf.KICAD_TYPE.project)) + version_uri = URIRef('urn:uuid:%s#' % version) + g.add((version_uri, RDF.type, kicad_rdf.KICAD["project-version"])) + g.add((version_uri, RDFS.label, Literal('Version: %s' % timestamp.strftime("%Y-%m-%d %H:%M:%S")))) + g.add((version_uri, kicad_rdf.KICAD['version-of'], URIRef(project_url))) + g.add((version_uri, kicad_rdf.KICAD['timestamp'], Literal(timestamp))) # The components and fields could/should have been a BNodes. Their generated names are not very nice. # TODO: try using a hash of the current value and put that under a special generated namespace. @@ -145,29 +171,43 @@ def export_to_graph(src: object, project_url: str) -> rdflib.Graph: # add_prefix(hash) => 'https://trygvis.io/purl/kicad/generated#123456' footprints = set() for c in export.components: - ns = rdflib.Namespace(project_url) + ns = rdflib.Namespace(str(version_uri)) node = ns[c.ref] - g.add((project, kicad_rdf.KICAD.component, node)) + g.add((version_uri, kicad_rdf.KICAD['component'], node)) - g.add((node, RDF.type, kicad_rdf.KICAD_TYPE.schematic_component)) + g.add((node, RDF.type, kicad_rdf.KICAD['component'])) g.add((node, RDFS.label, Literal(c.ref))) - g.add((node, kicad_rdf.KICAD.value, Literal(c.value.text))) + g.add((node, kicad_rdf.KICAD['value'], Literal(c.value.text))) footprint_uri = URIRef(kicad_rdf.KICAD_FOOTPRINT[quote_plus(c.footprint)]) - if not footprint_uri in footprints: - g.add((footprint_uri, RDF.type, kicad_rdf.KICAD_TYPE.footprint)) + if footprint_uri not in footprints: + g.add((footprint_uri, RDF.type, kicad_rdf.KICAD['footprint'])) g.add((footprint_uri, RDFS.label, Literal(c.footprint))) footprints.add(footprint_uri) - g.add((node, kicad_rdf.KICAD.footprint, footprint_uri)) + g.add((node, kicad_rdf.KICAD['footprint'], footprint_uri)) for name, value in c.fields.items(): - f = ns['%s-%s' % (c.ref, name)] - g.add((node, kicad_rdf.KICAD.field, f)) - g.add((f, RDF.type, kicad_rdf.KICAD_TYPE.field)) - g.add((f, kicad_rdf.KICAD.field_name, Literal(name))) - g.add((f, kicad_rdf.KICAD.field_value, Literal(value))) - - # TODO: serialize the data from too - - return g + # f = ns['%s-%s' % (c.ref, name)] + f = kicad_rdf.gen_random('%s-%s' % (c.ref, name)) + g.add((node, kicad_rdf.KICAD['field'], f)) + g.add((f, RDF.type, kicad_rdf.KICAD['field'])) + g.add((f, kicad_rdf.KICAD['field-name'], Literal(name))) + g.add((f, kicad_rdf.KICAD['field-value'], Literal(value))) + + d = export.design + if d is not None: + g.add((version_uri, kicad_rdf.KICAD['design-date'], Literal(d.date))) + + for s in d.sheets: + sheet_uri = kicad_rdf.gen_random(s.number) + g.add((sheet_uri, RDF.type, kicad_rdf.KICAD['sheet'])) + label = s.title_block.title if s.title_block.title is not None and len(s.title_block.title) > 0 else s.name + g.add((sheet_uri, RDFS.label, Literal(label))) + g.add((sheet_uri, kicad_rdf.KICAD['sheet-name'], Literal(s.name))) + g.add((sheet_uri, kicad_rdf.KICAD['sheet-number'], Literal(int(s.number)))) + g.add((sheet_uri, kicad_rdf.KICAD['title'], Literal(s.title_block.title))) + g.add((sheet_uri, kicad_rdf.KICAD['rev'], Literal(s.title_block.rev))) + g.add((sheet_uri, kicad_rdf.KICAD['date'], Literal(s.title_block.date))) + + return version_uri, g -- cgit v1.2.3