diff --git a/AnnularChecker/AR-params.fbp b/AnnularChecker/AR-params.fbp deleted file mode 100644 index 3a9e63a..0000000 --- a/AnnularChecker/AR-params.fbp +++ /dev/null @@ -1,1016 +0,0 @@ - - - - - - Python - 1 - source_name - 0 - 0 - res - UTF-8 - connect - - 1000 - none - - 0 - parametersDlg - - . - - 1 - 1 - 1 - 1 - UI - 0 - 0 - - 0 - wxAUI_MGR_DEFAULT - - wxBOTH - - 1 - 1 - impl_virtual - - - - 0 - wxID_ANY - - - AR_Prm - - 320,229 - wxDEFAULT_DIALOG_STYLE - ; forward_declare - Annular Checker - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer1 - wxVERTICAL - none - - 5 - wxEXPAND - 1 - - 2 - 0 - - gSizer2 - none - 0 - 0 - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - PHD margin - 0 - - 0 - - - 0 - - 1 - m_StaticTextPHD - 1 - - - protected - 1 - -1,-1 - Resizable - 1 - - - ; forward_declare - 0 - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - m_textPHD - 1 - - - protected - 1 - - Resizable - 1 - - - ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - AR for pads - 0 - - 0 - - - 0 - - 1 - m_StaticTextAR_SET - 1 - - - protected - 1 - -1,-1 - Resizable - 1 - - - ; forward_declare - 0 - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - m_textAR_SET - 1 - - - protected - 1 - - Resizable - 1 - - - ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - AR for vias - 0 - - 0 - - - 0 - - 1 - m_StaticTextAR_SET_V - 1 - - - protected - 1 - -1,-1 - Resizable - 1 - - - ; forward_declare - 0 - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - m_textAR_SET_V - 1 - - - protected - 1 - - Resizable - 1 - - - ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 1 - - - bSizer2 - wxVERTICAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Version - 0 - - 0 - - - 0 - - 1 - m_staticTextVersion - 1 - - - protected - 1 - - Resizable - 1 - - - ; forward_declare - 0 - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 1 - - 2 - 0 - - gSizer1 - none - 0 - 0 - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - OK - - 0 - - 0 - - - 0 - - 1 - m_ok_btn - 1 - - - protected - 1 - - - - Resizable - 1 - - - ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Cancel - - 0 - - 0 - - - 0 - - 1 - m_cancel_btn - 1 - - - protected - 1 - - - - Resizable - 1 - - - ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AnnularChecker/AR-params - Copy.fbp b/AnnularChecker/AnnularDlg.fbp similarity index 62% rename from AnnularChecker/AR-params - Copy.fbp rename to AnnularChecker/AnnularDlg.fbp index 715b6c3..4a7af2a 100644 --- a/AnnularChecker/AR-params - Copy.fbp +++ b/AnnularChecker/AnnularDlg.fbp @@ -1,914 +1,748 @@ - - - - - - C++ - 1 - source_name - 0 - 0 - res - UTF-8 - connect - - 1000 - none - - 0 - parametersDlg - - . - - 1 - 1 - 1 - 1 - UI - 0 - 0 - - 0 - wxAUI_MGR_DEFAULT - - wxBOTH - - 1 - 1 - impl_virtual - - - - 0 - wxID_ANY - - - AR_Prm - - 320,193 - wxDEFAULT_DIALOG_STYLE - ; forward_declare - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer1 - wxVERTICAL - none - - 5 - wxEXPAND - 1 - - 2 - 0 - - gSizer2 - none - 0 - 0 - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - PHD margin - 0 - - 0 - - - 0 - - 1 - m_staticText11 - 1 - - - protected - 1 - -1,-1 - Resizable - 1 - - - ; forward_declare - 0 - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - m_textPHD - 1 - - - protected - 1 - - Resizable - 1 - - - ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - AR for pads - 0 - - 0 - - - 0 - - 1 - m_staticText1 - 1 - - - protected - 1 - -1,-1 - Resizable - 1 - - - ; forward_declare - 0 - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - m_textPHD1 - 1 - - - protected - 1 - - Resizable - 1 - - - ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - AR for vias - 0 - - 0 - - - 0 - - 1 - m_staticText12 - 1 - - - protected - 1 - -1,-1 - Resizable - 1 - - - ; forward_declare - 0 - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - m_textPHD11 - 1 - - - protected - 1 - - Resizable - 1 - - - ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 1 - - 2 - 0 - - gSizer1 - none - 0 - 0 - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - OK - - 0 - - 0 - - - 0 - - 1 - m_ok_btn - 1 - - - protected - 1 - - - - Resizable - 1 - - - ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Cancel - - 0 - - 0 - - - 0 - - 1 - m_cancel_btn - 1 - - - protected - 1 - - - - Resizable - 1 - - - ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + Python + 1 + source_name + 0 + 0 + res + UTF-8 + connect + AnnularDlg + 1000 + none + + 0 + AnnularDlg + + . + + 1 + 1 + 1 + 1 + UI + 0 + 0 + + 0 + wxAUI_MGR_DEFAULT + + wxBOTH + + 1 + 1 + impl_virtual + + + + 0 + wxID_ANY + + + AnnularDlg + + 380,317 + wxCAPTION|wxCLOSE_BOX|wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER + + Annular Ring Checker + + + + + + + bSizer3 + wxVERTICAL + none + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Check annular ring + 0 + + 0 + + + 0 + + 1 + m_LabelTitle + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline8 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + ; ; forward_declare + 0 + + + + + + + + 5 + wxALIGN_CENTER|wxALL + 1 + + 2 + 0 + + gSizer1 + none + 0 + 0 + + 5 + wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + PH Drill margin + 0 + + 0 + + + 0 + + 1 + m_staticTextPHD + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlPHD + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + AR Vias + 0 + + 0 + + + 0 + + 1 + m_staticTextARV + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlARV + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + AR Pads + 0 + + 0 + + + 0 + + 1 + m_staticTextARP + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlARP + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + 5 + wxALIGN_RIGHT|wxEXPAND + 0 + + + bSizer1 + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 0 + + 1 + + 1 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_OK + Apply + + 0 + + 0 + + + 0 + + 1 + m_buttonOK + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_CANCEL + Cancel + + 0 + + 0 + + + 0 + + 1 + m_buttonCancel + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + 5 + wxEXPAND + 1 + + + bSizer4 + wxVERTICAL + none + + + + + + diff --git a/AnnularChecker/AnnularDlg.py b/AnnularChecker/AnnularDlg.py new file mode 100644 index 0000000..966a320 --- /dev/null +++ b/AnnularChecker/AnnularDlg.py @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- + +########################################################################### +## Python code generated with wxFormBuilder (version Oct 26 2018) +## http://www.wxformbuilder.org/ +## +## PLEASE DO *NOT* EDIT THIS FILE! +########################################################################### + +import wx +import wx.xrc + +########################################################################### +## Class AnnularDlg +########################################################################### + +class AnnularDlg ( wx.Dialog ): + + def __init__( self, parent ): + wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = u"Annular Ring Checker", pos = wx.DefaultPosition, size = wx.Size( 380,317 ), style = wx.CAPTION|wx.CLOSE_BOX|wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER ) + + self.SetSizeHints( wx.DefaultSize, wx.DefaultSize ) + + bSizer3 = wx.BoxSizer( wx.VERTICAL ) + + self.m_LabelTitle = wx.StaticText( self, wx.ID_ANY, u"Check annular ring", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_LabelTitle.Wrap( -1 ) + + bSizer3.Add( self.m_LabelTitle, 0, wx.ALL|wx.EXPAND, 5 ) + + self.m_staticline8 = wx.StaticLine( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL ) + bSizer3.Add( self.m_staticline8, 0, wx.EXPAND |wx.ALL, 5 ) + + gSizer1 = wx.GridSizer( 0, 2, 0, 0 ) + + self.m_staticTextPHD = wx.StaticText( self, wx.ID_ANY, u"PH Drill margin", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_staticTextPHD.Wrap( -1 ) + + gSizer1.Add( self.m_staticTextPHD, 1, wx.ALL, 5 ) + + self.m_textCtrlPHD = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) + gSizer1.Add( self.m_textCtrlPHD, 0, wx.ALIGN_RIGHT|wx.ALL, 5 ) + + self.m_staticTextARV = wx.StaticText( self, wx.ID_ANY, u"AR Vias", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_staticTextARV.Wrap( -1 ) + + gSizer1.Add( self.m_staticTextARV, 0, wx.ALL, 5 ) + + self.m_textCtrlARV = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) + gSizer1.Add( self.m_textCtrlARV, 0, wx.ALIGN_RIGHT|wx.ALL, 5 ) + + self.m_staticTextARP = wx.StaticText( self, wx.ID_ANY, u"AR Pads", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_staticTextARP.Wrap( -1 ) + + gSizer1.Add( self.m_staticTextARP, 0, wx.ALL, 5 ) + + self.m_textCtrlARP = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) + gSizer1.Add( self.m_textCtrlARP, 0, wx.ALIGN_RIGHT|wx.ALL, 5 ) + + + bSizer3.Add( gSizer1, 1, wx.ALIGN_CENTER|wx.ALL, 5 ) + + bSizer1 = wx.BoxSizer( wx.HORIZONTAL ) + + + bSizer1.Add( ( 0, 0), 1, wx.EXPAND, 5 ) + + self.m_buttonOK = wx.Button( self, wx.ID_OK, u"Apply", wx.DefaultPosition, wx.DefaultSize, 0 ) + + self.m_buttonOK.SetDefault() + bSizer1.Add( self.m_buttonOK, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 ) + + self.m_buttonCancel = wx.Button( self, wx.ID_CANCEL, u"Cancel", wx.DefaultPosition, wx.DefaultSize, 0 ) + bSizer1.Add( self.m_buttonCancel, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 ) + + + bSizer3.Add( bSizer1, 0, wx.ALIGN_RIGHT|wx.EXPAND, 5 ) + + bSizer4 = wx.BoxSizer( wx.VERTICAL ) + + + bSizer3.Add( bSizer4, 1, wx.EXPAND, 5 ) + + + self.SetSizer( bSizer3 ) + self.Layout() + + self.Centre( wx.BOTH ) + + def __del__( self ): + pass + + diff --git a/AnnularChecker/outDialog.fbp b/AnnularChecker/AnnularResultDlg.fbp similarity index 66% rename from AnnularChecker/outDialog.fbp rename to AnnularChecker/AnnularResultDlg.fbp index 87bc43d..5b31e95 100644 --- a/AnnularChecker/outDialog.fbp +++ b/AnnularChecker/AnnularResultDlg.fbp @@ -1,540 +1,356 @@ - - - - - - C++ - 1 - source_name - 0 - 0 - res - UTF-8 - connect - - 1000 - none - - 0 - parametersDlg - - . - - 1 - 1 - 1 - 1 - UI - 0 - 0 - - 0 - wxAUI_MGR_DEFAULT - - wxBOTH - - 1 - 1 - impl_virtual - - - - 0 - wxID_ANY - - - displayDialog - - 320,521 - wxDEFAULT_DIALOG_STYLE - ; forward_declare - Annular Checker - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bSizer1 - wxVERTICAL - none - - 5 - wxEXPAND - 1 - - - bSizer2 - wxVERTICAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - m_staticTitle - 1 - - - protected - 1 - - Resizable - 1 - - - ; forward_declare - 0 - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - -1,400 - 1 - m_richText1 - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_READONLY - ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - wxVSCROLL|wxHSCROLL|wxNO_BORDER|wxWANTS_CHARS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxEXPAND - 1 - - 2 - 0 - - gSizer3 - none - 0 - 0 - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - OK - - 0 - - 0 - - - 0 - - 1 - ok_btn - 1 - - - protected - 1 - - - - Resizable - 1 - - - ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Copy Text - - 0 - - 0 - - - 0 - - 1 - copy_btn - 1 - - - protected - 1 - - - - Resizable - 1 - - - ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + Python + 1 + source_name + 0 + 0 + res + UTF-8 + connect + AnnularResultDlg + 1000 + none + + 0 + AnnularResultDlg + + . + + 1 + 1 + 1 + 1 + UI + 0 + 0 + + 0 + wxAUI_MGR_DEFAULT + + wxBOTH + + 1 + 1 + impl_virtual + + + + 0 + wxID_ANY + + + AnnularResultDlg + + 383,521 + wxDEFAULT_DIALOG_STYLE + ; forward_declare + Annular Checker + + + + + + + bSizer1 + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + + bSizer2 + wxVERTICAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + m_staticTitle + 1 + + + protected + 1 + + Resizable + 1 + + + ; forward_declare + 0 + + + + + -1 + + + + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + -1,400 + 1 + m_richTextResult + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_READONLY + ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + wxVSCROLL|wxHSCROLL|wxNO_BORDER|wxWANTS_CHARS + + + + 5 + wxEXPAND + 1 + + 2 + 0 + + gSizer3 + none + 0 + 0 + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + OK + + 0 + + 0 + + + 0 + + 1 + ok_btn + 1 + + + protected + 1 + + + + Resizable + 1 + + + ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Copy Text + + 0 + + 0 + + + 0 + + 1 + copy_btn + 1 + + + protected + 1 + + + + Resizable + 1 + + + ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + diff --git a/AnnularChecker/AnnularResultDlg.py b/AnnularChecker/AnnularResultDlg.py new file mode 100644 index 0000000..71d10a4 --- /dev/null +++ b/AnnularChecker/AnnularResultDlg.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- + +########################################################################### +## Python code generated with wxFormBuilder (version Oct 26 2018) +## http://www.wxformbuilder.org/ +## +## PLEASE DO *NOT* EDIT THIS FILE! +########################################################################### + +import wx +import wx.xrc +import wx.richtext + +########################################################################### +## Class AnnularResultDlg +########################################################################### + +class AnnularResultDlg ( wx.Dialog ): + + def __init__( self, parent ): + wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = u"Annular Checker", pos = wx.DefaultPosition, size = wx.Size( 383,521 ), style = wx.DEFAULT_DIALOG_STYLE ) + + self.SetSizeHints( wx.DefaultSize, wx.DefaultSize ) + + bSizer1 = wx.BoxSizer( wx.VERTICAL ) + + bSizer2 = wx.BoxSizer( wx.VERTICAL ) + + self.m_staticTitle = wx.StaticText( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_staticTitle.Wrap( -1 ) + + bSizer2.Add( self.m_staticTitle, 0, wx.ALL, 5 ) + + self.m_richTextResult = wx.richtext.RichTextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, wx.TE_READONLY|wx.VSCROLL|wx.HSCROLL|wx.NO_BORDER|wx.WANTS_CHARS ) + self.m_richTextResult.SetMinSize( wx.Size( -1,400 ) ) + + bSizer2.Add( self.m_richTextResult, 1, wx.EXPAND |wx.ALL, 5 ) + + gSizer3 = wx.GridSizer( 0, 2, 0, 0 ) + + self.ok_btn = wx.Button( self, wx.ID_ANY, u"OK", wx.DefaultPosition, wx.DefaultSize, 0 ) + gSizer3.Add( self.ok_btn, 0, wx.ALL, 5 ) + + self.copy_btn = wx.Button( self, wx.ID_ANY, u"Copy Text", wx.DefaultPosition, wx.DefaultSize, 0 ) + gSizer3.Add( self.copy_btn, 0, wx.ALL, 5 ) + + + bSizer2.Add( gSizer3, 1, wx.EXPAND, 5 ) + + + bSizer1.Add( bSizer2, 1, wx.EXPAND, 5 ) + + + self.SetSizer( bSizer1 ) + self.Layout() + + self.Centre( wx.BOTH ) + + def __del__( self ): + pass + + diff --git a/AnnularChecker/__init__ (copy).py.txt b/AnnularChecker/__init__ (copy).py.txt deleted file mode 100644 index 7caa4ab..0000000 --- a/AnnularChecker/__init__ (copy).py.txt +++ /dev/null @@ -1,2 +0,0 @@ -from .annular_checker import annular_check -annular_check().register() diff --git a/AnnularChecker/__init__.pyc b/AnnularChecker/__init__.pyc deleted file mode 100644 index 1d8da1e..0000000 Binary files a/AnnularChecker/__init__.pyc and /dev/null differ diff --git a/AnnularChecker/__init__HTML.py.txt b/AnnularChecker/__init__HTML.py.txt deleted file mode 100644 index ba81907..0000000 --- a/AnnularChecker/__init__HTML.py.txt +++ /dev/null @@ -1,2 +0,0 @@ -from .annular_checker_html import annular_check -annular_check().register() diff --git a/AnnularChecker/__init__OLD.py.txt b/AnnularChecker/__init__OLD.py.txt deleted file mode 100644 index bae6b54..0000000 --- a/AnnularChecker/__init__OLD.py.txt +++ /dev/null @@ -1,56 +0,0 @@ -from annular_checker import annular_check -import pcbnew -import wx -import wx.aui -import threading -import time -import sys -import subprocess -import os -# import pcbnew -from pcbnew import * -# import base64 -from wx.lib.embeddedimage import PyEmbeddedImage - -plugin = annular_check() -plugin.register() - - -def check_for_annular_button(): - # From Miles McCoo's blog - # https://kicad.mmccoo.com/2017/03/05/adding-your-own-command-buttons-to-the-pcbnew-gui/ - def find_pcbnew_window(): - windows = wx.GetTopLevelWindows() - pcbnewwn = [w for w in windows if "Pcbnew" in w.GetTitle()] - if len(pcbnewwn) != 1: - return None - return pcbnewwn[0] - - def callback(_): - plugin.Run() - - import os - path = os.path.dirname(__file__) - bm = wx.Bitmap(path + '/annular.png', wx.BITMAP_TYPE_PNG) - button_wx_item_id = 1 - while True: - time.sleep(1.5) - pcbwin = find_pcbnew_window() - if not pcbwin: - continue - - top_tb = pcbwin.FindWindowById(pcbnew.ID_H_TOOLBAR) - if button_wx_item_id == 1 or not top_tb.FindTool(button_wx_item_id): - #top_tb.AddSeparator() - button_wx_item_id = wx.NewId() - top_tb.AddTool(button_wx_item_id, "aChecker", bm, - "PCB Annular Checker", wx.ITEM_NORMAL) - - top_tb.Bind(wx.EVT_TOOL, callback, id=button_wx_item_id) - top_tb.Realize() - - -if 0: - t = threading.Thread(target=check_for_annular_button) - t.daemon = True - t.start() diff --git a/AnnularChecker/annular_checker-OLD.py.txt b/AnnularChecker/annular_checker-OLD.py.txt deleted file mode 100644 index 4375337..0000000 --- a/AnnularChecker/annular_checker-OLD.py.txt +++ /dev/null @@ -1,609 +0,0 @@ -# -*- coding: utf-8 -*- -# -# A script to check for annular ring violations -# both for TH pads and vias -# requirements: KiCAD pcbnew >= 4.0 -# annular.py release "1.5.1" -# -# annular.py checking PCB for Annular Ring in Vias and TH Pads -# (SMD, Connector and NPTH are skipped) -# default Annular Ring >= 0.15 both for TH Pads and Vias -# to change values modify: -# -# AR_SET = 0.150 #minimum annular accepted for pads -# AR_SET_V = 0.150 #minimum annular accepted for vias - -# annular.py - - -___version___="1.6.0" - -global mm_ius, DRL_EXTRA, AR_SET, AR_SET_V, DRL_EXTRA_ius, MIN_AR_SIZE, MIN_AR_SIZE_V, found_violations, LogMsg -#wx.LogMessage("My message") -mm_ius = 1000000.0 -# (consider always drill +0.1) -DRL_EXTRA=0.1 -DRL_EXTRA_ius=DRL_EXTRA * mm_ius - -AR_SET = 0.125 #minimum annular accepted for pads -MIN_AR_SIZE = AR_SET * mm_ius - -AR_SET_V = 0.125 #minimum annular accepted for vias -MIN_AR_SIZE_V = AR_SET_V * mm_ius - -import sys -import wx -import wx.richtext -import subprocess -import os -import pcbnew -from pcbnew import * -import base64 -from wx.lib.embeddedimage import PyEmbeddedImage -sys.path.append(os.path.dirname(__file__)) - - -class annular_check( pcbnew.ActionPlugin ): - """ - A script to check for annular ring violations - both for TH pads and vias - requirements: KiCAD pcbnew >= 4.0 - annular.py release "1.5.1" - - annular.py checking PCB for Annular Ring in Vias and TH Pads - (SMD, Connector and NPTH are skipped) - default Annular Ring >= 0.15 both for TH Pads and Vias - to change values modify: - - AR_SET = 0.150 #minimum annular accepted for pads - AR_SET_V = 0.150 #minimum annular accepted for vias - """ - - 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 = "Annular check" - self.category = "Checking PCB" - self.description = "Automaticaly check annular 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__), 'annular.png') - - def Run( self ): - - ########################################################################### - ## Class AR_Prm - ########################################################################### - - class AR_Prm ( wx.Dialog ): - - def __init__( self, parent ): - wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = "AR parameters", pos = wx.DefaultPosition, size = wx.Size( 320,193 ), style = wx.DEFAULT_DIALOG_STYLE ) - - self.SetSizeHints( 500,500 ) - - self.SetIcon(PyEmbeddedImage(annular_ico_b64_data).GetIcon()) - - bSizer1 = wx.BoxSizer( wx.VERTICAL ) - - gSizer2 = wx.GridSizer( 0, 2, 0, 0 ) - - self.m_staticText11 = wx.StaticText( self, wx.ID_ANY, u"PHD margin", wx.Point( -1,-1 ), wx.DefaultSize, 0 ) - self.m_staticText11.Wrap( -1 ) - - gSizer2.Add( self.m_staticText11, 0, wx.ALL, 5 ) - - self.m_textPHD = wx.TextCtrl( self, wx.ID_ANY, str(DRL_EXTRA), wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer2.Add( self.m_textPHD, 0, wx.ALL, 5 ) - - self.m_staticText1 = wx.StaticText( self, wx.ID_ANY, u"AR for pads", wx.Point( -1,-1 ), wx.DefaultSize, 0 ) - self.m_staticText1.Wrap( -1 ) - - gSizer2.Add( self.m_staticText1, 0, wx.ALL, 5 ) - - self.m_textAR_SET = wx.TextCtrl( self, wx.ID_ANY, str(AR_SET), wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer2.Add( self.m_textAR_SET, 0, wx.ALL, 5 ) - - self.m_staticText12 = wx.StaticText( self, wx.ID_ANY, u"AR for vias", wx.Point( -1,-1 ), wx.DefaultSize, 0 ) - self.m_staticText12.Wrap( -1 ) - - gSizer2.Add( self.m_staticText12, 0, wx.ALL, 5 ) - - self.m_textAR_SET_V = wx.TextCtrl( self, wx.ID_ANY, str(AR_SET_V), wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer2.Add( self.m_textAR_SET_V, 0, wx.ALL, 5 ) - - - bSizer1.Add( gSizer2, 1, wx.EXPAND, 5 ) - - gSizer1 = wx.GridSizer( 0, 2, 0, 0 ) - - self.m_ok_btn = wx.Button( self, wx.ID_ANY, u"OK", wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer1.Add( self.m_ok_btn, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 ) - - # self.m_cancel_btn = wx.Button( self, wx.ID_ANY, u"Cancel", wx.DefaultPosition, wx.DefaultSize, 0 ) - # gSizer1.Add( self.m_cancel_btn, 0, wx.ALL, 5 ) - - - bSizer1.Add( gSizer1, 1, wx.EXPAND, 5 ) - - - self.SetSizer( bSizer1 ) - self.Layout() - - self.Centre( wx.BOTH ) - - #### ----- connections - # Connect Events - self.Bind(wx.EVT_BUTTON, self.OnClickOK, self.m_ok_btn) - # self.Bind(wx.EVT_BUTTON, self.OnClickCancel, self.m_cancel_btn) - # Tooltips - #self.m_cancel_btn.SetToolTip( wx.ToolTip(u"Cancel" )) - self.m_ok_btn.SetToolTip( wx.ToolTip(u"Confirm" )) - self.m_ok_btn.SetFocus() - self.m_staticText1.SetToolTip( wx.ToolTip(u"Annular Ring for Pads (mm)" )) - self.m_textAR_SET.SetToolTip( wx.ToolTip(u"Annular Ring for Pads (mm)" )) - self.m_textAR_SET_V.SetToolTip( wx.ToolTip(u"Annular Ring for Vias (mm)" )) - self.m_staticText12.SetToolTip( wx.ToolTip(u"Annular Ring for Vias (mm)" )) - self.m_textPHD.SetToolTip( wx.ToolTip(u"Drill extra margin (mm)" )) - self.m_staticText11.SetToolTip( wx.ToolTip(u"Drill extra margin (mm)" )) - - def __del__( self ): - pass - - def OnClickOK(self, event): - global mm_ius, DRL_EXTRA, AR_SET, AR_SET_V, DRL_EXTRA_ius, MIN_AR_SIZE, MIN_AR_SIZE_V - - self.m_ok_btn.SetLabel("Clicked") - phd = float(self.m_textPHD.GetValue().replace(',','.')) - ar = float(self.m_textAR_SET.GetValue().replace(',','.')) - arv = float(self.m_textAR_SET_V.GetValue().replace(',','.')) - DRL_EXTRA=phd - DRL_EXTRA_ius=DRL_EXTRA * mm_ius - - AR_SET = ar #minimum annular accepted for pads - MIN_AR_SIZE = AR_SET * mm_ius - - AR_SET_V = arv #minimum annular accepted for vias - MIN_AR_SIZE_V = AR_SET_V * mm_ius - self.Destroy() - - def OnClickCancel(self, event): - self.m_cancel_btn.SetLabel("Clicked") - self.Destroy() - - #wx.MessageDialog(self.frame,"ciao") - #subprocess.check_call(["C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"]) - #http://stackoverflow.com/questions/1811691/running-an-outside-program-executable-in-python - - ## class displayDialog(wx.Dialog): - ## """ - ## The default frame - ## http://stackoverflow.com/questions/3566603/how-do-i-make-wx-textctrl-multi-line-text-update-smoothly - ## """ - ## global mm_ius, DRL_EXTRA, AR_SET, AR_SET_V, DRL_EXTRA_ius, MIN_AR_SIZE, MIN_AR_SIZE_V, found_violations - ## #---------------------------------------------------------------------- - ## #def __init__(self): - ## # """Constructor""" - ## # wx.Frame.__init__(self, None, title="Display Frame", style=wx.DEFAULT_FRAME_STYLE, wx.ICON_INFORMATION) - ## # panel = wx.Panel(self) - ## def __init__(self, parent): - ## wx.Dialog.__init__(self, parent, id=-1, title="Annular Checker")# - ## #, style=wx.DEFAULT_DIALOG_STYLE, wx.ICON_INFORMATION) - ## #, style=wx.DEFAULT_DIALOG_STYLE, wx.ICON_INFORMATION) - ## #, pos=DefaultPosition, size=DefaultSize, style = wx.DEFAULT_FRAME_STYLE & (~wx.MAXIMIZE_BOX), name="fname") - ## #, wx.ICON_INFORMATION) #, title="Annular Check", style=wx.DEFAULT_FRAME_STYLE, wx.ICON_INFORMATION) - ## # - ## - ## self.SetIcon(PyEmbeddedImage(annular_ico_b64_data).GetIcon()) - ## #wx.IconFromBitmap(wx.Bitmap("icon.ico", wx.BITMAP_TYPE_ANY))) - ## self.panel = wx.Panel(self) - ## - ## if found_violations: - ## self.title = wx.StaticText(self.panel, label="") - ## #self.title.SetForegroundColour('#FF0000') - ## #self.title.SetBackgroundColour('#FF0000') - ## #font = wx.Font(wx.DEFAULT, wx.DECORATIVE, wx.ITALIC, wx.BOLD) - ## #self.title.SetFont(font) - ## else: - ## self.title = wx.StaticText(self.panel, label="") - ## #self.title.SetBackgroundColour('#00FF00') - ## #font = wx.Font(wx.DEFAULT, wx.DECORATIVE, wx.ITALIC, wx.BOLD) - ## #self.title.SetFont(font) - ## #self.result = wx.StaticText(self.panel, label="") - ## #self.result.SetForegroundColour('#FF0000') - ## #self.button = wx.Button(self.panel, label="Save") - ## #self.lblname = wx.StaticText(self.panel, label="Your name:") - ## #self.editname = wx.TextCtrl(self.panel, size=(140, -1)) - ## ##self.editname = wx.TextCtrl(self.panel, size = (400, 400), style = wx.TE_MULTILINE|wx.TE_READONLY) - ## self.m_richText1 = wx.richtext.RichTextCtrl( self.panel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, size = (400, 400), style = 0|wx.VSCROLL|wx.HSCROLL|wx.WANTS_CHARS )# wx.TE_MULTILINE|wx.TE_READONLY) #0|wx.VSCROLL|wx.HSCROLL|wx.NO_BORDER|wx.WANTS_CHARS ) - ## #bSizer1.Add( self.m_richText1, 1, wx.EXPAND |wx.ALL, 5 ) - ## - ## - ## # Set sizer for the frame, so we can change frame size to match widgets - ## self.windowSizer = wx.BoxSizer() - ## self.windowSizer.Add(self.panel, 1, wx.ALL | wx.EXPAND) - ## - ## # Set sizer for the panel content - ## self.sizer = wx.GridBagSizer(5, 0) - ## self.sizer.Add(self.title, (0, 0)) - ## #self.sizer.Add(self.result, (1, 0)) - ## #self.sizer.Add(self.lblname, (1, 0)) - ## ## self.sizer.Add(self.editname, (1, 0)) - ## self.sizer.Add(self.m_richText1, (1, 0)) - ## #self.ok_btn = wx.Button( self, wx.ID_ANY, u"Copy errors", wx.DefaultPosition, wx.DefaultSize, 0 ) - ## #self.sizer.Add( self.ok_btn, 0, wx.ALL | wx.EXPAND) - ## #self.sizer.Add(self.ok_btn, (2, 0)) #, wx.ALL | flag=wx.EXPAND) - ## #self.sizer.Add( self.ok_btn, 0, wx.ALL, 5 ) - ## - ## #self.sizer.Add(self.ok_btn, (2, 0), (1, 2), flag=wx.EXPAND) - ## - ## # Set simple sizer for a nice border - ## self.border = wx.BoxSizer() - ## self.border.Add(self.sizer, 1, wx.ALL | wx.EXPAND, 5) - ## - ## #self.ok_btn = wx.Button( self, wx.ID_ANY, u"Copy errors", wx.DefaultPosition, wx.DefaultSize, 0 ) - ## #self.windowSizer.Add(self.ok_btn, 0, wx.ALL) - ## #self.sizer.Add( self.ok_btn, (2,0)) - ## #self.sizer.Add( self.ok_btn, 0, wx.ALL, 5 ) - ## # Use the sizers - ## self.panel.SetSizerAndFit(self.border) - ## self.SetSizerAndFit(self.windowSizer) - ## #self.result.SetLabel(msg) - ## # Set event handlers - ## #self.button.Bind(wx.EVT_BUTTON, self.OnButton) - ## #self.Show() - ## #self.Bind(wx.EVT_CLOSE,self.OnClose) - ## - ## #def OnClose(self,e): - ## # #wx.LogMessage("c") - ## # e.Skip() - ## #self.Close() - ########################################################################### - ## Class displayDialog - ########################################################################### - - class displayDialog ( wx.Dialog ): - - global mm_ius, DRL_EXTRA, AR_SET, AR_SET_V, DRL_EXTRA_ius, MIN_AR_SIZE, MIN_AR_SIZE_V, found_violations, LogMsg - - def __init__( self, parent ): - wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = u"Annular Checker", pos = wx.DefaultPosition, size = wx.Size( 450,521 ), style = wx.DEFAULT_DIALOG_STYLE ) - - self.SetSizeHints( 300,100 ) - self.SetIcon(PyEmbeddedImage(annular_ico_b64_data).GetIcon()) - - bSizer1 = wx.BoxSizer( wx.VERTICAL ) - - bSizer2 = wx.BoxSizer( wx.VERTICAL ) - - self.m_staticTitle = wx.StaticText( self, wx.ID_ANY, u"", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.m_staticTitle.Wrap( -1 ) - - bSizer2.Add( self.m_staticTitle, 0, wx.ALL, 5 ) - - self.m_richText1 = wx.richtext.RichTextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, wx.TE_READONLY|wx.VSCROLL|wx.HSCROLL|wx.NO_BORDER|wx.WANTS_CHARS ) - self.m_richText1.SetMinSize( wx.Size( 400,400 ) ) - - bSizer2.Add( self.m_richText1, 1, wx.EXPAND |wx.ALL, 5 ) - - gSizer3 = wx.GridSizer( 0, 2, 0, 0 ) - - self.ok_btn = wx.Button( self, wx.ID_ANY, u"OK", wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer3.Add( self.ok_btn, 0, wx.ALL, 5 ) - - self.copy_btn = wx.Button( self, wx.ID_ANY, u"Copy Text", wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer3.Add( self.copy_btn, 0, wx.ALL, 5 ) - - - bSizer2.Add( gSizer3, 1, wx.EXPAND, 5 ) - - - bSizer1.Add( bSizer2, 1, wx.EXPAND, 5 ) - - - self.SetSizer( bSizer1 ) - self.Layout() - - self.Centre( wx.BOTH ) - - #### ----- connections - # Connect Events - self.Bind(wx.EVT_BUTTON, self.OnClickOK, self.ok_btn) - self.Bind(wx.EVT_BUTTON, self.OnClickCopy, self.copy_btn) - self.ok_btn.SetFocus() - # Tooltips - self.copy_btn.SetToolTip( wx.ToolTip(u"Copy Text to Clipboard" )) - self.ok_btn.SetToolTip( wx.ToolTip(u"Exit" )) - - def __del__( self ): - pass - - def OnClickOK(self, event): - self.Destroy() - - def OnClickCopy(self, event): - self.m_richText1.SelectAll() - self.m_richText1.Copy() - #global LogMsg - #copy2clip(LogMsg) - self.copy_btn.SetLabel("Text Copied") - - #def setMsg(self, t_msg): - # pass - #self.editname.SetValue(t_msg) - #self.m_richText1.BeginBold() - #self.m_richText1.WriteText(" You are in ") - #self.m_richText1.BeginTextColour('red') - #self.m_richText1.WriteText("danger ") - #self.m_richText1.EndTextColour() - #self.m_richText1.WriteText("at that spot!") - #self.m_richText1.EndBold() - #self.m_richText1.SetValue(t_msg) - #self.m_htmlWin1.SetPage(t_msg) - - - def annring_size(pad): - # valid for oval pad/drills - annrX=(pad.GetSize()[0] - (pad.GetDrillSize()[0]+DRL_EXTRA_ius))/2 - annrY=(pad.GetSize()[1] - (pad.GetDrillSize()[1]+DRL_EXTRA_ius))/2 - #annr=min(pad.GetSize()) - max(pad.GetDrillSize()) - #if annr < MIN_AR_SIZE: - #print annrX - #print annrY - #print pad.GetSize()[0]/mm_ius - #print pad.GetSize()[0]#/mm_ius - #print pad.GetDrillSize()[0]#/mm_ius - #print DRL_EXTRA_ius - #print pad.GetDrillSize()[0]/mm_ius - #print (pad.GetDrillSize()[0]+DRL_EXTRA_ius)/mm_ius - #print annrX/mm_ius - return min(annrX,annrY) - - def annringNP_size(pad): - # valid for oval pad/drills - annrX=(pad.GetSize()[0] - (pad.GetDrillSize()[0]))/2 - annrY=(pad.GetSize()[1] - (pad.GetDrillSize()[1]))/2 - #annr=min(pad.GetSize()) - max(pad.GetDrillSize()) - #if annr < MIN_AR_SIZE: - #print annrX - #print annrY - #print pad.GetSize()[0]/mm_ius - #print pad.GetSize()[0]#/mm_ius - #print pad.GetDrillSize()[0]#/mm_ius - #print DRL_EXTRA_ius - #print pad.GetDrillSize()[0]/mm_ius - #print (pad.GetDrillSize()[0]+DRL_EXTRA_ius)/mm_ius - #print annrX/mm_ius - #return min(annrX,annrY) - return annrX,annrY - - def vias_annring_size(via): - # calculating via annular - annr=(via.GetWidth() - (via.GetDrillValue()+DRL_EXTRA_ius))/2 - #print via.GetWidth() - #print via.GetDrillValue() - return annr - - def f_mm(raw): - return repr(raw/mm_ius) - - board = pcbnew.GetBoard() - PassC=FailC=0 - PassCV=FailCV=0 - - PassCN=FailCN=0 - PassCVN=FailCVN=0 - - fileName = GetBoard().GetFileName() - if len(fileName)==0: - wx.LogMessage("a board needs to be saved/loaded!") - else: - found_violations=False - frame1 = AR_Prm(None) - #frame = wx.Frame(None) - frame1.Center() - #frame.setMsg(LogMsg) - frame1.ShowModal() - frame1.Destroy() - - frame = displayDialog(None) - LogMsg="" - writeTxt= frame.m_richText1.WriteText - rt = frame.m_richText1 - rt.BeginItalic() - writeTxt("'action_menu_annular_check.py'\n") - #frame.m_richText1.WriteText("'action_menu_annular_check.py'\n") - msg="'action_menu_annular_check.py'\n" - msg+="version = "+___version___ - writeTxt("version = "+___version___) - msg+="\nTesting PCB for Annular Rings\nTH Pads >= "+repr(AR_SET)+" Vias >= "+repr(AR_SET_V)+"\nPHD margin on PTH = "+ repr(DRL_EXTRA) - writeTxt("\nTesting PCB for Annular Rings\nTH Pads >= "+repr(AR_SET)+" Vias >= "+repr(AR_SET_V)+"\nPHD margin on PTH = "+ repr(DRL_EXTRA)) - rt.EndItalic() - writeTxt('\n\n') - #print (msg) - LogMsg+=msg+'\n\n' - - # print "LISTING VIAS:" - for item in board.GetTracks(): - if type(item) is pcbnew.VIA: - pos = item.GetPosition() - drill = item.GetDrillValue() - width = item.GetWidth() - ARv = vias_annring_size(item) - if ARv < MIN_AR_SIZE_V: - # print("AR violation at %s." % (pad.GetPosition() / mm_ius )) Raw units, needs fixing - XYpair = item.GetPosition() - msg="AR Via violation of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1]) - rt.BeginTextColour('red') - writeTxt("AR Via violation of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1])+'\n') - rt.EndTextColour() - #print (msg) - LogMsg+=msg+'\n' - FailCV = FailCV+1 - else: - PassCV = PassCV+1 - #print type(item) - - msg="VIAS that Pass = "+repr(PassCV)+"; Fails = "+repr(FailCV) - if FailCV >0: - rt.BeginBold() - writeTxt("VIAS that Pass = "+repr(PassCV)+"; ") - if FailCV >0: - rt.BeginTextColour('red') - writeTxt("Fails = "+repr(FailCV)+'\n\n') - if FailCV >0: - rt.EndTextColour() - rt.EndBold() - print(msg) - LogMsg+=msg+'\n' - - for module in board.GetModules(): - try: - module_Pads=module.PadsList() - except: - module_Pads=module.Pads() - for pad in module_Pads: #print(pad.GetAttribute()) - if pad.GetAttribute() == PAD_ATTRIB_STANDARD: #TH pad - ARv = annring_size(pad) - #print(f_mm(ARv)) - if ARv < MIN_AR_SIZE: - # print("AR violation at %s." % (pad.GetPosition() / mm_ius )) Raw units, needs fixing - XYpair = pad.GetPosition() - msg="AR PTH violation of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1]) - rt.BeginTextColour('red') - writeTxt("AR PTH violation of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1])+'\n') - rt.EndTextColour() - #print (msg) - LogMsg+=msg+'\n' - FailC = FailC+1 - else: - PassC = PassC+1 - if pad.GetAttribute() == PAD_ATTRIB_HOLE_NOT_PLATED: - ARvX, ARvY = annringNP_size(pad) - #print(f_mm(ARvX));print(f_mm(ARvY)) - if (ARvX) != 0 or ARvY != 0: - ARv = min(ARvX, ARvY) - if ARv < MIN_AR_SIZE: - # print("AR violation at %s." % (pad.GetPosition() / mm_ius )) Raw units, needs fixing - XYpair = pad.GetPosition() - msg="AR NPTH warning of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1]) - rt.BeginTextColour('red') - writeTxt("AR NPTH warning of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1])+'\n') - rt.EndTextColour() - #print (msg) - LogMsg+=msg+'\n' - FailCN = FailCN+1 - else: - PassCN = PassCN+1 - else: - PassCN = PassCN+1 - - #if FailCV >0: - #writeTxt('\n') - msg = "TH PADS that Pass = "+repr(PassC)+"; Fails = "+repr(FailC) - if FailC >0: - rt.BeginBold() - writeTxt("TH PADS that Pass = "+repr(PassC)+"; ") - if FailC >0: - rt.BeginTextColour('red') - writeTxt("Fails = "+repr(FailC)+'\n') - if FailC >0: - rt.EndTextColour() - rt.EndBold() - print(msg) - LogMsg+=msg+'\n' - - msg="NPTH PADS that Pass = "+repr(PassCN)+"; Fails = "+repr(FailCN) - #writeTxt('\n') - if FailCN >0: - rt.BeginBold() - writeTxt("NPTH PADS that Pass = "+repr(PassCN)+"; ") - if FailCN >0: - rt.BeginTextColour('red') - writeTxt("Fails = "+repr(FailCN)+'\n') - if FailC >0: - rt.EndTextColour() - rt.EndBold() - print(msg) - LogMsg+=msg+'\n' - - pcbName = (os.path.splitext(GetBoard().GetFileName())[0]) #filename no ext - #wx.LogMessage(pcbName)#LogMsg) - ##wx.LogMessage(LogMsg) - FC=r"C:\FreeCAD\bin\freecad.exe" - kSU=r"C:\Cad\Progetti_K\3D-FreeCad-tools\kicad-StepUp-tools.FCMacro" - #subprocess.check_call([FC, kSU, pcbName]) - ##p = subprocess.Popen([FC, kSU, pcbName]) - - #found_violations=False - if (FailC+FailCN+FailCV)>0: - found_violations=True - - if found_violations: - #frame.m_staticTitle = wx.StaticText(frame, label=" Check result: (Violations found)") - frame.m_staticTitle.SetLabel(" Check result: (Violations found)") - #self.title.SetForegroundColour('#FF0000') - frame.m_staticTitle.SetBackgroundColour('#FF0000') - font = wx.Font(wx.DEFAULT, wx.DECORATIVE, wx.ITALIC, wx.BOLD) - frame.m_staticTitle.SetFont(font) - else: - #frame.m_staticTitle = wx.StaticText(frame, label=" Annular Check result: OK") - frame.m_staticTitle.SetLabel(" Annular Check result: OK") - frame.m_staticTitle.SetBackgroundColour('#00FF00') - font = wx.Font(wx.DEFAULT, wx.DECORATIVE, wx.ITALIC, wx.BOLD) - frame.m_staticTitle.SetFont(font) - ##frame = displayDialog(None) - #frame = wx.Frame(None) - frame.Center() - #frame.setMsg(LogMsg) - #frame.Show(True) - frame.ShowModal() - #frame.show() - frame.Destroy() - #frame = wx.wxFrame(None, 10110, 'T-Make', size=wx.wxSize(100,100), - # style=wx.wxSTAY_ON_TOP) - #frame.show() - -# annular_check().register() -if __name__ == "__main__": - import argparse - - parser = argparse.ArgumentParser( - description='KiCad PCB Annular Checker') - parser.add_argument('file', type=str, help="KiCad PCB file") - args = parser.parse_args() - print("Loading %s" % args.file) - main(pcbnew.LoadBoard(args.file)) - -else: - annular_check().register() - - -# "b64_data" is a variable containing your base64 encoded jpeg -annular_ico_b64_data =\ -""" -iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAIQQAACEEB+v+u9gAAABl0RVh0U29mdHdhcmUAd3d -3Lmlua3NjYXBlLm9yZ5vuPBoAAAJ5SURBVDiNdZRNSFRRFMd/976ZJjeBn2PUoiLaiMFkFkHIQ0NBdBUlJuIqiixmIYjQRgiJYKAMXRRSi6TCD5gaWiSFsy -gixOyDpDAog8wn9SISapz33m0x82bmzcOzO/97/r973nn3XqGUojjCybIm4BhQD9Rl5XlgDnhi6ObTYo8oBIWTZeXAMNDlalW/FJYmMLd5fONA1NBN0wcKJ -8sagftAZWRJcWHS5vCiouJ3pnClUvC8VnDtpOTTDgGwCpwydHM2Bwony8LAe6koH7hjc37aQXN8XwzAv5DgUo9krF0C/ABqDN1ck9n1G0D54C2H6OTmEICt -KcXQTZvTCQegAhgFEFWzpW1A4uAHRaLfQhbPXgD+/8HfkKBhNMDXMACtEmgC6L/reCBWKGAzMmLxbQWWl2Fw0FJavqIkpYhO2m7aHADqNQcOLXq3DcSuKnp -6Ajmhry8g1tfTxGJBVzryLuepl0Bk16qiJJUHKU0qOjryEDe6u4OF6e7vitCGAohIAFk0XCWEQkp8oWmeVAAiu78EFj5vF6S2iFyBtGxJPJ72gSYmPNpyOH -McgAUJzFkazO/zetLRc4J43MayIJWCsTHLuTzkaellTa7rOVE1W9oOPDz6VjF90fI14QQ1RzhKCNsRhfpGEBqvB1jaKQDapKGbCeDBs/2C8Rb/XGTalsUQg -Fin5kKmDN185DrPAD8HzmrcbpUony0flgZXujSGT+SuSC94L20LcA8obXiduSp1H8kdiz8l8KJWEOvUeLNXuJAuQzdnPKAsrBoYAY4DaA7sWck8I1+qKex0 -Cug1dHPNFcQmD1sL0AwcACJZeQF4BcwYuvm42PMfVgD11Y9MUIEAAAAASUVORK5CYII= -""" - - -# execfile("annular.py") -# annular.py Testing PCB for Annular Ring >= 0.15 -# AR violation of 0.1 at XY 172.974,110.744 -# VIAS that Pass = 100 Fails = 1 -# AR violation of 0.1 at XY 172.212,110.744 -# AR violation of 0.0 at XY 154.813,96.52 -# PADS that Pass = 49 Fails = 2 - diff --git a/AnnularChecker/annular_checker-html.py.txt b/AnnularChecker/annular_checker-html.py.txt deleted file mode 100644 index d8fa608..0000000 --- a/AnnularChecker/annular_checker-html.py.txt +++ /dev/null @@ -1,455 +0,0 @@ -# -*- coding: utf-8 -*- -# -# A script to check for annular ring violations -# both for TH pads and vias -# requirements: KiCAD pcbnew >= 4.0 -# annular.py release "1.5.1" -# -# annular.py checking PCB for Annular Ring in Vias and TH Pads -# (SMD, Connector and NPTH are skipped) -# default Annular Ring >= 0.15 both for TH Pads and Vias -# to change values modify: -# -# AR_SET = 0.150 #minimum annular accepted for pads -# AR_SET_V = 0.150 #minimum annular accepted for vias - -# annular.py - - -___version___="1.5.7" - -global mm_ius, DRL_EXTRA, AR_SET, AR_SET_V, DRL_EXTRA_ius, MIN_AR_SIZE, MIN_AR_SIZE_V, found_violations -#wx.LogMessage("My message") -mm_ius = 1000000.0 -# (consider always drill +0.1) -DRL_EXTRA=0.1 -DRL_EXTRA_ius=DRL_EXTRA * mm_ius - -AR_SET = 0.125 #minimum annular accepted for pads -MIN_AR_SIZE = AR_SET * mm_ius - -AR_SET_V = 0.125 #minimum annular accepted for vias -MIN_AR_SIZE_V = AR_SET_V * mm_ius - -import sys -import wx -import wx.html -import subprocess -import os -import pcbnew -from pcbnew import * -import base64 -from wx.lib.embeddedimage import PyEmbeddedImage -sys.path.append(os.path.dirname(__file__)) - - - -class annular_check( pcbnew.ActionPlugin ): - """ - A script to check for annular ring violations - both for TH pads and vias - requirements: KiCAD pcbnew >= 4.0 - annular.py release "1.5.1" - - annular.py checking PCB for Annular Ring in Vias and TH Pads - (SMD, Connector and NPTH are skipped) - default Annular Ring >= 0.15 both for TH Pads and Vias - to change values modify: - - AR_SET = 0.150 #minimum annular accepted for pads - AR_SET_V = 0.150 #minimum annular accepted for vias - """ - - 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 = "Annular check" - self.category = "Checking PCB" - self.description = "Automaticaly check annular on an existing PCB" - - def Run( self ): - - ########################################################################### - ## Class AR_Prm - ########################################################################### - - class AR_Prm ( wx.Dialog ): - - def __init__( self, parent ): - wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = "AR parameters", pos = wx.DefaultPosition, size = wx.Size( 320,193 ), style = wx.DEFAULT_DIALOG_STYLE ) - - self.SetSizeHints( 500,500 ) - - self.SetIcon(PyEmbeddedImage(annular_ico_b64_data).GetIcon()) - - bSizer1 = wx.BoxSizer( wx.VERTICAL ) - - gSizer2 = wx.GridSizer( 0, 2, 0, 0 ) - - self.m_staticText11 = wx.StaticText( self, wx.ID_ANY, u"PHD margin", wx.Point( -1,-1 ), wx.DefaultSize, 0 ) - self.m_staticText11.Wrap( -1 ) - - gSizer2.Add( self.m_staticText11, 0, wx.ALL, 5 ) - - self.m_textPHD = wx.TextCtrl( self, wx.ID_ANY, str(DRL_EXTRA), wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer2.Add( self.m_textPHD, 0, wx.ALL, 5 ) - - self.m_staticText1 = wx.StaticText( self, wx.ID_ANY, u"AR for pads", wx.Point( -1,-1 ), wx.DefaultSize, 0 ) - self.m_staticText1.Wrap( -1 ) - - gSizer2.Add( self.m_staticText1, 0, wx.ALL, 5 ) - - self.m_textAR_SET = wx.TextCtrl( self, wx.ID_ANY, str(AR_SET), wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer2.Add( self.m_textAR_SET, 0, wx.ALL, 5 ) - - self.m_staticText12 = wx.StaticText( self, wx.ID_ANY, u"AR for vias", wx.Point( -1,-1 ), wx.DefaultSize, 0 ) - self.m_staticText12.Wrap( -1 ) - - gSizer2.Add( self.m_staticText12, 0, wx.ALL, 5 ) - - self.m_textAR_SET_V = wx.TextCtrl( self, wx.ID_ANY, str(AR_SET_V), wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer2.Add( self.m_textAR_SET_V, 0, wx.ALL, 5 ) - - - bSizer1.Add( gSizer2, 1, wx.EXPAND, 5 ) - - gSizer1 = wx.GridSizer( 0, 2, 0, 0 ) - - self.m_ok_btn = wx.Button( self, wx.ID_ANY, u"OK", wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer1.Add( self.m_ok_btn, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 ) - - # self.m_cancel_btn = wx.Button( self, wx.ID_ANY, u"Cancel", wx.DefaultPosition, wx.DefaultSize, 0 ) - # gSizer1.Add( self.m_cancel_btn, 0, wx.ALL, 5 ) - - - bSizer1.Add( gSizer1, 1, wx.EXPAND, 5 ) - - - self.SetSizer( bSizer1 ) - self.Layout() - - self.Centre( wx.BOTH ) - - #### ----- connections - # Connect Events - self.Bind(wx.EVT_BUTTON, self.OnClickOK, self.m_ok_btn) - # self.Bind(wx.EVT_BUTTON, self.OnClickCancel, self.m_cancel_btn) - # Tooltips - #self.m_cancel_btn.SetToolTip( wx.ToolTip(u"Cancel" )) - self.m_ok_btn.SetToolTip( wx.ToolTip(u"Confirm" )) - self.m_staticText1.SetToolTip( wx.ToolTip(u"Annular Ring for Pads (mm)" )) - self.m_textAR_SET.SetToolTip( wx.ToolTip(u"Annular Ring for Pads (mm)" )) - self.m_textAR_SET_V.SetToolTip( wx.ToolTip(u"Annular Ring for Vias (mm)" )) - self.m_staticText12.SetToolTip( wx.ToolTip(u"Annular Ring for Vias (mm)" )) - self.m_textPHD.SetToolTip( wx.ToolTip(u"Drill extra margin (mm)" )) - self.m_staticText11.SetToolTip( wx.ToolTip(u"Drill extra margin (mm)" )) - - def __del__( self ): - pass - - def OnClickOK(self, event): - global mm_ius, DRL_EXTRA, AR_SET, AR_SET_V, DRL_EXTRA_ius, MIN_AR_SIZE, MIN_AR_SIZE_V - - self.m_ok_btn.SetLabel("Clicked") - phd = float(self.m_textPHD.GetValue().replace(',','.')) - ar = float(self.m_textAR_SET.GetValue().replace(',','.')) - arv = float(self.m_textAR_SET_V.GetValue().replace(',','.')) - DRL_EXTRA=phd - DRL_EXTRA_ius=DRL_EXTRA * mm_ius - - AR_SET = ar #minimum annular accepted for pads - MIN_AR_SIZE = AR_SET * mm_ius - - AR_SET_V = arv #minimum annular accepted for vias - MIN_AR_SIZE_V = AR_SET_V * mm_ius - self.Destroy() - - def OnClickCancel(self, event): - self.m_cancel_btn.SetLabel("Clicked") - self.Destroy() - - #wx.MessageDialog(self.frame,"ciao") - #subprocess.check_call(["C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"]) - #http://stackoverflow.com/questions/1811691/running-an-outside-program-executable-in-python - class displayDialog(wx.Dialog): - """ - The default frame - http://stackoverflow.com/questions/3566603/how-do-i-make-wx-textctrl-multi-line-text-update-smoothly - """ - global mm_ius, DRL_EXTRA, AR_SET, AR_SET_V, DRL_EXTRA_ius, MIN_AR_SIZE, MIN_AR_SIZE_V, found_violations - #---------------------------------------------------------------------- - #def __init__(self): - # """Constructor""" - # wx.Frame.__init__(self, None, title="Display Frame", style=wx.DEFAULT_FRAME_STYLE, wx.ICON_INFORMATION) - # panel = wx.Panel(self) - def __init__(self, parent): - wx.Dialog.__init__(self, parent, id=-1, title="Annular Checker")# - #, style=wx.DEFAULT_DIALOG_STYLE, wx.ICON_INFORMATION) - #, style=wx.DEFAULT_DIALOG_STYLE, wx.ICON_INFORMATION) - #, pos=DefaultPosition, size=DefaultSize, style = wx.DEFAULT_FRAME_STYLE & (~wx.MAXIMIZE_BOX), name="fname") - #, wx.ICON_INFORMATION) #, title="Annular Check", style=wx.DEFAULT_FRAME_STYLE, wx.ICON_INFORMATION) - # - - self.SetIcon(PyEmbeddedImage(annular_ico_b64_data).GetIcon()) - #wx.IconFromBitmap(wx.Bitmap("icon.ico", wx.BITMAP_TYPE_ANY))) - self.panel = wx.Panel(self) - - if found_violations: - self.title = wx.StaticText(self.panel, label="Check result: (Violations found)") - #self.title.SetForegroundColour('#FF0000') - self.title.SetBackgroundColour('#FF0000') - font = wx.Font(wx.DEFAULT, wx.DECORATIVE, wx.ITALIC, wx.BOLD) - self.title.SetFont(font) - else: - self.title = wx.StaticText(self.panel, label="Annular Check result: OK") - self.title.SetBackgroundColour('#00FF00') - #self.result = wx.StaticText(self.panel, label="") - #self.result.SetForegroundColour('#FF0000') - #self.button = wx.Button(self.panel, label="Save") - #self.lblname = wx.StaticText(self.panel, label="Your name:") - #self.editname = wx.TextCtrl(self.panel, size=(140, -1)) - self.editname = wx.TextCtrl(self.panel, size = (400, 400), style = wx.TE_MULTILINE|wx.TE_READONLY) - self.m_htmlWin1 = wx.html.HtmlWindow( self.panel, wx.ID_ANY, wx.DefaultPosition, wx.Size( 400,400 ), wx.html.HW_SCROLLBAR_AUTO ) - #bSizer1.Add( self.m_htmlWin1, 0, wx.ALL, 5 ) - - - # Set sizer for the frame, so we can change frame size to match widgets - self.windowSizer = wx.BoxSizer() - #self.windowSizer.Add(self.m_htmlWin1, 1, wx.ALL | wx.EXPAND) - self.windowSizer.Add(self.panel, 1, wx.ALL | wx.EXPAND) - - # Set sizer for the panel content - self.sizer = wx.GridBagSizer(5, 0) - self.sizer.Add(self.title, (0, 0)) - #self.sizer.Add(self.result, (1, 0)) - #self.sizer.Add(self.lblname, (1, 0)) - ##self.sizer.Add(self.m_htmlWin1, (1, 0)) - self.sizer.Add(self.editname, (1, 0)) - #self.sizer.Add(self.button, (2, 0), (1, 2), flag=wx.EXPAND) - - # Set simple sizer for a nice border - self.border = wx.BoxSizer() - self.border.Add(self.sizer, 1, wx.ALL | wx.EXPAND, 5) - - # Use the sizers - self.panel.SetSizerAndFit(self.border) - self.SetSizerAndFit(self.windowSizer) - #self.result.SetLabel(msg) - # Set event handlers - #self.button.Bind(wx.EVT_BUTTON, self.OnButton) - #self.Show() - #self.Bind(wx.EVT_CLOSE,self.OnClose) - - #def OnClose(self,e): - # #wx.LogMessage("c") - # e.Skip() - #self.Close() - - #def OnButton(self, e): - # self.result.SetLabel(self.editname.GetValue()) - def setMsg(self, t_msg): - self.editname.SetValue(t_msg) - self.m_htmlWin1.SetPage(t_msg) - - - def annring_size(pad): - # valid for oval pad/drills - annrX=(pad.GetSize()[0] - (pad.GetDrillSize()[0]+DRL_EXTRA_ius))/2 - annrY=(pad.GetSize()[1] - (pad.GetDrillSize()[1]+DRL_EXTRA_ius))/2 - #annr=min(pad.GetSize()) - max(pad.GetDrillSize()) - #if annr < MIN_AR_SIZE: - #print annrX - #print annrY - #print pad.GetSize()[0]/mm_ius - #print pad.GetSize()[0]#/mm_ius - #print pad.GetDrillSize()[0]#/mm_ius - #print DRL_EXTRA_ius - #print pad.GetDrillSize()[0]/mm_ius - #print (pad.GetDrillSize()[0]+DRL_EXTRA_ius)/mm_ius - #print annrX/mm_ius - return min(annrX,annrY) - - def annringNP_size(pad): - # valid for oval pad/drills - annrX=(pad.GetSize()[0] - (pad.GetDrillSize()[0]))/2 - annrY=(pad.GetSize()[1] - (pad.GetDrillSize()[1]))/2 - #annr=min(pad.GetSize()) - max(pad.GetDrillSize()) - #if annr < MIN_AR_SIZE: - #print annrX - #print annrY - #print pad.GetSize()[0]/mm_ius - #print pad.GetSize()[0]#/mm_ius - #print pad.GetDrillSize()[0]#/mm_ius - #print DRL_EXTRA_ius - #print pad.GetDrillSize()[0]/mm_ius - #print (pad.GetDrillSize()[0]+DRL_EXTRA_ius)/mm_ius - #print annrX/mm_ius - #return min(annrX,annrY) - return annrX,annrY - - def vias_annring_size(via): - # calculating via annular - annr=(via.GetWidth() - (via.GetDrillValue()+DRL_EXTRA_ius))/2 - #print via.GetWidth() - #print via.GetDrillValue() - return annr - - def f_mm(raw): - return repr(raw/mm_ius) - - board = pcbnew.GetBoard() - PassC=FailC=0 - PassCV=FailCV=0 - - PassCN=FailCN=0 - PassCVN=FailCVN=0 - - fileName = GetBoard().GetFileName() - if len(fileName)==0: - wx.LogMessage("a board needs to be saved/loaded!") - else: - - frame = AR_Prm(None) - #frame = wx.Frame(None) - frame.Center() - #frame.setMsg(LogMsg) - frame.ShowModal() - frame.Destroy() - - LogMsg="Hello, world!
" - msg="action_menu_annular_check.py
" - msg+="version = "+___version___ - msg+="
Testing PCB for Annular Rings
TH Pads = "+repr(AR_SET)+" Vias = "+repr(AR_SET_V)+"
PHD margin on PTH = "+ repr(DRL_EXTRA) - #print (msg) - LogMsg+=msg+"

