Files

  • Not Found
  • Invalid object requested. SHA must identify a commit or a tree.
Last update 1 month 3 weeks by Khai Sam
Filesscripts
..
bom_star_by_pn.py
bom_star_by_pn.py
# # Example python script to generate a BOM from a KiCad generic netlist # # Example: Sorted and Grouped CSV BOM # """ @package Generate a csv BOM list. Components are sorted by digikey part number Fields are (if exist) Qty, DIGIKEY, Customer Reference, Reference(s) Command line: python "pathToFile/bom_csv_grouped_by_value.py" "%I" "%O.csv" """ from __future__ import print_function # Import the KiCad python helper module and the csv formatter import kicad_netlist_reader import csv import sys import os def myEqu(self, other): """myEqu is a more advanced equivalence function for components which is used by component grouping. Normal operation is to group components based on their value and footprint. In this example of a custom equivalency operator we compare the value, the part name and the footprint. """ result = True if self.getField("DIGIKEY") != other.getField("DIGIKEY"): result = False return result # Override the component equivalence operator - it is important to do this # before loading the netlist, otherwise all components will have the original # equivalency operator. kicad_netlist_reader.comp.__eq__ = myEqu if len(sys.argv) != 3 and len(sys.argv) != 4: print("Usage ", __file__, "<generic_netlist.xml> <output.csv> [QTY Multiplier]", file=sys.stderr) sys.exit(1) qtymult = 1 if len(sys.argv) == 4: qtymult = int(sys.argv[3]) # 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 # subset the components to those wanted in the BOM, controlled # by <configure> block in kicad_netlist_reader.py components = net.getInterestingComponents() compfields = net.gatherComponentFieldUnion(components) partfields = net.gatherLibPartFieldUnion() # remove Reference, Value, Datasheet, and Footprint, they will come from 'columns' below partfields -= set( ['Reference', 'Value', 'Datasheet', 'Footprint'] ) columnset = compfields | partfields # union # prepend an initial 'hard coded' list and put the enchillada into list 'columns' columns = ['Item', 'Qty', 'Reference(s)', 'Value', 'LibPart', 'Footprint', 'Datasheet'] + sorted(list(columnset)) # Create a new csv writer object to use as the output formatter out = csv.writer(f, lineterminator='\n', delimiter=',') # override csv.writer's writerow() to support encoding conversion (initial encoding is utf8): def writerow( acsvwriter, columns ): utf8row = [] for col in columns: utf8row.append( str(col) ) # currently, no change acsvwriter.writerow( utf8row ) # Get all of the components with matching part numbers # (see kicad_netlist_reader.py) grouped = net.groupComponents(components) name = os.path.splitext(os.path.basename(sys.argv[1]))[0] row = [] # Output component information organized by group, aka as collated: for group in grouped: del row[:] refs = "" # 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: if len(refs) > 0: refs += ":" refs += component.getRef() c = component if c.getField("DIGIKEY") == "": print("The following components do not have DIGIKEY PNs:") for component in group: print("\t", component.getRef()) else: row.append( len(group)*qtymult ) row.append( c.getField("DIGIKEY") ) row.append( name ) row.append( refs ) writerow( out, row ) f.close()

Annotations

BMP388_I2C / BMP388_I2C.sch
f7632e0b
0/2 comments
BNO055 / BNO055.sch
f7632e0b
0/2 comments
CAS_bus / CAS_bus.sch
291108ab
0/1 comments
Report a bug