22from __future__ 
import division
 
   29    Useful construction functions for common types of pads, providing
 
   30    sensible defaults 
for common pads.
 
   35        @param module: the module the pads will be part of
 
   39    def THPad(self, Vsize, Hsize, drill, shape=pcbnew.PAD_SHAPE_OVAL,
 
   42        A basic through-hole pad of the given size and shape
 
   43        @param Vsize: the vertical size of the pad
 
   44        @param Hsize: the horizontal size of the pad
 
   45        @param drill: the drill diameter
 
   46        @param shape: the shape of the pad
 
   47        @param rot_degree: the pad rotation, 
in degrees
 
   52        pad.SetAttribute(pcbnew.PAD_ATTRIB_PTH) 
   53        pad.SetLayerSet(pad.PTHMask()) 
   61        A round though-hole pad. A shortcut for THPad()
 
   62        @param size: pad diameter
 
   63        @param drill: drill diameter
 
   65        pad = self.THPad(size, size, drill, shape=pcbnew.PAD_SHAPE_CIRCLE) 
   70        A round non-plated though hole (NPTH) 
   72        @param drill: the drill diameter (equals the NPTH diameter)
 
   76        pad.SetShape(pcbnew.PAD_SHAPE_CIRCLE) 
   77        pad.SetAttribute(pcbnew.PAD_ATTRIB_NPTH) 
   78        pad.SetLayerSet(pad.UnplatedHoleMask()) 
   82    def SMDPad(self, Vsize, Hsize, shape=pcbnew.PAD_SHAPE_RECT, rot_degree=0):
 
   84        Create a surface-mount pad of the given size and shape
 
   85        @param Vsize: the vertical size of the pad
 
   86        @param Hsize: the horizontal size of the pad
 
   87        @param shape: the shape of the pad
 
   88        @param rot_degree: the pad rotation, 
in degrees
 
   93        pad.SetAttribute(pcbnew.PAD_ATTRIB_SMD) 
   94        pad.SetLayerSet(pad.SMDMask()) 
   99    def AperturePad(self, Vsize, Hsize, shape=pcbnew.PAD_SHAPE_RECT, rot_degree=0):
 
  101        Create a aperture pad of the given size and shape, i.e. a smd pad shape
 
  102        on the solder paste 
and not on a copper
 
  104        @param Vsize: the vertical size of the aperture
 
  105        @param Hsize: the horizontal size of the aperture
 
  106        @param shape: the shape of the pad
 
  107        @param rot_degree: the pad rotation, 
in degrees
 
  112        pad.SetAttribute(pcbnew.PAD_ATTRIB_SMD) 
  113        pad.SetLayerSet(pad.ApertureMask()) 
  120        A round surface-mount pad. A shortcut for SMDPad()
 
  121        @param size: pad diameter
 
  123        pad = self.SMDPad(size, size, shape=pcbnew.PAD_SHAPE_CIRCLE) 
  129    A class to assist in creating repetitive grids of pads
 
  131    Generally, PadArrays have an internal prototypical pad, 
and copy this
 
  132    for each pad 
in the array. They can also have a special pad 
for the
 
  133    first pad, 
and a custom function to name the pad.
 
  135    Generally, PadArray 
is used 
as a base 
class for more specific array
 
  141        @param pad: the prototypical pad
 
  153        Set a name for all the pins. If given, this overrides the
 
  156        @param pinNames: the name to use 
for all pins
 
  162        If the array has a different first pad, this is the pad that
 
  164        @param firstPad: the prototypical first pad
 
  170        Set the numbering for the first pad 
in the array
 
  171        @param fpNum: the number 
for the first pad
 
  177        Add a pad to the array, under the same footprint as the main
 
  179        @param pad: pad to add
 
  181        self.pad.GetParent().Add(pad) 
  185        Get a pad in the array 
with the given position
 
  186        @param is_first_pad: use the special first pad 
if there 
is one
 
  187        @param pos: the pad position
 
  189        if (self.
firstPad and is_first_pad):
 
  195        pad = pad.Duplicate()
 
  202        Get the pad name from the naming function, 
or the pre-set
 
  203        pinNames parameter (set 
with SetPinNames)
 
  213        Implement this as needed 
for each array type
 
  215        raise NotImplementedError;
 
  223    def __init__(self, pad, nx, ny, px, py, centre=pcbnew.VECTOR2I(0, 0)):
 
  225        @param pad: the prototypical pad of the array
 
  226        @param nx: number of pads 
in x-direction
 
  227        @param ny: number of pads 
in y-direction
 
  228        @param px: pitch 
in x-direction
 
  229        @param py: pitch 
in y-direction
 
  230        @param centre: array centre point
 
  236            super(PadGridArray, self).
__init__(pad)
 
  245                            alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ"):
 
  247        Utility function to generate an alphabetical name: 
  249        eg. 1 - A, 2 - B, 26 - AA, etc 
  251        @param aIndex: index of 
'A': 0 
for 0 - A
 
  252        @param n: the pad index
 
  253        @param alphabet: set of allowable chars 
if not A-Z,
 
  254            e.g. ABCDEFGHJKLMNPRTUVWY 
for BGA
 
  257        div, mod = divmod(n - aIndex, len(alphabet)) 
  258        alpha = alphabet[mod] 
  267        Implementation of the naming function: right to left, top-to-bottom 
  269        @param x: the pad x index
 
  270        @param y: the pad y index
 
  277        Create the pads and add them to the module 
in the correct positions
 
  279        @param dc: the drawing context
 
  282        pin1posX = self.centre.x - self.px * (self.nx - 1) / 2 
  283        pin1posY = self.centre.y - self.py * (self.ny - 1) / 2 
  285        for x 
in range(0, self.
nx):
 
  286            posX = pin1posX + (x * self.
px)
 
  288            for y 
in range(self.
ny):
 
  289                posY = pin1posY + (self.
py * y)
 
  290                pos = dc.TransformPoint(posX, posY)
 
  291                pad = self.
GetPad(x == 0 
and y == 0, pos)
 
  298    A pad grid array with a fixed name, used 
for things like thermal
 
  304        Simply return the firstPadNum
 
  313    A staggered pin array 
  316    def __init__(self, pad, pad_count, line_count, line_pitch,
 
  317                 pad_pitch, centre=pcbnew.VECTOR2I(0, 0)):
 
  319        @param pad: the prototypical pad
 
  320        @param pad_count: total pad count
 
  321        @param line_count: number of staggered lines
 
  322        @param line_pitch: distance between lines
 
  323        @param pad_pitch: distance between pads 
in a line
 
  324        @param centre: array centre point
 
  326        super(PadZGridArray, self).__init__(pad) 
  336        Naming just increased with pad index 
in array
 
  342        Create the pads and add them to the module 
in the correct positions
 
  344        @param dc: the drawing context
 
  352            posX = pin1posX + (padnum * self.
pad_pitch)
 
  355            pos = dc.TransformPoint(posX, posY)
 
  356            pad = self.
GetPad(padnum == 0, pos)
 
  357            pad.SetName(self.
GetName(padnum))
 
  368    Shortcut cases for a single-row grid array. Can be used 
for 
  369    constructing sections of larger footprints.
 
  373                 centre=pcbnew.VECTOR2I(0, 0)):
 
  375        @param pad: the prototypical pad
 
  376        @param n: number of pads 
