Browse Source
Add Micromatch connectors footprint wizard. Unfortunately, I don't remember the initial author of this script.
pull/3/merge
Add Micromatch connectors footprint wizard. Unfortunately, I don't remember the initial author of this script.
pull/3/merge
1 changed files with 204 additions and 0 deletions
@ -0,0 +1,204 @@ |
|||||
|
# This program is free software; you can redistribute it and/or modify |
||||
|
# it under the terms of the GNU General Public License as published by |
||||
|
# the Free Software Foundation; either version 2 of the License, or |
||||
|
# (at your option) any later version. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU General Public License for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU General Public License |
||||
|
# along with this program; if not, write to the Free Software |
||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, |
||||
|
# MA 02110-1301, USA. |
||||
|
# |
||||
|
|
||||
|
from __future__ import division |
||||
|
import pcbnew |
||||
|
|
||||
|
import FootprintWizardBase as FPWbase |
||||
|
import PadArray as PA |
||||
|
|
||||
|
class PadStaggeredZGridArray(PA.PadArray): |
||||
|
""" Creates a staggered array of Pads with Z pad naming |
||||
|
|
||||
|
| pad pitch |
||||
|
| | |
||||
|
o o o o ---- |
||||
|
staggered --> o o o o -- line_pitch |
||||
|
line o o o o |
||||
|
o o o o |
||||
|
""" |
||||
|
def __init__(self, aPad, aPadCount, aLineCount, aLinePitch, |
||||
|
aPadPitch, aStagger=0, aCentre=pcbnew.wxPoint(0, 0)): |
||||
|
""" |
||||
|
@param aPad Template for all pads |
||||
|
@param aPadCount Overall pad count |
||||
|
@param aLineCount Number of lines |
||||
|
@param aLinePitch distance between lines |
||||
|
@param aPadPitch distance between pads |
||||
|
@param aStagger X stagger value for all odd lines |
||||
|
@param aCentre Center position |
||||
|
|
||||
|
""" |
||||
|
PA.PadArray.__init__(self) |
||||
|
# this pad is more of a "context", we will use it as a source of |
||||
|
# pad data, but not actually add it |
||||
|
self.pad = aPad |
||||
|
self.padCount = int(aPadCount) |
||||
|
self.lineCount = int(aLineCount) |
||||
|
self.linePitch = aLinePitch |
||||
|
self.padPitch = aPadPitch |
||||
|
self.stagger = aStagger |
||||
|
self.centre = aCentre |
||||
|
|
||||
|
|
||||
|
# right to left, top to bottom |
||||
|
def NamingFunction(self, aPadPos): |
||||
|
return self.firstPadNum + aPadPos |
||||
|
|
||||
|
#relocate the pad and add it as many times as we need |
||||
|
def AddPadsToModule(self, dc): |
||||
|
pin1posX = self.centre.x - ((self.padPitch * (self.padCount // 2 - 1)) + self.stagger) / 2 |
||||
|
pin1posY = self.centre.y - self.linePitch * (self.lineCount - 1) / 2 |
||||
|
line = 0 |
||||
|
|
||||
|
for padnum in range(0, self.padCount): |
||||
|
if (line % 2) == 0: |
||||
|
posX = pin1posX + ((padnum // 2) * self.padPitch) |
||||
|
else: |
||||
|
posX = pin1posX + self.stagger + ((padnum // 2) * self.padPitch) |
||||
|
|
||||
|
posY = pin1posY + (self.linePitch * line) |
||||
|
|
||||
|
pos = dc.TransformPoint(posX, posY) |
||||
|
pad = self.GetPad(padnum == 0, pos) |
||||
|
pad.SetPadName(self.GetName(padnum)) |
||||
|
self.AddPad(pad) |
||||
|
|
||||
|
line += 1 |
||||
|
|
||||
|
if line >= self.lineCount: |
||||
|
line = 0 |
||||
|
|
||||
|
|
||||
|
class MicroMaTchWizard(FPWbase.FootprintWizard): |
||||
|
padCountKey = 'pad count' |
||||
|
rowSpacingKey = 'row spacing' |
||||
|
padLengthKey = 'pad length' |
||||
|
padWidthKey = 'pad width' |
||||
|
padPitchKey = 'pad pitch' |
||||
|
staggerOffsetKey = 'stagger_offset' |
||||
|
withLockKey = 'draw lock' |
||||
|
|
||||
|
def GetName(self): |
||||
|
return "Micromatch SMD connectors" |
||||
|
|
||||
|
def GetDescription(self): |
||||
|
return "Micromatch (with lock and w/o lock), footprint wizard" |
||||
|
|
||||
|
def GenerateParameterList(self): |
||||
|
# defaults for a Micromatch package |
||||
|
self.AddParam("Body", self.withLockKey, self.uBool, True) |
||||
|
self.AddParam("Pads", self.padCountKey, self.uInteger, 8, multiple=2) |
||||
|
|
||||
|
#and override some of them |
||||
|
self.AddParam("Pads", self.padWidthKey, self.uMM, 1.5) |
||||
|
self.AddParam("Pads", self.padLengthKey, self.uMM, 3.0) |
||||
|
self.AddParam("Pads", self.padPitchKey, self.uMM, 2.54) |
||||
|
self.AddParam("Pads", self.rowSpacingKey, self.uMM, 5.2) |
||||
|
self.AddParam("Pads", self.staggerOffsetKey, self.uMM, 1.27) |
||||
|
|
||||
|
def CheckParameters(self): |
||||
|
pass # All checks are already taken care of! |
||||
|
|
||||
|
def GetValue(self): |
||||
|
pad_count = self.parameters["Pads"][self.padCountKey] |
||||
|
return "%s-%d" % ("ConnectorMicromatch", pad_count) |
||||
|
|
||||
|
def GetPad(self): |
||||
|
padLength = self.parameters["Pads"][self.padLengthKey] |
||||
|
padWidth = self.parameters["Pads"][self.padWidthKey] |
||||
|
return PA.PadMaker(self.module).SMDPad( |
||||
|
padLength, padWidth, shape=pcbnew.PAD_SHAPE_RECT) |
||||
|
|
||||
|
def BuildThisFootprint(self): |
||||
|
pads = self.parameters["Pads"] |
||||
|
body = self.parameters["Body"] |
||||
|
numPads = pads[self.padCountKey] |
||||
|
padLength = pads[self.padLengthKey] |
||||
|
rowPitch = pads[self.rowSpacingKey] |
||||
|
padPitch = pads[self.padPitchKey] |
||||
|
staggerOffset = pads[self.staggerOffsetKey] |
||||
|
|
||||
|
drawWithLock = body[self.withLockKey] |
||||
|
numRows = 2 |
||||
|
|
||||
|
# Use value to fill the modules description |
||||
|
desc = self.GetValue() |
||||
|
self.module.SetDescription(desc) |
||||
|
self.module.SetAttributes(1) |
||||
|
|
||||
|
# add in the pads |
||||
|
pad = self.GetPad() |
||||
|
|
||||
|
array = PadStaggeredZGridArray(pad, numPads, numRows, rowPitch, padPitch, staggerOffset) |
||||
|
array.AddPadsToModule(self.draw) |
||||
|
|
||||
|
# Draw connector outlineChassis |
||||
|
width = pcbnew.FromMM(1.92) + (numPads * padPitch) / 2 |
||||
|
height = pcbnew.FromMM(5) |
||||
|
|
||||
|
# Left part |
||||
|
# -- |
||||
|
# | |
||||
|
# ---- |
||||
|
self.draw.Polyline([(-width/2 + pcbnew.FromMM(0.5), -height/2), |
||||
|
(-width/2, -height/2), |
||||
|
(-width/2, height/2), |
||||
|
(-width/2 + pcbnew.FromMM(0.5) + padPitch / 2, height/2)]) |
||||
|
|
||||
|
if drawWithLock : |
||||
|
# Right part with pol slot |
||||
|
# ---- |
||||
|
# [ |
||||
|
# -- |
||||
|
self.draw.Polyline([(width/2 - pcbnew.FromMM(0.5) - padPitch / 2, -height/2), |
||||
|
(width/2, -height/2), |
||||
|
(width/2, -height/2 + pcbnew.FromMM(1.25)), |
||||
|
(width/2 - pcbnew.FromMM(0.7), -height/2 + pcbnew.FromMM(1.25)), |
||||
|
(width/2 - pcbnew.FromMM(0.7), height/2 - pcbnew.FromMM(1.25)), |
||||
|
(width/2, height/2 - pcbnew.FromMM(1.25)), |
||||
|
(width/2, height/2), |
||||
|
(width/2 - pcbnew.FromMM(0.5), height/2)]) |
||||
|
else: |
||||
|
# Right part without pol slot |
||||
|
# ---- |
||||
|
# | |
||||
|
# -- |
||||
|
self.draw.Polyline([(width/2 - pcbnew.FromMM(0.5) - padPitch / 2, -height/2), |
||||
|
(width/2, -height/2), |
||||
|
(width/2, height/2), |
||||
|
(width/2 - pcbnew.FromMM(0.5), height/2)]) |
||||
|
|
||||
|
# Courtyard |
||||
|
self.draw.SetLayer(pcbnew.F_CrtYd) |
||||
|
self.draw.SetLineThickness(pcbnew.FromMM(0.05)) |
||||
|
boxW = width + pcbnew.FromMM(0.5) |
||||
|
boxH = rowPitch + padLength + pcbnew.FromMM(0.5) |
||||
|
|
||||
|
# Round courtyard positions to 0.1 mm, rectangle will thus land on a 0.05mm grid |
||||
|
pcbnew.PutOnGridMM(boxW, pcbnew.FromMM(0.10)) |
||||
|
pcbnew.PutOnGridMM(boxH, pcbnew.FromMM(0.10)) |
||||
|
self.draw.Box(0,0, boxW, boxH) |
||||
|
|
||||
|
#reference and value |
||||
|
text_size = pcbnew.FromMM(1.0) # According KLC |
||||
|
text_offset = boxH/2 + text_size |
||||
|
|
||||
|
self.draw.Value(0, text_offset, text_size) |
||||
|
self.draw.Reference(0, -text_offset, text_size) |
||||
|
|
||||
|
|
||||
|
MicroMaTchWizard().register() |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue