summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavel V. Shatov (Meister) <meisterpaul1@yandex.ru>2020-09-23 16:21:57 +0300
committerPavel V. Shatov (Meister) <meisterpaul1@yandex.ru>2020-09-23 16:21:57 +0300
commit5056cabafca2cfa4ba1b7d64e0dcab8510f6551b (patch)
tree38341e9adfaf405bf0a224d8a0a3579ed13f9896
parent3f22cf8915ba9a5a99be134d9696999f735f042a (diff)
KiCAD plugin to allow better BOM generation.
-rw-r--r--helper/bom_csv_sorted_by_ref_extra.py65
1 files changed, 65 insertions, 0 deletions
diff --git a/helper/bom_csv_sorted_by_ref_extra.py b/helper/bom_csv_sorted_by_ref_extra.py
new file mode 100644
index 0000000..09b5ad2
--- /dev/null
+++ b/helper/bom_csv_sorted_by_ref_extra.py
@@ -0,0 +1,65 @@
+#
+# Example python script to generate a BOM from a KiCad generic netlist
+#
+# Example: Ungrouped (One component per row) CSV output with extra fields
+#
+
+"""
+ @package
+ Generate a csv list file.
+ Components are sorted by ref
+ One component per line
+ Fields are (if exist)
+ Ref, value, Part, footprint, Datasheet, Manufacturer, Vendor, Tolerance, Voltage, Dielectric, Comment
+
+ Command line:
+ python "pathToFile/bom_csv_sorted_by_ref_extra.py" "%I" "%O.csv"
+"""
+
+from __future__ import print_function
+
+# Import the KiCad python helper module
+import kicad_netlist_reader
+import csv
+import sys
+
+# Generate an instance of a generic netlist, and load the netlist tree from
+# the command line option. If the file doesn't exist, execution will stop
+net = kicad_netlist_reader.netlist(sys.argv[1])
+
+# Open a file to write to, if the file cannot be opened output to stdout
+# instead (and check, that output path ends with .csv)
+try:
+ fout = sys.argv[2]
+ if not fout.endswith('.csv'): fout += '.csv'
+ f = open(fout, 'w')
+except IOError:
+ e = "Can't open output file for writing: " + fout
+ print( __file__, ":", e, sys.stderr )
+ f = sys.stdout
+
+# Create a new csv writer object to use as the output formatter
+out = csv.writer(f, lineterminator='\n', delimiter=',', quotechar="\"", quoting=csv.QUOTE_ALL)
+
+# override csv.writer's writerow() to support utf8 encoding:
+def writerow( acsvwriter, columns ):
+ utf8row = []
+ for col in columns:
+ utf8row.append( str(col) )
+ acsvwriter.writerow( utf8row )
+
+components = net.getInterestingComponents()
+
+# Output a field delimited header line
+writerow( out, ['Source:', net.getSource()] )
+writerow( out, ['Date:', net.getDate()] )
+writerow( out, ['Tool:', net.getTool()] )
+writerow( out, ['Component Count:', len(components)] )
+writerow( out, ['Ref', 'Value', 'Footprint', 'Datasheet', 'Manufacturer', 'Vendor', 'Tolerance', 'Voltage', 'Dielectric', 'Comment'] )
+
+# Output all of the component information (One component per row)
+for c in components:
+ writerow( out, [c.getRef(), c.getValue(), c.getFootprint(), c.getDatasheet(),
+ c.getField("Manufacturer"), c.getField("Vendor"), c.getField("Tolerance"),
+ c.getField("Voltage"), c.getField("Dielectric"), c.getField("Comment")])
+