first step to renew the repo

This commit is contained in:
easyw
2019-11-03 15:29:21 +01:00
parent 906781118d
commit 37e0a2a07f
42 changed files with 8432 additions and 659 deletions

View File

@ -0,0 +1,914 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="14" />
<object class="Project" expanded="1">
<property name="class_decoration"></property>
<property name="code_generation">C++</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file"></property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="indent_with_spaces"></property>
<property name="internationalize">0</property>
<property name="name">parametersDlg</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="relative_path">1</property>
<property name="skip_lua_events">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="ui_table">UI</property>
<property name="use_enum">0</property>
<property name="use_microsoft_bom">0</property>
<object class="Dialog" expanded="1">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
<property name="center">wxBOTH</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="enabled">1</property>
<property name="event_handler">impl_virtual</property>
<property name="extra_style"></property>
<property name="fg"></property>
<property name="font"></property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maximum_size"></property>
<property name="minimum_size"></property>
<property name="name">AR_Prm</property>
<property name="pos"></property>
<property name="size">320,193</property>
<property name="style">wxDEFAULT_DIALOG_STYLE</property>
<property name="subclass">; forward_declare</property>
<property name="title"></property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnActivate"></event>
<event name="OnActivateApp"></event>
<event name="OnAuiPaneActivated"></event>
<event name="OnAuiPaneButton"></event>
<event name="OnAuiPaneClose"></event>
<event name="OnAuiPaneMaximize"></event>
<event name="OnAuiPaneRestore"></event>
<event name="OnAuiRender"></event>
<event name="OnAux1DClick"></event>
<event name="OnAux1Down"></event>
<event name="OnAux1Up"></event>
<event name="OnAux2DClick"></event>
<event name="OnAux2Down"></event>
<event name="OnAux2Up"></event>
<event name="OnChar"></event>
<event name="OnCharHook"></event>
<event name="OnClose"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnHibernate"></event>
<event name="OnIconize"></event>
<event name="OnIdle"></event>
<event name="OnInitDialog"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMaximize"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnMove"></event>
<event name="OnMoveEnd"></event>
<event name="OnMoveStart"></event>
<event name="OnMoving"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnShow"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer1</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxGridSizer" expanded="1">
<property name="cols">2</property>
<property name="hgap">0</property>
<property name="minimum_size"></property>
<property name="name">gSizer2</property>
<property name="permission">none</property>
<property name="rows">0</property>
<property name="vgap">0</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">PHD margin</property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_staticText11</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos">-1,-1</property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnAux1DClick"></event>
<event name="OnAux1Down"></event>
<event name="OnAux1Up"></event>
<event name="OnAux2DClick"></event>
<event name="OnAux2Down"></event>
<event name="OnAux2Up"></event>
<event name="OnChar"></event>
<event name="OnCharHook"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_textPHD</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnAux1DClick"></event>
<event name="OnAux1Down"></event>
<event name="OnAux1Up"></event>
<event name="OnAux2DClick"></event>
<event name="OnAux2Down"></event>
<event name="OnAux2Up"></event>
<event name="OnChar"></event>
<event name="OnCharHook"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnText"></event>
<event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">AR for pads</property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_staticText1</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos">-1,-1</property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnAux1DClick"></event>
<event name="OnAux1Down"></event>
<event name="OnAux1Up"></event>
<event name="OnAux2DClick"></event>
<event name="OnAux2Down"></event>
<event name="OnAux2Up"></event>
<event name="OnChar"></event>
<event name="OnCharHook"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_textPHD1</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnAux1DClick"></event>
<event name="OnAux1Down"></event>
<event name="OnAux1Up"></event>
<event name="OnAux2DClick"></event>
<event name="OnAux2Down"></event>
<event name="OnAux2Up"></event>
<event name="OnChar"></event>
<event name="OnCharHook"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnText"></event>
<event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">AR for vias</property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_staticText12</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos">-1,-1</property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnAux1DClick"></event>
<event name="OnAux1Down"></event>
<event name="OnAux1Up"></event>
<event name="OnAux2DClick"></event>
<event name="OnAux2Down"></event>
<event name="OnAux2Up"></event>
<event name="OnChar"></event>
<event name="OnCharHook"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_textPHD11</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnAux1DClick"></event>
<event name="OnAux1Down"></event>
<event name="OnAux1Up"></event>
<event name="OnAux2DClick"></event>
<event name="OnAux2Down"></event>
<event name="OnAux2Up"></event>
<event name="OnChar"></event>
<event name="OnCharHook"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnText"></event>
<event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxGridSizer" expanded="1">
<property name="cols">2</property>
<property name="hgap">0</property>
<property name="minimum_size"></property>
<property name="name">gSizer1</property>
<property name="permission">none</property>
<property name="rows">0</property>
<property name="vgap">0</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="current"></property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="disabled"></property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="focus"></property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">OK</property>
<property name="margins"></property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_ok_btn</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="position"></property>
<property name="pressed"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnAux1DClick"></event>
<event name="OnAux1Down"></event>
<event name="OnAux1Up"></event>
<event name="OnAux2DClick"></event>
<event name="OnAux2Down"></event>
<event name="OnAux2Up"></event>
<event name="OnButtonClick"></event>
<event name="OnChar"></event>
<event name="OnCharHook"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="current"></property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="disabled"></property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="focus"></property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Cancel</property>
<property name="margins"></property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_cancel_btn</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="position"></property>
<property name="pressed"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnAux1DClick"></event>
<event name="OnAux1Down"></event>
<event name="OnAux1Up"></event>
<event name="OnAux2DClick"></event>
<event name="OnAux2Down"></event>
<event name="OnAux2Up"></event>
<event name="OnButtonClick"></event>
<event name="OnChar"></event>
<event name="OnCharHook"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
</wxFormBuilder_Project>

1016
AnnularChecker/AR-params.fbp Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,2 @@
from .annular_checker import annular_check
annular_check().register()

View File

@ -0,0 +1,2 @@
from .annular_checker import annular_check
annular_check().register()

BIN
AnnularChecker/__init__.pyc Normal file

Binary file not shown.

View File

@ -0,0 +1,2 @@
from .annular_checker_html import annular_check
annular_check().register()

View File

@ -0,0 +1,56 @@
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()

Binary file not shown.

BIN
AnnularChecker/annular.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -16,7 +16,7 @@
# annular.py
___version___="1.5.8x"
___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")
@ -70,6 +70,9 @@ class annular_check( pcbnew.ActionPlugin ):
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 ):
@ -558,7 +561,9 @@ class annular_check( pcbnew.ActionPlugin ):
#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)

View File

@ -0,0 +1,455 @@
# -*- 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="<html><body><b>Hello, world!</b><br>"
msg="action_menu_annular_check.py<br>"
msg+="version = "+___version___
msg+="<br>Testing PCB for Annular Rings<br>TH Pads = "+repr(AR_SET)+" Vias = "+repr(AR_SET_V)+"<br>PHD margin on PTH = "+ repr(DRL_EXTRA)
#print (msg)
LogMsg+=msg+"<br><br>"
# 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+"<br>"
FailCV = FailCV+1
else:
PassCV = PassCV+1
#print type(item)
msg="VIAS that Pass = "+repr(PassCV)+"; Fails = "+repr(FailCV)
# print(msg)
LogMsg+=msg+"<br>"
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+"<br>"
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+"<br>"
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+"<br>"
msg="NPTH PADS that Pass = "+repr(PassCN)+"; Fails = "+repr(FailCN)
print(msg)
LogMsg+=msg+"</body></html>"
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

