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#include <properties/property.h>
45
46static const std::vector<KICAD_T> labelTypes = { SCH_LABEL_LOCATE_ANY_T };
47
48
50 SCH_ITEM( nullptr, SCH_FIELD_T ),
51 EDA_TEXT( schIUScale, wxEmptyString ),
52 m_id( FIELD_T::USER ),
53 m_ordinal( 0 ),
54 m_showName( false ),
55 m_allowAutoPlace( true ),
56 m_isGeneratedField( false ),
57 m_autoAdded( false ),
58 m_showInChooser( true ),
60{
61}
62
63
64SCH_FIELD::SCH_FIELD( SCH_ITEM* aParent, FIELD_T aFieldId, const wxString& aName ) :
65 SCH_FIELD()
66{
67 m_parent = aParent;
68
69 if( !aName.IsEmpty() )
70 SetName( aName );
71 else
73
74 setId( aFieldId ); // will also set the layer
75 SetVisible( true );
76
77 if( aParent && aParent->Schematic() )
78 {
79 SCHEMATIC_SETTINGS& settings = aParent->Schematic()->Settings();
81 }
82
83 if( aFieldId == FIELD_T::USER && aParent )
84 {
85 if( aParent->Type() == SCH_SYMBOL_T )
86 m_ordinal = static_cast<SCH_SYMBOL*>( aParent )->GetNextFieldOrdinal();
87 else if( aParent->Type() == LIB_SYMBOL_T )
88 m_ordinal = static_cast<LIB_SYMBOL*>( aParent )->GetNextFieldOrdinal();
89 else if( aParent->Type() == SCH_SHEET_T )
90 m_ordinal = static_cast<SCH_SHEET*>( aParent )->GetNextFieldOrdinal();
91 else if( SCH_LABEL_BASE* label = dynamic_cast<SCH_LABEL_BASE*>( aParent ) )
92 m_ordinal = label->GetNextFieldOrdinal();
93 }
94}
95
96
98 SCH_FIELD( aParent, FIELD_T::USER, wxEmptyString )
99{
100 SCH_ITEM::operator=( *aText );
101 EDA_TEXT::operator=( *aText );
102}
103
104
106 SCH_ITEM( aField ),
107 EDA_TEXT( aField )
108{
109 m_private = aField.m_private;
110 setId( aField.m_id ); // will also set the layer
111 m_ordinal = aField.m_ordinal;
112 m_name = aField.m_name;
113 m_showName = aField.m_showName;
116 m_autoAdded = aField.m_autoAdded;
119
120 m_renderCache.reset();
121}
122
123
125{
126 EDA_TEXT::operator=( aField );
127
128 m_private = aField.m_private;
129 setId( aField.m_id ); // will also set the layer
130 m_ordinal = aField.m_ordinal;
131 m_name = aField.m_name;
132 m_showName = aField.m_showName;
136
137 m_renderCache.reset();
138
139 return *this;
140}
141
142
144{
145 return new SCH_FIELD( *this );
146}
147
148
149void SCH_FIELD::Copy( SCH_FIELD* aTarget ) const
150{
151 *aTarget = *this;
152}
153
154
156{
157 m_id = aId;
159}
160
161
166
167
168wxString SCH_FIELD::GetShownText( const SCH_SHEET_PATH* aPath, bool aAllowExtraText, int aDepth,
169 const wxString& aVariantName ) const
170{
171 wxString text = getUnescapedText( aPath, aVariantName );
172
173 if( IsNameShown() && aAllowExtraText )
174 text = GetShownName() << wxS( ": " ) << text;
175
176 if( HasTextVars() )
177 text = ResolveText( text, aPath, aDepth );
178
179 if( m_id == FIELD_T::SHEET_FILENAME && aAllowExtraText && !IsNameShown() )
180 text = _( "File:" ) + wxS( " " ) + text;
181
182 // Convert escape markers back to literals for final display
183 text.Replace( wxT( "<<<ESC_DOLLAR:" ), wxT( "${" ) );
184 text.Replace( wxT( "<<<ESC_AT:" ), wxT( "@{" ) );
185
186 return text;
187}
188
189
190wxString SCH_FIELD::GetShownText( bool aAllowExtraText, int aDepth ) const
191{
192 if( SCHEMATIC* schematic = Schematic() )
193 {
194 const SCH_SHEET_PATH& currentSheet = schematic->CurrentSheet();
195 wxString variantName = schematic->GetCurrentVariant();
196
197 wxLogTrace( traceSchFieldRendering,
198 "GetShownText (no path arg): field=%s, current sheet path='%s', variant='%s', size=%zu, empty=%d",
199 GetName(), currentSheet.Path().AsString(), variantName, currentSheet.size(),
200 currentSheet.empty() ? 1 : 0 );
201 return GetShownText( &currentSheet, aAllowExtraText, aDepth, variantName );
202 }
203 else
204 {
205 return GetShownText( nullptr, aAllowExtraText, aDepth );
206 }
207}
208
209
210wxString SCH_FIELD::GetFullText( int unit ) const
211{
212 if( GetId() != FIELD_T::REFERENCE )
213 return GetText();
214
215 wxString text = GetText();
216 text << wxT( "?" );
217
218 if( GetParentSymbol() && GetParentSymbol()->IsMultiUnit() )
219 text << LIB_SYMBOL::LetterSubReference( unit, 'A' );
220
221 return text;
222}
223
224
226{
228}
229
230
232{
234
235 if( !font )
236 font = KIFONT::FONT::GetFont( GetDefaultFont( aSettings ), IsBold(), IsItalic() );
237
238 return font;
239}
240
241
247
248
254
255
256std::vector<std::unique_ptr<KIFONT::GLYPH>>*
257SCH_FIELD::GetRenderCache( const wxString& forResolvedText, const VECTOR2I& forPosition, TEXT_ATTRIBUTES& aAttrs ) const
258{
259 KIFONT::FONT* font = GetDrawFont( nullptr );
260
261 if( font->IsOutline() )
262 {
263 KIFONT::OUTLINE_FONT* outlineFont = static_cast<KIFONT::OUTLINE_FONT*>( font );
264
265 if( !m_renderCache )
266 m_renderCache = std::make_unique<SCH_FIELD_RENDER_CACHE_DATA>();
267
268 if( m_renderCache->glyphs.empty() )
269 {
270 m_renderCache->glyphs.clear();
271
272 outlineFont->GetLinesAsGlyphs( &m_renderCache->glyphs, forResolvedText, forPosition, aAttrs,
273 GetFontMetrics() );
274
275 m_renderCache->pos = forPosition;
276 }
277
278 if( m_renderCache->pos != forPosition )
279 {
280 VECTOR2I delta = forPosition - m_renderCache->pos;
281
282 for( std::unique_ptr<KIFONT::GLYPH>& glyph : m_renderCache->glyphs )
283 {
284 if( glyph->IsOutline() )
285 static_cast<KIFONT::OUTLINE_GLYPH*>( glyph.get() )->Move( delta );
286 else
287 static_cast<KIFONT::STROKE_GLYPH*>( glyph.get() )->Move( delta );
288 }
289
290 m_renderCache->pos = forPosition;
291 }
292
293 return &m_renderCache->glyphs;
294 }
295
296 return nullptr;
297}
298
299
300void SCH_FIELD::ImportValues( const SCH_FIELD& aSource )
301{
302 SetAttributes( aSource );
303 SetVisible( aSource.IsVisible() );
304 SetNameShown( aSource.IsNameShown() );
305 SetCanAutoplace( aSource.CanAutoplace() );
306}
307
308
310{
311 wxCHECK_RET( aItem && aItem->Type() == SCH_FIELD_T, wxT( "Cannot swap with invalid item." ) );
312
313 SCH_FIELD* item = static_cast<SCH_FIELD*>( aItem );
314
315 std::swap( m_showName, item->m_showName );
316 std::swap( m_allowAutoPlace, item->m_allowAutoPlace );
317 std::swap( m_isGeneratedField, item->m_isGeneratedField );
318 SwapText( *item );
319 SwapAttributes( *item );
320
321 std::swap( m_lastResolvedColor, item->m_lastResolvedColor );
322}
323
324
326{
328 {
330 }
331 else
332 {
333 SCH_LABEL_BASE* parentLabel = dynamic_cast<SCH_LABEL_BASE*>( GetParent() );
334
335 if( parentLabel && !parentLabel->IsConnectivityDirty() )
337 else
339 }
340
341 return m_lastResolvedColor;
342}
343
344
345std::vector<int> SCH_FIELD::ViewGetLayers() const
346{
348}
349
350
352{
353 if( m_parent && m_parent->Type() == SCH_LABEL_T )
354 {
355 if( GetCanonicalName() == wxT( "Netclass" ) || GetCanonicalName() == wxT( "Component Class" ) )
356 {
357 return LAYER_NETCLASS_REFS;
358 }
359 }
360
361 switch( m_id )
362 {
364 case FIELD_T::VALUE: return LAYER_VALUEPART;
369 default: return LAYER_FIELDS;
370 }
371}
372
373
375{
376 // Calculate the text orientation according to the symbol orientation.
377 EDA_ANGLE orient = GetTextAngle();
378
379 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
380 {
381 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
382
383 if( parentSymbol && parentSymbol->GetTransform().y1 ) // Rotate symbol 90 degrees.
384 {
385 if( orient.IsHorizontal() )
386 orient = ANGLE_VERTICAL;
387 else
388 orient = ANGLE_HORIZONTAL;
389 }
390 }
391
392 return orient;
393}
394
395
397{
398 BOX2I bbox = GetTextBox( nullptr );
399
400 // Calculate the bounding box position relative to the parent:
401 VECTOR2I origin = GetParentPosition();
402 VECTOR2I pos = GetTextPos() - origin;
403 VECTOR2I begin = bbox.GetOrigin() - origin;
404 VECTOR2I end = bbox.GetEnd() - origin;
405 RotatePoint( begin, pos, GetTextAngle() );
406 RotatePoint( end, pos, GetTextAngle() );
407
408 // Now, apply the symbol transform (mirror/rot)
409 TRANSFORM transform;
410
411 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
412 transform = static_cast<SCH_SYMBOL*>( m_parent )->GetTransform();
413
414 bbox.SetOrigin( transform.TransformCoordinate( begin ) );
415 bbox.SetEnd( transform.TransformCoordinate( end ) );
416
417 bbox.Move( origin );
418 bbox.Normalize();
419
420 return bbox;
421}
422
423
425{
426 VECTOR2I render_center = GetBoundingBox().Centre();
427 VECTOR2I pos = GetPosition();
428
429 switch( GetHorizJustify() )
430 {
432 if( GetDrawRotation().IsVertical() )
433 return render_center.y > pos.y;
434 else
435 return render_center.x < pos.x;
436
438 if( GetDrawRotation().IsVertical() )
439 return render_center.y < pos.y;
440 else
441 return render_center.x > pos.x;
442
443 default:
444 return false;
445 }
446}
447
448
450{
451 GR_TEXT_H_ALIGN_T actualJustify;
452
453 switch( aJustify )
454 {
457 break;
458
461 break;
462
463 default:
464 actualJustify = aJustify;
465 }
466
467 SetHorizJustify( actualJustify );
468}
469
470
480
481
483{
484 VECTOR2I render_center = GetBoundingBox().Centre();
485 VECTOR2I pos = GetPosition();
486
487 switch( GetVertJustify() )
488 {
490 if( GetDrawRotation().IsVertical() )
491 return render_center.x < pos.x;
492 else
493 return render_center.y < pos.y;
494
496 if( GetDrawRotation().IsVertical() )
497 return render_center.x > pos.x;
498 else
499 return render_center.y > pos.y;
500
501 default:
502 return false;
503 }
504}
505
506
508{
509 GR_TEXT_V_ALIGN_T actualJustify;
510
511 switch( aJustify )
512 {
515 break;
516
519 break;
520
521 default:
522 actualJustify = aJustify;
523 }
524
525 SetVertJustify( actualJustify );
526}
527
528
538
539
540bool SCH_FIELD::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const
541{
542 bool searchHiddenFields = aSearchData.searchAllFields;
543 bool searchAndReplace = aSearchData.searchAndReplace;
544 bool replaceReferences = false;
545
546 try
547 {
548 // downcast
549 const SCH_SEARCH_DATA& schSearchData = dynamic_cast<const SCH_SEARCH_DATA&>( aSearchData );
550 replaceReferences = schSearchData.replaceReferences;
551 }
552 catch( const std::bad_cast& )
553 {
554 }
555
556 wxString text = UnescapeString( GetText() );
557
558 if( !IsVisible() && !searchHiddenFields )
559 return false;
560
561 if( m_id == FIELD_T::REFERENCE )
562 {
563 if( searchAndReplace && !replaceReferences )
564 return false;
565
566 SCH_SYMBOL* parentSymbol = dyn_cast<SCH_SYMBOL*>( m_parent );
567
568 // The parent might be a LIB_SYMBOL, in which case, we don't
569 // have a sheet path to resolve the reference.
570 if( !parentSymbol )
571 return false;
572
573 if( parentSymbol->Matches( aSearchData, aAuxData ) )
574 return true;
575
576 wxASSERT( aAuxData );
577
578 // Take sheet path into account which effects the reference field and the unit for
579 // symbols with multiple parts.
580 if( aAuxData )
581 {
582 SCH_SHEET_PATH* sheet = (SCH_SHEET_PATH*) aAuxData;
583 text = parentSymbol->GetRef( sheet );
584
585 if( SCH_ITEM::Matches( text, aSearchData ) )
586 return true;
587
588 if( parentSymbol->GetUnitCount() > 1 )
589 text << parentSymbol->SubReference( parentSymbol->GetUnitSelection( sheet ) );
590 }
591 }
592
593 return SCH_ITEM::Matches( text, aSearchData );
594}
595
596
597void SCH_FIELD::OnScintillaCharAdded( SCINTILLA_TRICKS* aScintillaTricks, wxStyledTextEvent& aEvent ) const
598{
599 SCH_ITEM* parent = dynamic_cast<SCH_ITEM*>( GetParent() );
600 SCHEMATIC* schematic = parent ? parent->Schematic() : nullptr;
601
602 if( !schematic )
603 return;
604
605 wxStyledTextCtrl* scintilla = aScintillaTricks->Scintilla();
606 int key = aEvent.GetKey();
607
608 wxArrayString autocompleteTokens;
609 int pos = scintilla->GetCurrentPos();
610 int start = scintilla->WordStartPosition( pos, true );
611 wxString partial;
612
613 // Multi-line fields are not allowed. So remove '\n' if entered.
614 if( key == '\n' )
615 {
616 wxString text = scintilla->GetText();
617 int currpos = scintilla->GetCurrentPos();
618 text.Replace( wxS( "\n" ), wxS( "" ) );
619 scintilla->SetText( text );
620 scintilla->GotoPos( currpos - 1 );
621 return;
622 }
623
624 auto textVarRef =
625 [&]( int pt )
626 {
627 return pt >= 2 && scintilla->GetCharAt( pt - 2 ) == '$' && scintilla->GetCharAt( pt - 1 ) == '{';
628 };
629
630 // Check for cross-reference
631 if( start > 1 && scintilla->GetCharAt( start - 1 ) == ':' )
632 {
633 int refStart = scintilla->WordStartPosition( start - 1, true );
634
635 if( textVarRef( refStart ) )
636 {
637 partial = scintilla->GetRange( start, pos );
638
639 wxString ref = scintilla->GetRange( refStart, start - 1 );
640
641 if( ref == wxS( "OP" ) )
642 {
643 // SPICE operating points use ':' syntax for ports
644 if( SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( parent ) )
645 {
646 NULL_REPORTER devnull;
647 SCH_SHEET_PATH& sheet = schematic->CurrentSheet();
648 wxString variant = schematic->GetCurrentVariant();
649 SIM_LIB_MGR mgr( &schematic->Project() );
650
651 std::vector<EMBEDDED_FILES*> embeddedFilesStack;
652 embeddedFilesStack.push_back( schematic->GetEmbeddedFiles() );
653
654 if( EMBEDDED_FILES* symbolEmbeddedFiles = symbol->GetEmbeddedFiles() )
655 {
656 embeddedFilesStack.push_back( symbolEmbeddedFiles );
657 symbol->GetLibSymbolRef()->AppendParentEmbeddedFiles( embeddedFilesStack );
658 }
659
660 mgr.SetFilesStack( std::move( embeddedFilesStack ) );
661
662 SIM_MODEL& model = mgr.CreateModel( &sheet, *symbol, true, 0, variant, devnull ).model;
663
664 for( wxString pin : model.GetPinNames() )
665 {
666 if( pin.StartsWith( '<' ) && pin.EndsWith( '>' ) )
667 autocompleteTokens.push_back( pin.Mid( 1, pin.Length() - 2 ) );
668 else
669 autocompleteTokens.push_back( pin );
670 }
671
672 // add the synthetic port for power measurements
673 autocompleteTokens.push_back( wxT( "power" ) );
674 }
675 }
676 else
677 {
679 SCH_SYMBOL* refSymbol = nullptr;
680
681 schematic->Hierarchy().GetSymbols( refs );
682
683 for( size_t jj = 0; jj < refs.GetCount(); jj++ )
684 {
685 if( refs[jj].GetSymbol()->GetRef( &refs[jj].GetSheetPath(), true ) == ref )
686 {
687 refSymbol = refs[jj].GetSymbol();
688 break;
689 }
690 }
691
692 if( refSymbol )
693 refSymbol->GetContextualTextVars( &autocompleteTokens );
694 }
695 }
696 }
697 else if( textVarRef( start ) )
698 {
699 partial = scintilla->GetTextRange( start, pos );
700
701 SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( parent );
702 SCH_SHEET* sheet = dynamic_cast<SCH_SHEET*>( parent );
703 SCH_LABEL_BASE* label = dynamic_cast<SCH_LABEL_BASE*>( parent );
704
705 if( symbol )
706 {
707 symbol->GetContextualTextVars( &autocompleteTokens );
708
709 if( schematic->CurrentSheet().Last() )
710 schematic->CurrentSheet().Last()->GetContextualTextVars( &autocompleteTokens );
711 }
712
713 if( sheet )
714 sheet->GetContextualTextVars( &autocompleteTokens );
715
716 if( label )
717 label->GetContextualTextVars( &autocompleteTokens );
718
719 for( std::pair<wxString, wxString> entry : schematic->Project().GetTextVars() )
720 autocompleteTokens.push_back( entry.first );
721 }
722
723 aScintillaTricks->DoAutocomplete( partial, autocompleteTokens );
724 scintilla->SetFocus();
725}
726
727
729{
730 // See comments in SCH_FIELD::Replace(), below.
732 return false;
733
734 return true;
735}
736
737
739{
740 if( const SYMBOL* parentSymbol = GetParentSymbol() )
741 {
742 if( parentSymbol->IsLocked() )
743 return true;
744 }
745
746 if( const SCH_SHEET* parentSheet = dynamic_cast<const SCH_SHEET*>( m_parent ) )
747 {
748 if( parentSheet->IsLocked() )
749 return true;
750 }
751
752 return SCH_ITEM::IsLocked();
753}
754
755
756bool SCH_FIELD::Replace( const EDA_SEARCH_DATA& aSearchData, void* aAuxData )
757{
758 bool replaceReferences = false;
759
760 try
761 {
762 const SCH_SEARCH_DATA& schSearchData = dynamic_cast<const SCH_SEARCH_DATA&>( aSearchData );
763 replaceReferences = schSearchData.replaceReferences;
764 }
765 catch( const std::bad_cast& )
766 {
767 }
768
769 wxString text;
770 bool isReplaced = false;
771
772 if( m_id == FIELD_T::REFERENCE && m_parent && m_parent->Type() == SCH_SYMBOL_T )
773 {
774 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
775
776 if( !replaceReferences )
777 return false;
778
779 wxCHECK_MSG( aAuxData, false, wxT( "Need sheetpath to replace in refdes." ) );
780
781 text = parentSymbol->GetRef( (SCH_SHEET_PATH*) aAuxData );
782 isReplaced = EDA_ITEM::Replace( aSearchData, text );
783
784 if( isReplaced )
785 parentSymbol->SetRef( (SCH_SHEET_PATH*) aAuxData, text );
786 }
787 else
788 {
789 isReplaced = EDA_TEXT::Replace( aSearchData );
790
791 if( m_id == FIELD_T::SHEET_FILENAME && isReplaced )
792 {
793 // If we allowed this we'd have a bunch of work to do here, including warning
794 // about it not being undoable, checking for recursive hierarchies, reloading
795 // sheets, etc. See DIALOG_SHEET_PROPERTIES::TransferDataFromWindow().
796 }
797 }
798
799 return isReplaced;
800}
801
802
803void SCH_FIELD::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
804{
806
807 if( GetTextAngle().IsVertical() )
808 {
809 switch( horizJustify )
810 {
812 if( aRotateCCW )
814
815 break;
816
818 if( aRotateCCW )
820
821 break;
822
825 break;
826 }
827
829 }
830 else if( GetTextAngle().IsHorizontal() )
831 {
832 switch( horizJustify )
833 {
835 if( !aRotateCCW )
837
838 break;
839
841 if( !aRotateCCW )
843
844 break;
845
848 break;
849 }
850
852 }
853 else
854 {
855 wxFAIL_MSG( wxString::Format( wxT( "SCH_FIELD text angle is not horizontal or vertical: %f" ),
856 GetTextAngle().AsDegrees() ) );
857 }
858
859 VECTOR2I pt = GetPosition();
860 RotatePoint( pt, aCenter, aRotateCCW ? ANGLE_90 : ANGLE_270 );
861 SetPosition( pt );
862}
863
864
866{
867 int x = GetTextPos().x;
868
869 x -= aCenter;
870 x *= -1;
871 x += aCenter;
872
873 SetTextX( x );
874}
875
876
878{
879 int y = GetTextPos().y;
880
881 y -= aCenter;
882 y *= -1;
883 y += aCenter;
884
885 SetTextY( y );
886}
887
888
889void SCH_FIELD::BeginEdit( const VECTOR2I& aPosition )
890{
891 SetTextPos( aPosition );
892}
893
894
895void SCH_FIELD::CalcEdit( const VECTOR2I& aPosition )
896{
897 SetTextPos( aPosition );
898}
899
900
901wxString SCH_FIELD::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
902{
903 wxString content = aFull ? GetShownText( false ) : KIUI::EllipsizeMenuText( GetText() );
904
905 if( content.IsEmpty() )
906 {
907 return wxString::Format( _( "Field %s (empty)" ), UnescapeString( GetName() ) );
908 }
909 else
910 {
911 return wxString::Format( _( "Field %s '%s'" ), UnescapeString( GetName() ), content );
912 }
913}
914
915
916void SCH_FIELD::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
917{
918 wxString msg;
919
920 aList.emplace_back( _( "Symbol Field" ), UnescapeString( GetName() ) );
921
922 // Don't use GetShownText() here; we want to show the user the variable references
923 aList.emplace_back( _( "Text" ), KIUI::EllipsizeStatusText( aFrame, GetText() ) );
924
925 aList.emplace_back( _( "Visible" ), IsVisible() ? _( "Yes" ) : _( "No" ) );
926
927 aList.emplace_back( _( "Font" ), GetFont() ? GetFont()->GetName() : _( "Default" ) );
928
929 aList.emplace_back( _( "Style" ), GetTextStyleName() );
930
931 aList.emplace_back( _( "Text Size" ), aFrame->MessageTextFromValue( GetTextWidth() ) );
932
933 switch( GetHorizJustify() )
934 {
935 case GR_TEXT_H_ALIGN_LEFT: msg = _( "Left" ); break;
936 case GR_TEXT_H_ALIGN_CENTER: msg = _( "Center" ); break;
937 case GR_TEXT_H_ALIGN_RIGHT: msg = _( "Right" ); break;
939 }
940
941 aList.emplace_back( _( "H Justification" ), msg );
942
943 switch( GetVertJustify() )
944 {
945 case GR_TEXT_V_ALIGN_TOP: msg = _( "Top" ); break;
946 case GR_TEXT_V_ALIGN_CENTER: msg = _( "Center" ); break;
947 case GR_TEXT_V_ALIGN_BOTTOM: msg = _( "Bottom" ); break;
949 }
950
951 aList.emplace_back( _( "V Justification" ), msg );
952}
953
954
956{
958 return true;
959
961 return true;
962
963 return IsURL( GetShownText( false ) );
964}
965
966
967void SCH_FIELD::DoHypertextAction( EDA_DRAW_FRAME* aFrame, const VECTOR2I& aMousePos ) const
968{
969 constexpr int START_ID = 1;
970
971 wxString href;
972
974 {
975 SCH_LABEL_BASE* label = static_cast<SCH_LABEL_BASE*>( m_parent );
976 SCH_SHEET_PATH* sheet = &label->Schematic()->CurrentSheet();
977 wxMenu menu;
978
979 std::vector<std::pair<wxString, wxString>> pages;
980
981 label->GetIntersheetRefs( sheet, &pages );
982
983 for( int i = 0; i < (int) pages.size(); ++i )
984 {
985 menu.Append( i + START_ID,
986 wxString::Format( _( "Go to Page %s (%s)" ), pages[i].first, pages[i].second ) );
987 }
988
989 menu.AppendSeparator();
990 menu.Append( 999 + START_ID, _( "Back to Previous Selected Sheet" ) );
991
992 int sel = aFrame->GetPopupMenuSelectionFromUser( menu ) - START_ID;
993
994 if( sel >= 0 && sel < (int) pages.size() )
995 href = wxT( "#" ) + pages[sel].first;
996 else if( sel == 999 )
998 }
999 else if( IsURL( GetShownText( false ) ) || m_name == SIM_LIBRARY::LIBRARY_FIELD )
1000 {
1001 href = GetShownText( false );
1002 }
1003
1004 if( !href.IsEmpty() )
1005 {
1007 navTool->HypertextCommand( href );
1008 }
1009}
1010
1011
1012void SCH_FIELD::SetName( const wxString& aName )
1013{
1014 m_name = aName;
1016
1017 if( m_isGeneratedField )
1018 EDA_TEXT::SetText( aName );
1019}
1020
1021
1022void SCH_FIELD::SetText( const wxString& aText )
1023{
1024 // Don't allow modification of text value of generated fields.
1025 if( m_isGeneratedField )
1026 return;
1027
1028 // Mandatory fields should not have leading or trailing whitespace.
1029 if( IsMandatory() )
1030 EDA_TEXT::SetText( aText.Strip( wxString::both ) );
1031 else
1032 EDA_TEXT::SetText( aText );
1033}
1034
1035
1036void SCH_FIELD::SetText( const wxString& aText, const SCH_SHEET_PATH* aPath, const wxString& aVariantName )
1037{
1038 wxCHECK( m_parent, /* void */ );
1039
1040 if( m_isGeneratedField )
1041 return;
1042
1043 wxString tmp = aText;
1044
1045 if( IsMandatory() )
1046 tmp = aText.Strip( wxString::both ) ;
1047
1048 switch( m_parent->Type() )
1049 {
1050 case SCH_SYMBOL_T:
1051 {
1052 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( m_parent );
1053 wxCHECK( symbol, /* void */ );
1054 symbol->SetFieldText( GetName(), aText, aPath, aVariantName );
1055 break;
1056 }
1057
1058 case SCH_SHEET_T:
1059 {
1060 SCH_SHEET* sheet = static_cast<SCH_SHEET*>( m_parent );
1061 wxCHECK( sheet, /* void */ );
1062 sheet->SetFieldText( GetName(), aText, aPath, aVariantName );
1063 break;
1064 }
1065
1066 default:
1067 SCH_FIELD::SetText( aText );
1068 break;
1069 }
1070}
1071
1072
1073wxString SCH_FIELD::GetText( const SCH_SHEET_PATH* aPath, const wxString& aVariantName ) const
1074{
1075 wxString retv;
1076
1077 wxCHECK( aPath && m_parent, retv );
1078
1079 switch( m_parent->Type() )
1080 {
1081 case SCH_SYMBOL_T:
1082 {
1083 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( m_parent );
1084 wxCHECK( symbol, retv );
1085 retv = symbol->GetFieldText( GetName(), aPath, aVariantName );
1086 break;
1087 }
1088
1089 case SCH_SHEET_T:
1090 {
1091 SCH_SHEET* sheet = static_cast<SCH_SHEET*>( m_parent );
1092 wxCHECK( sheet, retv );
1093 retv = sheet->GetFieldText( GetName(), aPath, aVariantName );
1094 break;
1095 }
1096
1097 default:
1098 retv = GetText();
1099 break;
1100 }
1101
1102 return retv;
1103}
1104
1105
1106wxString SCH_FIELD::GetName( bool aUseDefaultName ) const
1107{
1108 if( m_parent && m_parent->IsType( labelTypes ) )
1109 return SCH_LABEL_BASE::GetDefaultFieldName( m_name, aUseDefaultName );
1110
1111 if( IsMandatory() )
1112 return GetCanonicalFieldName( m_id );
1113 else if( m_name.IsEmpty() && aUseDefaultName )
1115 else
1116 return m_name;
1117}
1118
1119
1121{
1122 if( m_parent && m_parent->IsType( labelTypes ) )
1123 {
1124 // These should be stored in canonical format, but just in case:
1125 if( m_name == _( "Net Class" ) || m_name == wxT( "Net Class" ) )
1126 return wxT( "Netclass" );
1127 }
1128
1129 if( IsMandatory() )
1130 return GetCanonicalFieldName( m_id );
1131
1132 return m_name;
1133}
1134
1135
1137{
1138 if( m_parent && ( m_parent->Type() == SCH_SYMBOL_T || m_parent->Type() == LIB_SYMBOL_T ) )
1139 {
1140 switch( m_id )
1141 {
1145 default: return BITMAPS::text;
1146 }
1147 }
1148
1149 return BITMAPS::text;
1150}
1151
1152
1153bool SCH_FIELD::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
1154{
1155 if( GetShownText( true ).IsEmpty() )
1156 return false;
1157
1158 BOX2I rect = GetBoundingBox();
1159
1160 // Text in symbol editor can have additional chars (ie: reference designators U? or U?A)
1161 if( m_parent && m_parent->Type() == LIB_SYMBOL_T )
1162 {
1163 SCH_FIELD temp( *this );
1164 temp.SetText( GetFullText() );
1165 rect = temp.GetBoundingBox();
1166 }
1167
1168 rect.Inflate( aAccuracy );
1169
1170 if( m_parent && m_parent->Type() == SCH_GLOBAL_LABEL_T )
1171 {
1172 SCH_GLOBALLABEL* label = static_cast<SCH_GLOBALLABEL*>( GetParent() );
1173 rect.Offset( label->GetSchematicTextOffset( nullptr ) );
1174 }
1175
1176 return rect.Contains( aPosition );
1177}
1178
1179
1180bool SCH_FIELD::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
1181{
1182 if( GetShownText( true ).IsEmpty() )
1183 return false;
1184
1185 if( m_flags & ( STRUCT_DELETED | SKIP_STRUCT ) )
1186 return false;
1187
1188 BOX2I rect = aRect;
1189
1190 rect.Inflate( aAccuracy );
1191
1192 if( GetParent() && GetParent()->Type() == SCH_GLOBAL_LABEL_T )
1193 {
1194 SCH_GLOBALLABEL* label = static_cast<SCH_GLOBALLABEL*>( GetParent() );
1195 rect.Offset( label->GetSchematicTextOffset( nullptr ) );
1196 }
1197
1198 if( aContained )
1199 return rect.Contains( GetBoundingBox() );
1200
1201 return rect.Intersects( GetBoundingBox() );
1202}
1203
1204
1205bool SCH_FIELD::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
1206{
1207 if( GetShownText( true ).IsEmpty() )
1208 return false;
1209
1210 if( m_flags & ( STRUCT_DELETED | SKIP_STRUCT ) )
1211 return false;
1212
1213 BOX2I bbox = GetBoundingBox();
1214
1215 if( GetParent() && GetParent()->Type() == SCH_GLOBAL_LABEL_T )
1216 {
1217 SCH_GLOBALLABEL* label = static_cast<SCH_GLOBALLABEL*>( GetParent() );
1218 bbox.Offset( label->GetSchematicTextOffset( nullptr ) );
1219 }
1220
1221 return KIGEOM::BoxHitTest( aPoly, bbox, aContained );
1222}
1223
1224
1225void SCH_FIELD::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts, int aUnit, int aBodyStyle,
1226 const VECTOR2I& aOffset, bool aDimmed )
1227{
1228 wxString text;
1229
1230 if( Schematic() )
1231 text = GetShownText( &Schematic()->CurrentSheet(), true, 0, Schematic()->GetCurrentVariant() );
1232 else
1233 text = GetShownText( true );
1234
1235 if( ( !IsVisible() && !IsForceVisible() ) || text.IsEmpty() || aBackground )
1236 return;
1237
1238 SCH_RENDER_SETTINGS* renderSettings = getRenderSettings( aPlotter );
1239 COLOR4D color = renderSettings->GetLayerColor( GetLayer() );
1240 int penWidth = GetEffectiveTextPenWidth( renderSettings->GetDefaultPenWidth() );
1241
1242 COLOR4D bg = renderSettings->GetBackgroundColor();
1243
1244 if( bg == COLOR4D::UNSPECIFIED || !aPlotter->GetColorMode() )
1245 bg = COLOR4D::WHITE;
1246
1247 if( aPlotter->GetColorMode() && GetTextColor() != COLOR4D::UNSPECIFIED )
1248 color = GetTextColor();
1249
1250 if( color.m_text && Schematic() )
1251 color = COLOR4D( ResolveText( *color.m_text, &Schematic()->CurrentSheet() ) );
1252
1253 if( aDimmed )
1254 {
1255 color.Desaturate();
1256 color = color.Mix( bg, 0.5f );
1257 }
1258
1259 penWidth = std::max( penWidth, renderSettings->GetMinPenWidth() );
1260
1261 // clamp the pen width to be sure the text is readable
1262 penWidth = std::min( penWidth, std::min( GetTextSize().x, GetTextSize().y ) / 4 );
1263
1264 if( !IsVisible() && !renderSettings->m_ShowHiddenFields )
1265 return;
1266
1267 // Calculate the text orientation, according to the symbol orientation/mirror
1268 EDA_ANGLE orient = GetTextAngle();
1269 VECTOR2I textpos = GetTextPos();
1271 GR_TEXT_V_ALIGN_T vjustify = GetVertJustify();
1272
1273 if( renderSettings->m_Transform.y1 ) // Rotate symbol 90 deg.
1274 {
1275 if( orient.IsHorizontal() )
1276 orient = ANGLE_VERTICAL;
1277 else
1278 orient = ANGLE_HORIZONTAL;
1279 }
1280
1281 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
1282 {
1283 /*
1284 * Calculate the text justification, according to the symbol orientation/mirror. This is
1285 * a bit complicated due to cumulative calculations:
1286 * - numerous cases (mirrored or not, rotation)
1287 * - the plotter's Text() function will also recalculate H and V justifications according
1288 * to the text orientation
1289 * - when a symbol is mirrored the text is not, and justifications become a nightmare
1290 *
1291 * So the easier way is to use no justifications (centered text) and use GetBoundingBox
1292 * to know the text coordinate considered as centered.
1293 */
1294 hjustify = GR_TEXT_H_ALIGN_CENTER;
1295 vjustify = GR_TEXT_V_ALIGN_CENTER;
1296 textpos = GetBoundingBox().Centre();
1297 }
1298 else if( m_parent && m_parent->Type() == LIB_SYMBOL_T )
1299 {
1300 // Library-symbol exports (CLI/symbol editor) provide an item offset in the same coordinate
1301 // frame as body graphics/pins. Apply the same transform+offset pipeline to field text.
1302 textpos = renderSettings->TransformCoordinate( textpos ) + aOffset;
1303 }
1304 else if( m_parent && m_parent->Type() == SCH_GLOBAL_LABEL_T )
1305 {
1306 SCH_GLOBALLABEL* label = static_cast<SCH_GLOBALLABEL*>( m_parent );
1307 textpos += label->GetSchematicTextOffset( renderSettings );
1308 }
1309 else if( m_parent && m_parent->Type() == SCH_DIRECTIVE_LABEL_T )
1310 {
1311 SCH_DIRECTIVE_LABEL* label = static_cast<SCH_DIRECTIVE_LABEL*>( m_parent );
1312 std::shared_ptr<NETCLASS> nc = label->GetEffectiveNetClass();
1313
1314 if( nc && ( nc->GetSchematicColor() != COLOR4D::UNSPECIFIED ) && aPlotter->GetColorMode() )
1315 color = nc->GetSchematicColor();
1316 }
1317
1318 KIFONT::FONT* font = GetDrawFont( renderSettings );
1320 attrs.m_StrokeWidth = penWidth;
1321 attrs.m_Halign = hjustify;
1322 attrs.m_Valign = vjustify;
1323 attrs.m_Angle = orient;
1324 attrs.m_Multiline = false;
1325
1326 aPlotter->PlotText( textpos, color, text, attrs, font, GetFontMetrics() );
1327
1329 {
1330 if( SCH_LABEL_BASE* label = dynamic_cast<SCH_LABEL_BASE*>( m_parent ) )
1331 {
1332 std::vector<std::pair<wxString, wxString>> pages;
1333 std::vector<wxString> pageHrefs;
1334
1335 label->GetIntersheetRefs( &Schematic()->CurrentSheet(), &pages );
1336
1337 for( const auto& [pageNumber, sheetName] : pages )
1338 pageHrefs.push_back( wxT( "#" ) + pageNumber );
1339
1340 BOX2I bbox = GetBoundingBox();
1341 bbox.Offset( label->GetSchematicTextOffset( renderSettings ) );
1342
1343 aPlotter->HyperlinkMenu( bbox, pageHrefs );
1344 }
1345 }
1346}
1347
1348
1349void SCH_FIELD::SetPosition( const VECTOR2I& aPosition )
1350{
1351 // Actual positions are calculated by the rotation/mirror transform of the parent symbol
1352 // of the field. The inverse transform is used to calculate the position relative to the
1353 // parent symbol.
1354 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
1355 {
1356 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
1357 VECTOR2I relPos = aPosition - parentSymbol->GetPosition();
1358
1359 relPos = parentSymbol->GetTransform().InverseTransform().TransformCoordinate( relPos );
1360
1361 SetTextPos( relPos + parentSymbol->GetPosition() );
1362 return;
1363 }
1364
1365 SetTextPos( aPosition );
1366}
1367
1368
1370{
1371 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
1372 {
1373 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
1374 VECTOR2I relativePos = GetTextPos() - parentSymbol->GetPosition();
1375
1376 relativePos = parentSymbol->GetTransform().TransformCoordinate( relativePos );
1377
1378 return relativePos + parentSymbol->GetPosition();
1379 }
1380
1381 return GetTextPos();
1382}
1383
1384
1386{
1387 return m_parent ? m_parent->GetPosition() : VECTOR2I( 0, 0 );
1388}
1389
1390
1397
1398
1399bool SCH_FIELD::operator<( const SCH_ITEM& aItem ) const
1400{
1401 if( Type() != aItem.Type() )
1402 return Type() < aItem.Type();
1403
1404 auto field = static_cast<const SCH_FIELD*>( &aItem );
1405
1406 if( GetId() != field->GetId() )
1407 return GetId() < field->GetId();
1408
1409 if( GetText() != field->GetText() )
1410 return GetText() < field->GetText();
1411
1412 if( GetLibPosition().x != field->GetLibPosition().x )
1413 return GetLibPosition().x < field->GetLibPosition().x;
1414
1415 if( GetLibPosition().y != field->GetLibPosition().y )
1416 return GetLibPosition().y < field->GetLibPosition().y;
1417
1418 return GetName() < field->GetName();
1419}
1420
1421
1422bool SCH_FIELD::operator==( const SCH_ITEM& aOther ) const
1423{
1424 if( Type() != aOther.Type() )
1425 return false;
1426
1427 const SCH_FIELD& field = static_cast<const SCH_FIELD&>( aOther );
1428
1429 return *this == field;
1430}
1431
1432
1433bool SCH_FIELD::operator==( const SCH_FIELD& aOther ) const
1434{
1435 // Identical fields of different symbols are not equal.
1436 if( !GetParentSymbol() || !aOther.GetParentSymbol()
1437 || GetParentSymbol()->m_Uuid != aOther.GetParentSymbol()->m_Uuid )
1438 {
1439 return false;
1440 }
1441
1442 if( IsMandatory() != aOther.IsMandatory() )
1443 return false;
1444
1445 if( IsMandatory() )
1446 {
1447 if( GetId() != aOther.GetId() )
1448 return false;
1449 }
1450 else
1451 {
1452 if( GetOrdinal() != aOther.GetOrdinal() )
1453 return false;
1454 }
1455
1456 if( GetPosition() != aOther.GetPosition() )
1457 return false;
1458
1459 if( IsGeneratedField() != aOther.IsGeneratedField() )
1460 return false;
1461
1462 if( IsNameShown() != aOther.IsNameShown() )
1463 return false;
1464
1465 if( CanAutoplace() != aOther.CanAutoplace() )
1466 return false;
1467
1468 return EDA_TEXT::operator==( aOther );
1469}
1470
1471
1472double SCH_FIELD::Similarity( const SCH_ITEM& aOther ) const
1473{
1474 if( Type() != aOther.Type() )
1475 return 0.0;
1476
1477 if( m_Uuid == aOther.m_Uuid )
1478 return 1.0;
1479
1480 const SCH_FIELD& field = static_cast<const SCH_FIELD&>( aOther );
1481
1482 double similarity = 0.99; // The UUIDs are different, so we start with non-identity
1483
1484 if( GetId() != field.GetId() )
1485 {
1486 // We don't allow swapping of mandatory fields, so these cannot be the same item
1487 if( IsMandatory() || field.IsMandatory() )
1488 return 0.0;
1489 else
1490 similarity *= 0.5;
1491 }
1492
1493 similarity *= SimilarityBase( aOther );
1494
1495 similarity *= EDA_TEXT::Similarity( field );
1496
1497 if( GetPosition() != field.GetPosition() )
1498 similarity *= 0.5;
1499
1500 if( IsGeneratedField() != field.IsGeneratedField() )
1501 similarity *= 0.5;
1502
1503 if( IsNameShown() != field.IsNameShown() )
1504 similarity *= 0.5;
1505
1506 if( CanAutoplace() != field.CanAutoplace() )
1507 similarity *= 0.5;
1508
1509 return similarity;
1510}
1511
1512
1513int SCH_FIELD::compare( const SCH_ITEM& aOther, int aCompareFlags ) const
1514{
1515 wxASSERT( aOther.Type() == SCH_FIELD_T );
1516
1517 int compareFlags = aCompareFlags;
1518
1519 // For ERC tests, the field position has no matter, so do not test it
1520 if( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::ERC )
1522
1523 int retv = SCH_ITEM::compare( aOther, compareFlags );
1524
1525 if( retv )
1526 return retv;
1527
1528 const SCH_FIELD* tmp = static_cast<const SCH_FIELD*>( &aOther );
1529
1530 // Equality test will vary depending whether or not the field is mandatory. Otherwise,
1531 // sorting is done by ordinal.
1532 if( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::EQUALITY )
1533 {
1534 // Mandatory fields have fixed ordinals and their names can vary due to translated field
1535 // names. Optional fields have fixed names and their ordinals can vary.
1536 if( IsMandatory() )
1537 {
1538 if( m_id != tmp->m_id )
1539 return (int) m_id - (int) tmp->m_id;
1540 }
1541 else
1542 {
1543 retv = m_name.Cmp( tmp->m_name );
1544
1545 if( retv )
1546 return retv;
1547 }
1548 }
1549 else // assume we're sorting
1550 {
1551 if( m_id != tmp->m_id )
1552 return (int) m_id - (int) tmp->m_id;
1553 }
1554
1555 bool ignoreFieldText = false;
1556
1557 if( m_id == FIELD_T::REFERENCE && !( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::EQUALITY ) )
1558 ignoreFieldText = true;
1559
1560 if( m_id == FIELD_T::VALUE && ( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::ERC ) )
1561 ignoreFieldText = true;
1562
1563 if( !ignoreFieldText )
1564 {
1565 retv = GetText().CmpNoCase( tmp->GetText() );
1566
1567 if( retv != 0 )
1568 return retv;
1569 }
1570
1571 if( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::EQUALITY )
1572 {
1573 if( GetTextPos().x != tmp->GetTextPos().x )
1574 return GetTextPos().x - tmp->GetTextPos().x;
1575
1576 if( GetTextPos().y != tmp->GetTextPos().y )
1577 return GetTextPos().y - tmp->GetTextPos().y;
1578 }
1579
1580 // For ERC tests, the field size has no matter, so do not test it
1581 if( !( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::ERC ) )
1582 {
1583 if( GetTextWidth() != tmp->GetTextWidth() )
1584 return GetTextWidth() - tmp->GetTextWidth();
1585
1586 if( GetTextHeight() != tmp->GetTextHeight() )
1587 return GetTextHeight() - tmp->GetTextHeight();
1588 }
1589
1590 return 0;
1591}
1592
1593
1594wxString SCH_FIELD::getUnescapedText( const SCH_SHEET_PATH* aPath, const wxString& aVariantName ) const
1595{
1596 // This is the default variant field text for all fields except the reference field.
1597 wxString retv = EDA_TEXT::GetShownText( false );
1598
1599 // Special handling for parent object field instance and variant information.
1600 // Only use the path if it's non-empty; an empty path can't match any instances
1601 if( m_parent && aPath && !aPath->empty() )
1602 {
1603 wxLogTrace( traceSchFieldRendering, " Path is valid and non-empty, parent type=%d", m_parent->Type() );
1604
1605 switch( m_parent->Type() )
1606 {
1607 case SCH_SYMBOL_T:
1608 if( const SCH_SYMBOL* symbol = static_cast<const SCH_SYMBOL*>( m_parent ) )
1609 {
1610 if( m_id == FIELD_T::REFERENCE )
1611 {
1612 wxLogTrace( traceSchFieldRendering, " Calling GetRef for symbol %s on path %s",
1613 symbol->m_Uuid.AsString(), aPath->Path().AsString() );
1614
1615 retv = symbol->GetRef( aPath, true );
1616
1617 wxLogTrace( traceSchFieldRendering, " GetRef returned: '%s'", retv );
1618 }
1619 else if( !aVariantName.IsEmpty() )
1620 {
1621 // If the variant is not found, fall back to default variant above.
1622 if( std::optional<SCH_SYMBOL_VARIANT> variant = symbol->GetVariant( *aPath, aVariantName ) )
1623 {
1624 // If the field name does not exist in the variant, fall back to the default variant above.
1625 if( variant->m_Fields.contains( GetName() ) )
1626 retv = variant->m_Fields[GetName()];
1627 }
1628 }
1629 }
1630
1631 break;
1632
1633 case SCH_SHEET_T:
1634 break;
1635
1636 default:
1637 break;
1638 }
1639 }
1640
1641 return retv;
1642}
1643
1644
1645static struct SCH_FIELD_DESC
1646{
1648 {
1649 // These are defined in EDA_TEXT as well but initialization order is
1650 // not defined, so this needs to be conditional. Defining in both
1651 // places leads to duplicate symbols.
1653
1654 if( h_inst.Choices().GetCount() == 0 )
1655 {
1656 h_inst.Map( GR_TEXT_H_ALIGN_LEFT, _HKI( "Left" ) );
1657 h_inst.Map( GR_TEXT_H_ALIGN_CENTER, _HKI( "Center" ) );
1658 h_inst.Map( GR_TEXT_H_ALIGN_RIGHT, _HKI( "Right" ) );
1659 }
1660
1662
1663 if( v_inst.Choices().GetCount() == 0 )
1664 {
1665 v_inst.Map( GR_TEXT_V_ALIGN_TOP, _HKI( "Top" ) );
1666 v_inst.Map( GR_TEXT_V_ALIGN_CENTER, _HKI( "Center" ) );
1667 v_inst.Map( GR_TEXT_V_ALIGN_BOTTOM, _HKI( "Bottom" ) );
1668 }
1669
1676
1677 // Lock state is inherited from parent symbol (no independent locking of child items)
1678 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( SCH_ITEM ), _HKI( "Locked" ) );
1679
1680 const wxString textProps = _HKI( "Text Properties" );
1681
1682 auto horiz = new PROPERTY_ENUM<SCH_FIELD, GR_TEXT_H_ALIGN_T>( _HKI( "Horizontal Justification" ),
1685
1686 propMgr.ReplaceProperty( TYPE_HASH( EDA_TEXT ), _HKI( "Horizontal Justification" ), horiz, textProps );
1687
1688 auto vert = new PROPERTY_ENUM<SCH_FIELD, GR_TEXT_V_ALIGN_T>( _HKI( "Vertical Justification" ),
1691
1692 propMgr.ReplaceProperty( TYPE_HASH( EDA_TEXT ), _HKI( "Vertical Justification" ), vert, textProps );
1693
1694 propMgr.AddProperty( new PROPERTY<SCH_FIELD, bool>( _HKI( "Show Field Name" ), &SCH_FIELD::SetNameShown,
1696
1697 propMgr.AddProperty( new PROPERTY<SCH_FIELD, bool>( _HKI( "Allow Autoplacement" ), &SCH_FIELD::SetCanAutoplace,
1699
1700 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Hyperlink" ) );
1701 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Thickness" ) );
1702 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Mirrored" ) );
1703 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Width" ) );
1704 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Height" ) );
1705
1706
1709 _HKI( "Text Properties" ) );
1710
1711 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Orientation" ) );
1712
1713 auto isNotGeneratedField = []( INSPECTABLE* aItem ) -> bool
1714 {
1715 if( SCH_FIELD* field = dynamic_cast<SCH_FIELD*>( aItem ) )
1716 return !field->IsGeneratedField();
1717
1718 return true;
1719 };
1720
1722 isNotGeneratedField );
1723
1724
1725 auto isNonMandatoryField = []( INSPECTABLE* aItem ) -> bool
1726 {
1727 if( SCH_FIELD* field = dynamic_cast<SCH_FIELD*>( aItem ) )
1728 return !field->IsMandatory();
1729
1730 return false;
1731 };
1732
1733 propMgr.OverrideAvailability( TYPE_HASH( SCH_FIELD ), TYPE_HASH( SCH_ITEM ), _HKI( "Private" ),
1734 isNonMandatoryField );
1735 }
1737
1738
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
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:405
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Definition color4d.h:402
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:528
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:112
EDA_ITEM_FLAGS m_flags
Definition eda_item.h:539
virtual bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const
Compare the item against the search criteria in aSearchData.
Definition eda_item.h:413
EDA_ITEM * GetParent() const
Definition eda_item.h:114
EDA_ITEM * m_parent
Owner.
Definition eda_item.h:540
bool IsForceVisible() const
Definition eda_item.h:218
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:246
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:41
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition eda_text.h:91
int GetTextHeight() const
Definition eda_text.h:278
const VECTOR2I & GetTextPos() const
Definition eda_text.h:284
COLOR4D GetTextColor() const
Definition eda_text.h:281
wxString GetTextStyleName() const
Definition eda_text.cpp:995
bool IsItalic() const
Definition eda_text.h:180
const EDA_ANGLE & GetTextAngle() const
Definition eda_text.h:158
void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
Definition eda_text.cpp:516
virtual bool IsVisible() const
Definition eda_text.h:198
void SetTextPos(const VECTOR2I &aPoint)
Definition eda_text.cpp:560
void SetTextX(int aX)
Definition eda_text.cpp:566
KIFONT::FONT * GetFont() const
Definition eda_text.h:258
void SetAttributes(const EDA_TEXT &aSrc, bool aSetPosition=true)
Set the text attributes from another instance.
Definition eda_text.cpp:417
void SetTextY(int aY)
Definition eda_text.cpp:572
EDA_TEXT & operator=(const EDA_TEXT &aItem)
Definition eda_text.cpp:148
int GetTextWidth() const
Definition eda_text.h:275
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:739
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
Definition eda_text.cpp:401
GR_TEXT_H_ALIGN_T GetHorizJustify() const
Definition eda_text.h:211
bool Replace(const EDA_SEARCH_DATA &aSearchData)
Helper function used in search and replace dialog.
Definition eda_text.cpp:470
bool HasTextVars() const
Indicates the ShownText has text var references which need to be processed.
Definition eda_text.h:128
virtual void SetVisible(bool aVisible)
Definition eda_text.cpp:370
EDA_TEXT(const EDA_IU_SCALE &aIuScale, const wxString &aText=wxEmptyString)
Definition eda_text.cpp:100
virtual void ClearBoundingBoxCache()
Definition eda_text.cpp:662
double Similarity(const EDA_TEXT &aOther) const
virtual void ClearRenderCache()
Definition eda_text.cpp:656
const TEXT_ATTRIBUTES & GetAttributes() const
Definition eda_text.h:242
int GetEffectiveTextPenWidth(int aDefaultPenWidth=0) const
The EffectiveTextPenWidth uses the text thickness if > 1 or aDefaultPenWidth.
Definition eda_text.cpp:449
void SwapAttributes(EDA_TEXT &aTradingPartner)
Swap the text attributes of the two involved instances.
Definition eda_text.cpp:436
bool IsBold() const
Definition eda_text.h:195
GR_TEXT_V_ALIGN_T GetVertJustify() const
Definition eda_text.h:214
virtual wxString GetShownText(bool aAllowExtraText, int aDepth=0) const
Return the string actually shown after processing of the base text.
Definition eda_text.h:120
virtual void SetText(const wxString &aText)
Definition eda_text.cpp:254
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
Definition eda_text.cpp:283
void SwapText(EDA_TEXT &aTradingPartner)
Definition eda_text.cpp:429
bool operator==(const EDA_TEXT &aRhs) const
Definition eda_text.h:409
VECTOR2I GetTextSize() const
Definition eda_text.h:272
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
Definition eda_text.cpp:393
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:38
FONT is an abstract base class for both outline and stroke fonts.
Definition font.h:98
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:106
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:105
std::shared_ptr< wxString > m_text
Definition color4d.h:399
COLOR4D & Desaturate()
Removes color (in HSL model)
Definition color4d.cpp:532
COLOR4D Mix(const COLOR4D &aColor, double aFactor) const
Return a color that is mixed with the input by a factor.
Definition color4d.h:296
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:365
static wxString LetterSubReference(int aUnit, wxChar aInitialLetter)
COLOR4D GetSchematicColor(bool aIsForSave=false) const
Definition netclass.h:216
A singleton reporter that reports to nowhere.
Definition reporter.h:216
Base plotter engine class.
Definition plotter.h:136
bool GetColorMode() const
Definition plotter.h:164
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:696
virtual void HyperlinkMenu(const BOX2I &aBox, const std::vector< wxString > &aDestURLs)
Create a clickable hyperlink menu with a rectangular click area.
Definition plotter.h:517
virtual std::map< wxString, wxString > & GetTextVars() const
Definition project.cpp:130
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:89
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:104
wxString GetCurrentVariant() const
Return the current variant being edited.
EMBEDDED_FILES * GetEmbeddedFiles() override
SCH_SHEET_PATH & CurrentSheet() const
Definition schematic.h:188
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:357
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.
bool IsLocked() const override
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:174
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:347
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:213
bool m_autoAdded
Was this field automatically added to a LIB_SYMBOL?
Definition sch_field.h:352
double Similarity(const SCH_ITEM &aItem) const override
Return a measure of how likely the other object is to represent the same object.
std::unique_ptr< SCH_FIELD_RENDER_CACHE_DATA > m_renderCache
Definition sch_field.h:355
bool IsGeneratedField() const
Generated fields are fields whose names are variables like ${VAR}.
Definition sch_field.h:222
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 HasHypertext() const override
Indicates that the item has at least one hypertext action.
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.
virtual const wxString & GetText() const override
Return the string associated with the text object.
Definition sch_field.h:123
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:127
void SetCanAutoplace(bool aCanPlace)
Definition sch_field.h:225
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:349
int m_ordinal
Sort order for non-mandatory fields.
Definition sch_field.h:344
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:343
void DoHypertextAction(EDA_DRAW_FRAME *aFrame, const VECTOR2I &aMousePos) const override
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:271
void setId(FIELD_T aId)
int GetOrdinal() const
Definition sch_field.h:129
bool IsEmpty()
Return true if both the name and value of the field are empty.
Definition sch_field.h:166
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0, const wxString &aVariantName=wxEmptyString) const
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:175
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)
bool CanAutoplace() const
Definition sch_field.h:224
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:353
void OnScintillaCharAdded(SCINTILLA_TRICKS *aScintillaTricks, wxStyledTextEvent &aEvent) const
wxString m_name
Definition sch_field.h:345
void SetNameShown(bool aShown=true)
Definition sch_field.h:214
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:348
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:168
SCH_ITEM & operator=(const SCH_ITEM &aPin)
Definition sch_item.cpp:82
SCH_RENDER_SETTINGS * getRenderSettings(PLOTTER *aPlotter) const
Definition sch_item.h:730
const SYMBOL * GetParentSymbol() const
Definition sch_item.cpp:275
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:269
bool IsLocked() const override
Definition sch_item.cpp:149
friend class LIB_SYMBOL
Definition sch_item.h:803
@ SKIP_TST_POS
Definition sch_item.h:713
std::shared_ptr< NETCLASS > GetEffectiveNetClass(const SCH_SHEET_PATH *aSheet=nullptr) const
Definition sch_item.cpp:524
void SetLayer(SCH_LAYER_ID aLayer)
Definition sch_item.h:345
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition sch_item.h:344
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:719
const wxString & GetDefaultFont(const RENDER_SETTINGS *aSettings) const
Definition sch_item.cpp:767
bool IsConnectivityDirty() const
Definition sch_item.h:591
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
Definition sch_item.cpp:56
bool m_private
Definition sch_item.h:784
wxString ResolveText(const wxString &aText, const SCH_SHEET_PATH *aPath, int aDepth=0) const
Definition sch_item.cpp:378
const KIFONT::METRICS & GetFontMetrics() const
Definition sch_item.cpp:780
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:383
void GetIntersheetRefs(const SCH_SHEET_PATH *aPath, std::vector< std::pair< wxString, wxString > > *pages)
Build an array of { pageNumber, pageName } pairs.
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 ...
VECTOR2I TransformCoordinate(const VECTOR2I &aPoint) const
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:48
void GetContextualTextVars(wxArrayString *aVars) const
Return the list of system text vars & fields for this sheet.
wxString GetFieldText(const wxString &aFieldName, const SCH_SHEET_PATH *aPath=nullptr, const wxString &aVariantName=wxEmptyString) const
void SetFieldText(const wxString &aFieldName, const wxString &aFieldText, const SCH_SHEET_PATH *aPath=nullptr, const wxString &aVariantName=wxEmptyString)
Schematic symbol object.
Definition sch_symbol.h:76
wxString SubReference(int aUnit, bool aAddSeparator=true) const
void SetFieldText(const wxString &aFieldName, const wxString &aFieldText, const SCH_SHEET_PATH *aPath=nullptr, const wxString &aVariantName=wxEmptyString)
wxString GetFieldText(const wxString &aFieldName, const SCH_SHEET_PATH *aPath=nullptr, const wxString &aVariantName=wxEmptyString) 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:871
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
A base class for LIB_SYMBOL and SCH_SYMBOL.
Definition symbol.h:63
const TRANSFORM & GetTransform() const
Definition symbol.h:247
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:323
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:451
@ LAYER_SHEETNAME
Definition layer_ids.h:474
@ LAYER_VALUEPART
Definition layer_ids.h:463
@ LAYER_FIELDS
Definition layer_ids.h:464
@ LAYER_SHEETFIELDS
Definition layer_ids.h:476
@ LAYER_REFERENCEPART
Definition layer_ids.h:462
@ LAYER_NETCLASS_REFS
Definition layer_ids.h:466
@ LAYER_SELECTION_SHADOWS
Definition layer_ids.h:497
@ LAYER_INTERSHEET_REFS
Definition layer_ids.h:465
@ LAYER_SHEETFILENAME
Definition layer_ids.h:475
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:46
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)
KIBIS_MODEL * model
KIBIS_PIN * pin
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:149
@ SCH_SYMBOL_T
Definition typeinfo.h:173
@ SCH_FIELD_T
Definition typeinfo.h:151
@ SCH_DIRECTIVE_LABEL_T
Definition typeinfo.h:172
@ SCH_LABEL_T
Definition typeinfo.h:168
@ SCH_SHEET_T
Definition typeinfo.h:176
@ SCH_LABEL_LOCATE_ANY_T
Definition typeinfo.h:192
@ SCH_GLOBAL_LABEL_T
Definition typeinfo.h:169
Casted dyn_cast(From aObject)
A lightweight dynamic downcast.
Definition typeinfo.h:60
#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:687