Footprint wizard: fixes and enhancements in python scripts.

This commit is contained in:
jean-pierre charras 2015-10-31 12:54:48 +01:00
parent ad2c4b807b
commit c94a5dd46f
23 changed files with 4465 additions and 5572 deletions

View File

@ -3,29 +3,29 @@ EESchema-LIBRARY Version 2.3
#
# +12V
#
DEF +12V #PWR 0 0 N Y 1 F P
F0 "#PWR" 0 -50 20 H I C CNN
F1 "+12V" 0 100 30 H V C CNN
DEF +12V #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN
F1 "+12V" 0 140 50 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
X +12V 1 0 0 0 U 20 30 0 0 W N
C 0 60 20 0 1 0 N
P 3 0 1 0 0 0 0 40 0 40 N
P 2 0 1 0 -30 50 0 100 N
P 2 0 1 0 0 0 0 100 N
P 2 0 1 0 0 100 30 50 N
X +12V 1 0 0 0 U 50 50 1 1 W N
ENDDRAW
ENDDEF
#
# -12V
#
DEF -12V #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 130 20 H I C CNN
F1 "-12V" 0 100 30 H V C CNN
DEF -12V #PWR 0 0 Y Y 1 F N
F0 "#PWR" 0 100 50 H I C CNN
F1 "-12V" 0 150 50 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
X -12V 1 0 0 0 U 20 20 0 0 W N
P 3 0 1 0 0 0 0 50 0 50 N
P 7 0 1 0 0 80 30 50 -20 50 -30 50 0 80 0 80 0 80 F
P 6 0 1 0 0 0 0 50 30 50 0 100 -30 50 0 50 F
ENDDRAW
ENDDEF
#
@ -87,20 +87,22 @@ ENDDEF
# C
#
DEF C C 0 10 N Y 1 F N
F0 "C" 0 100 40 H V L CNN
F1 "C" 6 -85 40 H V L CNN
F0 "C" 25 100 50 H V L CNN
F1 "C" 25 -100 50 H V L CNN
F2 "" 38 -150 30 H V C CNN
F3 "" 0 100 30 H V C CNN
F3 "" 0 0 60 H V C CNN
$FPLIST
SM*
C?
C1-1
C_????_*
C_????
SMD*_c
Capacitor*
$ENDFPLIST
DRAW
P 2 0 1 20 -80 -30 80 -30 N
P 2 0 1 20 -80 30 80 30 N
X ~ 1 0 200 170 D 40 40 1 1 P
X ~ 2 0 -200 170 U 40 40 1 1 P
X ~ 1 0 150 110 D 40 40 1 1 P
X ~ 2 0 -150 110 U 40 40 1 1 P
ENDDRAW
ENDDEF
#
@ -151,21 +153,29 @@ ENDDEF
#
# CP
#
DEF CP C 0 10 N N 1 F N
F0 "C" 50 100 40 H V L CNN
F1 "CP" 50 -100 40 H V L CNN
F2 "" 100 -150 30 H V C CNN
F3 "" 50 100 30 H V C CNN
ALIAS CAPAPOL
DEF CP C 0 10 N Y 1 F N
F0 "C" 25 100 50 H V L CNN
F1 "CP" 25 -100 50 H V L CNN
F2 "" 38 -150 30 H V C CNN
F3 "" 0 0 60 H V C CNN
$FPLIST
CP*
SM*
Elko*
TantalC*
C*elec
c_elec*
SMD*_Pol
$ENDFPLIST
DRAW
P 4 0 1 8 -80 50 -80 -50 80 -50 80 50 N
P 4 0 1 0 -50 50 -50 -20 50 -20 50 50 F
X ~ 1 0 200 150 D 40 40 1 1 P
X ~ 2 0 -200 150 U 40 40 1 1 P
S -90 20 -90 40 0 1 0 N
S -90 20 90 20 0 1 0 N
S -70 90 -30 90 0 1 0 N
S -50 70 -50 110 0 1 0 N
S 90 -20 -90 -40 0 1 0 F
S 90 40 -90 40 0 1 0 N
S 90 40 90 20 0 1 0 N
X ~ 1 0 150 110 D 40 40 1 1 P
X ~ 2 0 -150 110 U 40 40 1 1 P
ENDDRAW
ENDDEF
#
@ -331,7 +341,7 @@ ENDDEF
#
# DIODE
#
DEF DIODE D 0 40 N N 1 F N
DEF DIODE D 0 0 Y Y 1 F N
F0 "D" 0 100 40 H V C CNN
F1 "DIODE" 0 -100 40 H V C CNN
F2 "" 0 0 60 H V C CNN
@ -343,21 +353,21 @@ $ENDFPLIST
DRAW
P 2 0 1 6 50 50 50 -50 N
P 3 0 1 0 -50 50 50 0 -50 -50 F
X A 1 -200 0 150 R 40 40 1 1 P
X K 2 200 0 150 L 40 40 1 1 P
X A 1 -200 0 150 R 20 20 1 1 P
X K 2 200 0 150 L 20 20 1 1 P
ENDDRAW
ENDDEF
#
# GND
#
DEF ~GND #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 0 30 H I C CNN
F1 "GND" 0 -70 30 H I C CNN
DEF GND #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN
F1 "GND" 0 -123 30 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 4 0 1 0 -50 0 0 -50 50 0 -50 0 N
X GND 1 0 0 0 U 30 30 1 1 W N
P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N
X GND 1 0 0 0 D 20 30 1 1 W N
ENDDRAW
ENDDEF
#
@ -378,12 +388,12 @@ $FPLIST
LEDV
$ENDFPLIST
DRAW
P 2 0 1 0 50 50 50 -50 N
P 3 0 1 0 -50 50 50 0 -50 -50 F
P 3 0 1 0 65 -40 110 -80 105 -55 N
P 3 0 1 0 80 -25 125 -65 120 -40 N
X A 1 -200 0 150 R 40 40 1 1 P
X K 2 200 0 150 L 40 40 1 1 P
P 2 0 1 0 -50 50 -50 -50 N
P 3 0 1 0 -80 -25 -125 -65 -120 -40 N
P 3 0 1 0 -65 -40 -110 -80 -105 -55 N
P 3 0 1 0 50 50 -50 0 50 -50 F
X K 1 -200 0 150 R 40 40 1 1 P
X A 2 200 0 150 L 40 40 1 1 P
ENDDRAW
ENDDEF
#
@ -428,21 +438,18 @@ ENDDEF
# R
#
DEF R R 0 0 N Y 1 F N
F0 "R" 80 0 40 V V C CNN
F1 "R" 7 1 40 V V C CNN
F0 "R" 80 0 50 V V C CNN
F1 "R" 0 0 50 V V C CNN
F2 "" -70 0 30 V V C CNN
F3 "" 0 0 30 H V C CNN
$FPLIST
R?
SM0603
SM0805
R?-*
SM1206
R_*
Resistor_*
$ENDFPLIST
DRAW
S -40 150 40 -150 0 1 12 N
X ~ 1 0 250 100 D 60 60 1 1 P
X ~ 2 0 -250 100 U 60 60 1 1 P
S -40 -100 40 100 0 1 10 N
X ~ 1 0 150 50 D 60 60 1 1 P
X ~ 2 0 -150 50 U 60 60 1 1 P
ENDDRAW
ENDDEF
#
@ -550,14 +557,14 @@ ENDDEF
# VCC
#
DEF VCC #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 100 30 H I C CNN
F1 "VCC" 0 100 30 H V C CNN
F0 "#PWR" 0 -150 50 H I C CNN
F1 "VCC" 0 150 50 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
X VCC 1 0 0 0 U 20 20 0 0 W N
C 0 50 20 0 1 0 N
P 3 0 1 0 0 0 0 30 0 30 N
C 0 75 25 0 1 0 N
P 2 0 1 0 0 0 0 50 N
X VCC 1 0 0 0 U 50 50 1 1 W N
ENDDRAW
ENDDEF
#

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
update=18/05/2015 09:09:57
update=30/10/2015 11:04:44
version=1
last_client=kicad
[pcbnew]
@ -84,5 +84,6 @@ version=1
version=1
LibDir=
[eeschema/libraries]
LibName1=carte_test_schlib
LibName2=power
LibName1=device
LibName2=carte_test_schlib
LibName3=power

