aboutsummaryrefslogtreecommitdiff
path: root/trygvis/eda/cli/kicad_import_project.py
diff options
context:
space:
mode:
Diffstat (limited to 'trygvis/eda/cli/kicad_import_project.py')
-rwxr-xr-xtrygvis/eda/cli/kicad_import_project.py92
1 files changed, 66 insertions, 26 deletions
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 <design> 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