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,
193 int aDepth ) const
194{
195 std::function<bool( wxString* )> libSymbolResolver =
196 [&]( wxString* token ) -> bool
197 {
198 LIB_SYMBOL* symbol = static_cast<LIB_SYMBOL*>( m_parent );
199 return symbol->ResolveTextVar( token, aDepth + 1 );
200 };
201
202 std::function<bool( wxString* )> symbolResolver =
203 [&]( wxString* token ) -> bool
204 {
205 SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( m_parent );
206 return symbol->ResolveTextVar( aPath, token, aDepth + 1 );
207 };
208
209 std::function<bool( wxString* )> schematicResolver =
210 [&]( wxString* token ) -> bool
211 {
212 if( !aPath )
213 return false;
214
215 if( SCHEMATIC* schematic = Schematic() )
216 return schematic->ResolveTextVar( aPath, token, aDepth + 1 );
217
218 return false;
219 };
220
221 std::function<bool( wxString* )> sheetResolver =
222 [&]( wxString* token ) -> bool
223 {
224 if( !aPath )
225 return false;
226
227 SCH_SHEET* sheet = static_cast<SCH_SHEET*>( m_parent );
228
229 SCHEMATIC* schematic = Schematic();
230 SCH_SHEET_PATH path = *aPath;
231 path.push_back( sheet );
232
233 bool retval = sheet->ResolveTextVar( &path, token, aDepth + 1 );
234
235 if( schematic )
236 retval |= schematic->ResolveTextVar( &path, token, aDepth + 1 );
237
238 return retval;
239 };
240
241 std::function<bool( wxString* )> labelResolver =
242 [&]( wxString* token ) -> bool
243 {
244 if( !aPath )
245 return false;
246
247 SCH_LABEL_BASE* label = static_cast<SCH_LABEL_BASE*>( m_parent );
248 return label->ResolveTextVar( aPath, token, aDepth + 1 );
249 };
250
251 wxString text = EDA_TEXT::GetShownText( aAllowExtraText, aDepth );
252
253 if( IsNameShown() && aAllowExtraText )
254 text = GetShownName() << wxS( ": " ) << text;
255
256 if( HasTextVars() )
257 {
258 while( text.Contains( wxT( "${" ) ) && aDepth++ <= ADVANCED_CFG::GetCfg().m_ResolveTextRecursionDepth )
259 {
260 if( m_parent && m_parent->Type() == LIB_SYMBOL_T )
261 text = ExpandTextVars( text, &libSymbolResolver );
262 else if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
263 text = ExpandTextVars( text, &symbolResolver );
264 else if( m_parent && m_parent->Type() == SCH_SHEET_T )
265 text = ExpandTextVars( text, &sheetResolver );
266 else if( m_parent && m_parent->IsType( labelTypes ) )
267 text = ExpandTextVars( text, &labelResolver );
268 else if( Schematic() )
269 {
270 text = ExpandTextVars( text, &Schematic()->Project() );
271 text = ExpandTextVars( text, &schematicResolver );
272 }
273 }
274 }
275
276 if( m_id == FIELD_T::REFERENCE && aPath )
277 {
278 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
279
280 // For more than one part per package, we must add the part selection
281 // A, B, ... or 1, 2, .. to the reference.
282 if( parentSymbol && parentSymbol->GetUnitCount() > 1 )
283 text << parentSymbol->SubReference( parentSymbol->GetUnitSelection( aPath ) );
284 }
285
286 if( m_id == FIELD_T::SHEET_FILENAME && aAllowExtraText && !IsNameShown() )
287 text = _( "File:" ) + wxS( " " ) + text;
288
289 if( text.Contains( wxT( "@{" ) ) )
291
292 return text;
293}
294
295
296wxString SCH_FIELD::GetShownText( bool aAllowExtraText, int aDepth ) const
297{
298 if( SCHEMATIC* schematic = Schematic() )
299 return GetShownText( &schematic->CurrentSheet(), aAllowExtraText, aDepth );
300 else
301 return GetShownText( nullptr, aAllowExtraText, aDepth );
302}
303
304
305wxString SCH_FIELD::GetFullText( int unit ) const
306{
307 if( GetId() != FIELD_T::REFERENCE )
308 return GetText();
309
310 wxString text = GetText();
311 text << wxT( "?" );
312
313 if( GetParentSymbol() && GetParentSymbol()->IsMultiUnit() )
314 text << LIB_SYMBOL::LetterSubReference( unit, 'A' );
315
316 return text;
317}
318
319
321{
323}
324
325
327{
329
330 if( !font )
331 font = KIFONT::FONT::GetFont( GetDefaultFont( aSettings ), IsBold(), IsItalic() );
332
333 return font;
334}
335
336
342
343
349
350
351std::vector<std::unique_ptr<KIFONT::GLYPH>>*
352SCH_FIELD::GetRenderCache( const wxString& forResolvedText, const VECTOR2I& forPosition,
353 TEXT_ATTRIBUTES& aAttrs ) const
354{
355 KIFONT::FONT* font = GetDrawFont( nullptr );
356
357 if( font->IsOutline() )
358 {
359 KIFONT::OUTLINE_FONT* outlineFont = static_cast<KIFONT::OUTLINE_FONT*>( font );
360
361 if( m_renderCache.empty() || !m_renderCacheValid )
362 {
363 m_renderCache.clear();
364
365 outlineFont->GetLinesAsGlyphs( &m_renderCache, forResolvedText, forPosition, aAttrs,
366 GetFontMetrics() );
367
368 m_renderCachePos = forPosition;
369 m_renderCacheValid = true;
370 }
371
372 if( m_renderCachePos != forPosition )
373 {
374 VECTOR2I delta = forPosition - m_renderCachePos;
375
376 for( std::unique_ptr<KIFONT::GLYPH>& glyph : m_renderCache )
377 {
378 if( glyph->IsOutline() )
379 static_cast<KIFONT::OUTLINE_GLYPH*>( glyph.get() )->Move( delta );
380 else
381 static_cast<KIFONT::STROKE_GLYPH*>( glyph.get() )->Move( delta );
382 }
383
384 m_renderCachePos = forPosition;
385 }
386
387 return &m_renderCache;
388 }
389
390 return nullptr;
391}
392
393
394void SCH_FIELD::ImportValues( const SCH_FIELD& aSource )
395{
396 SetAttributes( aSource );
397 SetVisible( aSource.IsVisible() );
398 SetNameShown( aSource.IsNameShown() );
399 SetCanAutoplace( aSource.CanAutoplace() );
400}
401
402
404{
405 wxCHECK_RET( aItem && aItem->Type() == SCH_FIELD_T, wxT( "Cannot swap with invalid item." ) );
406
407 SCH_FIELD* item = static_cast<SCH_FIELD*>( aItem );
408
409 std::swap( m_showName, item->m_showName );
410 std::swap( m_allowAutoPlace, item->m_allowAutoPlace );
411 std::swap( m_isGeneratedField, item->m_isGeneratedField );
412 SwapText( *item );
413 SwapAttributes( *item );
414
415 std::swap( m_lastResolvedColor, item->m_lastResolvedColor );
416}
417
418
420{
422 {
424 }
425 else
426 {
427 SCH_LABEL_BASE* parentLabel = dynamic_cast<SCH_LABEL_BASE*>( GetParent() );
428
429 if( parentLabel && !parentLabel->IsConnectivityDirty() )
431 else
433 }
434
435 return m_lastResolvedColor;
436}
437
438
439std::vector<int> SCH_FIELD::ViewGetLayers() const
440{
442}
443
444
446{
447 if( m_parent && m_parent->Type() == SCH_LABEL_T )
448 {
449 if( GetCanonicalName() == wxT( "Netclass" )
450 || GetCanonicalName() == wxT( "Component Class" ) )
451 {
452 return LAYER_NETCLASS_REFS;
453 }
454 }
455
456 switch( m_id )
457 {
459 case FIELD_T::VALUE: return LAYER_VALUEPART;
464 default: return LAYER_FIELDS;
465 }
466}
467
468
470{
471 // Calculate the text orientation according to the symbol orientation.
472 EDA_ANGLE orient = GetTextAngle();
473
474 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
475 {
476 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
477
478 if( parentSymbol && parentSymbol->GetTransform().y1 ) // Rotate symbol 90 degrees.
479 {
480 if( orient.IsHorizontal() )
481 orient = ANGLE_VERTICAL;
482 else
483 orient = ANGLE_HORIZONTAL;
484 }
485 }
486
487 return orient;
488}
489
490
492{
493 BOX2I bbox = GetTextBox( nullptr );
494
495 // Calculate the bounding box position relative to the parent:
496 VECTOR2I origin = GetParentPosition();
497 VECTOR2I pos = GetTextPos() - origin;
498 VECTOR2I begin = bbox.GetOrigin() - origin;
499 VECTOR2I end = bbox.GetEnd() - origin;
500 RotatePoint( begin, pos, GetTextAngle() );
501 RotatePoint( end, pos, GetTextAngle() );
502
503 // Now, apply the symbol transform (mirror/rot)
504 TRANSFORM transform;
505
506 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
507 transform = static_cast<SCH_SYMBOL*>( m_parent )->GetTransform();
508
509 bbox.SetOrigin( transform.TransformCoordinate( begin ) );
510 bbox.SetEnd( transform.TransformCoordinate( end ) );
511
512 bbox.Move( origin );
513 bbox.Normalize();
514
515 return bbox;
516}
517
518
520{
521 VECTOR2I render_center = GetBoundingBox().Centre();
522 VECTOR2I pos = GetPosition();
523
524 switch( GetHorizJustify() )
525 {
527 if( GetDrawRotation().IsVertical() )
528 return render_center.y > pos.y;
529 else
530 return render_center.x < pos.x;
532 if( GetDrawRotation().IsVertical() )
533 return render_center.y < pos.y;
534 else
535 return render_center.x > pos.x;
536 default:
537 return false;
538 }
539}
540
541
543{
544 GR_TEXT_H_ALIGN_T actualJustify;
545
546 switch( aJustify )
547 {
550 break;
553 break;
554 default:
555 actualJustify = aJustify;
556 }
557
558 SetHorizJustify( actualJustify );
559}
560
561
574
575
577{
578 VECTOR2I render_center = GetBoundingBox().Centre();
579 VECTOR2I pos = GetPosition();
580
581 switch( GetVertJustify() )
582 {
584 if( GetDrawRotation().IsVertical() )
585 return render_center.x < pos.x;
586 else
587 return render_center.y < pos.y;
589 if( GetDrawRotation().IsVertical() )
590 return render_center.x > pos.x;
591 else
592 return render_center.y > pos.y;
593 default:
594 return false;
595 }
596}
597
598
600{
601 GR_TEXT_V_ALIGN_T actualJustify;
602
603 switch( aJustify )
604 {
607 break;
610 break;
611 default:
612 actualJustify = aJustify;
613 }
614
615 SetVertJustify( actualJustify );
616}
617
618
631
632
633bool SCH_FIELD::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const
634{
635 bool searchHiddenFields = aSearchData.searchAllFields;
636 bool searchAndReplace = aSearchData.searchAndReplace;
637 bool replaceReferences = false;
638
639 try
640 {
641 // downcast
642 const SCH_SEARCH_DATA& schSearchData = dynamic_cast<const SCH_SEARCH_DATA&>( aSearchData );
643 replaceReferences = schSearchData.replaceReferences;
644 }
645 catch( const std::bad_cast& )
646 {
647 }
648
649 wxString text = UnescapeString( GetText() );
650
651 if( !IsVisible() && !searchHiddenFields )
652 return false;
653
654 if( m_id == FIELD_T::REFERENCE )
655 {
656 if( searchAndReplace && !replaceReferences )
657 return false;
658
659 SCH_SYMBOL* parentSymbol = dyn_cast<SCH_SYMBOL*>( m_parent );
660
661 // The parent might be a LIB_SYMBOL, in which case, we don't
662 // have a sheet path to resolve the reference.
663 if( !parentSymbol )
664 return false;
665
666 if( parentSymbol->Matches( aSearchData, aAuxData ) )
667 return true;
668
669 wxASSERT( aAuxData );
670
671 // Take sheet path into account which effects the reference field and the unit for
672 // symbols with multiple parts.
673 if( aAuxData )
674 {
675 SCH_SHEET_PATH* sheet = (SCH_SHEET_PATH*) aAuxData;
676 text = parentSymbol->GetRef( sheet );
677
678 if( SCH_ITEM::Matches( text, aSearchData ) )
679 return true;
680
681 if( parentSymbol->GetUnitCount() > 1 )
682 text << parentSymbol->SubReference( parentSymbol->GetUnitSelection( sheet ) );
683 }
684 }
685
686 return SCH_ITEM::Matches( text, aSearchData );
687}
688
689
691 wxStyledTextEvent &aEvent ) const
692{
693 SCH_ITEM* parent = dynamic_cast<SCH_ITEM*>( GetParent() );
694 SCHEMATIC* schematic = parent ? parent->Schematic() : nullptr;
695
696 if( !schematic )
697 return;
698
699 wxStyledTextCtrl* scintilla = aScintillaTricks->Scintilla();
700 int key = aEvent.GetKey();
701
702 wxArrayString autocompleteTokens;
703 int pos = scintilla->GetCurrentPos();
704 int start = scintilla->WordStartPosition( pos, true );
705 wxString partial;
706
707 // Multi-line fields are not allowed. So remove '\n' if entered.
708 if( key == '\n' )
709 {
710 wxString text = scintilla->GetText();
711 int currpos = scintilla->GetCurrentPos();
712 text.Replace( wxS( "\n" ), wxS( "" ) );
713 scintilla->SetText( text );
714 scintilla->GotoPos( currpos-1 );
715 return;
716 }
717
718 auto textVarRef =
719 [&]( int pt )
720 {
721 return pt >= 2
722 && scintilla->GetCharAt( pt - 2 ) == '$'
723 && scintilla->GetCharAt( pt - 1 ) == '{';
724 };
725
726 // Check for cross-reference
727 if( start > 1 && scintilla->GetCharAt( start - 1 ) == ':' )
728 {
729 int refStart = scintilla->WordStartPosition( start - 1, true );
730
731 if( textVarRef( refStart ) )
732 {
733 partial = scintilla->GetRange( start, pos );
734
735 wxString ref = scintilla->GetRange( refStart, start - 1 );
736
737 if( ref == wxS( "OP" ) )
738 {
739 // SPICE operating points use ':' syntax for ports
740 if( SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( parent ) )
741 {
742 NULL_REPORTER devnull;
743 SCH_SHEET_PATH& sheet = schematic->CurrentSheet();
744 SIM_LIB_MGR mgr( &schematic->Project() );
745
746 std::vector<EMBEDDED_FILES*> embeddedFilesStack;
747 embeddedFilesStack.push_back( schematic->GetEmbeddedFiles() );
748
749 if( EMBEDDED_FILES* symbolEmbeddedFiles = symbol->GetEmbeddedFiles() )
750 embeddedFilesStack.push_back( symbolEmbeddedFiles );
751
752 mgr.SetFilesStack( std::move( embeddedFilesStack ) );
753
754 SIM_MODEL& model = mgr.CreateModel( &sheet, *symbol, true, 0, devnull ).model;
755
756 for( wxString pin : model.GetPinNames() )
757 {
758 if( pin.StartsWith( '<' ) && pin.EndsWith( '>' ) )
759 autocompleteTokens.push_back( pin.Mid( 1, pin.Length() - 2 ) );
760 else
761 autocompleteTokens.push_back( pin );
762 }
763
764 // add the synthetic port for power measurements
765 autocompleteTokens.push_back( wxT( "power" ) );
766 }
767 }
768 else
769 {
771 SCH_SYMBOL* refSymbol = nullptr;
772
773 schematic->Hierarchy().GetSymbols( refs );
774
775 for( size_t jj = 0; jj < refs.GetCount(); jj++ )
776 {
777 if( refs[ jj ].GetSymbol()->GetRef( &refs[ jj ].GetSheetPath(), true ) == ref )
778 {
779 refSymbol = refs[ jj ].GetSymbol();
780 break;
781 }
782 }
783
784 if( refSymbol )
785 refSymbol->GetContextualTextVars( &autocompleteTokens );
786 }
787 }
788 }
789 else if( textVarRef( start ) )
790 {
791 partial = scintilla->GetTextRange( start, pos );
792
793 SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( parent );
794 SCH_SHEET* sheet = dynamic_cast<SCH_SHEET*>( parent );
795 SCH_LABEL_BASE* label = dynamic_cast<SCH_LABEL_BASE*>( parent );
796
797 if( symbol )
798 {
799 symbol->GetContextualTextVars( &autocompleteTokens );
800
801 if( schematic->CurrentSheet().Last() )
802 schematic->CurrentSheet().Last()->GetContextualTextVars( &autocompleteTokens );
803 }
804
805 if( sheet )
806 sheet->GetContextualTextVars( &autocompleteTokens );
807
808 if( label )
809 label->GetContextualTextVars( &autocompleteTokens );
810
811 for( std::pair<wxString, wxString> entry : schematic->Project().GetTextVars() )
812 autocompleteTokens.push_back( entry.first );
813 }
814
815 aScintillaTricks->DoAutocomplete( partial, autocompleteTokens );
816 scintilla->SetFocus();
817}
818
819
821{
822 // See comments in SCH_FIELD::Replace(), below.
824 return false;
825
826 return true;
827}
828
829
830bool SCH_FIELD::Replace( const EDA_SEARCH_DATA& aSearchData, void* aAuxData )
831{
832 bool replaceReferences = false;
833
834 try
835 {
836 const SCH_SEARCH_DATA& schSearchData = dynamic_cast<const SCH_SEARCH_DATA&>( aSearchData );
837 replaceReferences = schSearchData.replaceReferences;
838 }
839 catch( const std::bad_cast& )
840 {
841 }
842
843 wxString text;
844 bool isReplaced = false;
845
846 if( m_id == FIELD_T::REFERENCE && m_parent && m_parent->Type() == SCH_SYMBOL_T )
847 {
848 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
849
850 if( !replaceReferences )
851 return false;
852
853 wxCHECK_MSG( aAuxData, false, wxT( "Need sheetpath to replace in refdes." ) );
854
855 text = parentSymbol->GetRef( (SCH_SHEET_PATH*) aAuxData );
856 isReplaced = EDA_ITEM::Replace( aSearchData, text );
857
858 if( isReplaced )
859 parentSymbol->SetRef( (SCH_SHEET_PATH*) aAuxData, text );
860 }
861 else
862 {
863 isReplaced = EDA_TEXT::Replace( aSearchData );
864
865 if( m_id == FIELD_T::SHEET_FILENAME && isReplaced )
866 {
867 // If we allowed this we'd have a bunch of work to do here, including warning
868 // about it not being undoable, checking for recursive hierarchies, reloading
869 // sheets, etc. See DIALOG_SHEET_PROPERTIES::TransferDataFromWindow().
870 }
871 }
872
873 return isReplaced;
874}
875
876
877void SCH_FIELD::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
878{
880
881 if( GetTextAngle().IsVertical() )
882 {
883 switch( horizJustify )
884 {
886 if( aRotateCCW )
888
889 break;
890
892 if( aRotateCCW )
894
895 break;
896
899 break;
900 }
901
903 }
904 else if( GetTextAngle().IsHorizontal() )
905 {
906 switch( horizJustify )
907 {
909 if( !aRotateCCW )
911
912 break;
913
915 if( !aRotateCCW )
917
918 break;
919
922 break;
923 }
924
926 }
927 else
928 {
929 wxFAIL_MSG( wxString::Format( wxT( "SCH_FIELD text angle is not horizontal or vertical: %f" ),
930 GetTextAngle().AsDegrees() ) );
931 }
932
933 VECTOR2I pt = GetPosition();
934 RotatePoint( pt, aCenter, aRotateCCW ? ANGLE_90 : ANGLE_270 );
935 SetPosition( pt );
936}
937
938
940{
941 int x = GetTextPos().x;
942
943 x -= aCenter;
944 x *= -1;
945 x += aCenter;
946
947 SetTextX( x );
948}
949
950
952{
953 int y = GetTextPos().y;
954
955 y -= aCenter;
956 y *= -1;
957 y += aCenter;
958
959 SetTextY( y );
960}
961
962
963void SCH_FIELD::BeginEdit( const VECTOR2I& aPosition )
964{
965 SetTextPos( aPosition );
966}
967
968
969void SCH_FIELD::CalcEdit( const VECTOR2I& aPosition )
970{
971 SetTextPos( aPosition );
972}
973
974
975wxString SCH_FIELD::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
976{
977 wxString content = aFull ? GetShownText( false ) : KIUI::EllipsizeMenuText( GetText() );
978
979 if( content.IsEmpty() )
980 {
981 return wxString::Format( _( "Field %s (empty)" ),
982 UnescapeString( GetName() ) );
983 }
984 else
985 {
986 return wxString::Format( _( "Field %s '%s'" ),
988 content );
989 }
990}
991
992
993void SCH_FIELD::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
994{
995 wxString msg;
996
997 aList.emplace_back( _( "Symbol Field" ), UnescapeString( GetName() ) );
998
999 // Don't use GetShownText() here; we want to show the user the variable references
1000 aList.emplace_back( _( "Text" ), KIUI::EllipsizeStatusText( aFrame, GetText() ) );
1001
1002 aList.emplace_back( _( "Visible" ), IsVisible() ? _( "Yes" ) : _( "No" ) );
1003
1004 aList.emplace_back( _( "Font" ), GetFont() ? GetFont()->GetName() : _( "Default" ) );
1005
1006 aList.emplace_back( _( "Style" ), GetTextStyleName() );
1007
1008 aList.emplace_back( _( "Text Size" ), aFrame->MessageTextFromValue( GetTextWidth() ) );
1009
1010 switch ( GetHorizJustify() )
1011 {
1012 case GR_TEXT_H_ALIGN_LEFT: msg = _( "Left" ); break;
1013 case GR_TEXT_H_ALIGN_CENTER: msg = _( "Center" ); break;
1014 case GR_TEXT_H_ALIGN_RIGHT: msg = _( "Right" ); break;
1016 }
1017
1018 aList.emplace_back( _( "H Justification" ), msg );
1019
1020 switch ( GetVertJustify() )
1021 {
1022 case GR_TEXT_V_ALIGN_TOP: msg = _( "Top" ); break;
1023 case GR_TEXT_V_ALIGN_CENTER: msg = _( "Center" ); break;
1024 case GR_TEXT_V_ALIGN_BOTTOM: msg = _( "Bottom" ); break;
1026 }
1027
1028 aList.emplace_back( _( "V Justification" ), msg );
1029}
1030
1031
1033{
1035 return true;
1036
1038 return true;
1039
1040 return IsURL( GetShownText( false ) );
1041}
1042
1043
1045{
1046 constexpr int START_ID = 1;
1047
1048 if( IsHypertext() )
1049 {
1050 wxString href;
1051
1053 {
1054 SCH_LABEL_BASE* label = static_cast<SCH_LABEL_BASE*>( m_parent );
1055 SCH_SHEET_PATH* sheet = &label->Schematic()->CurrentSheet();
1056 wxMenu menu;
1057
1058 std::vector<std::pair<wxString, wxString>> pages;
1059
1060 label->GetIntersheetRefs( sheet, &pages );
1061
1062 for( int i = 0; i < (int) pages.size(); ++i )
1063 {
1064 menu.Append( i + START_ID, wxString::Format( _( "Go to Page %s (%s)" ),
1065 pages[i].first,
1066 pages[i].second ) );
1067 }
1068
1069 menu.AppendSeparator();
1070 menu.Append( 999 + START_ID, _( "Back to Previous Selected Sheet" ) );
1071
1072 int sel = aFrame->GetPopupMenuSelectionFromUser( menu ) - START_ID;
1073
1074 if( sel >= 0 && sel < (int) pages.size() )
1075 href = wxT( "#" ) + pages[ sel ].first;
1076 else if( sel == 999 )
1078 }
1079 else if( IsURL( GetShownText( false ) ) || m_name == SIM_LIBRARY::LIBRARY_FIELD )
1080 {
1081 href = GetShownText( false );
1082 }
1083
1084 if( !href.IsEmpty() )
1085 {
1087 navTool->HypertextCommand( href );
1088 }
1089 }
1090}
1091
1092
1093void SCH_FIELD::SetName( const wxString& aName )
1094{
1095 m_name = aName;
1097
1098 if( m_isGeneratedField )
1099 EDA_TEXT::SetText( aName );
1100}
1101
1102
1103void SCH_FIELD::SetText( const wxString& aText )
1104{
1105 // Don't allow modification of text value of generated fields.
1106 if( m_isGeneratedField )
1107 return;
1108
1109 // Mandatory fields should not have leading or trailing whitespace.
1110 if( IsMandatory() )
1111 EDA_TEXT::SetText( aText.Strip( wxString::both ) );
1112 else
1113 EDA_TEXT::SetText( aText );
1114}
1115
1116
1117wxString SCH_FIELD::GetName( bool aUseDefaultName ) const
1118{
1119 if( m_parent && m_parent->IsType( labelTypes ) )
1120 return SCH_LABEL_BASE::GetDefaultFieldName( m_name, aUseDefaultName );
1121
1122 if( IsMandatory() )
1123 return GetCanonicalFieldName( m_id );
1124 else if( m_name.IsEmpty() && aUseDefaultName )
1126 else
1127 return m_name;
1128}
1129
1130
1132{
1133 if( m_parent && m_parent->IsType( labelTypes ) )
1134 {
1135 // These should be stored in canonical format, but just in case:
1136 if( m_name == _( "Net Class" ) || m_name == wxT( "Net Class" ) )
1137 return wxT( "Netclass" );
1138 }
1139
1140 if( IsMandatory() )
1141 return GetCanonicalFieldName( m_id );
1142
1143 return m_name;
1144}
1145
1146
1148{
1149 if( m_parent && ( m_parent->Type() == SCH_SYMBOL_T || m_parent->Type() == LIB_SYMBOL_T ) )
1150 {
1151 switch( m_id )
1152 {
1156 default: return BITMAPS::text;
1157 }
1158 }
1159
1160 return BITMAPS::text;
1161}
1162
1163
1164bool SCH_FIELD::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
1165{
1166 if( GetShownText( true ).IsEmpty() )
1167 return false;
1168
1169 BOX2I rect = GetBoundingBox();
1170
1171 // Text in symbol editor can have additional chars (ie: reference designators U? or U?A)
1172 if( m_parent && m_parent->Type() == LIB_SYMBOL_T )
1173 {
1174 SCH_FIELD temp( *this );
1175 temp.SetText( GetFullText() );
1176 rect = temp.GetBoundingBox();
1177 }
1178
1179 rect.Inflate( aAccuracy );
1180
1181 if( m_parent && m_parent->Type() == SCH_GLOBAL_LABEL_T )
1182 {
1183 SCH_GLOBALLABEL* label = static_cast<SCH_GLOBALLABEL*>( GetParent() );
1184 rect.Offset( label->GetSchematicTextOffset( nullptr ) );
1185 }
1186
1187 return rect.Contains( aPosition );
1188}
1189
1190
1191bool SCH_FIELD::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
1192{
1193 if( GetShownText( true ).IsEmpty() )
1194 return false;
1195
1197 return false;
1198
1199 BOX2I rect = aRect;
1200
1201 rect.Inflate( aAccuracy );
1202
1203 if( GetParent() && GetParent()->Type() == SCH_GLOBAL_LABEL_T )
1204 {
1205 SCH_GLOBALLABEL* label = static_cast<SCH_GLOBALLABEL*>( GetParent() );
1206 rect.Offset( label->GetSchematicTextOffset( nullptr ) );
1207 }
1208
1209 if( aContained )
1210 return rect.Contains( GetBoundingBox() );
1211
1212 return rect.Intersects( GetBoundingBox() );
1213}
1214
1215
1216bool SCH_FIELD::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
1217{
1218 if( GetShownText( true ).IsEmpty() )
1219 return false;
1220
1222 return false;
1223
1224 BOX2I bbox = GetBoundingBox();
1225
1226 if( GetParent() && GetParent()->Type() == SCH_GLOBAL_LABEL_T )
1227 {
1228 SCH_GLOBALLABEL* label = static_cast<SCH_GLOBALLABEL*>( GetParent() );
1229 bbox.Offset( label->GetSchematicTextOffset( nullptr ) );
1230 }
1231
1232 return KIGEOM::BoxHitTest( aPoly, bbox, aContained );
1233}
1234
1235
1236void SCH_FIELD::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts,
1237 int aUnit, int aBodyStyle, const VECTOR2I& aOffset, bool aDimmed )
1238{
1239 wxString text;
1240
1241 if( Schematic() )
1242 text = GetShownText( &Schematic()->CurrentSheet(), true );
1243 else
1244 text = GetShownText( true );
1245
1246 if( ( !IsVisible() && !IsForceVisible() ) || text.IsEmpty() || aBackground )
1247 return;
1248
1249 SCH_RENDER_SETTINGS* renderSettings = getRenderSettings( aPlotter );
1250 COLOR4D color = renderSettings->GetLayerColor( GetLayer() );
1251 int penWidth = GetEffectiveTextPenWidth( renderSettings->GetDefaultPenWidth() );
1252
1253 COLOR4D bg = renderSettings->GetBackgroundColor();;
1254
1255 if( bg == COLOR4D::UNSPECIFIED || !aPlotter->GetColorMode() )
1256 bg = COLOR4D::WHITE;
1257
1258 if( aPlotter->GetColorMode() && GetTextColor() != COLOR4D::UNSPECIFIED )
1259 color = GetTextColor();
1260
1261 if( aDimmed )
1262 {
1263 color.Desaturate( );
1264 color = color.Mix( bg, 0.5f );
1265 }
1266
1267 penWidth = std::max( penWidth, renderSettings->GetMinPenWidth() );
1268
1269 // clamp the pen width to be sure the text is readable
1270 penWidth = std::min( penWidth, std::min( GetTextSize().x, GetTextSize().y ) / 4 );
1271
1272 if( !IsVisible() && !renderSettings->m_ShowHiddenFields )
1273 return;
1274
1275 // Calculate the text orientation, according to the symbol orientation/mirror
1276 EDA_ANGLE orient = GetTextAngle();
1277 VECTOR2I textpos = GetTextPos();
1279 GR_TEXT_V_ALIGN_T vjustify = GetVertJustify();
1280
1281 if( renderSettings->m_Transform.y1 ) // Rotate symbol 90 deg.
1282 {
1283 if( orient.IsHorizontal() )
1284 orient = ANGLE_VERTICAL;
1285 else
1286 orient = ANGLE_HORIZONTAL;
1287 }
1288
1289 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
1290 {
1291 /*
1292 * Calculate the text justification, according to the symbol orientation/mirror. This is
1293 * a bit complicated due to cumulative calculations:
1294 * - numerous cases (mirrored or not, rotation)
1295 * - the plotter's Text() function will also recalculate H and V justifications according
1296 * to the text orientation
1297 * - when a symbol is mirrored the text is not, and justifications become a nightmare
1298 *
1299 * So the easier way is to use no justifications (centered text) and use GetBoundingBox
1300 * to know the text coordinate considered as centered.
1301 */
1302 hjustify = GR_TEXT_H_ALIGN_CENTER;
1303 vjustify = GR_TEXT_V_ALIGN_CENTER;
1304 textpos = GetBoundingBox().Centre();
1305 }
1306 else if( m_parent && m_parent->Type() == SCH_GLOBAL_LABEL_T )
1307 {
1308 SCH_GLOBALLABEL* label = static_cast<SCH_GLOBALLABEL*>( m_parent );
1309 textpos += label->GetSchematicTextOffset( renderSettings );
1310 }
1311 else if( m_parent && m_parent->Type() == SCH_DIRECTIVE_LABEL_T )
1312 {
1313 SCH_DIRECTIVE_LABEL* label = static_cast<SCH_DIRECTIVE_LABEL*>( m_parent );
1314 std::shared_ptr<NETCLASS> nc = label->GetEffectiveNetClass();
1315
1316 if( nc && ( nc->GetSchematicColor() != COLOR4D::UNSPECIFIED ) && aPlotter->GetColorMode() )
1317 color = nc->GetSchematicColor();
1318 }
1319
1320 KIFONT::FONT* font = GetDrawFont( renderSettings );
1322 attrs.m_StrokeWidth = penWidth;
1323 attrs.m_Halign = hjustify;
1324 attrs.m_Valign = vjustify;
1325 attrs.m_Angle = orient;
1326 attrs.m_Multiline = false;
1327
1328 aPlotter->PlotText( textpos, color, text, attrs, font, GetFontMetrics() );
1329
1331 {
1332 if( SCH_LABEL_BASE* label = dynamic_cast<SCH_LABEL_BASE*>( m_parent ) )
1333 {
1334 std::vector<std::pair<wxString, wxString>> pages;
1335 std::vector<wxString> pageHrefs;
1336
1337 label->GetIntersheetRefs( &Schematic()->CurrentSheet(), &pages );
1338
1339 for( const auto& [ pageNumber, sheetName ] : pages )
1340 pageHrefs.push_back( wxT( "#" ) + pageNumber );
1341
1342 BOX2I bbox = GetBoundingBox();
1343 bbox.Offset( label->GetSchematicTextOffset( renderSettings ) );
1344
1345 aPlotter->HyperlinkMenu( bbox, pageHrefs );
1346 }
1347 }
1348}
1349
1350
1351void SCH_FIELD::SetPosition( const VECTOR2I& aPosition )
1352{
1353 // Actual positions are calculated by the rotation/mirror transform of the parent symbol
1354 // of the field. The inverse transform is used to calculate the position relative to the
1355 // parent symbol.
1356 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
1357 {
1358 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
1359 VECTOR2I relPos = aPosition - parentSymbol->GetPosition();
1360
1361 relPos = parentSymbol->GetTransform().InverseTransform().TransformCoordinate( relPos );
1362
1363 SetTextPos( relPos + parentSymbol->GetPosition() );
1364 return;
1365 }
1366
1367 SetTextPos( aPosition );
1368}
1369
1370
1372{
1373 if( m_parent && m_parent->Type() == SCH_SYMBOL_T )
1374 {
1375 SCH_SYMBOL* parentSymbol = static_cast<SCH_SYMBOL*>( m_parent );
1376 VECTOR2I relativePos = GetTextPos() - parentSymbol->GetPosition();
1377
1378 relativePos = parentSymbol->GetTransform().TransformCoordinate( relativePos );
1379
1380 return relativePos + parentSymbol->GetPosition();
1381 }
1382
1383 return GetTextPos();
1384}
1385
1386
1388{
1389 return m_parent ? m_parent->GetPosition() : VECTOR2I( 0, 0 );
1390}
1391
1392
1404
1405
1406bool SCH_FIELD::operator<( const SCH_ITEM& aItem ) const
1407{
1408 if( Type() != aItem.Type() )
1409 return Type() < aItem.Type();
1410
1411 auto field = static_cast<const SCH_FIELD*>( &aItem );
1412
1413 if( GetId() != field->GetId() )
1414 return GetId() < field->GetId();
1415
1416 if( GetText() != field->GetText() )
1417 return GetText() < field->GetText();
1418
1419 if( GetLibPosition().x != field->GetLibPosition().x )
1420 return GetLibPosition().x < field->GetLibPosition().x;
1421
1422 if( GetLibPosition().y != field->GetLibPosition().y )
1423 return GetLibPosition().y < field->GetLibPosition().y;
1424
1425 return GetName() < field->GetName();
1426}
1427
1428
1429bool SCH_FIELD::operator==(const SCH_ITEM& aOther) const
1430{
1431 if( Type() != aOther.Type() )
1432 return false;
1433
1434 const SCH_FIELD& field = static_cast<const SCH_FIELD&>( aOther );
1435
1436 return *this == field;
1437}
1438
1439
1440bool SCH_FIELD::operator==( const SCH_FIELD& aOther ) const
1441{
1442 // Identical fields of different symbols are not equal.
1443 if( !GetParentSymbol() || !aOther.GetParentSymbol()
1444 || GetParentSymbol()->m_Uuid != aOther.GetParentSymbol()->m_Uuid )
1445 {
1446 return false;
1447 }
1448
1449 if( IsMandatory() != aOther.IsMandatory() )
1450 return false;
1451
1452 if( IsMandatory() )
1453 {
1454 if( GetId() != aOther.GetId() )
1455 return false;
1456 }
1457 else
1458 {
1459 if( GetOrdinal() != aOther.GetOrdinal() )
1460 return false;
1461 }
1462
1463 if( GetPosition() != aOther.GetPosition() )
1464 return false;
1465
1466 if( IsGeneratedField() != aOther.IsGeneratedField() )
1467 return false;
1468
1469 if( IsNameShown() != aOther.IsNameShown() )
1470 return false;
1471
1472 if( CanAutoplace() != aOther.CanAutoplace() )
1473 return false;
1474
1475 return EDA_TEXT::operator==( aOther );
1476}
1477
1478
1479double SCH_FIELD::Similarity( const SCH_ITEM& aOther ) const
1480{
1481 if( Type() != aOther.Type() )
1482 return 0.0;
1483
1484 if( m_Uuid == aOther.m_Uuid )
1485 return 1.0;
1486
1487 const SCH_FIELD& field = static_cast<const SCH_FIELD&>( aOther );
1488
1489 double similarity = 0.99; // The UUIDs are different, so we start with non-identity
1490
1491 if( GetId() != field.GetId() )
1492 {
1493 // We don't allow swapping of mandatory fields, so these cannot be the same item
1494 if( IsMandatory() || field.IsMandatory() )
1495 return 0.0;
1496 else
1497 similarity *= 0.5;
1498 }
1499
1500 similarity *= SimilarityBase( aOther );
1501
1502 similarity *= EDA_TEXT::Similarity( field );
1503
1504 if( GetPosition() != field.GetPosition() )
1505 similarity *= 0.5;
1506
1507 if( IsGeneratedField() != field.IsGeneratedField() )
1508 similarity *= 0.5;
1509
1510 if( IsNameShown() != field.IsNameShown() )
1511 similarity *= 0.5;
1512
1513 if( CanAutoplace() != field.CanAutoplace() )
1514 similarity *= 0.5;
1515
1516 return similarity;
1517}
1518
1519
1520int SCH_FIELD::compare( const SCH_ITEM& aOther, int aCompareFlags ) const
1521{
1522 wxASSERT( aOther.Type() == SCH_FIELD_T );
1523
1524 int compareFlags = aCompareFlags;
1525
1526 // For ERC tests, the field position has no matter, so do not test it
1527 if( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::ERC )
1529
1530 int retv = SCH_ITEM::compare( aOther, compareFlags );
1531
1532 if( retv )
1533 return retv;
1534
1535 const SCH_FIELD* tmp = static_cast<const SCH_FIELD*>( &aOther );
1536
1537 // Equality test will vary depending whether or not the field is mandatory. Otherwise,
1538 // sorting is done by ordinal.
1539 if( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::EQUALITY )
1540 {
1541 // Mandatory fields have fixed ordinals and their names can vary due to translated field
1542 // names. Optional fields have fixed names and their ordinals can vary.
1543 if( IsMandatory() )
1544 {
1545 if( m_id != tmp->m_id )
1546 return (int) m_id - (int) tmp->m_id;
1547 }
1548 else
1549 {
1550 retv = m_name.Cmp( tmp->m_name );
1551
1552 if( retv )
1553 return retv;
1554 }
1555 }
1556 else // assume we're sorting
1557 {
1558 if( m_id != tmp->m_id )
1559 return (int) m_id - (int) tmp->m_id;
1560 }
1561
1562 bool ignoreFieldText = false;
1563
1564 if( m_id == FIELD_T::REFERENCE && !( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::EQUALITY ) )
1565 ignoreFieldText = true;
1566
1567 if( m_id == FIELD_T::VALUE && ( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::ERC ) )
1568 ignoreFieldText = true;
1569
1570 if( !ignoreFieldText )
1571 {
1572 retv = GetText().CmpNoCase( tmp->GetText() );
1573
1574 if( retv != 0 )
1575 return retv;
1576 }
1577
1578 if( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::EQUALITY )
1579 {
1580 if( GetTextPos().x != tmp->GetTextPos().x )
1581 return GetTextPos().x - tmp->GetTextPos().x;
1582
1583 if( GetTextPos().y != tmp->GetTextPos().y )
1584 return GetTextPos().y - tmp->GetTextPos().y;
1585 }
1586
1587 // For ERC tests, the field size has no matter, so do not test it
1588 if( !( aCompareFlags & SCH_ITEM::COMPARE_FLAGS::ERC ) )
1589 {
1590 if( GetTextWidth() != tmp->GetTextWidth() )
1591 return GetTextWidth() - tmp->GetTextWidth();
1592
1593 if( GetTextHeight() != tmp->GetTextHeight() )
1594 return GetTextHeight() - tmp->GetTextHeight();
1595 }
1596
1597 return 0;
1598}
1599
1600
1601static struct SCH_FIELD_DESC
1602{
1604 {
1605 // These are defined in EDA_TEXT as well but initialization order is
1606 // not defined, so this needs to be conditional. Defining in both
1607 // places leads to duplicate symbols.
1609
1610 if( h_inst.Choices().GetCount() == 0)
1611 {
1612 h_inst.Map( GR_TEXT_H_ALIGN_LEFT, _( "Left" ) );
1613 h_inst.Map( GR_TEXT_H_ALIGN_CENTER, _( "Center" ) );
1614 h_inst.Map( GR_TEXT_H_ALIGN_RIGHT, _( "Right" ) );
1615 }
1616
1618
1619 if( v_inst.Choices().GetCount() == 0)
1620 {
1621 v_inst.Map( GR_TEXT_V_ALIGN_TOP, _( "Top" ) );
1622 v_inst.Map( GR_TEXT_V_ALIGN_CENTER, _( "Center" ) );
1623 v_inst.Map( GR_TEXT_V_ALIGN_BOTTOM, _( "Bottom" ) );
1624 }
1625
1632
1633 const wxString textProps = _HKI( "Text Properties" );
1634
1636 _HKI( "Horizontal Justification" ), &SCH_FIELD::SetEffectiveHorizJustify,
1638
1639 propMgr.ReplaceProperty( TYPE_HASH( EDA_TEXT ), _HKI( "Horizontal Justification" ), horiz,
1640 textProps );
1641
1643 _HKI( "Vertical Justification" ), &SCH_FIELD::SetEffectiveVertJustify,
1645
1646 propMgr.ReplaceProperty( TYPE_HASH( EDA_TEXT ), _HKI( "Vertical Justification" ), vert,
1647 textProps );
1648
1649 propMgr.AddProperty( new PROPERTY<SCH_FIELD, bool>( _HKI( "Show Field Name" ),
1651
1652 propMgr.AddProperty( new PROPERTY<SCH_FIELD, bool>( _HKI( "Allow Autoplacement" ),
1654
1655 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Hyperlink" ) );
1656 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Thickness" ) );
1657 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Mirrored" ) );
1658 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Width" ) );
1659 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Height" ) );
1660
1661
1662 propMgr.AddProperty( new PROPERTY<SCH_FIELD, int>( _HKI( "Text Size" ),
1664 _HKI( "Text Properties" ) );
1665
1666 propMgr.Mask( TYPE_HASH( SCH_FIELD ), TYPE_HASH( EDA_TEXT ), _HKI( "Orientation" ) );
1667
1668 auto isNotGeneratedField =
1669 []( INSPECTABLE* aItem ) -> bool
1670 {
1671 if( SCH_FIELD* field = dynamic_cast<SCH_FIELD*>( aItem ) )
1672 return !field->IsGeneratedField();
1673
1674 return true;
1675 };
1676
1678 isNotGeneratedField );
1679
1680
1681 auto isNonMandatoryField =
1682 []( INSPECTABLE* aItem ) -> bool
1683 {
1684 if( SCH_FIELD* field = dynamic_cast<SCH_FIELD*>( aItem ) )
1685 return !field->IsMandatory();
1686
1687 return false;
1688 };
1689
1691 _HKI( "Private" ), isNonMandatoryField );
1692 }
1694
1695
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:79
int GetTextHeight() const
Definition eda_text.h:266
const VECTOR2I & GetTextPos() const
Definition eda_text.h:272
COLOR4D GetTextColor() const
Definition eda_text.h:269
wxString GetTextStyleName() const
Definition eda_text.cpp:975
bool IsItalic() const
Definition eda_text.h:168
const EDA_ANGLE & GetTextAngle() const
Definition eda_text.h:146
void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
Definition eda_text.cpp:534
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition eda_text.h:97
virtual bool IsVisible() const
Definition eda_text.h:186
void SetTextPos(const VECTOR2I &aPoint)
Definition eda_text.cpp:579
void SetTextX(int aX)
Definition eda_text.cpp:585
KIFONT::FONT * GetFont() const
Definition eda_text.h:246
void SetAttributes(const EDA_TEXT &aSrc, bool aSetPosition=true)
Set the text attributes from another instance.
Definition eda_text.cpp:434
void SetTextY(int aY)
Definition eda_text.cpp:591
EDA_TEXT & operator=(const EDA_TEXT &aItem)
Definition eda_text.cpp:155
int GetTextWidth() const
Definition eda_text.h:263
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:744
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
Definition eda_text.cpp:418
GR_TEXT_H_ALIGN_T GetHorizJustify() const
Definition eda_text.h:199
bool Replace(const EDA_SEARCH_DATA &aSearchData)
Helper function used in search and replace dialog.
Definition eda_text.cpp:487
bool HasTextVars() const
Indicates the ShownText has text var references which need to be processed.
Definition eda_text.h:116
virtual void SetVisible(bool aVisible)
Definition eda_text.cpp:387
EDA_TEXT(const EDA_IU_SCALE &aIuScale, const wxString &aText=wxEmptyString)
Definition eda_text.cpp:96
virtual void ClearBoundingBoxCache()
Definition eda_text.cpp:678
double Similarity(const EDA_TEXT &aOther) const
wxString EvaluateText(const wxString &aText) const
Definition eda_text.cpp:642
virtual void ClearRenderCache()
Definition eda_text.cpp:672
const TEXT_ATTRIBUTES & GetAttributes() const
Definition eda_text.h:230
int GetEffectiveTextPenWidth(int aDefaultPenWidth=0) const
The EffectiveTextPenWidth uses the text thickness if > 1 or aDefaultPenWidth.
Definition eda_text.cpp:466
void SwapAttributes(EDA_TEXT &aTradingPartner)
Swap the text attributes of the two involved instances.
Definition eda_text.cpp:453
bool IsBold() const
Definition eda_text.h:183
GR_TEXT_V_ALIGN_T GetVertJustify() const
Definition eda_text.h:202
virtual wxString GetShownText(bool aAllowExtraText, int aDepth=0) const
Return the string actually shown after processing of the base text.
Definition eda_text.h:108
virtual void SetText(const wxString &aText)
Definition eda_text.cpp:271
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
Definition eda_text.cpp:300
void SwapText(EDA_TEXT &aTradingPartner)
Definition eda_text.cpp:446
bool operator==(const EDA_TEXT &aRhs) const
Definition eda_text.h:395
VECTOR2I GetTextSize() const
Definition eda_text.h:260
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
Definition eda_text.cpp:410
static ENUM_MAP< T > & Instance()
Definition property.h:699
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:345
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:343
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:163
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:333
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:202
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:338
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:211
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:214
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:335
int m_ordinal
Sort order for non-mandatory fields.
Definition sch_field.h:330
COLOR4D GetFieldColor() 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:329
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:260
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:155
bool m_renderCacheValid
Definition sch_field.h:341
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:164
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:342
bool CanAutoplace() const
Definition sch_field.h:213
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:339
void OnScintillaCharAdded(SCINTILLA_TRICKS *aScintillaTricks, wxStyledTextEvent &aEvent) const
wxString m_name
Definition sch_field.h:331
void SetNameShown(bool aShown=true)
Definition sch_field.h:203
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:334
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:688
const SYMBOL * GetParentSymbol() const
Definition sch_item.cpp:223
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:217
friend class LIB_SYMBOL
Definition sch_item.h:759
@ SKIP_TST_POS
Definition sch_item.h:671
std::shared_ptr< NETCLASS > GetEffectiveNetClass(const SCH_SHEET_PATH *aSheet=nullptr) const
Definition sch_item.cpp:352
void SetLayer(SCH_LAYER_ID aLayer)
Definition sch_item.h:310
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition sch_item.h:309
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:541
const wxString & GetDefaultFont(const RENDER_SETTINGS *aSettings) const
Definition sch_item.cpp:580
bool IsConnectivityDirty() const
Definition sch_item.h:554
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:742
const KIFONT::METRICS & GetFontMetrics() const
Definition sch_item.cpp:593
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:346
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:760
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:202
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:448
@ LAYER_SHEETNAME
Definition layer_ids.h:471
@ LAYER_VALUEPART
Definition layer_ids.h:460
@ LAYER_FIELDS
Definition layer_ids.h:461
@ LAYER_SHEETFIELDS
Definition layer_ids.h:473
@ LAYER_REFERENCEPART
Definition layer_ids.h:459
@ LAYER_NETCLASS_REFS
Definition layer_ids.h:463
@ LAYER_SELECTION_SHADOWS
Definition layer_ids.h:493
@ LAYER_INTERSHEET_REFS
Definition layer_ids.h:462
@ LAYER_SHEETFILENAME
Definition layer_ids.h:472
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:73
#define DECLARE_ENUM_TO_WXANY(type)
Definition property.h:765
@ PT_SIZE
Size expressed in distance units (mm/inch)
Definition property.h:62
#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:150
@ SCH_SYMBOL_T
Definition typeinfo.h:174
@ SCH_FIELD_T
Definition typeinfo.h:152
@ SCH_DIRECTIVE_LABEL_T
Definition typeinfo.h:173
@ SCH_LABEL_T
Definition typeinfo.h:169
@ SCH_SHEET_T
Definition typeinfo.h:177
@ SCH_LABEL_LOCATE_ANY_T
Definition typeinfo.h:193
@ SCH_GLOBAL_LABEL_T
Definition typeinfo.h:170
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