barcodefootprint wizard - cleanup python code.
This commit is contained in:
parent
4fc230b773
commit
44b5d19d3b
|
@ -14,158 +14,49 @@
|
||||||
# MA 02110-1301, USA.
|
# MA 02110-1301, USA.
|
||||||
|
|
||||||
from __future__ import division
|
from __future__ import division
|
||||||
import pcbnew
|
import pcbnew as B
|
||||||
|
|
||||||
import HelpfulFootprintWizardPlugin
|
import HelpfulFootprintWizardPlugin
|
||||||
import PadArray as PA
|
|
||||||
import math
|
|
||||||
|
|
||||||
|
|
||||||
'''
|
'''
|
||||||
Created on Jan 16, 2015
|
Created on Jan 16, 2015
|
||||||
|
|
||||||
@author: ejohns
|
@author: ejohns
|
||||||
|
Rewritten by LordBlick
|
||||||
'''
|
'''
|
||||||
from string import ascii_uppercase, digits
|
ptd = {
|
||||||
|
'0': '000110100', '1': '100100001', '2': '001100001', '3': '101100000',
|
||||||
|
'4': '000110001', '5': '100110000', '6': '001110000', '7': '000100101',
|
||||||
|
'8': '100100100', '9': '001100100', 'A': '100001001', 'B': '001001001',
|
||||||
|
'C': '101001000', 'D': '000011001', 'E': '100011000', 'F': '001011000',
|
||||||
|
'G': '000001101', 'H': '100001100', 'I': '001001100', 'J': '000011100',
|
||||||
|
'K': '100000011', 'L': '001000011', 'M': '101000010', 'N': '000010011',
|
||||||
|
'O': '100010010', 'P': '001010010', 'Q': '000000111', 'R': '100000110',
|
||||||
|
'S': '001000110', 'T': '000010110', 'U': '110000001', 'V': '011000001',
|
||||||
|
'W': '111000000', 'X': '010010001', 'Y': '110010000', 'Z': '011010000',
|
||||||
|
'-': '010000101', '.': '110000100', ' ': '011000100', '*': '010010100',
|
||||||
|
'$': '010101000', '/': '010100010', '+': '010001010', '%': '000101010'}
|
||||||
|
|
||||||
class Uss39:
|
class Uss39:
|
||||||
"""
|
|
||||||
"""
|
|
||||||
|
|
||||||
patternDict = {'1': [1, 0, 0, 1, 0, 0, 0, 0, 1],
|
|
||||||
'2': [0, 0, 1, 1, 0, 0, 0, 0, 1],
|
|
||||||
'3': [1, 0, 1, 1, 0, 0, 0, 0, 0],
|
|
||||||
'4': [0, 0, 0, 1, 1, 0, 0, 0, 1],
|
|
||||||
'5': [1, 0, 0, 1, 1, 0, 0, 0, 0],
|
|
||||||
'6': [0, 0, 1, 1, 1, 0, 0, 0, 0],
|
|
||||||
'7': [0, 0, 0, 1, 0, 0, 1, 0, 1],
|
|
||||||
'8': [1, 0, 0, 1, 0, 0, 1, 0, 0],
|
|
||||||
'9': [0, 0, 1, 1, 0, 0, 1, 0, 0],
|
|
||||||
'0': [0, 0, 0, 1, 1, 0, 1, 0, 0],
|
|
||||||
'A': [1, 0, 0, 0, 0, 1, 0, 0, 1],
|
|
||||||
'B': [0, 0, 1, 0, 0, 1, 0, 0, 1],
|
|
||||||
'C': [1, 0, 1, 0, 0, 1, 0, 0, 0],
|
|
||||||
'D': [0, 0, 0, 0, 1, 1, 0, 0, 1],
|
|
||||||
'E': [1, 0, 0, 0, 1, 1, 0, 0, 0],
|
|
||||||
'F': [0, 0, 1, 0, 1, 1, 0, 0, 0],
|
|
||||||
'G': [0, 0, 0, 0, 0, 1, 1, 0, 1],
|
|
||||||
'H': [1, 0, 0, 0, 0, 1, 1, 0, 0],
|
|
||||||
'I': [0, 0, 1, 0, 0, 1, 1, 0, 0],
|
|
||||||
'J': [0, 0, 0, 0, 1, 1, 1, 0, 0],
|
|
||||||
'K': [1, 0, 0, 0, 0, 0, 0, 1, 1],
|
|
||||||
'L': [0, 0, 1, 0, 0, 0, 0, 1, 1],
|
|
||||||
'M': [1, 0, 1, 0, 0, 0, 0, 1, 0],
|
|
||||||
'N': [0, 0, 0, 0, 1, 0, 0, 1, 1],
|
|
||||||
'O': [1, 0, 0, 0, 1, 0, 0, 1, 0],
|
|
||||||
'P': [0, 0, 1, 0, 1, 0, 0, 1, 0],
|
|
||||||
'Q': [0, 0, 0, 0, 0, 0, 1, 1, 1],
|
|
||||||
'R': [1, 0, 0, 0, 0, 0, 1, 1, 0],
|
|
||||||
'S': [0, 0, 1, 0, 0, 0, 1, 1, 0],
|
|
||||||
'T': [0, 0, 0, 0, 1, 0, 1, 1, 0],
|
|
||||||
'U': [1, 1, 0, 0, 0, 0, 0, 0, 1],
|
|
||||||
'V': [0, 1, 1, 0, 0, 0, 0, 0, 1],
|
|
||||||
'W': [1, 1, 1, 0, 0, 0, 0, 0, 0],
|
|
||||||
'X': [0, 1, 0, 0, 1, 0, 0, 0, 1],
|
|
||||||
'Y': [1, 1, 0, 0, 1, 0, 0, 0, 0],
|
|
||||||
'Z': [0, 1, 1, 0, 1, 0, 0, 0, 0],
|
|
||||||
'-': [0, 1, 0, 0, 0, 0, 1, 0, 1],
|
|
||||||
'.': [1, 1, 0, 0, 0, 0, 1, 0, 0],
|
|
||||||
' ': [0, 1, 1, 0, 0, 0, 1, 0, 0],
|
|
||||||
'*': [0, 1, 0, 0, 1, 0, 1, 0, 0],
|
|
||||||
'$': [0, 1, 0, 1, 0, 1, 0, 0, 0],
|
|
||||||
'/': [0, 1, 0, 1, 0, 0, 0, 1, 0],
|
|
||||||
'+': [0, 1, 0, 0, 0, 1, 0, 1, 0],
|
|
||||||
'%': [0, 0, 0, 1, 0, 1, 0, 1, 0]}
|
|
||||||
|
|
||||||
|
|
||||||
def makePrintable(self, text):
|
|
||||||
"""
|
|
||||||
"""
|
|
||||||
output_string = ''
|
|
||||||
|
|
||||||
# Capitalize string
|
|
||||||
text = text.upper()
|
|
||||||
|
|
||||||
# Remove unprintable text
|
|
||||||
for c in text:
|
|
||||||
output_string = output_string + c if self.patternDict.has_key(c) else output_string
|
|
||||||
|
|
||||||
return output_string
|
|
||||||
|
|
||||||
def getPattern(self, c):
|
|
||||||
"""
|
|
||||||
"""
|
|
||||||
return self.patternDict[c]
|
|
||||||
|
|
||||||
def getBarCodePattern(self, text = None):
|
|
||||||
"""
|
|
||||||
"""
|
|
||||||
|
|
||||||
text = text if text is not None else self.Text
|
|
||||||
bars = []
|
|
||||||
output_string = ''
|
|
||||||
|
|
||||||
# Reformat text
|
|
||||||
text = self.makePrintable(text)
|
|
||||||
|
|
||||||
# Append start and end characters
|
|
||||||
output_string = '*' + text + '*'
|
|
||||||
|
|
||||||
for c in output_string:
|
|
||||||
bars = bars + self.getPattern(c)
|
|
||||||
# Add intercharacter gap
|
|
||||||
bars.append(0)
|
|
||||||
|
|
||||||
# Remove last intercharacter gap
|
|
||||||
bars = bars[:-1]
|
|
||||||
|
|
||||||
return bars
|
|
||||||
|
|
||||||
def __init__(self, text):
|
def __init__(self, text):
|
||||||
"""
|
|
||||||
"""
|
|
||||||
self.Text = self.makePrintable(text)
|
self.Text = self.makePrintable(text)
|
||||||
|
|
||||||
def __str__(self):
|
__str__ = lambda self: self.Text
|
||||||
"""
|
makePrintable = lambda self, text: ''.join((c for c in text.upper() if ptd.has_key(c)))
|
||||||
"""
|
|
||||||
return self.Text
|
def getBarCodePattern(self, text = None):
|
||||||
|
text = text if not(text is None) else self.Text
|
||||||
|
# Reformated text with start and end characters
|
||||||
|
return reduce(lambda a1, a2: a1 + [0] + a2, [map(int, ptd[c]) for c in ("*%s*" % self.makePrintable(text))])
|
||||||
|
|
||||||
class Uss39Wizard(HelpfulFootprintWizardPlugin.HelpfulFootprintWizardPlugin):
|
class Uss39Wizard(HelpfulFootprintWizardPlugin.HelpfulFootprintWizardPlugin):
|
||||||
""""""
|
GetName = lambda self: 'BARCODE USS-39'
|
||||||
|
GetDescription = lambda self: 'USS-39 Barcode'
|
||||||
def GetName(self):
|
GetReferencePrefix = lambda self: 'BARCODE'
|
||||||
"""
|
GetValue = lambda self: self.module.Value().GetText()
|
||||||
Return footprint name.
|
|
||||||
|
|
||||||
This is specific to each footprint class, you need to implement
|
|
||||||
this
|
|
||||||
"""
|
|
||||||
return 'BARCODE USS-39'
|
|
||||||
|
|
||||||
def GetDescription(self):
|
|
||||||
"""
|
|
||||||
Return footprint description.
|
|
||||||
|
|
||||||
This is specific to each footprint class, you need to implement
|
|
||||||
this
|
|
||||||
"""
|
|
||||||
return 'USS-39 Barcode'
|
|
||||||
|
|
||||||
def GetReferencePrefix(self):
|
|
||||||
"""
|
|
||||||
"""
|
|
||||||
return 'BARCODE'
|
|
||||||
|
|
||||||
def GetValue(self):
|
|
||||||
"""
|
|
||||||
"""
|
|
||||||
return self.module.Value().GetText()
|
|
||||||
|
|
||||||
def GenerateParameterList(self):
|
def GenerateParameterList(self):
|
||||||
""""""
|
|
||||||
# Silkscreen parameters
|
# Silkscreen parameters
|
||||||
|
|
||||||
self.AddParam("Barcode", "Pixel Width", self.uMM, 0.20)
|
self.AddParam("Barcode", "Pixel Width", self.uMM, 0.20)
|
||||||
self.AddParam("Barcode", "Height", self.uMM, 3.0)
|
self.AddParam("Barcode", "Height", self.uMM, 3.0)
|
||||||
self.AddParam("Barcode", "Margin", self.uMM, 2.0)
|
self.AddParam("Barcode", "Margin", self.uMM, 2.0)
|
||||||
|
@ -175,75 +66,54 @@ class Uss39Wizard(HelpfulFootprintWizardPlugin.HelpfulFootprintWizardPlugin):
|
||||||
self.AddParam("Caption", "Thickness", self.uMM, 0.12)
|
self.AddParam("Caption", "Thickness", self.uMM, 0.12)
|
||||||
|
|
||||||
def CheckParameters(self):
|
def CheckParameters(self):
|
||||||
"""
|
|
||||||
"""
|
|
||||||
|
|
||||||
# Reset constants
|
# Reset constants
|
||||||
self.CourtyardLineWidth = pcbnew.FromMM(0.05)
|
self.CourtyardLineWidth = B.FromMM(0.05)
|
||||||
|
|
||||||
# Set bar height to the greater of 6.35mm or 0.15*L
|
# Set bar height to the greater of 6.35mm or 0.15*L
|
||||||
# Set quiet width to 10*X
|
# Set quiet width to 10*X
|
||||||
|
|
||||||
# User-defined parameters
|
# User-defined parameters
|
||||||
|
|
||||||
# Create barcode object
|
# Create barcode object
|
||||||
self.Barcode = Uss39('=' + str(self.parameters['Barcode']['*Contents']))
|
self.Barcode = Uss39('=' + str(self.parameters['Barcode']['*Contents']))
|
||||||
self.X = int(self.parameters['Barcode']['Pixel Width'])
|
self.X = int(self.parameters['Barcode']['Pixel Width'])
|
||||||
self.module.Value().SetText( str(self.Barcode) )
|
self.module.Value().SetText( str(self.Barcode) )
|
||||||
|
|
||||||
self.C = len(str(self.Barcode))
|
self.C = len(str(self.Barcode))
|
||||||
|
|
||||||
# Inter-character gap
|
# Inter-character gap
|
||||||
if self.X < 0.250:
|
if self.X < 0.250:
|
||||||
self.I = pcbnew.FromMM(3.15)
|
self.I = B.FromMM(3.15)
|
||||||
else:
|
else:
|
||||||
self.I = (2 * self.X) if (2*self.X) > pcbnew.FromMM(1.35) else pcbnew.FromMM(1.35)
|
self.I = (2 * self.X) if (2*self.X) > B.FromMM(1.35) else B.FromMM(1.35)
|
||||||
|
|
||||||
# Wide to narrow ratio
|
# Wide to narrow ratio
|
||||||
if self.X >= pcbnew.FromMM(0.508):
|
if self.X >= B.FromMM(0.508):
|
||||||
self.N = pcbnew.FromMM(int((2.0+3.0)/2))
|
self.N = B.FromMM(int((2.0+3.0)/2))
|
||||||
else:
|
else:
|
||||||
self.N = pcbnew.FromMM(int((2.2+3.0)/2))
|
self.N = B.FromMM(int((2.2+3.0)/2))
|
||||||
|
|
||||||
self.H = self.parameters['Barcode']['Height']
|
self.H = self.parameters['Barcode']['Height']
|
||||||
|
self.Q = (10 * self.X) if (10 * self.X) > B.FromMM(6.35) else B.FromMM(6.35)
|
||||||
self.Q = (10 * self.X) if (10 * self.X) > pcbnew.FromMM(6.35) else pcbnew.FromMM(6.35)
|
|
||||||
|
|
||||||
self.L = self.I * (1 + self.C) + (self.C + 2) * (6 * self.X + 3 * self.N * self.X) + 2 * self.Q
|
self.L = self.I * (1 + self.C) + (self.C + 2) * (6 * self.X + 3 * self.N * self.X) + 2 * self.Q
|
||||||
|
|
||||||
|
|
||||||
def __drawBar__(self, bit, x):
|
def __drawBar__(self, bit, x):
|
||||||
"""
|
|
||||||
"""
|
|
||||||
offset = (bit + 1) * self.X
|
offset = (bit + 1) * self.X
|
||||||
return x + offset
|
return x + offset
|
||||||
|
|
||||||
def __drawSpace__(self, bit, x):
|
def __drawSpace__(self, bit, x):
|
||||||
"""
|
self.draw.SetLayer(B.F_SilkS)
|
||||||
"""
|
|
||||||
self.draw.SetLayer(pcbnew.F_SilkS)
|
|
||||||
self.draw.SetWidth(self.X)
|
self.draw.SetWidth(self.X)
|
||||||
self.draw.Line(x, 0, x, self.H)
|
self.draw.Line(x, 0, x, self.H)
|
||||||
|
|
||||||
if (bit == 1):
|
if (bit == 1):
|
||||||
self.draw.Line(x + self.X, 0, x + self.X, self.H)
|
self.draw.Line(x + self.X, 0, x + self.X, self.H)
|
||||||
self.draw.Line(x + self.X/2, 0, x + self.X/2, self.H)
|
self.draw.Line(x + self.X/2, 0, x + self.X/2, self.H)
|
||||||
self.draw.Line(x, 0, x + self.X, 0)
|
self.draw.Line(x, 0, x + self.X, 0)
|
||||||
self.draw.Line(x, self.H, x + self.X, self.H)
|
self.draw.Line(x, self.H, x + self.X, self.H)
|
||||||
|
|
||||||
offset = (bit + 1) * self.X
|
offset = (bit + 1) * self.X
|
||||||
return x + offset
|
return x + offset
|
||||||
|
|
||||||
def drawBars(self):
|
def drawBars(self):
|
||||||
"""
|
|
||||||
"""
|
|
||||||
x = 0
|
x = 0
|
||||||
bars = self.Barcode.getBarCodePattern()
|
bars = self.Barcode.getBarCodePattern()
|
||||||
for index in range(0, len(bars), 2):
|
for index in range(0, len(bars), 2):
|
||||||
# Draw bar
|
# Draw bar
|
||||||
barBit = bars[index]
|
barBit = bars[index]
|
||||||
x = self.__drawBar__(barBit, x)
|
x = self.__drawBar__(barBit, x)
|
||||||
|
|
||||||
# Draw space
|
# Draw space
|
||||||
if index < len(bars)-1:
|
if index < len(bars)-1:
|
||||||
spaceBit = bars[index + 1]
|
spaceBit = bars[index + 1]
|
||||||
|
@ -251,12 +121,9 @@ class Uss39Wizard(HelpfulFootprintWizardPlugin.HelpfulFootprintWizardPlugin):
|
||||||
return x
|
return x
|
||||||
|
|
||||||
def drawQuietZone(self, x0, y0, width, height):
|
def drawQuietZone(self, x0, y0, width, height):
|
||||||
"""
|
self.draw.SetLayer(B.F_SilkS)
|
||||||
"""
|
|
||||||
self.draw.SetLayer(pcbnew.F_SilkS)
|
|
||||||
self.draw.SetWidth(self.X)
|
self.draw.SetWidth(self.X)
|
||||||
|
|
||||||
|
|
||||||
for offset in range(0, int(self.Q), int(self.X/2)):
|
for offset in range(0, int(self.Q), int(self.X/2)):
|
||||||
xoffset = offset + self.X
|
xoffset = offset + self.X
|
||||||
yoffset = offset + self.X/2
|
yoffset = offset + self.X/2
|
||||||
|
@ -266,22 +133,17 @@ class Uss39Wizard(HelpfulFootprintWizardPlugin.HelpfulFootprintWizardPlugin):
|
||||||
self.draw.Line(width + xoffset, -yoffset, width+xoffset, self.H+yoffset)
|
self.draw.Line(width + xoffset, -yoffset, width+xoffset, self.H+yoffset)
|
||||||
|
|
||||||
def BuildThisFootprint(self):
|
def BuildThisFootprint(self):
|
||||||
"""
|
|
||||||
"""
|
|
||||||
|
|
||||||
# Draw bars
|
# Draw bars
|
||||||
x = self.drawBars()
|
x = self.drawBars()
|
||||||
|
|
||||||
# Draw quiet zone
|
# Draw quiet zone
|
||||||
self.drawQuietZone(0, 0, x, self.H)
|
self.drawQuietZone(0, 0, x, self.H)
|
||||||
|
|
||||||
# Draw courtyard origin
|
# Draw courtyard origin
|
||||||
self.draw.SetLayer(pcbnew.F_CrtYd)
|
self.draw.SetLayer(B.F_CrtYd)
|
||||||
self.draw.SetWidth(self.CourtyardLineWidth)
|
self.draw.SetWidth(self.CourtyardLineWidth)
|
||||||
ch_lim = pcbnew.FromMM(0.35)
|
ch_lim = B.FromMM(0.35)
|
||||||
self.draw.Line(-ch_lim, 0, ch_lim, 0)
|
self.draw.Line(-ch_lim, 0, ch_lim, 0)
|
||||||
self.draw.Line(0, -ch_lim, 0, ch_lim)
|
self.draw.Line(0, -ch_lim, 0, ch_lim)
|
||||||
self.draw.Circle(0, 0, pcbnew.FromMM(0.25))
|
self.draw.Circle(0, 0, B.FromMM(0.25))
|
||||||
self.module.Value().SetLayer(pcbnew.F_Fab)
|
self.module.Value().SetLayer(B.F_Fab)
|
||||||
|
|
||||||
Uss39Wizard().register()
|
Uss39Wizard().register()
|
||||||
|
|
Loading…
Reference in New Issue