kicad/eeschema/python_scripts/netlist_form_pads-pcb-asc.py

103 lines
2.3 KiB
Python

#
# Example python script to generate a BOM from a KiCad generic netlist
#
"""
@package
Output: PADS format netlist
Sorted By: Ref
Command line:
python "pathToFile/netlist_form_pads-pcb-asc.py" "%I" "%O.net"
"""
from __future__ import print_function
# Import the KiCad python helper module
import kicad_netlist_reader
import sys
# A helper function to convert a UTF8/Unicode/locale string read in netlist
# for python2 or python3 (Windows/unix)
def fromNetlistText( aText ):
if sys.platform.startswith('win32'):
try:
return aText.encode('utf-8').decode('cp1252')
except UnicodeDecodeError:
return aText
else:
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
netlist = kicad_netlist_reader.netlist(sys.argv[1])
# Open a file to write to, if the file cannot be opened output to stdout
# instead
canOpenFile = True
try:
f = open(sys.argv[2], 'wb')
except IOError:
e = "Can't open output file for writing: " + sys.argv[2]
print(__file__, ":", e, sys.stderr)
f = sys.stdout
canOpenFile = False
components = netlist.getInterestingComponents( excludeBoard=True )
row =""
''' Netlist header '''
row += "!PADS-POWERPCB-V2.0-MILS!" + '\n'
row += '*PART*' + '\n'
''' Generate list of component
for each component create lines like
C1 Capacitor_THT:CP_Axial_L18.0mm_D6.5mm_P25.00mm_Horizontal
C2 Capacitor_THT:CP_Axial_L18.0mm_D6.5mm_P25.00mm_Horizontal
'''
for c in components:
row += " " + c.getRef()
fp_name = c.getFootprint( False )
if fp_name != "":
row += " " + fp_name
row += '\n'
'''
generate for each net create lines like
*SIGNAL* /CLOCK-RB6
P2.27
P3.39
'''
nets = netlist.getNets()
row += '\n*NET*' + '\n'
for net in nets:
# count the number of pads in net. nets with only one pad are skipped
netitems = net.children
pad_count = 0
for node in netitems:
pad_count += 1
netitems = net.children
if pad_count > 1:
row += "*SIGNAL* " + net.get( "net", "name" ) + '\n'
for node in netitems:
row += node.get('node','ref') + '.' + node.get('node','pin') + '\n'
row += '*END*\n'
f.write(row.encode('utf-8'))
f.close()
if not canOpenFile:
sys.exit(1)