KiCad PCB EDA Suite
pcbnew/dialogs/dialog_text_properties.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) 2004-2018 Jean-Pierre Charras jp.charras at wanadoo.fr
5 * Copyright (C) 2010-2022 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
26#include <widgets/font_choice.h>
28#include <confirm.h>
29#include <widgets/unit_binder.h>
30#include <board_commit.h>
31#include <board.h>
32#include <footprint.h>
33#include <string_utils.h>
34#include <pcb_text.h>
35#include <fp_text.h>
36#include <pcbnew.h>
37#include <pcb_edit_frame.h>
39#include <wx/valnum.h>
40#include <math/util.h> // for KiROUND
41#include <scintilla_tricks.h>
42
43
46 m_frame( aParent ),
47 m_item( aItem ),
48 m_edaText( nullptr ),
49 m_fpText( nullptr ),
50 m_pcbText( nullptr ),
51 m_textWidth( aParent, m_SizeXLabel, m_SizeXCtrl, m_SizeXUnits ),
52 m_textHeight( aParent, m_SizeYLabel, m_SizeYCtrl, m_SizeYUnits ),
53 m_thickness( aParent, m_ThicknessLabel, m_ThicknessCtrl, m_ThicknessUnits ),
54 m_posX( aParent, m_PositionXLabel, m_PositionXCtrl, m_PositionXUnits ),
55 m_posY( aParent, m_PositionYLabel, m_PositionYCtrl, m_PositionYUnits ),
56 m_orientation( aParent, m_OrientLabel, m_OrientCtrl, nullptr )
57{
58 wxString title;
59
60 // Configure display origin transforms
63
64 m_MultiLineText->SetEOLMode( wxSTC_EOL_LF );
65
66 m_scintillaTricks = new SCINTILLA_TRICKS( m_MultiLineText, wxT( "{}" ), false,
67 [this]()
68 {
69 wxPostEvent( this, wxCommandEvent( wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK ) );
70 } );
71
72 // A hack which causes Scintilla to auto-size the text editor canvas
73 // See: https://github.com/jacobslusser/ScintillaNET/issues/216
74 m_MultiLineText->SetScrollWidth( 1 );
75 m_MultiLineText->SetScrollWidthTracking( true );
76
77 if( m_item->Type() == PCB_FP_TEXT_T )
78 {
80 m_edaText = static_cast<EDA_TEXT*>( m_fpText );
81
82 switch( m_fpText->GetType() )
83 {
84 case FP_TEXT::TEXT_is_REFERENCE: title = _( "Footprint Reference Properties" ); break;
85 case FP_TEXT::TEXT_is_VALUE: title = _( "Footprint Value Properties" ); break;
86 case FP_TEXT::TEXT_is_DIVERS: title = _( "Footprint Text Properties" ); break;
87 }
88
89 switch( m_fpText->GetType() )
90 {
91 case FP_TEXT::TEXT_is_REFERENCE: m_TextLabel->SetLabel( _( "Reference:" ) ); break;
92 case FP_TEXT::TEXT_is_VALUE: m_TextLabel->SetLabel( _( "Value:" ) ); break;
93 case FP_TEXT::TEXT_is_DIVERS: m_TextLabel->SetLabel( _( "Text:" ) ); break;
94 }
95
97 m_MultiLineSizer->Show( false );
98
99 // Do not allow locking items in the footprint editor
100 m_cbLocked->Show( false );
101 }
102 else
103 {
104 title = _( "Text Properties" );
105
106 m_pcbText = (PCB_TEXT*) aItem;
107 m_edaText = static_cast<EDA_TEXT*>( m_pcbText );
108
110 m_SingleLineSizer->Show( false );
111
112 // This option makes sense only for footprint texts; texts on board are always visible.
113 m_Visible->SetValue( true );
114 m_Visible->Show( false );
115
116 m_KeepUpright->Show( false );
117 m_statusLine->Show( false );
118 }
119
124
126
133
135
142
144
147
148 SetTitle( title );
149 m_hash_key = title;
150
151 // Configure the layers list selector. Note that footprints are built outside the current
152 // board and so we may need to show all layers if the text is on an unactivated layer.
153 if( !m_frame->GetBoard()->IsLayerEnabled( m_item->GetLayer() ) )
155
159
162
163 // Set predefined rotations in combo dropdown, according to the locale floating point
164 // separator notation
165 double rot_list[] = { 0.0, 90.0, -90.0, 180.0 };
166
167 for( size_t ii = 0; ii < m_OrientCtrl->GetCount() && ii < 4; ++ii )
168 m_OrientCtrl->SetString( ii, wxString::Format( wxT( "%.1f" ), rot_list[ii] ) );
169
170 // Set font sizes
171 m_statusLine->SetFont( KIUI::GetInfoFont( this ) );
172
174
175 // wxTextCtrls fail to generate wxEVT_CHAR events when the wxTE_MULTILINE flag is set,
176 // so we have to listen to wxEVT_CHAR_HOOK events instead.
177 Connect( wxEVT_CHAR_HOOK, wxKeyEventHandler( DIALOG_TEXT_PROPERTIES::OnCharHook ),
178 nullptr, this );
179
181}
182
183
185{
186 Disconnect( wxEVT_CHAR_HOOK, wxKeyEventHandler( DIALOG_TEXT_PROPERTIES::OnCharHook ),
187 nullptr, this );
188
189 delete m_scintillaTricks;
190}
191
192
194{
195 DIALOG_TEXT_PROPERTIES dlg( this, aText );
196 dlg.ShowQuasiModal();
197}
198
199
200void DIALOG_TEXT_PROPERTIES::OnSetFocusText( wxFocusEvent& event )
201{
202#ifdef __WXGTK__
203 // Force an update of the text control before setting the text selection
204 // This is needed because GTK seems to ignore the selection on first update
205 //
206 // Note that we can't do this on OSX as it tends to provoke Apple's
207 // "[NSAlert runModal] may not be invoked inside of transaction begin/commit pair"
208 // bug. See: https://bugs.launchpad.net/kicad/+bug/1837225
210 m_SingleLineText->Update();
211#endif
212
214 KIUI::SelectReferenceNumber( static_cast<wxTextEntry*>( m_SingleLineText ) );
215 else
216 m_SingleLineText->SetSelection( -1, -1 );
217
218 event.Skip();
219}
220
221
223{
224 if( m_SingleLineText->IsShown() )
225 {
226 m_SingleLineText->SetValue( m_edaText->GetText() );
227
229 KIUI::SelectReferenceNumber( static_cast<wxTextEntry*>( m_SingleLineText ) );
230 else
231 m_SingleLineText->SetSelection( -1, -1 );
232 }
233 else if( m_MultiLineText->IsShown() )
234 {
235 BOARD* board = m_frame->GetBoard();
236 wxString converted = board->ConvertKIIDsToCrossReferences(
238
239 m_MultiLineText->SetValue( converted );
240 m_MultiLineText->SetSelection( -1, -1 );
241 m_MultiLineText->EmptyUndoBuffer();
242 }
243
244 if( m_item->Type() == PCB_FP_TEXT_T && m_fpText )
245 {
246 FOOTPRINT* footprint = dynamic_cast<FOOTPRINT*>( m_fpText->GetParent() );
247 wxString msg;
248
249 if( footprint )
250 {
251 msg.Printf( _( "Footprint %s (%s), %s, rotated %.1f deg"),
252 footprint->GetReference(),
253 footprint->GetValue(),
254 footprint->IsFlipped() ? _( "back side (mirrored)" ) : _( "front side" ),
255 footprint->GetOrientation().AsDegrees() );
256 }
257
258 m_statusLine->SetLabel( msg );
259 }
260 else
261 {
262 m_statusLine->Show( false );
263 }
264
265 m_cbLocked->SetValue( m_item->IsLocked() );
266
268 m_cbKnockout->SetValue( m_item->IsKnockout() );
269
271
277
278 m_Visible->SetValue( m_edaText->IsVisible() );
279
280 if( m_fpText )
281 m_KeepUpright->SetValue( m_fpText->IsKeepUpright() );
282
285
286 switch ( m_edaText->GetHorizJustify() )
287 {
288 case GR_TEXT_H_ALIGN_LEFT: m_alignLeft->Check( true ); break;
289 case GR_TEXT_H_ALIGN_CENTER: m_alignCenter->Check( true ); break;
290 case GR_TEXT_H_ALIGN_RIGHT: m_alignRight->Check( true ); break;
291 }
292
293 switch ( m_edaText->GetVertJustify() )
294 {
295 case GR_TEXT_V_ALIGN_BOTTOM: m_valignBottom->Check( true ); break;
296 case GR_TEXT_V_ALIGN_CENTER: m_valignCenter->Check( true ); break;
297 case GR_TEXT_V_ALIGN_TOP: m_valignTop->Check( true ); break;
298 }
299
301
302 EDA_ANGLE orientation = m_edaText->GetTextAngle();
304
305 return DIALOG_TEXT_PROPERTIES_BASE::TransferDataToWindow();
306}
307
308
309void DIALOG_TEXT_PROPERTIES::onFontSelected( wxCommandEvent & aEvent )
310{
311 if( KIFONT::FONT::IsStroke( aEvent.GetString() ) )
312 {
313 m_thickness.Show( true );
314
315 int textSize = std::min( m_textWidth.GetValue(), m_textHeight.GetValue() );
316 int thickness = m_thickness.GetValue();
317
318 m_bold->Check( abs( thickness - GetPenSizeForBold( textSize ) )
319 < abs( thickness - GetPenSizeForNormal( textSize ) ) );
320 }
321 else
322 {
323 m_thickness.Show( false );
324 }
325}
326
327
328void DIALOG_TEXT_PROPERTIES::onBoldToggle( wxCommandEvent & aEvent )
329{
330 int textSize = std::min( m_textWidth.GetValue(), m_textHeight.GetValue() );
331
332 if( aEvent.IsChecked() )
334 else
336
337 aEvent.Skip();
338}
339
340
341void DIALOG_TEXT_PROPERTIES::onAlignButton( wxCommandEvent& aEvent )
342{
344 {
345 if( btn->IsChecked() && btn != aEvent.GetEventObject() )
346 btn->Check( false );
347 }
348}
349
350
351void DIALOG_TEXT_PROPERTIES::onValignButton( wxCommandEvent& aEvent )
352{
354 {
355 if( btn->IsChecked() && btn != aEvent.GetEventObject() )
356 btn->Check( false );
357 }
358}
359
360
361void DIALOG_TEXT_PROPERTIES::onThickness( wxCommandEvent& event )
362{
363 int textSize = std::min( m_textWidth.GetValue(), m_textHeight.GetValue() );
364 int thickness = m_thickness.GetValue();
365
366 m_bold->Check( abs( thickness - GetPenSizeForBold( textSize ) )
367 < abs( thickness - GetPenSizeForNormal( textSize ) ) );
368}
369
370
372{
373 if( !DIALOG_TEXT_PROPERTIES_BASE::TransferDataFromWindow() )
374 return false;
375
378 {
379 return false;
380 }
381
382 BOARD_COMMIT commit( m_frame );
383 commit.Modify( m_item );
384
385 // If no other command in progress, prepare undo command
386 // (for a command in progress, will be made later, at the completion of command)
387 bool pushCommit = ( m_item->GetEditFlags() == 0 );
388
389 // Set IN_EDIT flag to force undo/redo/abort proper operation and avoid new calls to
390 // SaveCopyInUndoList for the same text if is moved, and then rotated, edited, etc....
391 if( !pushCommit )
393
394 // Set the new text content
395 if( m_SingleLineText->IsShown() )
396 {
397 if( !m_SingleLineText->GetValue().IsEmpty() )
398 m_edaText->SetText( m_SingleLineText->GetValue() );
399 }
400 else if( m_MultiLineText->IsShown() )
401 {
402 if( !m_MultiLineText->GetValue().IsEmpty() )
403 {
404 BOARD* board = m_frame->GetBoard();
405 wxString txt = board->ConvertCrossReferencesToKIIDs( m_MultiLineText->GetValue() );
406
407#ifdef __WXMAC__
408 // On macOS CTRL+Enter produces '\r' instead of '\n' regardless of EOL setting.
409 // Replace it now.
410 txt.Replace( wxT( "\r" ), wxT( "\n" ) );
411#elif defined( __WINDOWS__ )
412 // On Windows, a new line is coded as \r\n. We use only \n in kicad files and in
413 // drawing routines so strip the \r char.
414 txt.Replace( wxT( "\r" ), wxT( "" ) );
415#endif
417 }
418 }
419
420 m_item->SetLocked( m_cbLocked->GetValue() );
421
423 m_item->SetIsKnockout( m_cbKnockout->GetValue() );
424
426 {
428 m_italic->IsChecked() ) );
429 }
430
434
435 if( m_fpText )
437
438 // Test for acceptable values for thickness and size and clamp if fails
440
441 if( m_edaText->GetTextThickness() > maxPenWidth )
442 {
443 DisplayError( this, _( "The text thickness is too large for the text size.\n"
444 "It will be clamped." ) );
445 m_edaText->SetTextThickness( maxPenWidth );
446 }
447
449
450 m_edaText->SetVisible( m_Visible->GetValue() );
451
452 if( m_fpText )
453 m_fpText->SetKeepUpright( m_KeepUpright->GetValue() );
454
457
458 if( m_alignLeft->IsChecked() )
460 else if( m_alignCenter->IsChecked() )
462 else
464
467 else if( m_valignCenter->IsChecked() )
469 else
471
473
474 if( pushCommit )
475 commit.Push( _( "Change text properties" ) );
476
477 return true;
478}
479
480
481void DIALOG_TEXT_PROPERTIES::onMultiLineTCLostFocus( wxFocusEvent& event )
482{
485
486 event.Skip();
487}
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
Definition: bitmap.cpp:105
@ text_align_right
@ text_valign_top
@ text_align_left
@ text_valign_center
@ text_mirrored
@ text_align_center
@ text_valign_bottom
A bitmap button widget that behaves like an AUI toolbar item's button when it is drawn.
Definition: bitmap_button.h:41
void SetIsRadioButton()
bool IsChecked() const
void SetBitmap(const wxBitmap &aBmp)
Set the bitmap shown when the button is enabled.
void Check(bool aCheck=true)
Check the control.
void SetIsSeparator()
Render button as a toolbar separator.
void SetIsCheckButton()
Setup the control as a two-state button (checked or unchecked).
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:58
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:180
virtual void SetLocked(bool aLocked)
Definition: board_item.h:254
virtual bool IsKnockout() const
Definition: board_item.h:250
virtual void SetIsKnockout(bool aKnockout)
Definition: board_item.h:251
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:214
virtual bool IsLocked() const
Definition: board_item.cpp:71
BOARD_ITEM_CONTAINER * GetParent() const
Definition: board_item.h:163
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:265
wxString ConvertCrossReferencesToKIIDs(const wxString &aSource) const
Convert cross-references back and forth between ${refDes:field} and ${kiid:field}.
Definition: board.cpp:1116
wxString ConvertKIIDsToCrossReferences(const wxString &aSource) const
Definition: board.cpp:1170
void SetInitialFocus(wxWindow *aWindow)
Sets the window (usually a wxTextCtrl) that should be focused when the dialog is shown.
Definition: dialog_shim.h:97
void SetupStandardButtons(std::map< int, wxString > aLabels={})
int ShowQuasiModal()
std::string m_hash_key
Definition: dialog_shim.h:203
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
virtual void OnCharHook(wxKeyEvent &aEvt)
virtual void OnSetFocusText(wxFocusEvent &event) override
Used to select the variant part of some text fields (for instance, the question mark or number in a r...
DIALOG_TEXT_PROPERTIES(SCH_EDIT_FRAME *parent, SCH_ITEM *aTextItem)
void onMultiLineTCLostFocus(wxFocusEvent &event) override
void onFontSelected(wxCommandEvent &aEvent) override
void onBoldToggle(wxCommandEvent &aEvent) override
void onThickness(wxCommandEvent &aEvent) override
void onValignButton(wxCommandEvent &aEvent) override
void onAlignButton(wxCommandEvent &aEvent) override
EDA_ANGLE Normalize()
Definition: eda_angle.h:249
EDA_ANGLE Normalize180()
Definition: eda_angle.h:282
EDA_ITEM_FLAGS GetEditFlags() const
Definition: eda_item.h:145
void SetFlags(EDA_ITEM_FLAGS aMask)
Definition: eda_item.h:139
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:97
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition: eda_text.h:72
const VECTOR2I & GetTextPos() const
Definition: eda_text.h:208
bool IsItalic() const
Definition: eda_text.h:130
const EDA_ANGLE & GetTextAngle() const
Definition: eda_text.h:120
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:87
bool IsKeepUpright() const
Definition: eda_text.h:155
virtual bool IsVisible() const
Definition: eda_text.h:136
void SetTextPos(const VECTOR2I &aPoint)
Definition: eda_text.cpp:371
KIFONT::FONT * GetFont() const
Definition: eda_text.h:188
void SetMirrored(bool isMirrored)
Definition: eda_text.cpp:224
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
Definition: eda_text.cpp:248
GR_TEXT_H_ALIGN_T GetHorizJustify() const
Definition: eda_text.h:149
virtual void SetVisible(bool aVisible)
Definition: eda_text.cpp:217
void SetTextThickness(int aWidth)
The TextThickness is that set by the user.
Definition: eda_text.cpp:185
void SetBold(bool aBold)
Definition: eda_text.cpp:209
bool IsMirrored() const
Definition: eda_text.h:139
bool IsBold() const
Definition: eda_text.h:133
void SetKeepUpright(bool aKeepUpright)
Definition: eda_text.cpp:256
GR_TEXT_V_ALIGN_T GetVertJustify() const
Definition: eda_text.h:152
void SetTextSize(const VECTOR2I &aNewSize)
Definition: eda_text.cpp:347
virtual void SetText(const wxString &aText)
Definition: eda_text.cpp:163
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
Definition: eda_text.cpp:193
int GetTextThickness() const
Definition: eda_text.h:112
void SetItalic(bool aItalic)
Definition: eda_text.cpp:201
void SetFont(KIFONT::FONT *aFont)
Definition: eda_text.cpp:331
VECTOR2I GetTextSize() const
Definition: eda_text.h:196
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
Definition: eda_text.cpp:240
bool HaveFontSelection() const
Definition: font_choice.cpp:88
void SetFontSelection(KIFONT::FONT *aFont)
Definition: font_choice.cpp:67
KIFONT::FONT * GetFontSelection(bool aBold, bool aItalic) const
bool IsFlipped() const
Definition: footprint.h:324
const wxString & GetValue() const
Definition: footprint.h:547
const wxString & GetReference() const
Definition: footprint.h:519
void SetLocalCoord()
Definition: fp_text.cpp:220
@ TEXT_is_REFERENCE
Definition: fp_text.h:49
@ TEXT_is_DIVERS
Definition: fp_text.h:51
@ TEXT_is_VALUE
Definition: fp_text.h:50
TEXT_TYPE GetType() const
Definition: fp_text.h:120
virtual bool IsStroke() const
Definition: font.h:112
int SetLayerSelection(int layer)
bool SetLayersHotkeys(bool value)
Common, abstract interface for edit frames.
void ShowTextPropertiesDialog(BOARD_ITEM *aText)
void SetBoardFrame(PCB_BASE_FRAME *aFrame)
void ShowNonActivatedLayers(bool aShow)
Add cut/copy/paste, dark theme, autocomplete and brace highlighting to a wxStyleTextCtrl instance.
virtual long long int GetValue()
Return the current value in Internal Units.
virtual void SetPrecision(int aLength)
Normally not needed, but can be used to set the precision when using internal units that are floats (...
virtual void SetUnits(EDA_UNITS aUnits)
Normally not needed (as the UNIT_BINDER inherits from the parent frame), but can be used to set to DE...
virtual EDA_ANGLE GetAngleValue()
virtual void SetAngleValue(const EDA_ANGLE &aValue)
virtual bool Validate(double aMin, double aMax, EDA_UNITS aUnits=EDA_UNITS::UNSCALED)
Validate the control against the given range, informing the user of any errors found.
virtual void ChangeValue(int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion WITHOUT trigger...
virtual void SetValue(long long int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
void Show(bool aShow, bool aResize=false)
Show/hide the label, widget and units label.
void SetCoordType(ORIGIN_TRANSFORMS::COORD_TYPES_T aCoordType)
Set the current origin transform mode.
Definition: unit_binder.h:187
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:300
This file is part of the common library.
#define _(s)
#define IN_EDIT
Item currently edited.
int GetPenSizeForBold(int aTextSize)
Definition: gr_text.cpp:40
int GetPenSizeForNormal(int aTextSize)
Definition: gr_text.cpp:52
int Clamp_Text_PenSize(int aPenSize, int aSize, bool aStrict)
Pen width should not allow characters to become cluttered up in their own fatness.
Definition: gr_text.cpp:75
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition: lset.cpp:932
wxFont GetInfoFont(wxWindow *aWindow)
Definition: ui_common.cpp:156
void SelectReferenceNumber(wxTextEntry *aTextEntry)
Select the number (or "?") in a reference for ease of editing.
Definition: ui_common.cpp:230
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
Definition: eda_angle.h:412
#define TEXTS_MAX_SIZE
Maximum text size in internal units (10 inches)
Definition: pcbnew.h:32
#define TEXTS_MIN_SIZE
Minimum text size in internal units (1 mil)
Definition: pcbnew.h:31
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
wxString UnescapeString(const wxString &aSource)
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
@ CTX_QUOTED_STR
Definition: string_utils.h:57
@ GR_TEXT_H_ALIGN_CENTER
@ GR_TEXT_H_ALIGN_RIGHT
@ GR_TEXT_H_ALIGN_LEFT
@ GR_TEXT_V_ALIGN_BOTTOM
@ GR_TEXT_V_ALIGN_CENTER
@ GR_TEXT_V_ALIGN_TOP
@ PCB_FP_TEXT_T
class FP_TEXT, text in a footprint
Definition: typeinfo.h:92