File diff suppressed because it is too large Load Diff

View File

@ -1,34 +1,6 @@
EESchema-LIBRARY Version 2.3
#encoding utf-8
#
# +12V
#
DEF +12V #PWR 0 0 N Y 1 F P
F0 "#PWR" 0 -50 20 H I C CNN
F1 "+12V" 0 100 30 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
X +12V 1 0 0 0 U 20 30 0 0 W N
C 0 60 20 0 1 0 N
P 3 0 1 0 0 0 0 40 0 40 N
ENDDRAW
ENDDEF
#
# -12V
#
DEF -12V #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 130 20 H I C CNN
F1 "-12V" 0 100 30 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
X -12V 1 0 0 0 U 20 20 0 0 W N
P 3 0 1 0 0 0 0 50 0 50 N
P 7 0 1 0 0 80 30 50 -20 50 -30 50 0 80 0 80 0 80 F
ENDDRAW
ENDDEF
#
# 74HCT04
#
DEF 74HCT04 U 0 30 Y Y 6 F N
@ -331,7 +303,7 @@ ENDDEF
#
# DIODE
#
DEF DIODE D 0 40 N N 1 F N
DEF DIODE D 0 0 Y Y 1 F N
F0 "D" 0 100 40 H V C CNN
F1 "DIODE" 0 -100 40 H V C CNN
F2 "" 0 0 60 H V C CNN
@ -343,21 +315,8 @@ $ENDFPLIST
DRAW
P 2 0 1 6 50 50 50 -50 N
P 3 0 1 0 -50 50 50 0 -50 -50 F
X A 1 -200 0 150 R 40 40 1 1 P
X K 2 200 0 150 L 40 40 1 1 P
ENDDRAW
ENDDEF
#
# GND
#
DEF ~GND #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 0 30 H I C CNN
F1 "GND" 0 -70 30 H I C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 4 0 1 0 -50 0 0 -50 50 0 -50 0 N
X GND 1 0 0 0 U 30 30 1 1 W N
X K 1 200 0 150 L 20 20 1 1 P
X A 2 -200 0 150 R 20 20 1 1 P
ENDDRAW
ENDDEF
#
@ -547,20 +506,6 @@ X VCCA 16 100 900 300 D 50 50 1 2 W
ENDDRAW
ENDDEF
#
# VCC
#
DEF VCC #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 100 30 H I C CNN
F1 "VCC" 0 100 30 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
X VCC 1 0 0 0 U 20 20 0 0 W N
C 0 50 20 0 1 0 N
P 3 0 1 0 0 0 0 30 0 30 N
ENDDRAW
ENDDEF
#
# XC95108PC84
#
DEF XC95108PC84 U 0 30 Y Y 1 F N

View File

@ -0,0 +1,7 @@
(fp_lib_table
(lib (name Capacitors_SMD)(type KiCad)(uri "$(KISYSMOD)\\Capacitors_SMD.pretty")(options "")(descr ""))
(lib (name Sockets_DIP)(type KiCad)(uri "$(KISYSMOD)\\Sockets_DIP.pretty")(options "")(descr ""))
(lib (name Pin_Headers)(type KiCad)(uri "$(KISYSMOD)/Pin_Headers.pretty")(options "")(descr ""))
(lib (name SMD_Packages)(type KiCad)(uri "$(KISYSMOD)/SMD_Packages.pretty")(options "")(descr ""))
(lib (name Sockets)(type KiCad)(uri "$(KISYSMOD)/Sockets.pretty")(options "")(descr ""))
)

File diff suppressed because it is too large Load Diff

View File

@ -53,8 +53,8 @@ DIALOG_FOOTPRINT_WIZARD_LIST::DIALOG_FOOTPRINT_WIZARD_LIST( wxWindow* aParent )
// Choose selection mode and insert the needed rows
m_footprintWizardsGrid->SetSelectionMode( wxGrid::wxGridSelectRows );
m_footprintWizardsGrid->InsertRows( 0, n_wizards, true );
m_footprintGeneratorsGrid->SetSelectionMode( wxGrid::wxGridSelectRows );
m_footprintGeneratorsGrid->InsertRows( 0, n_wizards, true );
// Put all wizards in the list
for( int i=0; i<n_wizards; i++ )
@ -64,14 +64,14 @@ DIALOG_FOOTPRINT_WIZARD_LIST::DIALOG_FOOTPRINT_WIZARD_LIST( wxWindow* aParent )
wxString description = wizard->GetDescription();
wxString image = wizard->GetImage();
m_footprintWizardsGrid->SetCellValue( i, ROW_NAME, name );
m_footprintWizardsGrid->SetCellValue( i, ROW_DESCR, description );
m_footprintGeneratorsGrid->SetCellValue( i, ROW_NAME, name );
m_footprintGeneratorsGrid->SetCellValue( i, ROW_DESCR, description );
}
// Select the first row
m_footprintWizardsGrid->ClearSelection();
m_footprintWizardsGrid->SelectRow( 0, false );
m_footprintGeneratorsGrid->ClearSelection();
m_footprintGeneratorsGrid->SelectRow( 0, false );
if( m_config )
{
@ -96,11 +96,11 @@ DIALOG_FOOTPRINT_WIZARD_LIST::~DIALOG_FOOTPRINT_WIZARD_LIST()
void DIALOG_FOOTPRINT_WIZARD_LIST::OnCellWizardClick( wxGridEvent& event )
void DIALOG_FOOTPRINT_WIZARD_LIST::OnCellFpGeneratorClick( wxGridEvent& event )
{
int click_row = event.GetRow();
m_footprintWizard = FOOTPRINT_WIZARDS::GetWizard( click_row );
m_footprintWizardsGrid->SelectRow( event.GetRow(), false );
m_footprintGeneratorsGrid->SelectRow( event.GetRow(), false );
}

View File

@ -41,7 +41,7 @@ public:
FOOTPRINT_WIZARD* GetWizard();
private:
void OnCellWizardClick( wxGridEvent& event );
void OnCellFpGeneratorClick( wxGridEvent& event );
};
#endif // _DIALOG_FOOTPRINT_WIZARD_LIST_H_

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Jun 5 2014)
// C++ code generated with wxFormBuilder (version Jun 17 2015)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
@ -16,38 +16,38 @@ DIALOG_FOOTPRINT_WIZARD_LIST_BASE::DIALOG_FOOTPRINT_WIZARD_LIST_BASE( wxWindow*
wxBoxSizer* bSizerMain;
bSizerMain = new wxBoxSizer( wxVERTICAL );
m_footprintWizardsGrid = new wxGrid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
m_footprintGeneratorsGrid = new wxGrid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
// Grid
m_footprintWizardsGrid->CreateGrid( 0, 2 );
m_footprintWizardsGrid->EnableEditing( false );
m_footprintWizardsGrid->EnableGridLines( true );
m_footprintWizardsGrid->EnableDragGridSize( false );
m_footprintWizardsGrid->SetMargins( 0, 0 );
m_footprintGeneratorsGrid->CreateGrid( 0, 2 );
m_footprintGeneratorsGrid->EnableEditing( false );
m_footprintGeneratorsGrid->EnableGridLines( true );
m_footprintGeneratorsGrid->EnableDragGridSize( false );
m_footprintGeneratorsGrid->SetMargins( 0, 0 );
// Columns
m_footprintWizardsGrid->SetColSize( 0, 160 );
m_footprintWizardsGrid->SetColSize( 1, 325 );
m_footprintWizardsGrid->EnableDragColMove( false );
m_footprintWizardsGrid->EnableDragColSize( true );
m_footprintWizardsGrid->SetColLabelSize( 20 );
m_footprintWizardsGrid->SetColLabelValue( 0, _("Name") );
m_footprintWizardsGrid->SetColLabelValue( 1, _("Description") );
m_footprintWizardsGrid->SetColLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE );
m_footprintGeneratorsGrid->SetColSize( 0, 160 );
m_footprintGeneratorsGrid->SetColSize( 1, 325 );
m_footprintGeneratorsGrid->EnableDragColMove( false );
m_footprintGeneratorsGrid->EnableDragColSize( true );
m_footprintGeneratorsGrid->SetColLabelSize( 20 );
m_footprintGeneratorsGrid->SetColLabelValue( 0, _("Name") );
m_footprintGeneratorsGrid->SetColLabelValue( 1, _("Description") );
m_footprintGeneratorsGrid->SetColLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE );
// Rows
m_footprintWizardsGrid->AutoSizeRows();
m_footprintWizardsGrid->EnableDragRowSize( true );
m_footprintWizardsGrid->SetRowLabelSize( 1 );
m_footprintWizardsGrid->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
m_footprintGeneratorsGrid->AutoSizeRows();
m_footprintGeneratorsGrid->EnableDragRowSize( true );
m_footprintGeneratorsGrid->SetRowLabelSize( 1 );
m_footprintGeneratorsGrid->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
// Label Appearance
// Cell Defaults
m_footprintWizardsGrid->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP );
m_footprintWizardsGrid->SetMinSize( wxSize( 485,120 ) );
m_footprintGeneratorsGrid->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP );
m_footprintGeneratorsGrid->SetMinSize( wxSize( 485,120 ) );
bSizerMain->Add( m_footprintWizardsGrid, 1, wxALL|wxEXPAND, 5 );
bSizerMain->Add( m_footprintGeneratorsGrid, 1, wxALL|wxEXPAND, 5 );
m_staticline = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
bSizerMain->Add( m_staticline, 0, wxEXPAND | wxALL, 5 );
@ -68,12 +68,12 @@ DIALOG_FOOTPRINT_WIZARD_LIST_BASE::DIALOG_FOOTPRINT_WIZARD_LIST_BASE( wxWindow*
this->Centre( wxBOTH );
// Connect Events
m_footprintWizardsGrid->Connect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_FOOTPRINT_WIZARD_LIST_BASE::OnCellWizardClick ), NULL, this );
m_footprintGeneratorsGrid->Connect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_FOOTPRINT_WIZARD_LIST_BASE::OnCellFpGeneratorClick ), NULL, this );
}
DIALOG_FOOTPRINT_WIZARD_LIST_BASE::~DIALOG_FOOTPRINT_WIZARD_LIST_BASE()
{
// Disconnect Events
m_footprintWizardsGrid->Disconnect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_FOOTPRINT_WIZARD_LIST_BASE::OnCellWizardClick ), NULL, this );
m_footprintGeneratorsGrid->Disconnect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_FOOTPRINT_WIZARD_LIST_BASE::OnCellFpGeneratorClick ), NULL, this );
}

View File

@ -47,7 +47,7 @@
<property name="size">501,273</property>
<property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
<property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
<property name="title">Footprint Wizards</property>
<property name="title">Footprint Generators</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
@ -157,7 +157,7 @@
<property name="minimize_button">0</property>
<property name="minimum_size">485,120</property>
<property name="moveable">1</property>
<property name="name">m_footprintWizardsGrid</property>
<property name="name">m_footprintGeneratorsGrid</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
@ -183,7 +183,7 @@
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnGridCellChange"></event>
<event name="OnGridCellLeftClick">OnCellWizardClick</event>
<event name="OnGridCellLeftClick">OnCellFpGeneratorClick</event>
<event name="OnGridCellLeftDClick"></event>
<event name="OnGridCellRightClick"></event>
<event name="OnGridCellRightDClick"></event>

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Jun 5 2014)
// C++ code generated with wxFormBuilder (version Jun 17 2015)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
@ -36,19 +36,19 @@ class DIALOG_FOOTPRINT_WIZARD_LIST_BASE : public DIALOG_SHIM
private:
protected:
wxGrid* m_footprintWizardsGrid;
wxGrid* m_footprintGeneratorsGrid;
wxStaticLine* m_staticline;
wxStdDialogButtonSizer* m_sdbSizer;
wxButton* m_sdbSizerOK;
wxButton* m_sdbSizerCancel;
// Virtual event handlers, overide them in your derived class
virtual void OnCellWizardClick( wxGridEvent& event ) { event.Skip(); }
virtual void OnCellFpGeneratorClick( wxGridEvent& event ) { event.Skip(); }
public:
DIALOG_FOOTPRINT_WIZARD_LIST_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Footprint Wizards"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 501,273 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
DIALOG_FOOTPRINT_WIZARD_LIST_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Footprint Generators"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 501,273 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
~DIALOG_FOOTPRINT_WIZARD_LIST_BASE();
};

View File

@ -16,7 +16,7 @@
from __future__ import division
import pcbnew
import FootprintWizardDrawingAids as FpWDA
import HelpfulFootprintWizardPlugin as HFPW

View File

@ -193,7 +193,7 @@ class FootprintWizardDrawingAids:
def TransformRotation(self, x, y, rot, push=True):
"""
Set up and return a transform matrix representing a rotation
about the pooint (x,y), and optionally push onto the stack
about the point (x,y), and optionally push onto the stack
This is performed by a translate-to-origin, rotate, translate-
back sequence
@ -368,7 +368,7 @@ class FootprintWizardDrawingAids:
_PolyLineInternal(pts)
self.PopTransform()
def Reference(self, x, y, size):
def Reference(self, x, y, size, orientation_degree = 0):
"""
Draw the module's reference as the given point.
@ -382,8 +382,9 @@ class FootprintWizardDrawingAids:
self.module.Reference().SetTextPosition(
self.module.Reference().GetPos0())
self.module.Reference().SetSize(text_size)
self.module.Reference().SetOrientation(orientation_degree*10) # internal angles are in 0.1 deg
def Value(self, x, y, size):
def Value(self, x, y, size, orientation_degree = 0):
"""
As for references, draw the module's value
"""
@ -393,6 +394,7 @@ class FootprintWizardDrawingAids:
self.module.Value().SetTextPosition(self.module.Value().GetPos0())
self.module.Value().SetSize(text_size)
self.module.Value().SetLayer(self.DefaultTextValueLayer())
self.module.Value().SetOrientation(orientation_degree*10) # internal angles are in 0.1 deg
def Box(self, x, y, w, h):
"""
@ -408,13 +410,15 @@ class FootprintWizardDrawingAids:
self.Polyline(pts)
def NotchedCircle(self, x, y, r, notch_w, notch_h):
def NotchedCircle(self, x, y, r, notch_w, notch_h, rotate=0):
"""
Circle radus r centred at (x, y) with a raised or depressed notch
at the top
Notch height is measured from the top of the circle radius
"""
self.TransformRotation(x, y, rotate)
# find the angle where the notch vertical meets the circle
angle_intercept = math.asin(notch_w/(2 * r))
@ -433,11 +437,15 @@ class FootprintWizardDrawingAids:
[-sx, sy]]
self.Polyline(pts)
self.PopTransform()
def NotchedBox(self, x, y, w, h, notchW, notchH):
def NotchedBox(self, x, y, w, h, notchW, notchH, rotate=0):
"""
Draw a box with a notch in the top edge
"""
self.TransformRotation(x, y, rotate)
# limit to half the overall width
notchW = min(x + w/2, notchW)
@ -455,6 +463,8 @@ class FootprintWizardDrawingAids:
(x - w/2, y - h/2)
])
self.PopTransform()
def BoxWithDiagonalAtCorner(self, x, y, w, h,
setback=pcbnew.FromMM(1.27), flip=flipNone):
"""

