From 705eb1f24534a840071922aee76481cac6580198 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Sun, 23 Aug 2015 15:06:39 +0200 Subject: [PATCH] Minor change in a fp wizard (better name). Add a new fp wizard to generate a fp with a bar code on the silkscreen layer. --- ...arrays.py => circular_pad_array_wizard.py} | 6 +- pcbnew/scripting/plugins/uss39_barcode.py | 287 ++++++++++++++++++ 2 files changed, 290 insertions(+), 3 deletions(-) rename pcbnew/scripting/plugins/{pad_arrays.py => circular_pad_array_wizard.py} (94%) create mode 100644 pcbnew/scripting/plugins/uss39_barcode.py diff --git a/pcbnew/scripting/plugins/pad_arrays.py b/pcbnew/scripting/plugins/circular_pad_array_wizard.py similarity index 94% rename from pcbnew/scripting/plugins/pad_arrays.py rename to pcbnew/scripting/plugins/circular_pad_array_wizard.py index b498b3618b..d859f875c2 100644 --- a/pcbnew/scripting/plugins/pad_arrays.py +++ b/pcbnew/scripting/plugins/circular_pad_array_wizard.py @@ -22,10 +22,10 @@ import HelpfulFootprintWizardPlugin as HFPW import PadArray as PA -class circular_array_wizard(HFPW.HelpfulFootprintWizardPlugin): +class circular_pad_array_wizard(HFPW.HelpfulFootprintWizardPlugin): def GetName(self): - return "Circular Array" + return "Circular Pad Array" def GetDescription(self): return "Circular array of pads" @@ -74,4 +74,4 @@ class circular_array_wizard(HFPW.HelpfulFootprintWizardPlugin): array.AddPadsToModule(self.draw) -circular_array_wizard().register() +circular_pad_array_wizard().register() diff --git a/pcbnew/scripting/plugins/uss39_barcode.py b/pcbnew/scripting/plugins/uss39_barcode.py new file mode 100644 index 0000000000..d57c677994 --- /dev/null +++ b/pcbnew/scripting/plugins/uss39_barcode.py @@ -0,0 +1,287 @@ +# 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 HelpfulFootprintWizardPlugin +import PadArray as PA +import math + + +''' +Created on Jan 16, 2015 + +@author: ejohns +''' +from string import ascii_uppercase, digits + +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): + """ + """ + self.Text = self.makePrintable(text) + + def __str__(self): + """ + """ + return self.Text + +class Uss39Wizard(HelpfulFootprintWizardPlugin.HelpfulFootprintWizardPlugin): + """""" + + def GetName(self): + """ + 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): + """""" + # Silkscreen parameters + + self.AddParam("Barcode", "Pixel Width", self.uMM, 0.20) + self.AddParam("Barcode", "Height", self.uMM, 3.0) + self.AddParam("Barcode", "Margin", self.uMM, 2.0) + self.AddParam("Barcode", "Contents", self.uString, 'BARCODE') + self.AddParam("Caption", "Enabled", self.uBool, True) + self.AddParam("Caption", "Height", self.uMM, 1.2) + self.AddParam("Caption", "Thickness", self.uMM, 0.12) + + def CheckParameters(self): + """ + """ + + # Reset constants + self.CourtyardLineWidth = pcbnew.FromMM(0.05) + + # Set bar height to the greater of 6.35mm or 0.15*L + # Set quiet width to 10*X + + # User-defined parameters + + # Create barcode object + self.Barcode = Uss39('=' + str(self.parameters['Barcode']['*Contents'])) + self.X = int(self.parameters['Barcode']['Pixel Width']) + self.module.Value().SetText( str(self.Barcode) ) + + self.C = len(str(self.Barcode)) + + # Inter-character gap + if self.X < 0.250: + self.I = pcbnew.FromMM(3.15) + else: + self.I = (2 * self.X) if (2*self.X) > pcbnew.FromMM(1.35) else pcbnew.FromMM(1.35) + + # Wide to narrow ratio + if self.X >= pcbnew.FromMM(0.508): + self.N = pcbnew.FromMM(int((2.0+3.0)/2)) + else: + self.N = pcbnew.FromMM(int((2.2+3.0)/2)) + + self.H = self.parameters['Barcode']['Height'] + + 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 + + + def __drawBar__(self, bit, x): + """ + """ + offset = (bit + 1) * self.X + return x + offset + + def __drawSpace__(self, bit, x): + """ + """ + self.draw.SetLayer(pcbnew.F_SilkS) + self.draw.SetWidth(self.X) + self.draw.Line(x, 0, x, self.H) + + if (bit == 1): + 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, 0, x + self.X, 0) + self.draw.Line(x, self.H, x + self.X, self.H) + + offset = (bit + 1) * self.X + return x + offset + + def drawBars(self): + """ + """ + x = 0 + bars = self.Barcode.getBarCodePattern() + for index in range(0, len(bars), 2): + # Draw bar + barBit = bars[index] + x = self.__drawBar__(barBit, x) + + # Draw space + if index < len(bars)-1: + spaceBit = bars[index + 1] + x = self.__drawSpace__(spaceBit, x) + return x + + def drawQuietZone(self, x0, y0, width, height): + """ + """ + self.draw.SetLayer(pcbnew.F_SilkS) + self.draw.SetWidth(self.X) + + + for offset in range(0, int(self.Q), int(self.X/2)): + xoffset = offset + self.X + yoffset = offset + self.X/2 + self.draw.Line(x0 - xoffset, -yoffset, width + xoffset, -yoffset) + self.draw.Line(x0 - xoffset, self.H+yoffset, width + xoffset, self.H+yoffset) + self.draw.Line(x0 - xoffset, -yoffset, x0-xoffset, self.H+yoffset) + self.draw.Line(width + xoffset, -yoffset, width+xoffset, self.H+yoffset) + + def BuildThisFootprint(self): + """ + """ + + # Draw bars + x = self.drawBars() + + # Draw quiet zone + self.drawQuietZone(0, 0, x, self.H) + + # Draw courtyard origin + self.draw.SetLayer(pcbnew.F_CrtYd) + self.draw.SetWidth(self.CourtyardLineWidth) + ch_lim = pcbnew.FromMM(0.35) + self.draw.Line(-ch_lim, 0, ch_lim, 0) + self.draw.Line(0, -ch_lim, 0, ch_lim) + self.draw.Circle(0, 0, pcbnew.FromMM(0.25)) + self.module.Value().SetLayer(pcbnew.F_Fab) + +Uss39Wizard().register()