Created
March 27, 2023 20:05
-
-
Save saper-2/8054f64c5abd0eeb2b6aa58d6c18a8f4 to your computer and use it in GitHub Desktop.
KiCAD 6.0 BOM script that don't add comma in Ref (this is easier to convert from CSV to e.g. xlsx) and strip Library name from footprint
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# | |
# Example python script to generate a BOM from a KiCad generic netlist | |
# | |
# Example: Sorted and Grouped CSV BOM | |
# | |
""" | |
@package | |
Output: CSV (comma-separated) | |
Grouped By: Value, Footprint | |
Sorted By: Ref | |
Fields: Ref, QTY, Value, Cmp name, Footprint, Description, Vendor | |
Notes: | |
* Footprint is simplified - the Footprint library name is omitted, only kept is Footprint name. | |
* If there is multiple Ref with same Value & Footprint - those are separated with space | |
* Based on 'bom_csv_grouped_by_value_with_fp.py' | |
Command line: | |
python "pathToFile/bom_csv_grouped_by_value_with_simple_fp.py" "%I" "%O.csv" | |
""" | |
# Import the KiCad python helper module and the csv formatter | |
import kicad_netlist_reader | |
import kicad_utils | |
import csv | |
import sys | |
# A helper function to filter/convert a string read in netlist | |
#currently: do nothing | |
def fromNetlistText( aText ): | |
return aText | |
# 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 = kicad_utils.open_file_writeUTF8(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) | |
# Output a set of rows for a header providing general information | |
out.writerow(['Source:', net.getSource()]) | |
out.writerow(['Date:', net.getDate()]) | |
out.writerow(['Tool:', net.getTool()]) | |
out.writerow( ['Generator:', sys.argv[0]] ) | |
out.writerow(['Component Count:', len(net.components)]) | |
out.writerow(['Ref', 'QTY', 'Value', 'Cmp name', 'Footprint', 'Description', 'Vendor']) | |
# Get all of the components in groups of matching parts + values | |
# (see ky_generic_netlist_reader.py) | |
grouped = net.groupComponents() | |
# Output all of the component information | |
for group in grouped: | |
refs = "" | |
fp = "" | |
# Add the reference of every component in the group and keep a reference | |
# to the component so that the other data can be filled in once per group | |
for component in group: | |
refs += fromNetlistText( component.getRef() ) + " " | |
c = component | |
# get footprint, and strip from it Library name (if possible) | |
fp = c.getFootprint() | |
if (":" in fp): | |
fp_ar = fp.split(":",2) | |
if (len(fp_ar) > 1): | |
fp = fp_ar[1] | |
# Fill in the component groups common data | |
out.writerow([refs, len(group), | |
fromNetlistText( c.getValue() ), | |
fromNetlistText( c.getPartName() ), | |
fromNetlistText( fp ), | |
fromNetlistText( c.getDescription() ), | |
fromNetlistText( c.getField("Vendor") )]) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment