From eb396a5e8897c1c535c123031f5523404cd9e3cb Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Wed, 2 Jul 2014 15:08:28 +0200 Subject: [PATCH] Fix footprint wizard issues. Fix export vrml incorrect Z position of items. --- pcbnew/class_pad.cpp | 4 +--- pcbnew/class_pad.h | 19 ++++++++++++---- pcbnew/dialogs/dialog_pad_properties.cpp | 2 +- pcbnew/exporters/export_vrml.cpp | 4 ++-- .../plugins/FPC_(SMD_type)_footprintwizard.py | 4 ++-- pcbnew/scripting/plugins/PadArray.py | 22 ++++--------------- pcbnew/scripting/plugins/qfp_wizard.py | 7 ++++-- .../scripting/plugins/touch_slider_wizard.py | 6 ++--- scripting/kicad.i | 2 +- 9 files changed, 34 insertions(+), 36 deletions(-) diff --git a/pcbnew/class_pad.cpp b/pcbnew/class_pad.cpp index 99baa92dfc..36239b7be0 100644 --- a/pcbnew/class_pad.cpp +++ b/pcbnew/class_pad.cpp @@ -95,15 +95,13 @@ LSET D_PAD::StandardMask() LSET D_PAD::SMDMask() { - // was: #define PAD_SMD_DEFAULT_LAYERS LAYER_FRONT | SOLDERPASTE_LAYER_FRONT | SOLDERMASK_LAYER_FRONT static LSET saved( 3, F_Cu, F_Paste, F_Mask ); return saved; } -LSET D_PAD::ConnMask() +LSET D_PAD::ConnSMDMask() { - // was: #define PAD_CONN_DEFAULT_LAYERS LAYER_FRONT | SOLDERMASK_LAYER_FRONT static LSET saved( 2, F_Cu, F_Mask ); return saved; } diff --git a/pcbnew/class_pad.h b/pcbnew/class_pad.h index 621c1ad477..1687989462 100644 --- a/pcbnew/class_pad.h +++ b/pcbnew/class_pad.h @@ -88,10 +88,11 @@ public: /* Default layers used for pads, according to the pad type. * this is default values only, they can be changed for a given pad */ - static LSET StandardMask(); - static LSET ConnMask(); - static LSET SMDMask(); - static LSET UnplatedHoleMask(); + static LSET StandardMask(); ///< layer set for a through hole pad + static LSET SMDMask(); ///< layer set for a SMD pad on Front layer + static LSET ConnSMDMask(); ///< layer set for a SMD pad on Front layer + ///< used for edge board connectors + static LSET UnplatedHoleMask(); ///< layer set for a mechanical unplated through hole pad void Copy( D_PAD* source ); @@ -419,6 +420,16 @@ public: EDA_ITEM* Clone() const; + /** + * same as Clone, but returns a D_PAD item. + * Useful mainly for pythons scripts, because Clone (virtual function) + * returns an EDA_ITEM. + */ + D_PAD* Duplicate() const + { + return (D_PAD*) Clone(); + } + /// @copydoc VIEW_ITEM::ViewGetLayers() virtual void ViewGetLayers( int aLayers[], int& aCount ) const; diff --git a/pcbnew/dialogs/dialog_pad_properties.cpp b/pcbnew/dialogs/dialog_pad_properties.cpp index ea26681a7c..b962b670c0 100644 --- a/pcbnew/dialogs/dialog_pad_properties.cpp +++ b/pcbnew/dialogs/dialog_pad_properties.cpp @@ -76,7 +76,7 @@ static const LSET std_pad_layers[] = { D_PAD::SMDMask(), // PAD_CONN: - D_PAD::ConnMask(), + D_PAD::ConnSMDMask(), // PAD_HOLE_NOT_PLATED: D_PAD::UnplatedHoleMask() diff --git a/pcbnew/exporters/export_vrml.cpp b/pcbnew/exporters/export_vrml.cpp index 4a6c71d24b..94413fe66e 100644 --- a/pcbnew/exporters/export_vrml.cpp +++ b/pcbnew/exporters/export_vrml.cpp @@ -473,9 +473,9 @@ static void compute_layer_Zs( MODEL_VRML& aModel, BOARD* pcb ) LAYER_ID i = *seq; if( i < copper_layers ) - aModel.SetLayerZ( i, aModel.board_thickness * i / (copper_layers - 1) - half_thickness ); + aModel.SetLayerZ( i, half_thickness - aModel.board_thickness * i / (copper_layers - 1) ); else - aModel.SetLayerZ( i, half_thickness ); // component layer + aModel.SetLayerZ( i, - half_thickness ); // bottom layer } /* To avoid rounding interference, we apply an epsilon to each diff --git a/pcbnew/scripting/plugins/FPC_(SMD_type)_footprintwizard.py b/pcbnew/scripting/plugins/FPC_(SMD_type)_footprintwizard.py index f751c47f38..8a43a34b89 100644 --- a/pcbnew/scripting/plugins/FPC_(SMD_type)_footprintwizard.py +++ b/pcbnew/scripting/plugins/FPC_(SMD_type)_footprintwizard.py @@ -30,7 +30,7 @@ class FPCFootprintWizard(FootprintWizardPlugin): pad.SetSize(size) pad.SetShape(PAD_RECT) pad.SetAttribute(PAD_SMD) - pad.SetLayerMask(PAD_SMD_DEFAULT_LAYERS) + pad.SetLayerSet( pad.StandardMask() ) pad.SetPos0(pos) pad.SetPosition(pos) pad.SetPadName(name) @@ -126,7 +126,7 @@ class FPCFootprintWizard(FootprintWizardPlugin): xstart = - pad_pitch*0.5-offsetX xend = pad_pitch * pads + xstart; outline.SetStartEnd( wxPoint(xstart, posy), wxPoint( xend, posy) ) - outline.SetLayer(SILKSCREEN_N_FRONT) #default: not needed + outline.SetLayer(F_SilkS) #default: not needed outline.SetShape(S_SEGMENT) module.Add(outline) diff --git a/pcbnew/scripting/plugins/PadArray.py b/pcbnew/scripting/plugins/PadArray.py index 3c5d5f7cb1..9e4d9b3572 100644 --- a/pcbnew/scripting/plugins/PadArray.py +++ b/pcbnew/scripting/plugins/PadArray.py @@ -17,7 +17,7 @@ class PadMaker: pad.SetShape(shape) pad.SetAttribute(pcbnew.PAD_STANDARD) - pad.SetLayerMask(pcbnew.PAD_STANDARD_DEFAULT_LAYERS) + pad.SetLayerSet(pad.StandardMask()) pad.SetDrillSize(pcbnew.wxSize(drill, drill)) return pad @@ -29,7 +29,7 @@ class PadMaker: pad.SetShape(shape) pad.SetAttribute(pcbnew.PAD_SMD) - pad.SetLayerMask(pcbnew.PAD_SMD_DEFAULT_LAYERS) + pad.SetLayerSet(pad.SMDMask()) return pad @@ -45,19 +45,6 @@ class PadArray: def SetFirstPadInArray(self, fpNum): self.firstPad = fpNum - # HACK! pad should one day have its own clone method - def ClonePad(self): - - pad = pcbnew.D_PAD(self.pad.GetParent()) - - pad.SetSize(self.pad.GetSize()) - pad.SetShape(self.pad.GetShape()) - pad.SetAttribute(self.pad.GetAttribute()) - pad.SetLayerMask(self.pad.GetLayerMask()) - pad.SetDrillSize(self.pad.GetDrillSize()) - - return pad - def AddPad(self, pad): self.pad.GetParent().Add(pad) @@ -100,9 +87,8 @@ class PadGridArray(PadArray): pos = pcbnew.wxPoint(posX, posY) - # THIS DOESN'T WORK yet! - #pad = self.pad.Clone() - pad = self.ClonePad() + # create a new pad with same characteristics + pad = self.pad.Duplicate() pad.SetPos0(pos) pad.SetPosition(pos) diff --git a/pcbnew/scripting/plugins/qfp_wizard.py b/pcbnew/scripting/plugins/qfp_wizard.py index 0034c1fadb..4964bcdfac 100644 --- a/pcbnew/scripting/plugins/qfp_wizard.py +++ b/pcbnew/scripting/plugins/qfp_wizard.py @@ -27,6 +27,7 @@ class QFPWizard(HelpfulFootprintWizardPlugin.HelpfulFootprintWizardPlugin): def CheckParameters(self): self.CheckParamPositiveInt("Pads", "*n", is_multiple_of = 4) + self.CheckParamBool("Pads", "*oval") def GetReference(self): return "QFP %d" % self.parameters["Pads"]["*n"] @@ -46,8 +47,10 @@ class QFPWizard(HelpfulFootprintWizardPlugin.HelpfulFootprintWizardPlugin): row_len = (pads_per_row - 1) * pad_pitch - h_pad = PA.PadMaker(self.module).SMDPad(pad_width, pad_length, shape = pcbnew.PAD_OVAL) - v_pad = PA.PadMaker(self.module).SMDPad(pad_length, pad_width, shape = pcbnew.PAD_OVAL) + pad_shape = pcbnew.PAD_OVAL if pads["*oval"] else pcbnew.PAD_RECT + + h_pad = PA.PadMaker(self.module).SMDPad(pad_width, pad_length, shape = pad_shape) + v_pad = PA.PadMaker(self.module).SMDPad(pad_length, pad_width, shape = pad_shape) #left row pin1Pos = pcbnew.wxPoint(-h_pitch / 2, -row_len / 2) diff --git a/pcbnew/scripting/plugins/touch_slider_wizard.py b/pcbnew/scripting/plugins/touch_slider_wizard.py index a29f91398a..5b33be7ed3 100644 --- a/pcbnew/scripting/plugins/touch_slider_wizard.py +++ b/pcbnew/scripting/plugins/touch_slider_wizard.py @@ -25,7 +25,7 @@ class TouchSliderWizard(FootprintWizardPlugin): pad.SetSize(size) pad.SetShape(PAD_RECT) pad.SetAttribute(PAD_SMD) - pad.SetLayerMask(PAD_SMD_DEFAULT_LAYERS) + pad.SetLayerSet(pad.ConnSMDMask()) pad.SetPos0(pos) pad.SetPosition(pos) pad.SetPadName(name) @@ -36,8 +36,8 @@ class TouchSliderWizard(FootprintWizardPlugin): pad = D_PAD(module) pad.SetSize(wxSize(size[0],size[1])) pad.SetShape(PAD_TRAPEZOID) - pad.SetAttribute(PAD_CONN) - pad.SetLayerMask(PAD_CONN_DEFAULT_LAYERS) + pad.SetAttribute(PAD_SMD) + pad.SetLayerSet(pad.ConnSMDMask()) pad.SetPos0(pos) pad.SetPosition(pos) pad.SetPadName(name) diff --git a/scripting/kicad.i b/scripting/kicad.i index 451f541417..59a1afcbab 100644 --- a/scripting/kicad.i +++ b/scripting/kicad.i @@ -66,7 +66,7 @@ #include #include #include - #include + #include #include #include