70 m_matchAll->SetLabel(
_(
"Change all symbols in schematic" ) );
71 SetTitle(
_(
"Change Symbols" ) );
99 m_matchById->SetLabel(
_(
"Change symbols matching library identifier:" ) );
111 if( fieldId == FIELD_T::REFERENCE )
113 else if( fieldId == FIELD_T::VALUE )
171 { wxID_CANCEL,
_(
"Close" ) } } );
252 wxString rawValue = aCtrl->GetValue();
254 wxString libName = rawValue.BeforeFirst(
':', &itemName );
266 if( frame->ShowModal( &newName,
this ) )
283 if( frame->ShowModal( &newName,
this ) )
301 std::set<wxString> fieldNames;
307 wxCHECK2( screen,
continue );
313 wxCHECK2( symbol,
continue );
315 if( !
isMatch( symbol, &instance ) )
320 if( !field.IsMandatory() && !field.IsPrivate() )
321 fieldNames.insert( field.GetName() );
330 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->
Flatten();
331 std::vector<SCH_FIELD*> orderedLibFields;
333 flattenedSymbol->GetFields( orderedLibFields );
335 for(
SCH_FIELD* libField : orderedLibFields )
337 if( !libField->IsMandatory() && !libField->IsPrivate() )
338 fieldNames.insert( libField->GetName() );
358 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->
Flatten();
359 std::vector<SCH_FIELD*> orderedLibFields;
361 flattenedSymbol->GetFields( orderedLibFields );
363 for(
SCH_FIELD* libField : orderedLibFields )
365 if( !libField->IsMandatory() && !libField->IsPrivate() )
366 fieldNames.insert( libField->GetName() );
373 wxArrayInt checkedItems;
374 wxArrayString checkedNames;
378 for(
int ii : checkedItems )
379 checkedNames.push_back(
m_fieldsBox->GetString( ii ) );
381 bool allChecked =
true;
383 for(
int ii = 0; ii < (int)
m_fieldsBox->GetCount(); ++ii )
393 auto isMandatoryField =
394 [&](
int listbox_idx )
405 for(
int ii = (
int)
m_fieldsBox->GetCount() - 1; ii >= 0; --ii )
407 if( isMandatoryField( ii ) )
413 for(
const wxString& fieldName : fieldNames )
425 for(
unsigned i = 0; i <
m_fieldsBox->GetCount(); ++i )
461 for(
unsigned ii = 0; ii <
m_fieldsBox->GetCount(); ++ii )
484 wxCHECK( frame,
false );
525 wxCHECK( frame,
false );
528 int matchesProcessed = 0;
539 std::map<SCH_SYMBOL*, SYMBOL_CHANGE_INFO> symbols;
545 wxCHECK2( screen,
continue );
552 wxCHECK2( symbol,
continue );
554 if( !
isMatch( symbol, &instance ) )
560 auto it = symbols.find( symbol );
562 if( it == symbols.end() )
566 info.m_Instances.emplace_back( instance );
567 info.m_LibId = newId;
568 symbols.insert( { symbol,
info } );
572 it->second.m_Instances.emplace_back( instance );
577 if( symbols.size() > 0 )
585 return matchesProcessed;
593 wxCHECK( !aSymbols.empty(), 0 );
595 int matchesProcessed = 0;
601 std::map<SCH_SYMBOL*, SYMBOL_CHANGE_INFO> symbols = aSymbols;
602 std::map<SCH_SYMBOL*, SYMBOL_CHANGE_INFO>::iterator it = symbols.begin();
606 while( it != symbols.end() )
610 wxCHECK2( symbol && it->second.m_LibId.IsValid(),
continue );
617 msg << wxT(
": " ) <<
_(
"*** symbol not found ***" );
619 it = symbols.erase( it );
623 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->
Flatten();
625 if( flattenedSymbol->GetUnitCount() < symbol->
GetUnit() )
628 msg << wxT(
": " ) <<
_(
"*** new symbol has too few units ***" );
630 it = symbols.erase( it );
640 for(
const auto& [ symbol, symbol_change_info ] : symbols )
642 wxCHECK( symbol && !symbol_change_info.m_Instances.empty(), 0 );
644 SCH_SCREEN* screen = symbol_change_info.m_Instances[0].LastScreen();
646 wxCHECK( screen, 0 );
650 aCommit->
Modified( symbol, symbol_copy, screen );
658 if( connectionGraph )
662 for(
const auto& [ symbol, symbol_change_info ] : symbols )
665 wxString initialLibLinkName =
UnescapeString( symbol->GetLibId().Format() );
667 if( symbol_change_info.m_LibId != symbol->GetLibId() )
668 symbol->SetLibId( symbol_change_info.m_LibId );
671 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->
Flatten();
672 SCH_SCREEN* screen = symbol_change_info.m_Instances[0].LastScreen();
674 symbol->SetLibSymbol( flattenedSymbol.release() );
680 symbol->SetExcludedFromSim( symbol->GetLibSymbolRef()->GetExcludedFromSim() );
681 symbol->SetExcludedFromBOM( symbol->GetLibSymbolRef()->GetExcludedFromBOM() );
682 symbol->SetExcludedFromBoard( symbol->GetLibSymbolRef()->GetExcludedFromBoard() );
687 symbol->SetShowPinNames( symbol->GetLibSymbolRef()->GetShowPinNames() );
688 symbol->SetShowPinNumbers( symbol->GetLibSymbolRef()->GetShowPinNumbers() );
696 for(
int ii = (
int) symbol->GetFields().size() - 1; ii >= 0; ii-- )
698 SCH_FIELD& field = symbol->GetFields()[ii];
710 libField = symbol->GetLibSymbolRef()->GetField( field.
GetId() );
712 libField = symbol->GetLibSymbolRef()->GetField( field.
GetName() );
723 if( field.
GetId() == FIELD_T::REFERENCE )
727 for(
const SCH_SHEET_PATH& instance : symbol_change_info.m_Instances )
729 wxString ref = symbol->GetRef( &instance );
733 ref.Printf( wxS(
"%s%d" ), prefix, number );
737 symbol->SetRef( &instance, ref );
740 else if( field.
GetId() == FIELD_T::VALUE )
773 symbol->RemoveField( field.
GetName() );
777 std::vector<SCH_FIELD*> libFields;
778 symbol->GetLibSymbolRef()->GetFields( libFields );
782 if( libField->IsMandatory() )
788 if( !symbol->GetField( libField->GetName() ) )
790 SCH_FIELD* schField = symbol->AddField(
SCH_FIELD( symbol, FIELD_T::USER, libField->GetName() ) );
794 schField->
SetVisible( libField->IsVisible() );
795 schField->
SetText( libField->GetText() );
796 schField->
SetTextPos( symbol->GetPosition() + libField->GetTextPos() );
797 schField->
SetPrivate( libField->IsPrivate() );
805 symbol->AutoplaceFields( screen, fieldsAutoplaced );
809 symbol->SetSchSymbolLibraryName( wxEmptyString );
817 symbol->AutoplaceFields( screen, fieldsAutoplaced );
821 for(
const SCH_SHEET_PATH& instance : symbol_change_info.m_Instances )
823 for(
SCH_PIN*
pin : symbol->GetPins( &instance ) )
825 if( !
pin->GetAlt().IsEmpty() )
832 || (
pin->GetAlternates().count(
pin->GetAlt() ) == 0 ) )
833 pin->SetAlt( wxEmptyString );
841 msg += wxS(
": OK" );
843 matchesProcessed +=1;
846 return matchesProcessed;
852 const wxString* aOldLibLinkName )
858 wxString oldLibLinkName;
860 if( aOldLibLinkName )
861 oldLibLinkName = *aOldLibLinkName;
867 wxCHECK( parent, msg );
874 if( !sheets.
HasPath( instance.m_Path ) )
877 if( references.IsEmpty() )
878 references = instance.m_Reference;
880 references += wxT(
" " ) + instance.m_Reference;
887 msg.Printf(
_(
"Update symbol %s from '%s' to '%s'" ),
894 msg.Printf(
_(
"Update symbols %s from '%s' to '%s'" ),
904 msg.Printf(
_(
"Change symbol %s from '%s' to '%s'" ),
911 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.
Calculate the connectivity of a schematic and generates netlists.
void ExchangeItem(SCH_ITEM *aOldItem, SCH_ITEM *aNewItem)
Replace all references to #aOldItem with #aNewItem in the graph.
Class DIALOG_CHANGE_SYMBOLS_BASE.
wxCheckListBox * m_fieldsBox
STD_BITMAP_BUTTON * m_newIdBrowserButton
wxTextCtrl * m_specifiedValue
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
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...
const VECTOR2I & GetTextPos() const
virtual const wxString & GetText() const
Return the string associated with the text object.
virtual bool IsVisible() const
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.
CONNECTION_GRAPH * ConnectionGraph() const
SCH_SHEET_PATH & CurrentSheet() const
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
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.
SCHEMATIC * Schematic() const
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.
void Clear()
Clears the report panel.
void SetLazyUpdate(bool aLazyUpdate)
Set the lazy update.
void SetFileName(const wxString &aReportFileName)
Set the report full file name to the string.
void Report(const wxString &aText, SEVERITY aSeverity, REPORTER::LOCATION aLocation=REPORTER::LOC_BODY)
Report the string.
void Flush(bool aSort=false)
Force updating the HTML page, after the report is built in lazy mode If aSort = true,...
bool g_resetAlternatePins[2]
bool g_resetFieldEffects[2]
bool g_resetFieldPositions[2]
bool g_resetAttributes[2]
bool g_removeExtraFields[2]
bool g_resetFieldVisibilities[2]
bool g_resetEmptyFields[2]
wxString getLibIdValue(const wxTextCtrl *aCtrl)
bool g_resetCustomPower[2]
bool g_resetPinVisibilities[2]
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)
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...
wxString GetCanonicalFieldName(FIELD_T aFieldType)