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