You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							78 lines
						
					
					
						
							2.5 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							78 lines
						
					
					
						
							2.5 KiB
						
					
					
				| # | |
| # Example python script to generate a BOM from a KiCad generic netlist | |
| # | |
| # Example: Sorted and Grouped HTML BOM | |
| # | |
| 
 | |
| # Import the KiCad python helper module and the csv formatter | |
| import ky | |
| 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" /> | |
|     </head> | |
|     <body> | |
|     <h1><!--SOURCE--></h1> | |
|     <p><!--DATE--></p> | |
|     <p><!--TOOL--></p> | |
|     <p><!--COMPCOUNT--></p> | |
|     <table> | |
|     <!--TABLEROW--> | |
|     </table> | |
|     </body> | |
| </html> | |
|     """ | |
|   | |
| # 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 = ky.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: | |
|     print >> sys.stderr, __file__, ":", e | |
|     f = 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>Datasheet</th>" | |
| row += "<th>Description</th>" + "<th>Vendor</th></tr>" | |
|   | |
| html = html.replace('<!--TABLEROW-->', row + "<!--TABLEROW-->") | |
| 
 | |
| # Get all of the components in groups of matching parts + values (see ky.py) | |
| grouped = net.groupComponents() | |
| 
 | |
| # 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: | |
|         refs += component.getRef() + ", " | |
|         c = component | |
| 
 | |
|     row = "<tr><td>" + refs +"</td><td>" + str(len(group))  | |
|     row += "</td><td>" + c.getValue() + "</td><td>" + c.getLib() + "/"   | |
|     row += c.getPart() + "</td><td>" + c.getDatasheet() + "</td><td>"  | |
|     row += c.getDescription() + "</td><td>" + c.getField("Vendor")  | |
|     row += "</td></tr>" | |
|   | |
|     html = html.replace('<!--TABLEROW-->', row + "<!--TABLEROW-->") | |
| 
 | |
| # Print the formatted html to the file | |
| print >> f, html
 |