View File

@ -0,0 +1,692 @@
# -*- 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___="AC 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)" ))
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( 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 ):
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

Binary file not shown.

View File

@ -0,0 +1,455 @@
# -*- 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="<html><body><b>Hello, world!</b><br>"
msg="action_menu_annular_check.py<br>"
msg+="version = "+___version___
msg+="<br>Testing PCB for Annular Rings<br>TH Pads = "+repr(AR_SET)+" Vias = "+repr(AR_SET_V)+"<br>PHD margin on PTH = "+ repr(DRL_EXTRA)
#print (msg)
LogMsg+=msg+"<br><br>"
# 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+"<br>"
FailCV = FailCV+1
else:
PassCV = PassCV+1
#print type(item)
msg="VIAS that Pass = "+repr(PassCV)+"; Fails = "+repr(FailCV)
# print(msg)
LogMsg+=msg+"<br>"
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+"<br>"
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+"<br>"
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+"<br>"
msg="NPTH PADS that Pass = "+repr(PassCN)+"; Fails = "+repr(FailCN)
print(msg)
LogMsg+=msg+"</body></html>"
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

View File

@ -0,0 +1,214 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="48"
width="48"
version="1.1"
id="svg3054"
inkscape:version="0.48.4 r9939"
sodipodi:docname="annular_pad_dimensions.svg">
<metadata
id="metadata3081">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="879"
inkscape:window-height="789"
id="namedview3079"
showgrid="false"
inkscape:zoom="4.9166667"
inkscape:cx="25.116"
inkscape:cy="26.510998"
inkscape:window-x="219"
inkscape:window-y="76"
inkscape:window-maximized="0"
inkscape:current-layer="svg3054" />
<defs
id="defs3056">
<filter
id="a"
height="1.2769"
width="1.2769"
color-interpolation-filters="sRGB"
y="-.13847"
x="-.13847">
<feGaussianBlur
stdDeviation="0.11539203"
id="feGaussianBlur3059" />
</filter>
<marker
id="h"
refY="0"
refX="0"
overflow="visible"
orient="auto"
style="overflow:visible">
<path
d="M 8.7186,4.0337 -2.2074,0.016 8.7186,-4.0017 c -1.7455,2.3721 -1.7354,5.6175 -6e-7,8.0354 z"
transform="scale(0.6,0.6)"
id="path10"
inkscape:connector-curvature="0"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" />
</marker>
<marker
id="g"
refY="0"
refX="0"
overflow="visible"
orient="auto"
style="overflow:visible">
<path
d="M 8.7186,4.0337 -2.2074,0.016 8.7186,-4.0017 c -1.7455,2.3721 -1.7354,5.6175 -6e-7,8.0354 z"
transform="scale(-0.6,-0.6)"
id="path13"
inkscape:connector-curvature="0"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" />
</marker>
<marker
id="h-4"
refY="0"
refX="0"
overflow="visible"
orient="auto"
style="overflow:visible">
<path
d="M 8.7186,4.0337 -2.2074,0.016 8.7186,-4.0017 c -1.7455,2.3721 -1.7354,5.6175 -6e-7,8.0354 z"
transform="scale(0.6,0.6)"
id="path10-0"
inkscape:connector-curvature="0"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" />
</marker>
<marker
id="g-9"
refY="0"
refX="0"
overflow="visible"
orient="auto"
style="overflow:visible">
<path
d="M 8.7186,4.0337 -2.2074,0.016 8.7186,-4.0017 c -1.7455,2.3721 -1.7354,5.6175 -6e-7,8.0354 z"
transform="scale(-0.6,-0.6)"
id="path13-4"
inkscape:connector-curvature="0"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" />
</marker>
<marker
id="marker4760"
refY="0"
refX="0"
overflow="visible"
orient="auto"
style="overflow:visible">
<path
d="M 8.7186,4.0337 -2.2074,0.016 8.7186,-4.0017 c -1.7455,2.3721 -1.7354,5.6175 -6e-7,8.0354 z"
transform="scale(0.6,0.6)"
id="path4762"
inkscape:connector-curvature="0"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" />
</marker>
<marker
id="marker4764"
refY="0"
refX="0"
overflow="visible"
orient="auto"
style="overflow:visible">
<path
d="M 8.7186,4.0337 -2.2074,0.016 8.7186,-4.0017 c -1.7455,2.3721 -1.7354,5.6175 -6e-7,8.0354 z"
transform="scale(-0.6,-0.6)"
id="path4766"
inkscape:connector-curvature="0"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" />
</marker>
</defs>
<g
transform="matrix(1.286,0,0,1.2826,58.06922,-14.528373)"
id="g3061"
inkscape:export-filename="C:\Cad\Progetti_K\3D-FreeCad-tools\annular.png"
inkscape:export-xdpi="53.68"
inkscape:export-ydpi="53.68">
<g
transform="matrix(11.8,0,0,11.536,-260.89,-12.073)"
id="g3063"
style="opacity:0.71875;filter:url(#a)">
<path
d="m -15.125,8.9375 a 0.90625,0.9375 0 1 1 -1.8125,0 0.90625,0.9375 0 1 1 1.8125,0 z"
transform="matrix(1.1034,0,-2.1667e-7,1.0667,37.69,-5.5333)"
id="path3065"
inkscape:connector-curvature="0"
style="fill-rule:evenodd" />
</g>
<path
d="m -15.125,8.9375 a 0.90625,0.9375 0 1 1 -1.8125,0 0.90625,0.9375 0 1 1 1.8125,0 z"
transform="matrix(9.1879,0,-1.8041e-6,8.7704,119.31,-46.412)"
id="path3067"
inkscape:connector-curvature="0"
style="fill:none;stroke:#16bf11;stroke-width:0.79392999" />
<g
transform="matrix(4.6582,0,0,4.6768,-121.15,13.266)"
id="g3069"
style="fill:#ffffff">
<path
d="m -15.125,8.9375 a 0.90625,0.9375 0 1 1 -1.8125,0 0.90625,0.9375 0 1 1 1.8125,0 z"
transform="matrix(1.1034,0,-2.1667e-7,1.0667,37.69,-5.5333)"
id="path3071"
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-rule:evenodd" />
</g>
</g>
<g
transform="matrix(3.3534,0,0,2.4765,-1.5227797,14.344627)"
id="g3073"
inkscape:export-filename="C:\Cad\Progetti_K\3D-FreeCad-tools\annular.png"
inkscape:export-xdpi="53.68"
inkscape:export-ydpi="53.68">
<rect
height="16"
width="16"
y="0"
x="0"
id="rect3075"
style="fill-opacity:0" />
</g>
<path
d="m 30.69521,26.522581 a 8.707635,8.658066 0 0 1 -17.41527,0 8.707635,8.658066 0 1 1 17.41527,0 z"
id="path3077"
inkscape:connector-curvature="0"
style="fill:none;stroke:#ff0c0c;stroke-width:6.90841627;stroke-linejoin:round"
inkscape:export-filename="C:\Cad\Progetti_K\3D-FreeCad-tools\annular.png"
inkscape:export-xdpi="53.68"
inkscape:export-ydpi="53.68" />
<g
id="g50"
transform="matrix(1.6262979,0,0,1.2104957,-29.057051,-8.38233)">
<rect
style="fill-opacity:0"
id="rect52"
x="0"
y="0"
width="16"
height="16" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.7 KiB

