From 3adb80e746139084b32df068bbeb6f13cedf6dae Mon Sep 17 00:00:00 2001 From: easyw Date: Sun, 16 Feb 2020 08:17:45 +0100 Subject: [PATCH] first Snap2Grid release --- Snap2Grid/__init__.py | 2 + Snap2Grid/snap2grid.png | Bin 0 -> 1724 bytes Snap2Grid/snap2grid.py | 200 +++++++++++++++++++++++++++ Snap2Grid/snap2grid.svg | 242 +++++++++++++++++++++++++++++++++ Snap2Grid/snaptogrid_script.py | 96 +++++++++++++ __init__.py | 3 + 6 files changed, 543 insertions(+) create mode 100644 Snap2Grid/__init__.py create mode 100644 Snap2Grid/snap2grid.png create mode 100644 Snap2Grid/snap2grid.py create mode 100644 Snap2Grid/snap2grid.svg create mode 100644 Snap2Grid/snaptogrid_script.py diff --git a/Snap2Grid/__init__.py b/Snap2Grid/__init__.py new file mode 100644 index 0000000..07cb020 --- /dev/null +++ b/Snap2Grid/__init__.py @@ -0,0 +1,2 @@ +from .snap2grid import snap_to_grid +snap_to_grid().register() diff --git a/Snap2Grid/snap2grid.png b/Snap2Grid/snap2grid.png new file mode 100644 index 0000000000000000000000000000000000000000..d88097b00514408e5c6ecd1aec4211b3032ee57d GIT binary patch literal 1724 zcmV;t21EIYP)m8`F805A&;Oj~oWIZU^C9?zsI9FnQA(|h+e#_V zsZ*z}*3{H&l2Ycxc_GAmZEbCV9Xobx1JYx$;nLF5GmVXnW@=vjlM0y13LP18`L|4G zL{#Qjn#{XuZw6io*`vSeTQ`^k@Yv<0;oNKX7i(*4-@lh0YQ0i1q5~B6=7cX^ytoP& zT(kgC@@m;g+C;WN?oB((uGs~EsjJA9vJopl`nc7|y=Di%uto0mtsPzlkUMC76aF78WZa*hWT1eki5>w>=)u zd-DnqLL3F2h?#EzHFb4$r*vK4cIbqD$VPI7PBsjRGA z($LV5la*x4i(|h*pu^5K2IXgSs`e}gb>G=*=YBK5WjdJ z6;q(=dTWxMXmoaV9(B9jztnX-bm78<@kHN=wv%-CUjz*ZDK@Uz!1m{>sXx-dc>2uQ zBK;=c`r1B-dwF=0;8R?`7MCz>}#>NObL!92}0pNwx<#cyTklRhBImb+gO$ParRrr{~VV@L^z&Qfi+N;`6|FV@v;W-ws3~k(V@0+YL;PkB^_If@xqm zKnMIwKoc{6tR52%RlzL)0s+dS(e;|9?F4!|J3CJUr-35?E|=@i4u|6kkQt3en^`PA zfI}Cc>q97CbdnS-cpIjmPC&013!G)rIOaB*h#)r0SACS zrPSYmhD2X%`@9QW2VU##?VWujc64-%3L##P`F;= 4.0 +# copyright Maurice easyw +# +# + +#import snaptogrid; import importlib; importlib.reload(snaptogrid) + +__version__ = '1.0.1' +import sys, os +import pcbnew +import datetime +import wx +from pcbnew import * + +use_grid_origin = True + +gridReference = 2.54 #1.27 #mm pcbnew.FromMM(1.0) #0.1mm + +gridSizeMM = gridReference + +#from . import Send2GridDlg + +sys.path.append(os.path.dirname(__file__)) + +debug = False +def wxLogDebug(msg,dbg): + """printing messages only if show is omitted or True""" + if dbg == True: + wx.LogMessage(msg) +# + +#class Snap2Grid_Dlg(Snap2GridDlg.Snap2GridDlg): +# # from https://github.com/MitjaNemec/Kicad_action_plugins +# # hack for new wxFormBuilder generating code incompatible with old wxPython +# # noinspection PyMethodOverriding +# def SetSizeHints(self, sz1, sz2): +# if wx.__version__ < '4.0': +# self.SetSizeHintsSz(sz1, sz2) +# else: +# super(RoundTrack_Dlg, self).SetSizeHints(sz1, sz2) +# +# # def onDeleteClick(self, event): +# # return self.EndModal(wx.ID_DELETE) +# # +# # def onConnectClick(self, event): +# # return self.EndModal(wx.ID_REVERT) +# +# def __init__(self, parent): +# import wx +# Send2GridDlg.Send2GridDlg.__init__(self, parent) +# #self.GetSizer().Fit(self) +# self.SetMinSize(self.GetSize()) +# #self.m_buttonDelete.Bind(wx.EVT_BUTTON, self.onDeleteClick) +# #self.m_buttonReconnect.Bind(wx.EVT_BUTTON, self.onConnectClick) +# #if wx.__version__ < '4.0': +# # self.m_buttonReconnect.SetToolTipString( u"Select two converging Tracks to re-connect them\nor Select tracks including one round corner to be straighten" ) +# # self.m_buttonRound.SetToolTipString( u"Select two connected Tracks to round the corner\nThen choose distance from intersection and the number of segments" ) +# #else: +# # self.m_buttonReconnect.SetToolTip( u"Select two converging Tracks to re-connect them\nor Select tracks including one round corner to be straighten" ) +# # self.m_buttonRound.SetToolTip( u"Select two connected Tracks to round the corner\nThen choose distance from intersection and the number of segments" ) +# +# Python plugin stuff +class snap_to_grid( pcbnew.ActionPlugin ): + """ + A plugin to Snap modules to selected Grid for kicad_pcb + requirements: KiCAD pcbnew >= 4.0 + + """ + def defaults( self ): + """ + Method defaults must be redefined + self.name should be the menu label to use + self.category should be the category (not yet used) + self.description should be a comprehensive description + of the plugin + """ + self.name = "Snap Selected Module(s) to Grid\nversion "+__version__ + self.category = "Modify PCB" + self.description = "Automaticaly Snap Selected Module(s) to Grid on an existing PCB" + #self.pcbnew_icon_support = hasattr(self, "show_toolbar_button") + self.show_toolbar_button = True + self.icon_file_name = os.path.join(os.path.dirname(__file__), './snap2grid.png') + # + + def Run(self): + #self.pcb = GetBoard() + import sys,os + #mm_ius = 1000000.0 + + pcb = pcbnew.GetBoard() + gridOrigin = pcb.GetGridOrigin() + auxOrigin = pcb.GetAuxOrigin() + content='' + locked_fp='' + #wxPoint(77470000, 135890000) + for module in pcb.GetModules(): + if module.IsSelected(): + if use_grid_origin: + mpx = module.GetPosition().x - gridOrigin.x + mpy = module.GetPosition().y - gridOrigin.y + print(mpx,mpy) + mpxOnG = int(mpx/FromMM(gridSizeMM))*FromMM(gridSizeMM)+ gridOrigin.x + mpyOnG = int(mpy/FromMM(gridSizeMM))*FromMM(gridSizeMM)+ gridOrigin.y + print(mpxOnG,mpyOnG) + locked='' + if not module.IsLocked(): + module.SetPosition(wxPoint(mpxOnG,mpyOnG)) + else: + locked='LOCKED' + X_POS=str(module.GetPosition().x) # - gridOrigin.x) + #X_POS='{0:.4f}'.format(pcbnew.ToMM(module.GetPosition().x - gridOrigin.x )) + X_POS="{0:<11}".format(X_POS) + Y_POS=str(module.GetPosition().y) # - gridOrigin.y) + Y_POS="{0:<11}".format(Y_POS) + ## mpOnGx = PutOnGridMM(module.GetPosition().x, gridSizeMM) + ## mpOnGy = PutOnGridMM(module.GetPosition().y, gridSizeMM) + ## module.SetPosition(wxPoint(mpOnGx,mpOnGy)) + #module.SetPosition(wxPoint(mpOnGx+FromMM(100.0),mpOnGy+FromMM(2.0))) + #module.SetOrientation(10) + #Y_POS='{0:.4f}'.format(-1*pcbnew.ToMM(module.GetPosition().y - gridOrigin.y)) + # else: + # mpx = module.GetPosition().x - auxOrigin().x + # mpy = module.GetPosition().y - auxOrigin().y + # X_POS='{0:.4f}'.format(pcbnew.ToMM(module.GetPosition().x - auxOrigin().x )) + # X_POS="{0:<11}".format(X_POS) + # Y_POS='{0:.4f}'.format(-1*pcbnew.ToMM(module.GetPosition().y - auxOrigin().y)) + # Y_POS="{0:<11}".format(Y_POS) + Reference="{0:<10}".format(str(module.GetReference())) + Value = str(module.GetValue()) + Value=(Value[:17] + '..') if len(Value) > 19 else Value + Value="{0:<20}".format(Value) + Rotation='{0:.1f}'.format((module.GetOrientation()/10)) + Rotation="{0:>6}".format(Rotation)+' ' + if module.GetLayer() == 0: + Layer=" top" + else: + Layer=" bottom" + #Side="## Side :"+Layer+lsep + Layer="{0:<10}".format(Layer) + content+=Reference + if 'LOCKED' in locked: + locked_fp+=Reference + ' LOCKED'+'\n' #os.linesep + #content+=Value + content+=X_POS + content+=Y_POS + #content+=str(mpOnGx) + #content+=str(mpOnGy) + content+=str(mpxOnG) + content+=str(mpyOnG) + content+=Layer+'\n' #os.linesep + if len(content)>0: + content+=str(pcbnew.FromMM(gridReference)) + wxLogDebug(content,debug) + if len (locked_fp)>0: + locked_fp+='\n'+'NOT Moved' + wxLogDebug(locked_fp,True) + else: + wxLogDebug('No Modules Selected',True) + Refresh() + #return content + + #if 0: + # #from https://github.com/MitjaNemec/Kicad_action_plugins + # #hack wxFormBuilder py2/py3 + # _pcbnew_frame = [x for x in wx.GetTopLevelWindows() if x.GetTitle().lower().startswith('pcbnew')][0] + # #aParameters = RoundTrackDlg(None) + # aParameters = RoundTrack_Dlg(_pcbnew_frame) + # #aParameters = RoundTrack_DlgEx(_pcbnew_frame) + # aParameters.Show() + # #end hack + # aParameters.m_distanceMM.SetValue("5") + # aParameters.m_segments.SetValue("16") + # aParameters.m_bitmap1.SetBitmap(wx.Bitmap( os.path.join(os.path.dirname(os.path.realpath(__file__)), "round_track_help.png") ) ) + # modal_result = aParameters.ShowModal() + # segments = self.CheckSegmentsInput( + # aParameters.m_segments.GetValue(), "number of segments") + # distI = FromMM(self.CheckDistanceInput(aParameters.m_distanceMM.GetValue(), "distance from intersection")) + # if segments is not None and distI is not None: + # if modal_result == wx.ID_OK: + # Round_Selection(pcb, distI, segments) + # elif modal_result == wx.ID_DELETE: + # Delete_Segments(pcb) + # #wx.LogMessage('Round Segments on Track Net Deleted') + # elif modal_result == wx.ID_REVERT: + # wxLogDebug('Connecting Tracks',debug) + # Connect_Segments(pcb) + # else: + # None # Cancel + # else: + # None # Invalid input + # aParameters.Destroy() + + + # wxLogDebug('showing Selected Tracks',debug) + # wx.LogMessage('Select Tracks to calculate the Length\nor One Pad to select connected Tracks') +# + diff --git a/Snap2Grid/snap2grid.svg b/Snap2Grid/snap2grid.svg new file mode 100644 index 0000000..0a08e02 --- /dev/null +++ b/Snap2Grid/snap2grid.svg @@ -0,0 +1,242 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Snap2Grid/snaptogrid_script.py b/Snap2Grid/snaptogrid_script.py new file mode 100644 index 0000000..d78ceb8 --- /dev/null +++ b/Snap2Grid/snaptogrid_script.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +# +# A script to Snap modules to selected Grid for kicad_pcb +# requirements: KiCAD pcbnew >= 4.0 +# copyright Maurice easyw +# +# + +#import snaptogrid; import importlib; importlib.reload(snaptogrid) +import sys, os +import pcbnew +import datetime +import wx +from pcbnew import * + +use_grid_origin = True +gridReference = 0.127 #1.27 #mm pcbnew.FromMM(1.0) #0.1mm + + +# def PutOnGridMM(value, gridSizeMM): +# thresh = FromMM(gridSizeMM) +# return round(value/thresh)*thresh +# +# def PutOnGridMils(value, gridSizeMils): +# thresh = FromMils(gridSizeMils) +# return round(value/thresh)*thresh +#def SetPosition(self, p): +# """SetPosition(wxRect self, wxPoint p)""" +# return _pcbnew.wxRect_SetPosition(self, p) + + +def Snap2Grid(gridSizeMM,use_grid_origin): + import sys,os + #mm_ius = 1000000.0 + + pcb = pcbnew.GetBoard() + gridOrigin = pcb.GetGridOrigin() + auxOrigin = pcb.GetAuxOrigin() + content='' + #wxPoint(77470000, 135890000) + for module in pcb.GetModules(): + if module.IsSelected(): + if use_grid_origin: + mpx = module.GetPosition().x - gridOrigin.x + mpy = module.GetPosition().y - gridOrigin.y + print(mpx,mpy) + mpxOnG = int(mpx/FromMM(gridSizeMM))*FromMM(gridSizeMM)+ gridOrigin.x + mpyOnG = int(mpy/FromMM(gridSizeMM))*FromMM(gridSizeMM)+ gridOrigin.y + print(mpxOnG,mpyOnG) + module.SetPosition(wxPoint(mpxOnG,mpyOnG)) + X_POS=str(module.GetPosition().x) # - gridOrigin.x) + #X_POS='{0:.4f}'.format(pcbnew.ToMM(module.GetPosition().x - gridOrigin.x )) + X_POS="{0:<11}".format(X_POS) + Y_POS=str(module.GetPosition().y) # - gridOrigin.y) + Y_POS="{0:<11}".format(Y_POS) + ## mpOnGx = PutOnGridMM(module.GetPosition().x, gridSizeMM) + ## mpOnGy = PutOnGridMM(module.GetPosition().y, gridSizeMM) + ## module.SetPosition(wxPoint(mpOnGx,mpOnGy)) + #module.SetPosition(wxPoint(mpOnGx+FromMM(100.0),mpOnGy+FromMM(2.0))) + #module.SetOrientation(10) + #Y_POS='{0:.4f}'.format(-1*pcbnew.ToMM(module.GetPosition().y - gridOrigin.y)) + # else: + # mpx = module.GetPosition().x - auxOrigin().x + # mpy = module.GetPosition().y - auxOrigin().y + # X_POS='{0:.4f}'.format(pcbnew.ToMM(module.GetPosition().x - auxOrigin().x )) + # X_POS="{0:<11}".format(X_POS) + # Y_POS='{0:.4f}'.format(-1*pcbnew.ToMM(module.GetPosition().y - auxOrigin().y)) + # Y_POS="{0:<11}".format(Y_POS) + Reference="{0:<10}".format(str(module.GetReference())) + Value = str(module.GetValue()) + Value=(Value[:17] + '..') if len(Value) > 19 else Value + Value="{0:<20}".format(Value) + Rotation='{0:.1f}'.format((module.GetOrientation()/10)) + Rotation="{0:>6}".format(Rotation)+' ' + if module.GetLayer() == 0: + Layer=" top" + else: + Layer=" bottom" + #Side="## Side :"+Layer+lsep + Layer="{0:<10}".format(Layer) + content+=Reference + #content+=Value + content+=X_POS + content+=Y_POS + #content+=str(mpOnGx) + #content+=str(mpOnGy) + content+=str(mpxOnG) + content+=str(mpyOnG) + content+=Layer+os.linesep + content+=str(pcbnew.FromMM(gridReference)) + Refresh() + return content + +reply=Snap2Grid(gridReference,use_grid_origin) +#LogMsg=reply +wx.LogMessage(reply) diff --git a/__init__.py b/__init__.py index 001b420..8a147a8 100644 --- a/__init__.py +++ b/__init__.py @@ -9,3 +9,6 @@ from . import FabricationPositions from . import MoveToLayer from . import PcbToDxf + +from . import Snap2Grid +