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