56 m_matchAll->SetLabel(
_(
"Change all symbols in schematic" ) );
57 SetTitle(
_(
"Change Symbols" ) );
62 m_matchById->SetLabel(
_(
"Change symbols matching library identifier:" ) );
89 bool selectReference =
false;
90 bool selectValue =
false;
94 selectReference = cfg->m_ChangeSymbols.updateReferences;
95 selectValue = cfg->m_ChangeSymbols.updateValues;
137 { wxID_CANCEL,
_(
"Close" ) } } );
237 wxString rawValue = aCtrl->GetValue();
239 wxString libName = rawValue.BeforeFirst(
':', &itemName );
251 if( frame->ShowModal( &newName,
this ) )
268 if( frame->ShowModal( &newName,
this ) )
286 std::set<wxString> fieldNames;
292 wxCHECK2( screen,
continue );
298 wxCHECK2( symbol,
continue );
300 if( !
isMatch( symbol, &instance ) )
305 if( !field.IsMandatory() && !field.IsPrivate() )
306 fieldNames.insert( field.GetName() );
315 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->
Flatten();
316 std::vector<SCH_FIELD*> orderedLibFields;
318 flattenedSymbol->GetFields( orderedLibFields );
320 for(
SCH_FIELD* libField : orderedLibFields )
322 if( !libField->IsMandatory() && !libField->IsPrivate() )
323 fieldNames.insert( libField->GetName() );
343 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->
Flatten();
344 std::vector<SCH_FIELD*> orderedLibFields;
346 flattenedSymbol->GetFields( orderedLibFields );
348 for(
SCH_FIELD* libField : orderedLibFields )
350 if( !libField->IsMandatory() && !libField->IsPrivate() )
351 fieldNames.insert( libField->GetName() );
358 wxArrayInt checkedItems;
359 wxArrayString checkedNames;
363 for(
int ii : checkedItems )
364 checkedNames.push_back(
m_fieldsBox->GetString( ii ) );
366 bool allChecked =
true;
368 for(
int ii = 0; ii < (int)
m_fieldsBox->GetCount(); ++ii )
378 auto isMandatoryField =
379 [&](
int listbox_idx )
390 for(
int ii = (
int)
m_fieldsBox->GetCount() - 1; ii >= 0; --ii )
392 if( isMandatoryField( ii ) )
398 for(
const wxString& fieldName : fieldNames )
410 for(
unsigned i = 0; i <
m_fieldsBox->GetCount(); ++i )
446 for(
unsigned ii = 0; ii <
m_fieldsBox->GetCount(); ++ii )
469 wxCHECK( frame,
false );
510 wxCHECK( frame,
false );
513 int matchesProcessed = 0;
524 std::map<SCH_SYMBOL*, SYMBOL_CHANGE_INFO> symbols;
530 wxCHECK2( screen,
continue );
537 wxCHECK2( symbol,
continue );
539 if( !
isMatch( symbol, &instance ) )
545 auto it = symbols.find( symbol );
547 if( it == symbols.end() )
551 info.m_Instances.emplace_back( instance );
552 info.m_LibId = newId;
553 symbols.insert( { symbol,
info } );
557 it->second.m_Instances.emplace_back( instance );
562 if( symbols.size() > 0 )
569 return matchesProcessed;
576 wxCHECK( !aSymbols.empty(), 0 );
578 int matchesProcessed = 0;
584 std::map<SCH_SYMBOL*, SYMBOL_CHANGE_INFO> symbols = aSymbols;
585 std::map<SCH_SYMBOL*, SYMBOL_CHANGE_INFO>::iterator it = symbols.begin();
589 while( it != symbols.end() )
593 wxCHECK2( symbol, ++it; continue );
595 if( !it->second.m_LibId.IsValid() )
598 msg << wxT(
": " ) <<
_(
"*** symbol lib id not valid ***" );
600 it = symbols.erase( it );
609 msg << wxT(
": " ) <<
_(
"*** symbol not found ***" );
611 it = symbols.erase( it );
615 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->
Flatten();
617 if( flattenedSymbol->GetUnitCount() < symbol->
GetUnit() )
620 msg << wxT(
": " ) <<
_(
"*** new symbol has too few units ***" );
622 it = symbols.erase( it );
632 for(
const auto& [ symbol, symbol_change_info ] : symbols )
634 wxCHECK( symbol && !symbol_change_info.m_Instances.empty(), 0 );
636 SCH_SCREEN* screen = symbol_change_info.m_Instances[0].LastScreen();
638 wxCHECK( screen, 0 );
642 aCommit->
Modified( symbol, symbol_copy, screen );
645 for(
const auto& [ symbol, symbol_change_info ] : symbols )
648 wxString initialLibLinkName =
UnescapeString( symbol->GetLibId().Format() );
652 wxCHECK2( libSymbol,
continue );
654 if( symbol_change_info.m_LibId != symbol->GetLibId() )
655 symbol->SetLibId( symbol_change_info.m_LibId );
657 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->
Flatten();
658 SCH_SCREEN* screen = symbol_change_info.m_Instances[0].LastScreen();
660 symbol->SetLibSymbol( flattenedSymbol.release() );
666 symbol->SetExcludedFromSim( symbol->GetLibSymbolRef()->GetExcludedFromSim() );
667 symbol->SetExcludedFromBOM( symbol->GetLibSymbolRef()->GetExcludedFromBOM() );
668 symbol->SetExcludedFromBoard( symbol->GetLibSymbolRef()->GetExcludedFromBoard() );
669 symbol->SetExcludedFromPosFiles( symbol->GetLibSymbolRef()->GetExcludedFromPosFiles() );
674 symbol->SetShowPinNames( symbol->GetLibSymbolRef()->GetShowPinNames() );
675 symbol->SetShowPinNumbers( symbol->GetLibSymbolRef()->GetShowPinNumbers() );
683 for(
int ii = (
int) symbol->GetFields().size() - 1; ii >= 0; ii-- )
685 SCH_FIELD& field = symbol->GetFields()[ii];
697 libField = symbol->GetLibSymbolRef()->GetField( field.
GetId() );
699 libField = symbol->GetLibSymbolRef()->GetField( field.
GetName() );
714 for(
const SCH_SHEET_PATH& instance : symbol_change_info.m_Instances )
716 wxString ref = symbol->GetRef( &instance );
720 ref.Printf( wxS(
"%s%d" ), prefix, number );
724 symbol->SetRef( &instance, ref );
760 symbol->RemoveField( field.
GetName() );
764 std::vector<SCH_FIELD*> libFields;
765 symbol->GetLibSymbolRef()->GetFields( libFields );
769 if( libField->IsMandatory() )
775 if( !symbol->GetField( libField->GetName() ) )
781 schField->
SetVisible( libField->IsVisible() );
782 schField->
SetText( libField->GetText() );
783 schField->
SetTextPos( symbol->GetPosition() + libField->GetTextPos() );
784 schField->
SetPrivate( libField->IsPrivate() );
792 symbol->AutoplaceFields( screen, fieldsAutoplaced );
796 symbol->SetSchSymbolLibraryName( wxEmptyString );
804 symbol->AutoplaceFields( screen, fieldsAutoplaced );
808 for(
const SCH_SHEET_PATH& instance : symbol_change_info.m_Instances )
810 for(
SCH_PIN*
pin : symbol->GetPins( &instance ) )
812 if( !
pin->GetAlt().IsEmpty() )
819 || (
pin->GetAlt() ==
pin->GetBaseName() )
820 || (
pin->GetAlternates().count(
pin->GetAlt() ) == 0 ) )
822 pin->SetAlt( wxEmptyString );
831 msg += wxS(
": OK" );
833 matchesProcessed +=1;
836 return matchesProcessed;
841 const wxString* aOldLibLinkName )
846 wxString oldLibLinkName;
848 if( aOldLibLinkName )
849 oldLibLinkName = *aOldLibLinkName;
855 wxCHECK( parent, msg );
862 if( !sheets.
HasPath( instance.m_Path ) )
865 if( references.IsEmpty() )
866 references = instance.m_Reference;
868 references += wxT(
" " ) + instance.m_Reference;
875 msg.Printf(
_(
"Update symbol %s from '%s' to '%s'" ),
882 msg.Printf(
_(
"Update symbols %s from '%s' to '%s'" ),
892 msg.Printf(
_(
"Change symbol %s from '%s' to '%s'" ),
899 msg.Printf(
_(
"Change symbols %s from '%s' to '%s'" ),
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
COMMIT & Modified(EDA_ITEM *aItem, EDA_ITEM *aCopy, BASE_SCREEN *aScreen=nullptr)
Create an undo entry for an item that has been already modified.
wxCheckListBox * m_fieldsBox
STD_BITMAP_BUTTON * m_newIdBrowserButton
wxTextCtrl * m_specifiedValue
DIALOG_CHANGE_SYMBOLS_BASE(wxWindow *parent, wxWindowID id=wxID_ANY, const wxString &title=_("Update Symbols from Library"), const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1,-1), long style=wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
wxCheckBox * m_removeExtraBox
wxCheckBox * m_resetCustomPower
wxRadioButton * m_matchBySelection
wxCheckBox * m_resetAlternatePin
wxCheckBox * m_resetFieldPositions
wxRadioButton * m_matchByValue
wxRadioButton * m_matchByReference
wxCheckBox * m_resetFieldEffects
wxCheckBox * m_resetFieldText
wxStaticBoxSizer * m_updateFieldsSizer
wxCheckBox * m_resetAttributes
wxTextCtrl * m_specifiedReference
wxGridBagSizer * m_matchSizer
WX_HTML_REPORT_PANEL * m_messagePanel
wxCheckBox * m_resetFieldVisibilities
wxTextCtrl * m_specifiedId
wxRadioButton * m_matchById
wxCheckBox * m_resetEmptyFields
wxBoxSizer * m_newIdSizer
wxCheckBox * m_resetPinTextVisibility
wxRadioButton * m_matchAll
STD_BITMAP_BUTTON * m_matchIdBrowserButton
void onNewLibIDKillFocus(wxFocusEvent &event) override
void onMatchBySelected(wxCommandEvent &aEvent) override
bool isMatch(SCH_SYMBOL *aSymbol, SCH_SHEET_PATH *aInstance)
std::map< FIELD_T, int > m_mandatoryFieldListIndexes
Index in the list control for each mandatory FIELD_T type.
void onOkButtonClicked(wxCommandEvent &aEvent) override
void selectAll(bool aSelect)
Select or deselect all fields in the listbox widget.
std::set< wxString > m_updateFields
Set of field names that should have values updated.
void onMatchById(wxCommandEvent &aEvent) override
bool TransferDataToWindow() override
void launchMatchIdSymbolBrowser(wxCommandEvent &aEvent) override
void onMatchByReference(wxCommandEvent &aEvent) override
void onMatchByValue(wxCommandEvent &aEvent) override
~DIALOG_CHANGE_SYMBOLS() override
int processMatchingSymbols(SCH_COMMIT *aCommit)
DIALOG_CHANGE_SYMBOLS(SCH_EDIT_FRAME *aParent, SCH_SYMBOL *aSymbol, MODE aMode=MODE::UPDATE)
void checkAll(bool aCheck)
void onMatchTextKillFocus(wxFocusEvent &event) override
void onMatchIDKillFocus(wxFocusEvent &event) override
wxString getSymbolReferences(SCH_SYMBOL &aSymbol, const LIB_ID &aNewId, const wxString *aOldLibLinkName=nullptr)
void launchNewIdSymbolBrowser(wxCommandEvent &aEvent) override
void onMatchByAll(wxCommandEvent &aEvent) override
int processSymbols(SCH_COMMIT *aCommit, const std::map< SCH_SYMBOL *, SYMBOL_CHANGE_INFO > &aSymbols)
void SetupStandardButtons(std::map< int, wxString > aLabels={})
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
virtual VECTOR2I GetTextPos() const
virtual bool IsVisible() const
virtual void SetTextPos(const VECTOR2I &aPoint)
void SetAttributes(const EDA_TEXT &aSrc, bool aSetPosition=true)
Set the text attributes from another instance.
virtual void SetVisible(bool aVisible)
AUTOPLACE_FIELDS m_AutoplaceFields
EE_TYPE OfType(KICAD_T aType) const
void Update(const KIGFX::VIEW_ITEM *aItem, int aUpdateFlags) const override
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
A logical library item identifier and consists of various portions much like a URI.
int Parse(const UTF8 &aId, bool aFix=false)
Parse LIB_ID with the information from aId.
bool IsValid() const
Check if this LID_ID is valid.
Define a library symbol object.
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
EESCHEMA_SETTINGS * eeconfig() const
LIB_SYMBOL * GetLibSymbol(const LIB_ID &aLibId, bool aUseCacheLib=false, bool aShowErrorMsg=false)
Load symbol from symbol library table.
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Execute the changes.
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
Schematic editor (Eeschema) main window.
SCH_SHEET_PATH & GetCurrentSheet() const
SCHEMATIC & Schematic() const
VECTOR2I GetPosition() const override
virtual const wxString & GetText() const override
Return the string associated with the text object.
void SetCanAutoplace(bool aCanPlace)
wxString GetCanonicalName() const
Get a non-language-specific name for a field which can be used for storage, variable look-up,...
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
void SetPosition(const VECTOR2I &aPosition) override
bool CanAutoplace() const
void SetText(const wxString &aText) override
void SetNameShown(bool aShown=true)
Base class for any item which can be embedded within the SCHEMATIC container class,...
void SetPrivate(bool aPrivate)
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
EE_RTREE & Items()
Get the full RTree, usually for iterating.
bool Remove(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Remove aItem from the schematic associated with this screen.
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
bool HasPath(const KIID_PATH &aPath) const
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
void UpdateAllScreenReferences() const
Update all the symbol references for this sheet path.
const std::vector< SCH_SYMBOL_INSTANCE > & GetInstances() const
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
const LIB_ID & GetLibId() const override
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this symbol.
wxString getLibIdValue(const wxTextCtrl *aCtrl)
wxString GetRefDesPrefix(const wxString &aRefDes)
Get the (non-numeric) prefix from a refdes - e.g.
wxString GetRefDesUnannotated(const wxString &aSource)
Return an unannotated refdes from either a prefix or an existing refdes.
int GetRefDesNumber(const wxString &aRefDes)
Get the numeric suffix from a refdes - e.g.
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
Collection of utility functions for component reference designators (refdes)
T * GetAppSettings(const char *aFilename)
std::vector< FAB_LAYER_COLOR > dummy
bool WildCompareString(const wxString &pattern, const wxString &string_to_tst, bool case_sensitive)
Compare a string against wild card (* and ?) pattern using the usual rules.
wxString UnescapeString(const wxString &aSource)
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
A simple container for schematic symbol instance information.
wxString GetDefaultFieldName(FIELD_T aFieldId, bool aTranslateForHI)
Return a default symbol field name for a mandatory field type.
FIELD_T
The set of all field indices assuming an array like sequence that a SCH_COMPONENT or LIB_PART can hol...
@ USER
The field ID hasn't been set yet; field is invalid.
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
wxString GetCanonicalFieldName(FIELD_T aFieldType)
VECTOR2< int32_t > VECTOR2I