View File

@ -81,9 +81,16 @@ class FootprintWizardParameterManager:
param = "*%s" % param # star prefix for natural
if section not in self.parameters:
if not hasattr(self, 'page_order'):
self.page_order = []
self.page_order.append(section)
self.parameters[section] = {}
if not hasattr(self, 'parameter_order'):
self.parameter_order = {}
self.parameter_order[section] = []
self.parameters[section][param] = val
self.parameter_order[section].append(param)
return error
@ -95,7 +102,7 @@ class FootprintWizardParameterManager:
message = ""
for name, section in self.parameters.iteritems():
message += " %s:" % name
message += " %s:\n" % name
for key, value in section.iteritems():
unit = ""

View File

@ -32,16 +32,14 @@ class PadMaker:
def __init__(self, module):
self.module = module
def THPad(self, w, l, drill, shape=pcbnew.PAD_SHAPE_OVAL):
def THPad(self, Vsize, Hsize, drill, shape=pcbnew.PAD_SHAPE_OVAL, rot_degree = 0):
pad = pcbnew.D_PAD(self.module)
pad.SetSize(pcbnew.wxSize(l, w))
pad.SetSize(pcbnew.wxSize(Hsize, Vsize))
pad.SetShape(shape)
pad.SetAttribute(pcbnew.PAD_ATTRIB_STANDARD)
pad.SetLayerSet(pad.StandardMask())
pad.SetDrillSize(pcbnew.wxSize(drill, drill))
pad.SetOrientation(rot_degree*10) # rotation is in 0.1 degrees
return pad
@ -51,24 +49,20 @@ class PadMaker:
def NPTHRoundPad(self, drill):
pad = pcbnew.D_PAD(self.module)
pad.SetSize(pcbnew.wxSize(drill, drill))
pad.SetShape(pcbnew.PAD_SHAPE_CIRCLE)
pad.SetAttribute(pcbnew.PAD_ATTRIB_HOLE_NOT_PLATED)
pad.SetLayerSet(pad.UnplatedHoleMask())
pad.SetDrillSize(pcbnew.wxSize(drill, drill))
return pad
def SMDPad(self, w, l, shape=pcbnew.PAD_SHAPE_RECT):
def SMDPad(self, Vsize, Hsize, shape=pcbnew.PAD_SHAPE_RECT, rot_degree=0):
pad = pcbnew.D_PAD(self.module)
pad.SetSize(pcbnew.wxSize(l, w))
pad.SetSize(pcbnew.wxSize(Hsize, Vsize))
pad.SetShape(shape)
pad.SetAttribute(pcbnew.PAD_ATTRIB_SMD)
pad.SetLayerSet(pad.SMDMask())
pad.SetOrientation(rot_degree*10) # rotation is in 0.1 degrees
return pad
@ -100,7 +94,6 @@ class PadArray:
self.pad.GetParent().Add(pad)
def GetPad(self, is_first_pad, pos):
if (self.firstPad and is_first_pad):
pad = self.firstPad
else:
@ -108,7 +101,6 @@ class PadArray:
# create a new pad with same characteristics
pad = pad.Duplicate()
pad.SetPos0(pos)
pad.SetPosition(pos)
@ -167,21 +159,56 @@ class PadGridArray(PadArray):
pin1posY = self.centre.y - self.py * (self.ny - 1) / 2
for x in range(0, self.nx):
posX = pin1posX + (x * self.px)
for y in range(self.ny):
posY = pin1posY + (self.py * y)
pos = dc.TransformPoint(posX, posY)
pad = self.GetPad(x == 0 and y == 0, pos)
pad.SetPadName(self.GetName(x,y))
self.AddPad(pad)
class PadZGridArray(PadArray):
def __init__(self, pad, pad_count, line_count, line_pitch,
pad_pitch, centre=pcbnew.wxPoint(0, 0)):
PadArray.__init__(self)
# this pad is more of a "context", we will use it as a source of
# pad data, but not actually add it
self.pad = pad
self.pad_count = int(pad_count)
self.line_count = int(line_count)
self.line_pitch = line_pitch
self.pad_pitch = pad_pitch
self.centre = centre
# right to left, top to bottom
def NamingFunction(self, pad_pos):
return self.firstPadNum + pad_pos
#relocate the pad and add it as many times as we need
def AddPadsToModule(self, dc):
pin1posX = self.centre.x - self.pad_pitch * (self.pad_count - 1) / 2
pin1posY = self.centre.y + self.line_pitch * (self.line_count - 1) / 2
line = 0
for padnum in range(0, self.pad_count):
posX = pin1posX + (padnum * self.pad_pitch)
posY = pin1posY - (self.line_pitch * line)
pos = dc.TransformPoint(posX, posY)
pad = self.GetPad(padnum == 0, pos)
pad.SetPadName(self.GetName(padnum))
self.AddPad(pad)
line += 1
if line >= self.line_count:
line = 0
class PadLineArray(PadGridArray):
def __init__(self, pad, n, pitch, isVertical,
@ -212,9 +239,7 @@ class PadCircleArray(PadArray):
#relocate the pad and add it as many times as we need
def AddPadsToModule(self, dc):
for pin in range(0, self.n):
angle = self.angle_offset + (360 / self.n) * pin
if not self.clockwise:
@ -222,13 +247,9 @@ class PadCircleArray(PadArray):
pos_x = math.sin(angle * math.pi / 180) * self.r
pos_y = -math.cos(angle * math.pi / 180) * self.r
pos = dc.TransformPoint(pos_x, pos_y)
pad = self.GetPad(pin == 0, pos)
pad.SetPadName(self.GetName(pin))
self.AddPad(pad)
class PadCustomArray(PadArray):
@ -239,7 +260,6 @@ class PadCustomArray(PadArray):
def __init__(self, pad, array):
PadArray.__init__(self)
self.pad = pad
self.array = array
def NamingFunction(self, n):
@ -249,11 +269,7 @@ class PadCustomArray(PadArray):
def AddPadsToModule(self, dc):
for i in range(len(self.array)):
pos = dc.TransformPoint(self.array[i][0], self.array[i][1])
pad = self.GetPad(i == 0, pos)
pad.SetPadName(self.GetName(i))
self.AddPad(pad)

View File

@ -62,9 +62,7 @@ class BGAWizard(HFPW.HelpfulFootprintWizardPlugin):
rows = pads["*row count"]
cols = pads["*column count"]
pad_size = pads["pad size"]
pad_size = pcbnew.wxSize(pad_size, pad_size)
pad_pitch = pads["pad pitch"]
# add in the pads
@ -83,6 +81,13 @@ class BGAWizard(HFPW.HelpfulFootprintWizardPlugin):
self.draw.BoxWithDiagonalAtCorner(0, 0, ssx*2, ssy*2,
pads["outline x margin"])
# Courtyard
cmargin = self.draw.GetLineTickness()
self.draw.SetLayer(pcbnew.F_CrtYd)
sizex = (ssx + cmargin) * 2
sizey = (ssy + cmargin) * 2
self.draw.Box(0, 0, sizex, sizey)
#reference and value
text_size = self.GetTextSize() # IPC nominal
ypos = ssy + text_size

View File

@ -57,9 +57,7 @@ class circular_pad_array_wizard(HFPW.HelpfulFootprintWizardPlugin):
pad_size = prm['pad width']
pad = PA.PadMaker(self.module).THPad(
prm['pad width'],
prm['pad width'],
prm['drill'])
prm['pad width'], prm['pad width'], prm['drill'])
array = PA.PadCircleArray(
pad, prm['*n'], prm['circle diameter'] / 2,

View File

@ -38,8 +38,9 @@ class QFPWizard(HelpfulFootprintWizardPlugin.HelpfulFootprintWizardPlugin):
self.AddParam("Pads", "horizontal pitch", self.uMM, 15)
self.AddParam("Pads", "oval", self.uBool, True)
self.AddParam("Pads", "package width", self.uMM, 14)
self.AddParam("Pads", "package height", self.uMM, 14)
self.AddParam("Package", "package width", self.uMM, 14)
self.AddParam("Package", "package height", self.uMM, 14)
self.AddParam("Package", "courtyard margin", self.uMM, 1)
def CheckParameters(self):
self.CheckParamInt("Pads", "*n", is_multiple_of=4)
@ -64,7 +65,8 @@ class QFPWizard(HelpfulFootprintWizardPlugin.HelpfulFootprintWizardPlugin):
pad_shape = pcbnew.PAD_SHAPE_OVAL if pads["*oval"] else pcbnew.PAD_SHAPE_RECT
h_pad = PA.PadMaker(self.module).SMDPad( pad_width, pad_length, shape=pad_shape)
h_pad = PA.PadMaker(self.module).SMDPad( pad_length, pad_width,
shape=pad_shape, rot_degree=90.0)
v_pad = PA.PadMaker(self.module).SMDPad( pad_length, pad_width, shape=pad_shape)
#left row
@ -75,8 +77,7 @@ class QFPWizard(HelpfulFootprintWizardPlugin.HelpfulFootprintWizardPlugin):
#bottom row
pin1Pos = pcbnew.wxPoint(0, v_pitch / 2)
array = PA.PadLineArray(v_pad, pads_per_row, pad_pitch, False,
pin1Pos)
array = PA.PadLineArray(v_pad, pads_per_row, pad_pitch, False, pin1Pos)
array.SetFirstPadInArray(pads_per_row + 1)
array.AddPadsToModule(self.draw)
@ -94,8 +95,8 @@ class QFPWizard(HelpfulFootprintWizardPlugin.HelpfulFootprintWizardPlugin):
array.SetFirstPadInArray(3*pads_per_row + 1)
array.AddPadsToModule(self.draw)
lim_x = pads["package width"] / 2
lim_y = pads["package height"] / 2
lim_x = self.parameters["Package"]["package width"] / 2
lim_y = self.parameters["Package"]["package height"] / 2
inner = (row_len / 2) + pad_pitch
#top left - diagonal
@ -107,6 +108,13 @@ class QFPWizard(HelpfulFootprintWizardPlugin.HelpfulFootprintWizardPlugin):
# bottom right
self.draw.Polyline([(inner, lim_y), (lim_x, lim_y), (lim_x, inner)])
# Courtyard
cmargin = self.parameters["Package"]["courtyard margin"]
self.draw.SetLayer(pcbnew.F_CrtYd)
sizex = (lim_x + cmargin) * 2 + pad_length
sizey = (lim_y + cmargin) * 2 + pad_length
self.draw.Box(0, 0, sizex, sizey)
#reference and value
text_size = self.GetTextSize() # IPC nominal
text_offset = v_pitch / 2 + text_size + pad_length / 2

View File

@ -24,73 +24,98 @@ import PadArray as PA
class RowedGridArray(PA.PadGridArray):
def NamingFunction(self, x, y):
if (x % 2) == 0: # even row, count up
return (x * self.ny) + y + 1
else: # odd row, count down
return (self.ny * (x + 1)) - y
pad_cnt = self.nx*self.ny
if self.ny == 1:
return x+1
if (y % 2) == 0: # upper row, count down
return pad_cnt-x
else: # lower row, count up
return x+1
class RowedFootprint(HFPW.HelpfulFootprintWizardPlugin):
pad_count_key = 'pas count'
row_count_key = 'row count'
row_spacing_key = 'row spacing'
pad_length_key = 'pad length'
pad_width_key = 'pad width'
pad_pitch_key = 'pad pitch'
silkscreen_inside_key = 'silk screen inside'
outline_x_margin_key = 'outline x margin'
outline_y_margin_key = 'outline y margin'
def GenerateParameterList(self):
# defaults for a DIP package
self.AddParam("Pads", "n", self.uNatural, 24)
self.AddParam("Pads", "silk screen inside", self.uBool, False)
self.AddParam("Pads", "row count", self.uNatural, 2)
self.AddParam("Pads", self.pad_count_key, self.uNatural, 24)
self.AddParam("Pads", self.row_count_key, self.uNatural, 2)
self.AddParam("Body", self.silkscreen_inside_key, self.uBool, False)
self.AddParam("Body", self.outline_x_margin_key, self.uMM, 0.5)
self.AddParam("Body", self.outline_y_margin_key, self.uMM, 0.5)
def CheckParameters(self):
self.CheckParamInt("Pads", "*row count", min_value=1, max_value=2)
self.CheckParamInt("Pads", '*' + self.row_count_key, min_value=1, max_value=2)
self.CheckParamInt(
"Pads", "*n",
is_multiple_of=self.parameters["Pads"]["*row count"])
"Pads", '*' + self.pad_count_key,
is_multiple_of=self.parameters["Pads"]['*' + self.row_count_key])
# can do this internally to parameter manager?
self.CheckParamBool("Pads", "*silk screen inside")
self.CheckParamBool("Body", '*' + self.silkscreen_inside_key)
def BuildThisFootprint(self):
pads = self.parameters["Pads"]
num_pads = pads["*n"]
pad_length = pads["pad length"]
pad_width = pads["pad width"]
row_pitch = pads["row spacing"]
pad_pitch = pads["pad pitch"]
num_rows = pads["*row count"]
body = self.parameters["Body"]
num_pads = pads['*' + self.pad_count_key]
pad_length = pads[self.pad_length_key]
pad_width = pads[self.pad_width_key]
row_pitch = pads[self.row_spacing_key]
pad_pitch = pads[self.pad_pitch_key]
num_rows = pads['*' + self.row_count_key]
pads_per_row = num_pads // num_rows
row_length = pad_pitch * (pads_per_row - 1) # fenceposts
# add in the pads
pad = self.GetPad()
pin1_pos = pcbnew.wxPoint(
-((num_rows - 1) * row_pitch) / 2,
-row_length / 2)
array = RowedGridArray(pad, num_rows, pads_per_row, row_pitch,
pad_pitch)
array = RowedGridArray(pad, pads_per_row, num_rows, pad_pitch, row_pitch)
array.AddPadsToModule(self.draw)
# draw the Silk Screen
Hsize = pad_pitch * (num_pads / num_rows - 1)
Vsize = row_pitch * (num_rows - 1)
pin1_posY = -Vsize / 2
pin1_posX = -Hsize / 2
pad_length = pads["pad length"]
pad_width = pads["pad width"]
pad_length = pads[self.pad_length_key]
pad_width = pads[self.pad_width_key]
ssx_offset = -pad_length / 2 - pads["outline x margin"]
ssy_offset = -pad_width / 2 - pads["outline y margin"]
ssx_offset = -pad_width / 2 - body[self.outline_x_margin_key]
ssy_offset = -pad_length / 2 - body[self.outline_y_margin_key]
if pads["*silk screen inside"]:
ssx_offset *= -1
if body['*' + self.silkscreen_inside_key]:
ssy_offset *= -1
ssx = -pin1_pos.x - ssx_offset
ssy = -pin1_pos.y - ssy_offset
ssx = -pin1_posX - ssx_offset
ssy = -pin1_posY - ssy_offset
self.DrawBox(ssx, ssy)
#reference and value
text_size = self.GetTextSize() # IPC nominal
self.draw.Value(0, - ssy - text_size, text_size)
self.draw.Reference(0, ssy + text_size, text_size)
if num_rows == 1:
text_py = ssy + text_size
self.draw.Value(0, -text_py, text_size)
self.draw.Reference(0, text_py, text_size)
else:
text_px = ssx + text_size
# self.draw.Value(text_px, 0, text_size, orientation_degree=90)
self.draw.Value(0, 0, text_size)
self.draw.Reference(-text_px, 0, text_size, orientation_degree=90)
class SDIPWizard(RowedFootprint):
@ -104,34 +129,44 @@ class SDIPWizard(RowedFootprint):
def GenerateParameterList(self):
RowedFootprint.GenerateParameterList(self)
self.AddParam("Pads", "pad pitch", self.uMils, 100)
self.AddParam("Pads", "pad width", self.uMils, 60)
self.AddParam("Pads", "pad length", self.uMils, 150)
self.AddParam("Pads", "row spacing", self.uMils, 300)
self.AddParam("Pads", "drill size", self.uMM, 1)
self.AddParam("Pads", "outline x margin", self.uMM, 0.5)
self.AddParam("Pads", "outline y margin", self.uMM, 1)
self.AddParam("Pads", self.pad_pitch_key, self.uMM, 2.54)
self.AddParam("Pads", self.pad_width_key, self.uMM, 1.2)
self.AddParam("Pads", self.pad_length_key, self.uMM, 2)
self.AddParam("Pads", self.row_spacing_key, self.uMM, 7.52)
self.AddParam("Pads", "drill size", self.uMM, 0.8)
def GetValue(self):
rows = self.parameters["Pads"]["*row count"]
pads = self.parameters["Pads"]
rows = pads['*' + self.row_count_key]
pad_count = pads['*' + self.pad_count_key]
row_dist_mil = pcbnew.Iu2Mils(int(self.parameters["Pads"][self.row_spacing_key])) #int(self.parameters["Pads"][self.row_spacing_key] / 2.54 * 100)
pad_shape = ""
if pads[self.pad_width_key] != pads[self.pad_length_key]:
pad_shape = '_ELL'
if rows == 1:
name = "SIP"
else:
name = "DIP"
return "%s-%d" % (name, pad_count)
return "%s-%d" % (name, self.parameters["Pads"]["*n"])
name = "DIP"
return "%s-%d_%d%s" % (name, pad_count, row_dist_mil, pad_shape)
def GetPad(self):
pad_length = self.parameters["Pads"]["pad length"]
pad_width = self.parameters["Pads"]["pad width"]
pad_length = self.parameters["Pads"][self.pad_length_key]
pad_width = self.parameters["Pads"][self.pad_width_key]
drill = self.parameters["Pads"]["drill size"]
shape = pcbnew.PAD_SHAPE_CIRCLE
if pad_length != pad_width:
shape = pcbnew.PAD_SHAPE_OVAL
return PA.PadMaker(self.module).THPad(
pad_width, pad_length, drill, shape=pcbnew.PAD_SHAPE_OVAL)
pad_length, pad_width, drill, shape=shape)
def DrawBox(self, ssx, ssy):
if self.parameters["Pads"]["*row count"] == 2:
if self.parameters["Pads"]['*' + self.row_count_key] == 2:
# ----------
# |8 7 6 5 |
@ -140,10 +175,12 @@ class SDIPWizard(RowedFootprint):
# ----------
# draw the notch
notchWidth = pcbnew.FromMM(3)
notchHeight = pcbnew.FromMM(1)
notchWidth = ssy/1.5
notchHeight = self.draw.GetLineTickness()*3
self.draw.NotchedBox(0, 0, ssx*2, ssy*2, notchWidth, notchHeight)
# NotchedBox draws the notch on top. Rotate the box 90 degrees
# to have it on the left
self.draw.NotchedBox(0, 0, ssy*2, ssx*2, notchWidth, notchHeight, -90)
else:
# -----------------
# |1|2 3 4 5 6 7 8|
@ -151,9 +188,10 @@ class SDIPWizard(RowedFootprint):
self.draw.Box(0, 0, ssx*2, ssy*2)
#line between pin1 and pin2
pad_pitch = self.parameters["Pads"]["pad pitch"]
line_y = - (self.parameters["Pads"]["*n"] - 2) * pad_pitch / 2
self.draw.HLine(-ssx, line_y, ssx * 2)
pad_pitch = self.parameters["Pads"][self.pad_pitch_key]
pad_cnt = self.parameters["Pads"]['*' + self.pad_count_key]
line_x = ( pad_cnt/2 - 1) * pad_pitch
self.draw.VLine(-line_x, -ssy, ssy * 2)
return ssx, ssy
@ -169,25 +207,23 @@ class SOICWizard(RowedFootprint):
return "SOIC, MSOP, SSOP, TSSOP, etc, footprint wizard"
def GetValue(self):
return "%s-%d" % ("SOIC", self.parameters["Pads"]["*n"])
pad_count = self.parameters["Pads"]['*' + self.pad_count_key]
return "%s-%d" % ("SOIC", pad_count)
def GenerateParameterList(self):
RowedFootprint.GenerateParameterList(self)
#and override some of them
self.AddParam("Pads", "pad pitch", self.uMM, 1.27)
self.AddParam("Pads", "pad width", self.uMM, 0.6)
self.AddParam("Pads", "pad length", self.uMM, 2.2)
self.AddParam("Pads", "row spacing", self.uMM, 5.2)
self.AddParam("Pads", "outline x margin", self.uMM, 0.5)
self.AddParam("Pads", "outline y margin", self.uMM, 0.5)
self.AddParam("Pads", self.pad_pitch_key, self.uMM, 1.27)
self.AddParam("Pads", self.pad_width_key, self.uMM, 0.6)
self.AddParam("Pads", self.pad_length_key, self.uMM, 2.2)
self.AddParam("Pads", self.row_spacing_key, self.uMM, 5.2)
def GetPad(self):
pad_length = self.parameters["Pads"]["pad length"]
pad_width = self.parameters["Pads"]["pad width"]
pad_length = self.parameters["Pads"][self.pad_length_key]
pad_width = self.parameters["Pads"][self.pad_width_key]
return PA.PadMaker(self.module).SMDPad(
pad_width, pad_length, shape=pcbnew.PAD_SHAPE_RECT)
pad_length, pad_width, shape=pcbnew.PAD_SHAPE_RECT)
def DrawBox(self, ssx, ssy):

