]> git.gag.com Git - hw/altusmetrum/commitdiff
Sort tab-separated output files by refdes as primary key
authorKeith Packard <keithp@keithp.com>
Wed, 12 Feb 2025 06:46:47 +0000 (22:46 -0800)
committerKeith Packard <keithp@keithp.com>
Wed, 12 Feb 2025 06:46:47 +0000 (22:46 -0800)
Signed-off-by: Keith Packard <keithp@keithp.com>
bin/parts.py

index 84d83c1920145ffda72bb89de4524e5963ac87fe..5d3ce8c134dc86e4373dd88a3f930b6b1cfff52a 100644 (file)
@@ -40,6 +40,7 @@ pref_order_tab = ('refdes', 'device', 'value', 'footprint', 'loadstatus', 'provi
               'mfg_part_number', 'vendor', 'vendor_part_number', 'quantity')
 
 value_pattern=r'([0-9]+)(\.[0-9]*)?([kmMupng]?)(F|H|Hz|V|screws)?([ _][0-9]+(\.[0-9]*))?'
+refdes_pattern=r'([a-zA-Z]+)([0-9]+)'
 
 class Part():
     """
@@ -239,8 +240,8 @@ class Parts():
                 t = t + (i,)
         return t
         
-    # Compute a key value suitable for sorting
-    def cmp_key(self, k):
+    # Compute a key value suitable for sorting CSV output files
+    def cmp_csv_key(self, k):
         value = k[1]
         m = re.fullmatch(value_pattern, value, flags=re.IGNORECASE)
         if m:
@@ -266,12 +267,52 @@ class Parts():
             n = 0
         return (k[0], value, n, k[2])
 
+    # Compute a key value suitable for sorting tab output files
+    def cmp_tab_key(self, k):
+        part = self.get(k)
+        refdes = 'unknown'
+        if part is not None:
+            refdes = part.get_unknown('refdes')
+
+        mr = re.fullmatch(refdes_pattern, refdes)
+        if mr:
+            category = mr.group(1)
+            r = int(mr.group(2))
+        else:
+            category = "~"
+            r = refdes
+
+        value = k[1]
+        m = re.fullmatch(value_pattern, value, flags=re.IGNORECASE)
+        if m:
+            number = m.group(1)
+            if m.group(2):
+                number += m.group(2)
+            n = float(number)
+            scale = m.group(3)
+            if scale == 'G':
+                n *= 1000000000
+            elif scale == 'M':
+                n *= 1000000
+            elif scale == 'k':
+                n *= 1000
+            elif scale == 'm':
+                n /= 1000
+            elif scale == 'u' or scale == 'ยต':
+                n /= 1000000
+            elif scale == 'p':
+                n /= 1000000000
+            value = ""
+        else:
+            n = 0
+        return (category, r, k[0], value, n, k[2])
+
     # Export to a CSV file object
     def export_csv_file(self, outfile):
         csvwriter = csv.writer(outfile, dialect='excel-nl')
         attrs = self.attrs_tuple(pref_order_csv)
         csvwriter.writerow(attrs)
-        keys = sorted(list(self.parts), key=self.cmp_key)
+        keys = sorted(list(self.parts), key=self.cmp_csv_key)
         for key in keys:
             part = self.get(key)
             csvwriter.writerow(tuple(map(part.get_unknown, attrs)))
@@ -285,7 +326,7 @@ class Parts():
     def export_tab_file(self, outfile):
         attrs = self.attrs_tuple(pref_order_tab)
         print("\t".join(attrs), file=outfile)
-        keys = sorted(list(self.parts), key=self.cmp_key)
+        keys = sorted(list(self.parts), key=self.cmp_tab_key)
         for key in keys:
             part = self.get(key)
             print("\t".join(tuple(map(part.get_unknown, attrs))), file=outfile)