KiCad PCB EDA Suite
dialog_change_symbols.cpp
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2020-2021 CERN
5  * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
6  *
7  * @author Wayne Stambaugh <[email protected]>
8  *
9  * This program is free software: you can redistribute it and/or modify it
10  * under the terms of the GNU General Public License as published by the
11  * Free Software Foundation, either version 3 of the License, or (at your
12  * option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful, but
15  * WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License along
20  * with this program. If not, see <http://www.gnu.org/licenses/>.
21  */
22 
23 #include <algorithm>
24 
25 #include <bitmaps.h>
26 #include <string_utils.h> // WildCompareString
27 #include <kiway.h>
28 #include <lib_id.h>
29 #include <refdes_utils.h>
30 #include <core/kicad_algo.h>
31 #include <dialog_change_symbols.h>
32 #include <sch_symbol.h>
33 #include <sch_edit_frame.h>
34 #include <sch_screen.h>
35 #include <sch_sheet_path.h>
36 #include <schematic.h>
37 #include <template_fieldnames.h>
38 #include <wx_html_report_panel.h>
39 
40 bool g_selectRefDes = false;
41 bool g_selectValue = false;
42  // { change, update }
43 bool g_removeExtraFields[2] = { false, false };
44 bool g_resetEmptyFields[2] = { false, false };
45 bool g_resetFieldText[2] = { true, true };
46 bool g_resetFieldVisibilities[2] = { true, false };
47 bool g_resetFieldEffects[2] = { true, false };
48 bool g_resetFieldPositions[2] = { true, false };
49 bool g_resetAttributes[2] = { true, false };
50 
51 
53  MODE aMode ) :
54  DIALOG_CHANGE_SYMBOLS_BASE( aParent ),
55  m_symbol( aSymbol),
56  m_mode( aMode )
57 {
58  wxASSERT( aParent );
59 
60  if( m_mode == MODE::UPDATE )
61  {
62  m_newIdSizer->Show( false );
63  }
64  else
65  {
66  m_matchAll->SetLabel( _( "Change all symbols in schematic" ) );
67  SetTitle( _( "Change Symbols" ) );
68  m_matchSizer->FindItem( m_matchAll )->Show( false );
69  }
70 
71  if( m_symbol )
72  {
73  SCH_SHEET_PATH* currentSheet = &aParent->Schematic().CurrentSheet();
74 
75  if( m_mode == MODE::CHANGE )
76  m_matchBySelection->SetLabel( _( "Change selected symbol(s)" ) );
77 
78  m_newId->ChangeValue( UnescapeString( m_symbol->GetLibId().Format() ) );
79  m_specifiedReference->ChangeValue( m_symbol->GetRef( currentSheet ) );
80  m_specifiedValue->ChangeValue( m_symbol->GetValue( currentSheet, false ) );
81  m_specifiedId->ChangeValue( UnescapeString( m_symbol->GetLibId().Format() ) );
82  }
83  else
84  {
85  m_matchSizer->FindItem( m_matchBySelection )->Show( false );
86  }
87 
90 
91  if( m_mode == MODE::CHANGE )
92  {
93  m_matchByReference->SetLabel( _( "Change symbols matching reference designator:" ) );
94  m_matchByValue->SetLabel( _( "Change symbols matching value:" ) );
95  m_matchById->SetLabel( _( "Change symbols matching library identifier:" ) );
96  }
97 
98  m_matchSizer->SetEmptyCellSize( wxSize( 0, 0 ) );
99  m_matchSizer->Layout();
100 
101  for( int i = 0; i < MANDATORY_FIELDS; ++i )
102  {
104 
105  if( i == REFERENCE_FIELD )
106  m_fieldsBox->Check( i, g_selectRefDes );
107  else if( i == VALUE_FIELD )
108  m_fieldsBox->Check( i, g_selectValue );
109  else
110  m_fieldsBox->Check( i, true );
111  }
112 
113  m_messagePanel->SetLazyUpdate( true );
114  m_messagePanel->SetFileName( Prj().GetProjectPath() + wxT( "report.txt" ) );
115 
116  if( aSymbol && aSymbol->IsSelected() )
117  {
118  m_matchBySelection->SetValue( true );
119  }
120  else
121  {
122  if( aMode == MODE::UPDATE )
123  m_matchAll->SetValue( true );
124  else
125  m_matchByReference->SetValue( true );
126  }
127 
129 
130  if( m_mode == MODE::CHANGE )
131  {
132  m_updateFieldsSizer->GetStaticBox()->SetLabel( _( "Update Fields" ) );
133  m_removeExtraBox->SetLabel( _( "Remove fields if not in new symbol" ) );
134  m_resetEmptyFields->SetLabel( _( "Reset fields if empty in new symbol" ) );
135  m_resetFieldText->SetLabel( _( "Update field text" ) );
136  m_resetFieldVisibilities->SetLabel( _( "Update field visibilities" ) );
137  m_resetFieldEffects->SetLabel( _( "Update field sizes and styles" ) );
138  m_resetFieldPositions->SetLabel( _( "Update field positions" ) );
139  m_resetAttributes->SetLabel( _( "Update symbol attributes" ) );
140  }
141 
142  m_removeExtraBox->SetValue( g_removeExtraFields[ (int) m_mode ] );
143  m_resetEmptyFields->SetValue( g_resetEmptyFields[ (int) m_mode ] );
144  m_resetFieldText->SetValue( g_resetFieldText[ (int) m_mode ] );
146  m_resetFieldEffects->SetValue( g_resetFieldEffects[ (int) m_mode ] );
147  m_resetFieldPositions->SetValue( g_resetFieldPositions[ (int) m_mode ] );
148  m_resetAttributes->SetValue( g_resetAttributes[ (int) m_mode ] );
149 
150  // DIALOG_SHIM needs a unique hash_key because classname is not sufficient
151  // because the update and change versions of this dialog have different controls.
152  m_hash_key = TO_UTF8( GetTitle() );
153 
154  // Ensure m_closeButton (with id = wxID_CANCEL) has the right label
155  // (to fix automatic renaming of button label )
156  m_sdbSizerCancel->SetLabel( _( "Close" ) );
157 
158  if( m_mode == MODE::CHANGE )
159  m_sdbSizerOK->SetLabel( _( "Change" ) );
160  else
161  m_sdbSizerOK->SetLabel( _( "Update" ) );
162 
163  m_sdbSizerOK->SetDefault();
164 
165  // Now all widgets have the size fixed, call FinishDialogSettings
167 }
168 
169 
170 void DIALOG_CHANGE_SYMBOLS::onMatchByAll( wxCommandEvent& aEvent )
171 {
173 }
174 
175 
176 void DIALOG_CHANGE_SYMBOLS::onMatchBySelected( wxCommandEvent& aEvent )
177 {
179 }
180 
181 
182 void DIALOG_CHANGE_SYMBOLS::onMatchByReference( wxCommandEvent& aEvent )
183 {
185  m_specifiedReference->SetFocus();
186 }
187 
188 
189 void DIALOG_CHANGE_SYMBOLS::onMatchByValue( wxCommandEvent& aEvent )
190 {
192  m_specifiedValue->SetFocus();
193 }
194 
195 
196 void DIALOG_CHANGE_SYMBOLS::onMatchById( wxCommandEvent& aEvent )
197 {
199  m_specifiedId->SetFocus();
200 }
201 
202 
204 {
206  event.Skip(); // Mandatory in wxFocusEvent
207 }
208 
209 
210 void DIALOG_CHANGE_SYMBOLS::onMatchIDKillFocus( wxFocusEvent& event )
211 {
213  event.Skip(); // Mandatory in wxFocusEvent
214 }
215 
216 
218 {
220  event.Skip(); // Mandatory in wxFocusEvent
221 }
222 
223 
225 {
227  g_selectValue = m_fieldsBox->IsChecked( VALUE_FIELD );
228 
229  g_removeExtraFields[ (int) m_mode ] = m_removeExtraBox->GetValue();
230  g_resetEmptyFields[ (int) m_mode ] = m_resetEmptyFields->GetValue();
231  g_resetFieldText[ (int) m_mode ] = m_resetFieldText->GetValue();
233  g_resetFieldEffects[ (int) m_mode ] = m_resetFieldEffects->GetValue();
234  g_resetFieldPositions[ (int) m_mode ] = m_resetFieldPositions->GetValue();
235  g_resetAttributes[ (int) m_mode ] = m_resetAttributes->GetValue();
236 }
237 
238 
239 wxString getLibIdValue( const wxTextCtrl* aCtrl )
240 {
241  wxString rawValue = aCtrl->GetValue();
242  wxString itemName;
243  wxString libName = rawValue.BeforeFirst( ':', &itemName );
244 
245  return EscapeString( libName, CTX_LIBID ) + ':' + EscapeString( itemName, CTX_LIBID );
246 }
247 
248 
250 {
251  wxString newName = getLibIdValue( m_specifiedId );
252 
253  KIWAY_PLAYER* frame = Kiway().Player( FRAME_SCH_VIEWER_MODAL, true );
254 
255  if( frame->ShowModal( &newName, this ) )
256  {
257  m_specifiedId->SetValue( UnescapeString( newName ) );
259  }
260 
261  frame->Destroy();
262 }
263 
264 
266 {
267  wxString newName = getLibIdValue( m_newId );
268 
269  KIWAY_PLAYER* frame = Kiway().Player( FRAME_SCH_VIEWER_MODAL, true );
270 
271  if( frame->ShowModal( &newName, this ) )
272  {
273  m_newId->SetValue( UnescapeString( newName ) );
275  }
276 
277  frame->Destroy();
278 }
279 
280 
282 {
283  SCH_EDIT_FRAME* frame = dynamic_cast<SCH_EDIT_FRAME*>( GetParent() );
284 
285  wxCHECK( frame, /* void */ );
286 
287  SCH_SHEET_LIST hierarchy = frame->Schematic().GetSheets();
288 
289  // Load non-mandatory fields from all matching symbols and their library symbols
290  std::vector<SCH_FIELD*> fields;
291  std::vector<LIB_FIELD*> libFields;
292  std::set<wxString> fieldNames;
293 
294  for( SCH_SHEET_PATH& instance : hierarchy )
295  {
296  SCH_SCREEN* screen = instance.LastScreen();
297 
298  wxCHECK2( screen, continue );
299 
300  for( SCH_ITEM* item : screen->Items().OfType( SCH_SYMBOL_T ) )
301  {
302  SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( item );
303 
304  wxCHECK2( symbol, continue );
305 
306  if( !isMatch( symbol, &instance ) )
307  continue;
308 
309  fields.clear();
310  symbol->GetFields( fields, false );
311 
312  for( unsigned i = MANDATORY_FIELDS; i < fields.size(); ++i )
313  fieldNames.insert( fields[i]->GetName() );
314 
315  if( m_mode == MODE::UPDATE && symbol->GetLibId().IsValid() )
316  {
317  LIB_SYMBOL* libSymbol = frame->GetLibSymbol( symbol->GetLibId() );
318 
319  if( libSymbol )
320  {
321  std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->Flatten();
322 
323  flattenedSymbol->GetFields( libFields );
324 
325  for( unsigned i = MANDATORY_FIELDS; i < libFields.size(); ++i )
326  fieldNames.insert( libFields[i]->GetName() );
327 
328  libFields.clear(); // flattenedSymbol is about to go out of scope...
329  }
330  }
331  }
332  }
333 
334  // Load non-mandatory fields from the change-to library symbol
335  if( m_mode == MODE::CHANGE )
336  {
337  LIB_ID newId;
338 
339  newId.Parse( getLibIdValue( m_newId ) );
340 
341  if( newId.IsValid() )
342  {
343  LIB_SYMBOL* libSymbol = frame->GetLibSymbol( newId );
344 
345  if( libSymbol )
346  {
347  std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->Flatten();
348 
349  flattenedSymbol->GetFields( libFields );
350 
351  for( unsigned i = MANDATORY_FIELDS; i < libFields.size(); ++i )
352  fieldNames.insert( libFields[i]->GetName() );
353 
354  libFields.clear(); // flattenedSymbol is about to go out of scope...
355  }
356  }
357  }
358 
359  // Update the listbox widget
360  for( unsigned i = m_fieldsBox->GetCount() - 1; i >= MANDATORY_FIELDS; --i )
361  m_fieldsBox->Delete( i );
362 
363  for( const wxString& fieldName : fieldNames )
364  m_fieldsBox->Append( fieldName );
365 
366  for( unsigned i = MANDATORY_FIELDS; i < m_fieldsBox->GetCount(); ++i )
367  m_fieldsBox->Check( i, true );
368 }
369 
370 
372 {
373  for( unsigned i = 0; i < m_fieldsBox->GetCount(); ++i )
374  m_fieldsBox->Check( i, aCheck );
375 }
376 
377 
378 void DIALOG_CHANGE_SYMBOLS::onOkButtonClicked( wxCommandEvent& aEvent )
379 {
380  wxBusyCursor dummy;
381  SCH_EDIT_FRAME* parent = dynamic_cast<SCH_EDIT_FRAME*>( GetParent() );
382 
383  wxCHECK( parent, /* void */ );
384 
386  m_messagePanel->Flush( false );
387 
388  // Create the set of fields to be updated. Use non translated (canonical) names
389  // for mandatory fields
390  m_updateFields.clear();
391 
392  for( unsigned i = 0; i < m_fieldsBox->GetCount(); ++i )
393  {
394  if( m_fieldsBox->IsChecked( i ) )
395  {
396  if( i < MANDATORY_FIELDS )
397  {
398  LIB_FIELD dummy_field( i );
399  m_updateFields.insert( dummy_field.GetCanonicalName() );
400  }
401  else
402  m_updateFields.insert( m_fieldsBox->GetString( i ) );
403  }
404  }
405 
406  if( processMatchingSymbols() )
407  {
408  parent->TestDanglingEnds(); // This will also redraw the changed symbols.
409  parent->OnModify();
410  }
411 
412  m_messagePanel->Flush( false );
413 }
414 
415 
417 {
418  LIB_ID id;
419 
420  wxCHECK( aSymbol, false );
421 
422  SCH_EDIT_FRAME* frame = dynamic_cast<SCH_EDIT_FRAME*>( GetParent() );
423 
424  wxCHECK( frame, false );
425 
426  if( m_matchAll->GetValue() )
427  {
428  return true;
429  }
430  else if( m_matchBySelection->GetValue() )
431  {
432  return aSymbol == m_symbol || aSymbol->IsSelected();
433  }
434  else if( m_matchByReference->GetValue() )
435  {
436  return WildCompareString( m_specifiedReference->GetValue(),
437  aSymbol->GetRef( aInstance, false ), false );
438  }
439  else if( m_matchByValue->GetValue() )
440  {
441  return WildCompareString( m_specifiedValue->GetValue(),
442  aSymbol->GetValue( aInstance, false ), false );
443  }
444  else if( m_matchById )
445  {
446  id.Parse( getLibIdValue( m_specifiedId ) );
447  return aSymbol->GetLibId() == id;
448  }
449 
450  return false;
451 }
452 
453 
455 {
456  SCH_EDIT_FRAME* frame = dynamic_cast<SCH_EDIT_FRAME*>( GetParent() );
457 
458  wxCHECK( frame, false );
459 
460  LIB_ID newId;
461  bool appendToUndo = false;
462  bool changed = false;
463  SCH_SHEET_LIST hierarchy = frame->Schematic().GetSheets();
464 
465  if( m_mode == MODE::CHANGE )
466  {
467  newId.Parse( getLibIdValue( m_newId ) );
468 
469  if( !newId.IsValid() )
470  return false;
471  }
472 
473  for( SCH_SHEET_PATH& instance : hierarchy )
474  {
475  SCH_SCREEN* screen = instance.LastScreen();
476 
477  wxCHECK2( screen, continue );
478 
479  std::vector<SCH_SYMBOL*> symbols;
480 
481  for( SCH_ITEM* item : screen->Items().OfType( SCH_SYMBOL_T ) )
482  symbols.push_back( static_cast<SCH_SYMBOL*>( item ) );
483 
484  for( SCH_SYMBOL* symbol : symbols )
485  {
486  if( !isMatch( symbol, &instance ) )
487  continue;
488 
489  if( m_mode == MODE::UPDATE )
490  {
491  if( processSymbol( symbol, &instance, symbol->GetLibId(), appendToUndo ) )
492  changed = true;
493  }
494  else
495  {
496  if( processSymbol( symbol, &instance, newId, appendToUndo ) )
497  changed = true;
498  }
499 
500  if( changed )
501  appendToUndo = true;
502  }
503  }
504 
506 
507  return changed;
508 }
509 
510 
512  const LIB_ID& aNewId, bool aAppendToUndo )
513 {
514  wxCHECK( aSymbol, false );
515  wxCHECK( aNewId.IsValid(), false );
516 
517  SCH_EDIT_FRAME* frame = dynamic_cast<SCH_EDIT_FRAME*>( GetParent() );
518  SCH_SCREEN* screen = aInstance->LastScreen();
519 
520  wxCHECK( frame, false );
521 
522  LIB_ID oldId = aSymbol->GetLibId();
523  wxString msg;
524  wxString references;
525 
526  for( SYMBOL_INSTANCE_REFERENCE instance : aSymbol->GetInstanceReferences() )
527  {
528  if( references.IsEmpty() )
529  references = instance.m_Reference;
530  else
531  references += " " + instance.m_Reference;
532  }
533 
534  if( m_mode == MODE::UPDATE )
535  {
536  if( aSymbol->GetInstanceReferences().size() == 1 )
537  {
538  msg.Printf( _( "Update symbol %s from '%s' to '%s'" ),
539  references,
540  UnescapeString( oldId.Format() ),
541  UnescapeString( aNewId.Format() ) );
542  }
543  else
544  {
545  msg.Printf( _( "Update symbols %s from '%s' to '%s'" ),
546  references,
547  UnescapeString( oldId.Format() ),
548  UnescapeString( aNewId.Format() ) );
549  }
550  }
551  else
552  {
553  if( aSymbol->GetInstanceReferences().size() == 1 )
554  {
555  msg.Printf( _( "Change symbol %s from '%s' to '%s'" ),
556  references,
557  UnescapeString( oldId.Format() ),
558  UnescapeString( aNewId.Format() ) );
559  }
560  else
561  {
562  msg.Printf( _( "Change symbols %s from '%s' to '%s'" ),
563  references,
564  UnescapeString( oldId.Format() ),
565  UnescapeString( aNewId.Format() ) );
566  }
567  }
568 
569  LIB_SYMBOL* libSymbol = frame->GetLibSymbol( aNewId );
570 
571  if( !libSymbol )
572  {
573  msg << ": " << _( "*** symbol not found ***" );
575  return false;
576  }
577 
578  std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->Flatten();
579 
580  if( flattenedSymbol->GetUnitCount() < aSymbol->GetUnit() )
581  {
582  msg << ": " << _( "*** new symbol has too few units ***" );
584  return false;
585  }
586 
587  // Removing the symbol needs to be done before the LIB_SYMBOL is changed to prevent stale
588  // library symbols in the schematic file.
589  screen->Remove( aSymbol );
590  frame->SaveCopyInUndoList( screen, aSymbol, UNDO_REDO::CHANGED, aAppendToUndo );
591 
592  if( aNewId != aSymbol->GetLibId() )
593  aSymbol->SetLibId( aNewId );
594 
595  aSymbol->SetLibSymbol( flattenedSymbol.release() );
596 
597  if( m_resetAttributes->GetValue() )
598  {
599  aSymbol->SetIncludeInBom( libSymbol->GetIncludeInBom() );
600  aSymbol->SetIncludeOnBoard( libSymbol->GetIncludeOnBoard() );
601  }
602 
603  bool removeExtras = m_removeExtraBox->GetValue();
604  bool resetVis = m_resetFieldVisibilities->GetValue();
605  bool resetEffects = m_resetFieldEffects->GetValue();
606  bool resetPositions = m_resetFieldPositions->GetValue();
607 
608  for( unsigned i = 0; i < aSymbol->GetFields().size(); ++i )
609  {
610  SCH_FIELD& field = aSymbol->GetFields()[i];
611  LIB_FIELD* libField = nullptr;
612 
613  // Mandatory fields always exist in m_updateFields, but these names can be translated.
614  // so use GetCanonicalName().
616  continue;
617 
618  if( i < MANDATORY_FIELDS )
619  libField = libSymbol->GetFieldById( (int) i );
620  else
621  libField = libSymbol->FindField( field.GetName() );
622 
623  if( libField )
624  {
625  bool resetText = libField->GetText().IsEmpty() ? m_resetEmptyFields->GetValue()
626  : m_resetFieldText->GetValue();
627 
628  if( resetText )
629  {
630  if( i == REFERENCE_FIELD )
631  aSymbol->SetRef( aInstance, UTIL::GetRefDesUnannotated( libField->GetText() ) );
632  else if( i == VALUE_FIELD )
633  aSymbol->SetValue( aInstance, UnescapeString( libField->GetText() ) );
634  else if( i == FOOTPRINT_FIELD )
635  aSymbol->SetFootprint( aInstance, libField->GetText() );
636  else
637  field.SetText( libField->GetText() );
638  }
639 
640  if( resetVis )
641  field.SetVisible( libField->IsVisible() );
642 
643  if( resetEffects )
644  {
645  // Careful: the visible bit and position are also in Effects
646  bool visible = field.IsVisible();
647  wxPoint pos = field.GetPosition();
648 
649  field.SetEffects( *libField );
650 
651  field.SetVisible( visible );
652  field.SetPosition( pos );
653  }
654 
655  if( resetPositions )
656  field.SetTextPos( aSymbol->GetPosition() + libField->GetTextPos() );
657  }
658  else if( i >= MANDATORY_FIELDS && removeExtras )
659  {
660  aSymbol->RemoveField( field.GetName() );
661  i--;
662  }
663  }
664 
665  std::vector<LIB_FIELD*> libFields;
666  libSymbol->GetFields( libFields );
667 
668  for( unsigned i = MANDATORY_FIELDS; i < libFields.size(); ++i )
669  {
670  const LIB_FIELD& libField = *libFields[i];
671 
672  if( !alg::contains( m_updateFields, libField.GetCanonicalName() ) )
673  continue;
674 
675  if( !aSymbol->FindField( libField.GetName(), false ) )
676  {
677  wxString fieldName = libField.GetCanonicalName();
678  SCH_FIELD newField( wxPoint( 0, 0), aSymbol->GetFieldCount(), aSymbol, fieldName );
679  SCH_FIELD* schField = aSymbol->AddField( newField );
680 
681  schField->SetEffects( libField );
682  schField->SetText( libField.GetText() );
683  schField->SetTextPos( aSymbol->GetPosition() + libField.GetTextPos() );
684  }
685  }
686 
687  aSymbol->SetSchSymbolLibraryName( wxEmptyString );
688  screen->Append( aSymbol );
689  frame->GetCanvas()->GetView()->Update( aSymbol );
690 
691  msg += ": OK";
693 
694  return true;
695 }
696 
697 
Field Reference of part, i.e. "IC21".
virtual bool ShowModal(wxString *aResult=nullptr, wxWindow *aResultantFocusWindow=nullptr)
Show this wxFrame as if it were a modal dialog, with all other instantiated wxFrames disabled until t...
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
LIB_FIELD * FindField(const wxString &aFieldName)
Find a field within this symbol matching aFieldName and returns it or NULL if not found.
EE_TYPE OfType(KICAD_T aType) const
Definition: sch_rtree.h:230
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
Definition: sch_field.h:49
void SetLazyUpdate(bool aLazyUpdate)
Forces updating the HTML page, after the report is built in lazy mode If aSort = true,...
wxString GetRefDesUnannotated(const wxString &aSource)
Return an unannotated refdes from either a prefix or an existing refdes.
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
Definition: kiway_player.h:64
bool g_resetAttributes[2]
bool Remove(SCH_ITEM *aItem)
Remove aItem from the schematic associated with this screen.
Definition: sch_screen.cpp:273
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
Definition: kiway_holder.h:53
void onMatchByReference(wxCommandEvent &aEvent) override
bool IsSelected() const
Definition: eda_item.h:122
wxString getLibIdValue(const wxTextCtrl *aCtrl)
std::string m_hash_key
Definition: dialog_shim.h:201
void SetEffects(const EDA_TEXT &aSrc)
Set the text effects from another instance.
Definition: eda_text.cpp:139
wxPoint GetPosition() const override
Definition: sch_field.cpp:842
Field object used in symbol libraries.
Definition: lib_field.h:59
void SetValue(const SCH_SHEET_PATH *sheet, const wxString &aValue)
Definition: sch_symbol.cpp:596
void Flush(bool aSort=false)
Set the visible severity filter.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with SCH_FIELDs.
Definition: sch_symbol.cpp:713
void SetTextPos(const wxPoint &aPoint)
Definition: eda_text.h:267
Collection of utility functions for component reference designators (refdes)
bool GetIncludeOnBoard() const
Definition: lib_symbol.h:604
void onNewLibIDKillFocus(wxFocusEvent &event) override
bool g_resetEmptyFields[2]
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:383
bool g_removeExtraFields[2]
Schematic editor (Eeschema) main window.
void SetLibId(const LIB_ID &aName)
Definition: sch_symbol.cpp:240
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const
Return the reference for the given sheet path.
Definition: sch_symbol.cpp:443
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:51
void UpdateAllScreenReferences()
Update all the symbol references for this sheet path.
bool IsValid() const
Check if this LID_ID is valid.
Definition: lib_id.h:159
Define a library symbol object.
Definition: lib_symbol.h:96
void SetFootprint(const SCH_SHEET_PATH *sheet, const wxString &aFootprint)
Definition: sch_symbol.cpp:647
void SetLibSymbol(LIB_SYMBOL *aLibSymbol)
Set this schematic symbol library symbol reference to aLibSymbol.
Definition: sch_symbol.cpp:259
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
Definition: lib_symbol.cpp:365
wxString GetName(bool aUseDefaultName=true) const
Return the field name.
Definition: lib_field.cpp:393
void GetFields(std::vector< LIB_FIELD * > &aList)
Return a list of fields within this symbol.
Definition: lib_symbol.cpp:967
void onMatchByAll(wxCommandEvent &aEvent) override
const std::vector< SYMBOL_INSTANCE_REFERENCE > & GetInstanceReferences()
Definition: sch_symbol.h:123
static LIB_SYMBOL * dummy()
Used to draw a dummy shape when a LIB_SYMBOL is not found in library.
Definition: sch_symbol.cpp:72
std::set< wxString > m_updateFields
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:96
bool g_resetFieldVisibilities[2]
void SetIncludeInBom(bool aIncludeInBom)
Definition: sch_symbol.h:663
virtual void SetVisible(bool aVisible)
Definition: eda_text.h:206
wxString GetCanonicalName() const
Get a non-language-specific name for a field which can be used for storage, variable look-up,...
Definition: sch_field.cpp:696
SCH_FIELD * AddField(const SCH_FIELD &aField)
Add a field to the symbol.
Definition: sch_symbol.cpp:723
bool g_resetFieldEffects[2]
Field Value of part, i.e. "3.3K".
virtual void SetText(const wxString &aText)
Definition: eda_text.cpp:124
void TestDanglingEnds()
Test all of the connectable objects in the schematic for unused connection points.
virtual bool IsVisible() const
Definition: eda_text.h:207
Class DIALOG_CHANGE_SYMBOLS_BASE.
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
int GetFieldCount() const
Return the number of fields in this symbol.
Definition: sch_symbol.h:424
wxString GetCanonicalName() const
Get a non-language-specific name for a field which can be used for storage, variable look-up,...
Definition: lib_field.cpp:402
SCHEMATIC & Schematic() const
A simple container for schematic symbol instance information.
void onMatchBySelected(wxCommandEvent &aEvent) override
#define _(s)
void SetSchSymbolLibraryName(const wxString &aName)
The name of the symbol in the schematic library symbol list.
Definition: sch_symbol.h:160
static const wxString GetDefaultFieldName(int aFieldNdx, bool aTranslate=true)
Return a default symbol field name for field aFieldNdx for all components.
void onMatchIDKillFocus(wxFocusEvent &event) override
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
void launchMatchIdSymbolBrowser(wxCommandEvent &aEvent) override
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
Definition: bitmap.cpp:105
const wxString GetValue(const SCH_SHEET_PATH *sheet, bool aResolve) const
Return the instance-specific value for the given sheet path.
Definition: sch_symbol.cpp:575
SCH_FIELD * FindField(const wxString &aFieldName, bool aIncludeDefaultFields=true)
Search for a SCH_FIELD with aFieldName.
Definition: sch_symbol.cpp:745
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
Definition: kicad_algo.h:99
bool g_selectValue
UTF8 Format() const
Definition: lib_id.cpp:116
wxString UnescapeString(const wxString &aSource)
void Report(const wxString &aText, SEVERITY aSeverity, REPORTER::LOCATION aLocation=REPORTER::LOC_BODY)
Reports the string.
void onMatchByValue(wxCommandEvent &aEvent) override
The first 4 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors.
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
SCH_SHEET_LIST GetSheets() const override
Builds and returns an updated schematic hierarchy TODO: can this be cached?
Definition: schematic.h:87
int Parse(const UTF8 &aId, bool aFix=false)
Parse LIB_ID with the information from aId.
Definition: lib_id.cpp:49
void SetIncludeOnBoard(bool aIncludeOnBoard)
Definition: sch_symbol.h:666
LIB_FIELD * GetFieldById(int aId) const
Return pointer to the requested field.
bool g_resetFieldText[2]
void launchNewIdSymbolBrowser(wxCommandEvent &aEvent) override
Schematic symbol object.
Definition: sch_symbol.h:78
bool processSymbol(SCH_SYMBOL *aSymbol, const SCH_SHEET_PATH *aInstance, const LIB_ID &aNewId, bool aAppendToUndo)
SCH_SCREEN * LastScreen()
void Clear()
return the number of messages matching the given severity mask.
void Append(SCH_ITEM *aItem)
Definition: sch_screen.cpp:146
WX_HTML_REPORT_PANEL * m_messagePanel
void onMatchById(wxCommandEvent &aEvent) override
void SetRef(const SCH_SHEET_PATH *aSheet, const wxString &aReference)
Set the reference for the given sheet path for this symbol.
Definition: sch_symbol.cpp:483
wxString GetName(bool aUseDefaultName=true) const
Return the field name.
Definition: sch_field.cpp:678
EE_RTREE & Items()
Gets the full RTree, usually for iterating.
Definition: sch_screen.h:110
wxPoint GetPosition() const override
Definition: sch_symbol.h:644
bool Destroy() override
Our version of Destroy() which is virtual from wxWidgets.
bool g_selectRefDes
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.
const wxPoint & GetTextPos() const
Definition: eda_text.h:268
SCH_SHEET_PATH & GetCurrentSheet() const
bool g_resetFieldPositions[2]
void onMatchTextKillFocus(wxFocusEvent &event) override
LIB_SYMBOL * GetLibSymbol(const LIB_ID &aLibId, bool aUseCacheLib=false, bool aShowErrorMsg=false)
Load symbol from symbol library table.
MODE m_mode
Set of field names that should have values updated.
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag of the current screen and u...
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
int GetUnit() const
Definition: sch_symbol.h:195
SCH_SHEET_PATH & CurrentSheet() const override
Definition: schematic.h:121
Definition of the SCH_SHEET_PATH and SCH_SHEET_LIST classes for Eeschema.
void SetFileName(const wxString &aReportFileName)
bool isMatch(SCH_SYMBOL *aSymbol, SCH_SHEET_PATH *aInstance)
void onOkButtonClicked(wxCommandEvent &aEvent) override
void SetPosition(const wxPoint &aPosition) override
Definition: sch_field.cpp:822
void RemoveField(const wxString &aFieldName)
Remove a user field from the symbol.
Definition: sch_symbol.cpp:732
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:182
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:154
DIALOG_CHANGE_SYMBOLS(SCH_EDIT_FRAME *aParent, SCH_SYMBOL *aSymbol, MODE aMode=MODE::UPDATE)
bool GetIncludeInBom() const
Definition: lib_symbol.h:596
const LIB_ID & GetLibId() const
Definition: sch_symbol.h:147
Field Name Module PCB, i.e. "16DIP300".