View File

@ -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()

View File

@ -156,6 +156,7 @@ class FilePlugin(KiCadPlugin):
KiCadPlugin.__init__(self)
from math import ceil, floor, sqrt
class FootprintWizardPlugin(KiCadPlugin):
def __init__(self):
@ -185,43 +186,45 @@ class FootprintWizardPlugin(KiCadPlugin):
return len(self.parameters)
def GetParameterPageName(self,page_n):
return self.parameters.keys()[page_n]
return self.page_order[page_n]
def GetParameterNames(self,page_n):
name = self.GetParameterPageName(page_n)
return self.parameters[name].keys()
return self.parameter_order[name]
def GetParameterValues(self,page_n):
name = self.GetParameterPageName(page_n)
values = self.parameters[name].values()
return map( lambda x: str(x) , values) # list elements as strings
names = self.GetParameterNames(page_n)
values = [self.parameters[name][n] for n in names]
return map(lambda x: str(x), values) # list elements as strings
def GetParameterErrors(self,page_n):
self.CheckParameters()
name = self.GetParameterPageName(page_n)
values = self.parameter_errors[name].values()
return map( lambda x: str(x) , values) # list elements as strings
names = self.GetParameterNames(page_n)
values = [self.parameter_errors[name][n] for n in names]
return map(lambda x: str(x), values) # list elements as strings
def CheckParameters(self):
return ""
def TryConvertToFloat(self,value):
v = value
def ConvertValue(self,v):
try:
v = float(value)
v = float(v)
except:
pass
if type(v) is float:
if ceil(v) == floor(v):
v = int(v)
return v
def SetParameterValues(self,page_n,values):
name = self.GetParameterPageName(page_n)
keys = self.parameters[name].keys()
n=0
for key in keys:
val = self.TryConvertToFloat(values[n])
keys = self.GetParameterNames(page_n)
for n, key in enumerate(keys):
val = self.ConvertValue(values[n])
self.parameters[name][key] = val
n+=1
def ClearErrors(self):