85
AnnularChecker/dlg.py.txt Normal file
View File

@ -0,0 +1,85 @@
# -*- 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

View File

@ -0,0 +1,540 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="14" />
<object class="Project" expanded="1">
<property name="class_decoration"></property>
<property name="code_generation">C++</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file"></property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="indent_with_spaces"></property>
<property name="internationalize">0</property>
<property name="name">parametersDlg</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="relative_path">1</property>
<property name="skip_lua_events">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="ui_table">UI</property>
<property name="use_enum">0</property>
<property name="use_microsoft_bom">0</property>
<object class="Dialog" expanded="1">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
<property name="center">wxBOTH</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="enabled">1</property>
<property name="event_handler">impl_virtual</property>
<property name="extra_style"></property>
<property name="fg"></property>
<property name="font"></property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maximum_size"></property>
<property name="minimum_size"></property>
<property name="name">displayDialog</property>
<property name="pos"></property>
<property name="size">320,521</property>
<property name="style">wxDEFAULT_DIALOG_STYLE</property>
<property name="subclass">; forward_declare</property>
<property name="title">Annular Checker</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnActivate"></event>
<event name="OnActivateApp"></event>
<event name="OnAuiPaneActivated"></event>
<event name="OnAuiPaneButton"></event>
<event name="OnAuiPaneClose"></event>
<event name="OnAuiPaneMaximize"></event>
<event name="OnAuiPaneRestore"></event>
<event name="OnAuiRender"></event>
<event name="OnAux1DClick"></event>
<event name="OnAux1Down"></event>
<event name="OnAux1Up"></event>
<event name="OnAux2DClick"></event>
<event name="OnAux2Down"></event>
<event name="OnAux2Up"></event>
<event name="OnChar"></event>
<event name="OnCharHook"></event>
<event name="OnClose"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnHibernate"></event>
<event name="OnIconize"></event>
<event name="OnIdle"></event>
<event name="OnInitDialog"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMaximize"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnMove"></event>
<event name="OnMoveEnd"></event>
<event name="OnMoveStart"></event>
<event name="OnMoving"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnShow"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer1</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer2</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label"></property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_staticTitle</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnAux1DClick"></event>
<event name="OnAux1Down"></event>
<event name="OnAux1Up"></event>
<event name="OnAux2DClick"></event>
<event name="OnAux2Down"></event>
<event name="OnAux2Up"></event>
<event name="OnChar"></event>
<event name="OnCharHook"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND | wxALL</property>
<property name="proportion">1</property>
<object class="wxRichTextCtrl" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">-1,400</property>
<property name="moveable">1</property>
<property name="name">m_richText1</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxTE_READONLY</property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style">wxVSCROLL|wxHSCROLL|wxNO_BORDER|wxWANTS_CHARS</property>
<event name="OnAux1DClick"></event>
<event name="OnAux1Down"></event>
<event name="OnAux1Up"></event>
<event name="OnAux2DClick"></event>
<event name="OnAux2Down"></event>
<event name="OnAux2Up"></event>
<event name="OnChar"></event>
<event name="OnCharHook"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRichTextCharacter"></event>
<event name="OnRichTextContentDeleted"></event>
<event name="OnRichTextContentInserted"></event>
<event name="OnRichTextDelete"></event>
<event name="OnRichTextReturn"></event>
<event name="OnRichTextStyleChanged"></event>
<event name="OnRichTextStyleSheetChanged"></event>
<event name="OnRichTextStyleSheetReplaced"></event>
<event name="OnRichTextStyleSheetReplacing"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnText"></event>
<event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxGridSizer" expanded="1">
<property name="cols">2</property>
<property name="hgap">0</property>
<property name="minimum_size"></property>
<property name="name">gSizer3</property>
<property name="permission">none</property>
<property name="rows">0</property>
<property name="vgap">0</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="current"></property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="disabled"></property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="focus"></property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">OK</property>
<property name="margins"></property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">ok_btn</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="position"></property>
<property name="pressed"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnAux1DClick"></event>
<event name="OnAux1Down"></event>
<event name="OnAux1Up"></event>
<event name="OnAux2DClick"></event>
<event name="OnAux2Down"></event>
<event name="OnAux2Up"></event>
<event name="OnButtonClick"></event>
<event name="OnChar"></event>
<event name="OnCharHook"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="current"></property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="disabled"></property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="focus"></property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Copy Text</property>
<property name="margins"></property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">copy_btn</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="position"></property>
<property name="pressed"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnAux1DClick"></event>
<event name="OnAux1Down"></event>
<event name="OnAux1Up"></event>
<event name="OnAux2DClick"></event>
<event name="OnAux2Down"></event>
<event name="OnAux2Up"></event>
<event name="OnButtonClick"></event>
<event name="OnChar"></event>
<event name="OnCharHook"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
</wxFormBuilder_Project>

View File

@ -0,0 +1,2 @@
import _tkinter
import tkSimpleDialog

View File

