-
Notifications
You must be signed in to change notification settings - Fork 0
/
bom_csv_sorted_by_ref.py
74 lines (59 loc) · 2.27 KB
/
bom_csv_sorted_by_ref.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#
# Example python script to generate a BOM from a KiCad generic netlist
#
# Example: Ungrouped (One component per row) CSV output
#
"""
@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
Additional fields can be added by specifying their name as last command line argument.
Command line:
python "pathToFile/bom_csv_sorted_by_ref.py" "%I" "%O.csv" [additional fields]
"""
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
try:
f = open(sys.argv[2], 'w')
except IOError:
e = "Can't open output file for writing: " + sys.argv[2]
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()
columns = ['Ref', 'Value', 'Footprint', 'Datasheet', 'Manufacturer', 'Vendor']
# Add additional header columns
for x in range(3, len(sys.argv)):
columns.append(sys.argv[x])
# 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, columns )
# Output all of the component information (One component per row)
for c in components:
values = [c.getRef(), c.getValue(), c.getFootprint(), c.getDatasheet(),
c.getField("Manufacturer"), c.getField("Vendor")]
# Add additional fields
for x in range(3, len(sys.argv)):
values.append(c.getField(sys.argv[x]))
writerow( out, values )