diff --git a/pcbnew/dialogs/dialog_import_netlist.cpp b/pcbnew/dialogs/dialog_import_netlist.cpp index fb0af64f9b..62cbd2c4b9 100644 --- a/pcbnew/dialogs/dialog_import_netlist.cpp +++ b/pcbnew/dialogs/dialog_import_netlist.cpp @@ -262,6 +262,7 @@ void DIALOG_IMPORT_NETLIST::loadNetlist( bool aDryRun ) updater.SetLookupByTimestamp( m_matchByUUID ); updater.SetDeleteUnusedFootprints( m_cbDeleteExtraFootprints->GetValue()); updater.SetReplaceFootprints( m_cbUpdateFootprints->GetValue() ); + updater.SetOverrideLocks( m_cbOverrideLocks->GetValue() ); updater.UpdateNetlist( netlist ); // The creation of the report was made without window update: the full page must be displayed diff --git a/pcbnew/dialogs/dialog_import_netlist_base.cpp b/pcbnew/dialogs/dialog_import_netlist_base.cpp index 90b8f76f4e..3b4ad27670 100644 --- a/pcbnew/dialogs/dialog_import_netlist_base.cpp +++ b/pcbnew/dialogs/dialog_import_netlist_base.cpp @@ -50,11 +50,14 @@ DIALOG_IMPORT_NETLIST_BASE::DIALOG_IMPORT_NETLIST_BASE( wxWindow* parent, wxWind wxStaticBoxSizer* sbSizer1; sbSizer1 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Options") ), wxVERTICAL ); + m_cbDeleteExtraFootprints = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Delete footprints with no components in netlist"), wxDefaultPosition, wxDefaultSize, 0 ); + sbSizer1->Add( m_cbDeleteExtraFootprints, 0, wxBOTTOM, 5 ); + m_cbUpdateFootprints = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Replace footprints with those specified in netlist"), wxDefaultPosition, wxDefaultSize, 0 ); sbSizer1->Add( m_cbUpdateFootprints, 0, wxBOTTOM, 5 ); - m_cbDeleteExtraFootprints = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Delete footprints with no components in netlist"), wxDefaultPosition, wxDefaultSize, 0 ); - sbSizer1->Add( m_cbDeleteExtraFootprints, 0, wxBOTTOM, 5 ); + m_cbOverrideLocks = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Delete/replace footprints even if locked"), wxDefaultPosition, wxDefaultSize, 0 ); + sbSizer1->Add( m_cbOverrideLocks, 0, wxBOTTOM|wxRIGHT, 5 ); m_cbDeleteShortingTracks = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Delete tracks shorting multiple nets"), wxDefaultPosition, wxDefaultSize, 0 ); sbSizer1->Add( m_cbDeleteShortingTracks, 0, wxBOTTOM, 5 ); @@ -100,8 +103,9 @@ DIALOG_IMPORT_NETLIST_BASE::DIALOG_IMPORT_NETLIST_BASE( wxWindow* parent, wxWind m_NetlistFilenameCtrl->Connect( wxEVT_KILL_FOCUS, wxFocusEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnFilenameKillFocus ), NULL, this ); m_browseButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::onBrowseNetlistFiles ), NULL, this ); m_matchByTimestamp->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnMatchChanged ), NULL, this ); - m_cbUpdateFootprints->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this ); m_cbDeleteExtraFootprints->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this ); + m_cbUpdateFootprints->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this ); + m_cbOverrideLocks->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this ); m_cbDeleteShortingTracks->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this ); m_sdbSizerApply->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::onUpdatePCB ), NULL, this ); m_sdbSizerOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::onImportNetlist ), NULL, this ); @@ -113,8 +117,9 @@ DIALOG_IMPORT_NETLIST_BASE::~DIALOG_IMPORT_NETLIST_BASE() m_NetlistFilenameCtrl->Disconnect( wxEVT_KILL_FOCUS, wxFocusEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnFilenameKillFocus ), NULL, this ); m_browseButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::onBrowseNetlistFiles ), NULL, this ); m_matchByTimestamp->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnMatchChanged ), NULL, this ); - m_cbUpdateFootprints->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this ); m_cbDeleteExtraFootprints->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this ); + m_cbUpdateFootprints->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this ); + m_cbOverrideLocks->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this ); m_cbDeleteShortingTracks->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this ); m_sdbSizerApply->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::onUpdatePCB ), NULL, this ); m_sdbSizerOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::onImportNetlist ), NULL, this ); diff --git a/pcbnew/dialogs/dialog_import_netlist_base.fbp b/pcbnew/dialogs/dialog_import_netlist_base.fbp index 58ed41ba35..3fe98f326f 100644 --- a/pcbnew/dialogs/dialog_import_netlist_base.fbp +++ b/pcbnew/dialogs/dialog_import_netlist_base.fbp @@ -393,7 +393,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 netlist</property> + <property name="label">Delete footprints with no components in netlist</property> <property name="max_size"></property> <property name="maximize_button">0</property> <property name="maximum_size"></property> @@ -401,7 +401,7 @@ <property name="minimize_button">0</property> <property name="minimum_size"></property> <property name="moveable">1</property> - <property name="name">m_cbUpdateFootprints</property> + <property name="name">m_cbDeleteExtraFootprints</property> <property name="pane_border">1</property> <property name="pane_position"></property> <property name="pane_size"></property> @@ -458,7 +458,7 @@ <property name="gripper">0</property> <property name="hidden">0</property> <property name="id">wxID_ANY</property> - <property name="label">Delete footprints with no components in netlist</property> + <property name="label">Replace footprints with those specified in netlist</property> <property name="max_size"></property> <property name="maximize_button">0</property> <property name="maximum_size"></property> @@ -466,7 +466,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_cbUpdateFootprints</property> <property name="pane_border">1</property> <property name="pane_position"></property> <property name="pane_size"></property> @@ -490,6 +490,71 @@ <event name="OnCheckBox">OnOptionChanged</event> </object> </object> + <object class="sizeritem" expanded="1"> + <property name="border">5</property> + <property name="flag">wxBOTTOM|wxRIGHT</property> + <property name="proportion">0</property> + <object class="wxCheckBox" 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="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="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">Delete/replace footprints even if locked</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_cbOverrideLocks</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> + <event name="OnCheckBox">OnOptionChanged</event> + </object> + </object> <object class="sizeritem" expanded="1"> <property name="border">5</property> <property name="flag">wxBOTTOM</property> diff --git a/pcbnew/dialogs/dialog_import_netlist_base.h b/pcbnew/dialogs/dialog_import_netlist_base.h index fd516c1be0..46a659a1f4 100644 --- a/pcbnew/dialogs/dialog_import_netlist_base.h +++ b/pcbnew/dialogs/dialog_import_netlist_base.h @@ -46,8 +46,9 @@ class DIALOG_IMPORT_NETLIST_BASE : public DIALOG_SHIM wxTextCtrl* m_NetlistFilenameCtrl; STD_BITMAP_BUTTON* m_browseButton; wxRadioBox* m_matchByTimestamp; - wxCheckBox* m_cbUpdateFootprints; wxCheckBox* m_cbDeleteExtraFootprints; + wxCheckBox* m_cbUpdateFootprints; + wxCheckBox* m_cbOverrideLocks; wxCheckBox* m_cbDeleteShortingTracks; WX_HTML_REPORT_PANEL* m_MessageWindow; wxBoxSizer* m_buttonsSizer; diff --git a/pcbnew/dialogs/dialog_update_pcb.cpp b/pcbnew/dialogs/dialog_update_pcb.cpp index 3f74a491ef..96f4d9575f 100644 --- a/pcbnew/dialogs/dialog_update_pcb.cpp +++ b/pcbnew/dialogs/dialog_update_pcb.cpp @@ -119,6 +119,7 @@ void DIALOG_UPDATE_PCB::PerformUpdate( bool aDryRun ) updater.SetLookupByTimestamp( !m_cbRelinkFootprints->GetValue() ); updater.SetDeleteUnusedFootprints( m_cbDeleteExtraFootprints->GetValue()); updater.SetReplaceFootprints( m_cbUpdateFootprints->GetValue() ); + updater.SetOverrideLocks( m_cbOverrideLocks->GetValue() ); updater.UpdateNetlist( *m_netlist ); m_messagePanel->Flush( true ); diff --git a/pcbnew/dialogs/dialog_update_pcb_base.cpp b/pcbnew/dialogs/dialog_update_pcb_base.cpp index 815a821e0b..a0b373ff48 100644 --- a/pcbnew/dialogs/dialog_update_pcb_base.cpp +++ b/pcbnew/dialogs/dialog_update_pcb_base.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Oct 26 2018) +// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b) // http://www.wxformbuilder.org/ // // PLEASE DO *NOT* EDIT THIS FILE! @@ -40,6 +40,9 @@ DIALOG_UPDATE_PCB_BASE::DIALOG_UPDATE_PCB_BASE( wxWindow* parent, wxWindowID id, sbSizer1->Add( m_cbUpdateFootprints, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + m_cbOverrideLocks = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Delete/replace footprints even if locked"), wxDefaultPosition, wxDefaultSize, 0 ); + sbSizer1->Add( m_cbOverrideLocks, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + bUpperSizer->Add( sbSizer1, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); @@ -74,6 +77,7 @@ DIALOG_UPDATE_PCB_BASE::DIALOG_UPDATE_PCB_BASE( wxWindow* parent, wxWindowID id, 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_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 ); } @@ -83,6 +87,7 @@ DIALOG_UPDATE_PCB_BASE::~DIALOG_UPDATE_PCB_BASE() 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_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 ); } diff --git a/pcbnew/dialogs/dialog_update_pcb_base.fbp b/pcbnew/dialogs/dialog_update_pcb_base.fbp index acef87a78a..69e5ead972 100644 --- a/pcbnew/dialogs/dialog_update_pcb_base.fbp +++ b/pcbnew/dialogs/dialog_update_pcb_base.fbp @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <wxFormBuilder_Project> - <FileVersion major="1" minor="15" /> + <FileVersion major="1" minor="16" /> <object class="Project" expanded="1"> <property name="class_decoration"></property> <property name="code_generation">C++</property> @@ -14,6 +14,7 @@ <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="name">dialog_update_pcb_base</property> @@ -25,6 +26,7 @@ <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> <object class="Dialog" expanded="1"> @@ -50,6 +52,7 @@ <property name="subclass">DIALOG_SHIM; dialog_shim.h</property> <property name="title">Update PCB from Schematic</property> <property name="tooltip"></property> + <property name="two_step_creation">0</property> <property name="window_extra_style"></property> <property name="window_name"></property> <property name="window_style"></property> @@ -274,6 +277,71 @@ <event name="OnCheckBox">OnOptionChanged</event> </object> </object> + <object class="sizeritem" expanded="1"> + <property name="border">5</property> + <property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxCheckBox" 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="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="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">Delete/replace footprints even if locked</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_cbOverrideLocks</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> + <event name="OnCheckBox">OnOptionChanged</event> + </object> + </object> </object> </object> </object> @@ -336,7 +404,7 @@ <property name="resize">Resizable</property> <property name="show">1</property> <property name="size">-1,-1</property> - <property name="subclass">WX_HTML_REPORT_PANEL; wx_html_report_panel.h</property> + <property name="subclass">WX_HTML_REPORT_PANEL; widgets/wx_html_report_panel.h; forward_declare</property> <property name="toolbar_pane">0</property> <property name="tooltip"></property> <property name="window_extra_style"></property> diff --git a/pcbnew/dialogs/dialog_update_pcb_base.h b/pcbnew/dialogs/dialog_update_pcb_base.h index 7391f01bd4..070d119e44 100644 --- a/pcbnew/dialogs/dialog_update_pcb_base.h +++ b/pcbnew/dialogs/dialog_update_pcb_base.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Oct 26 2018) +// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b) // http://www.wxformbuilder.org/ // // PLEASE DO *NOT* EDIT THIS FILE! @@ -38,12 +38,13 @@ class DIALOG_UPDATE_PCB_BASE : public DIALOG_SHIM wxCheckBox* m_cbRelinkFootprints; wxCheckBox* m_cbDeleteExtraFootprints; wxCheckBox* m_cbUpdateFootprints; + wxCheckBox* m_cbOverrideLocks; WX_HTML_REPORT_PANEL* m_messagePanel; wxStdDialogButtonSizer* m_sdbSizer1; wxButton* m_sdbSizer1OK; wxButton* m_sdbSizer1Cancel; - // Virtual event handlers, overide them in your derived class + // Virtual event handlers, override them in your derived class virtual void OnOptionChanged( wxCommandEvent& event ) { event.Skip(); } virtual void OnUpdateClick( wxCommandEvent& event ) { event.Skip(); } @@ -51,6 +52,7 @@ class DIALOG_UPDATE_PCB_BASE : public DIALOG_SHIM public: DIALOG_UPDATE_PCB_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Update PCB from Schematic"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~DIALOG_UPDATE_PCB_BASE(); }; diff --git a/pcbnew/netlist_reader/board_netlist_updater.cpp b/pcbnew/netlist_reader/board_netlist_updater.cpp index a52fcc9246..6e705e4629 100644 --- a/pcbnew/netlist_reader/board_netlist_updater.cpp +++ b/pcbnew/netlist_reader/board_netlist_updater.cpp @@ -58,6 +58,7 @@ BOARD_NETLIST_UPDATER::BOARD_NETLIST_UPDATER( PCB_EDIT_FRAME* aFrame, BOARD* aBo m_isDryRun = false; m_replaceFootprints = true; m_lookupByTimestamp = false; + m_overrideLocks = false; m_warningCount = 0; m_errorCount = 0; @@ -229,27 +230,55 @@ FOOTPRINT* BOARD_NETLIST_UPDATER::replaceFootprint( NETLIST& aNetlist, FOOTPRINT if( m_isDryRun ) { - msg.Printf( _( "Change %s footprint from '%s' to '%s'."), - aFootprint->GetReference(), - aFootprint->GetFPID().Format().wx_str(), - aNewComponent->GetFPID().Format().wx_str() ); - - delete newFootprint; - newFootprint = nullptr; + if( aFootprint->IsLocked() && !m_overrideLocks ) + { + msg.Printf( _( "Cannot change %s footprint from '%s' to '%s' (footprint is locked)."), + aFootprint->GetReference(), + aFootprint->GetFPID().Format().wx_str(), + aNewComponent->GetFPID().Format().wx_str() ); + m_reporter->Report( msg, RPT_SEVERITY_WARNING ); + ++m_warningCount; + delete newFootprint; + return nullptr; + } + else + { + msg.Printf( _( "Change %s footprint from '%s' to '%s'."), + aFootprint->GetReference(), + aFootprint->GetFPID().Format().wx_str(), + aNewComponent->GetFPID().Format().wx_str() ); + m_reporter->Report( msg, RPT_SEVERITY_ACTION ); + ++m_newFootprintsCount; + delete newFootprint; + return nullptr; + } } else { - m_frame->ExchangeFootprint( aFootprint, newFootprint, m_commit ); + if( aFootprint->IsLocked() && !m_overrideLocks ) + { + msg.Printf( _( "Could not change %s footprint from '%s' to '%s' (footprint is locked)."), + aFootprint->GetReference(), + aFootprint->GetFPID().Format().wx_str(), + aNewComponent->GetFPID().Format().wx_str() ); + m_reporter->Report( msg, RPT_SEVERITY_WARNING ); + ++m_warningCount; + delete newFootprint; + return nullptr; + } + else + { + m_frame->ExchangeFootprint( aFootprint, newFootprint, m_commit ); - msg.Printf( _( "Changed %s footprint from '%s' to '%s'."), - aFootprint->GetReference(), - aFootprint->GetFPID().Format().wx_str(), - aNewComponent->GetFPID().Format().wx_str() ); + msg.Printf( _( "Changed %s footprint from '%s' to '%s'."), + aFootprint->GetReference(), + aFootprint->GetFPID().Format().wx_str(), + aNewComponent->GetFPID().Format().wx_str() ); + m_reporter->Report( msg, RPT_SEVERITY_ACTION ); + ++m_newFootprintsCount; + return newFootprint; + } } - - m_reporter->Report( msg, RPT_SEVERITY_ACTION ); - m_newFootprintsCount++; - return newFootprint; } @@ -1223,21 +1252,21 @@ bool BOARD_NETLIST_UPDATER::UpdateNetlist( NETLIST& aNetlist ) if( component && component->GetProperties().count( wxT( "exclude_from_board" ) ) == 0 ) matched = true; - if( doDelete && !matched && footprint->IsLocked() ) + if( doDelete && !matched && footprint->IsLocked() && !m_overrideLocks ) { if( m_isDryRun ) { - msg.Printf( _( "Cannot remove unused footprint %s (locked)." ), + msg.Printf( _( "Cannot remove unused footprint %s (footprint is locked)." ), footprint->GetReference() ); } else { - msg.Printf( _( "Could not remove unused footprint %s (locked)." ), + msg.Printf( _( "Could not remove unused footprint %s (footprint is locked)." ), footprint->GetReference() ); } - m_reporter->Report( msg, RPT_SEVERITY_ERROR ); - m_errorCount++; + m_reporter->Report( msg, RPT_SEVERITY_WARNING ); + m_warningCount++; doDelete = false; } diff --git a/pcbnew/netlist_reader/board_netlist_updater.h b/pcbnew/netlist_reader/board_netlist_updater.h index a23d652754..a54459acc5 100644 --- a/pcbnew/netlist_reader/board_netlist_updater.h +++ b/pcbnew/netlist_reader/board_netlist_updater.h @@ -85,6 +85,8 @@ public: void SetReplaceFootprints( bool aEnabled ) { m_replaceFootprints = aEnabled; } + void SetOverrideLocks( bool aOverride ) { m_overrideLocks = aOverride; } + void SetDeleteUnusedFootprints( bool aEnabled ) { m_deleteUnusedFootprints = aEnabled; } void SetLookupByTimestamp( bool aEnabled ) { m_lookupByTimestamp = aEnabled; } @@ -131,6 +133,7 @@ private: bool m_isDryRun; bool m_replaceFootprints; bool m_lookupByTimestamp; + bool m_overrideLocks; int m_warningCount; int m_errorCount;