@ -0,0 +1,2 @@
from .fabrication_positions import generatePOS
generatePOS().register()

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,308 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="26"
width="26"
version="1.1"
viewBox="0 0 26 26"
id="svg2"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="fabricationPositions.svg"
inkscape:export-filename="/home/mau/.kicad_plugins/kicad-action-tools/FabricationPositions/fabricationPositions.png"
inkscape:export-xdpi="118.15385"
inkscape:export-ydpi="118.15385">
<metadata
id="metadata119">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1009"
id="namedview117"
showgrid="true"
inkscape:snap-to-guides="false"
inkscape:snap-grids="false"
inkscape:zoom="9.8333334"
inkscape:cx="-21.180697"
inkscape:cy="9.566445"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg2">
<inkscape:grid
type="xygrid"
id="grid3099"
empspacing="1"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<defs
id="defs4">
<filter
id="g"
color-interpolation-filters="sRGB">
<feGaussianBlur
stdDeviation="1.2065414"
id="feGaussianBlur7" />
</filter>
<filter
id="f"
color-interpolation-filters="sRGB">
<feGaussianBlur
stdDeviation="0.89955545"
id="feGaussianBlur10" />
</filter>
<linearGradient
id="h"
y2="94.103996"
gradientUnits="userSpaceOnUse"
x2="86.571999"
gradientTransform="matrix(0.41535,0,0,0.36675,-1.7202,-21.66944)"
y1="104"
x1="96">
<stop
stop-color="#888a85"
offset="0"
id="stop13" />
<stop
stop-color="#8c8e89"
offset=".0072"
id="stop15" />
<stop
stop-color="#abaca9"
offset=".0673"
id="stop17" />
<stop
stop-color="#c5c6c4"
offset=".1347"
id="stop19" />
<stop
stop-color="#dbdbda"
offset=".2115"
id="stop21" />
<stop
stop-color="#ebebeb"
offset=".3012"
id="stop23" />
<stop
stop-color="#f7f7f6"
offset=".4122"
id="stop25" />
<stop
stop-color="#fdfdfd"
offset=".5679"
id="stop27" />
<stop
stop-color="#fff"
offset="1"
id="stop29" />
</linearGradient>
<radialGradient
id="i"
gradientUnits="userSpaceOnUse"
cy="109.33"
cx="99.081001"
gradientTransform="matrix(0.40651,0,0,0.36008,-1.1546,-21.24267)"
r="139.56">
<stop
stop-color="#7a7d80"
offset="0"
id="stop32" />
<stop
stop-color="#c2c2c2"
offset=".12618"
id="stop34" />
<stop
stop-color="#fafafa"
offset=".23251"
id="stop36" />
<stop
stop-color="#fff"
offset=".27220"
id="stop38" />
<stop
stop-color="#fafafa"
offset=".53130"
id="stop40" />
<stop
stop-color="#ebecec"
offset=".84490"
id="stop42" />
<stop
stop-color="#e1e2e3"
offset="1"
id="stop44" />
</radialGradient>
<radialGradient
id="j"
gradientUnits="userSpaceOnUse"
cy="112.3"
cx="102"
gradientTransform="matrix(0.41535,0,0,0.36675,-1.7202,-21.66944)"
r="139.56">
<stop
stop-color="#00537d"
offset="0"
id="stop47" />
<stop
stop-color="#186389"
offset=".0151"
id="stop49" />
<stop
stop-color="#558ca8"
offset=".0558"
id="stop51" />
<stop
stop-color="#89afc3"
offset=".0964"
id="stop53" />
<stop
stop-color="#b3ccd8"
offset=".1357"
id="stop55" />
<stop
stop-color="#d4e2e9"
offset=".1737"
id="stop57" />
<stop
stop-color="#ecf2f5"
offset=".20990"
id="stop59" />
<stop
stop-color="#fafcfd"
offset=".24350"
id="stop61" />
<stop
stop-color="#fff"
offset=".27220"
id="stop63" />
</radialGradient>
</defs>
<g
transform="matrix(0,-2.848,2.44,0,-47.718,31.429)"
id="g73">
<rect
height="16"
width="16"
y="0"
x="0"
id="rect75"
style="fill-opacity:0" />
</g>
<g
id="g3114"
transform="matrix(0.62102756,0,0,0.47728223,30.575,21.588382)">
<rect
id="rect51"
x="10.679863"
y="-37.439487"
width="14.08869"
height="22.924355"
transform="matrix(0,-1,1,0,0,0)"
style="fill:#ffffff;stroke:#545454;stroke-width:0.97711289;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
id="path53"
d="m -37.947999,-20.191301 a 2.2240581,1.9589449 0 1 1 0.01376,3.917871"
inkscape:connector-curvature="0"
style="fill:none;stroke:#545454;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<g
id="g3983"
transform="translate(-38.934238,-31.273427)">
<rect
style="fill:#00c921;fill-opacity:1;stroke:#545454;stroke-width:0.93241322;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
transform="matrix(0,-1,1,0,0,0)"
height="4.0659709"
width="6.0590835"
y="4.5123401"
x="-8.5317764"
id="rect73" />
<rect
style="fill:#00c921;fill-opacity:1;stroke:#545454;stroke-width:0.93241322;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
transform="matrix(0,-1,1,0,0,0)"
height="4.0659709"
width="6.0590835"
y="11.451617"
x="-8.5076618"
id="rect73-5" />
<rect
style="fill:#00c921;fill-opacity:1;stroke:#545454;stroke-width:0.93241322;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
transform="matrix(0,-1,1,0,0,0)"
height="4.0659709"
width="6.0590835"
y="18.488895"
x="-8.5498009"
id="rect73-56" />
</g>
<g
id="g3983-1"
transform="translate(-38.880389,-15.182579)">
<rect
style="fill:#00c921;fill-opacity:1;stroke:#545454;stroke-width:0.93241322;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
transform="matrix(0,-1,1,0,0,0)"
height="4.0659709"
width="6.0590835"
y="4.5123401"
x="-8.5317764"
id="rect73-0" />
<rect
style="fill:#00c921;fill-opacity:1;stroke:#545454;stroke-width:0.93241322;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
transform="matrix(0,-1,1,0,0,0)"
height="4.0659709"
width="6.0590835"
y="11.451617"
x="-8.5076618"
id="rect73-5-4" />
<rect
style="fill:#00c921;fill-opacity:1;stroke:#545454;stroke-width:0.93241322;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
transform="matrix(0,-1,1,0,0,0)"
height="4.0659709"
width="6.0590835"
y="18.488895"
x="-8.5498009"
id="rect73-56-9" />
</g>
</g>
<path
style="opacity:0.9;fill:#1a1a1a;stroke:#1a1a1a;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none"
inkscape:connector-curvature="0"
d="M 23.586866,4.8640376 H 1.4326435"
id="path3429" />
<path
style="opacity:0.9;fill:#1a1a1a;stroke:#1a1a1a;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none"
inkscape:connector-curvature="0"
d="M 5.0093577,22.336199 V 2.0069966"
id="path3431" />
<path
style="stroke:#1a1a1a;stroke-width:0.69115704px;fill:#1a1a1a;opacity:0.9"
inkscape:connector-curvature="0"
d="M 24.335311,4.8146508 21.121519,2.0266169 v 5.7571524 z"
id="path3433" />
<path
style="stroke:#1a1a1a;stroke-width:0.69115704px;opacity:0.9"
inkscape:connector-curvature="0"
d="M 5.0744971,23.968314 7.8693327,20.762005 H 2.0978019 Z"
id="path3435" />
</svg>

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,302 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="26"
width="26"
version="1.1"
viewBox="0 0 26 26"
id="svg2"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="fabricationPositions.svg"
inkscape:export-filename="/home/mau/.kicad_plugins/kicad-action-tools/FabricationPositions/fabricationPositions.png"
inkscape:export-xdpi="118.15385"
inkscape:export-ydpi="118.15385">
<metadata
id="metadata119">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1009"
id="namedview117"
showgrid="true"
inkscape:snap-to-guides="false"
inkscape:snap-grids="false"
inkscape:zoom="30.961538"
inkscape:cx="12.967702"
inkscape:cy="13"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg2">
<inkscape:grid
type="xygrid"
id="grid3099"
empspacing="1"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<defs
id="defs4">
<filter
id="g"
color-interpolation-filters="sRGB">
<feGaussianBlur
stdDeviation="1.2065414"
id="feGaussianBlur7" />
</filter>
<filter
id="f"
color-interpolation-filters="sRGB">
<feGaussianBlur
stdDeviation="0.89955545"
id="feGaussianBlur10" />
</filter>
<linearGradient
id="h"
y2="94.103996"
gradientUnits="userSpaceOnUse"
x2="86.571999"
gradientTransform="matrix(0.41535,0,0,0.36675,-1.7202,-21.66944)"
y1="104"
x1="96">
<stop
stop-color="#888a85"
offset="0"
id="stop13" />
<stop
stop-color="#8c8e89"
offset=".0072"
id="stop15" />
<stop
stop-color="#abaca9"
offset=".0673"
id="stop17" />
<stop
stop-color="#c5c6c4"
offset=".1347"
id="stop19" />
<stop
stop-color="#dbdbda"
offset=".2115"
id="stop21" />
<stop
stop-color="#ebebeb"
offset=".3012"
id="stop23" />
<stop
stop-color="#f7f7f6"
offset=".4122"
id="stop25" />
<stop
stop-color="#fdfdfd"
offset=".5679"
id="stop27" />
<stop
stop-color="#fff"
offset="1"
id="stop29" />
</linearGradient>
<radialGradient
id="i"
gradientUnits="userSpaceOnUse"
cy="109.33"
cx="99.081001"
gradientTransform="matrix(0.40651,0,0,0.36008,-1.1546,-21.24267)"
r="139.56">
<stop
stop-color="#7a7d80"
offset="0"
id="stop32" />
<stop
stop-color="#c2c2c2"
offset=".12618"
id="stop34" />
<stop
stop-color="#fafafa"
offset=".23251"
id="stop36" />
<stop
stop-color="#fff"
offset=".27220"
id="stop38" />
<stop
stop-color="#fafafa"
offset=".53130"
id="stop40" />
<stop
stop-color="#ebecec"
offset=".84490"
id="stop42" />
<stop
stop-color="#e1e2e3"
offset="1"
id="stop44" />
</radialGradient>
<radialGradient
id="j"
gradientUnits="userSpaceOnUse"
cy="112.3"
cx="102"
gradientTransform="matrix(0.41535,0,0,0.36675,-1.7202,-21.66944)"
r="139.56">
<stop
stop-color="#00537d"
offset="0"
id="stop47" />
<stop
stop-color="#186389"
offset=".0151"
id="stop49" />
<stop
stop-color="#558ca8"
offset=".0558"
id="stop51" />
<stop
stop-color="#89afc3"
offset=".0964"
id="stop53" />
<stop
stop-color="#b3ccd8"
offset=".1357"
id="stop55" />
<stop
stop-color="#d4e2e9"
offset=".1737"
id="stop57" />
<stop
stop-color="#ecf2f5"
offset=".20990"
id="stop59" />
<stop
stop-color="#fafcfd"
offset=".24350"
id="stop61" />
<stop
stop-color="#fff"
offset=".27220"
id="stop63" />
</radialGradient>
</defs>
<g
transform="matrix(0,-2.848,2.44,0,-47.718,31.429)"
id="g73">
<rect
height="16"
width="16"
y="0"
x="0"
id="rect75"
style="fill-opacity:0" />
</g>
<g
id="g888"
transform="rotate(35,17.489961,12.636489)"
inkscape:export-xdpi="118.15385"
inkscape:export-ydpi="118.15385">
<rect
id="rect51"
x="18.048264"
y="-10.797076"
width="6.7242813"
height="14.236656"
transform="rotate(55)"
style="fill:#ffffff;stroke:#545454;stroke-width:0.5319708;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
id="path53"
d="M 21.994429,12.161141 A 0.93496958,1.3812014 55.000001 1 1 20.914881,10.634286"
inkscape:connector-curvature="0"
style="fill:none;stroke:#545454;stroke-width:0.54443127;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
id="rect73"
x="23.80514"
y="-8.92307"
width="2.8918929"
height="2.52508"
transform="rotate(55)"
style="fill:#da33e2;fill-opacity:1;stroke:#545454;stroke-width:0.50763494;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
id="rect73-5"
x="23.81665"
y="-4.6135879"
width="2.8918929"
height="2.52508"
transform="rotate(55)"
style="fill:#da33e2;fill-opacity:1;stroke:#545454;stroke-width:0.50763494;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
id="rect73-56"
x="23.796537"
y="-0.24324402"
width="2.8918929"
height="2.52508"
transform="rotate(55)"
style="fill:#da33e2;fill-opacity:1;stroke:#545454;stroke-width:0.50763494;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
id="rect73-0"
x="16.125263"
y="-8.8896284"
width="2.8918929"
height="2.52508"
transform="rotate(55)"
style="fill:#da33e2;fill-opacity:1;stroke:#545454;stroke-width:0.50763494;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
id="rect73-5-4"
x="16.136774"
y="-4.5801458"
width="2.8918929"
height="2.52508"
transform="rotate(55)"
style="fill:#da33e2;fill-opacity:1;stroke:#545454;stroke-width:0.50763494;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
id="rect73-56-9"
x="16.116661"
y="-0.20980217"
width="2.8918929"
height="2.52508"
transform="rotate(55)"
style="fill:#da33e2;fill-opacity:1;stroke:#545454;stroke-width:0.50763494;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<path
style="opacity:0.9;fill:#1a1a1a;stroke:#1a1a1a;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none"
inkscape:connector-curvature="0"
d="M 23.586866,4.8640376 H 1.4326435"
id="path3429" />
<path
style="opacity:0.9;fill:#1a1a1a;stroke:#1a1a1a;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none"
inkscape:connector-curvature="0"
d="M 5.0093577,22.336199 V 2.0069966"
id="path3431" />
<path
style="stroke:#1a1a1a;stroke-width:0.69115704px;fill:#1a1a1a;opacity:0.9"
inkscape:connector-curvature="0"
d="M 24.335311,4.8146508 21.121519,2.0266169 v 5.7571524 z"
id="path3433" />
<path
style="stroke:#1a1a1a;stroke-width:0.69115704px;opacity:0.9"
inkscape:connector-curvature="0"
d="M 5.0744971,23.968314 7.8693327,20.762005 H 2.0978019 Z"
id="path3435" />
</svg>

