← Back to team overview

kicad-developers team mailing list archive

Re: [PATCH] barcode wizard - cleanup

 

In response to a message written on 23.08.2015, 17:18, from Daniel Dawid Majewski:
Attached patch provides following changes:
- rename to conventional name
- compact & clear code
My mistake, I was sent wrong file, tunned up patch and proof of working in attachment.

--
Best Regards,
LordBlick

Attachment: Barcode screenshoot.png
Description: PNG image

=== renamed file 'pcbnew/scripting/plugins/uss39_barcode.py' => 'pcbnew/scripting/plugins/uss39_barcode_wizard.py' (properties changed: -x to +x)
--- pcbnew/scripting/plugins/uss39_barcode.py	2015-08-23 13:06:39 +0000
+++ pcbnew/scripting/plugins/uss39_barcode_wizard.py	2015-08-23 15:48:22 +0000
@@ -14,158 +14,49 @@
 #  MA 02110-1301, USA.
 
 from __future__ import division
-import pcbnew
+import pcbnew as B
 
 import HelpfulFootprintWizardPlugin
-import PadArray as PA
-import math
-
 
 '''
 Created on Jan 16, 2015
 
 @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:
-    """
-    """
-
-    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 __init__(self, text):
+        self.Text = self.makePrintable(text)
+
+    __str__ = lambda self: self.Text
+    makePrintable = lambda self, text: ''.join((c for c in text.upper() if ptd.has_key(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
+        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):
-    """"""
-
-    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()
+    GetName = lambda self: 'BARCODE USS-39'
+    GetDescription = lambda self: 'USS-39 Barcode'
+    GetReferencePrefix = lambda self: 'BARCODE'
+    GetValue = lambda self: 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)
@@ -175,75 +66,54 @@
         self.AddParam("Caption", "Thickness", self.uMM, 0.12)
 
     def CheckParameters(self):
-        """
-        """
-
         # 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 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)
+            self.I = B.FromMM(3.15)
         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
-        if self.X >= pcbnew.FromMM(0.508):
-            self.N = pcbnew.FromMM(int((2.0+3.0)/2))
+        if self.X >= B.FromMM(0.508):
+            self.N = B.FromMM(int((2.0+3.0)/2))
         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.Q = (10 * self.X) if (10 * self.X) >  pcbnew.FromMM(6.35) else pcbnew.FromMM(6.35)
-
+        self.Q = (10 * self.X) if (10 * self.X) >  B.FromMM(6.35) else B.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.SetLayer(B.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]
@@ -251,12 +121,9 @@
         return x
 
     def drawQuietZone(self, x0, y0, width, height):
-        """
-        """
-        self.draw.SetLayer(pcbnew.F_SilkS)
+        self.draw.SetLayer(B.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
@@ -266,22 +133,17 @@
             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.SetLayer(B.F_CrtYd)
         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(0, -ch_lim, 0, ch_lim)
-        self.draw.Circle(0, 0, pcbnew.FromMM(0.25))
-        self.module.Value().SetLayer(pcbnew.F_Fab)
+        self.draw.Circle(0, 0, B.FromMM(0.25))
+        self.module.Value().SetLayer(B.F_Fab)
 
 Uss39Wizard().register()


Follow ups

References