From 5f12ee84322731ce9b846a27852999ff219c75b5 Mon Sep 17 00:00:00 2001
From: Trygve Laugstøl <trygvis@inamo.no>
Date: Thu, 15 Aug 2019 13:56:51 +0200
Subject: kicad.dl: Always add fact-type/value for all components. Still adding
 the more specific values for known part types. bom: Use the correct URI for
 finding the value. Don't die if a part has both value and mpn, and they
 reference the same part.

---
 src/ee/bom.py           | 16 +++++++++++-----
 src/ee/part/__init__.py |  4 ++--
 src/ee/souffle/kicad.dl |  5 +++++
 3 files changed, 18 insertions(+), 7 deletions(-)

(limited to 'src')

diff --git a/src/ee/bom.py b/src/ee/bom.py
index e12260c..cf18955 100644
--- a/src/ee/bom.py
+++ b/src/ee/bom.py
@@ -25,7 +25,7 @@ class BomPart(object):
         self.part = part
         ref = self.part.get_only_schematic_reference()
         self.ref = ref.referenceProp if ref else None
-        self.hits = []
+        self.hits: List[Hit] = []
         self.selected_part: Optional[Part] = None
 
     def add_hit(self, part, method):
@@ -94,11 +94,14 @@ def create_bom(project: Project, schematic_path: Path, out_path: Path, part_dbs:
         sch_part_numbers = [pn.valueProp for pn in bom_part.part.get_mpns()]
         sch_supplier_part_numbers = [spn.valueProp for spn in bom_part.part.get_spns()]
 
-        value_fact = bom_part.part.find_fact(make_fact_key("value"))
+        value_fact = bom_part.part.find_fact(fact_keys.value)
         if value_fact:
             value_fact = value_fact.valueProp
 
         for supplier in suppliers:
+            if value_fact is not None:
+                pass
+
             # Part number search
             pns = supplier_pn_idx.get(supplier.uri)
             for sch_pn in sch_part_numbers:
@@ -126,9 +129,12 @@ def create_bom(project: Project, schematic_path: Path, out_path: Path, part_dbs:
         elif len(bom_part.hits) == 1:
             bom_part.selected_part = bom_part.hits[0].part
         else:
-            references = [hit.part.printable_reference for hit in bom_part.hits]
-            raise EeException("Multiple hits when looking for part: {}".
-                              format(bom_part.ref, ",".join(references)))
+            if len(set(hit.part.uri for hit in bom_part.hits)) == 1:
+                bom_part.selected_part = bom_part.hits[0].part
+            else:
+                references = [hit.part.printable_reference for hit in bom_part.hits]
+                raise StopToolException("Multiple hits when looking for part: {}".
+                                        format(bom_part.ref, ",".join(references)))
 
     bom_parts.add_index("uri", lambda bp: bp.selected_part.uri if bp.selected_part else None)
     bom_parts.add_multi_index("supplier,part", lambda op: (
diff --git a/src/ee/part/__init__.py b/src/ee/part/__init__.py
index deeab95..53835df 100644
--- a/src/ee/part/__init__.py
+++ b/src/ee/part/__init__.py
@@ -219,10 +219,10 @@ class Part(object):
 
     @property
     def printable_reference(self):
-        for refs, value in [(self.get_schematic_references(), lambda sr: sr.referenceProp),
+        for refs, value in ((self.get_schematic_references(), lambda sr: sr.referenceProp),
                             (self.get_part_references(), lambda pr: pr.part_uriProp),
                             (self.get_mpns(), lambda mpn: mpn.valueProp),
-                            (self.get_spns(), lambda spn: spn.valueProp)]:
+                            (self.get_spns(), lambda spn: spn.valueProp)):
             ref = next(iter(refs), None)
             if ref:
                 return value(ref)
diff --git a/src/ee/souffle/kicad.dl b/src/ee/souffle/kicad.dl
index 734811c..06633aa 100644
--- a/src/ee/souffle/kicad.dl
+++ b/src/ee/souffle/kicad.dl
@@ -169,3 +169,8 @@ mounting_hole(Part) :-
 
 add_fact(Part, "http://purl.org/ee/fact-type/ee-component-type", "http://purl.org/ee/part-type#mounting-hole") :-
     mounting_hole(Part).
+
+// Value
+
+add_fact(Part, "http://purl.org/ee/fact-type/value", value) :-
+    fact(Part, "http://purl.org/ee/kicad-sch-fact-type#value", value).
-- 
cgit v1.2.3