" - - # print "LISTING VIAS:" - for item in board.GetTracks(): - if type(item) is pcbnew.VIA: - pos = item.GetPosition() - drill = item.GetDrillValue() - width = item.GetWidth() - ARv = vias_annring_size(item) - if ARv < MIN_AR_SIZE_V: - # print("AR violation at %s." % (pad.GetPosition() / mm_ius )) Raw units, needs fixing - XYpair = item.GetPosition() - msg="AR Via violation of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1]) - #print (msg) - LogMsg+=msg+"
" - FailCV = FailCV+1 - else: - PassCV = PassCV+1 - #print type(item) - - msg="VIAS that Pass = "+repr(PassCV)+"; Fails = "+repr(FailCV) - # print(msg) - LogMsg+=msg+"
" - - for module in board.GetModules(): - try: - module_Pads=module.PadsList() - except: - module_Pads=module.Pads() - for pad in module_Pads: #print(pad.GetAttribute()) - if pad.GetAttribute() == PAD_ATTRIB_STANDARD: #TH pad - ARv = annring_size(pad) - #print(f_mm(ARv)) - if ARv < MIN_AR_SIZE: - # print("AR violation at %s." % (pad.GetPosition() / mm_ius )) Raw units, needs fixing - XYpair = pad.GetPosition() - msg="AR PTH violation of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1]) - #print (msg) - LogMsg+=msg+"
" - FailC = FailC+1 - else: - PassC = PassC+1 - if pad.GetAttribute() == PAD_ATTRIB_HOLE_NOT_PLATED: - ARvX, ARvY = annringNP_size(pad) - #print(f_mm(ARvX));print(f_mm(ARvY)) - if (ARvX) != 0 or ARvY != 0: - ARv = min(ARvX, ARvY) - if ARv < MIN_AR_SIZE: - # print("AR violation at %s." % (pad.GetPosition() / mm_ius )) Raw units, needs fixing - XYpair = pad.GetPosition() - msg="AR NPTH warning of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1]) - #print (msg) - LogMsg+=msg+"
" - FailCN = FailCN+1 - else: - PassCN = PassCN+1 - else: - PassCN = PassCN+1 - - msg = "TH PADS that Pass = "+repr(PassC)+"; Fails = "+repr(FailC) - print(msg) - LogMsg+=msg+"
" - - msg="NPTH PADS that Pass = "+repr(PassCN)+"; Fails = "+repr(FailCN) - print(msg) - LogMsg+=msg+"" - - pcbName = (os.path.splitext(GetBoard().GetFileName())[0]) #filename no ext - #wx.LogMessage(pcbName)#LogMsg) - ##wx.LogMessage(LogMsg) - FC=r"C:\FreeCAD\bin\freecad.exe" - #kSU=r"C:\Cad\Progetti_K\3D-FreeCad-tools\kicad-StepUp-tools.FCMacro" - #subprocess.check_call([FC, kSU, pcbName]) - ##p = subprocess.Popen([FC, kSU, pcbName]) - - found_violations=False - if (FailC+FailCN+FailCV)>0: - found_violations=True - - frame = displayDialog(None) - #frame = wx.Frame(None) - frame.Center() - frame.setMsg(LogMsg) - frame.ShowModal() - frame.Destroy() - #frame = wx.wxFrame(None, 10110, 'T-Make', size=wx.wxSize(100,100), - # style=wx.wxSTAY_ON_TOP) - #frame.show() - -# annular_check().register() -if __name__ == "__main__": - import argparse - - parser = argparse.ArgumentParser( - description='KiCad PCB Annular Checker') - parser.add_argument('file', type=str, help="KiCad PCB file") - args = parser.parse_args() - print("Loading %s" % args.file) - main(pcbnew.LoadBoard(args.file)) - -else: - annular_check().register() - - -# "b64_data" is a variable containing your base64 encoded jpeg -annular_ico_b64_data =\ -""" -iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAIQQAACEEB+v+u9gAAABl0RVh0U29mdHdhcmUAd3d -3Lmlua3NjYXBlLm9yZ5vuPBoAAAJ5SURBVDiNdZRNSFRRFMd/976ZJjeBn2PUoiLaiMFkFkHIQ0NBdBUlJuIqiixmIYjQRgiJYKAMXRRSi6TCD5gaWiSFsy -gixOyDpDAog8wn9SISapz33m0x82bmzcOzO/97/r973nn3XqGUojjCybIm4BhQD9Rl5XlgDnhi6ObTYo8oBIWTZeXAMNDlalW/FJYmMLd5fONA1NBN0wcKJ -8sagftAZWRJcWHS5vCiouJ3pnClUvC8VnDtpOTTDgGwCpwydHM2Bwony8LAe6koH7hjc37aQXN8XwzAv5DgUo9krF0C/ABqDN1ck9n1G0D54C2H6OTmEICt -KcXQTZvTCQegAhgFEFWzpW1A4uAHRaLfQhbPXgD+/8HfkKBhNMDXMACtEmgC6L/reCBWKGAzMmLxbQWWl2Fw0FJavqIkpYhO2m7aHADqNQcOLXq3DcSuKnp -6Ajmhry8g1tfTxGJBVzryLuepl0Bk16qiJJUHKU0qOjryEDe6u4OF6e7vitCGAohIAFk0XCWEQkp8oWmeVAAiu78EFj5vF6S2iFyBtGxJPJ72gSYmPNpyOH -McgAUJzFkazO/zetLRc4J43MayIJWCsTHLuTzkaellTa7rOVE1W9oOPDz6VjF90fI14QQ1RzhKCNsRhfpGEBqvB1jaKQDapKGbCeDBs/2C8Rb/XGTalsUQg -Fin5kKmDN185DrPAD8HzmrcbpUony0flgZXujSGT+SuSC94L20LcA8obXiduSp1H8kdiz8l8KJWEOvUeLNXuJAuQzdnPKAsrBoYAY4DaA7sWck8I1+qKex0 -Cug1dHPNFcQmD1sL0AwcACJZeQF4BcwYuvm42PMfVgD11Y9MUIEAAAAASUVORK5CYII= -""" - - -# execfile("annular.py") -# annular.py Testing PCB for Annular Ring >= 0.15 -# AR violation of 0.1 at XY 172.974,110.744 -# VIAS that Pass = 100 Fails = 1 -# AR violation of 0.1 at XY 172.212,110.744 -# AR violation of 0.0 at XY 154.813,96.52 -# PADS that Pass = 49 Fails = 2 - diff --git a/AnnularChecker/annular_checker.py b/AnnularChecker/annular_checker.py index f123959..a5de1e7 100644 --- a/AnnularChecker/annular_checker.py +++ b/AnnularChecker/annular_checker.py @@ -16,9 +16,13 @@ # annular.py -___version___="AC version: 1.6.0" +#### plugins errors +#import pcbnew;pcbnew.GetWizardsBackTrace() + +global mm_ius, DRL_EXTRA, AR_SET, AR_SET_V, DRL_EXTRA_ius, MIN_AR_SIZE, MIN_AR_SIZE_V, found_violations, LogMsg, ___version___ + +___version___="1.6.1" -global mm_ius, DRL_EXTRA, AR_SET, AR_SET_V, DRL_EXTRA_ius, MIN_AR_SIZE, MIN_AR_SIZE_V, found_violations, LogMsg #wx.LogMessage("My message") mm_ius = 1000000.0 # (consider always drill +0.1) @@ -34,15 +38,112 @@ MIN_AR_SIZE_V = AR_SET_V * mm_ius import sys import wx import wx.richtext -import subprocess +#import subprocess import os import pcbnew from pcbnew import * -import base64 -from wx.lib.embeddedimage import PyEmbeddedImage +# import base64 +# from wx.lib.embeddedimage import PyEmbeddedImage + +from . import AnnularDlg +from . import AnnularResultDlg + 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 AnnularResult_Dlg(AnnularResultDlg.AnnularResultDlg): + # 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(AnnularResult_Dlg, self).SetSizeHints(sz1, sz2) + def onOK(self, event): + return self.EndModal(wx.ID_OK) # if modal_result == wx.ID_OK: + + def OnClickCopy(self, event): + self.m_richTextResult.SelectAll() + self.m_richTextResult.Copy() + #global LogMsg + #copy2clip(LogMsg) + self.copy_btn.SetLabel("Text Copied") + + # 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 + AnnularResultDlg.AnnularResultDlg.__init__(self, parent) + #self.GetSizer().Fit(self) + self.SetMinSize(self.GetSize()) + #### ----- connections + # Connect Events + self.Bind(wx.EVT_BUTTON, self.onOK, self.ok_btn) + #self.ok_btn.Bind(wx.EVT_BUTTON, self.EndModal(wx.ID_OK)) + self.Bind(wx.EVT_BUTTON, self.OnClickCopy, self.copy_btn) + self.ok_btn.SetFocus() + # Tooltips + self.copy_btn.SetToolTip( wx.ToolTip(u"Copy Text to Clipboard" )) + self.ok_btn.SetToolTip( wx.ToolTip(u"Exit" )) + + #def onOK(self, event): + # return self.EndModal(wx.ID_OK) # if modal_result == wx.ID_OK: + + #def onConnectClick(self, event): + # return self.EndModal(wx.ID_REVERT) + + #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" ) + +class Annular_Dlg(AnnularDlg.AnnularDlg): + # 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(Annular_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 + AnnularDlg.AnnularDlg.__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 annular_check( pcbnew.ActionPlugin ): """ A script to check for annular ring violations @@ -58,7 +159,7 @@ class annular_check( pcbnew.ActionPlugin ): AR_SET = 0.150 #minimum annular accepted for pads AR_SET_V = 0.150 #minimum annular accepted for vias """ - + global ___version___ def defaults( self ): """ Method defaults must be redefined @@ -67,7 +168,7 @@ class annular_check( pcbnew.ActionPlugin ): self.description should be a comprehensive description of the plugin """ - self.name = "Annular check" + self.name = "Annular check \nversion "+___version___ self.category = "Checking PCB" self.description = "Automaticaly check annular on an existing PCB" #self.pcbnew_icon_support = hasattr(self, "show_toolbar_button") @@ -75,582 +176,271 @@ class annular_check( pcbnew.ActionPlugin ): self.icon_file_name = os.path.join(os.path.dirname(__file__), 'annular.png') def Run( self ): - - ########################################################################### - ## Class AR_Prm - ########################################################################### - - #class AR_Prm ( wx.Dialog ): - # - # def __init__( self, parent ): - # wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = "AR parameters", pos = wx.DefaultPosition, size = wx.Size( 320,193 ), style = wx.DEFAULT_DIALOG_STYLE ) - # - # self.SetSizeHints( 500,500 ) - # - # self.SetIcon(PyEmbeddedImage(annular_ico_b64_data).GetIcon()) - # - # bSizer1 = wx.BoxSizer( wx.VERTICAL ) - # - # gSizer2 = wx.GridSizer( 0, 2, 0, 0 ) - # - # self.m_staticText11 = wx.StaticText( self, wx.ID_ANY, u"PHD margin", wx.Point( -1,-1 ), wx.DefaultSize, 0 ) - # self.m_staticText11.Wrap( -1 ) - # - # gSizer2.Add( self.m_staticText11, 0, wx.ALL, 5 ) - # - # self.m_textPHD = wx.TextCtrl( self, wx.ID_ANY, str(DRL_EXTRA), wx.DefaultPosition, wx.DefaultSize, 0 ) - # gSizer2.Add( self.m_textPHD, 0, wx.ALL, 5 ) - # - # self.m_staticText1 = wx.StaticText( self, wx.ID_ANY, u"AR for pads", wx.Point( -1,-1 ), wx.DefaultSize, 0 ) - # self.m_staticText1.Wrap( -1 ) - # - # gSizer2.Add( self.m_staticText1, 0, wx.ALL, 5 ) - # - # self.m_textAR_SET = wx.TextCtrl( self, wx.ID_ANY, str(AR_SET), wx.DefaultPosition, wx.DefaultSize, 0 ) - # gSizer2.Add( self.m_textAR_SET, 0, wx.ALL, 5 ) - # - # self.m_staticText12 = wx.StaticText( self, wx.ID_ANY, u"AR for vias", wx.Point( -1,-1 ), wx.DefaultSize, 0 ) - # self.m_staticText12.Wrap( -1 ) - # - # gSizer2.Add( self.m_staticText12, 0, wx.ALL, 5 ) - # - # self.m_textAR_SET_V = wx.TextCtrl( self, wx.ID_ANY, str(AR_SET_V), wx.DefaultPosition, wx.DefaultSize, 0 ) - # gSizer2.Add( self.m_textAR_SET_V, 0, wx.ALL, 5 ) - # - # - # bSizer1.Add( gSizer2, 1, wx.EXPAND, 5 ) - # - # gSizer1 = wx.GridSizer( 0, 2, 0, 0 ) - # - # self.m_ok_btn = wx.Button( self, wx.ID_ANY, u"OK", wx.DefaultPosition, wx.DefaultSize, 0 ) - # gSizer1.Add( self.m_ok_btn, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 ) - # - # # self.m_cancel_btn = wx.Button( self, wx.ID_ANY, u"Cancel", wx.DefaultPosition, wx.DefaultSize, 0 ) - # # gSizer1.Add( self.m_cancel_btn, 0, wx.ALL, 5 ) - # - # - # bSizer1.Add( gSizer1, 1, wx.EXPAND, 5 ) - # - # - # self.SetSizer( bSizer1 ) - # self.Layout() - # - # self.Centre( wx.BOTH ) - # - # #### ----- connections - # # Connect Events - # self.Bind(wx.EVT_BUTTON, self.OnClickOK, self.m_ok_btn) - # # self.Bind(wx.EVT_BUTTON, self.OnClickCancel, self.m_cancel_btn) - # # Tooltips - # #self.m_cancel_btn.SetToolTip( wx.ToolTip(u"Cancel" )) - # self.m_ok_btn.SetToolTip( wx.ToolTip(u"Confirm" )) - # self.m_ok_btn.SetFocus() - # self.m_staticText1.SetToolTip( wx.ToolTip(u"Annular Ring for Pads (mm)" )) - # self.m_textAR_SET.SetToolTip( wx.ToolTip(u"Annular Ring for Pads (mm)" )) - # self.m_textAR_SET_V.SetToolTip( wx.ToolTip(u"Annular Ring for Vias (mm)" )) - # self.m_staticText12.SetToolTip( wx.ToolTip(u"Annular Ring for Vias (mm)" )) - # self.m_textPHD.SetToolTip( wx.ToolTip(u"Drill extra margin (mm)" )) - # self.m_staticText11.SetToolTip( wx.ToolTip(u"Drill extra margin (mm)" )) - class AR_Prm ( wx.Dialog ): + import sys,os + #mm_ius = 1000000.0 + _pcbnew_frame = [x for x in wx.GetTopLevelWindows() if x.GetTitle().lower().startswith('pcbnew')][0] + #aParameters = RoundTrackDlg(None) + aParameters = Annular_Dlg(_pcbnew_frame) + aParameters.m_LabelTitle.SetLabel("Check annular ring: version: "+___version___) + aParameters.m_textCtrlARP.SetToolTip( wx.ToolTip(u"Annular Ring for Pads (mm)" )) + aParameters.m_staticTextPHD.SetToolTip( wx.ToolTip(u"Annular Ring for Pads (mm)" )) + aParameters.m_textCtrlARV.SetToolTip( wx.ToolTip(u"Annular Ring for Vias (mm)" )) + aParameters.m_staticTextARV.SetToolTip( wx.ToolTip(u"Annular Ring for Vias (mm)" )) + aParameters.m_textCtrlPHD.SetToolTip( wx.ToolTip(u"Drill extra margin (mm)" )) + aParameters.m_staticTextARP.SetToolTip( wx.ToolTip(u"Drill extra margin (mm)" )) + aParameters.m_textCtrlPHD.SetValue('0.1') + aParameters.m_textCtrlARP.SetValue('0.125') + aParameters.m_textCtrlARV.SetValue('0.125') + aParameters.Show() + modal_result = aParameters.ShowModal() + #import pcbnew;pcbnew.GetWizardsBackTrace() + if modal_result == wx.ID_OK: + global mm_ius, DRL_EXTRA, AR_SET, AR_SET_V, DRL_EXTRA_ius, MIN_AR_SIZE, MIN_AR_SIZE_V + phd = float(aParameters.m_textCtrlPHD.GetValue().replace(',','.')) + ar = float(aParameters.m_textCtrlARP.GetValue().replace(',','.')) + arv = float(aParameters.m_textCtrlARV.GetValue().replace(',','.')) + DRL_EXTRA=phd + DRL_EXTRA_ius=DRL_EXTRA * mm_ius - def __init__( self, parent ): - wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = u"Annular Checker", pos = wx.DefaultPosition, size = wx.Size( 320,229 ), style = wx.DEFAULT_DIALOG_STYLE ) - - self.SetSizeHints( 320, 320 ) - - bSizer1 = wx.BoxSizer( wx.VERTICAL ) - - gSizer2 = wx.GridSizer( 0, 2, 0, 0 ) - - self.m_StaticTextPHD = wx.StaticText( self, wx.ID_ANY, u"PHD margin", wx.Point( -1,-1 ), wx.DefaultSize, 0 ) - self.m_StaticTextPHD.Wrap( -1 ) - - gSizer2.Add( self.m_StaticTextPHD, 0, wx.ALL, 5 ) - - self.m_textPHD = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer2.Add( self.m_textPHD, 0, wx.ALL, 5 ) - - self.m_StaticTextAR_SET = wx.StaticText( self, wx.ID_ANY, u"AR for pads", wx.Point( -1,-1 ), wx.DefaultSize, 0 ) - self.m_StaticTextAR_SET.Wrap( -1 ) - - gSizer2.Add( self.m_StaticTextAR_SET, 0, wx.ALL, 5 ) - - self.m_textAR_SET = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer2.Add( self.m_textAR_SET, 0, wx.ALL, 5 ) - - self.m_StaticTextAR_SET_V = wx.StaticText( self, wx.ID_ANY, u"AR for vias", wx.Point( -1,-1 ), wx.DefaultSize, 0 ) - self.m_StaticTextAR_SET_V.Wrap( -1 ) - - gSizer2.Add( self.m_StaticTextAR_SET_V, 0, wx.ALL, 5 ) - - self.m_textAR_SET_V = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer2.Add( self.m_textAR_SET_V, 0, wx.ALL, 5 ) - - bSizer2 = wx.BoxSizer( wx.VERTICAL ) - - self.m_staticTextVersion = wx.StaticText( self, wx.ID_ANY, u"Version", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.m_staticTextVersion.Wrap( -1 ) - - bSizer2.Add( self.m_staticTextVersion, 0, wx.ALL, 5 ) - - - gSizer2.Add( bSizer2, 1, wx.EXPAND, 5 ) - - - bSizer1.Add( gSizer2, 1, wx.EXPAND, 5 ) - - gSizer1 = wx.GridSizer( 0, 2, 0, 0 ) - - self.m_ok_btn = wx.Button( self, wx.ID_ANY, u"OK", wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer1.Add( self.m_ok_btn, 0, wx.ALL, 5 ) - - #self.m_cancel_btn = wx.Button( self, wx.ID_ANY, u"Cancel", wx.DefaultPosition, wx.DefaultSize, 0 ) - #gSizer1.Add( self.m_cancel_btn, 0, wx.ALL, 5 ) - - - bSizer1.Add( gSizer1, 1, wx.EXPAND, 5 ) - - - self.SetSizer( bSizer1 ) - self.Layout() - - self.Centre( wx.BOTH ) - - #### ----- connections - # Connect Events - self.Bind(wx.EVT_BUTTON, self.OnClickOK, self.m_ok_btn) - # self.Bind(wx.EVT_BUTTON, self.OnClickCancel, self.m_cancel_btn) - # Tooltips - #self.m_cancel_btn.SetToolTip( wx.ToolTip(u"Cancel" )) - self.m_ok_btn.SetToolTip( wx.ToolTip(u"Confirm" )) - self.m_ok_btn.SetFocus() - #self.m_staticText1.SetToolTip( wx.ToolTip(u"Annular Ring for Pads (mm)" )) - self.m_textAR_SET.SetValue(str(AR_SET)) - self.m_textAR_SET.SetToolTip( wx.ToolTip(u"Annular Ring for Pads (mm)" )) - self.m_textAR_SET_V.SetValue(str(AR_SET_V)) - self.m_textAR_SET_V.SetToolTip( wx.ToolTip(u"Annular Ring for Vias (mm)" )) - #self.m_staticText12.SetToolTip( wx.ToolTip(u"Annular Ring for Vias (mm)" )) - self.m_staticTextVersion.SetLabel(___version___) - self.m_textPHD.SetValue(str(DRL_EXTRA)) - self.m_textPHD.SetToolTip( wx.ToolTip(u"Drill extra margin (mm)" )) - #self.m_staticText11.SetToolTip( wx.ToolTip(u"Drill extra margin (mm)" )) - - def __del__( self ): - pass - - def OnClickOK(self, event): - global mm_ius, DRL_EXTRA, AR_SET, AR_SET_V, DRL_EXTRA_ius, MIN_AR_SIZE, MIN_AR_SIZE_V - - self.m_ok_btn.SetLabel("Clicked") - phd = float(self.m_textPHD.GetValue().replace(',','.')) - ar = float(self.m_textAR_SET.GetValue().replace(',','.')) - arv = float(self.m_textAR_SET_V.GetValue().replace(',','.')) - DRL_EXTRA=phd - DRL_EXTRA_ius=DRL_EXTRA * mm_ius - - AR_SET = ar #minimum annular accepted for pads - MIN_AR_SIZE = AR_SET * mm_ius - - AR_SET_V = arv #minimum annular accepted for vias - MIN_AR_SIZE_V = AR_SET_V * mm_ius - self.Destroy() - - def OnClickCancel(self, event): - self.m_cancel_btn.SetLabel("Clicked") - self.Destroy() - - #wx.MessageDialog(self.frame,"ciao") - #subprocess.check_call(["C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"]) - #http://stackoverflow.com/questions/1811691/running-an-outside-program-executable-in-python - - ## class displayDialog(wx.Dialog): - ## """ - ## The default frame - ## http://stackoverflow.com/questions/3566603/how-do-i-make-wx-textctrl-multi-line-text-update-smoothly - ## """ - ## global mm_ius, DRL_EXTRA, AR_SET, AR_SET_V, DRL_EXTRA_ius, MIN_AR_SIZE, MIN_AR_SIZE_V, found_violations - ## #---------------------------------------------------------------------- - ## #def __init__(self): - ## # """Constructor""" - ## # wx.Frame.__init__(self, None, title="Display Frame", style=wx.DEFAULT_FRAME_STYLE, wx.ICON_INFORMATION) - ## # panel = wx.Panel(self) - ## def __init__(self, parent): - ## wx.Dialog.__init__(self, parent, id=-1, title="Annular Checker")# - ## #, style=wx.DEFAULT_DIALOG_STYLE, wx.ICON_INFORMATION) - ## #, style=wx.DEFAULT_DIALOG_STYLE, wx.ICON_INFORMATION) - ## #, pos=DefaultPosition, size=DefaultSize, style = wx.DEFAULT_FRAME_STYLE & (~wx.MAXIMIZE_BOX), name="fname") - ## #, wx.ICON_INFORMATION) #, title="Annular Check", style=wx.DEFAULT_FRAME_STYLE, wx.ICON_INFORMATION) - ## # - ## - ## self.SetIcon(PyEmbeddedImage(annular_ico_b64_data).GetIcon()) - ## #wx.IconFromBitmap(wx.Bitmap("icon.ico", wx.BITMAP_TYPE_ANY))) - ## self.panel = wx.Panel(self) - ## - ## if found_violations: - ## self.title = wx.StaticText(self.panel, label="") - ## #self.title.SetForegroundColour('#FF0000') - ## #self.title.SetBackgroundColour('#FF0000') - ## #font = wx.Font(wx.DEFAULT, wx.DECORATIVE, wx.ITALIC, wx.BOLD) - ## #self.title.SetFont(font) - ## else: - ## self.title = wx.StaticText(self.panel, label="") - ## #self.title.SetBackgroundColour('#00FF00') - ## #font = wx.Font(wx.DEFAULT, wx.DECORATIVE, wx.ITALIC, wx.BOLD) - ## #self.title.SetFont(font) - ## #self.result = wx.StaticText(self.panel, label="") - ## #self.result.SetForegroundColour('#FF0000') - ## #self.button = wx.Button(self.panel, label="Save") - ## #self.lblname = wx.StaticText(self.panel, label="Your name:") - ## #self.editname = wx.TextCtrl(self.panel, size=(140, -1)) - ## ##self.editname = wx.TextCtrl(self.panel, size = (400, 400), style = wx.TE_MULTILINE|wx.TE_READONLY) - ## self.m_richText1 = wx.richtext.RichTextCtrl( self.panel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, size = (400, 400), style = 0|wx.VSCROLL|wx.HSCROLL|wx.WANTS_CHARS )# wx.TE_MULTILINE|wx.TE_READONLY) #0|wx.VSCROLL|wx.HSCROLL|wx.NO_BORDER|wx.WANTS_CHARS ) - ## #bSizer1.Add( self.m_richText1, 1, wx.EXPAND |wx.ALL, 5 ) - ## - ## - ## # Set sizer for the frame, so we can change frame size to match widgets - ## self.windowSizer = wx.BoxSizer() - ## self.windowSizer.Add(self.panel, 1, wx.ALL | wx.EXPAND) - ## - ## # Set sizer for the panel content - ## self.sizer = wx.GridBagSizer(5, 0) - ## self.sizer.Add(self.title, (0, 0)) - ## #self.sizer.Add(self.result, (1, 0)) - ## #self.sizer.Add(self.lblname, (1, 0)) - ## ## self.sizer.Add(self.editname, (1, 0)) - ## self.sizer.Add(self.m_richText1, (1, 0)) - ## #self.ok_btn = wx.Button( self, wx.ID_ANY, u"Copy errors", wx.DefaultPosition, wx.DefaultSize, 0 ) - ## #self.sizer.Add( self.ok_btn, 0, wx.ALL | wx.EXPAND) - ## #self.sizer.Add(self.ok_btn, (2, 0)) #, wx.ALL | flag=wx.EXPAND) - ## #self.sizer.Add( self.ok_btn, 0, wx.ALL, 5 ) - ## - ## #self.sizer.Add(self.ok_btn, (2, 0), (1, 2), flag=wx.EXPAND) - ## - ## # Set simple sizer for a nice border - ## self.border = wx.BoxSizer() - ## self.border.Add(self.sizer, 1, wx.ALL | wx.EXPAND, 5) - ## - ## #self.ok_btn = wx.Button( self, wx.ID_ANY, u"Copy errors", wx.DefaultPosition, wx.DefaultSize, 0 ) - ## #self.windowSizer.Add(self.ok_btn, 0, wx.ALL) - ## #self.sizer.Add( self.ok_btn, (2,0)) - ## #self.sizer.Add( self.ok_btn, 0, wx.ALL, 5 ) - ## # Use the sizers - ## self.panel.SetSizerAndFit(self.border) - ## self.SetSizerAndFit(self.windowSizer) - ## #self.result.SetLabel(msg) - ## # Set event handlers - ## #self.button.Bind(wx.EVT_BUTTON, self.OnButton) - ## #self.Show() - ## #self.Bind(wx.EVT_CLOSE,self.OnClose) - ## - ## #def OnClose(self,e): - ## # #wx.LogMessage("c") - ## # e.Skip() - ## #self.Close() - ########################################################################### - ## Class displayDialog - ########################################################################### - - class displayDialog ( wx.Dialog ): + AR_SET = ar #minimum annular accepted for pads + MIN_AR_SIZE = AR_SET * mm_ius - global mm_ius, DRL_EXTRA, AR_SET, AR_SET_V, DRL_EXTRA_ius, MIN_AR_SIZE, MIN_AR_SIZE_V, found_violations, LogMsg - - def __init__( self, parent ): - wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = u"Annular Checker", pos = wx.DefaultPosition, size = wx.Size( 450,521 ), style = wx.DEFAULT_DIALOG_STYLE ) - - self.SetSizeHints( 300,100 ) - self.SetIcon(PyEmbeddedImage(annular_ico_b64_data).GetIcon()) - - bSizer1 = wx.BoxSizer( wx.VERTICAL ) - - bSizer2 = wx.BoxSizer( wx.VERTICAL ) - - self.m_staticTitle = wx.StaticText( self, wx.ID_ANY, u"", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.m_staticTitle.Wrap( -1 ) - - bSizer2.Add( self.m_staticTitle, 0, wx.ALL, 5 ) - - self.m_richText1 = wx.richtext.RichTextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, wx.TE_READONLY|wx.VSCROLL|wx.HSCROLL|wx.NO_BORDER|wx.WANTS_CHARS ) - self.m_richText1.SetMinSize( wx.Size( 400,400 ) ) - - bSizer2.Add( self.m_richText1, 1, wx.EXPAND |wx.ALL, 5 ) - - gSizer3 = wx.GridSizer( 0, 2, 0, 0 ) - - self.ok_btn = wx.Button( self, wx.ID_ANY, u"OK", wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer3.Add( self.ok_btn, 0, wx.ALL, 5 ) - - self.copy_btn = wx.Button( self, wx.ID_ANY, u"Copy Text", wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer3.Add( self.copy_btn, 0, wx.ALL, 5 ) - - - bSizer2.Add( gSizer3, 1, wx.EXPAND, 5 ) - - - bSizer1.Add( bSizer2, 1, wx.EXPAND, 5 ) - - - self.SetSizer( bSizer1 ) - self.Layout() - - self.Centre( wx.BOTH ) - - #### ----- connections - # Connect Events - self.Bind(wx.EVT_BUTTON, self.OnClickOK, self.ok_btn) - self.Bind(wx.EVT_BUTTON, self.OnClickCopy, self.copy_btn) - self.ok_btn.SetFocus() - # Tooltips - self.copy_btn.SetToolTip( wx.ToolTip(u"Copy Text to Clipboard" )) - self.ok_btn.SetToolTip( wx.ToolTip(u"Exit" )) - - def __del__( self ): - pass - - def OnClickOK(self, event): - self.Destroy() - - def OnClickCopy(self, event): - self.m_richText1.SelectAll() - self.m_richText1.Copy() - #global LogMsg - #copy2clip(LogMsg) - self.copy_btn.SetLabel("Text Copied") - - #def setMsg(self, t_msg): - # pass - #self.editname.SetValue(t_msg) - #self.m_richText1.BeginBold() - #self.m_richText1.WriteText(" You are in ") - #self.m_richText1.BeginTextColour('red') - #self.m_richText1.WriteText("danger ") - #self.m_richText1.EndTextColour() - #self.m_richText1.WriteText("at that spot!") - #self.m_richText1.EndBold() - #self.m_richText1.SetValue(t_msg) - #self.m_htmlWin1.SetPage(t_msg) - - - def annring_size(pad): - # valid for oval pad/drills - annrX=(pad.GetSize()[0] - (pad.GetDrillSize()[0]+DRL_EXTRA_ius))/2 - annrY=(pad.GetSize()[1] - (pad.GetDrillSize()[1]+DRL_EXTRA_ius))/2 - #annr=min(pad.GetSize()) - max(pad.GetDrillSize()) - #if annr < MIN_AR_SIZE: - #print annrX - #print annrY - #print pad.GetSize()[0]/mm_ius - #print pad.GetSize()[0]#/mm_ius - #print pad.GetDrillSize()[0]#/mm_ius - #print DRL_EXTRA_ius - #print pad.GetDrillSize()[0]/mm_ius - #print (pad.GetDrillSize()[0]+DRL_EXTRA_ius)/mm_ius - #print annrX/mm_ius - return min(annrX,annrY) - - def annringNP_size(pad): - # valid for oval pad/drills - annrX=(pad.GetSize()[0] - (pad.GetDrillSize()[0]))/2 - annrY=(pad.GetSize()[1] - (pad.GetDrillSize()[1]))/2 - #annr=min(pad.GetSize()) - max(pad.GetDrillSize()) - #if annr < MIN_AR_SIZE: - #print annrX - #print annrY - #print pad.GetSize()[0]/mm_ius - #print pad.GetSize()[0]#/mm_ius - #print pad.GetDrillSize()[0]#/mm_ius - #print DRL_EXTRA_ius - #print pad.GetDrillSize()[0]/mm_ius - #print (pad.GetDrillSize()[0]+DRL_EXTRA_ius)/mm_ius - #print annrX/mm_ius - #return min(annrX,annrY) - return annrX,annrY - - def vias_annring_size(via): - # calculating via annular - annr=(via.GetWidth() - (via.GetDrillValue()+DRL_EXTRA_ius))/2 - #print via.GetWidth() - #print via.GetDrillValue() - return annr - - def f_mm(raw): - return repr(raw/mm_ius) - - board = pcbnew.GetBoard() - PassC=FailC=0 - PassCV=FailCV=0 - - PassCN=FailCN=0 - PassCVN=FailCVN=0 - - fileName = GetBoard().GetFileName() - if len(fileName)==0: - wx.LogMessage("a board needs to be saved/loaded!") + AR_SET_V = arv #minimum annular accepted for vias + MIN_AR_SIZE_V = AR_SET_V * mm_ius + #snap2grid(gridSizeMM,use_grid_origin) + calculate_AR() else: - found_violations=False - frame1 = AR_Prm(None) - #frame = wx.Frame(None) - frame1.Center() - #frame.setMsg(LogMsg) - frame1.ShowModal() - frame1.Destroy() - - frame = displayDialog(None) - LogMsg="" - writeTxt= frame.m_richText1.WriteText - rt = frame.m_richText1 - rt.BeginItalic() - writeTxt("'action_menu_annular_check.py'\n") - #frame.m_richText1.WriteText("'action_menu_annular_check.py'\n") - msg="'action_menu_annular_check.py'\n" - msg+="version = "+___version___ - writeTxt("version = "+___version___) - msg+="\nTesting PCB for Annular Rings\nTH Pads >= "+repr(AR_SET)+" Vias >= "+repr(AR_SET_V)+"\nPHD margin on PTH = "+ repr(DRL_EXTRA) - writeTxt("\nTesting PCB for Annular Rings\nTH Pads >= "+repr(AR_SET)+" Vias >= "+repr(AR_SET_V)+"\nPHD margin on PTH = "+ repr(DRL_EXTRA)) - rt.EndItalic() - writeTxt('\n\n') - #print (msg) - LogMsg+=msg+'\n\n' - - # print "LISTING VIAS:" - for item in board.GetTracks(): - if type(item) is pcbnew.VIA: - pos = item.GetPosition() - drill = item.GetDrillValue() - width = item.GetWidth() - ARv = vias_annring_size(item) - if ARv < MIN_AR_SIZE_V: + None # Cancel + + +def annring_size(pad): + # valid for oval pad/drills + annrX=(pad.GetSize()[0] - (pad.GetDrillSize()[0]+DRL_EXTRA_ius))/2 + annrY=(pad.GetSize()[1] - (pad.GetDrillSize()[1]+DRL_EXTRA_ius))/2 + #annr=min(pad.GetSize()) - max(pad.GetDrillSize()) + #if annr < MIN_AR_SIZE: + #print annrX + #print annrY + #print pad.GetSize()[0]/mm_ius + #print pad.GetSize()[0]#/mm_ius + #print pad.GetDrillSize()[0]#/mm_ius + #print DRL_EXTRA_ius + #print pad.GetDrillSize()[0]/mm_ius + #print (pad.GetDrillSize()[0]+DRL_EXTRA_ius)/mm_ius + #print annrX/mm_ius + return min(annrX,annrY) + +def annringNP_size(pad): + # valid for oval pad/drills + annrX=(pad.GetSize()[0] - (pad.GetDrillSize()[0]))/2 + annrY=(pad.GetSize()[1] - (pad.GetDrillSize()[1]))/2 + #annr=min(pad.GetSize()) - max(pad.GetDrillSize()) + #if annr < MIN_AR_SIZE: + #print annrX + #print annrY + #print pad.GetSize()[0]/mm_ius + #print pad.GetSize()[0]#/mm_ius + #print pad.GetDrillSize()[0]#/mm_ius + #print DRL_EXTRA_ius + #print pad.GetDrillSize()[0]/mm_ius + #print (pad.GetDrillSize()[0]+DRL_EXTRA_ius)/mm_ius + #print annrX/mm_ius + #return min(annrX,annrY) + return annrX,annrY + +def vias_annring_size(via): + # calculating via annular + annr=(via.GetWidth() - (via.GetDrillValue()+DRL_EXTRA_ius))/2 + #print via.GetWidth() + #print via.GetDrillValue() + return annr + +def f_mm(raw): + return repr(raw/mm_ius) + + +def calculate_AR(): + global mm_ius, DRL_EXTRA, AR_SET, AR_SET_V, DRL_EXTRA_ius, MIN_AR_SIZE, MIN_AR_SIZE_V + board = pcbnew.GetBoard() + PassC=FailC=0 + PassCV=FailCV=0 + + PassCN=FailCN=0 + PassCVN=FailCVN=0 + + fileName = GetBoard().GetFileName() + if len(fileName)==0: + wx.LogMessage("a board needs to be saved/loaded!") + else: + found_violations=False + _pcbnew_frame = [x for x in wx.GetTopLevelWindows() if x.GetTitle().lower().startswith('pcbnew')][0] + aResult = AnnularResult_Dlg(_pcbnew_frame) + #import pcbnew;pcbnew.GetWizardsBackTrace() + writeTxt= aResult.m_richTextResult.WriteText + rt = aResult.m_richTextResult + rt.BeginItalic() + writeTxt("'action_menu_annular_check.py'\n") + #frame.m_richText1.WriteText("'action_menu_annular_check.py'\n") + LogMsg="" + msg="'action_menu_annular_check.py'\n" + msg+="version = "+___version___ + writeTxt("version = "+___version___) + msg+="\nTesting PCB for Annular Rings\nTH Pads >= "+repr(AR_SET)+" Vias >= "+repr(AR_SET_V)+"\nPHD margin on PTH = "+ repr(DRL_EXTRA) + writeTxt("\nTesting PCB for Annular Rings\nTH Pads >= "+repr(AR_SET)+" Vias >= "+repr(AR_SET_V)+"\nPHD margin on PTH = "+ repr(DRL_EXTRA)) + rt.EndItalic() + writeTxt('\n\n') + #print (msg) + LogMsg+=msg+'\n\n' + + # print "LISTING VIAS:" + for item in board.GetTracks(): + if type(item) is pcbnew.VIA: + pos = item.GetPosition() + drill = item.GetDrillValue() + width = item.GetWidth() + ARv = vias_annring_size(item) + if ARv < MIN_AR_SIZE_V: # print("AR violation at %s." % (pad.GetPosition() / mm_ius )) Raw units, needs fixing - XYpair = item.GetPosition() - msg="AR Via violation of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1]) + XYpair = item.GetPosition() + msg="AR Via violation of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1]) + rt.BeginTextColour('red') + writeTxt("AR Via violation of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1])+'\n') + rt.EndTextColour() + #print (msg) + LogMsg+=msg+'\n' + FailCV = FailCV+1 + else: + PassCV = PassCV+1 + #print type(item) + + msg="VIAS that Pass = "+repr(PassCV)+"; Fails = "+repr(FailCV) + if FailCV >0: + rt.BeginBold() + writeTxt("VIAS that Pass = "+repr(PassCV)+"; ") + if FailCV >0: + rt.BeginTextColour('red') + writeTxt("Fails = "+repr(FailCV)+'\n\n') + if FailCV >0: + rt.EndTextColour() + rt.EndBold() + print(msg) + LogMsg+=msg+'\n' + + for module in board.GetModules(): + try: + module_Pads=module.PadsList() + except: + module_Pads=module.Pads() + for pad in module_Pads: #print(pad.GetAttribute()) + if pad.GetAttribute() == PAD_ATTRIB_STANDARD: #TH pad + ARv = annring_size(pad) + #print(f_mm(ARv)) + if ARv < MIN_AR_SIZE: + # print("AR violation at %s." % (pad.GetPosition() / mm_ius )) Raw units, needs fixing + XYpair = pad.GetPosition() + msg="AR PTH violation of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1]) rt.BeginTextColour('red') - writeTxt("AR Via violation of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1])+'\n') + writeTxt("AR PTH violation of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1])+'\n') rt.EndTextColour() #print (msg) LogMsg+=msg+'\n' - FailCV = FailCV+1 + FailC = FailC+1 else: - PassCV = PassCV+1 - #print type(item) - - msg="VIAS that Pass = "+repr(PassCV)+"; Fails = "+repr(FailCV) - if FailCV >0: - rt.BeginBold() - writeTxt("VIAS that Pass = "+repr(PassCV)+"; ") - if FailCV >0: - rt.BeginTextColour('red') - writeTxt("Fails = "+repr(FailCV)+'\n\n') - if FailCV >0: - rt.EndTextColour() - rt.EndBold() - print(msg) - LogMsg+=msg+'\n' - - for module in board.GetModules(): - try: - module_Pads=module.PadsList() - except: - module_Pads=module.Pads() - for pad in module_Pads: #print(pad.GetAttribute()) - if pad.GetAttribute() == PAD_ATTRIB_STANDARD: #TH pad - ARv = annring_size(pad) - #print(f_mm(ARv)) - if ARv < MIN_AR_SIZE: - # print("AR violation at %s." % (pad.GetPosition() / mm_ius )) Raw units, needs fixing + PassC = PassC+1 + if pad.GetAttribute() == PAD_ATTRIB_HOLE_NOT_PLATED: + ARvX, ARvY = annringNP_size(pad) + #print(f_mm(ARvX));print(f_mm(ARvY)) + if (ARvX) != 0 or ARvY != 0: + ARv = min(ARvX, ARvY) + if ARv < MIN_AR_SIZE: + # print("AR violation at %s." % (pad.GetPosition() / mm_ius )) Raw units, needs fixing XYpair = pad.GetPosition() - msg="AR PTH violation of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1]) + msg="AR NPTH warning of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1]) rt.BeginTextColour('red') - writeTxt("AR PTH violation of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1])+'\n') + writeTxt("AR NPTH warning of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1])+'\n') rt.EndTextColour() #print (msg) LogMsg+=msg+'\n' - FailC = FailC+1 - else: - PassC = PassC+1 - if pad.GetAttribute() == PAD_ATTRIB_HOLE_NOT_PLATED: - ARvX, ARvY = annringNP_size(pad) - #print(f_mm(ARvX));print(f_mm(ARvY)) - if (ARvX) != 0 or ARvY != 0: - ARv = min(ARvX, ARvY) - if ARv < MIN_AR_SIZE: - # print("AR violation at %s." % (pad.GetPosition() / mm_ius )) Raw units, needs fixing - XYpair = pad.GetPosition() - msg="AR NPTH warning of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1]) - rt.BeginTextColour('red') - writeTxt("AR NPTH warning of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1])+'\n') - rt.EndTextColour() - #print (msg) - LogMsg+=msg+'\n' - FailCN = FailCN+1 - else: - PassCN = PassCN+1 + FailCN = FailCN+1 else: PassCN = PassCN+1 - - #if FailCV >0: - #writeTxt('\n') - msg = "TH PADS that Pass = "+repr(PassC)+"; Fails = "+repr(FailC) - if FailC >0: - rt.BeginBold() - writeTxt("TH PADS that Pass = "+repr(PassC)+"; ") - if FailC >0: - rt.BeginTextColour('red') - writeTxt("Fails = "+repr(FailC)+'\n') - if FailC >0: - rt.EndTextColour() - rt.EndBold() - print(msg) - LogMsg+=msg+'\n' - - msg="NPTH PADS that Pass = "+repr(PassCN)+"; Fails = "+repr(FailCN) - #writeTxt('\n') - if FailCN >0: - rt.BeginBold() - writeTxt("NPTH PADS that Pass = "+repr(PassCN)+"; ") - if FailCN >0: - rt.BeginTextColour('red') - writeTxt("Fails = "+repr(FailCN)+'\n') - if FailC >0: - rt.EndTextColour() - rt.EndBold() - print(msg) - LogMsg+=msg+'\n' - - pcbName = (os.path.splitext(GetBoard().GetFileName())[0]) #filename no ext - #wx.LogMessage(pcbName)#LogMsg) - ##wx.LogMessage(LogMsg) - FC=r"C:\FreeCAD\bin\freecad.exe" - kSU=r"C:\Cad\Progetti_K\3D-FreeCad-tools\kicad-StepUp-tools.FCMacro" - #subprocess.check_call([FC, kSU, pcbName]) - ##p = subprocess.Popen([FC, kSU, pcbName]) - - #found_violations=False - if (FailC+FailCN+FailCV)>0: - found_violations=True - - if found_violations: - #frame.m_staticTitle = wx.StaticText(frame, label=" Check result: (Violations found)") - frame.m_staticTitle.SetLabel(" Check result: (Violations found)") - #self.title.SetForegroundColour('#FF0000') - frame.m_staticTitle.SetBackgroundColour('#FF0000') - font = wx.Font(wx.DEFAULT, wx.DECORATIVE, wx.ITALIC, wx.BOLD) - frame.m_staticTitle.SetFont(font) - else: - #frame.m_staticTitle = wx.StaticText(frame, label=" Annular Check result: OK") - frame.m_staticTitle.SetLabel(" Annular Check result: OK") - frame.m_staticTitle.SetBackgroundColour('#00FF00') - font = wx.Font(wx.DEFAULT, wx.DECORATIVE, wx.ITALIC, wx.BOLD) - frame.m_staticTitle.SetFont(font) - ##frame = displayDialog(None) - #frame = wx.Frame(None) - frame.Center() - #frame.setMsg(LogMsg) - #frame.Show(True) - frame.ShowModal() - #frame.show() - frame.Destroy() - #frame = wx.wxFrame(None, 10110, 'T-Make', size=wx.wxSize(100,100), - # style=wx.wxSTAY_ON_TOP) - #frame.show() + else: + PassCN = PassCN+1 + + #if FailCV >0: + #writeTxt('\n') + msg = "TH PADS that Pass = "+repr(PassC)+"; Fails = "+repr(FailC) + if FailC >0: + rt.BeginBold() + writeTxt("TH PADS that Pass = "+repr(PassC)+"; ") + if FailC >0: + rt.BeginTextColour('red') + writeTxt("Fails = "+repr(FailC)+'\n') + if FailC >0: + rt.EndTextColour() + rt.EndBold() + print(msg) + LogMsg+=msg+'\n' + + msg="NPTH PADS that Pass = "+repr(PassCN)+"; Fails = "+repr(FailCN) + #writeTxt('\n') + if FailCN >0: + rt.BeginBold() + writeTxt("NPTH PADS that Pass = "+repr(PassCN)+"; ") + if FailCN >0: + rt.BeginTextColour('red') + writeTxt("Fails = "+repr(FailCN)+'\n') + if FailC >0: + rt.EndTextColour() + rt.EndBold() + print(msg) + LogMsg+=msg+'\n' + + pcbName = (os.path.splitext(GetBoard().GetFileName())[0]) #filename no ext + #wx.LogMessage(pcbName)#LogMsg) + ##wx.LogMessage(LogMsg) + FC=r"C:\FreeCAD\bin\freecad.exe" + kSU=r"C:\Cad\Progetti_K\3D-FreeCad-tools\kicad-StepUp-tools.FCMacro" + #subprocess.check_call([FC, kSU, pcbName]) + ##p = subprocess.Popen([FC, kSU, pcbName]) + + #found_violations=False + if (FailC+FailCN+FailCV)>0: + found_violations=True + + if found_violations: + #frame.m_staticTitle = wx.StaticText(frame, label=" Check result: (Violations found)") + aResult.m_staticTitle.SetLabel(" Check result: (Violations found)") + #self.title.SetForegroundColour('#FF0000') + aResult.m_staticTitle.SetBackgroundColour('#FF0000') + font = wx.Font(wx.DEFAULT, wx.DECORATIVE, wx.ITALIC, wx.BOLD) + aResult.m_staticTitle.SetFont(font) + else: + #frame.m_staticTitle = wx.StaticText(frame, label=" Annular Check result: OK") + aResult.m_staticTitle.SetLabel(" Annular Check result: OK") + aResult.m_staticTitle.SetBackgroundColour('#00FF00') + font = wx.Font(wx.DEFAULT, wx.DECORATIVE, wx.ITALIC, wx.BOLD) + aResult.m_staticTitle.SetFont(font) + + + aResult.Show() + modal_result = aResult.ShowModal() + if modal_result == wx.ID_OK: + aResult.Destroy() + if modal_result == wx.ID_OK: + aResult.Destroy() + + # ##frame = displayDialog(None) + # #frame = wx.Frame(None) + # frame.Center() + # #frame.setMsg(LogMsg) + # #frame.Show(True) + # frame.ShowModal() + # #frame.show() + # frame.Destroy() + # #frame = wx.wxFrame(None, 10110, 'T-Make', size=wx.wxSize(100,100), + # # style=wx.wxSTAY_ON_TOP) + # #frame.show() # annular_check().register() if __name__ == "__main__": diff --git a/AnnularChecker/annular_checker_html.py.txt b/AnnularChecker/annular_checker_html.py.txt deleted file mode 100644 index d8fa608..0000000 --- a/AnnularChecker/annular_checker_html.py.txt +++ /dev/null @@ -1,455 +0,0 @@ -# -*- coding: utf-8 -*- -# -# A script to check for annular ring violations -# both for TH pads and vias -# requirements: KiCAD pcbnew >= 4.0 -# annular.py release "1.5.1" -# -# annular.py checking PCB for Annular Ring in Vias and TH Pads -# (SMD, Connector and NPTH are skipped) -# default Annular Ring >= 0.15 both for TH Pads and Vias -# to change values modify: -# -# AR_SET = 0.150 #minimum annular accepted for pads -# AR_SET_V = 0.150 #minimum annular accepted for vias - -# annular.py - - -___version___="1.5.7" - -global mm_ius, DRL_EXTRA, AR_SET, AR_SET_V, DRL_EXTRA_ius, MIN_AR_SIZE, MIN_AR_SIZE_V, found_violations -#wx.LogMessage("My message") -mm_ius = 1000000.0 -# (consider always drill +0.1) -DRL_EXTRA=0.1 -DRL_EXTRA_ius=DRL_EXTRA * mm_ius - -AR_SET = 0.125 #minimum annular accepted for pads -MIN_AR_SIZE = AR_SET * mm_ius - -AR_SET_V = 0.125 #minimum annular accepted for vias -MIN_AR_SIZE_V = AR_SET_V * mm_ius - -import sys -import wx -import wx.html -import subprocess -import os -import pcbnew -from pcbnew import * -import base64 -from wx.lib.embeddedimage import PyEmbeddedImage -sys.path.append(os.path.dirname(__file__)) - - - -class annular_check( pcbnew.ActionPlugin ): - """ - A script to check for annular ring violations - both for TH pads and vias - requirements: KiCAD pcbnew >= 4.0 - annular.py release "1.5.1" - - annular.py checking PCB for Annular Ring in Vias and TH Pads - (SMD, Connector and NPTH are skipped) - default Annular Ring >= 0.15 both for TH Pads and Vias - to change values modify: - - AR_SET = 0.150 #minimum annular accepted for pads - AR_SET_V = 0.150 #minimum annular accepted for vias - """ - - 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 = "Annular check" - self.category = "Checking PCB" - self.description = "Automaticaly check annular on an existing PCB" - - def Run( self ): - - ########################################################################### - ## Class AR_Prm - ########################################################################### - - class AR_Prm ( wx.Dialog ): - - def __init__( self, parent ): - wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = "AR parameters", pos = wx.DefaultPosition, size = wx.Size( 320,193 ), style = wx.DEFAULT_DIALOG_STYLE ) - - self.SetSizeHints( 500,500 ) - - self.SetIcon(PyEmbeddedImage(annular_ico_b64_data).GetIcon()) - - bSizer1 = wx.BoxSizer( wx.VERTICAL ) - - gSizer2 = wx.GridSizer( 0, 2, 0, 0 ) - - self.m_staticText11 = wx.StaticText( self, wx.ID_ANY, u"PHD margin", wx.Point( -1,-1 ), wx.DefaultSize, 0 ) - self.m_staticText11.Wrap( -1 ) - - gSizer2.Add( self.m_staticText11, 0, wx.ALL, 5 ) - - self.m_textPHD = wx.TextCtrl( self, wx.ID_ANY, str(DRL_EXTRA), wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer2.Add( self.m_textPHD, 0, wx.ALL, 5 ) - - self.m_staticText1 = wx.StaticText( self, wx.ID_ANY, u"AR for pads", wx.Point( -1,-1 ), wx.DefaultSize, 0 ) - self.m_staticText1.Wrap( -1 ) - - gSizer2.Add( self.m_staticText1, 0, wx.ALL, 5 ) - - self.m_textAR_SET = wx.TextCtrl( self, wx.ID_ANY, str(AR_SET), wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer2.Add( self.m_textAR_SET, 0, wx.ALL, 5 ) - - self.m_staticText12 = wx.StaticText( self, wx.ID_ANY, u"AR for vias", wx.Point( -1,-1 ), wx.DefaultSize, 0 ) - self.m_staticText12.Wrap( -1 ) - - gSizer2.Add( self.m_staticText12, 0, wx.ALL, 5 ) - - self.m_textAR_SET_V = wx.TextCtrl( self, wx.ID_ANY, str(AR_SET_V), wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer2.Add( self.m_textAR_SET_V, 0, wx.ALL, 5 ) - - - bSizer1.Add( gSizer2, 1, wx.EXPAND, 5 ) - - gSizer1 = wx.GridSizer( 0, 2, 0, 0 ) - - self.m_ok_btn = wx.Button( self, wx.ID_ANY, u"OK", wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer1.Add( self.m_ok_btn, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 ) - - # self.m_cancel_btn = wx.Button( self, wx.ID_ANY, u"Cancel", wx.DefaultPosition, wx.DefaultSize, 0 ) - # gSizer1.Add( self.m_cancel_btn, 0, wx.ALL, 5 ) - - - bSizer1.Add( gSizer1, 1, wx.EXPAND, 5 ) - - - self.SetSizer( bSizer1 ) - self.Layout() - - self.Centre( wx.BOTH ) - - #### ----- connections - # Connect Events - self.Bind(wx.EVT_BUTTON, self.OnClickOK, self.m_ok_btn) - # self.Bind(wx.EVT_BUTTON, self.OnClickCancel, self.m_cancel_btn) - # Tooltips - #self.m_cancel_btn.SetToolTip( wx.ToolTip(u"Cancel" )) - self.m_ok_btn.SetToolTip( wx.ToolTip(u"Confirm" )) - self.m_staticText1.SetToolTip( wx.ToolTip(u"Annular Ring for Pads (mm)" )) - self.m_textAR_SET.SetToolTip( wx.ToolTip(u"Annular Ring for Pads (mm)" )) - self.m_textAR_SET_V.SetToolTip( wx.ToolTip(u"Annular Ring for Vias (mm)" )) - self.m_staticText12.SetToolTip( wx.ToolTip(u"Annular Ring for Vias (mm)" )) - self.m_textPHD.SetToolTip( wx.ToolTip(u"Drill extra margin (mm)" )) - self.m_staticText11.SetToolTip( wx.ToolTip(u"Drill extra margin (mm)" )) - - def __del__( self ): - pass - - def OnClickOK(self, event): - global mm_ius, DRL_EXTRA, AR_SET, AR_SET_V, DRL_EXTRA_ius, MIN_AR_SIZE, MIN_AR_SIZE_V - - self.m_ok_btn.SetLabel("Clicked") - phd = float(self.m_textPHD.GetValue().replace(',','.')) - ar = float(self.m_textAR_SET.GetValue().replace(',','.')) - arv = float(self.m_textAR_SET_V.GetValue().replace(',','.')) - DRL_EXTRA=phd - DRL_EXTRA_ius=DRL_EXTRA * mm_ius - - AR_SET = ar #minimum annular accepted for pads - MIN_AR_SIZE = AR_SET * mm_ius - - AR_SET_V = arv #minimum annular accepted for vias - MIN_AR_SIZE_V = AR_SET_V * mm_ius - self.Destroy() - - def OnClickCancel(self, event): - self.m_cancel_btn.SetLabel("Clicked") - self.Destroy() - - #wx.MessageDialog(self.frame,"ciao") - #subprocess.check_call(["C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"]) - #http://stackoverflow.com/questions/1811691/running-an-outside-program-executable-in-python - class displayDialog(wx.Dialog): - """ - The default frame - http://stackoverflow.com/questions/3566603/how-do-i-make-wx-textctrl-multi-line-text-update-smoothly - """ - global mm_ius, DRL_EXTRA, AR_SET, AR_SET_V, DRL_EXTRA_ius, MIN_AR_SIZE, MIN_AR_SIZE_V, found_violations - #---------------------------------------------------------------------- - #def __init__(self): - # """Constructor""" - # wx.Frame.__init__(self, None, title="Display Frame", style=wx.DEFAULT_FRAME_STYLE, wx.ICON_INFORMATION) - # panel = wx.Panel(self) - def __init__(self, parent): - wx.Dialog.__init__(self, parent, id=-1, title="Annular Checker")# - #, style=wx.DEFAULT_DIALOG_STYLE, wx.ICON_INFORMATION) - #, style=wx.DEFAULT_DIALOG_STYLE, wx.ICON_INFORMATION) - #, pos=DefaultPosition, size=DefaultSize, style = wx.DEFAULT_FRAME_STYLE & (~wx.MAXIMIZE_BOX), name="fname") - #, wx.ICON_INFORMATION) #, title="Annular Check", style=wx.DEFAULT_FRAME_STYLE, wx.ICON_INFORMATION) - # - - self.SetIcon(PyEmbeddedImage(annular_ico_b64_data).GetIcon()) - #wx.IconFromBitmap(wx.Bitmap("icon.ico", wx.BITMAP_TYPE_ANY))) - self.panel = wx.Panel(self) - - if found_violations: - self.title = wx.StaticText(self.panel, label="Check result: (Violations found)") - #self.title.SetForegroundColour('#FF0000') - self.title.SetBackgroundColour('#FF0000') - font = wx.Font(wx.DEFAULT, wx.DECORATIVE, wx.ITALIC, wx.BOLD) - self.title.SetFont(font) - else: - self.title = wx.StaticText(self.panel, label="Annular Check result: OK") - self.title.SetBackgroundColour('#00FF00') - #self.result = wx.StaticText(self.panel, label="") - #self.result.SetForegroundColour('#FF0000') - #self.button = wx.Button(self.panel, label="Save") - #self.lblname = wx.StaticText(self.panel, label="Your name:") - #self.editname = wx.TextCtrl(self.panel, size=(140, -1)) - self.editname = wx.TextCtrl(self.panel, size = (400, 400), style = wx.TE_MULTILINE|wx.TE_READONLY) - self.m_htmlWin1 = wx.html.HtmlWindow( self.panel, wx.ID_ANY, wx.DefaultPosition, wx.Size( 400,400 ), wx.html.HW_SCROLLBAR_AUTO ) - #bSizer1.Add( self.m_htmlWin1, 0, wx.ALL, 5 ) - - - # Set sizer for the frame, so we can change frame size to match widgets - self.windowSizer = wx.BoxSizer() - #self.windowSizer.Add(self.m_htmlWin1, 1, wx.ALL | wx.EXPAND) - self.windowSizer.Add(self.panel, 1, wx.ALL | wx.EXPAND) - - # Set sizer for the panel content - self.sizer = wx.GridBagSizer(5, 0) - self.sizer.Add(self.title, (0, 0)) - #self.sizer.Add(self.result, (1, 0)) - #self.sizer.Add(self.lblname, (1, 0)) - ##self.sizer.Add(self.m_htmlWin1, (1, 0)) - self.sizer.Add(self.editname, (1, 0)) - #self.sizer.Add(self.button, (2, 0), (1, 2), flag=wx.EXPAND) - - # Set simple sizer for a nice border - self.border = wx.BoxSizer() - self.border.Add(self.sizer, 1, wx.ALL | wx.EXPAND, 5) - - # Use the sizers - self.panel.SetSizerAndFit(self.border) - self.SetSizerAndFit(self.windowSizer) - #self.result.SetLabel(msg) - # Set event handlers - #self.button.Bind(wx.EVT_BUTTON, self.OnButton) - #self.Show() - #self.Bind(wx.EVT_CLOSE,self.OnClose) - - #def OnClose(self,e): - # #wx.LogMessage("c") - # e.Skip() - #self.Close() - - #def OnButton(self, e): - # self.result.SetLabel(self.editname.GetValue()) - def setMsg(self, t_msg): - self.editname.SetValue(t_msg) - self.m_htmlWin1.SetPage(t_msg) - - - def annring_size(pad): - # valid for oval pad/drills - annrX=(pad.GetSize()[0] - (pad.GetDrillSize()[0]+DRL_EXTRA_ius))/2 - annrY=(pad.GetSize()[1] - (pad.GetDrillSize()[1]+DRL_EXTRA_ius))/2 - #annr=min(pad.GetSize()) - max(pad.GetDrillSize()) - #if annr < MIN_AR_SIZE: - #print annrX - #print annrY - #print pad.GetSize()[0]/mm_ius - #print pad.GetSize()[0]#/mm_ius - #print pad.GetDrillSize()[0]#/mm_ius - #print DRL_EXTRA_ius - #print pad.GetDrillSize()[0]/mm_ius - #print (pad.GetDrillSize()[0]+DRL_EXTRA_ius)/mm_ius - #print annrX/mm_ius - return min(annrX,annrY) - - def annringNP_size(pad): - # valid for oval pad/drills - annrX=(pad.GetSize()[0] - (pad.GetDrillSize()[0]))/2 - annrY=(pad.GetSize()[1] - (pad.GetDrillSize()[1]))/2 - #annr=min(pad.GetSize()) - max(pad.GetDrillSize()) - #if annr < MIN_AR_SIZE: - #print annrX - #print annrY - #print pad.GetSize()[0]/mm_ius - #print pad.GetSize()[0]#/mm_ius - #print pad.GetDrillSize()[0]#/mm_ius - #print DRL_EXTRA_ius - #print pad.GetDrillSize()[0]/mm_ius - #print (pad.GetDrillSize()[0]+DRL_EXTRA_ius)/mm_ius - #print annrX/mm_ius - #return min(annrX,annrY) - return annrX,annrY - - def vias_annring_size(via): - # calculating via annular - annr=(via.GetWidth() - (via.GetDrillValue()+DRL_EXTRA_ius))/2 - #print via.GetWidth() - #print via.GetDrillValue() - return annr - - def f_mm(raw): - return repr(raw/mm_ius) - - board = pcbnew.GetBoard() - PassC=FailC=0 - PassCV=FailCV=0 - - PassCN=FailCN=0 - PassCVN=FailCVN=0 - - fileName = GetBoard().GetFileName() - if len(fileName)==0: - wx.LogMessage("a board needs to be saved/loaded!") - else: - - frame = AR_Prm(None) - #frame = wx.Frame(None) - frame.Center() - #frame.setMsg(LogMsg) - frame.ShowModal() - frame.Destroy() - - LogMsg="Hello, world!
" - msg="action_menu_annular_check.py
" - msg+="version = "+___version___ - msg+="
Testing PCB for Annular Rings
TH Pads = "+repr(AR_SET)+" Vias = "+repr(AR_SET_V)+"
PHD margin on PTH = "+ repr(DRL_EXTRA) - #print (msg) - LogMsg+=msg+"

