mirror of
https://github.com/whowechina/popn_pico.git
synced 2025-03-03 16:43:49 +01:00
145 lines
4.4 KiB
Python
145 lines
4.4 KiB
Python
"""
|
|
build_lib_switch.py
|
|
Copyright 2015 Adam Greig
|
|
Licensed under the MIT licence, see LICENSE file for details.
|
|
|
|
Generate switch.lib, generic nPmT switch symbols.
|
|
"""
|
|
|
|
from __future__ import print_function, division
|
|
import sys
|
|
import os.path
|
|
|
|
|
|
def switch(n, m):
|
|
"""
|
|
Generates a generic switch symbol for an nPsT sort of switch.
|
|
Probably won't generate a useful pin numbering when T>2.
|
|
"""
|
|
out = []
|
|
|
|
# Convert to stupid letters for 1 and 2
|
|
name_letters = {1: "S", 2: "D"}
|
|
name_n = name_letters[n] if n in name_letters else str(n)
|
|
name_m = name_letters[m] if m in name_letters else str(m)
|
|
|
|
# Number of pins on the right is n*m, plus one per pole for spacing,
|
|
# minus the final spacing (n starts at 1), rounded up to nearest odd
|
|
# number so that half the height is on the 100mil grid.
|
|
n_pins_right = n * m + n - 1
|
|
if n_pins_right % 2 == 0:
|
|
n_pins_right += 1
|
|
height = 100 * (n_pins_right - 1)
|
|
hheight = height // 2
|
|
|
|
# Ref goes at the top, 100 above the top pin, unless only one throw
|
|
# in which case we also need to clear the switch graphic
|
|
refheight = hheight + 100
|
|
if m == 1:
|
|
refheight += 50
|
|
|
|
# Value/name goes below, unless m is even, in which case the bottom spacer
|
|
# isn't there so needs to be ignored
|
|
valheight = -(hheight + 100)
|
|
if n % 2 == 1 and m % 2 == 0:
|
|
valheight += 100
|
|
|
|
# Output component header
|
|
name = "SWITCH_{}P{}T".format(name_n, name_m)
|
|
out.append("#\n# {}\n#".format(name))
|
|
out.append('DEF {} SW 0 1 Y N 1 F N'.format(name))
|
|
out.append('F0 "SW" 0 {} 50 H V C CNN'.format(refheight))
|
|
out.append('F1 "{}" 0 {} 50 H V C CNN'.format(name, valheight))
|
|
out.append('F2 "" 0 0 50 H I C CNN')
|
|
out.append('F3 "" 0 0 50 H I C CNN')
|
|
out.append('DRAW')
|
|
|
|
# Output drawing
|
|
pole_top = hheight
|
|
for pole in range(n):
|
|
# Draw pole
|
|
pole_num = pole*(m+1) + 2
|
|
pole_y = pole_top - (100 * (m - 1))//2
|
|
if m % 2 == 0:
|
|
pole_y -= 50
|
|
out.append('X "~" {} -100 {} 40 R 50 50 1 1 P'
|
|
.format(pole_num, pole_y))
|
|
out.append('C -50 {} 10 1 1 0 N'.format(pole_y))
|
|
out.append('P 2 1 1 0 -50 {} 50 {} N'
|
|
.format(pole_y + 10, pole_y + 90))
|
|
|
|
for throw in range(m):
|
|
# Draw throws
|
|
throw_num = pole_num + throw - 1
|
|
throw_y = pole_top - 100 * throw
|
|
if throw > 0:
|
|
throw_num += 1
|
|
out.append('X "~" {} 100 {} 40 L 50 50 1 1 P'
|
|
.format(throw_num, throw_y))
|
|
out.append('C 50 {} 10 1 1 0 N'.format(throw_y))
|
|
|
|
# Move down for next pole
|
|
pole_top -= 100 * (m + 1)
|
|
|
|
# Draw connecting dashed line
|
|
if n > 1:
|
|
pole_y = hheight - (100 * (m - 1))//2 + 50
|
|
if m % 2 == 0:
|
|
pole_y -= 50
|
|
for _ in range(5*(m+1)*(n-1)):
|
|
out.append('P 2 1 1 0 0 {} 0 {} N'
|
|
.format(pole_y, pole_y - 5))
|
|
pole_y -= 20
|
|
|
|
# Done
|
|
out.append('ENDDRAW\nENDDEF\n')
|
|
|
|
return out
|
|
|
|
|
|
def main(libpath, verify=False):
|
|
out = []
|
|
out.append("EESchema-LIBRARY Version 2.3")
|
|
out.append("#encoding utf-8\n")
|
|
out.append("#============================================================")
|
|
out.append("# Automatically generated by agg-kicad build_lib_switch.py")
|
|
out.append("# See github.com/adamgreig/agg-kicad")
|
|
out.append("#============================================================")
|
|
out.append("")
|
|
|
|
for n in (1, 2, 3):
|
|
for m in (1, 2, 3):
|
|
out += switch(n, m)
|
|
|
|
out.append('# End Library\n')
|
|
lib = "\n".join(out)
|
|
|
|
# Check if the library has changed
|
|
if os.path.isfile(libpath):
|
|
with open(libpath) as f:
|
|
oldlib = f.read()
|
|
if lib == oldlib:
|
|
return True
|
|
|
|
# If so, validation has failed or update the library file
|
|
if verify:
|
|
return False
|
|
else:
|
|
with open(libpath, "w") as f:
|
|
f.write(lib)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if len(sys.argv) == 2:
|
|
main(sys.argv[1])
|
|
elif len(sys.argv) == 3 and sys.argv[2] == "--verify":
|
|
if main(sys.argv[1], verify=True):
|
|
print("OK: lib up-to-date.")
|
|
sys.exit(0)
|
|
else:
|
|
print("Error: lib not up-to-date.", file=sys.stderr)
|
|
sys.exit(1)
|
|
else:
|
|
print("Usage: {} <lib path> [--verify]".format(sys.argv[0]))
|
|
sys.exit(1)
|