# # Example python script to generate a BOM from a KiCad generic netlist # # Example: Sorted and Grouped HTML BOM with advanced grouping # """ @package Output: HTML Grouped By: Value, Part, Footprint, Tolerance, Manufacturer, Voltage Sorted By: Ref Fields: Ref, Qnty, Value, Part, Footprint, Description, Vendor Command line: python "pathToFile/bom_with_advanced_grouping.py" "%I" "%O.html" """ from __future__ import print_function # Import the KiCad python helper module and the csv formatter import kicad_netlist_reader import sys # Start with a basic html template html = """ KiCad BOM Example 5

""" 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 more advanced equivalency operator we also compare the custom fields Voltage, Tolerance and Manufacturer as well as the assigned footprint. If these fields are not used in some parts they will simply be ignored (they will match as both will be empty strings). """ result = True if self.getValue() != other.getValue(): result = False elif self.getPartName() != other.getPartName(): result = False elif self.getFootprint() != other.getFootprint(): result = False elif self.getField("Tolerance") != other.getField("Tolerance"): result = False elif self.getField("Manufacturer") != other.getField("Manufacturer"): result = False elif self.getField("Voltage") != other.getField("Voltage"): 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 # Generate an instance of a generic netlist, and load the netlist tree from # .tmp. 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, file=sys.stderr) f = sys.stdout # Output a set of rows for a header providing general information html = html.replace('', net.getSource()) html = html.replace('', net.getDate()) html = html.replace('', net.getTool()) html = html.replace('', "Component Count:" + \ str(len(net.components))) row = "Ref" + "Qnty" row += "Value" + "Part" + "Footprint" row += "Description" + "Vendor" html = html.replace('', row + "") components = net.getInterestingComponents() # Get all of the components in groups of matching parts + values # (see kicad_netlist_reader.py) grouped = net.groupComponents(components) # Output all of the component information for group in grouped: 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 row = "\n " row += "" + refs +"" + str(len(group)) row += "" + c.getValue() + "" + c.getLibName() + ":" row += c.getPartName() + "" + c.getFootprint() + "" row += c.getDescription() + "" + c.getField("Vendor") row += "" html = html.replace('', row + "") # Print the formatted html to output file print(html, file=f)