summaryrefslogtreecommitdiff
path: root/pcbnew/scripting/plugins/zip_wizard.py
diff options
context:
space:
mode:
Diffstat (limited to 'pcbnew/scripting/plugins/zip_wizard.py')
-rw-r--r--pcbnew/scripting/plugins/zip_wizard.py201
1 files changed, 201 insertions, 0 deletions
diff --git a/pcbnew/scripting/plugins/zip_wizard.py b/pcbnew/scripting/plugins/zip_wizard.py
new file mode 100644
index 0000000..4e0f477
--- /dev/null
+++ b/pcbnew/scripting/plugins/zip_wizard.py
@@ -0,0 +1,201 @@
+# 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 as HFPW
+import PadArray as PA
+
+
+class RowedFootprint(HFPW.HelpfulFootprintWizardPlugin):
+
+ pad_count_key = '#pad count'
+ line_count_key = '#line count'
+ pad_vertical_size_key = 'pad vertical size'
+ pad_horizontal_size_key = 'pad horizontal size'
+ line_spacing_key = 'line spacing'
+ pad_pitch_key = 'pad pitch'
+ drill_size_key = 'drill size'
+
+ courtyard_x_margin_key = 'courtyard x margin'
+ courtyard_y_margin_key = 'courtyard y margin'
+ outline_x_margin_key = 'outline x margin'
+ outline_y_margin_key = 'outline y margin'
+ silkscreen_inside_key = 'silk screen inside'
+
+ def GenerateParameterList(self):
+
+ # defaults for a ZIP package
+ self.AddParam("Pads", self.pad_count_key, self.uNatural, 24)
+ self.AddParam("Pads", self.line_count_key, self.uNatural, 2)
+ self.AddParam("Body", self.silkscreen_inside_key, self.uBool, False)
+ self.AddParam("Body", self.courtyard_x_margin_key, self.uMM, 1)
+ self.AddParam("Body", self.courtyard_y_margin_key, self.uMM, 1)
+
+ def CheckParameters(self):
+ self.CheckParamInt("Pads", '*' + self.pad_count_key)
+ self.CheckParamInt("Pads", '*' + self.line_count_key)
+
+ # can do this internally to parameter manager?
+ self.CheckParamBool("Body", '*' + self.silkscreen_inside_key)
+
+ def BuildThisFootprint(self):
+ pads = self.parameters["Pads"]
+ body = self.parameters["Body"]
+
+ pad_count = pads['*' + self.pad_count_key]
+ pad_Vsize = pads[self.pad_vertical_size_key]
+ pad_Hsize = pads[self.pad_horizontal_size_key]
+ line_pitch = pads[self.line_spacing_key]
+ pad_pitch = pads[self.pad_pitch_key]
+ line_count = pads['*' + self.line_count_key]
+
+ if line_count == 1:
+ singleline = True
+ else:
+ singleline = False
+
+ # add in the pads
+ pad = self.GetPad()
+
+ array = PA.PadZGridArray(pad, pad_count, line_count, line_pitch, pad_pitch)
+ array.AddPadsToModule(self.draw)
+
+ # draw the Silk Screen
+ pads_per_line = pad_count // line_count
+ row_length = pad_pitch * (pads_per_line - 1) # fenceposts
+ ssx_offset = pad_Hsize / 2 + body[self.outline_x_margin_key]
+ ssy_offset = pad_Vsize / 2 + body[self.outline_y_margin_key]
+
+ pin1posX = pad_pitch * (pad_count - 1) / 2
+ pin1posY = line_pitch * (line_count - 1) / 2
+ leftx = pin1posX + ssx_offset
+ lowy = pin1posY + ssy_offset
+
+ cornery = lowy
+
+ # body inside pads is possible only for 2 rows.
+ # for other values, there is no room
+ linew = self.draw.GetLineTickness()
+ if body['*'+self.silkscreen_inside_key] and line_count == 2:
+ cornery = pin1posY - ssy_offset
+ if cornery < linew:
+ cornery = linew
+
+ self.DrawBox(leftx*2, cornery*2)
+
+ # Courtyard
+ cmarginx = body[self.courtyard_x_margin_key]
+ cmarginy = body[self.courtyard_y_margin_key]
+ self.draw.SetLayer(pcbnew.F_CrtYd)
+ sizex = (pin1posX + cmarginx) * 2 + pad_Hsize
+ sizey = (pin1posY + cmarginy) * 2 + pad_Vsize
+ self.draw.Box(0, 0, sizex, sizey)
+
+ #reference and value
+ text_size = self.GetTextSize() # IPC nominal
+ t_posy = lowy + text_size
+
+ self.draw.Value(0, t_posy, text_size)
+ self.draw.Reference(0, -t_posy, text_size)
+
+ def DrawBox(self, sizex, sizey):
+
+ # ----------
+ # | 2 4 6 8|
+ # |1 3 5 7 |
+ # \---------
+ setback = pcbnew.FromMM(1)
+
+ if setback > sizey/2:
+ setback = sizey/2
+
+ self.draw.BoxWithDiagonalAtCorner(0, 0, sizex, sizey, setback, self.draw.flipY)
+
+
+class ZIPWizard(RowedFootprint):
+
+ def GetName(self):
+ return "ZIP"
+
+ def GetDescription(self):
+ return "N lines Zip Package Footprint Wizard"
+
+ def GenerateParameterList(self):
+ RowedFootprint.GenerateParameterList(self)
+
+ self.AddParam("Pads", self.pad_pitch_key, self.uMM, 1.27)
+ self.AddParam("Pads", self.pad_horizontal_size_key, self.uMM, 1.2)
+ self.AddParam("Pads", self.pad_vertical_size_key, self.uMM, 2)
+ self.AddParam("Pads", self.line_spacing_key, self.uMM, 2.54)
+ self.AddParam("Pads", self.drill_size_key, self.uMM, 0.8)
+ self.AddParam("Body", self.outline_x_margin_key, self.uMM, 1)
+ self.AddParam("Body", self.outline_y_margin_key, self.uMM, 0.5)
+
+ def GetValue(self):
+ rows = self.parameters["Pads"]['*' + self.line_count_key]
+ pad_cnt = self.parameters["Pads"]['*' + self.pad_count_key]
+
+ if rows == 1:
+ name = "SIP"
+ elif rows == 2:
+ name = "ZIP"
+ else: # triple and up aren't really a thing, but call it something!
+ name = "xIP"
+
+ return "%s-%d" % (name, pad_cnt)
+
+ def GetPad(self):
+ pad_Vsize = self.parameters["Pads"][self.pad_vertical_size_key]
+ pad_Hsize = self.parameters["Pads"][self.pad_horizontal_size_key]
+ drill = self.parameters["Pads"][self.drill_size_key]
+ return PA.PadMaker(self.module).THPad(
+ pad_Vsize, pad_Hsize, drill, shape=pcbnew.PAD_SHAPE_OVAL)
+
+ZIPWizard().register()
+
+
+class ZOICWizard(RowedFootprint):
+
+ def GetName(self):
+ return "ZOIC"
+
+ def GetDescription(self):
+ return "ZOIC, etc, Footprint Wizard"
+
+ def GetValue(self):
+ return "%s-%d" % ("ZOIC", self.parameters["Pads"]['*' + self.pad_count_key])
+
+ def GenerateParameterList(self):
+ RowedFootprint.GenerateParameterList(self)
+
+ #and override some of them
+ self.AddParam("Pads", self.pad_pitch_key, self.uMM, 0.6)
+ self.AddParam("Pads", self.pad_horizontal_size_key, self.uMM, 0.6)
+ self.AddParam("Pads", self.pad_vertical_size_key, self.uMM, 1.8)
+ self.AddParam("Pads", self.line_spacing_key, self.uMM, 5.2)
+
+ self.AddParam("Body", self.outline_x_margin_key, self.uMM, 0.5)
+ self.AddParam("Body", self.outline_y_margin_key, self.uMM, 1)
+
+ def GetPad(self):
+ pad_Vsize = self.parameters["Pads"][self.pad_vertical_size_key]
+ pad_Hsize = self.parameters["Pads"][self.pad_horizontal_size_key]
+ return PA.PadMaker(self.module).SMDPad(
+ pad_Vsize, pad_Hsize, shape=pcbnew.PAD_SHAPE_RECT)
+
+ZOICWizard().register()