Browse Source

ADDED: field options for Update PCB from Schematic

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21021
pull/18/head
Jeff Young 4 months ago
parent
commit
4a21da6b27
  1. 3
      include/board_item.h
  2. 2
      pcbnew/dialogs/dialog_update_pcb.cpp
  3. 63
      pcbnew/dialogs/dialog_update_pcb_base.cpp
  4. 280
      pcbnew/dialogs/dialog_update_pcb_base.fbp
  5. 8
      pcbnew/dialogs/dialog_update_pcb_base.h
  6. 36
      pcbnew/drc/drc_test_provider_library_parity.cpp
  7. 112
      pcbnew/netlist_reader/board_netlist_updater.cpp
  8. 6
      pcbnew/netlist_reader/board_netlist_updater.h
  9. 52
      pcbnew/pcb_edit_frame.cpp

3
include/board_item.h

@ -431,7 +431,8 @@ public:
enum COMPARE_FLAGS : int
{
DRC = 0x01
DRC = 0x01,
INSTANCE_TO_INSTANCE = 0x02
};
struct ptr_cmp

2
pcbnew/dialogs/dialog_update_pcb.cpp

@ -124,6 +124,8 @@ void DIALOG_UPDATE_PCB::PerformUpdate( bool aDryRun )
updater.SetReplaceFootprints( m_cbUpdateFootprints->GetValue() );
updater.SetTransferGroups( m_cbTransferGroups->GetValue() );
updater.SetOverrideLocks( m_cbOverrideLocks->GetValue() );
updater.SetUpdateFields( m_cbUpdateFields->GetValue() );
updater.SetRemoveExtraFields( m_cbRemoveExtraFields->GetValue() );
updater.UpdateNetlist( *m_netlist );
m_messagePanel->Flush( true );

