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>
35#include <symbol_library.h>
37#include <string_utils.h>
39#include <trace_helpers.h>
40#include <tool/tool_manager.h>
42#include <font/outline_font.h>
43#include "sim/sim_lib_mgr.h"
44
45static const std::vector<KICAD_T> labelTypes = { SCH_LABEL_LOCATE_ANY_T };
46
47
49 SCH_ITEM( nullptr, SCH_FIELD_T ),
50 EDA_TEXT( schIUScale, wxEmptyString ),
51 m_id( FIELD_T::USER ),
52 m_ordinal( 0 ),
53 m_showName( false ),
54 m_allowAutoPlace( true ),
55 m_isGeneratedField( false ),
56 m_autoAdded( false ),
57 m_showInChooser( true ),
58 m_renderCacheValid( false ),
60{
61}
62
63
64SCH_FIELD::SCH_FIELD( SCH_ITEM* aParent, FIELD_T aFieldId, const wxString& aName ) :
65 SCH_FIELD()
66{
67 m_parent = aParent;
68
69 if( !aName.IsEmpty() )
70 SetName( aName );
71 else
73
74 setId( aFieldId ); // will also set the layer
75 SetVisible( true );
76
77 if( aParent && aParent->Schematic() )
78 {
79 SCHEMATIC_SETTINGS& settings = aParent->Schematic()->Settings();
81 }
82
83 if( aFieldId == FIELD_T::USER && aParent )
84 {
85 if( aParent->Type() == SCH_SYMBOL_T )
86 m_ordinal = static_cast<SCH_SYMBOL*>( aParent )->GetNextFieldOrdinal();
87 else if( aParent->Type() == LIB_SYMBOL_T )
88 m_ordinal = static_cast<LIB_SYMBOL*>( aParent )->GetNextFieldOrdinal();
89 else if( aParent->Type() == SCH_SHEET_T )
90 m_ordinal = static_cast<SCH_SHEET*>( aParent )->GetNextFieldOrdinal();
91 else if( SCH_LABEL_BASE* label = dynamic_cast<SCH_LABEL_BASE*>( aParent ) )
92 m_ordinal = label->GetNextFieldOrdinal();
93 }
94}
95
96
98 SCH_FIELD( aParent, FIELD_T::USER, wxEmptyString )
99{
100 SCH_ITEM::operator=( *aText );
101 EDA_TEXT::operator=( *aText );
102}
103
104
106 SCH_ITEM( aField ),
107 EDA_TEXT( aField )
108{
109 m_private = aField.m_private;
110 setId( aField.m_id ); // will also set the layer
111 m_ordinal = aField.m_ordinal;
112 m_name = aField.m_name;
113 m_showName = aField.m_showName;
116 m_autoAdded = aField.m_autoAdded;
118
119 m_renderCache.clear();
120
121 for( const std::unique_ptr<KIFONT::GLYPH>& glyph : aField.m_renderCache )
122 {
123 if( KIFONT::OUTLINE_GLYPH* outline = dynamic_cast<KIFONT::OUTLINE_GLYPH*>( glyph.get() ) )
124 m_renderCache.emplace_back( std::make_unique<KIFONT::OUTLINE_GLYPH>( *outline ) );
125 else if( KIFONT::STROKE_GLYPH* stroke = dynamic_cast<KIFONT::STROKE_GLYPH*>( glyph.get() ) )
126 m_renderCache.emplace_back( std::make_unique<KIFONT::STROKE_GLYPH>( *stroke ) );
127 }
128
131
133}
134
135
137{
138 EDA_TEXT::operator=( aField );
139
140 m_private = aField.m_private;
141 setId( aField.m_id ); // will also set the layer
142 m_ordinal = aField.m_ordinal;
143 m_name = aField.m_name;
144 m_showName = aField.m_showName;
147
148 m_renderCache.clear();
149
150 for( const std::unique_ptr<KIFONT::GLYPH>& glyph : aField.m_renderCache )
151 {
152 if( KIFONT::OUTLINE_GLYPH* outline = dynamic_cast<KIFONT::OUTLINE_GLYPH*>( glyph.get() ) )
153 m_renderCache.emplace_back( std::make_unique<KIFONT::OUTLINE_GLYPH>( *outline ) );
154 else if( KIFONT::STROKE_GLYPH* stroke = dynamic_cast<KIFONT::STROKE_GLYPH*>( glyph.get() ) )
155 m_renderCache.emplace_back( std::make_unique<KIFONT::STROKE_GLYPH>( *stroke ) );
156 }
157
160
162
163 return *this;
164}
165
166
168{
169 return new SCH_FIELD( *this );
170}
171
172
173void SCH_FIELD::Copy( SCH_FIELD* aTarget ) const
174{
175 *aTarget = *this;
176}
177
178
180{
181 m_id = aId;
183}
184
185
190
191
192wxString SCH_FIELD::GetShownText( const SCH_SHEET_PATH* aPath, bool aAllowExtraText, int aDepth ) const
193{
194 std::function<bool( wxString* )> libSymbolResolver =
195 [&]( wxString* token ) -> bool
196 {
197 LIB_SYMBOL* symbol = static_cast<LIB_SYMBOL*>( m_parent );
198 return symbol->ResolveTextVar( token, aDepth + 1 );
199 };
200
201 std::function<bool( wxString* )> symbolResolver =
202 [&]( wxString* token ) -> bool
203 {
204 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( m_parent );
205 return symbol->ResolveTextVar( aPath, token, aDepth + 1 );
206 };
207
208 std::function<bool( wxString* )> schematicResolver =
209 [&]( wxString* token ) -> bool
210 {
211 if( !aPath )
212 return false;
213
214 if( SCHEMATIC* schematic = Schematic() )
215 return schematic->ResolveTextVar( aPath, token, aDepth + 1 );
216
217 return false;
218 };
219
220 std::function<bool( wxString* )> sheetResolver =
221 [&]( wxString* token ) -> bool
222 {
223 if( !aPath )
224 return false;
225
226 SCH_SHEET* sheet = static_cast<SCH_SHEET*>( m_parent );
227
228 SCHEMATIC* schematic = Schematic();
229 SCH_SHEET_PATH path = *aPath;
230 path.push_back( sheet );
231
232 bool retval = sheet->ResolveTextVar( &path, token, aDepth + 1 );
233
234 if( schematic )
235 retval |= schematic->ResolveTextVar( &path, token, aDepth + 1 );
236
237 return retval;
238 };
239
240 std::function<bool( wxString* )> labelResolver =
241 [&]( wxString* token ) -> bool
242 {
243 if( !aPath )
244 return false;
245
246 SCH_LABEL_BASE* label = static_cast<SCH_LABEL_BASE*>( m_parent );
247 return label->ResolveTextVar( aPath, token, aDepth + 1 );
248 };
249
250 wxString text = getUnescapedText( aPath );
251
252 if( IsNameShown() && aAllowExtraText )
253 text = GetShownName() << wxS( ": " ) << text;
254
255 if( HasTextVars() )
256 {
257 while( text.Contains( wxT( "${" ) ) && aDepth++ <= ADVANCED_CFG::GetCfg().m_ResolveTextRecursionDepth )
258 {
259 if( m_parent && m_parent->Type() == LIB_SYMBOL_T )
260 text = ExpandTextVars( text, &libSymbolResolver );
261 else if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
262 text = ExpandTextVars( text, &symbolResolver );
263 else if( m_parent && m_parent->Type() == SCH_SHEET_T )
264 text = ExpandTextVars( text, &sheetResolver );
265 else if( m_parent && m_parent->IsType( labelTypes ) )
266 text = ExpandTextVars( text, &labelResolver );
267 else if( Schematic() )
268 {
269 text = ExpandTextVars( text, &Schematic()->Project() );
270 text = ExpandTextVars( text, &schematicResolver );
271 }
272 }
273 }
274
275 if( m_id == FIELD_T::SHEET_FILENAME && aAllowExtraText && !IsNameShown() )
276 text = _( "File:" ) + wxS( " " ) + text;
277
278 if( text.Contains( wxT( "@{" ) ) )
280
281 return text;
282}
283
284
285wxString SCH_FIELD::GetShownText( bool aAllowExtraText, int aDepth ) const
286{
287 if( SCHEMATIC* schematic = Schematic() )
288 return GetShownText( &schematic->CurrentSheet(), aAllowExtraText, aDepth );
289 else
290 return GetShownText( nullptr, aAllowExtraText, aDepth );
291}
292
293
294wxString SCH_FIELD::GetFullText( int unit ) const
295{
296 if( GetId() != FIELD_T::REFERENCE )
297 return GetText();
298
299 wxString text = GetText();
300 text << wxT( "?" );
301
302 if( GetParentSymbol() && GetParentSymbol()->IsMultiUnit() )
303 text << LIB_SYMBOL::LetterSubReference( unit, 'A' );
304
305 return text;
306}
307
308
310{
312}
313
314
316{
318
319 if( !font )
320 font = KIFONT::FONT::GetFont( GetDefaultFont( aSettings ), IsBold(), IsItalic() );
321
322 return font;
323}
324
325
331
332
338
339
340std::vector<std::unique_ptr<KIFONT::GLYPH>>*
341SCH_FIELD::GetRenderCache( const wxString& forResolvedText, const VECTOR2I& forPosition,
342 TEXT_ATTRIBUTES& aAttrs ) const
343{
344 KIFONT::FONT* font = GetDrawFont( nullptr );
345
346 if( font->IsOutline() )
347 {
348 KIFONT::OUTLINE_FONT* outlineFont = static_cast<KIFONT::OUTLINE_FONT*>( font );
349
350 if( m_renderCache.empty() || !m_renderCacheValid )
351 {
352 m_renderCache.clear();
353
354 outlineFont->GetLinesAsGlyphs( &m_renderCache, forResolvedText, forPosition, aAttrs,
355 GetFontMetrics() );
356
357 m_renderCachePos = forPosition;
358 m_renderCacheValid = true;
359 }
360
361 if( m_renderCachePos != forPosition )
362 {
363 VECTOR2I delta = forPosition - m_renderCachePos;
364
365 for( std::unique_ptr<KIFONT::GLYPH>& glyph : m_renderCache )
366 {
367 if( glyph->IsOutline() )
368 static_cast<KIFONT::OUTLINE_GLYPH*>( glyph.get() )->Move( delta );
369 else
370 static_cast<KIFONT::STROKE_GLYPH*>( glyph.get() )->Move( delta );
371 }
372
373 m_renderCachePos = forPosition;
374 }
375
376 return &m_renderCache;
377 }
378
379 return nullptr;
380}
381
382
383void SCH_FIELD::ImportValues( const SCH_FIELD& aSource )
384{
385 SetAttributes( aSource );
386 SetVisible( aSource.IsVisible() );
387 SetNameShown( aSource.IsNameShown() );
388 SetCanAutoplace( aSource.CanAutoplace() );
389}
390
391
393{
394 wxCHECK_RET( aItem && aItem->Type() == SCH_FIELD_T, wxT( "Cannot swap with invalid item." ) );
395
396 SCH_FIELD* item = static_cast<SCH_FIELD*>( aItem );
397
398 std::swap( m_showName, item->m_showName );
399 std::swap( m_allowAutoPlace, item->m_allowAutoPlace );
400 std::swap( m_isGeneratedField, item->m_isGeneratedField );
401 SwapText( *item );
402 SwapAttributes( *item );
403
404 std::swap( m_lastResolvedColor, item->m_lastResolvedColor );
405}
406
407
409{
411 {
413 }
414 else
415 {
416 SCH_LABEL_BASE* parentLabel = dynamic_cast<SCH_LABEL_BASE*>( GetParent() );
417
418 if( parentLabel && !parentLabel->IsConnectivityDirty() )
420 else
422 }
423
424 return m_lastResolvedColor;
425}
426
427
428std::vector<int> SCH_FIELD::ViewGetLayers() const
429{
431}
432
433
435{
436 if( m_parent && m_parent->Type() == SCH_LABEL_T )
437 {
438 if( GetCanonicalName() == wxT( "Netclass" )
439 || GetCanonicalName() == wxT( "Component Class" ) )
440 {
441 return LAYER_NETCLASS_REFS;
442 }
443 }
444
445 switch( m_id )
446 {
448 case FIELD_T::VALUE: return LAYER_VALUEPART;
453 default: return LAYER_FIELDS;
454 }
455}
456
457
459{
460 // Calculate the text orientation according to the symbol orientation.
461 EDA_ANGLE orient = GetTextAngle();
462
463 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
464 {
465 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
466
467 if( parentSymbol && parentSymbol->GetTransform().y1 ) // Rotate symbol 90 degrees.
468 {
469 if( orient.IsHorizontal() )
470 orient = ANGLE_VERTICAL;
471 else
472 orient = ANGLE_HORIZONTAL;
473 }
474 }
475
476 return orient;
477}
478
479
481{
482 BOX2I bbox = GetTextBox( nullptr );
483
484 // Calculate the bounding box position relative to the parent:
485 VECTOR2I origin = GetParentPosition();
486 VECTOR2I pos = GetTextPos() - origin;
487 VECTOR2I begin = bbox.GetOrigin() - origin;
488 VECTOR2I end = bbox.GetEnd() - origin;
489 RotatePoint( begin, pos, GetTextAngle() );
490 RotatePoint( end, pos, GetTextAngle() );
491
492 // Now, apply the symbol transform (mirror/rot)
493 TRANSFORM transform;
494
495 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
496 transform = static_cast<SCH_SYMBOL*>( m_parent )->GetTransform();
497
498 bbox.SetOrigin( transform.TransformCoordinate( begin ) );
499 bbox.SetEnd( transform.TransformCoordinate( end ) );
500
501 bbox.Move( origin );
502 bbox.Normalize();
503
504 return bbox;
505}
506
507
509{
510 VECTOR2I render_center = GetBoundingBox().Centre();
511 VECTOR2I pos = GetPosition();
512
513 switch( GetHorizJustify() )
514 {
516 if( GetDrawRotation().IsVertical() )
517 return render_center.y > pos.y;
518 else
519 return render_center.x < pos.x;
521 if( GetDrawRotation().IsVertical() )
522 return render_center.y < pos.y;
523 else
524 return render_center.x > pos.x;
525 default:
526 return false;
527 }
528}
529
530
532{
533 GR_TEXT_H_ALIGN_T actualJustify;
534
535 switch( aJustify )
536 {
539 break;
542 break;
543 default:
544 actualJustify = aJustify;
545 }
546
547 SetHorizJustify( actualJustify );
548}
549
550
563
564
566{
567 VECTOR2I render_center = GetBoundingBox().Centre();
568 VECTOR2I pos = GetPosition();
569
570 switch( GetVertJustify() )
571 {
573 if( GetDrawRotation().IsVertical() )
574 return render_center.x < pos.x;
575 else
576 return render_center.y < pos.y;
578 if( GetDrawRotation().IsVertical() )
579 return render_center.x > pos.x;
580 else
581 return render_center.y > pos.y;
582 default:
583 return false;
584 }
585}
586
587
589{
590 GR_TEXT_V_ALIGN_T actualJustify;
591
592 switch( aJustify )
593 {
596 break;
599 break;
600 default:
601 actualJustify = aJustify;
602 }
603
604 SetVertJustify( actualJustify );
605}
606
607
620
621
622bool SCH_FIELD::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const
623{
624 bool searchHiddenFields = aSearchData.searchAllFields;
625 bool searchAndReplace = aSearchData.searchAndReplace;
626 bool replaceReferences = false;
627
628 try
629 {
630 // downcast
631 const SCH_SEARCH_DATA& schSearchData = dynamic_cast<const SCH_SEARCH_DATA&>( aSearchData );
632 replaceReferences = schSearchData.replaceReferences;
633 }
634 catch( const std::bad_cast& )
635 {
636 }
637
638 wxString text = UnescapeString( GetText() );
639
640 if( !IsVisible() && !searchHiddenFields )
641 return false;
642
643 if( m_id == FIELD_T::REFERENCE )
644 {
645 if( searchAndReplace && !replaceReferences )
646 return false;
647
648 SCH_SYMBOL* parentSymbol = dyn_cast<SCH_SYMBOL*>( m_parent );
649
650 // The parent might be a LIB_SYMBOL, in which case, we don't
651 // have a sheet path to resolve the reference.
652 if( !parentSymbol )
653 return false;
654
655 if( parentSymbol->Matches( aSearchData, aAuxData ) )
656 return true;
657
658 wxASSERT( aAuxData );
659
660 // Take sheet path into account which effects the reference field and the unit for
661 // symbols with multiple parts.
662 if( aAuxData )
663 {
664 SCH_SHEET_PATH* sheet = (SCH_SHEET_PATH*) aAuxData;
665 text = parentSymbol->GetRef( sheet );
666
667 if( SCH_ITEM::Matches( text, aSearchData ) )
668 return true;
669
670 if( parentSymbol->GetUnitCount() > 1 )
671 text << parentSymbol->SubReference( parentSymbol->GetUnitSelection( sheet ) );
672 }
673 }
674
675 return SCH_ITEM::Matches( text, aSearchData );
676}
677
678
680 wxStyledTextEvent &aEvent ) const
681{
682 SCH_ITEM* parent = dynamic_cast<SCH_ITEM*>( GetParent() );
683 SCHEMATIC* schematic = parent ? parent->Schematic() : nullptr;
684
685 if( !schematic )
686 return;
687
688 wxStyledTextCtrl* scintilla = aScintillaTricks->Scintilla();
689 int key = aEvent.GetKey();
690
691 wxArrayString autocompleteTokens;
692 int pos = scintilla->GetCurrentPos();
693 int start = scintilla->WordStartPosition( pos, true );
694 wxString partial;
695
696 // Multi-line fields are not allowed. So remove '\n' if entered.
697 if( key == '\n' )
698 {
699 wxString text = scintilla->GetText();
700 int currpos = scintilla->GetCurrentPos();
701 text.Replace( wxS( "\n" ), wxS( "" ) );
702 scintilla->SetText( text );
703 scintilla->GotoPos( currpos-1 );
704 return;
705 }
706
707 auto textVarRef =
708 [&]( int pt )
709 {
710 return pt >= 2
711 && scintilla->GetCharAt( pt - 2 ) == '$'
712 && scintilla->GetCharAt( pt - 1 ) == '{';
713 };
714
715 // Check for cross-reference
716 if( start > 1 && scintilla->GetCharAt( start - 1 ) == ':' )
717 {
718 int refStart = scintilla->WordStartPosition( start - 1, true );
719
720 if( textVarRef( refStart ) )
721 {
722 partial = scintilla->GetRange( start, pos );
723
724 wxString ref = scintilla->GetRange( refStart, start - 1 );
725
726 if( ref == wxS( "OP" ) )
727 {
728 // SPICE operating points use ':' syntax for ports
729 if( SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( parent ) )
730 {
731 NULL_REPORTER devnull;
732 SCH_SHEET_PATH& sheet = schematic->CurrentSheet();
733 SIM_LIB_MGR mgr( &schematic->Project() );
734
735 std::vector<EMBEDDED_FILES*> embeddedFilesStack;
736 embeddedFilesStack.push_back( schematic->GetEmbeddedFiles() );
737
738 if( EMBEDDED_FILES* symbolEmbeddedFiles = symbol->GetEmbeddedFiles() )
739 embeddedFilesStack.push_back( symbolEmbeddedFiles );
740
741 mgr.SetFilesStack( std::move( embeddedFilesStack ) );
742
743 SIM_MODEL& model = mgr.CreateModel( &sheet, *symbol, true, 0, devnull ).model;
744
745 for( wxString pin : model.GetPinNames() )
746 {
747 if( pin.StartsWith( '<' ) && pin.EndsWith( '>' ) )
748 autocompleteTokens.push_back( pin.Mid( 1, pin.Length() - 2 ) );
749 else
750 autocompleteTokens.push_back( pin );
751 }
752
753 // add the synthetic port for power measurements
754 autocompleteTokens.push_back( wxT( "power" ) );
755 }
756 }
757 else
758 {
760 SCH_SYMBOL* refSymbol = nullptr;
761
762 schematic->Hierarchy().GetSymbols( refs );
763
764 for( size_t jj = 0; jj < refs.GetCount(); jj++ )
765 {
766 if( refs[ jj ].GetSymbol()->GetRef( &refs[ jj ].GetSheetPath(), true ) == ref )
767 {
768 refSymbol = refs[ jj ].GetSymbol();
769 break;
770 }
771 }
772
773 if( refSymbol )
774 refSymbol->GetContextualTextVars( &autocompleteTokens );
775 }
776 }
777 }
778 else if( textVarRef( start ) )
779 {
780 partial = scintilla->GetTextRange( start, pos );
781
782 SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( parent );
783 SCH_SHEET* sheet = dynamic_cast<SCH_SHEET*>( parent );
784 SCH_LABEL_BASE* label = dynamic_cast<SCH_LABEL_BASE*>( parent );
785
786 if( symbol )
787 {
788 symbol->GetContextualTextVars( &autocompleteTokens );
789
790 if( schematic->CurrentSheet().Last() )
791 schematic->CurrentSheet().Last()->GetContextualTextVars( &autocompleteTokens );
792 }
793
794 if( sheet )
795 sheet->GetContextualTextVars( &autocompleteTokens );
796
797 if( label )
798 label->GetContextualTextVars( &autocompleteTokens );
799
800 for( std::pair<wxString, wxString> entry : schematic->Project().GetTextVars() )
801 autocompleteTokens.push_back( entry.first );
802 }
803
804 aScintillaTricks->DoAutocomplete( partial, autocompleteTokens );
805 scintilla->SetFocus();
806}
807
808
810{
811 // See comments in SCH_FIELD::Replace(), below.
813 return false;
814
815 return true;
816}
817
818
819bool SCH_FIELD::Replace( const EDA_SEARCH_DATA& aSearchData, void* aAuxData )
820{
821 bool replaceReferences = false;
822
823 try
824 {
825 const SCH_SEARCH_DATA& schSearchData = dynamic_cast<const SCH_SEARCH_DATA&>( aSearchData );
826 replaceReferences = schSearchData.replaceReferences;
827 }
828 catch( const std::bad_cast& )
829 {
830 }
831
832 wxString text;
833 bool isReplaced = false;
834
835 if( m_id == FIELD_T::REFERENCE && m_parent && m_parent->Type() == SCH_SYMBOL_T )
836 {
837 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
838
839 if( !replaceReferences )
840 return false;
841
842 wxCHECK_MSG( aAuxData, false, wxT( "Need sheetpath to replace in refdes." ) );
843
844 text = parentSymbol->GetRef( (SCH_SHEET_PATH*) aAuxData );
845 isReplaced = EDA_ITEM::Replace( aSearchData, text );
846
847 if( isReplaced )
848 parentSymbol->SetRef( (SCH_SHEET_PATH*) aAuxData, text );
849 }
850 else
851 {
852 isReplaced = EDA_TEXT::Replace( aSearchData );
853
854 if( m_id == FIELD_T::SHEET_FILENAME && isReplaced )
855 {
856 // If we allowed this we'd have a bunch of work to do here, including warning
857 // about it not being undoable, checking for recursive hierarchies, reloading
858 // sheets, etc. See DIALOG_SHEET_PROPERTIES::TransferDataFromWindow().
859 }
860 }
861
862 return isReplaced;
863}
864
865
866void SCH_FIELD::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
867{
869
870 if( GetTextAngle().IsVertical() )
871 {
872 switch( horizJustify )
873 {
875 if( aRotateCCW )
877
878 break;
879
881 if( aRotateCCW )
883
884 break;
885
888 break;
889 }
890
892 }
893 else if( GetTextAngle().IsHorizontal() )
894 {
895 switch( horizJustify )
896 {
898 if( !aRotateCCW )
900
901 break;
902
904 if( !aRotateCCW )
906
907 break;
908
911 break;
912 }
913
915 }
916 else
917 {
918 wxFAIL_MSG( wxString::Format( wxT( "SCH_FIELD text angle is not horizontal or vertical: %f" ),
919 GetTextAngle().AsDegrees() ) );
920 }
921
922 VECTOR2I pt = GetPosition();
923 RotatePoint( pt, aCenter, aRotateCCW ? ANGLE_90 : ANGLE_270 );
924 SetPosition( pt );
925}
926
927
929{
930 int x = GetTextPos().x;
931
932 x -= aCenter;
933 x *= -1;
934 x += aCenter;
935
936 SetTextX( x );
937}
938
939
941{
942 int y = GetTextPos().y;
943
944 y -= aCenter;
945 y *= -1;
946 y += aCenter;
947
948 SetTextY( y );
949}
950
951
952void SCH_FIELD::BeginEdit( const VECTOR2I& aPosition )
953{
954 SetTextPos( aPosition );
955}
956
957
958void SCH_FIELD::CalcEdit( const VECTOR2I& aPosition )
959{
960 SetTextPos( aPosition );
961}
962
963
964wxString SCH_FIELD::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
965{
966 wxString content = aFull ? GetShownText( false ) : KIUI::EllipsizeMenuText( GetText() );
967
968 if( content.IsEmpty() )
969 {
970 return wxString::Format( _( "Field %s (empty)" ),
971 UnescapeString( GetName() ) );
972 }
973 else
974 {
975 return wxString::Format( _( "Field %s '%s'" ),
977 content );
978 }
979}
980
981
982void SCH_FIELD::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
983{
984 wxString msg;
985
986 aList.emplace_back( _( "Symbol Field" ), UnescapeString( GetName() ) );
987
988 // Don't use GetShownText() here; we want to show the user the variable references
989 aList.emplace_back( _( "Text" ), KIUI::EllipsizeStatusText( aFrame, GetText() ) );
990
991 aList.emplace_back( _( "Visible" ), IsVisible() ? _( "Yes" ) : _( "No" ) );
992
993 aList.emplace_back( _( "Font" ), GetFont() ? GetFont()->GetName() : _( "Default" ) );
994
995 aList.emplace_back( _( "Style" ), GetTextStyleName() );
996
997 aList.emplace_back( _( "Text Size" ), aFrame->MessageTextFromValue( GetTextWidth() ) );
998
999 switch ( GetHorizJustify() )
1000 {
1001 case GR_TEXT_H_ALIGN_LEFT: msg = _( "Left" ); break;
1002 case GR_TEXT_H_ALIGN_CENTER: msg = _( "Center" ); break;
1003 case GR_TEXT_H_ALIGN_RIGHT: msg = _( "Right" ); break;
1005 }
1006
1007 aList.emplace_back( _( "H Justification" ), msg );
1008
1009 switch ( GetVertJustify() )
1010 {
1011 case GR_TEXT_V_ALIGN_TOP: msg = _( "Top" ); break;
1012 case GR_TEXT_V_ALIGN_CENTER: msg = _( "Center" ); break;
1013 case GR_TEXT_V_ALIGN_BOTTOM: msg = _( "Bottom" ); break;
1015 }
1016
1017 aList.emplace_back( _( "V Justification" ), msg );
1018}
1019
1020
1022{
1024 return true;
1025
1027 return true;
1028
1029 return IsURL( GetShownText( false ) );
1030}
1031
1032
1034{
1035 constexpr int START_ID = 1;
1036
1037 if( IsHypertext() )
1038 {
1039 wxString href;
1040
1042 {
1043 SCH_LABEL_BASE* label = static_cast<SCH_LABEL_BASE*>( m_parent );
1044 SCH_SHEET_PATH* sheet = &label->Schematic()->CurrentSheet();
1045 wxMenu menu;
1046
1047 std::vector<std::pair<wxString, wxString>> pages;
1048
1049 label->GetIntersheetRefs( sheet, &pages );
1050
1051 for( int i = 0; i < (int) pages.size(); ++i )
1052 {
1053 menu.Append( i + START_ID, wxString::Format( _( "Go to Page %s (%s)" ),
1054 pages[i].first,
1055 pages[i].second ) );
1056 }
1057
1058 menu.AppendSeparator();
1059 menu.Append( 999 + START_ID, _( "Back to Previous Selected Sheet" ) );
1060
1061 int sel = aFrame->GetPopupMenuSelectionFromUser( menu ) - START_ID;
1062
1063 if( sel >= 0 && sel < (int) pages.size() )
1064 href = wxT( "#" ) + pages[ sel ].first;
1065 else if( sel == 999 )
1067 }
1068 else if( IsURL( GetShownText( false ) ) || m_name == SIM_LIBRARY::LIBRARY_FIELD )
1069 {
1070 href = GetShownText( false );
1071 }
1072
1073 if( !href.IsEmpty() )
1074 {
1076 navTool->HypertextCommand( href );
1077 }
1078 }
1079}
1080
1081
1082void SCH_FIELD::SetName( const wxString& aName )
1083{
1084 m_name = aName;
1086
1087 if( m_isGeneratedField )
1088 EDA_TEXT::SetText( aName );
1089}
1090
1091
1092void SCH_FIELD::SetText( const wxString& aText )
1093{
1094 // Don't allow modification of text value of generated fields.
1095 if( m_isGeneratedField )
1096 return;
1097
1098 // Mandatory fields should not have leading or trailing whitespace.
1099 if( IsMandatory() )
1100 EDA_TEXT::SetText( aText.Strip( wxString::both ) );
1101 else
1102 EDA_TEXT::SetText( aText );
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
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
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,
1226 int aUnit, int aBodyStyle, const VECTOR2I& aOffset, bool aDimmed )
1227{
1228 wxString text;
1229
1230 if( Schematic() )
1231 text = GetShownText( &Schematic()->CurrentSheet(), true );
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( aDimmed )
1251 {
1252 color.Desaturate( );
1253 color = color.Mix( bg, 0.5f );
1254 }
1255
1256 penWidth = std::max( penWidth, renderSettings->GetMinPenWidth() );
1257
1258 // clamp the pen width to be sure the text is readable
1259 penWidth = std::min( penWidth, std::min( GetTextSize().x, GetTextSize().y ) / 4 );
1260
1261 if( !IsVisible() && !renderSettings->m_ShowHiddenFields )
1262 return;
1263
1264 // Calculate the text orientation, according to the symbol orientation/mirror
1265 EDA_ANGLE orient = GetTextAngle();
1266 VECTOR2I textpos = GetTextPos();
1268 GR_TEXT_V_ALIGN_T vjustify = GetVertJustify();
1269
1270 if( renderSettings->m_Transform.y1 ) // Rotate symbol 90 deg.
1271 {
1272 if( orient.IsHorizontal() )
1273 orient = ANGLE_VERTICAL;
1274 else
1275 orient = ANGLE_HORIZONTAL;
1276 }
1277
1278 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
1279 {
1280 /*
1281 * Calculate the text justification, according to the symbol orientation/mirror. This is
1282 * a bit complicated due to cumulative calculations:
1283 * - numerous cases (mirrored or not, rotation)
1284 * - the plotter's Text() function will also recalculate H and V justifications according
1285 * to the text orientation
1286 * - when a symbol is mirrored the text is not, and justifications become a nightmare
1287 *
1288 * So the easier way is to use no justifications (centered text) and use GetBoundingBox
1289 * to know the text coordinate considered as centered.
1290 */
1291 hjustify = GR_TEXT_H_ALIGN_CENTER;
1292 vjustify = GR_TEXT_V_ALIGN_CENTER;
1293 textpos = GetBoundingBox().Centre();
1294 }
1295 else if( m_parent && m_parent->Type() == SCH_GLOBAL_LABEL_T )
1296 {
1297 SCH_GLOBALLABEL* label = static_cast<SCH_GLOBALLABEL*>( m_parent );
1298 textpos += label->GetSchematicTextOffset( renderSettings );
1299 }
1300 else if( m_parent && m_parent->Type() == SCH_DIRECTIVE_LABEL_T )
1301 {
1302 SCH_DIRECTIVE_LABEL* label = static_cast<SCH_DIRECTIVE_LABEL*>( m_parent );
1303 std::shared_ptr<NETCLASS> nc = label->GetEffectiveNetClass();
1304
1305 if( nc && ( nc->GetSchematicColor() != COLOR4D::UNSPECIFIED ) && aPlotter->GetColorMode() )
1306 color = nc->GetSchematicColor();
1307 }
1308
1309 KIFONT::FONT* font = GetDrawFont( renderSettings );
1311 attrs.m_StrokeWidth = penWidth;
1312 attrs.m_Halign = hjustify;
1313 attrs.m_Valign = vjustify;
1314 attrs.m_Angle = orient;
1315 attrs.m_Multiline = false;
1316
1317 aPlotter->PlotText( textpos, color, text, attrs, font, GetFontMetrics() );
1318
1320 {
1321 if( SCH_LABEL_BASE* label = dynamic_cast<SCH_LABEL_BASE*>( m_parent ) )
1322 {
1323 std::vector<std::pair<wxString, wxString>> pages;
1324 std::vector<wxString> pageHrefs;
1325
1326 label->GetIntersheetRefs( &Schematic()->CurrentSheet(), &pages );
1327
1328 for( const auto& [ pageNumber, sheetName ] : pages )
1329 pageHrefs.push_back( wxT( "#" ) + pageNumber );
1330
1331 BOX2I bbox = GetBoundingBox();
1332 bbox.Offset( label->GetSchematicTextOffset( renderSettings ) );
1333
1334 aPlotter->HyperlinkMenu( bbox, pageHrefs );
1335 }
1336 }
1337}
1338
1339
1340void SCH_FIELD::SetPosition( const VECTOR2I& aPosition )
1341{
1342 // Actual positions are calculated by the rotation/mirror transform of the parent symbol
1343 // of the field. The inverse transform is used to calculate the position relative to the
1344 // parent symbol.
1345 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
1346 {
1347 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
1348 VECTOR2I relPos = aPosition - parentSymbol->GetPosition();
1349
1350 relPos = parentSymbol->GetTransform().InverseTransform().TransformCoordinate( relPos );
1351
1352 SetTextPos( relPos + parentSymbol->GetPosition() );
1353 return;
1354 }
1355
1356 SetTextPos( aPosition );
1357}
1358
1359
1361{
1362 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
1363 {
1364 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
1365 VECTOR2I relativePos = GetTextPos() - parentSymbol->GetPosition();
1366
1367 relativePos = parentSymbol->GetTransform().TransformCoordinate( relativePos );
1368
1369 return relativePos + parentSymbol->GetPosition();
1370 }
1371
1372 return GetTextPos();
1373}
1374
1375
1377{
1378 return m_parent ? m_parent->GetPosition() : VECTOR2I( 0, 0 );
1379}
1380
1381
1393
1394
1395bool SCH_FIELD::operator<( const SCH_ITEM& aItem ) const
1396{
1397 if( Type() != aItem.Type() )
1398 return Type() < aItem.Type();
1399
1400 auto field = static_cast<const SCH_FIELD*>( &aItem );
1401
1402 if( GetId() != field->GetId() )
1403 return GetId() < field->GetId();
1404
1405 if( GetText() != field->GetText() )
1406 return GetText() < field->GetText();
1407
1408 if( GetLibPosition().x != field->GetLibPosition().x )
1409 return GetLibPosition().x < field->GetLibPosition().x;
1410
1411 if( GetLibPosition().y != field->GetLibPosition().y )
1412 return GetLibPosition().y < field->GetLibPosition().y;
1413
1414 return GetName() < field->GetName();
1415}
1416
1417
1418bool SCH_FIELD::operator==(const SCH_ITEM& aOther) const
1419{
1420 if( Type() != aOther.Type() )
1421 return false;
1422
1423 const SCH_FIELD& field = static_cast<const SCH_FIELD&>( aOther );
1424
1425 return *this == field;
1426}
1427
1428
1429bool SCH_FIELD::operator==( const SCH_FIELD& aOther ) const
1430{
1431 // Identical fields of different symbols are not equal.
1432 if( !GetParentSymbol() || !aOther.GetParentSymbol()
1433 || GetParentSymbol()->m_Uuid != aOther.GetParentSymbol()->m_Uuid )
1434 {
1435 return false;
1436 }
1437
1438 if( IsMandatory() != aOther.IsMandatory() )
1439 return false;
1440
1441 if( IsMandatory() )
1442 {
1443 if( GetId() != aOther.GetId() )
1444 return false;
1445 }
1446 else
1447 {
1448 if( GetOrdinal() != aOther.GetOrdinal() )
1449 return false;
1450 }
1451
1452 if( GetPosition() != aOther.GetPosition() )
1453 return false;
1454
1455 if( IsGeneratedField() != aOther.IsGeneratedField() )
1456 return false;
1457
1458 if( IsNameShown() != aOther.IsNameShown() )
1459 return false;
1460
1461 if( CanAutoplace() != aOther.CanAutoplace() )
1462 return false;
1463
1464 return EDA_TEXT::operator==( aOther );
1465}
1466
1467
1468double SCH_FIELD::Similarity( const SCH_ITEM& aOther ) const
1469{
1470 if( Type() != aOther.Type() )
1471 return 0.0;
1472
1473 if( m_Uuid == aOther.m_Uuid )
1474 return 1.0;
1475
1476 const SCH_FIELD& field = static_cast<const SCH_FIELD&>( aOther );
1477
1478 double similarity = 0.99; // The UUIDs are different, so we start with non-identity
1479
1480 if( GetId() != field.GetId() )
1481 {
1482 // We don't allow swapping of mandatory fields, so these cannot be the same item
1483 if( IsMandatory() || field.IsMandatory() )
1484 return 0.0;
1485 else
1486 similarity *= 0.5;
1487 }
1488
1489 similarity *= SimilarityBase( aOther );
1490
1491 similarity *= EDA_TEXT::Similarity( field );
1492
1493 if( GetPosition() != field.GetPosition() )
1494 similarity *= 0.5;
1495
1496 if( IsGeneratedField() != field.IsGeneratedField() )
1497 similarity *= 0.5;
1498
1499 if( IsNameShown() != field.IsNameShown() )
1500 similarity *= 0.5;
1501
1502 if( CanAutoplace() != field.CanAutoplace() )
1503 similarity *= 0.5;
1504
1505 return similarity;
1506}
1507
1508
1509int SCH_FIELD::compare( const SCH_ITEM& aOther, int aCompareFlags ) const
1510{
1511 wxASSERT( aOther.Type() == SCH_FIELD_T );
1512
1513 int compareFlags = aCompareFlags;
1514
1515 // For ERC tests, the field position has no matter, so do not test it
1516 if( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::ERC )
1518
1519 int retv = SCH_ITEM::compare( aOther, compareFlags );
1520
1521 if( retv )
1522 return retv;
1523
1524 const SCH_FIELD* tmp = static_cast<const SCH_FIELD*>( &aOther );
1525
1526 // Equality test will vary depending whether or not the field is mandatory. Otherwise,
1527 // sorting is done by ordinal.
1528 if( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::EQUALITY )
1529 {
1530 // Mandatory fields have fixed ordinals and their names can vary due to translated field
1531 // names. Optional fields have fixed names and their ordinals can vary.
1532 if( IsMandatory() )
1533 {
1534 if( m_id != tmp->m_id )
1535 return (int) m_id - (int) tmp->m_id;
1536 }
1537 else
1538 {
1539 retv = m_name.Cmp( tmp->m_name );
1540
1541 if( retv )
1542 return retv;
1543 }
1544 }
1545 else // assume we're sorting
1546 {
1547 if( m_id != tmp->m_id )
1548 return (int) m_id - (int) tmp->m_id;
1549 }
1550
1551 bool ignoreFieldText = false;
1552
1553 if( m_id == FIELD_T::REFERENCE && !( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::EQUALITY ) )
1554 ignoreFieldText = true;
1555
1556 if( m_id == FIELD_T::VALUE && ( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::ERC ) )
1557 ignoreFieldText = true;
1558
1559 if( !ignoreFieldText )
1560 {
1561 retv = GetText().CmpNoCase( tmp->GetText() );
1562
1563 if( retv != 0 )
1564 return retv;
1565 }
1566
1567 if( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::EQUALITY )
1568 {
1569 if( GetTextPos().x != tmp->GetTextPos().x )
1570 return GetTextPos().x - tmp->GetTextPos().x;
1571
1572 if( GetTextPos().y != tmp->GetTextPos().y )
1573 return GetTextPos().y - tmp->GetTextPos().y;
1574 }
1575
1576 // For ERC tests, the field size has no matter, so do not test it
1577 if( !( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::ERC ) )
1578 {
1579 if( GetTextWidth() != tmp->GetTextWidth() )
1580 return GetTextWidth() - tmp->GetTextWidth();
1581
1582 if( GetTextHeight() != tmp->GetTextHeight() )
1583 return GetTextHeight() - tmp->GetTextHeight();
1584 }
1585
1586 return 0;
1587}
1588
1589
1590wxString SCH_FIELD::getUnescapedText( const SCH_SHEET_PATH* aPath, const wxString& aVariantName ) const
1591{
1592 wxString retv = EDA_TEXT::GetShownText( false );
1593
1594 // Special handling for parent object field instance and variant information.
1595 if( m_parent && aPath )
1596 {
1597 switch( m_parent->Type() )
1598 {
1599 case SCH_SYMBOL_T:
1600 {
1601 const SCH_SYMBOL* symbol = static_cast<const SCH_SYMBOL*>( m_parent );
1602
1603 if( m_id == FIELD_T::REFERENCE )
1604 retv = symbol->GetRef( aPath, true );
1605
1606 break;
1607 }
1608
1609 case SCH_SHEET_T:
1610 break;
1611
1612 default:
1613 break;
1614 }
1615 }
1616
1617 return retv;
1618}
1619
1620
1621static struct SCH_FIELD_DESC
1622{
1624 {
1625 // These are defined in EDA_TEXT as well but initialization order is
1626 // not defined, so this needs to be conditional. Defining in both
1627 // places leads to duplicate symbols.
1629
1630 if( h_inst.Choices().GetCount() == 0)
1631 {
1632 h_inst.Map( GR_TEXT_H_ALIGN_LEFT, _HKI( "Left" ) );
1633 h_inst.Map( GR_TEXT_H_ALIGN_CENTER, _HKI( "Center" ) );
1634 h_inst.Map( GR_TEXT_H_ALIGN_RIGHT, _HKI( "Right" ) );
1635 }
1636
1638
1639 if( v_inst.Choices().GetCount() == 0)
1640 {
1641 v_inst.Map( GR_TEXT_V_ALIGN_TOP, _HKI( "Top" ) );
1642 v_inst.Map( GR_TEXT_V_ALIGN_CENTER, _HKI( "Center" ) );
1643 v_inst.Map( GR_TEXT_V_ALIGN_BOTTOM, _HKI( "Bottom" ) );
1644 }
1645
1652
1653 const wxString textProps = _HKI( "Text Properties" );
1654
1656 _HKI( "Horizontal Justification" ), &SCH_FIELD::SetEffectiveHorizJustify,
1658
1659 propMgr.ReplaceProperty( TYPE_HASH( EDA_TEXT ), _HKI( "Horizontal Justification" ), horiz,
1660 textProps );
1661
1663 _HKI( "Vertical Justification" ), &SCH_FIELD::SetEffectiveVertJustify,
1665
1666 propMgr.ReplaceProperty( TYPE_HASH( EDA_TEXT ), _HKI( "Vertical Justification" ), vert,
1667 textProps );
1668
1669 propMgr.AddProperty( new PROPERTY<SCH_FIELD, bool>( _HKI( "Show Field Name" ),
1671
1672 propMgr.AddProperty( new PROPERTY<SCH_FIELD, bool>( _HKI( "Allow Autoplacement" ),
1674
1675 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Hyperlink" ) );
1676 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Thickness" ) );
1677 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Mirrored" ) );
1678 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Width" ) );
1679 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Height" ) );
1680
1681
1682 propMgr.AddProperty( new PROPERTY<SCH_FIELD, int>( _HKI( "Text Size" ),
1684 _HKI( "Text Properties" ) );
1685
1686 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Orientation" ) );
1687
1688 auto isNotGeneratedField =
1689 []( INSPECTABLE* aItem ) -> bool
1690 {
1691 if( SCH_FIELD* field = dynamic_cast<SCH_FIELD*>( aItem ) )
1692 return !field->IsGeneratedField();
1693
1694 return true;
1695 };
1696
1698 isNotGeneratedField );
1699
1700
1701 auto isNonMandatoryField =
1702 []( INSPECTABLE* aItem ) -> bool
1703 {
1704 if( SCH_FIELD* field = dynamic_cast<SCH_FIELD*>( aItem ) )
1705 return !field->IsMandatory();
1706
1707 return false;
1708 };
1709
1711 _HKI( "Private" ), isNonMandatoryField );
1712 }
1714
1715
int color
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:114
BITMAPS
A list of all bitmap identifiers.
@ edit_comp_value
@ edit_comp_footprint
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition box2.h:558
constexpr const Vec GetEnd() const
Definition box2.h:212
constexpr void SetOrigin(const Vec &pos)
Definition box2.h:237
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
Definition box2.h:146
constexpr Vec Centre() const
Definition box2.h:97
constexpr bool Contains(const Vec &aPoint) const
Definition box2.h:168
constexpr void Move(const Vec &aMoveVector)
Move the rectangle by the aMoveVector.
Definition box2.h:138
constexpr const Vec & GetOrigin() const
Definition box2.h:210
constexpr void SetEnd(coord_type x, coord_type y)
Definition box2.h:297
constexpr void Offset(coord_type dx, coord_type dy)
Definition box2.h:259
constexpr bool Intersects(const BOX2< Vec > &aRect) const
Definition box2.h:311
static const COLOR4D WHITE
Definition color4d.h:401
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Definition color4d.h:398
bool IsHorizontal() const
Definition eda_angle.h:142
The base class for create windows for drawing purpose.
const KIID m_Uuid
Definition eda_item.h:516
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
EDA_ITEM_FLAGS m_flags
Definition eda_item.h:527
virtual bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const
Compare the item against the search criteria in aSearchData.
Definition eda_item.h:401
EDA_ITEM * GetParent() const
Definition eda_item.h:112
EDA_ITEM * m_parent
Owner.
Definition eda_item.h:528
bool IsForceVisible() const
Definition eda_item.h:211
static bool Replace(const EDA_SEARCH_DATA &aSearchData, wxString &aText)
Perform a text replace on aText using the find and replace criteria in aSearchData on items that supp...
Definition eda_item.cpp:236
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:39
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition eda_text.h:80
int GetTextHeight() const
Definition eda_text.h:267
const VECTOR2I & GetTextPos() const
Definition eda_text.h:273
COLOR4D GetTextColor() const
Definition eda_text.h:270
wxString GetTextStyleName() const
Definition eda_text.cpp:992
bool IsItalic() const
Definition eda_text.h:169
const EDA_ANGLE & GetTextAngle() const
Definition eda_text.h:147
void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
Definition eda_text.cpp:544
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition eda_text.h:98
virtual bool IsVisible() const
Definition eda_text.h:187
void SetTextPos(const VECTOR2I &aPoint)
Definition eda_text.cpp:589
void SetTextX(int aX)
Definition eda_text.cpp:595
KIFONT::FONT * GetFont() const
Definition eda_text.h:247
void SetAttributes(const EDA_TEXT &aSrc, bool aSetPosition=true)
Set the text attributes from another instance.
Definition eda_text.cpp:444
void SetTextY(int aY)
Definition eda_text.cpp:601
EDA_TEXT & operator=(const EDA_TEXT &aItem)
Definition eda_text.cpp:159
int GetTextWidth() const
Definition eda_text.h:264
BOX2I GetTextBox(const RENDER_SETTINGS *aSettings, int aLine=-1) const
Useful in multiline texts to calculate the full text or a line area (for zones filling,...
Definition eda_text.cpp:755
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
Definition eda_text.cpp:428
GR_TEXT_H_ALIGN_T GetHorizJustify() const
Definition eda_text.h:200
bool Replace(const EDA_SEARCH_DATA &aSearchData)
Helper function used in search and replace dialog.
Definition eda_text.cpp:497
bool HasTextVars() const
Indicates the ShownText has text var references which need to be processed.
Definition eda_text.h:117
virtual void SetVisible(bool aVisible)
Definition eda_text.cpp:397
EDA_TEXT(const EDA_IU_SCALE &aIuScale, const wxString &aText=wxEmptyString)
Definition eda_text.cpp:97
virtual void ClearBoundingBoxCache()
Definition eda_text.cpp:688
double Similarity(const EDA_TEXT &aOther) const
wxString EvaluateText(const wxString &aText) const
Definition eda_text.cpp:652
virtual void ClearRenderCache()
Definition eda_text.cpp:682
const TEXT_ATTRIBUTES & GetAttributes() const
Definition eda_text.h:231
int GetEffectiveTextPenWidth(int aDefaultPenWidth=0) const
The EffectiveTextPenWidth uses the text thickness if > 1 or aDefaultPenWidth.
Definition eda_text.cpp:476
void SwapAttributes(EDA_TEXT &aTradingPartner)
Swap the text attributes of the two involved instances.
Definition eda_text.cpp:463
bool IsBold() const
Definition eda_text.h:184
GR_TEXT_V_ALIGN_T GetVertJustify() const
Definition eda_text.h:203
virtual wxString GetShownText(bool aAllowExtraText, int aDepth=0) const
Return the string actually shown after processing of the base text.
Definition eda_text.h:109
virtual void SetText(const wxString &aText)
Definition eda_text.cpp:281
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
Definition eda_text.cpp:310
void SwapText(EDA_TEXT &aTradingPartner)
Definition eda_text.cpp:456
bool operator==(const EDA_TEXT &aRhs) const
Definition eda_text.h:396
VECTOR2I GetTextSize() const
Definition eda_text.h:261
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
Definition eda_text.cpp:420
static ENUM_MAP< T > & Instance()
Definition property.h:721
Class that other classes need to inherit from, in order to be inspectable.
Definition inspectable.h:37
FONT is an abstract base class for both outline and stroke fonts.
Definition font.h:131
static FONT * GetFont(const wxString &aFontName=wxEmptyString, bool aBold=false, bool aItalic=false, const std::vector< wxString > *aEmbeddedFiles=nullptr, bool aForDrawingSheet=false)
Definition font.cpp:147
virtual bool IsOutline() const
Definition font.h:139
Class OUTLINE_FONT implements outline font drawing.
void GetLinesAsGlyphs(std::vector< std::unique_ptr< GLYPH > > *aGlyphs, const wxString &aText, const VECTOR2I &aPosition, const TEXT_ATTRIBUTES &aAttrs, const METRICS &aFontMetrics) const
void Move(const VECTOR2I &aOffset)
Definition glyph.cpp:114
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:104
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
bool ResolveTextVar(wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the symbol.
static wxString LetterSubReference(int aUnit, wxChar aInitialLetter)
COLOR4D GetSchematicColor(bool aIsForSave=false) const
Definition netclass.h:219
A singleton reporter that reports to nowhere.
Definition reporter.h:216
Base plotter engine class.
Definition plotter.h:121
bool GetColorMode() const
Definition plotter.h:149
virtual void PlotText(const VECTOR2I &aPos, const COLOR4D &aColor, const wxString &aText, const TEXT_ATTRIBUTES &aAttributes, KIFONT::FONT *aFont=nullptr, const KIFONT::METRICS &aFontMetrics=KIFONT::METRICS::Default(), void *aData=nullptr)
Definition plotter.cpp:695
virtual void HyperlinkMenu(const BOX2I &aBox, const std::vector< wxString > &aDestURLs)
Create a clickable hyperlink menu with a rectangular click area.
Definition plotter.h:472
virtual std::map< wxString, wxString > & GetTextVars() const
Definition project.cpp:111
Provide class metadata.Helper macro to map type hashes to names.
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
void Mask(TYPE_ID aDerived, TYPE_ID aBase, const wxString &aName)
Sets a base class property as masked in a derived class.
static PROPERTY_MANAGER & Instance()
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
void OverrideAvailability(TYPE_ID aDerived, TYPE_ID aBase, const wxString &aName, std::function< bool(INSPECTABLE *)> aFunc)
Sets an override availability functor for a base class property of a given derived class.
PROPERTY_BASE & ReplaceProperty(size_t aBase, const wxString &aName, PROPERTY_BASE *aNew, const wxString &aGroup=wxEmptyString)
Replace an existing property for a specific type.
void OverrideWriteability(TYPE_ID aDerived, TYPE_ID aBase, const wxString &aName, std::function< bool(INSPECTABLE *)> aFunc)
Sets an override writeability functor for a base class property of a given derived class.
void AddTypeCast(TYPE_CAST_BASE *aCast)
Register a type converter.
These are loaded from Eeschema settings but then overwritten by the project settings.
Holds all the data relating to one schematic.
Definition schematic.h:88
SCHEMATIC_SETTINGS & Settings() const
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
PROJECT & Project() const
Return a reference to the project this schematic is part of.
Definition schematic.h:103
EMBEDDED_FILES * GetEmbeddedFiles() override
bool ResolveTextVar(const SCH_SHEET_PATH *aSheetPath, wxString *token, int aDepth) const
SCH_SHEET_PATH & CurrentSheet() const
Definition schematic.h:171
void ClearRenderCache() override
int compare(const SCH_ITEM &aOther, int aCompareFlags=0) const override
Provide the draw object specific comparison called by the == and < operators.
COLOR4D m_lastResolvedColor
Definition sch_field.h:347
GR_TEXT_V_ALIGN_T GetEffectiveVertJustify() const
bool IsMandatory() const
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
wxString GetFullText(int unit=1) const
Return the text of a field.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
std::vector< std::unique_ptr< KIFONT::GLYPH > > m_renderCache
Definition sch_field.h:345
void swapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
VECTOR2I GetPosition() const override
void SetEffectiveHorizJustify(GR_TEXT_H_ALIGN_T)
int GetSchTextSize() const
Definition sch_field.h:162
bool Replace(const EDA_SEARCH_DATA &aSearchData, void *aAuxData=nullptr) override
Perform a text replace using the find and replace criteria in aSearchData on items that support text ...
bool m_showName
Render the field name in addition to its value.
Definition sch_field.h:335
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
bool IsNameShown() const
Definition sch_field.h:201
bool IsHypertext() const override
Allow items to support hypertext actions when hovered/clicked.
bool m_autoAdded
Was this field automatically added to a LIB_SYMBOL?
Definition sch_field.h:340
double Similarity(const SCH_ITEM &aItem) const override
Return a measure of how likely the other object is to represent the same object.
bool IsGeneratedField() const
Generated fields are fields whose names are variables like ${VAR}.
Definition sch_field.h:210
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
SCH_LAYER_ID GetDefaultLayer() const
bool IsHorizJustifyFlipped() const
Return whether the field will be rendered with the horizontal justification inverted due to rotation ...
bool IsVertJustifyFlipped() const
EDA_ANGLE GetDrawRotation() const override
Adjusters to allow EDA_TEXT to draw/print/etc.
void SetEffectiveVertJustify(GR_TEXT_V_ALIGN_T)
void CalcEdit(const VECTOR2I &aPosition) override
Calculate the attributes of an item at aPosition when it is being edited.
bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const override
Compare the item against the search criteria in aSearchData.
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
FIELD_T GetId() const
Definition sch_field.h:116
void SetCanAutoplace(bool aCanPlace)
Definition sch_field.h:213
void DoHypertextAction(EDA_DRAW_FRAME *aFrame) const override
int GetPenWidth() const override
wxString GetCanonicalName() const
Get a non-language-specific name for a field which can be used for storage, variable look-up,...
bool m_isGeneratedField
If the field name is a variable name (e.g.
Definition sch_field.h:337
int m_ordinal
Sort order for non-mandatory fields.
Definition sch_field.h:332
COLOR4D GetFieldColor() const
wxString getUnescapedText(const SCH_SHEET_PATH *aPath=nullptr, const wxString &aVariantName=wxEmptyString) const
bool operator==(const SCH_ITEM &aItem) const override
SCH_FIELD & operator=(const SCH_FIELD &aField)
void ImportValues(const SCH_FIELD &aSource)
Copy parameters from a SCH_FIELD source.
bool operator<(const SCH_ITEM &aItem) const override
FIELD_T m_id
Field id,.
Definition sch_field.h:331
wxString GetShownName() const
Get the field's name as displayed on the schematic or in the symbol fields table.
VECTOR2I GetLibPosition() const
Definition sch_field.h:259
void setId(FIELD_T aId)
int GetOrdinal() const
Definition sch_field.h:118
bool IsEmpty()
Return true if both the name and value of the field are empty.
Definition sch_field.h:154
bool m_renderCacheValid
Definition sch_field.h:343
KIFONT::FONT * GetDrawFont(const RENDER_SETTINGS *aSettings) const override
void BeginEdit(const VECTOR2I &aStartPoint) override
Begin drawing a symbol library draw item at aPosition.
bool IsReplaceable() const override
Override this method in any derived object that supports test find and replace.
void SetSchTextSize(int aSize)
Definition sch_field.h:163
GR_TEXT_H_ALIGN_T GetEffectiveHorizJustify() const
std::vector< int > ViewGetLayers() const override
Return the all the layers within the VIEW the object is painted on.
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
void SetPosition(const VECTOR2I &aPosition) override
void SetName(const wxString &aName)
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
VECTOR2I m_renderCachePos
Definition sch_field.h:344
bool CanAutoplace() const
Definition sch_field.h:212
std::vector< std::unique_ptr< KIFONT::GLYPH > > * GetRenderCache(const wxString &forResolvedText, const VECTOR2I &forPosition, TEXT_ATTRIBUTES &aAttrs) const
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
void ClearCaches() override
void SetText(const wxString &aText) override
VECTOR2I GetParentPosition() const
bool m_showInChooser
This field is available as a data column for the chooser.
Definition sch_field.h:341
void OnScintillaCharAdded(SCINTILLA_TRICKS *aScintillaTricks, wxStyledTextEvent &aEvent) const
wxString m_name
Definition sch_field.h:333
void SetNameShown(bool aShown=true)
Definition sch_field.h:202
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
void Copy(SCH_FIELD *aTarget) const
Copy parameters of this field to another field.
bool m_allowAutoPlace
This field can be autoplaced.
Definition sch_field.h:336
VECTOR2I GetSchematicTextOffset(const RENDER_SETTINGS *aSettings) const override
This offset depends on the orientation, the type of text, and the area required to draw the associate...
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition sch_item.h:167
SCH_ITEM & operator=(const SCH_ITEM &aPin)
Definition sch_item.cpp:75
SCH_RENDER_SETTINGS * getRenderSettings(PLOTTER *aPlotter) const
Definition sch_item.h:700
const SYMBOL * GetParentSymbol() const
Definition sch_item.cpp:250
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:244
friend class LIB_SYMBOL
Definition sch_item.h:771
@ SKIP_TST_POS
Definition sch_item.h:683
std::shared_ptr< NETCLASS > GetEffectiveNetClass(const SCH_SHEET_PATH *aSheet=nullptr) const
Definition sch_item.cpp:381
void SetLayer(SCH_LAYER_ID aLayer)
Definition sch_item.h:322
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition sch_item.h:321
virtual int compare(const SCH_ITEM &aOther, int aCompareFlags=0) const
Provide the draw object specific comparison called by the == and < operators.
Definition sch_item.cpp:570
const wxString & GetDefaultFont(const RENDER_SETTINGS *aSettings) const
Definition sch_item.cpp:609
bool IsConnectivityDirty() const
Definition sch_item.h:566
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
Definition sch_item.cpp:51
bool m_private
Definition sch_item.h:754
const KIFONT::METRICS & GetFontMetrics() const
Definition sch_item.cpp:622
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:358
void GetIntersheetRefs(const SCH_SHEET_PATH *aPath, std::vector< std::pair< wxString, wxString > > *pages)
Build an array of { pageNumber, pageName } pairs.
virtual bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth) const
Resolve any references to system tokens supported by the label.
static const wxString GetDefaultFieldName(const wxString &aName, bool aUseDefaultName)
void GetContextualTextVars(wxArrayString *aVars) const
Return the list of system text vars & fields for this label.
Handle actions specific to the schematic editor.
static wxString g_BackLink
void HypertextCommand(const wxString &aHref)
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
const KIGFX::COLOR4D & GetBackgroundColor() const override
Return current background color settings.
void GetSymbols(SCH_REFERENCE_LIST &aReferences, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanSymbols=false) const
Add a SCH_REFERENCE object to aReferences for each symbol in the list of sheets.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition sch_sheet.h:47
void GetContextualTextVars(wxArrayString *aVars) const
Return the list of system text vars & fields for this sheet.
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the sheet.
Schematic symbol object.
Definition sch_symbol.h:75
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:808
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the symbol.
void GetContextualTextVars(wxArrayString *aVars) const
Return the list of system text vars & fields for this symbol.
int GetUnitSelection(const SCH_SHEET_PATH *aSheet) const
Return the instance-specific unit selection for the given sheet path.
int GetUnitCount() const override
Return the number of units per package of the symbol.
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
Add cut/copy/paste, dark theme, autocomplete and brace highlighting to a wxStyleTextCtrl instance.
wxStyledTextCtrl * Scintilla() const
void DoAutocomplete(const wxString &aPartial, const wxArrayString &aTokens)
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
void Move(const VECTOR2I &aVector) override
static constexpr auto LIBRARY_FIELD
Definition sim_library.h:35
SIM_MODEL & CreateModel(SIM_MODEL::TYPE aType, const std::vector< SCH_PIN * > &aPins, REPORTER &aReporter)
void SetFilesStack(std::vector< EMBEDDED_FILES * > aFilesStack)
Definition sim_lib_mgr.h:48
virtual std::vector< std::string > GetPinNames() const
Definition sim_model.h:465
const TRANSFORM & GetTransform() const
Definition symbol.h:218
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:123
wxString ExpandTextVars(const wxString &aSource, const PROJECT *aProject, int aFlags)
Definition common.cpp:59
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.
@ 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:45
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.
Definition for symbol library class.
wxString GetDefaultFieldName(FIELD_T aFieldId, bool aTranslateForHI)
Return a default symbol field name for a mandatory field type.
#define DO_TRANSLATE
FIELD_T
The set of all field indices assuming an array like sequence that a SCH_COMPONENT or LIB_PART can hol...
@ USER
The field ID hasn't been set yet; field is invalid.
@ INTERSHEET_REFS
Global label cross-reference page numbers.
@ DESCRIPTION
Field Description of part, i.e. "1/4W 1% Metal Film Resistor".
@ FOOTPRINT
Field Name Module PCB, i.e. "16DIP300".
@ DATASHEET
name of datasheet
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
wxString GetCanonicalFieldName(FIELD_T aFieldType)
VECTOR2I end
int delta
GR_TEXT_H_ALIGN_T
This is API surface mapped to common.types.HorizontalAlignment.
@ GR_TEXT_H_ALIGN_CENTER
@ GR_TEXT_H_ALIGN_RIGHT
@ GR_TEXT_H_ALIGN_LEFT
@ GR_TEXT_H_ALIGN_INDETERMINATE
GR_TEXT_V_ALIGN_T
This is API surface mapped to common.types.VertialAlignment.
@ GR_TEXT_V_ALIGN_BOTTOM
@ GR_TEXT_V_ALIGN_INDETERMINATE
@ GR_TEXT_V_ALIGN_CENTER
@ GR_TEXT_V_ALIGN_TOP
wxLogTrace helper definitions.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
Definition trigo.cpp:229
@ LIB_SYMBOL_T
Definition typeinfo.h:152
@ SCH_SYMBOL_T
Definition typeinfo.h:176
@ SCH_FIELD_T
Definition typeinfo.h:154
@ SCH_DIRECTIVE_LABEL_T
Definition typeinfo.h:175
@ SCH_LABEL_T
Definition typeinfo.h:171
@ SCH_SHEET_T
Definition typeinfo.h:179
@ SCH_LABEL_LOCATE_ANY_T
Definition typeinfo.h:195
@ SCH_GLOBAL_LABEL_T
Definition typeinfo.h:172
Casted dyn_cast(From aObject)
A lightweight dynamic downcast.
Definition typeinfo.h:61
#define INDETERMINATE_STATE
Used for holding indeterminate values, such as with multiple selections holding different values or c...
Definition ui_common.h:46
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695