Python fp wizards: fix a few issues in qrcode_footprint_wizard.py

Fixes: lp:1828744
https://bugs.launchpad.net/kicad/+bug/1828744
This commit is contained in:
jean-pierre charras 2019-05-13 13:02:58 +02:00
parent 7a715904ad
commit 92ccb766ab
1 changed files with 42 additions and 13 deletions

View File

@ -29,8 +29,8 @@ class QRCodeWizard(FootprintWizardBase.FootprintWizard):
GetValue = lambda self: self.module.Value().GetText()
def GenerateParameterList(self):
self.AddParam("Barcode", "Pixel Width", self.uMM, 0.5, min_value=0.4)
self.AddParam("Barcode", "Border", self.uInteger, 0)
self.AddParam("Barcode", "Qr Pixel Width", self.uMM, 0.5, min_value=0.4)
self.AddParam("Barcode", "Border Margin (Px)", self.uInteger, 0)
self.AddParam("Barcode", "Contents", self.uString, 'Example')
self.AddParam("Barcode", "Negative", self.uBool, False)
self.AddParam("Barcode", "Use SilkS layer", self.uBool, False)
@ -43,16 +43,19 @@ class QRCodeWizard(FootprintWizardBase.FootprintWizard):
def CheckParameters(self):
self.Barcode = str(self.parameters['Barcode']['Contents'])
self.X = self.parameters['Barcode']['Pixel Width']
self.X = self.parameters['Barcode']['Qr Pixel Width']
self.negative = self.parameters['Barcode']['Negative']
self.UseSilkS = self.parameters['Barcode']['Use SilkS layer']
self.UseCu = self.parameters['Barcode']['Use Cu layer']
self.border = int(self.parameters['Barcode']['Border'])
self.border = int(self.parameters['Barcode']['Border Margin (Px)'])
self.textHeight = int(self.parameters['Caption']['Height'])
self.textThickness = int(self.parameters['Caption']['Thickness'])
self.textWidth = int(self.parameters['Caption']['Width'])
self.module.Value().SetText(str(self.Barcode))
if self.border < 0:
self.border = 0
# Build Qrcode
self.qr = qrcode.QRCode()
self.qr.setTypeNumber(4)
@ -61,7 +64,7 @@ class QRCodeWizard(FootprintWizardBase.FootprintWizard):
self.qr.addData(str(self.Barcode))
self.qr.make()
def drawSquareArea( self, layer, size, xposition, yposition):
def drawPixelSquareArea( self, layer, size, xposition, yposition):
# creates a EDGE_MODULE of polygon type. The polygon is a square
polygon = pcbnew.EDGE_MODULE(self.module)
polygon.SetShape(pcbnew.S_POLYGON)
@ -76,23 +79,24 @@ class QRCodeWizard(FootprintWizardBase.FootprintWizard):
return polygon
def _drawPixel(self, xposition, yposition):
def _drawQrPixel(self, xposition, yposition):
# build a rectangular pad as a dot on copper layer,
# and a polygon (a square) on silkscreen
if self.UseCu:
pad = pcbnew.D_PAD(self.module)
pad.SetSize(pcbnew.wxSize(self.X, self.X))
pad.SetPosition(pcbnew.wxPoint(xposition,yposition))
pad_pos = pcbnew.wxPoint(xposition,yposition)
pad.SetPosition(pad_pos)
pad.SetPos0(pad_pos)
pad.SetShape(pcbnew.PAD_SHAPE_RECT)
pad.SetAttribute(pcbnew.PAD_ATTRIB_SMD)
pad.SetName("")
layerset = pcbnew.LSET()
layerset.AddLayer(pcbnew.F_Cu)
layerset.AddLayer(pcbnew.F_Mask)
pad.SetLayerSet( layerset )
self.module.Add(pad)
if self.UseSilkS:
polygon=self.drawSquareArea(pcbnew.F_SilkS, self.X, xposition, yposition)
polygon=self.drawPixelSquareArea(pcbnew.F_SilkS, self.X, xposition, yposition)
self.module.Add(polygon)
@ -102,6 +106,7 @@ class QRCodeWizard(FootprintWizardBase.FootprintWizard):
sz = self.qr.modules.__len__() + (self.border * 2)
arrayToDraw = [ [ 0 for a in range(sz) ] for b in range(sz) ]
lineposition = self.border
for i in self.qr.modules:
columnposition = self.border
for j in i:
@ -114,9 +119,12 @@ class QRCodeWizard(FootprintWizardBase.FootprintWizard):
# used many times...
half_number_of_elements = arrayToDraw.__len__() / 2
area_width = arrayToDraw.__len__()*self.X + self.border*2
# Center position of QrCode
yposition = - int(half_number_of_elements * self.X)
area_height = arrayToDraw.__len__()*self.X + self.border*2
for line in arrayToDraw:
xposition = - int(half_number_of_elements * self.X)
for pixel in line:
@ -130,19 +138,40 @@ class QRCodeWizard(FootprintWizardBase.FootprintWizard):
# 1 | 1 | 0
# => Draw as Xor
if self.negative != pixel: # Xor...
self._drawPixel(xposition, yposition)
self._drawQrPixel(xposition, yposition)
xposition += self.X
yposition += self.X
#int((5 + half_number_of_elements) * self.X))
# Add value field
textPosition = int((self.textHeight) + ((1 + half_number_of_elements) * self.X))
self.module.Value().SetPosition(pcbnew.wxPoint(0, - textPosition))
pos = pcbnew.wxPoint(0, - textPosition)
self.module.Value().SetPosition(pos)
self.module.Value().SetPos0(pos)
self.module.Value().SetTextHeight(self.textHeight)
self.module.Value().SetTextWidth(self.textWidth)
self.module.Value().SetThickness(self.textThickness)
self.module.Reference().SetPosition(pcbnew.wxPoint(0, textPosition))
# Add Reference field
pos = pcbnew.wxPoint(0, textPosition)
self.module.Reference().SetPosition(pos)
self.module.Reference().SetPos0(pos)
self.module.Reference().SetTextHeight(self.textHeight)
self.module.Reference().SetTextWidth(self.textWidth)
self.module.Reference().SetThickness(self.textThickness)
self.module.Value().SetLayer(pcbnew.F_SilkS)
#build the footprint courtyard
self.draw.SetLayer( pcbnew.F_CrtYd )
self.draw.SetLineThickness( pcbnew.FromMM( 0.05 ) ) #Default per KLC F5.1 as of 12/2018
cr_margin = pcbnew.FromMM( 0.1 )
self.draw.Box(0, 0, area_width + cr_margin*2, area_height + cr_margin*2)
#build the footprint solder mask: the solder mask covers all copper pads
if self.UseCu:
self.draw.SetLineThickness( 0 )
sm_margin = pcbnew.FromMM( 0.05 )
polygon=self.drawPixelSquareArea(pcbnew.F_Mask, area_width + sm_margin*2, 0, 0)
self.module.Add(polygon)
QRCodeWizard().register()