+#!/usr/bin/python
+# Copyright 2007 by Bdale Garbee <bdale@gag.com>. GPLv2
+#
+# Program to emit PCB footprint for Samtec QSH-XXX-01-X-D-A connectors
+
+import sys
+
+# dimensions in mm from QSH-XXX-01-X-D-XX-FOOTPRINT.pdf
+
+PinWidth = 0.30
+PinHeight = 1.45
+PinSpacing = 0.5
+RowSpacing = (3.09 * 2) - PinHeight
+HoleDiam = 1.02
+HoleOffset= 2.03
+PaddleHeight = 0.64
+ShortPaddleWidth = 2.54
+LongPaddleWidth = 4.70
+ShortPaddleCC = 16.89
+LongPaddleCC = 6.35
+MaskAdd = 0.15
+
+# Needs pin count per row on command line, 30/60/90/120/150 are valid
+positions = int(sys.argv[1])
+ordinal = positions / 30.0
+if (ordinal < 1) or (ordinal > 5) or (positions%30 != 0):
+ sys.stderr.write('Invalid number of positions, must be 30|60|90|120|150.\n')
+ sys.exit(1)
+
+BodyWidth = (positions / 30) * 20.003 + 1.27
+BodyHeight = 7.493
+HoleSpacing = (positions / 30) * 20.00 + 0.13
+
+# we're going to use the 1/100 of a mil fundamental unit form
+def mm2mils100( mm ):
+ return int( mm / 25.4 * 1000.0 * 100.0 + 0.5 )
+
+print '# author: Bdale Garbee'
+print '# email: bdale@gag.com'
+print '# dist-license: GPL 2'
+print '# use-license: unlimited'
+
+print 'Element[0x0 "QSH-%i"' % positions,' "" "" 0 0 -10161 -12011 0 100 0x0]'
+print "("
+for pin in range (0,positions):
+ print ' Pad[',\
+ mm2mils100((pin-(positions/2 - 0.5)) * PinSpacing), \
+ mm2mils100(-(RowSpacing/2 + PinWidth/2)), \
+ mm2mils100((pin-(positions/2 - 0.5)) * PinSpacing), \
+ mm2mils100(-(RowSpacing/2 + PinHeight - PinWidth/2)), \
+ mm2mils100(PinWidth), \
+ mm2mils100(0), \
+ mm2mils100(PinWidth+MaskAdd), \
+ '"pin%i"' % (1 + pin*2), '"%i"' % (1 + pin*2), '0x0100]'
+
+ print ' Pad[',\
+ mm2mils100((pin-(positions/2 - 0.5)) * PinSpacing), \
+ mm2mils100(RowSpacing/2 + PinWidth/2), \
+ mm2mils100((pin-(positions/2 - 0.5)) * PinSpacing), \
+ mm2mils100(RowSpacing/2 + PinHeight - PinWidth/2), \
+ mm2mils100(PinWidth), \
+ mm2mils100(0), \
+ mm2mils100(PinWidth+MaskAdd), \
+ '"pin%i"' % (2 + pin*2), '"%i"' % (2 + pin*2), '0x0100]'
+
+# ground paddles
+print ' Pad[',\
+ mm2mils100(-ShortPaddleCC/2 - ShortPaddleWidth/2 + PaddleHeight/2), \
+ mm2mils100(0), \
+ mm2mils100(-ShortPaddleCC/2 + ShortPaddleWidth/2 - PaddleHeight/2), \
+ mm2mils100(0), \
+ mm2mils100(PaddleHeight), \
+ mm2mils100(0), \
+ mm2mils100(PaddleHeight+MaskAdd), \
+ '"G" "G" 0x0100]'
+
+print ' Pad[',\
+ mm2mils100(ShortPaddleCC/2 - ShortPaddleWidth/2 + PaddleHeight/2), \
+ mm2mils100(0), \
+ mm2mils100(ShortPaddleCC/2 + ShortPaddleWidth/2 - PaddleHeight/2), \
+ mm2mils100(0), \
+ mm2mils100(PaddleHeight), \
+ mm2mils100(0), \
+ mm2mils100(PaddleHeight+MaskAdd), \
+ '"G" "G" 0x0100]'
+
+print ' Pad[',\
+ mm2mils100(-LongPaddleCC/2 - LongPaddleWidth/2 + PaddleHeight/2), \
+ mm2mils100(0), \
+ mm2mils100(-LongPaddleCC/2 + LongPaddleWidth/2 - PaddleHeight/2), \
+ mm2mils100(0), \
+ mm2mils100(PaddleHeight), \
+ mm2mils100(0), \
+ mm2mils100(PaddleHeight+MaskAdd), \
+ '"G" "G" 0x0100]'
+
+print ' Pad[',\
+ mm2mils100(LongPaddleCC/2 - LongPaddleWidth/2 + PaddleHeight/2), \
+ mm2mils100(0), \
+ mm2mils100(LongPaddleCC/2 + LongPaddleWidth/2 - PaddleHeight/2), \
+ mm2mils100(0), \
+ mm2mils100(PaddleHeight), \
+ mm2mils100(0), \
+ mm2mils100(PaddleHeight+MaskAdd), \
+ '"G" "G" 0x0100]'
+
+print ' Pin[', \
+ mm2mils100(HoleSpacing/2), \
+ mm2mils100(-HoleOffset), \
+ mm2mils100(HoleDiam), \
+ 0, \
+ mm2mils100(HoleDiam), \
+ mm2mils100(HoleDiam), \
+ '"mnt" "0"', '0x0008', ']'
+
+print ' Pin[', \
+ mm2mils100(-HoleSpacing/2), \
+ mm2mils100(-HoleOffset), \
+ mm2mils100(HoleDiam), \
+ 0, \
+ mm2mils100(HoleDiam), \
+ mm2mils100(HoleDiam), \
+ '"mnt" "0"', '0x0008', ']'
+
+print ' ElementLine[',\
+ mm2mils100(-BodyWidth/2), \
+ mm2mils100(-BodyHeight/2), \
+ mm2mils100(-BodyWidth/2), \
+ mm2mils100( BodyHeight/2), \
+ '1000 ]'
+
+print ' ElementLine[',\
+ mm2mils100(-BodyWidth/2), \
+ mm2mils100( BodyHeight/2), \
+ mm2mils100( BodyWidth/2), \
+ mm2mils100( BodyHeight/2), \
+ '1000 ]'
+
+print ' ElementLine[',\
+ mm2mils100( BodyWidth/2), \
+ mm2mils100( BodyHeight/2), \
+ mm2mils100( BodyWidth/2), \
+ mm2mils100(-BodyHeight/2), \
+ '1000 ]'
+
+print ' ElementLine[',\
+ mm2mils100( BodyWidth/2), \
+ mm2mils100(-BodyHeight/2), \
+ mm2mils100(-BodyWidth/2), \
+ mm2mils100(-BodyHeight/2), \
+ '1000 ]'
+
+print ' ElementArc[',\
+ mm2mils100(-(positions/2 + 0.5) * PinSpacing), \
+ mm2mils100(-(RowSpacing/2+PinHeight*5/4)), \
+ '500 500 0 360 1000 ]'
+
+print ")"