kicad/scripts/KiBoM/bomlib/csv_writer.py
2020-02-04 17:33:02 -07:00

93 lines
2.6 KiB
Python

# _*_ coding:latin-1 _*_
import csv
import os
import sys
def WriteCSV(filename, groups, net, headings, prefs):
"""
Write BoM out to a CSV file
filename = path to output file (must be a .csv, .txt or .tsv file)
groups = [list of ComponentGroup groups]
net = netlist object
headings = [list of headings to display in the BoM file]
prefs = BomPref object
"""
filename = os.path.abspath(filename)
# Delimeter is assumed from file extension
# Override delimiter if separator specified
if prefs.separatorCSV is not None:
delimiter = prefs.separatorCSV
else:
if filename.endswith(".csv"):
delimiter = ","
elif filename.endswith(".tsv") or filename.endswith(".txt"):
delimiter = "\t"
else:
return False
nGroups = len(groups)
nTotal = sum([g.getCount() for g in groups])
nFitted = sum([g.getCount() for g in groups if g.isFitted()])
nBuild = nFitted * prefs.boards
if (sys.version_info[0] >= 3):
f = open(filename, "w", encoding='utf-8')
else:
f = open(filename, "w")
writer = csv.writer(f, delimiter=delimiter, lineterminator="\n")
if not prefs.hideHeaders:
if prefs.numberRows:
writer.writerow(["Component"] + headings)
else:
writer.writerow(headings)
count = 0
rowCount = 1
for group in groups:
if prefs.ignoreDNF and not group.isFitted():
continue
row = group.getRow(headings)
if prefs.numberRows:
row = [str(rowCount)] + row
# Deal with unicode characters
# Row = [el.decode('latin-1') for el in row]
writer.writerow(row)
try:
count += group.getCount()
except:
pass
rowCount += 1
if not prefs.hidePcbInfo:
# Add some blank rows
for i in range(5):
writer.writerow([])
writer.writerow(["Component Groups:", nGroups])
writer.writerow(["Component Count:", nTotal])
writer.writerow(["Fitted Components:", nFitted])
writer.writerow(["Number of PCBs:", prefs.boards])
writer.writerow(["Total components:", nBuild])
writer.writerow(["Schematic Version:", net.getVersion()])
writer.writerow(["Schematic Date:", net.getSheetDate()])
writer.writerow(["PCB Variant:", ' + '.join(prefs.pcbConfig)])
writer.writerow(["BoM Date:", net.getDate()])
writer.writerow(["Schematic Source:", net.getSource()])
writer.writerow(["KiCad Version:", net.getTool()])
f.close()
return True