summaryrefslogtreecommitdiff
path: root/eeschema/plugins/python_scripts/bom_html_with_advanced_grouping.py
diff options
context:
space:
mode:
Diffstat (limited to 'eeschema/plugins/python_scripts/bom_html_with_advanced_grouping.py')
-rw-r--r--eeschema/plugins/python_scripts/bom_html_with_advanced_grouping.py132
1 files changed, 132 insertions, 0 deletions
diff --git a/eeschema/plugins/python_scripts/bom_html_with_advanced_grouping.py b/eeschema/plugins/python_scripts/bom_html_with_advanced_grouping.py
new file mode 100644
index 0000000..a091351
--- /dev/null
+++ b/eeschema/plugins/python_scripts/bom_html_with_advanced_grouping.py
@@ -0,0 +1,132 @@
+#
+# Example python script to generate a BOM from a KiCad generic netlist
+#
+# Example: Sorted and Grouped HTML BOM with advanced grouping
+#
+
+"""
+ @package
+ Generate a HTML BOM list.
+ Components are sorted and grouped by value
+ Fields are (if exist)
+ Ref, Quantity, 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 = """
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <title>KiCad BOM Example 5</title>
+ </head>
+ <body>
+ <h1><!--SOURCE--></h1>
+ <p><!--DATE--></p>
+ <p><!--TOOL--></p>
+ <p><!--COMPCOUNT--></p>
+ <table>
+ <!--TABLEROW-->
+ </table>
+ </body>
+</html>
+ """
+
+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
+# <file>.tmp. If the file doesn't exist, execution will stop
+net = kicad_netlist_reader.netlist(sys.argv[1])
+
+# Open a file to write too, 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('<!--SOURCE-->', net.getSource())
+html = html.replace('<!--DATE-->', net.getDate())
+html = html.replace('<!--TOOL-->', net.getTool())
+html = html.replace('<!--COMPCOUNT-->', "<b>Component Count:</b>" + \
+ str(len(net.components)))
+
+row = "<tr><th style='width:640px'>Ref</th>" + "<th>Qnty</th>"
+row += "<th>Value</th>" + "<th>Part</th>" + "<th>Footprint</th>"
+row += "<th>Description</th>" + "<th>Vendor</th></tr>"
+
+html = html.replace('<!--TABLEROW-->', row + "<!--TABLEROW-->")
+
+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 += "<tr><td>" + refs +"</td><td>" + str(len(group))
+ row += "</td><td>" + c.getValue() + "</td><td>" + c.getLibName() + ":"
+ row += c.getPartName() + "</td><td>" + c.getFootprint() + "</td><td>"
+ row += c.getDescription() + "</td><td>" + c.getField("Vendor")
+ row += "</td></tr>"
+
+ html = html.replace('<!--TABLEROW-->', row + "<!--TABLEROW-->")
+
+# Print the formatted html to output file
+print(html, file=f)