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,
192 const wxString& aVariantName ) const
193{
194 wxString text = getUnescapedText( aPath, aVariantName );
195
196 if( IsNameShown() && aAllowExtraText )
197 text = GetShownName() << wxS( ": " ) << text;
198
199 if( HasTextVars() )
200 text = ResolveText( text, aPath, aDepth );
201
202 if( m_id == FIELD_T::SHEET_FILENAME && aAllowExtraText && !IsNameShown() )
203 text = _( "File:" ) + wxS( " " ) + text;
204
205 // Convert escape markers back to literals for final display
206 text.Replace( wxT( "<<<ESC_DOLLAR:" ), wxT( "${" ) );
207 text.Replace( wxT( "<<<ESC_AT:" ), wxT( "@{" ) );
208
209 return text;
210}
211
212
213wxString SCH_FIELD::GetShownText( bool aAllowExtraText, int aDepth ) const
214{
215 if( SCHEMATIC* schematic = Schematic() )
216 {
217 const SCH_SHEET_PATH& currentSheet = schematic->CurrentSheet();
218 wxString variantName = schematic->GetCurrentVariant();
219
220 wxLogTrace( traceSchFieldRendering,
221 "GetShownText (no path arg): field=%s, current sheet path='%s', variant='%s', size=%zu, empty=%d",
222 GetName(), currentSheet.Path().AsString(), variantName, currentSheet.size(),
223 currentSheet.empty() ? 1 : 0 );
224 return GetShownText( &currentSheet, aAllowExtraText, aDepth, variantName );
225 }
226 else
227 return GetShownText( nullptr, aAllowExtraText, aDepth );
228}
229
230
231wxString SCH_FIELD::GetFullText( int unit ) const
232{
233 if( GetId() != FIELD_T::REFERENCE )
234 return GetText();
235
236 wxString text = GetText();
237 text << wxT( "?" );
238
239 if( GetParentSymbol() && GetParentSymbol()->IsMultiUnit() )
240 text << LIB_SYMBOL::LetterSubReference( unit, 'A' );
241
242 return text;
243}
244
245
247{
249}
250
251
253{
255
256 if( !font )
257 font = KIFONT::FONT::GetFont( GetDefaultFont( aSettings ), IsBold(), IsItalic() );
258
259 return font;
260}
261
262
268
269
275
276
277std::vector<std::unique_ptr<KIFONT::GLYPH>>*
278SCH_FIELD::GetRenderCache( const wxString& forResolvedText, const VECTOR2I& forPosition, TEXT_ATTRIBUTES& aAttrs ) const
279{
280 KIFONT::FONT* font = GetDrawFont( nullptr );
281
282 if( font->IsOutline() )
283 {
284 KIFONT::OUTLINE_FONT* outlineFont = static_cast<KIFONT::OUTLINE_FONT*>( font );
285
286 if( m_renderCache.empty() || !m_renderCacheValid )
287 {
288 m_renderCache.clear();
289
290 outlineFont->GetLinesAsGlyphs( &m_renderCache, forResolvedText, forPosition, aAttrs, GetFontMetrics() );
291
292 m_renderCachePos = forPosition;
293 m_renderCacheValid = true;
294 }
295
296 if( m_renderCachePos != forPosition )
297 {
298 VECTOR2I delta = forPosition - m_renderCachePos;
299
300 for( std::unique_ptr<KIFONT::GLYPH>& glyph : m_renderCache )
301 {
302 if( glyph->IsOutline() )
303 static_cast<KIFONT::OUTLINE_GLYPH*>( glyph.get() )->Move( delta );
304 else
305 static_cast<KIFONT::STROKE_GLYPH*>( glyph.get() )->Move( delta );
306 }
307
308 m_renderCachePos = forPosition;
309 }
310
311 return &m_renderCache;
312 }
313
314 return nullptr;
315}
316
317
318void SCH_FIELD::ImportValues( const SCH_FIELD& aSource )
319{
320 SetAttributes( aSource );
321 SetVisible( aSource.IsVisible() );
322 SetNameShown( aSource.IsNameShown() );
323 SetCanAutoplace( aSource.CanAutoplace() );
324}
325
326
328{
329 wxCHECK_RET( aItem && aItem->Type() == SCH_FIELD_T, wxT( "Cannot swap with invalid item." ) );
330
331 SCH_FIELD* item = static_cast<SCH_FIELD*>( aItem );
332
333 std::swap( m_showName, item->m_showName );
334 std::swap( m_allowAutoPlace, item->m_allowAutoPlace );
335 std::swap( m_isGeneratedField, item->m_isGeneratedField );
336 SwapText( *item );
337 SwapAttributes( *item );
338
339 std::swap( m_lastResolvedColor, item->m_lastResolvedColor );
340}
341
342
344{
346 {
348 }
349 else
350 {
351 SCH_LABEL_BASE* parentLabel = dynamic_cast<SCH_LABEL_BASE*>( GetParent() );
352
353 if( parentLabel && !parentLabel->IsConnectivityDirty() )
355 else
357 }
358
359 return m_lastResolvedColor;
360}
361
362
363std::vector<int> SCH_FIELD::ViewGetLayers() const
364{
366}
367
368
370{
371 if( m_parent && m_parent->Type() == SCH_LABEL_T )
372 {
373 if( GetCanonicalName() == wxT( "Netclass" ) || GetCanonicalName() == wxT( "Component Class" ) )
374 {
375 return LAYER_NETCLASS_REFS;
376 }
377 }
378
379 switch( m_id )
380 {
382 case FIELD_T::VALUE: return LAYER_VALUEPART;
387 default: return LAYER_FIELDS;
388 }
389}
390
391
393{
394 // Calculate the text orientation according to the symbol orientation.
395 EDA_ANGLE orient = GetTextAngle();
396
397 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
398 {
399 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
400
401 if( parentSymbol && parentSymbol->GetTransform().y1 ) // Rotate symbol 90 degrees.
402 {
403 if( orient.IsHorizontal() )
404 orient = ANGLE_VERTICAL;
405 else
406 orient = ANGLE_HORIZONTAL;
407 }
408 }
409
410 return orient;
411}
412
413
415{
416 BOX2I bbox = GetTextBox( nullptr );
417
418 // Calculate the bounding box position relative to the parent:
419 VECTOR2I origin = GetParentPosition();
420 VECTOR2I pos = GetTextPos() - origin;
421 VECTOR2I begin = bbox.GetOrigin() - origin;
422 VECTOR2I end = bbox.GetEnd() - origin;
423 RotatePoint( begin, pos, GetTextAngle() );
424 RotatePoint( end, pos, GetTextAngle() );
425
426 // Now, apply the symbol transform (mirror/rot)
427 TRANSFORM transform;
428
429 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
430 transform = static_cast<SCH_SYMBOL*>( m_parent )->GetTransform();
431
432 bbox.SetOrigin( transform.TransformCoordinate( begin ) );
433 bbox.SetEnd( transform.TransformCoordinate( end ) );
434
435 bbox.Move( origin );
436 bbox.Normalize();
437
438 return bbox;
439}
440
441
443{
444 VECTOR2I render_center = GetBoundingBox().Centre();
445 VECTOR2I pos = GetPosition();
446
447 switch( GetHorizJustify() )
448 {
450 if( GetDrawRotation().IsVertical() )
451 return render_center.y > pos.y;
452 else
453 return render_center.x < pos.x;
454
456 if( GetDrawRotation().IsVertical() )
457 return render_center.y < pos.y;
458 else
459 return render_center.x > pos.x;
460
461 default:
462 return false;
463 }
464}
465
466
468{
469 GR_TEXT_H_ALIGN_T actualJustify;
470
471 switch( aJustify )
472 {
475 break;
476
479 break;
480
481 default:
482 actualJustify = aJustify;
483 }
484
485 SetHorizJustify( actualJustify );
486}
487
488
498
499
501{
502 VECTOR2I render_center = GetBoundingBox().Centre();
503 VECTOR2I pos = GetPosition();
504
505 switch( GetVertJustify() )
506 {
508 if( GetDrawRotation().IsVertical() )
509 return render_center.x < pos.x;
510 else
511 return render_center.y < pos.y;
512
514 if( GetDrawRotation().IsVertical() )
515 return render_center.x > pos.x;
516 else
517 return render_center.y > pos.y;
518
519 default:
520 return false;
521 }
522}
523
524
526{
527 GR_TEXT_V_ALIGN_T actualJustify;
528
529 switch( aJustify )
530 {
533 break;
534
537 break;
538
539 default:
540 actualJustify = aJustify;
541 }
542
543 SetVertJustify( actualJustify );
544}
545
546
556
557
558bool SCH_FIELD::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const
559{
560 bool searchHiddenFields = aSearchData.searchAllFields;
561 bool searchAndReplace = aSearchData.searchAndReplace;
562 bool replaceReferences = false;
563
564 try
565 {
566 // downcast
567 const SCH_SEARCH_DATA& schSearchData = dynamic_cast<const SCH_SEARCH_DATA&>( aSearchData );
568 replaceReferences = schSearchData.replaceReferences;
569 }
570 catch( const std::bad_cast& )
571 {
572 }
573
574 wxString text = UnescapeString( GetText() );
575
576 if( !IsVisible() && !searchHiddenFields )
577 return false;
578
579 if( m_id == FIELD_T::REFERENCE )
580 {
581 if( searchAndReplace && !replaceReferences )
582 return false;
583
584 SCH_SYMBOL* parentSymbol = dyn_cast<SCH_SYMBOL*>( m_parent );
585
586 // The parent might be a LIB_SYMBOL, in which case, we don't
587 // have a sheet path to resolve the reference.
588 if( !parentSymbol )
589 return false;
590
591 if( parentSymbol->Matches( aSearchData, aAuxData ) )
592 return true;
593
594 wxASSERT( aAuxData );
595
596 // Take sheet path into account which effects the reference field and the unit for
597 // symbols with multiple parts.
598 if( aAuxData )
599 {
600 SCH_SHEET_PATH* sheet = (SCH_SHEET_PATH*) aAuxData;
601 text = parentSymbol->GetRef( sheet );
602
603 if( SCH_ITEM::Matches( text, aSearchData ) )
604 return true;
605
606 if( parentSymbol->GetUnitCount() > 1 )
607 text << parentSymbol->SubReference( parentSymbol->GetUnitSelection( sheet ) );
608 }
609 }
610
611 return SCH_ITEM::Matches( text, aSearchData );
612}
613
614
615void SCH_FIELD::OnScintillaCharAdded( SCINTILLA_TRICKS* aScintillaTricks, wxStyledTextEvent& aEvent ) const
616{
617 SCH_ITEM* parent = dynamic_cast<SCH_ITEM*>( GetParent() );
618 SCHEMATIC* schematic = parent ? parent->Schematic() : nullptr;
619
620 if( !schematic )
621 return;
622
623 wxStyledTextCtrl* scintilla = aScintillaTricks->Scintilla();
624 int key = aEvent.GetKey();
625
626 wxArrayString autocompleteTokens;
627 int pos = scintilla->GetCurrentPos();
628 int start = scintilla->WordStartPosition( pos, true );
629 wxString partial;
630
631 // Multi-line fields are not allowed. So remove '\n' if entered.
632 if( key == '\n' )
633 {
634 wxString text = scintilla->GetText();
635 int currpos = scintilla->GetCurrentPos();
636 text.Replace( wxS( "\n" ), wxS( "" ) );
637 scintilla->SetText( text );
638 scintilla->GotoPos( currpos - 1 );
639 return;
640 }
641
642 auto textVarRef =
643 [&]( int pt )
644 {
645 return pt >= 2 && scintilla->GetCharAt( pt - 2 ) == '$' && scintilla->GetCharAt( pt - 1 ) == '{';
646 };
647
648 // Check for cross-reference
649 if( start > 1 && scintilla->GetCharAt( start - 1 ) == ':' )
650 {
651 int refStart = scintilla->WordStartPosition( start - 1, true );
652
653 if( textVarRef( refStart ) )
654 {
655 partial = scintilla->GetRange( start, pos );
656
657 wxString ref = scintilla->GetRange( refStart, start - 1 );
658
659 if( ref == wxS( "OP" ) )
660 {
661 // SPICE operating points use ':' syntax for ports
662 if( SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( parent ) )
663 {
664 NULL_REPORTER devnull;
665 SCH_SHEET_PATH& sheet = schematic->CurrentSheet();
666 wxString variant = schematic->GetCurrentVariant();
667 SIM_LIB_MGR mgr( &schematic->Project() );
668
669 std::vector<EMBEDDED_FILES*> embeddedFilesStack;
670 embeddedFilesStack.push_back( schematic->GetEmbeddedFiles() );
671
672 if( EMBEDDED_FILES* symbolEmbeddedFiles = symbol->GetEmbeddedFiles() )
673 {
674 embeddedFilesStack.push_back( symbolEmbeddedFiles );
675 symbol->GetLibSymbolRef()->AppendParentEmbeddedFiles( embeddedFilesStack );
676 }
677
678 mgr.SetFilesStack( std::move( embeddedFilesStack ) );
679
680 SIM_MODEL& model = mgr.CreateModel( &sheet, *symbol, true, 0, variant, devnull ).model;
681
682 for( wxString pin : model.GetPinNames() )
683 {
684 if( pin.StartsWith( '<' ) && pin.EndsWith( '>' ) )
685 autocompleteTokens.push_back( pin.Mid( 1, pin.Length() - 2 ) );
686 else
687 autocompleteTokens.push_back( pin );
688 }
689
690 // add the synthetic port for power measurements
691 autocompleteTokens.push_back( wxT( "power" ) );
692 }
693 }
694 else
695 {
697 SCH_SYMBOL* refSymbol = nullptr;
698
699 schematic->Hierarchy().GetSymbols( refs );
700
701 for( size_t jj = 0; jj < refs.GetCount(); jj++ )
702 {
703 if( refs[jj].GetSymbol()->GetRef( &refs[jj].GetSheetPath(), true ) == ref )
704 {
705 refSymbol = refs[jj].GetSymbol();
706 break;
707 }
708 }
709
710 if( refSymbol )
711 refSymbol->GetContextualTextVars( &autocompleteTokens );
712 }
713 }
714 }
715 else if( textVarRef( start ) )
716 {
717 partial = scintilla->GetTextRange( start, pos );
718
719 SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( parent );
720 SCH_SHEET* sheet = dynamic_cast<SCH_SHEET*>( parent );
721 SCH_LABEL_BASE* label = dynamic_cast<SCH_LABEL_BASE*>( parent );
722
723 if( symbol )
724 {
725 symbol->GetContextualTextVars( &autocompleteTokens );
726
727 if( schematic->CurrentSheet().Last() )
728 schematic->CurrentSheet().Last()->GetContextualTextVars( &autocompleteTokens );
729 }
730
731 if( sheet )
732 sheet->GetContextualTextVars( &autocompleteTokens );
733
734 if( label )
735 label->GetContextualTextVars( &autocompleteTokens );
736
737 for( std::pair<wxString, wxString> entry : schematic->Project().GetTextVars() )
738 autocompleteTokens.push_back( entry.first );
739 }
740
741 aScintillaTricks->DoAutocomplete( partial, autocompleteTokens );
742 scintilla->SetFocus();
743}
744
745
747{
748 // See comments in SCH_FIELD::Replace(), below.
750 return false;
751
752 return true;
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() == SCH_GLOBAL_LABEL_T )
1299 {
1300 SCH_GLOBALLABEL* label = static_cast<SCH_GLOBALLABEL*>( m_parent );
1301 textpos += label->GetSchematicTextOffset( renderSettings );
1302 }
1303 else if( m_parent && m_parent->Type() == SCH_DIRECTIVE_LABEL_T )
1304 {
1305 SCH_DIRECTIVE_LABEL* label = static_cast<SCH_DIRECTIVE_LABEL*>( m_parent );
1306 std::shared_ptr<NETCLASS> nc = label->GetEffectiveNetClass();
1307
1308 if( nc && ( nc->GetSchematicColor() != COLOR4D::UNSPECIFIED ) && aPlotter->GetColorMode() )
1309 color = nc->GetSchematicColor();
1310 }
1311
1312 KIFONT::FONT* font = GetDrawFont( renderSettings );
1314 attrs.m_StrokeWidth = penWidth;
1315 attrs.m_Halign = hjustify;
1316 attrs.m_Valign = vjustify;
1317 attrs.m_Angle = orient;
1318 attrs.m_Multiline = false;
1319
1320 aPlotter->PlotText( textpos, color, text, attrs, font, GetFontMetrics() );
1321
1323 {
1324 if( SCH_LABEL_BASE* label = dynamic_cast<SCH_LABEL_BASE*>( m_parent ) )
1325 {
1326 std::vector<std::pair<wxString, wxString>> pages;
1327 std::vector<wxString> pageHrefs;
1328
1329 label->GetIntersheetRefs( &Schematic()->CurrentSheet(), &pages );
1330
1331 for( const auto& [pageNumber, sheetName] : pages )
1332 pageHrefs.push_back( wxT( "#" ) + pageNumber );
1333
1334 BOX2I bbox = GetBoundingBox();
1335 bbox.Offset( label->GetSchematicTextOffset( renderSettings ) );
1336
1337 aPlotter->HyperlinkMenu( bbox, pageHrefs );
1338 }
1339 }
1340}
1341
1342
1343void SCH_FIELD::SetPosition( const VECTOR2I& aPosition )
1344{
1345 // Actual positions are calculated by the rotation/mirror transform of the parent symbol
1346 // of the field. The inverse transform is used to calculate the position relative to the
1347 // parent symbol.
1348 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
1349 {
1350 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
1351 VECTOR2I relPos = aPosition - parentSymbol->GetPosition();
1352
1353 relPos = parentSymbol->GetTransform().InverseTransform().TransformCoordinate( relPos );
1354
1355 SetTextPos( relPos + parentSymbol->GetPosition() );
1356 return;
1357 }
1358
1359 SetTextPos( aPosition );
1360}
1361
1362
1364{
1365 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
1366 {
1367 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
1368 VECTOR2I relativePos = GetTextPos() - parentSymbol->GetPosition();
1369
1370 relativePos = parentSymbol->GetTransform().TransformCoordinate( relativePos );
1371
1372 return relativePos + parentSymbol->GetPosition();
1373 }
1374
1375 return GetTextPos();
1376}
1377
1378
1380{
1381 return m_parent ? m_parent->GetPosition() : VECTOR2I( 0, 0 );
1382}
1383
1384
1391
1392
1393bool SCH_FIELD::operator<( const SCH_ITEM& aItem ) const
1394{
1395 if( Type() != aItem.Type() )
1396 return Type() < aItem.Type();
1397
1398 auto field = static_cast<const SCH_FIELD*>( &aItem );
1399
1400 if( GetId() != field->GetId() )
1401 return GetId() < field->GetId();
1402
1403 if( GetText() != field->GetText() )
1404 return GetText() < field->GetText();
1405
1406 if( GetLibPosition().x != field->GetLibPosition().x )
1407 return GetLibPosition().x < field->GetLibPosition().x;
1408
1409 if( GetLibPosition().y != field->GetLibPosition().y )
1410 return GetLibPosition().y < field->GetLibPosition().y;
1411
1412 return GetName() < field->GetName();
1413}
1414
1415
1416bool SCH_FIELD::operator==( const SCH_ITEM& aOther ) const
1417{
1418 if( Type() != aOther.Type() )
1419 return false;
1420
1421 const SCH_FIELD& field = static_cast<const SCH_FIELD&>( aOther );
1422
1423 return *this == field;
1424}
1425
1426
1427bool SCH_FIELD::operator==( const SCH_FIELD& aOther ) const
1428{
1429 // Identical fields of different symbols are not equal.
1430 if( !GetParentSymbol() || !aOther.GetParentSymbol()
1431 || GetParentSymbol()->m_Uuid != aOther.GetParentSymbol()->m_Uuid )
1432 {
1433 return false;
1434 }
1435
1436 if( IsMandatory() != aOther.IsMandatory() )
1437 return false;
1438
1439 if( IsMandatory() )
1440 {
1441 if( GetId() != aOther.GetId() )
1442 return false;
1443 }
1444 else
1445 {
1446 if( GetOrdinal() != aOther.GetOrdinal() )
1447 return false;
1448 }
1449
1450 if( GetPosition() != aOther.GetPosition() )
1451 return false;
1452
1453 if( IsGeneratedField() != aOther.IsGeneratedField() )
1454 return false;
1455
1456 if( IsNameShown() != aOther.IsNameShown() )
1457 return false;
1458
1459 if( CanAutoplace() != aOther.CanAutoplace() )
1460 return false;
1461
1462 return EDA_TEXT::operator==( aOther );
1463}
1464
1465
1466double SCH_FIELD::Similarity( const SCH_ITEM& aOther ) const
1467{
1468 if( Type() != aOther.Type() )
1469 return 0.0;
1470
1471 if( m_Uuid == aOther.m_Uuid )
1472 return 1.0;
1473
1474 const SCH_FIELD& field = static_cast<const SCH_FIELD&>( aOther );
1475
1476 double similarity = 0.99; // The UUIDs are different, so we start with non-identity
1477
1478 if( GetId() != field.GetId() )
1479 {
1480 // We don't allow swapping of mandatory fields, so these cannot be the same item
1481 if( IsMandatory() || field.IsMandatory() )
1482 return 0.0;
1483 else
1484 similarity *= 0.5;
1485 }
1486
1487 similarity *= SimilarityBase( aOther );
1488
1489 similarity *= EDA_TEXT::Similarity( field );
1490
1491 if( GetPosition() != field.GetPosition() )
1492 similarity *= 0.5;
1493
1494 if( IsGeneratedField() != field.IsGeneratedField() )
1495 similarity *= 0.5;
1496
1497 if( IsNameShown() != field.IsNameShown() )
1498 similarity *= 0.5;
1499
1500 if( CanAutoplace() != field.CanAutoplace() )
1501 similarity *= 0.5;
1502
1503 return similarity;
1504}
1505
1506
1507int SCH_FIELD::compare( const SCH_ITEM& aOther, int aCompareFlags ) const
1508{
1509 wxASSERT( aOther.Type() == SCH_FIELD_T );
1510
1511 int compareFlags = aCompareFlags;
1512
1513 // For ERC tests, the field position has no matter, so do not test it
1514 if( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::ERC )
1516
1517 int retv = SCH_ITEM::compare( aOther, compareFlags );
1518
1519 if( retv )
1520 return retv;
1521
1522 const SCH_FIELD* tmp = static_cast<const SCH_FIELD*>( &aOther );
1523
1524 // Equality test will vary depending whether or not the field is mandatory. Otherwise,
1525 // sorting is done by ordinal.
1526 if( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::EQUALITY )
1527 {
1528 // Mandatory fields have fixed ordinals and their names can vary due to translated field
1529 // names. Optional fields have fixed names and their ordinals can vary.
1530 if( IsMandatory() )
1531 {
1532 if( m_id != tmp->m_id )
1533 return (int) m_id - (int) tmp->m_id;
1534 }
1535 else
1536 {
1537 retv = m_name.Cmp( tmp->m_name );
1538
1539 if( retv )
1540 return retv;
1541 }
1542 }
1543 else // assume we're sorting
1544 {
1545 if( m_id != tmp->m_id )
1546 return (int) m_id - (int) tmp->m_id;
1547 }
1548
1549 bool ignoreFieldText = false;
1550
1551 if( m_id == FIELD_T::REFERENCE && !( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::EQUALITY ) )
1552 ignoreFieldText = true;
1553
1554 if( m_id == FIELD_T::VALUE && ( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::ERC ) )
1555 ignoreFieldText = true;
1556
1557 if( !ignoreFieldText )
1558 {
1559 retv = GetText().CmpNoCase( tmp->GetText() );
1560
1561 if( retv != 0 )
1562 return retv;
1563 }
1564
1565 if( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::EQUALITY )
1566 {
1567 if( GetTextPos().x != tmp->GetTextPos().x )
1568 return GetTextPos().x - tmp->GetTextPos().x;
1569
1570 if( GetTextPos().y != tmp->GetTextPos().y )
1571 return GetTextPos().y - tmp->GetTextPos().y;
1572 }
1573
1574 // For ERC tests, the field size has no matter, so do not test it
1575 if( !( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::ERC ) )
1576 {
1577 if( GetTextWidth() != tmp->GetTextWidth() )
1578 return GetTextWidth() - tmp->GetTextWidth();
1579
1580 if( GetTextHeight() != tmp->GetTextHeight() )
1581 return GetTextHeight() - tmp->GetTextHeight();
1582 }
1583
1584 return 0;
1585}
1586
1587
1588wxString SCH_FIELD::getUnescapedText( const SCH_SHEET_PATH* aPath, const wxString& aVariantName ) const
1589{
1590 // This is the default variant field text for all fields except the reference field.
1591 wxString retv = EDA_TEXT::GetShownText( false );
1592
1593 // Special handling for parent object field instance and variant information.
1594 // Only use the path if it's non-empty; an empty path can't match any instances
1595 if( m_parent && aPath && !aPath->empty() )
1596 {
1597 wxLogTrace( traceSchFieldRendering, " Path is valid and non-empty, parent type=%d", m_parent->Type() );
1598
1599 switch( m_parent->Type() )
1600 {
1601 case SCH_SYMBOL_T:
1602 if( const SCH_SYMBOL* symbol = static_cast<const SCH_SYMBOL*>( m_parent ) )
1603 {
1604 if( m_id == FIELD_T::REFERENCE )
1605 {
1606 wxLogTrace( traceSchFieldRendering, " Calling GetRef for symbol %s on path %s",
1607 symbol->m_Uuid.AsString(), aPath->Path().AsString() );
1608
1609 retv = symbol->GetRef( aPath, true );
1610
1611 wxLogTrace( traceSchFieldRendering, " GetRef returned: '%s'", retv );
1612 }
1613 else if( !aVariantName.IsEmpty() )
1614 {
1615 // If the variant is not found, fall back to default variant above.
1616 if( std::optional<SCH_SYMBOL_VARIANT> variant = symbol->GetVariant( *aPath, aVariantName ) )
1617 {
1618 // If the field name does not exist in the variant, fall back to the default variant above.
1619 if( variant->m_Fields.contains( GetName() ) )
1620 retv = variant->m_Fields[GetName()];
1621 }
1622 }
1623 }
1624
1625 break;
1626
1627 case SCH_SHEET_T:
1628 break;
1629
1630 default:
1631 break;
1632 }
1633 }
1634
1635 return retv;
1636}
1637
1638
1639static struct SCH_FIELD_DESC
1640{
1642 {
1643 // These are defined in EDA_TEXT as well but initialization order is
1644 // not defined, so this needs to be conditional. Defining in both
1645 // places leads to duplicate symbols.
1647
1648 if( h_inst.Choices().GetCount() == 0 )
1649 {
1650 h_inst.Map( GR_TEXT_H_ALIGN_LEFT, _HKI( "Left" ) );
1651 h_inst.Map( GR_TEXT_H_ALIGN_CENTER, _HKI( "Center" ) );
1652 h_inst.Map( GR_TEXT_H_ALIGN_RIGHT, _HKI( "Right" ) );
1653 }
1654
1656
1657 if( v_inst.Choices().GetCount() == 0 )
1658 {
1659 v_inst.Map( GR_TEXT_V_ALIGN_TOP, _HKI( "Top" ) );
1660 v_inst.Map( GR_TEXT_V_ALIGN_CENTER, _HKI( "Center" ) );
1661 v_inst.Map( GR_TEXT_V_ALIGN_BOTTOM, _HKI( "Bottom" ) );
1662 }
1663
1670
1671 const wxString textProps = _HKI( "Text Properties" );
1672
1673 auto horiz = new PROPERTY_ENUM<SCH_FIELD, GR_TEXT_H_ALIGN_T>( _HKI( "Horizontal Justification" ),
1676
1677 propMgr.ReplaceProperty( TYPE_HASH( EDA_TEXT ), _HKI( "Horizontal Justification" ), horiz, textProps );
1678
1679 auto vert = new PROPERTY_ENUM<SCH_FIELD, GR_TEXT_V_ALIGN_T>( _HKI( "Vertical Justification" ),
1682
1683 propMgr.ReplaceProperty( TYPE_HASH( EDA_TEXT ), _HKI( "Vertical Justification" ), vert, textProps );
1684
1685 propMgr.AddProperty( new PROPERTY<SCH_FIELD, bool>( _HKI( "Show Field Name" ), &SCH_FIELD::SetNameShown,
1687
1688 propMgr.AddProperty( new PROPERTY<SCH_FIELD, bool>( _HKI( "Allow Autoplacement" ), &SCH_FIELD::SetCanAutoplace,
1690
1691 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Hyperlink" ) );
1692 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Thickness" ) );
1693 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Mirrored" ) );
1694 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Width" ) );
1695 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Height" ) );
1696
1697
1700 _HKI( "Text Properties" ) );
1701
1702 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Orientation" ) );
1703
1704 auto isNotGeneratedField = []( INSPECTABLE* aItem ) -> bool
1705 {
1706 if( SCH_FIELD* field = dynamic_cast<SCH_FIELD*>( aItem ) )
1707 return !field->IsGeneratedField();
1708
1709 return true;
1710 };
1711
1713 isNotGeneratedField );
1714
1715
1716 auto isNonMandatoryField = []( INSPECTABLE* aItem ) -> bool
1717 {
1718 if( SCH_FIELD* field = dynamic_cast<SCH_FIELD*>( aItem ) )
1719 return !field->IsMandatory();
1720
1721 return false;
1722 };
1723
1724 propMgr.OverrideAvailability( TYPE_HASH( SCH_FIELD ), TYPE_HASH( SCH_ITEM ), _HKI( "Private" ),
1725 isNonMandatoryField );
1726 }
1728
1729
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:521
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
EDA_ITEM_FLAGS m_flags
Definition eda_item.h:532
virtual bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const
Compare the item against the search criteria in aSearchData.
Definition eda_item.h:406
EDA_ITEM * GetParent() const
Definition eda_item.h:112
EDA_ITEM * m_parent
Owner.
Definition eda_item.h:533
bool IsForceVisible() const
Definition eda_item.h:216
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
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 bool IsVisible() const
Definition eda_text.h:187
void SetTextPos(const VECTOR2I &aPoint)
Definition eda_text.cpp:588
void SetTextX(int aX)
Definition eda_text.cpp:594
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:445
void SetTextY(int aY)
Definition eda_text.cpp:600
EDA_TEXT & operator=(const EDA_TEXT &aItem)
Definition eda_text.cpp:162
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:753
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
Definition eda_text.cpp:429
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:498
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:398
EDA_TEXT(const EDA_IU_SCALE &aIuScale, const wxString &aText=wxEmptyString)
Definition eda_text.cpp:98
virtual void ClearBoundingBoxCache()
Definition eda_text.cpp:687
double Similarity(const EDA_TEXT &aOther) const
virtual void ClearRenderCache()
Definition eda_text.cpp:681
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:477
void SwapAttributes(EDA_TEXT &aTradingPartner)
Swap the text attributes of the two involved instances.
Definition eda_text.cpp:464
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:282
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
Definition eda_text.cpp:311
void SwapText(EDA_TEXT &aTradingPartner)
Definition eda_text.cpp:457
bool operator==(const EDA_TEXT &aRhs) const
Definition eda_text.h:398
VECTOR2I GetTextSize() const
Definition eda_text.h:261
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
Definition eda_text.cpp:421
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: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:368
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: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:117
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
wxString GetCurrentVariant() const
Return the current variant being edited.
EMBEDDED_FILES * GetEmbeddedFiles() override
SCH_SHEET_PATH & CurrentSheet() const
Definition schematic.h:187
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:350
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:348
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:167
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:338
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:206
bool m_autoAdded
Was this field automatically added to a LIB_SYMBOL?
Definition sch_field.h:343
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:215
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:116
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:120
void SetCanAutoplace(bool aCanPlace)
Definition sch_field.h:218
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:340
int m_ordinal
Sort order for non-mandatory fields.
Definition sch_field.h:335
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:334
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:262
void setId(FIELD_T aId)
int GetOrdinal() const
Definition sch_field.h:122
bool IsEmpty()
Return true if both the name and value of the field are empty.
Definition sch_field.h:159
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0, const wxString &aVariantName=wxEmptyString) const
bool m_renderCacheValid
Definition sch_field.h:346
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:168
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)
VECTOR2I m_renderCachePos
Definition sch_field.h:347
bool CanAutoplace() const
Definition sch_field.h:217
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:344
void OnScintillaCharAdded(SCINTILLA_TRICKS *aScintillaTricks, wxStyledTextEvent &aEvent) const
wxString m_name
Definition sch_field.h:336
void SetNameShown(bool aShown=true)
Definition sch_field.h:207
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:339
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:78
SCH_RENDER_SETTINGS * getRenderSettings(PLOTTER *aPlotter) const
Definition sch_item.h:721
const SYMBOL * GetParentSymbol() const
Definition sch_item.cpp:258
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:252
friend class LIB_SYMBOL
Definition sch_item.h:792
@ SKIP_TST_POS
Definition sch_item.h:704
std::shared_ptr< NETCLASS > GetEffectiveNetClass(const SCH_SHEET_PATH *aSheet=nullptr) const
Definition sch_item.cpp:507
void SetLayer(SCH_LAYER_ID aLayer)
Definition sch_item.h:341
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition sch_item.h:340
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:696
const wxString & GetDefaultFont(const RENDER_SETTINGS *aSettings) const
Definition sch_item.cpp:744
bool IsConnectivityDirty() const
Definition sch_item.h:587
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
Definition sch_item.cpp:54
bool m_private
Definition sch_item.h:775
wxString ResolveText(const wxString &aText, const SCH_SHEET_PATH *aPath, int aDepth=0) const
Definition sch_item.cpp:361
const KIFONT::METRICS & GetFontMetrics() const
Definition sch_item.cpp:757
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:379
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 ...
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:867
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
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: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)
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: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