in array
 
  377        @param pitch: distance between pad centres
 
  378        @param isVertical: horizontal 
or vertical array (can also use the
 
  379        drawing contexts transforms 
for more control)
 
  380        @param centre: array centre
 
  384            super(PadLineArray, self).
__init__(pad, 1, n, 0, pitch, centre)
 
  386            super(PadLineArray, self).
__init__(pad, n, 1, pitch, 0, centre)
 
  394    def __init__(self, pad, n, r, angle_offset=0, centre=pcbnew.VECTOR2I(0, 0),
 
  395                 clockwise=
True, padRotationEnable=
False, padRotationOffset=0):
 
  397        @param pad: the prototypical pad
 
  398        @param n: number of pads 
in array
 
  399        @param r: the circle radius
 
  400        @param angle_offset: angle of the first pad
 
  401        @param centre: array centre point
 
  402        @param clockwise: array increases 
in a clockwise direction
 
  403        @param padRotationEnable: also rotate pads when placing
 
  404        @param padRotationOffset: rotation of first pad
 
  407        super(PadCircleArray, self).__init__(pad) 
  419        Naming around the circle, CW or CCW according to the clockwise flag
 
  425        Create the pads and add them to the module 
in the correct positions
 
  427        @param dc: the drawing context
 
  430        for pin 
