diff --git a/eeschema/dialogs/dialog_change_symbols.cpp b/eeschema/dialogs/dialog_change_symbols.cpp index 8e32ed394a..a5d1dc853a 100644 --- a/eeschema/dialogs/dialog_change_symbols.cpp +++ b/eeschema/dialogs/dialog_change_symbols.cpp @@ -37,6 +37,13 @@ #include +bool g_removeExtraFields = false; +bool g_resetEmptyFields = false; +bool g_resetFieldVisibilities = false; +bool g_resetFieldEffects = false; +bool g_resetFieldPositions = false; + + DIALOG_CHANGE_SYMBOLS::DIALOG_CHANGE_SYMBOLS( SCH_EDIT_FRAME* aParent, SCH_COMPONENT* aSymbol, MODE aMode ) : DIALOG_CHANGE_SYMBOLS_BASE( aParent ), @@ -103,6 +110,12 @@ DIALOG_CHANGE_SYMBOLS::DIALOG_CHANGE_SYMBOLS( SCH_EDIT_FRAME* aParent, SCH_COMPO m_matchByReference->SetValue( true ); } + m_removeExtraBox->SetValue( g_removeExtraFields ); + m_resetEmptyFields->SetValue( g_resetEmptyFields ); + m_resetFieldVisibilities->SetValue( g_resetFieldVisibilities ); + m_resetFieldEffects->SetValue( g_resetFieldEffects ); + m_resetFieldPositions->SetValue( g_resetFieldPositions ); + // DIALOG_SHIM needs a unique hash_key because classname is not sufficient // because the update and change versions of this dialog have different controls. m_hash_key = TO_UTF8( GetTitle() ); @@ -138,6 +151,11 @@ void DIALOG_CHANGE_SYMBOLS::onMatchById( wxCommandEvent& aEvent ) DIALOG_CHANGE_SYMBOLS::~DIALOG_CHANGE_SYMBOLS() { + g_removeExtraFields = m_removeExtraBox->GetValue(); + g_resetEmptyFields = m_resetEmptyFields->GetValue(); + g_resetFieldVisibilities = m_resetFieldVisibilities->GetValue(); + g_resetFieldEffects = m_resetFieldEffects->GetValue(); + g_resetFieldPositions = m_resetFieldPositions->GetValue(); } @@ -340,6 +358,70 @@ bool DIALOG_CHANGE_SYMBOLS::processSymbol( SCH_COMPONENT* aSymbol, SCH_SCREEN* a aSymbol->SetLibId( aNewId ); aSymbol->SetLibSymbol( flattenedSymbol.release() ); + + bool removeExtras = m_removeExtraBox->GetValue(); + bool resetEmpty = m_resetEmptyFields->GetValue(); + bool resetVis = m_resetFieldVisibilities->GetValue(); + bool resetEffects = m_resetFieldEffects->GetValue(); + bool resetPositions = m_resetFieldPositions->GetValue(); + + for( unsigned i = 0; i < aSymbol->GetFields().size(); ++i ) + { + SCH_FIELD* field = aSymbol->GetField( (int) i ) ; + LIB_FIELD* libField = nullptr; + + if( i < MANDATORY_FIELDS ) + libField = libSymbol->GetField( (int) i ); + else + libField = libSymbol->FindField( field->GetName() ); + + if( libField ) + { + if( resetEmpty && libField->GetText().IsEmpty() ) + field->SetText( wxEmptyString ); + + if( resetVis ) + field->SetVisible( libField->IsVisible() ); + + if( resetEffects ) + { + // Careful: the visible bit is also in Effects + bool visible = field->IsVisible(); + field->SetEffects( *libField ); + field->SetVisible( visible ); + } + + if( resetPositions ) + { + field->SetTextPos( aSymbol->GetPosition() + libField->GetTextPos() ); + } + } + else if( i >= MANDATORY_FIELDS && removeExtras ) + { + aSymbol->RemoveField( field->GetName() ); + i--; + } + } + + LIB_FIELDS libFields; + libSymbol->GetFields( libFields ); + + for( unsigned i = MANDATORY_FIELDS; i < libFields.size(); ++i ) + { + LIB_FIELD& libField = libFields[i]; + + if( !aSymbol->FindField( libField.GetName(), false ) ) + { + wxString fieldName = libField.GetCanonicalName(); + SCH_FIELD newField( wxPoint( 0, 0), aSymbol->GetFieldCount(), aSymbol, fieldName ); + SCH_FIELD* schField = aSymbol->AddField( newField ); + + schField->SetEffects( libField ); + schField->SetText( libField.GetText() ); + schField->SetTextPos( aSymbol->GetPosition() + libField.GetTextPos() ); + } + } + aScreen->Append( aSymbol ); frame->GetCanvas()->GetView()->Update( aSymbol ); diff --git a/eeschema/dialogs/dialog_change_symbols_base.cpp b/eeschema/dialogs/dialog_change_symbols_base.cpp index dd0e7e3231..0ef0d10ef4 100644 --- a/eeschema/dialogs/dialog_change_symbols_base.cpp +++ b/eeschema/dialogs/dialog_change_symbols_base.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Jul 10 2019) +// C++ code generated with wxFormBuilder (version Oct 26 2018) // http://www.wxformbuilder.org/ // // PLEASE DO *NOT* EDIT THIS FILE! @@ -22,25 +22,25 @@ DIALOG_CHANGE_SYMBOLS_BASE::DIALOG_CHANGE_SYMBOLS_BASE( wxWindow* parent, wxWind m_matchSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); m_matchAll = new wxRadioButton( this, wxID_ANY, _("%s all symbols in schematic"), wxDefaultPosition, wxDefaultSize, 0 ); - m_matchSizer->Add( m_matchAll, wxGBPosition( 0, 0 ), wxGBSpan( 1, 2 ), wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); + m_matchSizer->Add( m_matchAll, wxGBPosition( 0, 0 ), wxGBSpan( 1, 2 ), wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT, 5 ); m_matchBySelection = new wxRadioButton( this, wxID_ANY, _("%s selected symbol"), wxDefaultPosition, wxDefaultSize, 0 ); - m_matchSizer->Add( m_matchBySelection, wxGBPosition( 1, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxBOTTOM, 3 ); + m_matchSizer->Add( m_matchBySelection, wxGBPosition( 1, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT, 3 ); m_matchByReference = new wxRadioButton( this, wxID_ANY, _("%s by reference:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_matchSizer->Add( m_matchByReference, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); + m_matchSizer->Add( m_matchByReference, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); m_specifiedReference = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 200,-1 ), wxTE_PROCESS_ENTER ); m_matchSizer->Add( m_specifiedReference, wxGBPosition( 2, 1 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); m_matchByValue = new wxRadioButton( this, wxID_ANY, _("%s by value:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_matchSizer->Add( m_matchByValue, wxGBPosition( 3, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); + m_matchSizer->Add( m_matchByValue, wxGBPosition( 3, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); m_specifiedValue = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER ); m_matchSizer->Add( m_specifiedValue, wxGBPosition( 3, 1 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); m_matchById = new wxRadioButton( this, wxID_ANY, _("%s by library indentifier:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_matchSizer->Add( m_matchById, wxGBPosition( 4, 0 ), wxGBSpan( 1, 2 ), wxALIGN_CENTER_VERTICAL|wxTOP, 5 ); + m_matchSizer->Add( m_matchById, wxGBPosition( 4, 0 ), wxGBSpan( 1, 2 ), wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT, 5 ); m_specifiedId = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER ); m_matchSizer->Add( m_specifiedId, wxGBPosition( 5, 0 ), wxGBSpan( 1, 2 ), wxALIGN_CENTER_VERTICAL|wxEXPAND|wxLEFT, 5 ); @@ -54,6 +54,9 @@ DIALOG_CHANGE_SYMBOLS_BASE::DIALOG_CHANGE_SYMBOLS_BASE( wxWindow* parent, wxWind m_mainSizer->Add( m_matchSizer, 0, wxALL|wxEXPAND, 5 ); + m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + m_mainSizer->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 ); + m_newIdSizer = new wxBoxSizer( wxVERTICAL ); wxStaticText* m_newIdLabel; @@ -65,16 +68,41 @@ DIALOG_CHANGE_SYMBOLS_BASE::DIALOG_CHANGE_SYMBOLS_BASE( wxWindow* parent, wxWind bSizer1 = new wxBoxSizer( wxHORIZONTAL ); m_newId = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER ); - bSizer1->Add( m_newId, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + bSizer1->Add( m_newId, 1, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); m_newIdBrowserButton = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); - bSizer1->Add( m_newIdBrowserButton, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + bSizer1->Add( m_newIdBrowserButton, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 2 ); - m_newIdSizer->Add( bSizer1, 0, wxEXPAND, 5 ); + m_newIdSizer->Add( bSizer1, 0, wxEXPAND|wxBOTTOM, 5 ); - m_mainSizer->Add( m_newIdSizer, 0, wxEXPAND|wxLEFT, 5 ); + m_mainSizer->Add( m_newIdSizer, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); + + m_updateOptionsSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Update Options") ), wxVERTICAL ); + + m_removeExtraBox = new wxCheckBox( m_updateOptionsSizer->GetStaticBox(), wxID_ANY, _("Remove fields which are not in library symbol"), wxDefaultPosition, wxDefaultSize, 0 ); + m_removeExtraBox->SetToolTip( _("Removes fields that do not occur in the original library symbols") ); + + m_updateOptionsSizer->Add( m_removeExtraBox, 0, wxBOTTOM|wxRIGHT, 4 ); + + m_resetEmptyFields = new wxCheckBox( m_updateOptionsSizer->GetStaticBox(), wxID_ANY, _("Reset fields which are empty in library"), wxDefaultPosition, wxDefaultSize, 0 ); + m_updateOptionsSizer->Add( m_resetEmptyFields, 0, wxBOTTOM|wxRIGHT, 4 ); + + + m_updateOptionsSizer->Add( 0, 6, 0, wxEXPAND, 5 ); + + m_resetFieldVisibilities = new wxCheckBox( m_updateOptionsSizer->GetStaticBox(), wxID_ANY, _("Reset field visibilities"), wxDefaultPosition, wxDefaultSize, 0 ); + m_updateOptionsSizer->Add( m_resetFieldVisibilities, 0, wxBOTTOM|wxRIGHT, 4 ); + + m_resetFieldEffects = new wxCheckBox( m_updateOptionsSizer->GetStaticBox(), wxID_ANY, _("Reset field sizes and styles"), wxDefaultPosition, wxDefaultSize, 0 ); + m_updateOptionsSizer->Add( m_resetFieldEffects, 0, wxBOTTOM|wxRIGHT, 4 ); + + m_resetFieldPositions = new wxCheckBox( m_updateOptionsSizer->GetStaticBox(), wxID_ANY, _("Reset field positions"), wxDefaultPosition, wxDefaultSize, 0 ); + m_updateOptionsSizer->Add( m_resetFieldPositions, 0, wxBOTTOM|wxRIGHT, 4 ); + + + m_mainSizer->Add( m_updateOptionsSizer, 0, wxEXPAND|wxRIGHT|wxLEFT, 10 ); wxBoxSizer* bSizer2; bSizer2 = new wxBoxSizer( wxVERTICAL ); @@ -85,7 +113,7 @@ DIALOG_CHANGE_SYMBOLS_BASE::DIALOG_CHANGE_SYMBOLS_BASE( wxWindow* parent, wxWind bSizer2->Add( m_messagePanel, 1, wxEXPAND | wxALL, 5 ); - m_mainSizer->Add( bSizer2, 1, wxEXPAND, 5 ); + m_mainSizer->Add( bSizer2, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); m_sdbSizer = new wxStdDialogButtonSizer(); m_sdbSizerOK = new wxButton( this, wxID_OK ); @@ -94,7 +122,7 @@ DIALOG_CHANGE_SYMBOLS_BASE::DIALOG_CHANGE_SYMBOLS_BASE( wxWindow* parent, wxWind m_sdbSizer->AddButton( m_sdbSizerCancel ); m_sdbSizer->Realize(); - m_mainSizer->Add( m_sdbSizer, 0, wxBOTTOM|wxEXPAND, 5 ); + m_mainSizer->Add( m_sdbSizer, 0, wxEXPAND|wxALL, 5 ); this->SetSizer( m_mainSizer ); diff --git a/eeschema/dialogs/dialog_change_symbols_base.fbp b/eeschema/dialogs/dialog_change_symbols_base.fbp index 6e27a789c9..e5cbd7a6db 100644 --- a/eeschema/dialogs/dialog_change_symbols_base.fbp +++ b/eeschema/dialogs/dialog_change_symbols_base.fbp @@ -14,7 +14,6 @@ dialog_change_symbols_base 1000 none - 1 dialog_change_symbols_base @@ -26,7 +25,6 @@ 1 1 UI - 0 0 0 @@ -79,7 +77,7 @@ 5 2 0 - wxALIGN_CENTER_VERTICAL|wxBOTTOM + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT 0 1 @@ -146,7 +144,7 @@ 3 1 0 - wxALIGN_CENTER_VERTICAL|wxBOTTOM + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxLEFT 1 1 @@ -213,7 +211,7 @@ 5 1 0 - wxALIGN_CENTER_VERTICAL + wxALIGN_CENTER_VERTICAL|wxLEFT 2 1 @@ -348,7 +346,7 @@ 5 1 0 - wxALIGN_CENTER_VERTICAL + wxALIGN_CENTER_VERTICAL|wxLEFT 3 1 @@ -483,7 +481,7 @@ 5 2 0 - wxALIGN_CENTER_VERTICAL|wxTOP + wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT 4 1 @@ -694,7 +692,65 @@ 5 - wxEXPAND|wxLEFT + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline1 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + ; ; forward_declare + 0 + + + + + + + + 5 + wxEXPAND|wxRIGHT|wxLEFT 0 @@ -764,7 +820,7 @@ 5 - wxEXPAND + wxEXPAND|wxBOTTOM 0 @@ -773,7 +829,7 @@ none 5 - wxALIGN_CENTER_VERTICAL|wxLEFT + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT 1 1 @@ -836,8 +892,8 @@ - 5 - wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT + 2 + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT 0 1 @@ -912,9 +968,353 @@ + + 10 + wxEXPAND|wxRIGHT|wxLEFT + 0 + + wxID_ANY + Update Options + + m_updateOptionsSizer + wxVERTICAL + 1 + protected + + 4 + wxBOTTOM|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Remove fields which are not in library symbol + + 0 + + + 0 + + 1 + m_removeExtraBox + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + Removes fields that do not occur in the original library symbols + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 4 + wxBOTTOM|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Reset fields which are empty in library + + 0 + + + 0 + + 1 + m_resetEmptyFields + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 + wxEXPAND + 0 + + 6 + protected + 0 + + + + 4 + wxBOTTOM|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Reset field visibilities + + 0 + + + 0 + + 1 + m_resetFieldVisibilities + 1 + + + protected + 1 + + Resizable + 1 + + + ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 4 + wxBOTTOM|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Reset field sizes and styles + + 0 + + + 0 + + 1 + m_resetFieldEffects + 1 + + + protected + 1 + + Resizable + 1 + + + ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 4 + wxBOTTOM|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Reset field positions + + 0 + + + 0 + + 1 + m_resetFieldPositions + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + 5 - wxEXPAND + wxEXPAND|wxTOP|wxRIGHT|wxLEFT 1 @@ -982,7 +1382,7 @@ 5 - wxBOTTOM|wxEXPAND + wxEXPAND|wxALL 0 0 diff --git a/eeschema/dialogs/dialog_change_symbols_base.h b/eeschema/dialogs/dialog_change_symbols_base.h index 834b779f4a..ae5c041f65 100644 --- a/eeschema/dialogs/dialog_change_symbols_base.h +++ b/eeschema/dialogs/dialog_change_symbols_base.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Jul 10 2019) +// C++ code generated with wxFormBuilder (version Oct 26 2018) // http://www.wxformbuilder.org/ // // PLEASE DO *NOT* EDIT THIS FILE! @@ -26,8 +26,11 @@ class WX_HTML_REPORT_PANEL; #include #include #include +#include #include #include +#include +#include #include #include @@ -53,9 +56,16 @@ class DIALOG_CHANGE_SYMBOLS_BASE : public DIALOG_SHIM wxRadioButton* m_matchById; wxTextCtrl* m_specifiedId; wxBitmapButton* m_matchIdBrowserButton; + wxStaticLine* m_staticline1; wxBoxSizer* m_newIdSizer; wxTextCtrl* m_newId; wxBitmapButton* m_newIdBrowserButton; + wxStaticBoxSizer* m_updateOptionsSizer; + wxCheckBox* m_removeExtraBox; + wxCheckBox* m_resetEmptyFields; + wxCheckBox* m_resetFieldVisibilities; + wxCheckBox* m_resetFieldEffects; + wxCheckBox* m_resetFieldPositions; WX_HTML_REPORT_PANEL* m_messagePanel; wxStdDialogButtonSizer* m_sdbSizer; wxButton* m_sdbSizerOK; diff --git a/eeschema/menubar.cpp b/eeschema/menubar.cpp index 0bc5e9dadc..206ba5052b 100644 --- a/eeschema/menubar.cpp +++ b/eeschema/menubar.cpp @@ -152,7 +152,6 @@ void SCH_EDIT_FRAME::ReCreateMenuBar() editMenu->AppendSeparator(); editMenu->Add( ACTIONS::deleteTool ); editMenu->Add( EE_ACTIONS::editTextAndGraphics ); - editMenu->Add( EE_ACTIONS::updateFieldsFromLibrary ); editMenu->Add( EE_ACTIONS::changeSymbols ); editMenu->Add( EE_ACTIONS::updateSymbols );