From 5056cabafca2cfa4ba1b7d64e0dcab8510f6551b Mon Sep 17 00:00:00 2001 From: "Pavel V. Shatov (Meister)" Date: Wed, 23 Sep 2020 16:21:57 +0300 Subject: KiCAD plugin to allow better BOM generation. --- helper/bom_csv_sorted_by_ref_extra.py | 65 +++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 helper/bom_csv_sorted_by_ref_extra.py 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")]) + -- cgit v1.2.3