in range(0, self.
n):
 
  436            pos_x = math.sin(angle * math.pi / 180) * self.
r 
  437            pos_y = -math.cos(angle  * math.pi / 180) * self.
r 
  438            pos = dc.TransformPoint(pos_x, pos_y)
 
  439            pad = self.
GetPad(pin == 0, pos)
 
  450    Layout pads according to a custom array of [x,y] data 
  455        @param pad: the prototypical pad
 
  456        @param array: the position data array
 
  458        super(PadCustomArray, self).__init__(pad) 
  464        Simple increment along the given array 
  465        @param n: the pad index 
in the array
 
  471        Create the pads and add them to the module 
in the correct positions
 
  473        @param dc: the drawing context
 
  476        for i 
in range(len(self.
array)):
 
  477            pos = dc.TransformPoint(self.
array[i][0], self.
array[i][1])
 
  478            pad = self.
GetPad(i == 0, pos)
 
A pad grid array with a fixed name, used for things like thermal pads and via grids.
 
def NamingFunction(self, nx, ny)
Simply return the firstPadNum.
 
A class to assist in creating repetitive grids of pads.
 
def SetFirstPadType(self, firstPad)
If the array has a different first pad, this is the pad that is used.
 
def SetFirstPadInArray(self, fpNum)
Set the numbering for the first pad in the array.
 
def SetPinNames(self, pinNames)
Set a name for all the pins.
 
def GetPad(self, is_first_pad, pos)
Get a pad in the array with the given position.
 
def GetName(self, *args, **kwargs)
Get the pad name from the naming function, or the pre-set pinNames parameter (set with SetPinNames)
 
def NamingFunction(self, *args, **kwargs)
Implement this as needed for each array type.
 
def AddPad(self, pad)
Add a pad to the array, under the same footprint as the main prototype pad.
 
def __init__(self, pad, n, r, angle_offset=0, centre=pcbnew.VECTOR2I(0, 0), clockwise=True, padRotationEnable=False, padRotationOffset=0)
 
def NamingFunction(self, n)
Naming around the circle, CW or CCW according to the clockwise flag.
 
def AddPadsToModule(self, dc)
Create the pads and add them to the module in the correct positions.
 
Layout pads according to a custom array of [x,y] data.
 
def NamingFunction(self, n)
Simple increment along the given array.
 
def AddPadsToModule(self, dc)
Create the pads and add them to the module in the correct positions.
 
def __init__(self, pad, array)
 
def AlphaNameFromNumber(self, n, aIndex=1, alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ")
Utility function to generate an alphabetical name:
 
def NamingFunction(self, x, y)
Implementation of the naming function: right to left, top-to-bottom.
 
def AddPadsToModule(self, dc)
Create the pads and add them to the module in the correct positions.
 
def __init__(self, pad, nx, ny, px, py, centre=pcbnew.VECTOR2I(0, 0))
 
Shortcut cases for a single-row grid array.
 
def __init__(self, pad, n, pitch, isVertical, centre=pcbnew.VECTOR2I(0, 0))
 
Useful construction functions for common types of pads, providing sensible defaults for common pads.
 
def NPTHRoundPad(self, drill)
A round non-plated though hole (NPTH)
 
def SMDPad(self, Vsize, Hsize, shape=pcbnew.PAD_SHAPE_RECT, rot_degree=0)
 
def __init__(self, module)
 
def THRoundPad(self, size, drill)
A round though-hole pad.
 
def SMTRoundPad(self, size)
A round surface-mount pad.
 
def AperturePad(self, Vsize, Hsize, shape=pcbnew.PAD_SHAPE_RECT, rot_degree=0)
 
def THPad(self, Vsize, Hsize, drill, shape=pcbnew.PAD_SHAPE_OVAL, rot_degree=0)
A basic through-hole pad of the given size and shape.
 
def __init__(self, pad, pad_count, line_count, line_pitch, pad_pitch, centre=pcbnew.VECTOR2I(0, 0))
 
def AddPadsToModule(self, dc)
Create the pads and add them to the module in the correct positions.
 
def NamingFunction(self, pad_pos)
Naming just increased with pad index in array.