From cf437269a103aaa5d5fbecba6d5741234ce2cf5b Mon Sep 17 00:00:00 2001 From: easyw Date: Tue, 1 Oct 2019 12:41:00 +0200 Subject: [PATCH] adding stitching help image --- ViaStitching/FillAreaAction.py | 1 + ViaStitching/FillAreaDialog.py | 124 ++-- ViaStitching/FillAreaTpl.fbp | 930 +++++++-------------------- ViaStitching/stitching-vias-help.png | Bin 0 -> 6105 bytes ViaStitching/stitching-vias-help.svg | 240 +++++++ 5 files changed, 543 insertions(+), 752 deletions(-) create mode 100644 ViaStitching/stitching-vias-help.png create mode 100644 ViaStitching/stitching-vias-help.svg diff --git a/ViaStitching/FillAreaAction.py b/ViaStitching/FillAreaAction.py index ca4e70d..71795e6 100644 --- a/ViaStitching/FillAreaAction.py +++ b/ViaStitching/FillAreaAction.py @@ -57,6 +57,7 @@ class FillAreaAction(pcbnew.ActionPlugin): #a.m_Netname.SetValue("GND") a.m_ClearanceMM.SetValue("0.2") a.m_Star.SetValue(True) + a.m_bitmapStitching.SetBitmap(wx.Bitmap( os.path.join(os.path.dirname(os.path.realpath(__file__)), "stitching-vias-help.png") ) ) self.board = pcbnew.GetBoard() PopulateNets("GND",a) modal_result = a.ShowModal() diff --git a/ViaStitching/FillAreaDialog.py b/ViaStitching/FillAreaDialog.py index e19dea1..e9bf029 100644 --- a/ViaStitching/FillAreaDialog.py +++ b/ViaStitching/FillAreaDialog.py @@ -1,10 +1,10 @@ -# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- ########################################################################### -## Python code generated with wxFormBuilder (version Dec 21 2016) +## Python code generated with wxFormBuilder (version Oct 26 2018) ## http://www.wxformbuilder.org/ ## -## PLEASE DO "NOT" EDIT THIS FILE! +## PLEASE DO *NOT* EDIT THIS FILE! ########################################################################### import wx @@ -15,126 +15,142 @@ import wx.xrc ########################################################################### class FillAreaDialog ( wx.Dialog ): - + def __init__( self, parent ): - wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = u"Fill Area parameters", pos = wx.DefaultPosition, size = wx.Size( 402,487 ), style = wx.DEFAULT_DIALOG_STYLE ) - + wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = u"Fill Area parameters", pos = wx.DefaultPosition, size = wx.Size( 402,510 ), style = wx.DEFAULT_DIALOG_STYLE ) + import sys if sys.version_info[0] == 2: self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize ) else: self.SetSizeHints( wx.DefaultSize, wx.DefaultSize ) - #self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize ) - + bSizer3 = wx.BoxSizer( wx.VERTICAL ) - + fgSizer1 = wx.FlexGridSizer( 0, 2, 0, 0 ) fgSizer1.SetFlexibleDirection( wx.BOTH ) fgSizer1.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - - self.m_staticText3 = wx.StaticText( self, wx.ID_ANY, u"Via copper size", wx.DefaultPosition, wx.DefaultSize, 0 ) + + self.m_staticText3 = wx.StaticText( self, wx.ID_ANY, u"Via copper size (mm)", wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_staticText3.Wrap( -1 ) + fgSizer1.Add( self.m_staticText3, 1, wx.ALL|wx.EXPAND, 5 ) - + self.m_SizeMM = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_SizeMM.SetMinSize( wx.Size( 1000,-1 ) ) - + fgSizer1.Add( self.m_SizeMM, 1, wx.ALL|wx.EXPAND, 5 ) - - self.m_staticText9 = wx.StaticText( self, wx.ID_ANY, u"Via drill size", wx.DefaultPosition, wx.DefaultSize, 0 ) + + self.m_staticText9 = wx.StaticText( self, wx.ID_ANY, u"Via drill size (mm)", wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_staticText9.Wrap( -1 ) + fgSizer1.Add( self.m_staticText9, 1, wx.ALL|wx.EXPAND, 5 ) - + self.m_DrillMM = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) fgSizer1.Add( self.m_DrillMM, 1, wx.ALL|wx.EXPAND, 5 ) - - self.m_staticText5 = wx.StaticText( self, wx.ID_ANY, u"Via clearance", wx.DefaultPosition, wx.DefaultSize, 0 ) + + self.m_staticText5 = wx.StaticText( self, wx.ID_ANY, u"Via clearance (mm)", wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_staticText5.Wrap( -1 ) + fgSizer1.Add( self.m_staticText5, 1, wx.ALL|wx.EXPAND, 5 ) - + self.m_ClearanceMM = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) fgSizer1.Add( self.m_ClearanceMM, 1, wx.ALL|wx.EXPAND, 5 ) - + + self.m_staticText2 = wx.StaticText( self, wx.ID_ANY, u"Via grid (mm)", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_staticText2.Wrap( -1 ) + + fgSizer1.Add( self.m_staticText2, 0, wx.ALL, 5 ) + + self.m_StepMM = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) + fgSizer1.Add( self.m_StepMM, 1, wx.ALL|wx.EXPAND, 5 ) + + + fgSizer1.Add( ( 0, 0), 1, wx.EXPAND, 5 ) + + self.m_bitmapStitching = wx.StaticBitmap( self, wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.DefaultSize, 0 ) + fgSizer1.Add( self.m_bitmapStitching, 0, wx.EXPAND, 5 ) + self.m_staticText6 = wx.StaticText( self, wx.ID_ANY, u"Net name", wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_staticText6.Wrap( -1 ) + fgSizer1.Add( self.m_staticText6, 1, wx.ALL|wx.EXPAND, 5 ) - + m_cbNetChoices = [] self.m_cbNet = wx.ComboBox( self, wx.ID_ANY, u"GND", wx.DefaultPosition, wx.DefaultSize, m_cbNetChoices, 0 ) fgSizer1.Add( self.m_cbNet, 0, wx.ALL, 5 ) - - self.m_staticText2 = wx.StaticText( self, wx.ID_ANY, u"Step between via", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.m_staticText2.Wrap( -1 ) - fgSizer1.Add( self.m_staticText2, 0, wx.ALL, 5 ) - - self.m_StepMM = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) - fgSizer1.Add( self.m_StepMM, 1, wx.ALL|wx.EXPAND, 5 ) - + self.m_staticText7 = wx.StaticText( self, wx.ID_ANY, u"Debug mode", wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_staticText7.Wrap( -1 ) + fgSizer1.Add( self.m_staticText7, 1, wx.ALL|wx.EXPAND, 5 ) - + self.m_Debug = wx.CheckBox( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) fgSizer1.Add( self.m_Debug, 1, wx.ALL|wx.EXPAND, 5 ) - + self.m_staticText8 = wx.StaticText( self, wx.ID_ANY, u"Random it", wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_staticText8.Wrap( -1 ) + fgSizer1.Add( self.m_staticText8, 0, wx.ALL, 5 ) - + self.m_Random = wx.CheckBox( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) fgSizer1.Add( self.m_Random, 0, wx.ALL, 5 ) - + self.m_staticText42 = wx.StaticText( self, wx.ID_ANY, u"Star Pattern", wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_staticText42.Wrap( -1 ) + fgSizer1.Add( self.m_staticText42, 0, wx.ALL, 5 ) - + self.m_Star = wx.CheckBox( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) fgSizer1.Add( self.m_Star, 0, wx.ALL, 5 ) - + self.m_staticText81 = wx.StaticText( self, wx.ID_ANY, u"Only under selected Zone", wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_staticText81.Wrap( -1 ) + fgSizer1.Add( self.m_staticText81, 0, wx.ALL, 5 ) - + self.m_only_selected = wx.CheckBox( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) fgSizer1.Add( self.m_only_selected, 0, wx.ALL, 5 ) - - + + bSizer3.Add( fgSizer1, 1, wx.EXPAND, 5 ) - + bSizer1 = wx.BoxSizer( wx.HORIZONTAL ) - + self.m_staticText101 = wx.StaticText( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_staticText101.Wrap( -1 ) + bSizer1.Add( self.m_staticText101, 1, wx.ALL, 5 ) - + self.m_button1 = wx.Button( self, wx.ID_OK, u"Run", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.m_button1.SetDefault() + + self.m_button1.SetDefault() bSizer1.Add( self.m_button1, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 ) - + self.m_button2 = wx.Button( self, wx.ID_CANCEL, u"Cancel", wx.DefaultPosition, wx.DefaultSize, 0 ) bSizer1.Add( self.m_button2, 0, wx.ALL, 5 ) - + self.m_button3_delete = wx.Button( self, wx.ID_DELETE, u"Delete Vias", wx.DefaultPosition, wx.DefaultSize, 0 ) bSizer1.Add( self.m_button3_delete, 0, wx.ALL, 5 ) - - + + bSizer3.Add( bSizer1, 0, wx.EXPAND|wx.ALIGN_RIGHT, 5 ) - - + + self.SetSizer( bSizer3 ) self.Layout() - + self.Centre( wx.BOTH ) - + # Connect Events self.m_button3_delete.Bind( wx.EVT_BUTTON, self.onDeleteClick ) - + def __del__( self ): pass - - + + # Virtual event handlers, overide them in your derived class def onDeleteClick( self, event ): event.Skip() - + diff --git a/ViaStitching/FillAreaTpl.fbp b/ViaStitching/FillAreaTpl.fbp index 0780cee..d1a129d 100644 --- a/ViaStitching/FillAreaTpl.fbp +++ b/ViaStitching/FillAreaTpl.fbp @@ -1,6 +1,6 @@ - + Python @@ -14,6 +14,7 @@ FillAreaDialog 1000 none + 0 FillAreaDialog @@ -44,7 +45,7 @@ FillAreaDialog - 402,487 + 402,510 wxDEFAULT_DIALOG_STYLE Fill Area parameters @@ -52,42 +53,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer3 @@ -141,7 +106,8 @@ 0 0 wxID_ANY - Via copper size + Via copper size (mm) + 0 0 @@ -167,29 +133,6 @@ -1 - - - - - - - - - - - - - - - - - - - - - - - @@ -254,33 +197,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -315,7 +231,8 @@ 0 0 wxID_ANY - Via drill size + Via drill size (mm) + 0 0 @@ -341,29 +258,6 @@ -1 - - - - - - - - - - - - - - - - - - - - - - - @@ -428,33 +322,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -489,7 +356,8 @@ 0 0 wxID_ANY - Via clearance + Via clearance (mm) + 0 0 @@ -515,29 +383,6 @@ -1 - - - - - - - - - - - - - - - - - - - - - - - @@ -602,33 +447,199 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Via grid (mm) + 0 + + 0 + + + 0 + + 1 + m_staticText2 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_StepMM + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + 5 + wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_bitmapStitching + 1 + + + protected + 1 + + Resizable + 1 + + ; ; forward_declare + 0 + + + + @@ -664,6 +675,7 @@ 0 wxID_ANY Net name + 0 0 @@ -689,29 +701,6 @@ -1 - - - - - - - - - - - - - - - - - - - - - - - @@ -777,208 +766,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Step between via - - 0 - - - 0 - - 1 - m_staticText2 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL|wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - m_StepMM - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1014,6 +801,7 @@ 0 wxID_ANY Debug mode + 0 0 @@ -1039,29 +827,6 @@ -1 - - - - - - - - - - - - - - - - - - - - - - - @@ -1126,30 +891,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -1185,6 +926,7 @@ 0 wxID_ANY Random it + 0 0 @@ -1210,29 +952,6 @@ -1 - - - - - - - - - - - - - - - - - - - - - - - @@ -1297,30 +1016,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -1356,6 +1051,7 @@ 0 wxID_ANY Star Pattern + 0 0 @@ -1381,29 +1077,6 @@ -1 - - - - - - - - - - - - - - - - - - - - - - - @@ -1468,30 +1141,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -1527,6 +1176,7 @@ 0 wxID_ANY Only under selected Zone + 0 0 @@ -1552,29 +1202,6 @@ -1 - - - - - - - - - - - - - - - - - - - - - - - @@ -1639,30 +1266,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -1709,6 +1312,7 @@ 0 wxID_ANY + 0 0 @@ -1734,29 +1338,6 @@ -1 - - - - - - - - - - - - - - - - - - - - - - - @@ -1774,25 +1355,31 @@ + 1 0 0 1 + 1 0 + Dock 0 Left 1 1 + 0 0 wxID_OK Run + + 0 0 @@ -1807,6 +1394,8 @@ protected 1 + + Resizable 1 @@ -1821,30 +1410,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -1862,25 +1427,31 @@ + 1 0 1 1 + 0 0 + Dock 0 Left 1 1 + 0 0 wxID_CANCEL Cancel + + 0 0 @@ -1895,6 +1466,8 @@ protected 1 + + Resizable 1 @@ -1909,30 +1482,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -1950,25 +1499,31 @@ + 1 0 1 1 + 0 0 + Dock 0 Left 1 1 + 0 0 wxID_DELETE Delete Vias + + 0 0 @@ -1983,6 +1538,8 @@ protected 1 + + Resizable 1 @@ -1998,29 +1555,6 @@ onDeleteClick - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ViaStitching/stitching-vias-help.png b/ViaStitching/stitching-vias-help.png new file mode 100644 index 0000000000000000000000000000000000000000..9ac059c69e59f6a8193a19df9b688da98370a864 GIT binary patch literal 6105 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 f#l^+N + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + d +