After

Width:  |  Height:  |  Size: 8.7 KiB

View File

@ -2,13 +2,13 @@
#
# A script to generate POS file for kicad_pcb
# requirements: KiCAD pcbnew >= 4.0
# release "1.0.8"
# release "1.0.9"
# copyright Maurice easyw
#
# main script from https://forum.kicad.info/t/pcba-wants-all-parts-in-the-pos-file-not-just-smd/10045/6
#
___version___="1.0.8"
___version___="1.2.0"
#wx.LogMessage("My message")
#mm_ius = 1000000.0
@ -262,9 +262,12 @@ class generatePOS( pcbnew.ActionPlugin ):
self.description should be a comprehensive description
of the plugin
"""
self.name = "Generate POS output"
self.name = "Generate Fabrication POS output\nversion "+___version___
self.category = "Fabrication Output"
self.description = "Generate POS output for SMD, THD, Virtual"
#self.SetIcon(PyEmbeddedImage(getPos_ico_b64_data).GetIcon())
self.icon_file_name = os.path.join(os.path.dirname(__file__), "./fabricationPositions.png")
self.show_toolbar_button = True
def Run( self ):
@ -290,7 +293,7 @@ class generatePOS( pcbnew.ActionPlugin ):
#, wx.ICON_INFORMATION) #, title="Annular Check", style=wx.DEFAULT_FRAME_STYLE, wx.ICON_INFORMATION)
#
self.SetIcon(PyEmbeddedImage(round_ico_b64_data).GetIcon())
self.SetIcon(PyEmbeddedImage(getPos_ico_b64_data).GetIcon())
#wx.IconFromBitmap(wx.Bitmap("icon.ico", wx.BITMAP_TYPE_ANY)))
self.panel = wx.Panel(self)
self.title = wx.StaticText(self.panel, label="Generate POS debug:")
@ -375,7 +378,7 @@ class generatePOS( pcbnew.ActionPlugin ):
generatePOS().register()
# "b64_data" is a variable containing your base64 encoded jpeg
round_ico_b64_data =\
getPos_ico_b64_data =\
"""
iVBORw0KGgoAAAANSUhEUgAAAEAAAAA/CAYAAABQHc7KAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAdDwAAHQ8Bjlx1kwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3Nj
YXBlLm9yZ5vuPBoAAAw+SURBVGiB7Zt7cFTVHcc/d+9uSAIhklgIpiQ0tjxSkCKIQ1CpCO3wUKCW0cF0Bqf/VFTG6tROS/8QZuxYwZGHgqD4SjNToFFDjJjGB4LkyUPk