63
pcbnew/dialogs/dialog_update_pcb_base.cpp

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf-dirty)
// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -21,33 +21,58 @@ DIALOG_UPDATE_PCB_BASE::DIALOG_UPDATE_PCB_BASE( wxWindow* parent, wxWindowID id,
wxBoxSizer* bUpperSizer;
bUpperSizer = new wxBoxSizer( wxVERTICAL );
wxStaticBoxSizer* sbSizer1;
sbSizer1 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Options") ), wxVERTICAL );
wxStaticBoxSizer* sbOptions;
sbOptions = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Options") ), wxVERTICAL );
m_cbRelinkFootprints = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Re-link footprints to schematic symbols based on their reference designators"), wxDefaultPosition, wxDefaultSize, 0 );
m_cbRelinkFootprints = new wxCheckBox( sbOptions->GetStaticBox(), wxID_ANY, _("Re-link footprints to schematic symbols based on their reference designators"), wxDefaultPosition, wxDefaultSize, 0 );
m_cbRelinkFootprints->SetToolTip( _("Normally footprints are linked to their symbols via their Unique IDs. Select this option only if you want to reset the footprint linkages based on their reference designators.") );
sbSizer1->Add( m_cbRelinkFootprints, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
sbOptions->Add( m_cbRelinkFootprints, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_cbDeleteExtraFootprints = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Delete footprints with no symbols"), wxDefaultPosition, wxDefaultSize, 0 );
m_cbDeleteExtraFootprints->SetToolTip( _("Remove from the board unlocked footprints which are not linked to a schematic symbol.") );
m_cbTransferGroups = new wxCheckBox( sbOptions->GetStaticBox(), wxID_ANY, _("Group footprints based on symbol group"), wxDefaultPosition, wxDefaultSize, 0 );
sbOptions->Add( m_cbTransferGroups, 0, wxBOTTOM|wxLEFT|wxRIGHT, 5 );
bUpperSizer->Add( sbOptions, 1, wxEXPAND|wxALL, 5 );
sbSizer1->Add( m_cbDeleteExtraFootprints, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_cbUpdateFootprints = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Replace footprints with those specified in the schematic"), wxDefaultPosition, wxDefaultSize, 0 );
bUpperSizer->Add( 0, 5, 0, wxEXPAND, 5 );
wxStaticBoxSizer* sbFootprints;
sbFootprints = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Update Footprints") ), wxVERTICAL );
m_cbUpdateFootprints = new wxCheckBox( sbFootprints->GetStaticBox(), wxID_ANY, _("Replace footprints with those specified by symbols"), wxDefaultPosition, wxDefaultSize, 0 );
m_cbUpdateFootprints->SetValue(true);
m_cbUpdateFootprints->SetToolTip( _("Normally footprints on the board should be changed to match footprint assignment changes made in the schematic. Uncheck this only if you don't want to change existing footprints on the board.") );
sbSizer1->Add( m_cbUpdateFootprints, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
sbFootprints->Add( m_cbUpdateFootprints, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_cbDeleteExtraFootprints = new wxCheckBox( sbFootprints->GetStaticBox(), wxID_ANY, _("Delete footprints with no symbols"), wxDefaultPosition, wxDefaultSize, 0 );
m_cbDeleteExtraFootprints->SetToolTip( _("Remove from the board unlocked footprints which are not linked to a schematic symbol.") );
sbFootprints->Add( m_cbDeleteExtraFootprints, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_cbOverrideLocks = new wxCheckBox( sbFootprints->GetStaticBox(), wxID_ANY, _("Override locks"), wxDefaultPosition, wxDefaultSize, 0 );
sbFootprints->Add( m_cbOverrideLocks, 0, wxBOTTOM|wxLEFT|wxRIGHT, 5 );
bUpperSizer->Add( sbFootprints, 0, wxEXPAND|wxALL, 5 );
m_cbTransferGroups = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Group footprints based on symbol group"), wxDefaultPosition, wxDefaultSize, 0 );
sbSizer1->Add( m_cbTransferGroups, 0, wxBOTTOM|wxLEFT|wxRIGHT, 5 );
m_cbOverrideLocks = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Delete/replace footprints even if locked"), wxDefaultPosition, wxDefaultSize, 0 );
sbSizer1->Add( m_cbOverrideLocks, 0, wxBOTTOM|wxLEFT|wxRIGHT, 5 );
bUpperSizer->Add( 0, 5, 0, wxEXPAND, 5 );
wxStaticBoxSizer* sbFields;
sbFields = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Update Fields") ), wxVERTICAL );
bUpperSizer->Add( sbSizer1, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
m_cbUpdateFields = new wxCheckBox( sbFields->GetStaticBox(), wxID_ANY, _("Update footprint fields from symbols"), wxDefaultPosition, wxDefaultSize, 0 );
m_cbUpdateFields->SetValue(true);
sbFields->Add( m_cbUpdateFields, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_cbRemoveExtraFields = new wxCheckBox( sbFields->GetStaticBox(), wxID_ANY, _("Remove footprint fields not found in symbols"), wxDefaultPosition, wxDefaultSize, 0 );
sbFields->Add( m_cbRemoveExtraFields, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
bUpperSizer->Add( sbFields, 0, wxEXPAND|wxALL, 5 );
bMainSizer->Add( bUpperSizer, 0, wxALL|wxEXPAND, 5 );
@ -78,9 +103,9 @@ DIALOG_UPDATE_PCB_BASE::DIALOG_UPDATE_PCB_BASE( wxWindow* parent, wxWindowID id,
// Connect Events
m_cbRelinkFootprints->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbDeleteExtraFootprints->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbUpdateFootprints->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbTransferGroups->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbUpdateFootprints->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbDeleteExtraFootprints->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbOverrideLocks->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_sdbSizer1OK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnUpdateClick ), NULL, this );
}
@ -89,9 +114,9 @@ DIALOG_UPDATE_PCB_BASE::~DIALOG_UPDATE_PCB_BASE()
{
// Disconnect Events
m_cbRelinkFootprints->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbDeleteExtraFootprints->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbUpdateFootprints->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbTransferGroups->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbUpdateFootprints->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbDeleteExtraFootprints->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbOverrideLocks->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_sdbSizer1OK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnUpdateClick ), NULL, this );

280
pcbnew/dialogs/dialog_update_pcb_base.fbp

@ -1,34 +1,36 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="17"/>
<FileVersion major="1" minor="18"/>
<object class="Project" expanded="true">
<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="cpp_class_decoration"></property>
<property name="cpp_disconnect_events">1</property>
<property name="cpp_event_generation">connect</property>
<property name="cpp_help_provider">none</property>
<property name="cpp_namespace"></property>
<property name="cpp_precompiled_header"></property>
<property name="cpp_use_array_enum">0</property>
<property name="cpp_use_enum">1</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file">dialog_update_pcb_base</property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="image_path_wrapper_function_name"></property>
<property name="indent_with_spaces"></property>
<property name="internationalize">1</property>
<property name="lua_skip_events">1</property>
<property name="lua_ui_table">UI</property>
<property name="name">dialog_update_pcb_base</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="php_disconnect_events">0</property>
<property name="php_disconnect_mode">source_name</property>
<property name="php_skip_events">1</property>
<property name="python_disconnect_events">0</property>
<property name="python_disconnect_mode">source_name</property>
<property name="python_image_path_wrapper_function_name"></property>
<property name="python_indent_with_spaces"></property>
<property name="python_skip_events">1</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_array_enum">0</property>
<property name="use_enum">1</property>
<property name="use_microsoft_bom">0</property>
<property name="use_native_eol">0</property>
<object class="Dialog" expanded="true">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
@ -73,13 +75,13 @@
<property name="permission">none</property>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxTOP|wxRIGHT|wxLEFT</property>
<property name="flag">wxEXPAND|wxALL</property>
<property name="proportion">1</property>
<object class="wxStaticBoxSizer" expanded="true">
<property name="id">wxID_ANY</property>
<property name="label">Options</property>
<property name="minimum_size"></property>
<property name="name">sbSizer1</property>
<property name="name">sbOptions</property>
<property name="orient">wxVERTICAL</property>
<property name="parent">1</property>
<property name="permission">none</property>
@ -92,10 +94,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -151,17 +153,17 @@
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
<property name="flag">wxBOTTOM|wxLEFT|wxRIGHT</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="true">
<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_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -183,7 +185,7 @@
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Delete footprints with no symbols</property>
<property name="label">Group footprints based on symbol group</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
@ -191,7 +193,7 @@
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_cbDeleteExtraFootprints</property>
<property name="name">m_cbTransferGroups</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
@ -202,9 +204,9 @@
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip">Remove from the board unlocked footprints which are not linked to a schematic symbol.</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
@ -215,6 +217,30 @@
<event name="OnCheckBox">OnOptionChanged</event>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">0</property>
<object class="spacer" expanded="true">
<property name="height">5</property>
<property name="permission">protected</property>
<property name="width">0</property>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticBoxSizer" expanded="true">
<property name="id">wxID_ANY</property>
<property name="label">Update Footprints</property>
<property name="minimum_size"></property>
<property name="name">sbFootprints</property>
<property name="orient">wxVERTICAL</property>
<property name="parent">1</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
@ -224,10 +250,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -249,7 +275,7 @@
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Replace footprints with those specified in the schematic</property>
<property name="label">Replace footprints with those specified by symbols</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
@ -283,17 +309,17 @@
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxLEFT|wxRIGHT</property>
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="true">
<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_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -315,7 +341,7 @@
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Group footprints based on symbol group</property>
<property name="label">Delete footprints with no symbols</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
@ -323,7 +349,7 @@
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_cbTransferGroups</property>
<property name="name">m_cbDeleteExtraFootprints</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
@ -334,9 +360,9 @@
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="tooltip">Remove from the board unlocked footprints which are not linked to a schematic symbol.</property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
@ -356,10 +382,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -381,7 +407,7 @@
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Delete/replace footprints even if locked</property>
<property name="label">Override locks</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
@ -415,6 +441,160 @@
</object>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">0</property>
<object class="spacer" expanded="true">
<property name="height">5</property>
<property name="permission">protected</property>
<property name="width">0</property>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticBoxSizer" expanded="true">
<property name="id">wxID_ANY</property>
<property name="label">Update Fields</property>
<property name="minimum_size"></property>
<property name="name">sbFields</property>
<property name="orient">wxVERTICAL</property>
<property name="parent">1</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</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="checked">1</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="drag_accept_files">0</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">Update footprint fields from symbols</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_cbUpdateFields</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="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</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="checked">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="drag_accept_files">0</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">Remove footprint fields not found in symbols</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_cbRemoveExtraFields</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="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
</object>
</object>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="true">
@ -435,10 +615,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>

8
pcbnew/dialogs/dialog_update_pcb_base.h

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf-dirty)
// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -36,10 +36,12 @@ class DIALOG_UPDATE_PCB_BASE : public DIALOG_SHIM
protected:
wxCheckBox* m_cbRelinkFootprints;
wxCheckBox* m_cbDeleteExtraFootprints;
wxCheckBox* m_cbUpdateFootprints;
wxCheckBox* m_cbTransferGroups;
wxCheckBox* m_cbUpdateFootprints;
wxCheckBox* m_cbDeleteExtraFootprints;
wxCheckBox* m_cbOverrideLocks;
wxCheckBox* m_cbUpdateFields;
wxCheckBox* m_cbRemoveExtraFields;
WX_HTML_REPORT_PANEL* m_messagePanel;
wxStdDialogButtonSizer* m_sdbSizer1;
wxButton* m_sdbSizer1OK;

36
pcbnew/drc/drc_test_provider_library_parity.cpp

@ -597,18 +597,20 @@ bool FOOTPRINT::FootprintNeedsUpdate( const FOOTPRINT* aLibFP, int aCompareFlags
// due to rounding and shape modifications
std::unique_ptr<FOOTPRINT> temp( static_cast<FOOTPRINT*>( aLibFP->Clone() ) );
temp->SetParentGroup( nullptr );
temp->SetParent( GetBoard() ); // Needed to know the copper layer count;
if( IsFlipped() != temp->IsFlipped() )
temp->Flip( { 0, 0 }, FLIP_DIRECTION::TOP_BOTTOM );
if( !( aCompareFlags & COMPARE_FLAGS::INSTANCE_TO_INSTANCE ) )
{
if( IsFlipped() != temp->IsFlipped() )
temp->Flip( { 0, 0 }, FLIP_DIRECTION::TOP_BOTTOM );
if( GetOrientation() != temp->GetOrientation() )
temp->SetOrientation( GetOrientation() );
if( GetOrientation() != temp->GetOrientation() )
temp->SetOrientation( GetOrientation() );
if( GetPosition() != temp->GetPosition() )
temp->SetPosition( GetPosition() );
if( GetPosition() != temp->GetPosition() )
temp->SetPosition( GetPosition() );
}
for( BOARD_ITEM* item : temp->GraphicalItems() )
item->NormalizeForCompare();
@ -648,6 +650,9 @@ bool FOOTPRINT::FootprintNeedsUpdate( const FOOTPRINT* aLibFP, int aCompareFlags
_( "Do not populate" ) ) );
}
#define REPORT( msg ) { if( aReporter ) aReporter->Report( msg ); }
#define CHECKPOINT { if( diff && !aReporter ) return diff; }
// Clearance and zone connection overrides are as likely to be set at the board level as in
// the library.
//
@ -657,20 +662,20 @@ bool FOOTPRINT::FootprintNeedsUpdate( const FOOTPRINT* aLibFP, int aCompareFlags
// On the other hand, if we report them then boards that override at the board level are
// going to be VERY noisy.
//
// For now we report them if there's a reporter, but we DON'T generate DRC errors on them.
if( aReporter )
// For report them as different, but we DON'T generate DRC errors on them.
if( !( aCompareFlags & COMPARE_FLAGS::DRC ) )
{
if( GetLocalClearance().has_value() && GetLocalClearance() != aLibFP->GetLocalClearance() )
{
diff = true;
aReporter->Report( _( "Pad clearance overridden." ) );
REPORT( _( "Pad clearance overridden." ) );
}
if( GetLocalSolderMaskMargin().has_value()
&& GetLocalSolderMaskMargin() != aLibFP->GetLocalSolderMaskMargin() )
{
diff = true;
aReporter->Report( _( "Solder mask expansion overridden." ) );
REPORT( _( "Solder mask expansion overridden." ) );
}
@ -678,21 +683,21 @@ bool FOOTPRINT::FootprintNeedsUpdate( const FOOTPRINT* aLibFP, int aCompareFlags
&& GetLocalSolderPasteMargin() != aLibFP->GetLocalSolderPasteMargin() )
{
diff = true;
aReporter->Report( _( "Solder paste absolute clearance overridden." ) );
REPORT( _( "Solder paste absolute clearance overridden." ) );
}
if( GetLocalSolderPasteMarginRatio()
&& GetLocalSolderPasteMarginRatio() != aLibFP->GetLocalSolderPasteMarginRatio() )
{
diff = true;
aReporter->Report( _( "Solder paste relative clearance overridden." ) );
REPORT( _( "Solder paste relative clearance overridden." ) );
}
if( GetLocalZoneConnection() != ZONE_CONNECTION::INHERITED
&& GetLocalZoneConnection() != aLibFP->GetLocalZoneConnection() )
{
diff = true;
aReporter->Report( _( "Zone connection overridden." ) );
REPORT( _( "Zone connection overridden." ) );
}
}
@ -705,9 +710,6 @@ bool FOOTPRINT::FootprintNeedsUpdate( const FOOTPRINT* aLibFP, int aCompareFlags
_( "Net tie pad groups differ." ) );
}
#define REPORT( msg ) { if( aReporter ) aReporter->Report( msg ); }
#define CHECKPOINT { if( diff && !aReporter ) return diff; }
// Text items are really problematic. We don't want to test the reference, but after that
// it gets messy.
//

112
pcbnew/netlist_reader/board_netlist_updater.cpp

@ -62,6 +62,8 @@ BOARD_NETLIST_UPDATER::BOARD_NETLIST_UPDATER( PCB_EDIT_FRAME* aFrame, BOARD* aBo
m_lookupByTimestamp = false;
m_transferGroups = false;
m_overrideLocks = false;
m_updateFields = false;
m_removeExtraFields = false;
m_warningCount = 0;
m_errorCount = 0;
@ -505,8 +507,11 @@ bool BOARD_NETLIST_UPDATER::updateFootprintParameters( FOOTPRINT* aPcbFootprint,
{
if( m_isDryRun )
{
msg.Printf( _( "Update %s fields." ), aPcbFootprint->GetReference() );
m_reporter->Report( msg, RPT_SEVERITY_ACTION );
if( m_updateFields )
{
msg.Printf( _( "Update %s fields." ), aPcbFootprint->GetReference() );
m_reporter->Report( msg, RPT_SEVERITY_ACTION );
}
// Remove fields that aren't present in the symbol
for( PCB_FIELD* field : aPcbFootprint->GetFields() )
@ -516,74 +521,83 @@ bool BOARD_NETLIST_UPDATER::updateFootprintParameters( FOOTPRINT* aPcbFootprint,
if( compFields.count( field->GetName() ) == 0 )
{
msg.Printf( _( "Remove %s footprint fields not in symbol." ),
aPcbFootprint->GetReference() );
m_reporter->Report( msg, RPT_SEVERITY_ACTION );
if( m_removeExtraFields )
{
msg.Printf( _( "Remove %s footprint fields not in symbol." ),
aPcbFootprint->GetReference() );
m_reporter->Report( msg, RPT_SEVERITY_ACTION );
}
break;
}
}
}
else
{
msg.Printf( _( "Updated %s fields." ), aPcbFootprint->GetReference() );
m_reporter->Report( msg, RPT_SEVERITY_ACTION );
if( m_updateFields )
{
msg.Printf( _( "Updated %s fields." ), aPcbFootprint->GetReference() );
m_reporter->Report( msg, RPT_SEVERITY_ACTION );
changed = true;
changed = true;
// Add or change field value
for( auto& [name, value] : compFields )
{
if( aPcbFootprint->HasField( name ) )
{
aPcbFootprint->GetField( name )->SetText( value );
}
else
// Add or change field value
for( auto& [name, value] : compFields )
{
PCB_FIELD* newField = new PCB_FIELD( aPcbFootprint, FIELD_T::USER );
aPcbFootprint->Add( newField );
if( aPcbFootprint->HasField( name ) )
{
aPcbFootprint->GetField( name )->SetText( value );
}
else
{
PCB_FIELD* newField = new PCB_FIELD( aPcbFootprint, FIELD_T::USER );
aPcbFootprint->Add( newField );
newField->SetName( name );
newField->SetText( value );
newField->SetVisible( false );
newField->SetLayer( aPcbFootprint->GetLayer() == F_Cu ? F_Fab : B_Fab );
newField->SetName( name );
newField->SetText( value );
newField->SetVisible( false );
newField->SetLayer( aPcbFootprint->GetLayer() == F_Cu ? F_Fab : B_Fab );
// Give the relative position (0,0) in footprint
newField->SetPosition( aPcbFootprint->GetPosition() );
// Give the footprint orientation
newField->Rotate( aPcbFootprint->GetPosition(), aPcbFootprint->GetOrientation() );
// Give the relative position (0,0) in footprint
newField->SetPosition( aPcbFootprint->GetPosition() );
// Give the footprint orientation
newField->Rotate( aPcbFootprint->GetPosition(), aPcbFootprint->GetOrientation() );
if( m_frame )
newField->StyleFromSettings( m_frame->GetDesignSettings() );
if( m_frame )
newField->StyleFromSettings( m_frame->GetDesignSettings() );
}
}
}
// Remove and delete fields that aren't present in the symbol
bool warned = false;
std::vector<PCB_FIELD*> fieldList;
aPcbFootprint->GetFields( fieldList, false );
for( PCB_FIELD* field : fieldList )
if( m_removeExtraFields )
{
if( field->IsMandatory() )
continue;
bool warned = false;
if( compFields.count( field->GetName() ) == 0 )
std::vector<PCB_FIELD*> fieldList;
aPcbFootprint->GetFields( fieldList, false );
for( PCB_FIELD* field : fieldList )
{
if( !warned )
if( field->IsMandatory() )
continue;
if( compFields.count( field->GetName() ) == 0 )
{
warned = true;
msg.Printf( _( "Removed %s footprint fields not in symbol." ),
aPcbFootprint->GetReference() );
m_reporter->Report( msg, RPT_SEVERITY_ACTION );
}
if( !warned )
{
warned = true;
msg.Printf( _( "Removed %s footprint fields not in symbol." ),
aPcbFootprint->GetReference() );
m_reporter->Report( msg, RPT_SEVERITY_ACTION );
}
aPcbFootprint->Remove( field );
aPcbFootprint->Remove( field );
if( m_frame )
m_frame->GetCanvas()->GetView()->Remove( field );
if( m_frame )
m_frame->GetCanvas()->GetView()->Remove( field );
delete field;
delete field;
}
}
}
}
@ -799,7 +813,7 @@ bool BOARD_NETLIST_UPDATER::updateFootprintParameters( FOOTPRINT* aPcbFootprint,
if( changed && copy )
m_commit.Modified( aPcbFootprint, copy );
else if( copy )
else
delete copy;
return true;

6
pcbnew/netlist_reader/board_netlist_updater.h

@ -93,6 +93,10 @@ public:
void SetLookupByTimestamp( bool aEnabled ) { m_lookupByTimestamp = aEnabled; }
void SetUpdateFields( bool aEnabled ) { m_updateFields = aEnabled; }
void SetRemoveExtraFields( bool aEnabled ) { m_removeExtraFields = aEnabled; }
std::vector<FOOTPRINT*> GetAddedFootprints() const { return m_addedFootprints; }
private:
@ -143,6 +147,8 @@ private:
bool m_transferGroups; // copy component group associations from schematic to PCB
bool m_lookupByTimestamp;
bool m_overrideLocks;
bool m_updateFields;
bool m_removeExtraFields;
int m_warningCount;
int m_errorCount;

52
pcbnew/pcb_edit_frame.cpp

@ -2371,6 +2371,8 @@ void PCB_EDIT_FRAME::ExchangeFootprint( FOOTPRINT* aExisting, FOOTPRINT* aNew,
newPad->SetNetCode( NETINFO_LIST::UNCONNECTED );
}
std::set<PCB_TEXT*> handledTextItems;
for( BOARD_ITEM* oldItem : aExisting->GraphicalItems() )
{
PCB_TEXT* oldTextItem = dynamic_cast<PCB_TEXT*>( oldItem );
@ -2385,6 +2387,7 @@ void PCB_EDIT_FRAME::ExchangeFootprint( FOOTPRINT* aExisting, FOOTPRINT* aNew,
if( newTextItem )
{
handledTextItems.insert( newTextItem );
processTextItem( *oldTextItem, *newTextItem, resetTextContent, resetTextLayers,
resetTextEffects, aUpdated );
}
@ -2394,7 +2397,28 @@ void PCB_EDIT_FRAME::ExchangeFootprint( FOOTPRINT* aExisting, FOOTPRINT* aNew,
}
else
{
aNew->Add( static_cast<BOARD_ITEM*>( oldTextItem->Clone() ) );
newTextItem = static_cast<PCB_TEXT*>( oldTextItem->Clone() );
handledTextItems.insert( newTextItem );
aNew->Add( newTextItem );
}
}
}
// Check for any newly-added text items and set the update flag as appropriate
for( BOARD_ITEM* newItem : aNew->GraphicalItems() )
{
PCB_TEXT* newTextItem = dynamic_cast<PCB_TEXT*>( newItem );
if( newTextItem )
{
// Dimensions have PCB_TEXT base but are not treated like texts in the updater
if( dynamic_cast<PCB_DIMENSION_BASE*>( newTextItem ) )
continue;
if( !handledTextItems.contains( newTextItem ) )
{
*aUpdated = true;
break;
}
}
}
@ -2410,6 +2434,8 @@ void PCB_EDIT_FRAME::ExchangeFootprint( FOOTPRINT* aExisting, FOOTPRINT* aNew,
aExisting->GetValue() == aExisting->GetFPID().GetLibItemName().wx_str(),
resetTextLayers, resetTextEffects, aUpdated );
std::set<PCB_FIELD*> handledFields;
// Copy fields in accordance with the reset* flags
for( PCB_FIELD* oldField : aExisting->GetFields() )
{
@ -2421,6 +2447,7 @@ void PCB_EDIT_FRAME::ExchangeFootprint( FOOTPRINT* aExisting, FOOTPRINT* aNew,
if( newField )
{
handledFields.insert( newField );
processTextItem( *oldField, *newField, resetTextContent, resetTextLayers,
resetTextEffects, aUpdated );
}
@ -2431,8 +2458,22 @@ void PCB_EDIT_FRAME::ExchangeFootprint( FOOTPRINT* aExisting, FOOTPRINT* aNew,
else
{
newField = new PCB_FIELD( *oldField );
handledFields.insert( newField );
aNew->Add( newField );
processTextItem( *oldField, *newField, true, true, true, aUpdated );
}
}
// Check for any newly-added fields and set the update flag as appropriate
for( PCB_FIELD* newField : aNew->GetFields() )
{
// Reference and value are already handled
if( newField->IsReference() || newField->IsValue() )
continue;
if( !handledFields.contains( newField ) )
{
*aUpdated = true;
break;
}
}
@ -2505,6 +2546,13 @@ void PCB_EDIT_FRAME::ExchangeFootprint( FOOTPRINT* aExisting, FOOTPRINT* aNew,
aNew->SetFilters( aExisting->GetFilters() );
aNew->SetStaticComponentClass( aExisting->GetComponentClass() );
if( !aUpdated )
{
// Check pad shapes, graphics, zones, etc. for changes
if( aNew->FootprintNeedsUpdate( aExisting, BOARD_ITEM::COMPARE_FLAGS::INSTANCE_TO_INSTANCE ) )
*aUpdated = true;
}
aCommit.Remove( aExisting );
aCommit.Add( aNew );

Loading…
Cancel
Save