" - - # print "LISTING VIAS:" - for item in board.GetTracks(): - if type(item) is pcbnew.VIA: - pos = item.GetPosition() - drill = item.GetDrillValue() - width = item.GetWidth() - ARv = vias_annring_size(item) - if ARv < MIN_AR_SIZE_V: - # print("AR violation at %s." % (pad.GetPosition() / mm_ius )) Raw units, needs fixing - XYpair = item.GetPosition() - msg="AR Via violation of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1]) - #print (msg) - LogMsg+=msg+"
" - FailCV = FailCV+1 - else: - PassCV = PassCV+1 - #print type(item) - - msg="VIAS that Pass = "+repr(PassCV)+"; Fails = "+repr(FailCV) - # print(msg) - LogMsg+=msg+"
" - - for module in board.GetModules(): - try: - module_Pads=module.PadsList() - except: - module_Pads=module.Pads() - for pad in module_Pads: #print(pad.GetAttribute()) - if pad.GetAttribute() == PAD_ATTRIB_STANDARD: #TH pad - ARv = annring_size(pad) - #print(f_mm(ARv)) - if ARv < MIN_AR_SIZE: - # print("AR violation at %s." % (pad.GetPosition() / mm_ius )) Raw units, needs fixing - XYpair = pad.GetPosition() - msg="AR PTH violation of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1]) - #print (msg) - LogMsg+=msg+"
" - FailC = FailC+1 - else: - PassC = PassC+1 - if pad.GetAttribute() == PAD_ATTRIB_HOLE_NOT_PLATED: - ARvX, ARvY = annringNP_size(pad) - #print(f_mm(ARvX));print(f_mm(ARvY)) - if (ARvX) != 0 or ARvY != 0: - ARv = min(ARvX, ARvY) - if ARv < MIN_AR_SIZE: - # print("AR violation at %s." % (pad.GetPosition() / mm_ius )) Raw units, needs fixing - XYpair = pad.GetPosition() - msg="AR NPTH warning of "+f_mm(ARv)+" at XY "+f_mm(XYpair[0])+","+f_mm(XYpair[1]) - #print (msg) - LogMsg+=msg+"
" - FailCN = FailCN+1 - else: - PassCN = PassCN+1 - else: - PassCN = PassCN+1 - - msg = "TH PADS that Pass = "+repr(PassC)+"; Fails = "+repr(FailC) - print(msg) - LogMsg+=msg+"
" - - msg="NPTH PADS that Pass = "+repr(PassCN)+"; Fails = "+repr(FailCN) - print(msg) - LogMsg+=msg+"" - - pcbName = (os.path.splitext(GetBoard().GetFileName())[0]) #filename no ext - #wx.LogMessage(pcbName)#LogMsg) - ##wx.LogMessage(LogMsg) - FC=r"C:\FreeCAD\bin\freecad.exe" - #kSU=r"C:\Cad\Progetti_K\3D-FreeCad-tools\kicad-StepUp-tools.FCMacro" - #subprocess.check_call([FC, kSU, pcbName]) - ##p = subprocess.Popen([FC, kSU, pcbName]) - - found_violations=False - if (FailC+FailCN+FailCV)>0: - found_violations=True - - frame = displayDialog(None) - #frame = wx.Frame(None) - frame.Center() - frame.setMsg(LogMsg) - frame.ShowModal() - frame.Destroy() - #frame = wx.wxFrame(None, 10110, 'T-Make', size=wx.wxSize(100,100), - # style=wx.wxSTAY_ON_TOP) - #frame.show() - -# annular_check().register() -if __name__ == "__main__": - import argparse - - parser = argparse.ArgumentParser( - description='KiCad PCB Annular Checker') - parser.add_argument('file', type=str, help="KiCad PCB file") - args = parser.parse_args() - print("Loading %s" % args.file) - main(pcbnew.LoadBoard(args.file)) - -else: - annular_check().register() - - -# "b64_data" is a variable containing your base64 encoded jpeg -annular_ico_b64_data =\ -""" -iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAIQQAACEEB+v+u9gAAABl0RVh0U29mdHdhcmUAd3d -3Lmlua3NjYXBlLm9yZ5vuPBoAAAJ5SURBVDiNdZRNSFRRFMd/976ZJjeBn2PUoiLaiMFkFkHIQ0NBdBUlJuIqiixmIYjQRgiJYKAMXRRSi6TCD5gaWiSFsy -gixOyDpDAog8wn9SISapz33m0x82bmzcOzO/97/r973nn3XqGUojjCybIm4BhQD9Rl5XlgDnhi6ObTYo8oBIWTZeXAMNDlalW/FJYmMLd5fONA1NBN0wcKJ -8sagftAZWRJcWHS5vCiouJ3pnClUvC8VnDtpOTTDgGwCpwydHM2Bwony8LAe6koH7hjc37aQXN8XwzAv5DgUo9krF0C/ABqDN1ck9n1G0D54C2H6OTmEICt -KcXQTZvTCQegAhgFEFWzpW1A4uAHRaLfQhbPXgD+/8HfkKBhNMDXMACtEmgC6L/reCBWKGAzMmLxbQWWl2Fw0FJavqIkpYhO2m7aHADqNQcOLXq3DcSuKnp -6Ajmhry8g1tfTxGJBVzryLuepl0Bk16qiJJUHKU0qOjryEDe6u4OF6e7vitCGAohIAFk0XCWEQkp8oWmeVAAiu78EFj5vF6S2iFyBtGxJPJ72gSYmPNpyOH -McgAUJzFkazO/zetLRc4J43MayIJWCsTHLuTzkaellTa7rOVE1W9oOPDz6VjF90fI14QQ1RzhKCNsRhfpGEBqvB1jaKQDapKGbCeDBs/2C8Rb/XGTalsUQg -Fin5kKmDN185DrPAD8HzmrcbpUony0flgZXujSGT+SuSC94L20LcA8obXiduSp1H8kdiz8l8KJWEOvUeLNXuJAuQzdnPKAsrBoYAY4DaA7sWck8I1+qKex0 -Cug1dHPNFcQmD1sL0AwcACJZeQF4BcwYuvm42PMfVgD11Y9MUIEAAAAASUVORK5CYII= -""" - - -# execfile("annular.py") -# annular.py Testing PCB for Annular Ring >= 0.15 -# AR violation of 0.1 at XY 172.974,110.744 -# VIAS that Pass = 100 Fails = 1 -# AR violation of 0.1 at XY 172.212,110.744 -# AR violation of 0.0 at XY 154.813,96.52 -# PADS that Pass = 49 Fails = 2 - diff --git a/AnnularChecker/dlg.py.txt b/AnnularChecker/dlg.py.txt deleted file mode 100644 index 0711b2a..0000000 --- a/AnnularChecker/dlg.py.txt +++ /dev/null @@ -1,85 +0,0 @@ -# -*- coding: utf-8 -*- - -########################################################################### -## Python code generated with wxFormBuilder (version Jul 11 2018) -## http://www.wxformbuilder.org/ -## -## PLEASE DO *NOT* EDIT THIS FILE! -########################################################################### - -import wx -import wx.xrc - -########################################################################### -## Class AR_Prm -########################################################################### - -class AR_Prm ( wx.Dialog ): - - def __init__( self, parent ): - wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = u"Annular Checker", pos = wx.DefaultPosition, size = wx.Size( 320,229 ), style = wx.DEFAULT_DIALOG_STYLE ) - - self.SetSizeHints( wx.DefaultSize, wx.DefaultSize ) - - bSizer1 = wx.BoxSizer( wx.VERTICAL ) - - gSizer2 = wx.GridSizer( 0, 2, 0, 0 ) - - self.m_StaticTextPHD = wx.StaticText( self, wx.ID_ANY, u"PHD margin", wx.Point( -1,-1 ), wx.DefaultSize, 0 ) - self.m_StaticTextPHD.Wrap( -1 ) - - gSizer2.Add( self.m_StaticTextPHD, 0, wx.ALL, 5 ) - - self.m_textPHD = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer2.Add( self.m_textPHD, 0, wx.ALL, 5 ) - - self.m_StaticTextAR_SET = wx.StaticText( self, wx.ID_ANY, u"AR for pads", wx.Point( -1,-1 ), wx.DefaultSize, 0 ) - self.m_StaticTextAR_SET.Wrap( -1 ) - - gSizer2.Add( self.m_StaticTextAR_SET, 0, wx.ALL, 5 ) - - self.m_textAR_SET = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer2.Add( self.m_textAR_SET, 0, wx.ALL, 5 ) - - self.m_StaticTextAR_SET_V = wx.StaticText( self, wx.ID_ANY, u"AR for vias", wx.Point( -1,-1 ), wx.DefaultSize, 0 ) - self.m_StaticTextAR_SET_V.Wrap( -1 ) - - gSizer2.Add( self.m_StaticTextAR_SET_V, 0, wx.ALL, 5 ) - - self.m_textAR_SET_V = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer2.Add( self.m_textAR_SET_V, 0, wx.ALL, 5 ) - - bSizer2 = wx.BoxSizer( wx.VERTICAL ) - - self.m_staticTextVersion = wx.StaticText( self, wx.ID_ANY, u"Version", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.m_staticTextVersion.Wrap( -1 ) - - bSizer2.Add( self.m_staticTextVersion, 0, wx.ALL, 5 ) - - - gSizer2.Add( bSizer2, 1, wx.EXPAND, 5 ) - - - bSizer1.Add( gSizer2, 1, wx.EXPAND, 5 ) - - gSizer1 = wx.GridSizer( 0, 2, 0, 0 ) - - self.m_ok_btn = wx.Button( self, wx.ID_ANY, u"OK", wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer1.Add( self.m_ok_btn, 0, wx.ALL, 5 ) - - self.m_cancel_btn = wx.Button( self, wx.ID_ANY, u"Cancel", wx.DefaultPosition, wx.DefaultSize, 0 ) - gSizer1.Add( self.m_cancel_btn, 0, wx.ALL, 5 ) - - - bSizer1.Add( gSizer1, 1, wx.EXPAND, 5 ) - - - self.SetSizer( bSizer1 ) - self.Layout() - - self.Centre( wx.BOTH ) - - def __del__( self ): - pass - -