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-2022 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>
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>
39
40bool g_selectRefDes = false;
41bool g_selectValue = false;
42 // { change, update }
43bool g_removeExtraFields[2] = { false, false };
44bool g_resetEmptyFields[2] = { false, false };
45bool g_resetFieldText[2] = { true, true };
46bool g_resetFieldVisibilities[2] = { true, false };
47bool g_resetFieldEffects[2] = { true, false };
48bool g_resetFieldPositions[2] = { true, false };
49bool g_resetAttributes[2] = { true, false };
50
51
53 MODE aMode ) :
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
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 ] );
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 wxString okLabel = m_mode == MODE::CHANGE ? _( "Change" ) : _( "Update" );
155
156 SetupStandardButtons( { { wxID_OK, okLabel },
157 { wxID_CANCEL, _( "Close" ) } } );
158
159 // Now all widgets have the size fixed, call FinishDialogSettings
161}
162
163
164void DIALOG_CHANGE_SYMBOLS::onMatchByAll( wxCommandEvent& aEvent )
165{
167}
168
169
170void DIALOG_CHANGE_SYMBOLS::onMatchBySelected( wxCommandEvent& aEvent )
171{
173}
174
175
176void DIALOG_CHANGE_SYMBOLS::onMatchByReference( wxCommandEvent& aEvent )
177{
179 m_specifiedReference->SetFocus();
180}
181
182
183void DIALOG_CHANGE_SYMBOLS::onMatchByValue( wxCommandEvent& aEvent )
184{
186 m_specifiedValue->SetFocus();
187}
188
189
190void DIALOG_CHANGE_SYMBOLS::onMatchById( wxCommandEvent& aEvent )
191{
193 m_specifiedId->SetFocus();
194}
195
196
198{
200 event.Skip(); // Mandatory in wxFocusEvent
201}
202
203
205{
207 event.Skip(); // Mandatory in wxFocusEvent
208}
209
210
212{
214 event.Skip(); // Mandatory in wxFocusEvent
215}
216
217
219{
221 g_selectValue = m_fieldsBox->IsChecked( VALUE_FIELD );
222
223 g_removeExtraFields[ (int) m_mode ] = m_removeExtraBox->GetValue();
224 g_resetEmptyFields[ (int) m_mode ] = m_resetEmptyFields->GetValue();
225 g_resetFieldText[ (int) m_mode ] = m_resetFieldText->GetValue();
227 g_resetFieldEffects[ (int) m_mode ] = m_resetFieldEffects->GetValue();
229 g_resetAttributes[ (int) m_mode ] = m_resetAttributes->GetValue();
230}
231
232
233wxString getLibIdValue( const wxTextCtrl* aCtrl )
234{
235 wxString rawValue = aCtrl->GetValue();
236 wxString itemName;
237 wxString libName = rawValue.BeforeFirst( ':', &itemName );
238
239 return EscapeString( libName, CTX_LIBID ) + ':' + EscapeString( itemName, CTX_LIBID );
240}
241
242
244{
245 wxString newName = getLibIdValue( m_specifiedId );
246
248
249 if( frame->ShowModal( &newName, this ) )
250 {
251 m_specifiedId->SetValue( UnescapeString( newName ) );
253 }
254
255 frame->Destroy();
256}
257
258
260{
261 wxString newName = getLibIdValue( m_newId );
262
264
265 if( frame->ShowModal( &newName, this ) )
266 {
267 m_newId->SetValue( UnescapeString( newName ) );
269 }
270
271 frame->Destroy();
272}
273
274
276{
277 SCH_EDIT_FRAME* frame = dynamic_cast<SCH_EDIT_FRAME*>( GetParent() );
278
279 wxCHECK( frame, /* void */ );
280
281 SCH_SHEET_LIST hierarchy = frame->Schematic().GetSheets();
282
283 // Load non-mandatory fields from all matching symbols and their library symbols
284 std::vector<SCH_FIELD*> fields;
285 std::vector<LIB_FIELD*> libFields;
286 std::set<wxString> fieldNames;
287
288 for( SCH_SHEET_PATH& instance : hierarchy )
289 {
290 SCH_SCREEN* screen = instance.LastScreen();
291
292 wxCHECK2( screen, continue );
293
294 for( SCH_ITEM* item : screen->Items().OfType( SCH_SYMBOL_T ) )
295 {
296 SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( item );
297
298 wxCHECK2( symbol, continue );
299
300 if( !isMatch( symbol, &instance ) )
301 continue;
302
303 fields.clear();
304 symbol->GetFields( fields, false );
305
306 for( unsigned i = MANDATORY_FIELDS; i < fields.size(); ++i )
307 fieldNames.insert( fields[i]->GetName() );
308
309 if( m_mode == MODE::UPDATE && symbol->GetLibId().IsValid() )
310 {
311 LIB_SYMBOL* libSymbol = frame->GetLibSymbol( symbol->GetLibId() );
312
313 if( libSymbol )
314 {
315 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->Flatten();
316
317 flattenedSymbol->GetFields( libFields );
318
319 for( unsigned i = MANDATORY_FIELDS; i < libFields.size(); ++i )
320 fieldNames.insert( libFields[i]->GetName() );
321
322 libFields.clear(); // flattenedSymbol is about to go out of scope...
323 }
324 }
325 }
326 }
327
328 // Load non-mandatory fields from the change-to library symbol
329 if( m_mode == MODE::CHANGE )
330 {
331 LIB_ID newId;
332
333 newId.Parse( getLibIdValue( m_newId ) );
334
335 if( newId.IsValid() )
336 {
337 LIB_SYMBOL* libSymbol = frame->GetLibSymbol( newId );
338
339 if( libSymbol )
340 {
341 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->Flatten();
342
343 flattenedSymbol->GetFields( libFields );
344
345 for( unsigned i = MANDATORY_FIELDS; i < libFields.size(); ++i )
346 fieldNames.insert( libFields[i]->GetName() );
347
348 libFields.clear(); // flattenedSymbol is about to go out of scope...
349 }
350 }
351 }
352
353 // Update the listbox widget
354 for( unsigned i = m_fieldsBox->GetCount() - 1; i >= MANDATORY_FIELDS; --i )
355 m_fieldsBox->Delete( i );
356
357 for( const wxString& fieldName : fieldNames )
358 m_fieldsBox->Append( fieldName );
359
360 for( unsigned i = MANDATORY_FIELDS; i < m_fieldsBox->GetCount(); ++i )
361 m_fieldsBox->Check( i, true );
362}
363
364
366{
367 for( unsigned i = 0; i < m_fieldsBox->GetCount(); ++i )
368 m_fieldsBox->Check( i, aCheck );
369}
370
371
372void DIALOG_CHANGE_SYMBOLS::onOkButtonClicked( wxCommandEvent& aEvent )
373{
374 wxBusyCursor dummy;
375 SCH_EDIT_FRAME* parent = dynamic_cast<SCH_EDIT_FRAME*>( GetParent() );
376
377 wxCHECK( parent, /* void */ );
378
380 m_messagePanel->Flush( false );
381
382 // Create the set of fields to be updated. Use non translated (canonical) names
383 // for mandatory fields
384 m_updateFields.clear();
385
386 for( unsigned i = 0; i < m_fieldsBox->GetCount(); ++i )
387 {
388 if( m_fieldsBox->IsChecked( i ) )
389 {
390 if( i < MANDATORY_FIELDS )
391 {
392 LIB_FIELD dummy_field( i );
393 m_updateFields.insert( dummy_field.GetCanonicalName() );
394 }
395 else
396 m_updateFields.insert( m_fieldsBox->GetString( i ) );
397 }
398 }
399
401 {
402 parent->TestDanglingEnds(); // This will also redraw the changed symbols.
403 parent->OnModify();
404 }
405
406 m_messagePanel->Flush( false );
407}
408
409
411{
412 LIB_ID id;
413
414 wxCHECK( aSymbol, false );
415
416 SCH_EDIT_FRAME* frame = dynamic_cast<SCH_EDIT_FRAME*>( GetParent() );
417
418 wxCHECK( frame, false );
419
420 if( m_matchAll->GetValue() )
421 {
422 return true;
423 }
424 else if( m_matchBySelection->GetValue() )
425 {
426 return aSymbol == m_symbol || aSymbol->IsSelected();
427 }
428 else if( m_matchByReference->GetValue() )
429 {
430 return WildCompareString( m_specifiedReference->GetValue(),
431 aSymbol->GetRef( aInstance, false ), false );
432 }
433 else if( m_matchByValue->GetValue() )
434 {
435 return WildCompareString( m_specifiedValue->GetValue(),
436 aSymbol->GetValue( aInstance, false ), false );
437 }
438 else if( m_matchById )
439 {
440 id.Parse( getLibIdValue( m_specifiedId ) );
441 return aSymbol->GetLibId() == id;
442 }
443
444 return false;
445}
446
447
449{
450 SCH_EDIT_FRAME* frame = dynamic_cast<SCH_EDIT_FRAME*>( GetParent() );
451
452 wxCHECK( frame, false );
453
454 LIB_ID newId;
455 bool appendToUndo = false;
456 bool changed = false;
457 SCH_SHEET_LIST hierarchy = frame->Schematic().GetSheets();
458
459 if( m_mode == MODE::CHANGE )
460 {
461 newId.Parse( getLibIdValue( m_newId ) );
462
463 if( !newId.IsValid() )
464 return false;
465 }
466
467 for( SCH_SHEET_PATH& instance : hierarchy )
468 {
469 SCH_SCREEN* screen = instance.LastScreen();
470
471 wxCHECK2( screen, continue );
472
473 std::vector<SCH_SYMBOL*> symbols;
474
475 for( SCH_ITEM* item : screen->Items().OfType( SCH_SYMBOL_T ) )
476 symbols.push_back( static_cast<SCH_SYMBOL*>( item ) );
477
478 for( SCH_SYMBOL* symbol : symbols )
479 {
480 if( !isMatch( symbol, &instance ) )
481 continue;
482
483 if( m_mode == MODE::UPDATE )
484 {
485 if( processSymbol( symbol, &instance, symbol->GetLibId(), appendToUndo ) )
486 changed = true;
487 }
488 else
489 {
490 if( processSymbol( symbol, &instance, newId, appendToUndo ) )
491 changed = true;
492 }
493
494 if( changed )
495 appendToUndo = true;
496 }
497 }
498
500
501 return changed;
502}
503
504
506 const LIB_ID& aNewId, bool aAppendToUndo )
507{
508 wxCHECK( aSymbol, false );
509 wxCHECK( aNewId.IsValid(), false );
510
511 SCH_EDIT_FRAME* frame = dynamic_cast<SCH_EDIT_FRAME*>( GetParent() );
512 SCH_SCREEN* screen = aInstance->LastScreen();
513
514 wxCHECK( frame, false );
515
516 LIB_ID oldId = aSymbol->GetLibId();
517 wxString msg;
518 wxString references;
519
520 for( SYMBOL_INSTANCE_REFERENCE instance : aSymbol->GetInstanceReferences() )
521 {
522 if( references.IsEmpty() )
523 references = instance.m_Reference;
524 else
525 references += " " + instance.m_Reference;
526 }
527
528 if( m_mode == MODE::UPDATE )
529 {
530 if( aSymbol->GetInstanceReferences().size() == 1 )
531 {
532 msg.Printf( _( "Update symbol %s from '%s' to '%s'" ),
533 references,
534 UnescapeString( oldId.Format() ),
535 UnescapeString( aNewId.Format() ) );
536 }
537 else
538 {
539 msg.Printf( _( "Update symbols %s from '%s' to '%s'" ),
540 references,
541 UnescapeString( oldId.Format() ),
542 UnescapeString( aNewId.Format() ) );
543 }
544 }
545 else
546 {
547 if( aSymbol->GetInstanceReferences().size() == 1 )
548 {
549 msg.Printf( _( "Change symbol %s from '%s' to '%s'" ),
550 references,
551 UnescapeString( oldId.Format() ),
552 UnescapeString( aNewId.Format() ) );
553 }
554 else
555 {
556 msg.Printf( _( "Change symbols %s from '%s' to '%s'" ),
557 references,
558 UnescapeString( oldId.Format() ),
559 UnescapeString( aNewId.Format() ) );
560 }
561 }
562
563 LIB_SYMBOL* libSymbol = frame->GetLibSymbol( aNewId );
564
565 if( !libSymbol )
566 {
567 msg << ": " << _( "*** symbol not found ***" );
569 return false;
570 }
571
572 std::unique_ptr<LIB_SYMBOL> flattenedSymbol = libSymbol->Flatten();
573
574 if( flattenedSymbol->GetUnitCount() < aSymbol->GetUnit() )
575 {
576 msg << ": " << _( "*** new symbol has too few units ***" );
578 return false;
579 }
580
581 // Removing the symbol needs to be done before the LIB_SYMBOL is changed to prevent stale
582 // library symbols in the schematic file.
583 screen->Remove( aSymbol );
584 frame->SaveCopyInUndoList( screen, aSymbol, UNDO_REDO::CHANGED, aAppendToUndo );
585
586 if( aNewId != aSymbol->GetLibId() )
587 aSymbol->SetLibId( aNewId );
588
589 aSymbol->SetLibSymbol( flattenedSymbol.release() );
590
591 if( m_resetAttributes->GetValue() )
592 {
593 aSymbol->SetIncludeInBom( libSymbol->GetIncludeInBom() );
594 aSymbol->SetIncludeOnBoard( libSymbol->GetIncludeOnBoard() );
595 }
596
597 bool removeExtras = m_removeExtraBox->GetValue();
598 bool resetVis = m_resetFieldVisibilities->GetValue();
599 bool resetEffects = m_resetFieldEffects->GetValue();
600 bool resetPositions = m_resetFieldPositions->GetValue();
601
602 for( unsigned i = 0; i < aSymbol->GetFields().size(); ++i )
603 {
604 SCH_FIELD& field = aSymbol->GetFields()[i];
605 LIB_FIELD* libField = nullptr;
606
607 // Mandatory fields always exist in m_updateFields, but these names can be translated.
608 // so use GetCanonicalName().
610 continue;
611
612 if( i < MANDATORY_FIELDS )
613 libField = libSymbol->GetFieldById( (int) i );
614 else
615 libField = libSymbol->FindField( field.GetName() );
616
617 if( libField )
618 {
619 bool resetText = libField->GetText().IsEmpty() ? m_resetEmptyFields->GetValue()
620 : m_resetFieldText->GetValue();
621
622 if( resetText )
623 {
624 if( i == REFERENCE_FIELD )
625 aSymbol->SetRef( aInstance, UTIL::GetRefDesUnannotated( libField->GetText() ) );
626 else if( i == VALUE_FIELD )
627 aSymbol->SetValue( aInstance, UnescapeString( libField->GetText() ) );
628 else if( i == FOOTPRINT_FIELD )
629 aSymbol->SetFootprint( aInstance, libField->GetText() );
630 else
631 field.SetText( libField->GetText() );
632 }
633
634 if( resetVis )
635 field.SetVisible( libField->IsVisible() );
636
637 if( resetEffects )
638 {
639 // Careful: the visible bit and position are also set by SetAttributes()
640 bool visible = field.IsVisible();
641 VECTOR2I pos = field.GetPosition();
642
643 field.SetAttributes( *libField );
644
645 field.SetVisible( visible );
646 field.SetPosition( pos );
647 field.SetNameShown( libField->IsNameShown() );
648 field.SetCanAutoplace( libField->CanAutoplace() );
649 }
650
651 if( resetPositions )
652 field.SetTextPos( aSymbol->GetPosition() + libField->GetTextPos() );
653 }
654 else if( i >= MANDATORY_FIELDS && removeExtras )
655 {
656 aSymbol->RemoveField( field.GetName() );
657 i--;
658 }
659 }
660
661 std::vector<LIB_FIELD*> libFields;
662 libSymbol->GetFields( libFields );
663
664 for( unsigned i = MANDATORY_FIELDS; i < libFields.size(); ++i )
665 {
666 const LIB_FIELD& libField = *libFields[i];
667
668 if( !alg::contains( m_updateFields, libField.GetCanonicalName() ) )
669 continue;
670
671 if( !aSymbol->FindField( libField.GetName(), false ) )
672 {
673 wxString fieldName = libField.GetCanonicalName();
674 SCH_FIELD newField( VECTOR2I( 0, 0 ), aSymbol->GetFieldCount(), aSymbol, fieldName );
675 SCH_FIELD* schField = aSymbol->AddField( newField );
676
677 // Careful: the visible bit and position are also set by SetAttributes()
678 schField->SetAttributes( libField );
679 schField->SetText( libField.GetText() );
680 schField->SetTextPos( aSymbol->GetPosition() + libField.GetTextPos() );
681 }
682 }
683
684 if( resetPositions && frame->eeconfig()->m_AutoplaceFields.enable )
685 aSymbol->AutoAutoplaceFields( screen );
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
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
@ small_library
Class DIALOG_CHANGE_SYMBOLS_BASE.
WX_HTML_REPORT_PANEL * m_messagePanel
void onNewLibIDKillFocus(wxFocusEvent &event) override
void onMatchBySelected(wxCommandEvent &aEvent) override
MODE m_mode
Set of field names that should have values updated.
bool isMatch(SCH_SYMBOL *aSymbol, SCH_SHEET_PATH *aInstance)
void onOkButtonClicked(wxCommandEvent &aEvent) override
std::set< wxString > m_updateFields
void onMatchById(wxCommandEvent &aEvent) override
void launchMatchIdSymbolBrowser(wxCommandEvent &aEvent) override
void onMatchByReference(wxCommandEvent &aEvent) override
void onMatchByValue(wxCommandEvent &aEvent) override
bool processSymbol(SCH_SYMBOL *aSymbol, const SCH_SHEET_PATH *aInstance, const LIB_ID &aNewId, bool aAppendToUndo)
DIALOG_CHANGE_SYMBOLS(SCH_EDIT_FRAME *aParent, SCH_SYMBOL *aSymbol, MODE aMode=MODE::UPDATE)
void onMatchTextKillFocus(wxFocusEvent &event) override
void onMatchIDKillFocus(wxFocusEvent &event) override
void launchNewIdSymbolBrowser(wxCommandEvent &aEvent) override
void onMatchByAll(wxCommandEvent &aEvent) override
void SetupStandardButtons(std::map< int, wxString > aLabels={})
std::string m_hash_key
Definition: dialog_shim.h:203
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
bool IsSelected() const
Definition: eda_item.h:107
const VECTOR2I & GetTextPos() const
Definition: eda_text.h:201
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:87
void SetAttributes(const EDA_TEXT &aSrc)
Set the text attributes from another instance.
Definition: eda_text.cpp:264
virtual bool IsVisible() const
Definition: eda_text.h:129
void SetTextPos(const VECTOR2I &aPoint)
Definition: eda_text.cpp:371
virtual void SetVisible(bool aVisible)
Definition: eda_text.cpp:217
virtual void SetText(const wxString &aText)
Definition: eda_text.cpp:163
AUTOPLACE_FIELDS m_AutoplaceFields
EE_TYPE OfType(KICAD_T aType) const
Definition: sch_rtree.h:238
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
Definition: view.cpp:1574
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.
Definition: kiway_holder.h:53
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
Definition: kiway_player.h:66
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...
bool Destroy() override
Our version of Destroy() which is virtual from wxWidgets.
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:394
Field object used in symbol libraries.
Definition: lib_field.h:60
bool CanAutoplace() const
Definition: lib_field.h:184
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
Definition: lib_field.cpp:470
bool IsNameShown() const
Definition: lib_field.h:181
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:479
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:49
int Parse(const UTF8 &aId, bool aFix=false)
Parse LIB_ID with the information from aId.
Definition: lib_id.cpp:50
bool IsValid() const
Check if this LID_ID is valid.
Definition: lib_id.h:165
UTF8 Format() const
Definition: lib_id.cpp:117
Define a library symbol object.
Definition: lib_symbol.h:98
LIB_FIELD * GetFieldById(int aId) const
Return pointer to the requested field.
bool GetIncludeOnBoard() const
Definition: lib_symbol.h:660
void GetFields(std::vector< LIB_FIELD * > &aList)
Return a list of fields within this symbol.
LIB_FIELD * FindField(const wxString &aFieldName)
Find a field within this symbol matching aFieldName and returns it or NULL if not found.
bool GetIncludeInBom() const
Definition: lib_symbol.h:652
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
Definition: lib_symbol.cpp:460
SCH_SHEET_PATH & CurrentSheet() const override
Definition: schematic.h:120
SCH_SHEET_LIST GetSheets() const override
Builds and returns an updated schematic hierarchy TODO: can this be cached?
Definition: schematic.h:86
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.
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
Schematic editor (Eeschema) main window.
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag and update other data struc...
void SaveCopyInUndoList(SCH_SCREEN *aScreen, SCH_ITEM *aItemToCopy, UNDO_REDO aTypeCommand, bool aAppend, bool aDirtyConnectivity=true)
Create a copy of the current schematic item, and put it in the undo list.
SCH_SHEET_PATH & GetCurrentSheet() const
SCHEMATIC & Schematic() const
void TestDanglingEnds()
Test all of the connectable objects in the schematic for unused connection points.
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
Definition: sch_field.h:50
VECTOR2I GetPosition() const override
Definition: sch_field.cpp:1070
void SetCanAutoplace(bool aCanPlace)
Definition: sch_field.h:153
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:859
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
Definition: sch_field.cpp:827
void SetPosition(const VECTOR2I &aPosition) override
Definition: sch_field.cpp:1050
void SetNameShown(bool aShown=true)
Definition: sch_field.h:150
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:147
void AutoAutoplaceFields(SCH_SCREEN *aScreen)
Autoplace fields only if correct to do so automatically.
Definition: sch_item.h:436
bool Remove(SCH_ITEM *aItem)
Remove aItem from the schematic associated with this screen.
Definition: sch_screen.cpp:268
EE_RTREE & Items()
Gets the full RTree, usually for iterating.
Definition: sch_screen.h:109
void Append(SCH_ITEM *aItem)
Definition: sch_screen.cpp:141
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
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.
SCH_SCREEN * LastScreen()
Schematic symbol object.
Definition: sch_symbol.h:80
const std::vector< SYMBOL_INSTANCE_REFERENCE > & GetInstanceReferences()
Definition: sch_symbol.h:139
void SetLibId(const LIB_ID &aName)
Definition: sch_symbol.cpp:282
void SetValue(const SCH_SHEET_PATH *sheet, const wxString &aValue)
Definition: sch_symbol.cpp:798
int GetUnit() const
Definition: sch_symbol.h:225
int GetFieldCount() const
Return the number of fields in this symbol.
Definition: sch_symbol.h:470
SCH_FIELD * FindField(const wxString &aFieldName, bool aIncludeDefaultFields=true)
Search for a SCH_FIELD with aFieldName.
Definition: sch_symbol.cpp:968
void SetIncludeOnBoard(bool aIncludeOnBoard)
Definition: sch_symbol.h:749
void RemoveField(const wxString &aFieldName)
Remove a user field from the symbol.
Definition: sch_symbol.cpp:955
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const
Return the reference for the given sheet path.
Definition: sch_symbol.cpp:635
void SetFootprint(const SCH_SHEET_PATH *sheet, const wxString &aFootprint)
Definition: sch_symbol.cpp:857
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:677
VECTOR2I GetPosition() const override
Definition: sch_symbol.h:718
void SetSchSymbolLibraryName(const wxString &aName)
The name of the symbol in the schematic library symbol list.
Definition: sch_symbol.h:185
SCH_FIELD * AddField(const SCH_FIELD &aField)
Add a field to the symbol.
Definition: sch_symbol.cpp:946
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:770
const LIB_ID & GetLibId() const
Definition: sch_symbol.h:172
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with SCH_FIELDs.
Definition: sch_symbol.cpp:931
void SetLibSymbol(LIB_SYMBOL *aLibSymbol)
Set this schematic symbol library symbol reference to aLibSymbol.
Definition: sch_symbol.cpp:301
void SetIncludeInBom(bool aIncludeInBom)
Definition: sch_symbol.h:746
void Clear()
return the number of messages matching the given severity mask.
void SetLazyUpdate(bool aLazyUpdate)
Forces updating the HTML page, after the report is built in lazy mode If aSort = true,...
void SetFileName(const wxString &aReportFileName)
void Report(const wxString &aText, SEVERITY aSeverity, REPORTER::LOCATION aLocation=REPORTER::LOC_BODY)
Reports the string.
void Flush(bool aSort=false)
Set the visible severity filter.
bool g_resetFieldEffects[2]
bool g_selectRefDes
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_resetFieldText[2]
bool g_selectValue
#define _(s)
@ FRAME_SCH_VIEWER_MODAL
Definition: frame_type.h:37
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:96
wxString GetRefDesUnannotated(const wxString &aSource)
Return an unannotated refdes from either a prefix or an existing refdes.
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
Definition: kicad_algo.h:99
Collection of utility functions for component reference designators (refdes)
@ RPT_SEVERITY_ERROR
@ RPT_SEVERITY_ACTION
Definition of the SCH_SHEET_PATH and SCH_SHEET_LIST classes for Eeschema.
static LIB_SYMBOL * dummy()
Used to draw a dummy shape when a LIB_SYMBOL is not found in library.
Definition: sch_symbol.cpp:74
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:...
@ CTX_LIBID
Definition: string_utils.h:55
A simple container for schematic symbol instance information.
static const wxString GetDefaultFieldName(int aFieldNdx, bool aTranslateForHI=false)
Return a default symbol field name for field aFieldNdx for all components.
#define DO_TRANSLATE
@ FOOTPRINT_FIELD
Field Name Module PCB, i.e. "16DIP300".
@ VALUE_FIELD
Field Value of part, i.e. "3.3K".
@ MANDATORY_FIELDS
The first 4 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors.
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".
@ SCH_SYMBOL_T
Definition: typeinfo.h:156
VECTOR2< int > VECTOR2I
Definition: vector2d.h:618