KiCad PCB EDA Suite
Loading...
Searching...
No Matches
sch_field.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) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#include <wx/log.h>
26#include <wx/menu.h>
27
28#include <advanced_config.h>
29#include <base_units.h>
30#include <common.h> // for ExpandTextVars
31#include <sch_edit_frame.h>
32#include <plotters/plotter.h>
33#include <bitmaps.h>
34#include <kiway.h>
36#include <string_utils.h>
38#include <trace_helpers.h>
39#include <tool/tool_manager.h>
41#include <font/outline_font.h>
42#include "sim/sim_lib_mgr.h"
43
44static const std::vector<KICAD_T> labelTypes = { SCH_LABEL_LOCATE_ANY_T };
45
46
48 SCH_ITEM( nullptr, SCH_FIELD_T ),
49 EDA_TEXT( schIUScale, wxEmptyString ),
50 m_id( FIELD_T::USER ),
51 m_ordinal( 0 ),
52 m_showName( false ),
53 m_allowAutoPlace( true ),
54 m_isGeneratedField( false ),
55 m_autoAdded( false ),
56 m_showInChooser( true ),
57 m_renderCacheValid( false ),
59{
60}
61
62
63SCH_FIELD::SCH_FIELD( SCH_ITEM* aParent, FIELD_T aFieldId, const wxString& aName ) :
64 SCH_FIELD()
65{
66 m_parent = aParent;
67
68 if( !aName.IsEmpty() )
69 SetName( aName );
70 else
72
73 setId( aFieldId ); // will also set the layer
74 SetVisible( true );
75
76 if( aParent && aParent->Schematic() )
77 {
78 SCHEMATIC_SETTINGS& settings = aParent->Schematic()->Settings();
80 }
81
82 if( aFieldId == FIELD_T::USER && aParent )
83 {
84 if( aParent->Type() == SCH_SYMBOL_T )
85 m_ordinal = static_cast<SCH_SYMBOL*>( aParent )->GetNextFieldOrdinal();
86 else if( aParent->Type() == LIB_SYMBOL_T )
87 m_ordinal = static_cast<LIB_SYMBOL*>( aParent )->GetNextFieldOrdinal();
88 else if( aParent->Type() == SCH_SHEET_T )
89 m_ordinal = static_cast<SCH_SHEET*>( aParent )->GetNextFieldOrdinal();
90 else if( SCH_LABEL_BASE* label = dynamic_cast<SCH_LABEL_BASE*>( aParent ) )
91 m_ordinal = label->GetNextFieldOrdinal();
92 }
93}
94
95
97 SCH_FIELD( aParent, FIELD_T::USER, wxEmptyString )
98{
99 SCH_ITEM::operator=( *aText );
100 EDA_TEXT::operator=( *aText );
101}
102
103
105 SCH_ITEM( aField ),
106 EDA_TEXT( aField )
107{
108 m_private = aField.m_private;
109 setId( aField.m_id ); // will also set the layer
110 m_ordinal = aField.m_ordinal;
111 m_name = aField.m_name;
112 m_showName = aField.m_showName;
115 m_autoAdded = aField.m_autoAdded;
117
118 m_renderCache.clear();
119
120 for( const std::unique_ptr<KIFONT::GLYPH>& glyph : aField.m_renderCache )
121 {
122 if( KIFONT::OUTLINE_GLYPH* outline = dynamic_cast<KIFONT::OUTLINE_GLYPH*>( glyph.get() ) )
123 m_renderCache.emplace_back( std::make_unique<KIFONT::OUTLINE_GLYPH>( *outline ) );
124 else if( KIFONT::STROKE_GLYPH* stroke = dynamic_cast<KIFONT::STROKE_GLYPH*>( glyph.get() ) )
125 m_renderCache.emplace_back( std::make_unique<KIFONT::STROKE_GLYPH>( *stroke ) );
126 }
127
130
132}
133
134
136{
137 EDA_TEXT::operator=( aField );
138
139 m_private = aField.m_private;
140 setId( aField.m_id ); // will also set the layer
141 m_ordinal = aField.m_ordinal;
142 m_name = aField.m_name;
143 m_showName = aField.m_showName;
146
147 m_renderCache.clear();
148
149 for( const std::unique_ptr<KIFONT::GLYPH>& glyph : aField.m_renderCache )
150 {
151 if( KIFONT::OUTLINE_GLYPH* outline = dynamic_cast<KIFONT::OUTLINE_GLYPH*>( glyph.get() ) )
152 m_renderCache.emplace_back( std::make_unique<KIFONT::OUTLINE_GLYPH>( *outline ) );
153 else if( KIFONT::STROKE_GLYPH* stroke = dynamic_cast<KIFONT::STROKE_GLYPH*>( glyph.get() ) )
154 m_renderCache.emplace_back( std::make_unique<KIFONT::STROKE_GLYPH>( *stroke ) );
155 }
156
159
161
162 return *this;
163}
164
165
167{
168 return new SCH_FIELD( *this );
169}
170
171
172void SCH_FIELD::Copy( SCH_FIELD* aTarget ) const
173{
174 *aTarget = *this;
175}
176
177
179{
180 m_id = aId;
182}
183
184
189
190
191wxString SCH_FIELD::GetShownText( const SCH_SHEET_PATH* aPath, bool aAllowExtraText, int aDepth ) const
192{
193 std::function<bool( wxString* )> libSymbolResolver =
194 [&]( wxString* token ) -> bool
195 {
196 LIB_SYMBOL* symbol = static_cast<LIB_SYMBOL*>( m_parent );
197 return symbol->ResolveTextVar( token, aDepth + 1 );
198 };
199
200 std::function<bool( wxString* )> symbolResolver =
201 [&]( wxString* token ) -> bool
202 {
203 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( m_parent );
204 return symbol->ResolveTextVar( aPath, token, aDepth + 1 );
205 };
206
207 std::function<bool( wxString* )> schematicResolver =
208 [&]( wxString* token ) -> bool
209 {
210 if( !aPath )
211 return false;
212
213 if( SCHEMATIC* schematic = Schematic() )
214 return schematic->ResolveTextVar( aPath, token, aDepth + 1 );
215
216 return false;
217 };
218
219 std::function<bool( wxString* )> sheetResolver =
220 [&]( wxString* token ) -> bool
221 {
222 if( !aPath )
223 return false;
224
225 SCH_SHEET* sheet = static_cast<SCH_SHEET*>( m_parent );
226
227 SCHEMATIC* schematic = Schematic();
228 SCH_SHEET_PATH path = *aPath;
229 path.push_back( sheet );
230
231 bool retval = sheet->ResolveTextVar( &path, token, aDepth + 1 );
232
233 if( schematic )
234 retval |= schematic->ResolveTextVar( &path, token, aDepth + 1 );
235
236 return retval;
237 };
238
239 std::function<bool( wxString* )> labelResolver =
240 [&]( wxString* token ) -> bool
241 {
242 if( !aPath )
243 return false;
244
245 SCH_LABEL_BASE* label = static_cast<SCH_LABEL_BASE*>( m_parent );
246 return label->ResolveTextVar( aPath, token, aDepth + 1 );
247 };
248
249 wxString variantName;
250
251 if( SCHEMATIC* schematic = Schematic() )
252 variantName = schematic->GetCurrentVariant();
253
254 wxString text = getUnescapedText( aPath, variantName );
255
256 if( IsNameShown() && aAllowExtraText )
257 text = GetShownName() << wxS( ": " ) << text;
258
259 if( HasTextVars() )
260 {
261 while( text.Contains( wxT( "${" ) ) && aDepth++ <= ADVANCED_CFG::GetCfg().m_ResolveTextRecursionDepth )
262 {
263 if( m_parent && m_parent->Type() == LIB_SYMBOL_T )
264 text = ExpandTextVars( text, &libSymbolResolver );
265 else if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
266 text = ExpandTextVars( text, &symbolResolver );
267 else if( m_parent && m_parent->Type() == SCH_SHEET_T )
268 text = ExpandTextVars( text, &sheetResolver );
269 else if( m_parent && m_parent->IsType( labelTypes ) )
270 text = ExpandTextVars( text, &labelResolver );
271 else if( Schematic() )
272 {
273 text = ExpandTextVars( text, &Schematic()->Project() );
274 text = ExpandTextVars( text, &schematicResolver );
275 }
276 }
277 }
278
279 if( m_id == FIELD_T::SHEET_FILENAME && aAllowExtraText && !IsNameShown() )
280 text = _( "File:" ) + wxS( " " ) + text;
281
282 if( text.Contains( wxT( "@{" ) ) )
284
285 return text;
286}
287
288
289wxString SCH_FIELD::GetShownText( bool aAllowExtraText, int aDepth ) const
290{
291 if( SCHEMATIC* schematic = Schematic() )
292 {
293 const SCH_SHEET_PATH& currentSheet = schematic->CurrentSheet();
294 wxLogTrace( traceSchFieldRendering,
295 "GetShownText (no path arg): field=%s, current sheet path='%s', size=%zu, empty=%d",
296 GetName(),
297 currentSheet.Path().AsString(),
298 currentSheet.size(),
299 currentSheet.empty() ? 1 : 0 );
300 return GetShownText( &currentSheet, aAllowExtraText, aDepth );
301 }
302 else
303 return GetShownText( nullptr, aAllowExtraText, aDepth );
304}
305
306
307wxString SCH_FIELD::GetFullText( int unit ) const
308{
309 if( GetId() != FIELD_T::REFERENCE )
310 return GetText();
311
312 wxString text = GetText();
313 text << wxT( "?" );
314
315 if( GetParentSymbol() && GetParentSymbol()->IsMultiUnit() )
316 text << LIB_SYMBOL::LetterSubReference( unit, 'A' );
317
318 return text;
319}
320
321
323{
325}
326
327
329{
331
332 if( !font )
333 font = KIFONT::FONT::GetFont( GetDefaultFont( aSettings ), IsBold(), IsItalic() );
334
335 return font;
336}
337
338
344
345
351
352
353std::vector<std::unique_ptr<KIFONT::GLYPH>>*
354SCH_FIELD::GetRenderCache( const wxString& forResolvedText, const VECTOR2I& forPosition,
355 TEXT_ATTRIBUTES& aAttrs ) const
356{
357 KIFONT::FONT* font = GetDrawFont( nullptr );
358
359 if( font->IsOutline() )
360 {
361 KIFONT::OUTLINE_FONT* outlineFont = static_cast<KIFONT::OUTLINE_FONT*>( font );
362
363 if( m_renderCache.empty() || !m_renderCacheValid )
364 {
365 m_renderCache.clear();
366
367 outlineFont->GetLinesAsGlyphs( &m_renderCache, forResolvedText, forPosition, aAttrs,
368 GetFontMetrics() );
369
370 m_renderCachePos = forPosition;
371 m_renderCacheValid = true;
372 }
373
374 if( m_renderCachePos != forPosition )
375 {
376 VECTOR2I delta = forPosition - m_renderCachePos;
377
378 for( std::unique_ptr<KIFONT::GLYPH>& glyph : m_renderCache )
379 {
380 if( glyph->IsOutline() )
381 static_cast<KIFONT::OUTLINE_GLYPH*>( glyph.get() )->Move( delta );
382 else
383 static_cast<KIFONT::STROKE_GLYPH*>( glyph.get() )->Move( delta );
384 }
385
386 m_renderCachePos = forPosition;
387 }
388
389 return &m_renderCache;
390 }
391
392 return nullptr;
393}
394
395
396void SCH_FIELD::ImportValues( const SCH_FIELD& aSource )
397{
398 SetAttributes( aSource );
399 SetVisible( aSource.IsVisible() );
400 SetNameShown( aSource.IsNameShown() );
401 SetCanAutoplace( aSource.CanAutoplace() );
402}
403
404
406{
407 wxCHECK_RET( aItem && aItem->Type() == SCH_FIELD_T, wxT( "Cannot swap with invalid item." ) );
408
409 SCH_FIELD* item = static_cast<SCH_FIELD*>( aItem );
410
411 std::swap( m_showName, item->m_showName );
412 std::swap( m_allowAutoPlace, item->m_allowAutoPlace );
413 std::swap( m_isGeneratedField, item->m_isGeneratedField );
414 SwapText( *item );
415 SwapAttributes( *item );
416
417 std::swap( m_lastResolvedColor, item->m_lastResolvedColor );
418}
419
420
422{
424 {
426 }
427 else
428 {
429 SCH_LABEL_BASE* parentLabel = dynamic_cast<SCH_LABEL_BASE*>( GetParent() );
430
431 if( parentLabel && !parentLabel->IsConnectivityDirty() )
433 else
435 }
436
437 return m_lastResolvedColor;
438}
439
440
441std::vector<int> SCH_FIELD::ViewGetLayers() const
442{
444}
445
446
448{
449 if( m_parent && m_parent->Type() == SCH_LABEL_T )
450 {
451 if( GetCanonicalName() == wxT( "Netclass" )
452 || GetCanonicalName() == wxT( "Component Class" ) )
453 {
454 return LAYER_NETCLASS_REFS;
455 }
456 }
457
458 switch( m_id )
459 {
461 case FIELD_T::VALUE: return LAYER_VALUEPART;
466 default: return LAYER_FIELDS;
467 }
468}
469
470
472{
473 // Calculate the text orientation according to the symbol orientation.
474 EDA_ANGLE orient = GetTextAngle();
475
476 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
477 {
478 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
479
480 if( parentSymbol && parentSymbol->GetTransform().y1 ) // Rotate symbol 90 degrees.
481 {
482 if( orient.IsHorizontal() )
483 orient = ANGLE_VERTICAL;
484 else
485 orient = ANGLE_HORIZONTAL;
486 }
487 }
488
489 return orient;
490}
491
492
494{
495 BOX2I bbox = GetTextBox( nullptr );
496
497 // Calculate the bounding box position relative to the parent:
498 VECTOR2I origin = GetParentPosition();
499 VECTOR2I pos = GetTextPos() - origin;
500 VECTOR2I begin = bbox.GetOrigin() - origin;
501 VECTOR2I end = bbox.GetEnd() - origin;
502 RotatePoint( begin, pos, GetTextAngle() );
503 RotatePoint( end, pos, GetTextAngle() );
504
505 // Now, apply the symbol transform (mirror/rot)
506 TRANSFORM transform;
507
508 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
509 transform = static_cast<SCH_SYMBOL*>( m_parent )->GetTransform();
510
511 bbox.SetOrigin( transform.TransformCoordinate( begin ) );
512 bbox.SetEnd( transform.TransformCoordinate( end ) );
513
514 bbox.Move( origin );
515 bbox.Normalize();
516
517 return bbox;
518}
519
520
522{
523 VECTOR2I render_center = GetBoundingBox().Centre();
524 VECTOR2I pos = GetPosition();
525
526 switch( GetHorizJustify() )
527 {
529 if( GetDrawRotation().IsVertical() )
530 return render_center.y > pos.y;
531 else
532 return render_center.x < pos.x;
534 if( GetDrawRotation().IsVertical() )
535 return render_center.y < pos.y;
536 else
537 return render_center.x > pos.x;
538 default:
539 return false;
540 }
541}
542
543
545{
546 GR_TEXT_H_ALIGN_T actualJustify;
547
548 switch( aJustify )
549 {
552 break;
555 break;
556 default:
557 actualJustify = aJustify;
558 }
559
560 SetHorizJustify( actualJustify );
561}
562
563
576
577
579{
580 VECTOR2I render_center = GetBoundingBox().Centre();
581 VECTOR2I pos = GetPosition();
582
583 switch( GetVertJustify() )
584 {
586 if( GetDrawRotation().IsVertical() )
587 return render_center.x < pos.x;
588 else
589 return render_center.y < pos.y;
591 if( GetDrawRotation().IsVertical() )
592 return render_center.x > pos.x;
593 else
594 return render_center.y > pos.y;
595 default:
596 return false;
597 }
598}
599
600
602{
603 GR_TEXT_V_ALIGN_T actualJustify;
604
605 switch( aJustify )
606 {
609 break;
612 break;
613 default:
614 actualJustify = aJustify;
615 }
616
617 SetVertJustify( actualJustify );
618}
619
620
633
634
635bool SCH_FIELD::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const
636{
637 bool searchHiddenFields = aSearchData.searchAllFields;
638 bool searchAndReplace = aSearchData.searchAndReplace;
639 bool replaceReferences = false;
640
641 try
642 {
643 // downcast
644 const SCH_SEARCH_DATA& schSearchData = dynamic_cast<const SCH_SEARCH_DATA&>( aSearchData );
645 replaceReferences = schSearchData.replaceReferences;
646 }
647 catch( const std::bad_cast& )
648 {
649 }
650
651 wxString text = UnescapeString( GetText() );
652
653 if( !IsVisible() && !searchHiddenFields )
654 return false;
655
656 if( m_id == FIELD_T::REFERENCE )
657 {
658 if( searchAndReplace && !replaceReferences )
659 return false;
660
661 SCH_SYMBOL* parentSymbol = dyn_cast<SCH_SYMBOL*>( m_parent );
662
663 // The parent might be a LIB_SYMBOL, in which case, we don't
664 // have a sheet path to resolve the reference.
665 if( !parentSymbol )
666 return false;
667
668 if( parentSymbol->Matches( aSearchData, aAuxData ) )
669 return true;
670
671 wxASSERT( aAuxData );
672
673 // Take sheet path into account which effects the reference field and the unit for
674 // symbols with multiple parts.
675 if( aAuxData )
676 {
677 SCH_SHEET_PATH* sheet = (SCH_SHEET_PATH*) aAuxData;
678 text = parentSymbol->GetRef( sheet );
679
680 if( SCH_ITEM::Matches( text, aSearchData ) )
681 return true;
682
683 if( parentSymbol->GetUnitCount() > 1 )
684 text << parentSymbol->SubReference( parentSymbol->GetUnitSelection( sheet ) );
685 }
686 }
687
688 return SCH_ITEM::Matches( text, aSearchData );
689}
690
691
693 wxStyledTextEvent &aEvent ) const
694{
695 SCH_ITEM* parent = dynamic_cast<SCH_ITEM*>( GetParent() );
696 SCHEMATIC* schematic = parent ? parent->Schematic() : nullptr;
697
698 if( !schematic )
699 return;
700
701 wxStyledTextCtrl* scintilla = aScintillaTricks->Scintilla();
702 int key = aEvent.GetKey();
703
704 wxArrayString autocompleteTokens;
705 int pos = scintilla->GetCurrentPos();
706 int start = scintilla->WordStartPosition( pos, true );
707 wxString partial;
708
709 // Multi-line fields are not allowed. So remove '\n' if entered.
710 if( key == '\n' )
711 {
712 wxString text = scintilla->GetText();
713 int currpos = scintilla->GetCurrentPos();
714 text.Replace( wxS( "\n" ), wxS( "" ) );
715 scintilla->SetText( text );
716 scintilla->GotoPos( currpos-1 );
717 return;
718 }
719
720 auto textVarRef =
721 [&]( int pt )
722 {
723 return pt >= 2
724 && scintilla->GetCharAt( pt - 2 ) == '$'
725 && scintilla->GetCharAt( pt - 1 ) == '{';
726 };
727
728 // Check for cross-reference
729 if( start > 1 && scintilla->GetCharAt( start - 1 ) == ':' )
730 {
731 int refStart = scintilla->WordStartPosition( start - 1, true );
732
733 if( textVarRef( refStart ) )
734 {
735 partial = scintilla->GetRange( start, pos );
736
737 wxString ref = scintilla->GetRange( refStart, start - 1 );
738
739 if( ref == wxS( "OP" ) )
740 {
741 // SPICE operating points use ':' syntax for ports
742 if( SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( parent ) )
743 {
744 NULL_REPORTER devnull;
745 SCH_SHEET_PATH& sheet = schematic->CurrentSheet();
746 SIM_LIB_MGR mgr( &schematic->Project() );
747
748 std::vector<EMBEDDED_FILES*> embeddedFilesStack;
749 embeddedFilesStack.push_back( schematic->GetEmbeddedFiles() );
750
751 if( EMBEDDED_FILES* symbolEmbeddedFiles = symbol->GetEmbeddedFiles() )
752 embeddedFilesStack.push_back( symbolEmbeddedFiles );
753
754 mgr.SetFilesStack( std::move( embeddedFilesStack ) );
755
756 SIM_MODEL& model = mgr.CreateModel( &sheet, *symbol, true, 0, devnull ).model;
757
758 for( wxString pin : model.GetPinNames() )
759 {
760 if( pin.StartsWith( '<' ) && pin.EndsWith( '>' ) )
761 autocompleteTokens.push_back( pin.Mid( 1, pin.Length() - 2 ) );
762 else
763 autocompleteTokens.push_back( pin );
764 }
765
766 // add the synthetic port for power measurements
767 autocompleteTokens.push_back( wxT( "power" ) );
768 }
769 }
770 else
771 {
773 SCH_SYMBOL* refSymbol = nullptr;
774
775 schematic->Hierarchy().GetSymbols( refs );
776
777 for( size_t jj = 0; jj < refs.GetCount(); jj++ )
778 {
779 if( refs[ jj ].GetSymbol()->GetRef( &refs[ jj ].GetSheetPath(), true ) == ref )
780 {
781 refSymbol = refs[ jj ].GetSymbol();
782 break;
783 }
784 }
785
786 if( refSymbol )
787 refSymbol->GetContextualTextVars( &autocompleteTokens );
788 }
789 }
790 }
791 else if( textVarRef( start ) )
792 {
793 partial = scintilla->GetTextRange( start, pos );
794
795 SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( parent );
796 SCH_SHEET* sheet = dynamic_cast<SCH_SHEET*>( parent );
797 SCH_LABEL_BASE* label = dynamic_cast<SCH_LABEL_BASE*>( parent );
798
799 if( symbol )
800 {
801 symbol->GetContextualTextVars( &autocompleteTokens );
802
803 if( schematic->CurrentSheet().Last() )
804 schematic->CurrentSheet().Last()->GetContextualTextVars( &autocompleteTokens );
805 }
806
807 if( sheet )
808 sheet->GetContextualTextVars( &autocompleteTokens );
809
810 if( label )
811 label->GetContextualTextVars( &autocompleteTokens );
812
813 for( std::pair<wxString, wxString> entry : schematic->Project().GetTextVars() )
814 autocompleteTokens.push_back( entry.first );
815 }
816
817 aScintillaTricks->DoAutocomplete( partial, autocompleteTokens );
818 scintilla->SetFocus();
819}
820
821
823{
824 // See comments in SCH_FIELD::Replace(), below.
826 return false;
827
828 return true;
829}
830
831
832bool SCH_FIELD::Replace( const EDA_SEARCH_DATA& aSearchData, void* aAuxData )
833{
834 bool replaceReferences = false;
835
836 try
837 {
838 const SCH_SEARCH_DATA& schSearchData = dynamic_cast<const SCH_SEARCH_DATA&>( aSearchData );
839 replaceReferences = schSearchData.replaceReferences;
840 }
841 catch( const std::bad_cast& )
842 {
843 }
844
845 wxString text;
846 bool isReplaced = false;
847
848 if( m_id == FIELD_T::REFERENCE && m_parent && m_parent->Type() == SCH_SYMBOL_T )
849 {
850 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
851
852 if( !replaceReferences )
853 return false;
854
855 wxCHECK_MSG( aAuxData, false, wxT( "Need sheetpath to replace in refdes." ) );
856
857 text = parentSymbol->GetRef( (SCH_SHEET_PATH*) aAuxData );
858 isReplaced = EDA_ITEM::Replace( aSearchData, text );
859
860 if( isReplaced )
861 parentSymbol->SetRef( (SCH_SHEET_PATH*) aAuxData, text );
862 }
863 else
864 {
865 isReplaced = EDA_TEXT::Replace( aSearchData );
866
867 if( m_id == FIELD_T::SHEET_FILENAME && isReplaced )
868 {
869 // If we allowed this we'd have a bunch of work to do here, including warning
870 // about it not being undoable, checking for recursive hierarchies, reloading
871 // sheets, etc. See DIALOG_SHEET_PROPERTIES::TransferDataFromWindow().
872 }
873 }
874
875 return isReplaced;
876}
877
878
879void SCH_FIELD::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
880{
882
883 if( GetTextAngle().IsVertical() )
884 {
885 switch( horizJustify )
886 {
888 if( aRotateCCW )
890
891 break;
892
894 if( aRotateCCW )
896
897 break;
898
901 break;
902 }
903
905 }
906 else if( GetTextAngle().IsHorizontal() )
907 {
908 switch( horizJustify )
909 {
911 if( !aRotateCCW )
913
914 break;
915
917 if( !aRotateCCW )
919
920 break;
921
924 break;
925 }
926
928 }
929 else
930 {
931 wxFAIL_MSG( wxString::Format( wxT( "SCH_FIELD text angle is not horizontal or vertical: %f" ),
932 GetTextAngle().AsDegrees() ) );
933 }
934
935 VECTOR2I pt = GetPosition();
936 RotatePoint( pt, aCenter, aRotateCCW ? ANGLE_90 : ANGLE_270 );
937 SetPosition( pt );
938}
939
940
942{
943 int x = GetTextPos().x;
944
945 x -= aCenter;
946 x *= -1;
947 x += aCenter;
948
949 SetTextX( x );
950}
951
952
954{
955 int y = GetTextPos().y;
956
957 y -= aCenter;
958 y *= -1;
959 y += aCenter;
960
961 SetTextY( y );
962}
963
964
965void SCH_FIELD::BeginEdit( const VECTOR2I& aPosition )
966{
967 SetTextPos( aPosition );
968}
969
970
971void SCH_FIELD::CalcEdit( const VECTOR2I& aPosition )
972{
973 SetTextPos( aPosition );
974}
975
976
977wxString SCH_FIELD::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
978{
979 wxString content = aFull ? GetShownText( false ) : KIUI::EllipsizeMenuText( GetText() );
980
981 if( content.IsEmpty() )
982 {
983 return wxString::Format( _( "Field %s (empty)" ),
984 UnescapeString( GetName() ) );
985 }
986 else
987 {
988 return wxString::Format( _( "Field %s '%s'" ),
990 content );
991 }
992}
993
994
995void SCH_FIELD::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
996{
997 wxString msg;
998
999 aList.emplace_back( _( "Symbol Field" ), UnescapeString( GetName() ) );
1000
1001 // Don't use GetShownText() here; we want to show the user the variable references
1002 aList.emplace_back( _( "Text" ), KIUI::EllipsizeStatusText( aFrame, GetText() ) );
1003
1004 aList.emplace_back( _( "Visible" ), IsVisible() ? _( "Yes" ) : _( "No" ) );
1005
1006 aList.emplace_back( _( "Font" ), GetFont() ? GetFont()->GetName() : _( "Default" ) );
1007
1008 aList.emplace_back( _( "Style" ), GetTextStyleName() );
1009
1010 aList.emplace_back( _( "Text Size" ), aFrame->MessageTextFromValue( GetTextWidth() ) );
1011
1012 switch ( GetHorizJustify() )
1013 {
1014 case GR_TEXT_H_ALIGN_LEFT: msg = _( "Left" ); break;
1015 case GR_TEXT_H_ALIGN_CENTER: msg = _( "Center" ); break;
1016 case GR_TEXT_H_ALIGN_RIGHT: msg = _( "Right" ); break;
1018 }
1019
1020 aList.emplace_back( _( "H Justification" ), msg );
1021
1022 switch ( GetVertJustify() )
1023 {
1024 case GR_TEXT_V_ALIGN_TOP: msg = _( "Top" ); break;
1025 case GR_TEXT_V_ALIGN_CENTER: msg = _( "Center" ); break;
1026 case GR_TEXT_V_ALIGN_BOTTOM: msg = _( "Bottom" ); break;
1028 }
1029
1030 aList.emplace_back( _( "V Justification" ), msg );
1031}
1032
1033
1035{
1037 return true;
1038
1040 return true;
1041
1042 return IsURL( GetShownText( false ) );
1043}
1044
1045
1047{
1048 constexpr int START_ID = 1;
1049
1050 if( IsHypertext() )
1051 {
1052 wxString href;
1053
1055 {
1056 SCH_LABEL_BASE* label = static_cast<SCH_LABEL_BASE*>( m_parent );
1057 SCH_SHEET_PATH* sheet = &label->Schematic()->CurrentSheet();
1058 wxMenu menu;
1059
1060 std::vector<std::pair<wxString, wxString>> pages;
1061
1062 label->GetIntersheetRefs( sheet, &pages );
1063
1064 for( int i = 0; i < (int) pages.size(); ++i )
1065 {
1066 menu.Append( i + START_ID, wxString::Format( _( "Go to Page %s (%s)" ),
1067 pages[i].first,
1068 pages[i].second ) );
1069 }
1070
1071 menu.AppendSeparator();
1072 menu.Append( 999 + START_ID, _( "Back to Previous Selected Sheet" ) );
1073
1074 int sel = aFrame->GetPopupMenuSelectionFromUser( menu ) - START_ID;
1075
1076 if( sel >= 0 && sel < (int) pages.size() )
1077 href = wxT( "#" ) + pages[ sel ].first;
1078 else if( sel == 999 )
1080 }
1081 else if( IsURL( GetShownText( false ) ) || m_name == SIM_LIBRARY::LIBRARY_FIELD )
1082 {
1083 href = GetShownText( false );
1084 }
1085
1086 if( !href.IsEmpty() )
1087 {
1089 navTool->HypertextCommand( href );
1090 }
1091 }
1092}
1093
1094
1095void SCH_FIELD::SetName( const wxString& aName )
1096{
1097 m_name = aName;
1099
1100 if( m_isGeneratedField )
1101 EDA_TEXT::SetText( aName );
1102}
1103
1104
1105void SCH_FIELD::SetText( const wxString& aText )
1106{
1107 // Don't allow modification of text value of generated fields.
1108 if( m_isGeneratedField )
1109 return;
1110
1111 // Mandatory fields should not have leading or trailing whitespace.
1112 if( IsMandatory() )
1113 EDA_TEXT::SetText( aText.Strip( wxString::both ) );
1114 else
1115 EDA_TEXT::SetText( aText );
1116}
1117
1118
1119wxString SCH_FIELD::GetName( bool aUseDefaultName ) const
1120{
1121 if( m_parent && m_parent->IsType( labelTypes ) )
1122 return SCH_LABEL_BASE::GetDefaultFieldName( m_name, aUseDefaultName );
1123
1124 if( IsMandatory() )
1125 return GetCanonicalFieldName( m_id );
1126 else if( m_name.IsEmpty() && aUseDefaultName )
1128 else
1129 return m_name;
1130}
1131
1132
1134{
1135 if( m_parent && m_parent->IsType( labelTypes ) )
1136 {
1137 // These should be stored in canonical format, but just in case:
1138 if( m_name == _( "Net Class" ) || m_name == wxT( "Net Class" ) )
1139 return wxT( "Netclass" );
1140 }
1141
1142 if( IsMandatory() )
1143 return GetCanonicalFieldName( m_id );
1144
1145 return m_name;
1146}
1147
1148
1150{
1151 if( m_parent && ( m_parent->Type() == SCH_SYMBOL_T || m_parent->Type() == LIB_SYMBOL_T ) )
1152 {
1153 switch( m_id )
1154 {
1158 default: return BITMAPS::text;
1159 }
1160 }
1161
1162 return BITMAPS::text;
1163}
1164
1165
1166bool SCH_FIELD::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
1167{
1168 if( GetShownText( true ).IsEmpty() )
1169 return false;
1170
1171 BOX2I rect = GetBoundingBox();
1172
1173 // Text in symbol editor can have additional chars (ie: reference designators U? or U?A)
1174 if( m_parent && m_parent->Type() == LIB_SYMBOL_T )
1175 {
1176 SCH_FIELD temp( *this );
1177 temp.SetText( GetFullText() );
1178 rect = temp.GetBoundingBox();
1179 }
1180
1181 rect.Inflate( aAccuracy );
1182
1183 if( m_parent && m_parent->Type() == SCH_GLOBAL_LABEL_T )
1184 {
1185 SCH_GLOBALLABEL* label = static_cast<SCH_GLOBALLABEL*>( GetParent() );
1186 rect.Offset( label->GetSchematicTextOffset( nullptr ) );
1187 }
1188
1189 return rect.Contains( aPosition );
1190}
1191
1192
1193bool SCH_FIELD::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
1194{
1195 if( GetShownText( true ).IsEmpty() )
1196 return false;
1197
1199 return false;
1200
1201 BOX2I rect = aRect;
1202
1203 rect.Inflate( aAccuracy );
1204
1205 if( GetParent() && GetParent()->Type() == SCH_GLOBAL_LABEL_T )
1206 {
1207 SCH_GLOBALLABEL* label = static_cast<SCH_GLOBALLABEL*>( GetParent() );
1208 rect.Offset( label->GetSchematicTextOffset( nullptr ) );
1209 }
1210
1211 if( aContained )
1212 return rect.Contains( GetBoundingBox() );
1213
1214 return rect.Intersects( GetBoundingBox() );
1215}
1216
1217
1218bool SCH_FIELD::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
1219{
1220 if( GetShownText( true ).IsEmpty() )
1221 return false;
1222
1224 return false;
1225
1226 BOX2I bbox = GetBoundingBox();
1227
1228 if( GetParent() && GetParent()->Type() == SCH_GLOBAL_LABEL_T )
1229 {
1230 SCH_GLOBALLABEL* label = static_cast<SCH_GLOBALLABEL*>( GetParent() );
1231 bbox.Offset( label->GetSchematicTextOffset( nullptr ) );
1232 }
1233
1234 return KIGEOM::BoxHitTest( aPoly, bbox, aContained );
1235}
1236
1237
1238void SCH_FIELD::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts,
1239 int aUnit, int aBodyStyle, const VECTOR2I& aOffset, bool aDimmed )
1240{
1241 wxString text;
1242
1243 if( Schematic() )
1244 text = GetShownText( &Schematic()->CurrentSheet(), true );
1245 else
1246 text = GetShownText( true );
1247
1248 if( ( !IsVisible() && !IsForceVisible() ) || text.IsEmpty() || aBackground )
1249 return;
1250
1251 SCH_RENDER_SETTINGS* renderSettings = getRenderSettings( aPlotter );
1252 COLOR4D color = renderSettings->GetLayerColor( GetLayer() );
1253 int penWidth = GetEffectiveTextPenWidth( renderSettings->GetDefaultPenWidth() );
1254
1255 COLOR4D bg = renderSettings->GetBackgroundColor();;
1256
1257 if( bg == COLOR4D::UNSPECIFIED || !aPlotter->GetColorMode() )
1258 bg = COLOR4D::WHITE;
1259
1260 if( aPlotter->GetColorMode() && GetTextColor() != COLOR4D::UNSPECIFIED )
1261 color = GetTextColor();
1262
1263 if( aDimmed )
1264 {
1265 color.Desaturate( );
1266 color = color.Mix( bg, 0.5f );
1267 }
1268
1269 penWidth = std::max( penWidth, renderSettings->GetMinPenWidth() );
1270
1271 // clamp the pen width to be sure the text is readable
1272 penWidth = std::min( penWidth, std::min( GetTextSize().x, GetTextSize().y ) / 4 );
1273
1274 if( !IsVisible() && !renderSettings->m_ShowHiddenFields )
1275 return;
1276
1277 // Calculate the text orientation, according to the symbol orientation/mirror
1278 EDA_ANGLE orient = GetTextAngle();
1279 VECTOR2I textpos = GetTextPos();
1281 GR_TEXT_V_ALIGN_T vjustify = GetVertJustify();
1282
1283 if( renderSettings->m_Transform.y1 ) // Rotate symbol 90 deg.
1284 {
1285 if( orient.IsHorizontal() )
1286 orient = ANGLE_VERTICAL;
1287 else
1288 orient = ANGLE_HORIZONTAL;
1289 }
1290
1291 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
1292 {
1293 /*
1294 * Calculate the text justification, according to the symbol orientation/mirror. This is
1295 * a bit complicated due to cumulative calculations:
1296 * - numerous cases (mirrored or not, rotation)
1297 * - the plotter's Text() function will also recalculate H and V justifications according
1298 * to the text orientation
1299 * - when a symbol is mirrored the text is not, and justifications become a nightmare
1300 *
1301 * So the easier way is to use no justifications (centered text) and use GetBoundingBox
1302 * to know the text coordinate considered as centered.
1303 */
1304 hjustify = GR_TEXT_H_ALIGN_CENTER;
1305 vjustify = GR_TEXT_V_ALIGN_CENTER;
1306 textpos = GetBoundingBox().Centre();
1307 }
1308 else if( m_parent && m_parent->Type() == SCH_GLOBAL_LABEL_T )
1309 {
1310 SCH_GLOBALLABEL* label = static_cast<SCH_GLOBALLABEL*>( m_parent );
1311 textpos += label->GetSchematicTextOffset( renderSettings );
1312 }
1313 else if( m_parent && m_parent->Type() == SCH_DIRECTIVE_LABEL_T )
1314 {
1315 SCH_DIRECTIVE_LABEL* label = static_cast<SCH_DIRECTIVE_LABEL*>( m_parent );
1316 std::shared_ptr<NETCLASS> nc = label->GetEffectiveNetClass();
1317
1318 if( nc && ( nc->GetSchematicColor() != COLOR4D::UNSPECIFIED ) && aPlotter->GetColorMode() )
1319 color = nc->GetSchematicColor();
1320 }
1321
1322 KIFONT::FONT* font = GetDrawFont( renderSettings );
1324 attrs.m_StrokeWidth = penWidth;
1325 attrs.m_Halign = hjustify;
1326 attrs.m_Valign = vjustify;
1327 attrs.m_Angle = orient;
1328 attrs.m_Multiline = false;
1329
1330 aPlotter->PlotText( textpos, color, text, attrs, font, GetFontMetrics() );
1331
1333 {
1334 if( SCH_LABEL_BASE* label = dynamic_cast<SCH_LABEL_BASE*>( m_parent ) )
1335 {
1336 std::vector<std::pair<wxString, wxString>> pages;
1337 std::vector<wxString> pageHrefs;
1338
1339 label->GetIntersheetRefs( &Schematic()->CurrentSheet(), &pages );
1340
1341 for( const auto& [ pageNumber, sheetName ] : pages )
1342 pageHrefs.push_back( wxT( "#" ) + pageNumber );
1343
1344 BOX2I bbox = GetBoundingBox();
1345 bbox.Offset( label->GetSchematicTextOffset( renderSettings ) );
1346
1347 aPlotter->HyperlinkMenu( bbox, pageHrefs );
1348 }
1349 }
1350}
1351
1352
1353void SCH_FIELD::SetPosition( const VECTOR2I& aPosition )
1354{
1355 // Actual positions are calculated by the rotation/mirror transform of the parent symbol
1356 // of the field. The inverse transform is used to calculate the position relative to the
1357 // parent symbol.
1358 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
1359 {
1360 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
1361 VECTOR2I relPos = aPosition - parentSymbol->GetPosition();
1362
1363 relPos = parentSymbol->GetTransform().InverseTransform().TransformCoordinate( relPos );
1364
1365 SetTextPos( relPos + parentSymbol->GetPosition() );
1366 return;
1367 }
1368
1369 SetTextPos( aPosition );
1370}
1371
1372
1374{
1375 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
1376 {
1377 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
1378 VECTOR2I relativePos = GetTextPos() - parentSymbol->GetPosition();
1379
1380 relativePos = parentSymbol->GetTransform().TransformCoordinate( relativePos );
1381
1382 return relativePos + parentSymbol->GetPosition();
1383 }
1384
1385 return GetTextPos();
1386}
1387
1388
1390{
1391 return m_parent ? m_parent->GetPosition() : VECTOR2I( 0, 0 );
1392}
1393
1394
1406
1407
1408bool SCH_FIELD::operator<( const SCH_ITEM& aItem ) const
1409{
1410 if( Type() != aItem.Type() )
1411 return Type() < aItem.Type();
1412
1413 auto field = static_cast<const SCH_FIELD*>( &aItem );
1414
1415 if( GetId() != field->GetId() )
1416 return GetId() < field->GetId();
1417
1418 if( GetText() != field->GetText() )
1419 return GetText() < field->GetText();
1420
1421 if( GetLibPosition().x != field->GetLibPosition().x )
1422 return GetLibPosition().x < field->GetLibPosition().x;
1423
1424 if( GetLibPosition().y != field->GetLibPosition().y )
1425 return GetLibPosition().y < field->GetLibPosition().y;
1426
1427 return GetName() < field->GetName();
1428}
1429
1430
1431bool SCH_FIELD::operator==(const SCH_ITEM& aOther) const
1432{
1433 if( Type() != aOther.Type() )
1434 return false;
1435
1436 const SCH_FIELD& field = static_cast<const SCH_FIELD&>( aOther );
1437
1438 return *this == field;
1439}
1440
1441
1442bool SCH_FIELD::operator==( const SCH_FIELD& aOther ) const
1443{
1444 // Identical fields of different symbols are not equal.
1445 if( !GetParentSymbol() || !aOther.GetParentSymbol()
1446 || GetParentSymbol()->m_Uuid != aOther.GetParentSymbol()->m_Uuid )
1447 {
1448 return false;
1449 }
1450
1451 if( IsMandatory() != aOther.IsMandatory() )
1452 return false;
1453
1454 if( IsMandatory() )
1455 {
1456 if( GetId() != aOther.GetId() )
1457 return false;
1458 }
1459 else
1460 {
1461 if( GetOrdinal() != aOther.GetOrdinal() )
1462 return false;
1463 }
1464
1465 if( GetPosition() != aOther.GetPosition() )
1466 return false;
1467
1468 if( IsGeneratedField() != aOther.IsGeneratedField() )
1469 return false;
1470
1471 if( IsNameShown() != aOther.IsNameShown() )
1472 return false;
1473
1474 if( CanAutoplace() != aOther.CanAutoplace() )
1475 return false;
1476
1477 return EDA_TEXT::operator==( aOther );
1478}
1479
1480
1481double SCH_FIELD::Similarity( const SCH_ITEM& aOther ) const
1482{
1483 if( Type() != aOther.Type() )
1484 return 0.0;
1485
1486 if( m_Uuid == aOther.m_Uuid )
1487 return 1.0;
1488
1489 const SCH_FIELD& field = static_cast<const SCH_FIELD&>( aOther );
1490
1491 double similarity = 0.99; // The UUIDs are different, so we start with non-identity
1492
1493 if( GetId() != field.GetId() )
1494 {
1495 // We don't allow swapping of mandatory fields, so these cannot be the same item
1496 if( IsMandatory() || field.IsMandatory() )
1497 return 0.0;
1498 else
1499 similarity *= 0.5;
1500 }
1501
1502 similarity *= SimilarityBase( aOther );
1503
1504 similarity *= EDA_TEXT::Similarity( field );
1505
1506 if( GetPosition() != field.GetPosition() )
1507 similarity *= 0.5;
1508
1509 if( IsGeneratedField() != field.IsGeneratedField() )
1510 similarity *= 0.5;
1511
1512 if( IsNameShown() != field.IsNameShown() )
1513 similarity *= 0.5;
1514
1515 if( CanAutoplace() != field.CanAutoplace() )
1516 similarity *= 0.5;
1517
1518 return similarity;
1519}
1520
1521
1522int SCH_FIELD::compare( const SCH_ITEM& aOther, int aCompareFlags ) const
1523{
1524 wxASSERT( aOther.Type() == SCH_FIELD_T );
1525
1526 int compareFlags = aCompareFlags;
1527
1528 // For ERC tests, the field position has no matter, so do not test it
1529 if( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::ERC )
1531
1532 int retv = SCH_ITEM::compare( aOther, compareFlags );
1533
1534 if( retv )
1535 return retv;
1536
1537 const SCH_FIELD* tmp = static_cast<const SCH_FIELD*>( &aOther );
1538
1539 // Equality test will vary depending whether or not the field is mandatory. Otherwise,
1540 // sorting is done by ordinal.
1541 if( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::EQUALITY )
1542 {
1543 // Mandatory fields have fixed ordinals and their names can vary due to translated field
1544 // names. Optional fields have fixed names and their ordinals can vary.
1545 if( IsMandatory() )
1546 {
1547 if( m_id != tmp->m_id )
1548 return (int) m_id - (int) tmp->m_id;
1549 }
1550 else
1551 {
1552 retv = m_name.Cmp( tmp->m_name );
1553
1554 if( retv )
1555 return retv;
1556 }
1557 }
1558 else // assume we're sorting
1559 {
1560 if( m_id != tmp->m_id )
1561 return (int) m_id - (int) tmp->m_id;
1562 }
1563
1564 bool ignoreFieldText = false;
1565
1566 if( m_id == FIELD_T::REFERENCE && !( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::EQUALITY ) )
1567 ignoreFieldText = true;
1568
1569 if( m_id == FIELD_T::VALUE && ( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::ERC ) )
1570 ignoreFieldText = true;
1571
1572 if( !ignoreFieldText )
1573 {
1574 retv = GetText().CmpNoCase( tmp->GetText() );
1575
1576 if( retv != 0 )
1577 return retv;
1578 }
1579
1580 if( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::EQUALITY )
1581 {
1582 if( GetTextPos().x != tmp->GetTextPos().x )
1583 return GetTextPos().x - tmp->GetTextPos().x;
1584
1585 if( GetTextPos().y != tmp->GetTextPos().y )
1586 return GetTextPos().y - tmp->GetTextPos().y;
1587 }
1588
1589 // For ERC tests, the field size has no matter, so do not test it
1590 if( !( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::ERC ) )
1591 {
1592 if( GetTextWidth() != tmp->GetTextWidth() )
1593 return GetTextWidth() - tmp->GetTextWidth();
1594
1595 if( GetTextHeight() != tmp->GetTextHeight() )
1596 return GetTextHeight() - tmp->GetTextHeight();
1597 }
1598
1599 return 0;
1600}
1601
1602
1603wxString SCH_FIELD::getUnescapedText( const SCH_SHEET_PATH* aPath, const wxString& aVariantName ) const
1604{
1605 // This is the default variant field text for all fields except the reference field.
1606 wxString retv = EDA_TEXT::GetShownText( false );
1607
1608 wxLogTrace( traceSchFieldRendering,
1609 "getUnescapedText: field=%s, parent=%p, aPath=%p, path_empty=%d, initial_text='%s'",
1610 GetName(),
1611 m_parent,
1612 aPath,
1613 aPath ? (aPath->empty() ? 1 : 0) : -1,
1614 retv );
1615
1616 // Special handling for parent object field instance and variant information.
1617 // Only use the path if it's non-empty; an empty path can't match any instances
1618 if( m_parent && aPath && !aPath->empty() )
1619 {
1620 wxLogTrace( traceSchFieldRendering,
1621 " Path is valid and non-empty, parent type=%d", m_parent->Type() );
1622
1623 switch( m_parent->Type() )
1624 {
1625 case SCH_SYMBOL_T:
1626 {
1627 if( const SCH_SYMBOL* symbol = static_cast<const SCH_SYMBOL*>( m_parent ) )
1628 {
1629 if( m_id == FIELD_T::REFERENCE )
1630 {
1631 wxLogTrace( traceSchFieldRendering,
1632 " Calling GetRef for symbol %s on path %s",
1633 symbol->m_Uuid.AsString(),
1634 aPath->Path().AsString() );
1635
1636 retv = symbol->GetRef( aPath, true );
1637
1638 wxLogTrace( traceSchFieldRendering,
1639 " GetRef returned: '%s'", retv );
1640 }
1641 else if( !aVariantName.IsEmpty() )
1642 {
1643 // If the variant is not found, fall back to default variant above.
1644 if( std::optional<SCH_SYMBOL_VARIANT> variant = symbol->GetVariant( *aPath, aVariantName ) )
1645 {
1646 // If the field name does not exist in the variant, fall back to the default variant above.
1647 if( variant->m_Fields.contains( GetName() ) )
1648 retv = variant->m_Fields[GetName()];
1649 }
1650 }
1651 }
1652
1653 break;
1654 }
1655
1656 case SCH_SHEET_T:
1657 break;
1658
1659 default:
1660 break;
1661 }
1662 }
1663
1664 return retv;
1665}
1666
1667
1668static struct SCH_FIELD_DESC
1669{
1671 {
1672 // These are defined in EDA_TEXT as well but initialization order is
1673 // not defined, so this needs to be conditional. Defining in both
1674 // places leads to duplicate symbols.
1676
1677 if( h_inst.Choices().GetCount() == 0)
1678 {
1679 h_inst.Map( GR_TEXT_H_ALIGN_LEFT, _HKI( "Left" ) );
1680 h_inst.Map( GR_TEXT_H_ALIGN_CENTER, _HKI( "Center" ) );
1681 h_inst.Map( GR_TEXT_H_ALIGN_RIGHT, _HKI( "Right" ) );
1682 }
1683
1685
1686 if( v_inst.Choices().GetCount() == 0)
1687 {
1688 v_inst.Map( GR_TEXT_V_ALIGN_TOP, _HKI( "Top" ) );
1689 v_inst.Map( GR_TEXT_V_ALIGN_CENTER, _HKI( "Center" ) );
1690 v_inst.Map( GR_TEXT_V_ALIGN_BOTTOM, _HKI( "Bottom" ) );
1691 }
1692
1699
1700 const wxString textProps = _HKI( "Text Properties" );
1701
1703 _HKI( "Horizontal Justification" ), &SCH_FIELD::SetEffectiveHorizJustify,
1705
1706 propMgr.ReplaceProperty( TYPE_HASH( EDA_TEXT ), _HKI( "Horizontal Justification" ), horiz,
1707 textProps );
1708
1710 _HKI( "Vertical Justification" ), &SCH_FIELD::SetEffectiveVertJustify,
1712
1713 propMgr.ReplaceProperty( TYPE_HASH( EDA_TEXT ), _HKI( "Vertical Justification" ), vert,
1714 textProps );
1715
1716 propMgr.AddProperty( new PROPERTY<SCH_FIELD, bool>( _HKI( "Show Field Name" ),
1718
1719 propMgr.AddProperty( new PROPERTY<SCH_FIELD, bool>( _HKI( "Allow Autoplacement" ),
1721
1722 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Hyperlink" ) );
1723 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Thickness" ) );
1724 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Mirrored" ) );
1725 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Width" ) );
1726 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Height" ) );
1727
1728
1729 propMgr.AddProperty( new PROPERTY<SCH_FIELD, int>( _HKI( "Text Size" ),
1731 _HKI( "Text Properties" ) );
1732
1733 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Orientation" ) );
1734
1735 auto isNotGeneratedField =
1736 []( INSPECTABLE* aItem ) -> bool
1737 {
1738 if( SCH_FIELD* field = dynamic_cast<SCH_FIELD*>( aItem ) )
1739 return !field->IsGeneratedField();
1740
1741 return true;
1742 };
1743
1745 isNotGeneratedField );
1746
1747
1748 auto isNonMandatoryField =
1749 []( INSPECTABLE* aItem ) -> bool
1750 {
1751 if( SCH_FIELD* field = dynamic_cast<SCH_FIELD*>( aItem ) )
1752 return !field->IsMandatory();
1753
1754 return false;
1755 };
1756
1758 _HKI( "Private" ), isNonMandatoryField );
1759 }
1761
1762
int color
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:114
BITMAPS
A list of all bitmap identifiers.
@ edit_comp_value
@ edit_comp_footprint
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition box2.h:558
constexpr const Vec GetEnd() const
Definition box2.h:212
constexpr void SetOrigin(const Vec &pos)
Definition box2.h:237
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
Definition box2.h:146
constexpr Vec Centre() const
Definition box2.h:97
constexpr bool Contains(const Vec &aPoint) const
Definition box2.h:168
constexpr void Move(const Vec &aMoveVector)
Move the rectangle by the aMoveVector.
Definition box2.h:138
constexpr const Vec & GetOrigin() const
Definition box2.h:210
constexpr void SetEnd(coord_type x, coord_type y)
Definition box2.h:297
constexpr void Offset(coord_type dx, coord_type dy)
Definition box2.h:259
constexpr bool Intersects(const BOX2< Vec > &aRect) const
Definition box2.h:311
static const COLOR4D WHITE
Definition color4d.h:401
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Definition color4d.h:398
bool IsHorizontal() const
Definition eda_angle.h:142
The base class for create windows for drawing purpose.
const KIID m_Uuid
Definition eda_item.h:516
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
EDA_ITEM_FLAGS m_flags
Definition eda_item.h:527
virtual bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const
Compare the item against the search criteria in aSearchData.
Definition eda_item.h:401
EDA_ITEM * GetParent() const
Definition eda_item.h:112
EDA_ITEM * m_parent
Owner.
Definition eda_item.h:528
bool IsForceVisible() const
Definition eda_item.h:211
static bool Replace(const EDA_SEARCH_DATA &aSearchData, wxString &aText)
Perform a text replace on aText using the find and replace criteria in aSearchData on items that supp...
Definition eda_item.cpp:236
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:39
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition eda_text.h:80
int GetTextHeight() const
Definition eda_text.h:267
const VECTOR2I & GetTextPos() const
Definition eda_text.h:273
COLOR4D GetTextColor() const
Definition eda_text.h:270
wxString GetTextStyleName() const
Definition eda_text.cpp:992
bool IsItalic() const
Definition eda_text.h:169
const EDA_ANGLE & GetTextAngle() const
Definition eda_text.h:147
void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
Definition eda_text.cpp:544
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition eda_text.h:98
virtual bool IsVisible() const
Definition eda_text.h:187
void SetTextPos(const VECTOR2I &aPoint)
Definition eda_text.cpp:589
void SetTextX(int aX)
Definition eda_text.cpp:595
KIFONT::FONT * GetFont() const
Definition eda_text.h:247
void SetAttributes(const EDA_TEXT &aSrc, bool aSetPosition=true)
Set the text attributes from another instance.
Definition eda_text.cpp:444
void SetTextY(int aY)
Definition eda_text.cpp:601
EDA_TEXT & operator=(const EDA_TEXT &aItem)
Definition eda_text.cpp:159
int GetTextWidth() const
Definition eda_text.h:264
BOX2I GetTextBox(const RENDER_SETTINGS *aSettings, int aLine=-1) const
Useful in multiline texts to calculate the full text or a line area (for zones filling,...
Definition eda_text.cpp:755
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
Definition eda_text.cpp:428
GR_TEXT_H_ALIGN_T GetHorizJustify() const
Definition eda_text.h:200
bool Replace(const EDA_SEARCH_DATA &aSearchData)
Helper function used in search and replace dialog.
Definition eda_text.cpp:497
bool HasTextVars() const
Indicates the ShownText has text var references which need to be processed.
Definition eda_text.h:117
virtual void SetVisible(bool aVisible)
Definition eda_text.cpp:397
EDA_TEXT(const EDA_IU_SCALE &aIuScale, const wxString &aText=wxEmptyString)
Definition eda_text.cpp:97
virtual void ClearBoundingBoxCache()
Definition eda_text.cpp:688
double Similarity(const EDA_TEXT &aOther) const
wxString EvaluateText(const wxString &aText) const
Definition eda_text.cpp:652
virtual void ClearRenderCache()
Definition eda_text.cpp:682
const TEXT_ATTRIBUTES & GetAttributes() const
Definition eda_text.h:231
int GetEffectiveTextPenWidth(int aDefaultPenWidth=0) const
The EffectiveTextPenWidth uses the text thickness if > 1 or aDefaultPenWidth.
Definition eda_text.cpp:476
void SwapAttributes(EDA_TEXT &aTradingPartner)
Swap the text attributes of the two involved instances.
Definition eda_text.cpp:463
bool IsBold() const
Definition eda_text.h:184
GR_TEXT_V_ALIGN_T GetVertJustify() const
Definition eda_text.h:203
virtual wxString GetShownText(bool aAllowExtraText, int aDepth=0) const
Return the string actually shown after processing of the base text.
Definition eda_text.h:109
virtual void SetText(const wxString &aText)
Definition eda_text.cpp:281
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
Definition eda_text.cpp:310
void SwapText(EDA_TEXT &aTradingPartner)
Definition eda_text.cpp:456
bool operator==(const EDA_TEXT &aRhs) const
Definition eda_text.h:396
VECTOR2I GetTextSize() const
Definition eda_text.h:261
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
Definition eda_text.cpp:420
static ENUM_MAP< T > & Instance()
Definition property.h:721
Class that other classes need to inherit from, in order to be inspectable.
Definition inspectable.h:37
FONT is an abstract base class for both outline and stroke fonts.
Definition font.h:131
static FONT * GetFont(const wxString &aFontName=wxEmptyString, bool aBold=false, bool aItalic=false, const std::vector< wxString > *aEmbeddedFiles=nullptr, bool aForDrawingSheet=false)
Definition font.cpp:147
virtual bool IsOutline() const
Definition font.h:139
Class OUTLINE_FONT implements outline font drawing.
void GetLinesAsGlyphs(std::vector< std::unique_ptr< GLYPH > > *aGlyphs, const wxString &aText, const VECTOR2I &aPosition, const TEXT_ATTRIBUTES &aAttrs, const METRICS &aFontMetrics) const
void Move(const VECTOR2I &aOffset)
Definition glyph.cpp:114
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:104
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
wxString AsString() const
Definition kiid.cpp:356
bool ResolveTextVar(wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the symbol.
static wxString LetterSubReference(int aUnit, wxChar aInitialLetter)
COLOR4D GetSchematicColor(bool aIsForSave=false) const
Definition netclass.h:219
A singleton reporter that reports to nowhere.
Definition reporter.h:216
Base plotter engine class.
Definition plotter.h:121
bool GetColorMode() const
Definition plotter.h:149
virtual void PlotText(const VECTOR2I &aPos, const COLOR4D &aColor, const wxString &aText, const TEXT_ATTRIBUTES &aAttributes, KIFONT::FONT *aFont=nullptr, const KIFONT::METRICS &aFontMetrics=KIFONT::METRICS::Default(), void *aData=nullptr)
Definition plotter.cpp:695
virtual void HyperlinkMenu(const BOX2I &aBox, const std::vector< wxString > &aDestURLs)
Create a clickable hyperlink menu with a rectangular click area.
Definition plotter.h:471
virtual std::map< wxString, wxString > & GetTextVars() const
Definition project.cpp:114
Provide class metadata.Helper macro to map type hashes to names.
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
void Mask(TYPE_ID aDerived, TYPE_ID aBase, const wxString &aName)
Sets a base class property as masked in a derived class.
static PROPERTY_MANAGER & Instance()
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
void OverrideAvailability(TYPE_ID aDerived, TYPE_ID aBase, const wxString &aName, std::function< bool(INSPECTABLE *)> aFunc)
Sets an override availability functor for a base class property of a given derived class.
PROPERTY_BASE & ReplaceProperty(size_t aBase, const wxString &aName, PROPERTY_BASE *aNew, const wxString &aGroup=wxEmptyString)
Replace an existing property for a specific type.
void OverrideWriteability(TYPE_ID aDerived, TYPE_ID aBase, const wxString &aName, std::function< bool(INSPECTABLE *)> aFunc)
Sets an override writeability functor for a base class property of a given derived class.
void AddTypeCast(TYPE_CAST_BASE *aCast)
Register a type converter.
These are loaded from Eeschema settings but then overwritten by the project settings.
Holds all the data relating to one schematic.
Definition schematic.h:88
SCHEMATIC_SETTINGS & Settings() const
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
PROJECT & Project() const
Return a reference to the project this schematic is part of.
Definition schematic.h:103
EMBEDDED_FILES * GetEmbeddedFiles() override
bool ResolveTextVar(const SCH_SHEET_PATH *aSheetPath, wxString *token, int aDepth) const
SCH_SHEET_PATH & CurrentSheet() const
Definition schematic.h:186
void ClearRenderCache() override
int compare(const SCH_ITEM &aOther, int aCompareFlags=0) const override
Provide the draw object specific comparison called by the == and < operators.
COLOR4D m_lastResolvedColor
Definition sch_field.h:347
GR_TEXT_V_ALIGN_T GetEffectiveVertJustify() const
bool IsMandatory() const
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
wxString GetFullText(int unit=1) const
Return the text of a field.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
std::vector< std::unique_ptr< KIFONT::GLYPH > > m_renderCache
Definition sch_field.h:345
void swapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
VECTOR2I GetPosition() const override
void SetEffectiveHorizJustify(GR_TEXT_H_ALIGN_T)
int GetSchTextSize() const
Definition sch_field.h:162
bool Replace(const EDA_SEARCH_DATA &aSearchData, void *aAuxData=nullptr) override
Perform a text replace using the find and replace criteria in aSearchData on items that support text ...
bool m_showName
Render the field name in addition to its value.
Definition sch_field.h:335
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
bool IsNameShown() const
Definition sch_field.h:201
bool IsHypertext() const override
Allow items to support hypertext actions when hovered/clicked.
bool m_autoAdded
Was this field automatically added to a LIB_SYMBOL?
Definition sch_field.h:340
double Similarity(const SCH_ITEM &aItem) const override
Return a measure of how likely the other object is to represent the same object.
bool IsGeneratedField() const
Generated fields are fields whose names are variables like ${VAR}.
Definition sch_field.h:210
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
SCH_LAYER_ID GetDefaultLayer() const
bool IsHorizJustifyFlipped() const
Return whether the field will be rendered with the horizontal justification inverted due to rotation ...
bool IsVertJustifyFlipped() const
EDA_ANGLE GetDrawRotation() const override
Adjusters to allow EDA_TEXT to draw/print/etc.
void SetEffectiveVertJustify(GR_TEXT_V_ALIGN_T)
void CalcEdit(const VECTOR2I &aPosition) override
Calculate the attributes of an item at aPosition when it is being edited.
bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const override
Compare the item against the search criteria in aSearchData.
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
FIELD_T GetId() const
Definition sch_field.h:116
void SetCanAutoplace(bool aCanPlace)
Definition sch_field.h:213
void DoHypertextAction(EDA_DRAW_FRAME *aFrame) const override
int GetPenWidth() const override
wxString GetCanonicalName() const
Get a non-language-specific name for a field which can be used for storage, variable look-up,...
bool m_isGeneratedField
If the field name is a variable name (e.g.
Definition sch_field.h:337
int m_ordinal
Sort order for non-mandatory fields.
Definition sch_field.h:332
COLOR4D GetFieldColor() const
wxString getUnescapedText(const SCH_SHEET_PATH *aPath=nullptr, const wxString &aVariantName=wxEmptyString) const
bool operator==(const SCH_ITEM &aItem) const override
SCH_FIELD & operator=(const SCH_FIELD &aField)
void ImportValues(const SCH_FIELD &aSource)
Copy parameters from a SCH_FIELD source.
bool operator<(const SCH_ITEM &aItem) const override
FIELD_T m_id
Field id,.
Definition sch_field.h:331
wxString GetShownName() const
Get the field's name as displayed on the schematic or in the symbol fields table.
VECTOR2I GetLibPosition() const
Definition sch_field.h:259
void setId(FIELD_T aId)
int GetOrdinal() const
Definition sch_field.h:118
bool IsEmpty()
Return true if both the name and value of the field are empty.
Definition sch_field.h:154
bool m_renderCacheValid
Definition sch_field.h:343
KIFONT::FONT * GetDrawFont(const RENDER_SETTINGS *aSettings) const override
void BeginEdit(const VECTOR2I &aStartPoint) override
Begin drawing a symbol library draw item at aPosition.
bool IsReplaceable() const override
Override this method in any derived object that supports test find and replace.
void SetSchTextSize(int aSize)
Definition sch_field.h:163
GR_TEXT_H_ALIGN_T GetEffectiveHorizJustify() const
std::vector< int > ViewGetLayers() const override
Return the all the layers within the VIEW the object is painted on.
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
void SetPosition(const VECTOR2I &aPosition) override
void SetName(const wxString &aName)
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
VECTOR2I m_renderCachePos
Definition sch_field.h:344
bool CanAutoplace() const
Definition sch_field.h:212
std::vector< std::unique_ptr< KIFONT::GLYPH > > * GetRenderCache(const wxString &forResolvedText, const VECTOR2I &forPosition, TEXT_ATTRIBUTES &aAttrs) const
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
void ClearCaches() override
void SetText(const wxString &aText) override
VECTOR2I GetParentPosition() const
bool m_showInChooser
This field is available as a data column for the chooser.
Definition sch_field.h:341
void OnScintillaCharAdded(SCINTILLA_TRICKS *aScintillaTricks, wxStyledTextEvent &aEvent) const
wxString m_name
Definition sch_field.h:333
void SetNameShown(bool aShown=true)
Definition sch_field.h:202
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
void Copy(SCH_FIELD *aTarget) const
Copy parameters of this field to another field.
bool m_allowAutoPlace
This field can be autoplaced.
Definition sch_field.h:336
VECTOR2I GetSchematicTextOffset(const RENDER_SETTINGS *aSettings) const override
This offset depends on the orientation, the type of text, and the area required to draw the associate...
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition sch_item.h:167
SCH_ITEM & operator=(const SCH_ITEM &aPin)
Definition sch_item.cpp:75
SCH_RENDER_SETTINGS * getRenderSettings(PLOTTER *aPlotter) const
Definition sch_item.h:702
const SYMBOL * GetParentSymbol() const
Definition sch_item.cpp:250
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:244
friend class LIB_SYMBOL
Definition sch_item.h:773
@ SKIP_TST_POS
Definition sch_item.h:685
std::shared_ptr< NETCLASS > GetEffectiveNetClass(const SCH_SHEET_PATH *aSheet=nullptr) const
Definition sch_item.cpp:388
void SetLayer(SCH_LAYER_ID aLayer)
Definition sch_item.h:322
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition sch_item.h:321
virtual int compare(const SCH_ITEM &aOther, int aCompareFlags=0) const
Provide the draw object specific comparison called by the == and < operators.
Definition sch_item.cpp:577
const wxString & GetDefaultFont(const RENDER_SETTINGS *aSettings) const
Definition sch_item.cpp:625
bool IsConnectivityDirty() const
Definition sch_item.h:568
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
Definition sch_item.cpp:51
bool m_private
Definition sch_item.h:756
const KIFONT::METRICS & GetFontMetrics() const
Definition sch_item.cpp:638
double SimilarityBase(const SCH_ITEM &aItem) const
Calculate the boilerplate similarity for all LIB_ITEMs without preventing the use above of a pure vir...
Definition sch_item.h:360
void GetIntersheetRefs(const SCH_SHEET_PATH *aPath, std::vector< std::pair< wxString, wxString > > *pages)
Build an array of { pageNumber, pageName } pairs.
virtual bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth) const
Resolve any references to system tokens supported by the label.
static const wxString GetDefaultFieldName(const wxString &aName, bool aUseDefaultName)
void GetContextualTextVars(wxArrayString *aVars) const
Return the list of system text vars & fields for this label.
Handle actions specific to the schematic editor.
static wxString g_BackLink
void HypertextCommand(const wxString &aHref)
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
const KIGFX::COLOR4D & GetBackgroundColor() const override
Return current background color settings.
void GetSymbols(SCH_REFERENCE_LIST &aReferences, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanSymbols=false) const
Add a SCH_REFERENCE object to aReferences for each symbol in the list of sheets.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
bool empty() const
Forwarded method from std::vector.
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
size_t size() const
Forwarded method from std::vector.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition sch_sheet.h:47
void GetContextualTextVars(wxArrayString *aVars) const
Return the list of system text vars & fields for this sheet.
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the sheet.
Schematic symbol object.
Definition sch_symbol.h:76
wxString SubReference(int aUnit, bool aAddSeparator=true) const
bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const override
Compare the item against the search criteria in aSearchData.
void SetRef(const SCH_SHEET_PATH *aSheet, const wxString &aReference)
Set the reference for the given sheet path for this symbol.
VECTOR2I GetPosition() const override
Definition sch_symbol.h:811
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the symbol.
void GetContextualTextVars(wxArrayString *aVars) const
Return the list of system text vars & fields for this symbol.
int GetUnitSelection(const SCH_SHEET_PATH *aSheet) const
Return the instance-specific unit selection for the given sheet path.
int GetUnitCount() const override
Return the number of units per package of the symbol.
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
Add cut/copy/paste, dark theme, autocomplete and brace highlighting to a wxStyleTextCtrl instance.
wxStyledTextCtrl * Scintilla() const
void DoAutocomplete(const wxString &aPartial, const wxArrayString &aTokens)
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
void Move(const VECTOR2I &aVector) override
static constexpr auto LIBRARY_FIELD
Definition sim_library.h:35
SIM_MODEL & CreateModel(SIM_MODEL::TYPE aType, const std::vector< SCH_PIN * > &aPins, REPORTER &aReporter)
void SetFilesStack(std::vector< EMBEDDED_FILES * > aFilesStack)
Definition sim_lib_mgr.h:48
virtual std::vector< std::string > GetPinNames() const
Definition sim_model.h:465
const TRANSFORM & GetTransform() const
Definition symbol.h:220
GR_TEXT_H_ALIGN_T m_Halign
GR_TEXT_V_ALIGN_T m_Valign
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
for transforming drawing coordinates for a wxDC device context.
Definition transform.h:46
TRANSFORM InverseTransform() const
Calculate the Inverse mirror/rotation transform.
Definition transform.cpp:59
VECTOR2I TransformCoordinate(const VECTOR2I &aPoint) const
Calculate a new coordinate according to the mirror/rotation transform.
Definition transform.cpp:44
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
wxString GetGeneratedFieldDisplayName(const wxString &aSource)
Returns any variables unexpanded, e.g.
Definition common.cpp:124
wxString ExpandTextVars(const wxString &aSource, const PROJECT *aProject, int aFlags)
Definition common.cpp:60
The common library.
#define _(s)
static constexpr EDA_ANGLE ANGLE_90
Definition eda_angle.h:413
static constexpr EDA_ANGLE ANGLE_VERTICAL
Definition eda_angle.h:408
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
Definition eda_angle.h:407
static constexpr EDA_ANGLE ANGLE_270
Definition eda_angle.h:416
#define STRUCT_DELETED
flag indication structures to be erased
#define SKIP_STRUCT
flag indicating that the structure should be ignored
a few functions useful in geometry calculations.
const wxChar *const traceSchFieldRendering
Flag to enable debug output of schematic field rendering and positioning.
@ USER
The main config directory (e.g. ~/.config/kicad/)
SCH_LAYER_ID
Eeschema drawing layers.
Definition layer_ids.h:449
@ LAYER_SHEETNAME
Definition layer_ids.h:472
@ LAYER_VALUEPART
Definition layer_ids.h:461
@ LAYER_FIELDS
Definition layer_ids.h:462
@ LAYER_SHEETFIELDS
Definition layer_ids.h:474
@ LAYER_REFERENCEPART
Definition layer_ids.h:460
@ LAYER_NETCLASS_REFS
Definition layer_ids.h:464
@ LAYER_SELECTION_SHADOWS
Definition layer_ids.h:495
@ LAYER_INTERSHEET_REFS
Definition layer_ids.h:463
@ LAYER_SHEETFILENAME
Definition layer_ids.h:473
bool BoxHitTest(const VECTOR2I &aHitPoint, const BOX2I &aHittee, int aAccuracy)
Perform a point-to-box hit test.
KICOMMON_API wxString EllipsizeMenuText(const wxString &aString)
Ellipsize text (at the end) to be no more than 36 characters.
KICOMMON_API wxString EllipsizeStatusText(wxWindow *aWindow, const wxString &aString)
Ellipsize text (at the end) to be no more than 1/3 of the window width.
#define _HKI(x)
Definition page_info.cpp:44
static GR_TEXT_H_ALIGN_T horizJustify(const char *horizontal)
#define TYPE_HASH(x)
Definition property.h:74
#define DECLARE_ENUM_TO_WXANY(type)
Definition property.h:787
@ PT_SIZE
Size expressed in distance units (mm/inch)
Definition property.h:63
#define REGISTER_TYPE(x)
static const std::vector< KICAD_T > labelTypes
Definition sch_field.cpp:44
static struct SCH_FIELD_DESC _SCH_FIELD_DESC
wxString UnescapeString(const wxString &aSource)
bool IsURL(wxString aStr)
Performs a URL sniff-test on a string.
wxString GetDefaultFieldName(FIELD_T aFieldId, bool aTranslateForHI)
Return a default symbol field name for a mandatory field type.
#define DO_TRANSLATE
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.
@ INTERSHEET_REFS
Global label cross-reference page numbers.
@ DESCRIPTION
Field Description of part, i.e. "1/4W 1% Metal Film Resistor".
@ FOOTPRINT
Field Name Module PCB, i.e. "16DIP300".
@ DATASHEET
name of datasheet
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
wxString GetCanonicalFieldName(FIELD_T aFieldType)
VECTOR2I end
int delta
GR_TEXT_H_ALIGN_T
This is API surface mapped to common.types.HorizontalAlignment.
@ GR_TEXT_H_ALIGN_CENTER
@ GR_TEXT_H_ALIGN_RIGHT
@ GR_TEXT_H_ALIGN_LEFT
@ GR_TEXT_H_ALIGN_INDETERMINATE
GR_TEXT_V_ALIGN_T
This is API surface mapped to common.types.VertialAlignment.
@ GR_TEXT_V_ALIGN_BOTTOM
@ GR_TEXT_V_ALIGN_INDETERMINATE
@ GR_TEXT_V_ALIGN_CENTER
@ GR_TEXT_V_ALIGN_TOP
wxLogTrace helper definitions.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
Definition trigo.cpp:229
@ LIB_SYMBOL_T
Definition typeinfo.h:152
@ SCH_SYMBOL_T
Definition typeinfo.h:176
@ SCH_FIELD_T
Definition typeinfo.h:154
@ SCH_DIRECTIVE_LABEL_T
Definition typeinfo.h:175
@ SCH_LABEL_T
Definition typeinfo.h:171
@ SCH_SHEET_T
Definition typeinfo.h:179
@ SCH_LABEL_LOCATE_ANY_T
Definition typeinfo.h:195
@ SCH_GLOBAL_LABEL_T
Definition typeinfo.h:172
Casted dyn_cast(From aObject)
A lightweight dynamic downcast.
Definition typeinfo.h:61
#define INDETERMINATE_STATE
Used for holding indeterminate values, such as with multiple selections holding different values or c...
Definition ui_common.h:46
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695