Binary file not shown.

After

Width:  |  Height:  |  Size: 831 B

View File

@ -0,0 +1,75 @@
# -*- 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 Move2LayerDlg
###########################################################################
class Move2LayerDlg ( wx.Dialog ):
def __init__( self, parent ):
wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = u"Move to Layer", pos = wx.DefaultPosition, size = wx.Size( 390,180 ), 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_comment = wx.StaticText( self, wx.ID_ANY, u"Select Objects to Move to Layer\n", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_comment.Wrap( -1 )
bSizer3.Add( self.m_comment, 0, wx.ALL|wx.EXPAND, 5 )
bSizer31 = wx.BoxSizer( wx.HORIZONTAL )
self.m_staticTextLayer = wx.StaticText( self, wx.ID_ANY, u"Layer", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticTextLayer.Wrap( -1 )
bSizer31.Add( self.m_staticTextLayer, 1, wx.ALL|wx.EXPAND, 5 )
m_comboBoxLayerChoices = []
self.m_comboBoxLayer = wx.ComboBox( self, wx.ID_ANY, u"Combo!", wx.DefaultPosition, wx.DefaultSize, m_comboBoxLayerChoices, 0 )
bSizer31.Add( self.m_comboBoxLayer, 0, wx.ALL, 5 )
bSizer3.Add( bSizer31, 0, 0, 5 )
self.m_staticline1 = wx.StaticLine( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL )
bSizer3.Add( self.m_staticline1, 0, wx.EXPAND |wx.ALL, 5 )
bSizer1 = wx.BoxSizer( wx.HORIZONTAL )
self.m_staticText101 = wx.StaticText( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText101.Wrap( -1 )
bSizer1.Add( self.m_staticText101, 1, wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 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.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
self.m_buttonCancel = wx.Button( self, wx.ID_CANCEL, u"Cancel", wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer1.Add( self.m_buttonCancel, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
bSizer3.Add( bSizer1, 0, wx.ALIGN_RIGHT|wx.EXPAND, 5 )
self.SetSizer( bSizer3 )
self.Layout()
self.Centre( wx.BOTH )
def __del__( self ):
pass

2
MoveToLayer/__init__.py Normal file
View File

@ -0,0 +1,2 @@
from .move_to_layer import move_to_draw_layer
move_to_draw_layer().register()

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
MoveToLayer/move2layer.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

200
MoveToLayer/move2layer.svg Normal file
View File

@ -0,0 +1,200 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="32"
width="32"
version="1.1"
id="svg2"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="move2layer.svg"
inkscape:export-filename="/home/mau/.kicad_plugins/kicad-action-tools/MoveToLayer/move2layer.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<metadata
id="metadata40">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1009"
id="namedview38"
showgrid="true"
inkscape:snap-to-guides="false"
inkscape:snap-grids="true"
inkscape:zoom="14.513221"
inkscape:cx="14.203616"
inkscape:cy="9.1263305"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg2"
inkscape:snap-bbox="true"
inkscape:object-nodes="true">
<inkscape:grid
type="xygrid"
id="grid3017"
empspacing="2"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
spacingx="0.53333333"
spacingy="0.53333333"
originx="0"
originy="0" />
</sodipodi:namedview>
<defs
id="defs4">
<filter
id="c"
height="1.3651"
width="1.2097"
y="-0.18257"
x="-0.10484"
style="color-interpolation-filters:sRGB">
<feGaussianBlur
stdDeviation="1.5978799"
id="feGaussianBlur7" />
</filter>
<filter
id="d"
height="1.4696"
width="1.4809999"
y="-0.23481999"
x="-0.24049"
style="color-interpolation-filters:sRGB">
<feGaussianBlur
stdDeviation="1.5978799"
id="feGaussianBlur10" />
</filter>
<linearGradient
id="c-1"
y2="6.7758002"
gradientUnits="userSpaceOnUse"
x2="20.631001"
gradientTransform="matrix(0.98748,0,0,1.0024,-5.1519366,34.914162)"
y1="42.254002"
x1="19.648001">
<stop
stop-color="#b6b6b6"
offset="0"
id="stop7" />
<stop
stop-color="#f2f2f2"
offset=".5"
id="stop9" />
<stop
stop-color="#fafafa"
offset=".67613"
id="stop11" />
<stop
stop-color="#d8d8d8"
offset=".84052"
id="stop13" />
<stop
stop-color="#f2f2f2"
offset=".875"
id="stop15" />
<stop
stop-color="#dbdbdb"
offset="1"
id="stop17" />
</linearGradient>
<linearGradient
id="d-9"
y2="-4.3003001"
gradientUnits="userSpaceOnUse"
x2="25.291"
gradientTransform="matrix(0.99518,0,0,0.9948,21.199415,27.899328)"
y1="-3.6324"
x1="50.153">
<stop
stop-color="#fff"
offset="0"
id="stop20" />
<stop
offset="1"
id="stop22" />
</linearGradient>
</defs>
<g
id="g41"
transform="translate(2.2628649,-1.9423491)">
<g
id="g16"
transform="matrix(1.6382539,0,0,1.5572263,-0.25896459,4.6540173)">
<rect
style="fill-opacity:0;stroke-width:1.06666672"
id="rect18"
x="0"
y="0"
width="17.066668"
height="17.066668" />
</g>
<path
style="fill:#e6e6e6;fill-opacity:1;stroke:#808080;stroke-width:1.06666672;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 11.2,21.866666 h 16 L 16.533333,30.399999 H 0.53333333 Z"
id="path3831"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<path
sodipodi:nodetypes="ccccc"
inkscape:connector-curvature="0"
id="rect3828"
d="m 11.2,16.533333 h 16 L 16.533333,25.066666 H 0.53333333 Z"
style="fill:#00a000;fill-opacity:1;stroke:#4d4d4d;stroke-width:1.06666672;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:nodetypes="ccccc"
inkscape:connector-curvature="0"
id="path3052"
d="m 11.2,11.2 h 16 L 16.533333,19.733333 H 0.53333333 Z"
style="fill:#e6e6e6;fill-opacity:1;stroke:#808080;stroke-width:1.06666672;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:#e6e6e6;fill-opacity:1;stroke:#808080;stroke-width:1.06666672;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 11.2,5.8666664 h 16 L 16.533333,14.399999 H 0.53333333 Z"
id="path3054"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<g
transform="matrix(0.6439659,0,0,0.6439659,-26.578383,0.69750771)"
id="g4203">
<path
style="color:#000000;fill:#5599ff;fill-opacity:1;stroke:#002255;stroke-width:0.54167002;stroke-opacity:1"
d="m 42.922488,15.034538 8.940805,10.24623 8.895846,-10.24623 H 56.496196 V 6.8639878 h -9.238181 v 8.1705502 h -4.335581 z"
id="path18-6"
inkscape:connector-curvature="0" />
<path
style="color:#000000;opacity:0.35393001;fill:#5599ff;fill-opacity:1;stroke:#002255;stroke-opacity:1"
d="m 47.531016,7.1313561 8.662632,-0.043551 -0.01306,0.9392646 C 53.457625,10.189864 50.558625,10.229171 47.487249,7.979689 L 47.5308,7.1313561 Z"
id="path20-2"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccc" />
<path
style="color:#000000;opacity:0.35400008;fill:#5599ff;fill-opacity:1;stroke:#002255;stroke-width:0.54167002;stroke-opacity:1"
d="M 44.082258,15.567 51.874722,24.513222 59.566436,15.567 H 55.916664 V 7.4056578 H 47.80353 V 15.567 h -3.720731 z"
id="path22-9"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -24,7 +24,8 @@ import pcbnew
from pcbnew import *
import base64
from wx.lib.embeddedimage import PyEmbeddedImage
___version___="1.1.3"
import os
___version___="1.2.0"
class move_to_draw_layer( pcbnew.ActionPlugin ):
@ -46,9 +47,12 @@ class move_to_draw_layer( pcbnew.ActionPlugin ):
self.description should be a comprehensive description
of the plugin
"""
self.name = "Move Selected drawings to chosen Layer"
self.category = "Modify Drawing PCB"
import os
self.name = "Move Selected drawings to chosen Layer\nversion "+___version___
self.category = "Modify PCB"
self.description = "Move Selected drawings to chosen Layer on an existing PCB"
self.icon_file_name = os.path.join(os.path.dirname(__file__), "./move2layer.png")
self.show_toolbar_button = True
def Run( self ):
found_selected=False
@ -69,8 +73,6 @@ class move_to_draw_layer( pcbnew.ActionPlugin ):
'B_Fab' : pcbnew.B_Fab,
'F_SilkS' : pcbnew.F_SilkS,
'B_SilkS' : pcbnew.B_SilkS,
'F_Mask' : pcbnew.F_Mask,
'B_Mask' : pcbnew.B_Mask,
}[x]
class displayDialog(wx.Dialog):
@ -98,8 +100,7 @@ class move_to_draw_layer( pcbnew.ActionPlugin ):
self.ct = 0
self.layerSelection = "Edge_Cuts"
layerList = ["Edge_Cuts", "Eco1_User", "Eco2_User", "Dwgs_User", "Cmts_User",\
"Margin", "F_CrtYd", "B_CrtYd", "F_Fab", "B_Fab", "F_SilkS", "B_SilkS", "F_Mask", "B_Mask"]
layerList = ["Edge_Cuts", "Eco1_User", "Eco2_User", "Dwgs_User", "Cmts_User", "Margin", "F_CrtYd", "B_CrtYd", "F_Fab", "B_Fab", "F_SilkS", "B_SilkS"]
self.combo = wx.ComboBox(self.panel, choices=layerList)
self.combo.SetSelection(0)
@ -145,7 +146,7 @@ class move_to_draw_layer( pcbnew.ActionPlugin ):
def OnClose(self,e):
#wx.LogMessage("c")
e.Skip()
self.Destroy() #Close()
self.Close()
#self.result.SetLabel(msg)
# Set event handlers
#self.button.Bind(wx.EVT_BUTTON, self.OnButton)
@ -180,6 +181,7 @@ class move_to_draw_layer( pcbnew.ActionPlugin ):
frame.Center()
#frame.setMsg(LogMsg)
frame.ShowModal()
#dlg.Destroy()
frame.Destroy()
#dlg=wx.MessageBox( 'Changing Layer for Selected?', 'Confirm', wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION )
@ -189,6 +191,12 @@ class move_to_draw_layer( pcbnew.ActionPlugin ):
#wx.LogMessage(str(board.IsModified()))
#board.SetModified()
#wx.LogMessage(str(board.IsModified()))
#try:
# board_drawings=board.GetDrawings()
#except:
# board_drawings=board.DrawingsList()
#
#for drw in board_drawings:
for drw in board.GetDrawings():
if drw.IsSelected():
drw.SetLayer(switch(frame.layerSelection))
@ -205,7 +213,8 @@ class move_to_draw_layer( pcbnew.ActionPlugin ):
move_to_draw_layer().register()
#move_to_draw_layer().register()
# "b64_data" is a variable containing your base64 encoded jpeg

View File

@ -0,0 +1,288 @@
# move_to_edge_cuts.py
#
# Copyright (C) 2017 KiCad Developers, see CHANGELOG.TXT for contributors.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
#
#
import wx
import pcbnew
from pcbnew import *
import base64
from wx.lib.embeddedimage import PyEmbeddedImage
import os
___version___="1.2.1"
from . import Move2LayerDlg
# Python plugin stuff
class Move2Layer_Dlg(Move2LayerDlg.Move2LayerDlg):
# 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(Move2Layer_Dlg, self).SetSizeHints(sz1, sz2)
#def onApplyClick(self, event):
# return self.EndModal(wx.ID_OK)
#
#def onCancelClick(self, event):
# return self.EndModal(wx.ID_CANCEL)
def __init__(self, parent):
import wx
Move2LayerDlg.Move2LayerDlg.__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" )
#
class move_to_draw_layer( pcbnew.ActionPlugin ):
"""
A script to Move Selected Drawing(s) to chosen new Layer (available only in GAL)
How to use:
- move to GAL
- select some draw objects
- call the plugin
- select the new layer
- selected draw objects will be moved to new layer
"""
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
"""
import os
self.name = "Move Selected drawings to chosen Layer\nversion "+___version___
self.category = "Modify PCB"
self.description = "Move Selected drawings to chosen Layer on an existing PCB"
self.icon_file_name = os.path.join(os.path.dirname(__file__), "./move2layer.png")
self.show_toolbar_button = True
def Run( self ):
found_selected=False
#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
def switch(x):
return {
'Edge_Cuts': pcbnew.Edge_Cuts,
'Eco1_User': pcbnew.Eco1_User,
'Eco2_User': pcbnew.Eco2_User,
'Dwgs_User': pcbnew.Dwgs_User,
'Cmts_User': pcbnew.Cmts_User,
'Margin' : pcbnew.Margin,
'F_CrtYd' : pcbnew.F_CrtYd,
'B_CrtYd' : pcbnew.B_CrtYd,
'F_Fab' : pcbnew.F_Fab,
'B_Fab' : pcbnew.B_Fab,
'F_SilkS' : pcbnew.F_SilkS,
'B_SilkS' : pcbnew.B_SilkS,
}[x]
# class displayDialog(wx.Dialog):
# """
# The default frame
# http://stackoverflow.com/questions/3566603/how-do-i-make-wx-textctrl-multi-line-text-update-smoothly
# """
#
# #----------------------------------------------------------------------
# #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="Move to Layer")#
# #, 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(move_to_layer_ico_b64_data).GetIcon())
# #wx.IconFromBitmap(wx.Bitmap("icon.ico", wx.BITMAP_TYPE_ANY)))
# self.panel = wx.Panel(self)
#
# self.ct = 0
# self.layerSelection = "Edge_Cuts"
# layerList = ["Edge_Cuts", "Eco1_User", "Eco2_User", "Dwgs_User", "Cmts_User", "Margin", "F_CrtYd", "B_CrtYd", "F_Fab", "B_Fab", "F_SilkS", "B_SilkS"]
# self.combo = wx.ComboBox(self.panel, choices=layerList)
# self.combo.SetSelection(0)
#
# self.combo.Bind(wx.EVT_COMBOBOX, self.onCombo)
#
# self.title = wx.StaticText(self.panel, label="Move to Layer:")
# #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 = (300, 400), style = wx.TE_MULTILINE|wx.TE_READONLY)
#
#
# # 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.button = wx.Button(self.panel, label="OK")
# self.sizer.Add(self.button, (2, 0), (1, 2), flag=wx.EXPAND)
# #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.combo, (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.button = wx.Button(self.panel, label="Close")
# self.button.Bind(wx.EVT_BUTTON, self.OnClose)
# self.Bind(wx.EVT_CLOSE,self.OnClose)
#
# #----------------------------------------------------------------------
# def OnClose(self,e):
# #wx.LogMessage("c")
# e.Skip()
# self.Close()
# #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 onCombo(self, event):
# """
# """
# self.layerSelection = self.combo.GetValue()
#
# #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)
board = pcbnew.GetBoard()
#wx.MessageDialog(None, 'This is a message box.', 'Test', wx.OK | wx.ICON_INFORMATION).ShowModal()
fileName = GetBoard().GetFileName()
if 0: #len(fileName) == 0:
wx.LogMessage("A board needs to be saved/loaded\nto run the plugin!")
else:
#from https://github.com/MitjaNemec/Kicad_action_plugins
#hack wxFormBuilder py2/py3
_pcbnew_frame = [x for x in wx.GetTopLevelWindows() if x.GetTitle().lower().startswith('pcbnew')][0]
aParameters = Move2Layer_Dlg(_pcbnew_frame)
aParameters.Show()
modal_result = aParameters.ShowModal()
if modal_result == wx.ID_OK:
MoveToLayer(pcb, Layer)
else:
None # Cancel
LogMsg=''
msg="'move to layer tool'\n"
msg+="version = "+___version___
#wx.LogMessage(LogMsg)
# frame = displayDialog(None)
# #frame = wx.Frame(None)
# frame.Center()
# #frame.setMsg(LogMsg)
# frame.ShowModal()
# #dlg.Destroy()
# frame.Destroy()
#dlg=wx.MessageBox( 'Changing Layer for Selected?', 'Confirm', wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION )
#dlg=wx.MessageBox( 'Changing Layer for Selected '+frame.layerSelection+ '?', 'Confirm', wx.YES_NO | wx.NO_DEFAULT | wx.ICON_WARNING )
#if dlg == wx.YES:
# #wx.LogMessage("YES")
# #wx.LogMessage(str(board.IsModified()))
# #board.SetModified()
# #wx.LogMessage(str(board.IsModified()))
# #try:
# # board_drawings=board.GetDrawings()
# #except:
# # board_drawings=board.DrawingsList()
# #
# #for drw in board_drawings:
# for drw in board.GetDrawings():
# if drw.IsSelected():
# drw.SetLayer(switch(frame.layerSelection))
# found_selected=True
#
# if found_selected!=True:
# LogMsg="select lines to be moved to new layer\n"
# LogMsg+="use GAL for selecting lines"
# wx.LogMessage(LogMsg)
# else:
# pcbnew.Refresh()
# LogMsg="selected drawings moved to "+frame.layerSelection+" layer"
#move_to_draw_layer().register()
# pcbnew.F_Cu
# pcbnew.In1_Cu
# pcbnew.In2_Cu
#..
# pcbnew.In30_Cu
# pcbnew.B_Cu
# pcbnew.B_Adhes
# pcbnew.F_Adhes
# pcbnew.B_Paste
# pcbnew.F_Paste
# pcbnew.B_SilkS
# pcbnew.F_SilkS
# pcbnew.B_Mask
# pcbnew.F_Mask
# pcbnew.Dwgs_User
# pcbnew.Cmts_User
# pcbnew.Eco1_User
# pcbnew.Eco2_User
# pcbnew.Edge_Cuts
# pcbnew.Margin
# pcbnew.B_CrtYd
# pcbnew.F_CrtYd
# pcbnew.B_Fab
# pcbnew.F_Fab

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,536 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="15" />
<object class="Project" expanded="1">
<property name="class_decoration"></property>
<property name="code_generation">Python</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file">Move2LayerDlg</property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="indent_with_spaces"></property>
<property name="internationalize">0</property>
<property name="name">Move2LayerDlg</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="relative_path">1</property>
<property name="skip_lua_events">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="ui_table">UI</property>
<property name="use_enum">0</property>
<property name="use_microsoft_bom">0</property>
<object class="Dialog" expanded="1">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
<property name="center">wxBOTH</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="enabled">1</property>
<property name="event_handler">impl_virtual</property>
<property name="extra_style"></property>
<property name="fg"></property>
<property name="font"></property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maximum_size"></property>
<property name="minimum_size"></property>
<property name="name">Move2LayerDlg</property>
<property name="pos"></property>
<property name="size">390,180</property>
<property name="style">wxCAPTION|wxCLOSE_BOX|wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
<property name="subclass"></property>
<property name="title">Move to Layer</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer3</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Select Objects to Move to Layer&#x0A;</property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_comment</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag"></property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer31</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Layer</property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_staticTextLayer</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxComboBox" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="choices"></property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_comboBoxLayer</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="selection">-1</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value">Combo!</property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND | wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticLine" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_staticline1</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxLI_HORIZONTAL</property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALIGN_RIGHT|wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer1</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
<property name="proportion">1</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label"></property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_staticText101</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">0</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="current"></property>
<property name="default">1</property>
<property name="default_pane">0</property>
<property name="disabled"></property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="focus"></property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_OK</property>
<property name="label">Apply</property>
<property name="margins"></property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_buttonOK</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="position"></property>
<property name="pressed"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="current"></property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="disabled"></property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="focus"></property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_CANCEL</property>
<property name="label">Cancel</property>
<property name="margins"></property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_buttonCancel</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="position"></property>
<property name="pressed"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
</wxFormBuilder_Project>

View File

@ -1,15 +0,0 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# licence GPL 2
# copyright easyw
## todo:
# fix extra directory creation
# add force override as option check
# add OK-Cancel buttons
# add popen to elevate process
print "Work In Progress"