KiCad PCB EDA Suite
Loading...
Searching...
No Matches
sch_textbox.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 The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, you may find one here:
18 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19 * or you may search the http://www.gnu.org website for the version 2 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24#include <advanced_config.h>
25#include <base_units.h>
26#include <pgm_base.h>
27#include <sch_edit_frame.h>
28#include <plotters/plotter.h>
29#include <widgets/msgpanel.h>
30#include <bitmaps.h>
31#include <string_utils.h>
32#include <schematic.h>
34#include <sch_painter.h>
35#include <wx/log.h>
38#include <trigo.h>
40#include <sch_textbox.h>
42#include <markup_parser.h>
43
44
45SCH_TEXTBOX::SCH_TEXTBOX( SCH_LAYER_ID aLayer, int aLineWidth, FILL_T aFillType, const wxString& aText,
46 KICAD_T aType ) :
47 SCH_SHAPE( SHAPE_T::RECTANGLE, aLayer, aLineWidth, aFillType, aType ),
48 EDA_TEXT( schIUScale, aText )
49{
50 m_layer = aLayer;
51
54 SetMultilineAllowed( true );
55
56 m_excludedFromSim = false;
57
58 int defaultMargin = GetLegacyTextMargin();
59 m_marginLeft = defaultMargin;
60 m_marginTop = defaultMargin;
61 m_marginRight = defaultMargin;
62 m_marginBottom = defaultMargin;
63}
64
65
76
77
79{
80 if( m_layer == LAYER_DEVICE )
81 return KiROUND( GetTextSize().y * 0.8 );
82 else
83 return KiROUND( GetStroke().GetWidth() / 2.0 ) + KiROUND( GetTextSize().y * 0.75 );
84}
85
86
88{
90
91 // Text is NOT really mirrored; it just has its justification flipped
93 {
98 }
99}
100
101
103{
105
106 // Text is NOT really mirrored; it just has its justification flipped
108 {
113 }
114}
115
116
117void SCH_TEXTBOX::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
118{
119 SCH_SHAPE::Rotate( aCenter, aRotateCCW );
121}
122
123
128
129
131{
132 BOX2I bbox = BOX2I( m_start, m_end - m_start );
133
134 bbox.Normalize();
135
136 VECTOR2I pos( bbox.GetLeft() + m_marginLeft, bbox.GetBottom() - m_marginBottom );
137
138 if( GetTextAngle().IsVertical() )
139 {
140 switch( GetHorizJustify() )
141 {
142 case GR_TEXT_H_ALIGN_LEFT: pos.y = bbox.GetBottom() - m_marginBottom; break;
143 case GR_TEXT_H_ALIGN_CENTER: pos.y = ( bbox.GetTop() + bbox.GetBottom() ) / 2; break;
144 case GR_TEXT_H_ALIGN_RIGHT: pos.y = bbox.GetTop() + m_marginTop; break;
145 case GR_TEXT_H_ALIGN_INDETERMINATE: wxFAIL_MSG( wxT( "Indeterminate state legal only in dialogs." ) ); break;
146 }
147
148 switch( GetVertJustify() )
149 {
150 case GR_TEXT_V_ALIGN_TOP: pos.x = bbox.GetLeft() + m_marginLeft; break;
151 case GR_TEXT_V_ALIGN_CENTER: pos.x = ( bbox.GetLeft() + bbox.GetRight() ) / 2; break;
152 case GR_TEXT_V_ALIGN_BOTTOM: pos.x = bbox.GetRight() - m_marginRight; break;
153 case GR_TEXT_V_ALIGN_INDETERMINATE: wxFAIL_MSG( wxT( "Indeterminate state legal only in dialogs." ) ); break;
154 }
155 }
156 else
157 {
158 switch( GetHorizJustify() )
159 {
160 case GR_TEXT_H_ALIGN_LEFT: pos.x = bbox.GetLeft() + m_marginLeft; break;
161 case GR_TEXT_H_ALIGN_CENTER: pos.x = ( bbox.GetLeft() + bbox.GetRight() ) / 2; break;
162 case GR_TEXT_H_ALIGN_RIGHT: pos.x = bbox.GetRight() - m_marginRight; break;
163 case GR_TEXT_H_ALIGN_INDETERMINATE: wxFAIL_MSG( wxT( "Indeterminate state legal only in dialogs." ) ); break;
164 }
165
166 switch( GetVertJustify() )
167 {
168 case GR_TEXT_V_ALIGN_TOP: pos.y = bbox.GetTop() + m_marginTop; break;
169 case GR_TEXT_V_ALIGN_CENTER: pos.y = ( bbox.GetTop() + bbox.GetBottom() ) / 2; break;
170 case GR_TEXT_V_ALIGN_BOTTOM: pos.y = bbox.GetBottom() - m_marginBottom; break;
171 case GR_TEXT_V_ALIGN_INDETERMINATE: wxFAIL_MSG( wxT( "Indeterminate state legal only in dialogs." ) ); break;
172 }
173 }
174
175 return pos;
176}
177
178
180{
181 SCH_SHAPE::swapData( aItem );
182
183 SCH_TEXTBOX* item = static_cast<SCH_TEXTBOX*>( aItem );
184
185 std::swap( m_marginLeft, item->m_marginLeft );
186 std::swap( m_marginTop, item->m_marginTop );
187 std::swap( m_marginRight, item->m_marginRight );
188 std::swap( m_marginBottom, item->m_marginBottom );
189
190 SwapText( *item );
191 SwapAttributes( *item );
192}
193
194
195bool SCH_TEXTBOX::operator<( const SCH_ITEM& aItem ) const
196{
197 if( Type() != aItem.Type() )
198 return Type() < aItem.Type();
199
200 auto other = static_cast<const SCH_TEXTBOX*>( &aItem );
201
202 if( GetLayer() != other->GetLayer() )
203 return GetLayer() < other->GetLayer();
204
205 if( GetPosition().x != other->GetPosition().x )
206 return GetPosition().x < other->GetPosition().x;
207
208 if( GetPosition().y != other->GetPosition().y )
209 return GetPosition().y < other->GetPosition().y;
210
211 if( GetMarginLeft() != other->GetMarginLeft() )
212 return GetMarginLeft() < other->GetMarginLeft();
213
214 if( GetMarginTop() != other->GetMarginTop() )
215 return GetMarginTop() < other->GetMarginTop();
216
217 if( GetMarginRight() != other->GetMarginRight() )
218 return GetMarginRight() < other->GetMarginRight();
219
220 if( GetMarginBottom() != other->GetMarginBottom() )
221 return GetMarginBottom() < other->GetMarginBottom();
222
223 if( GetExcludedFromSim() != other->GetExcludedFromSim() )
224 return GetExcludedFromSim() - other->GetExcludedFromSim();
225
226 return GetText() < other->GetText();
227}
228
229
231{
233
234 if( !font )
235 font = KIFONT::FONT::GetFont( GetDefaultFont( aSettings ), IsBold(), IsItalic() );
236
237 return font;
238}
239
240
241wxString SCH_TEXTBOX::GetShownText( const RENDER_SETTINGS* aSettings, const SCH_SHEET_PATH* aPath, bool aAllowExtraText,
242 int aDepth ) const
243{
244 // Use local depth counter so each text element starts fresh
245 int depth = 0;
246
247 SCH_SHEET* sheet = nullptr;
248
249 if( aPath )
250 sheet = aPath->Last();
251
252 std::function<bool( wxString* )> textResolver = [&]( wxString* token ) -> bool
253 {
254 if( sheet )
255 {
256 if( sheet->ResolveTextVar( aPath, token, depth + 1 ) )
257 return true;
258 }
259
260 return false;
261 };
262
263 wxString text = EDA_TEXT::GetShownText( aAllowExtraText, depth );
264
265 if( HasTextVars() )
266 text = ResolveTextVars( text, &textResolver, depth );
267
268 VECTOR2I size = GetEnd() - GetStart();
269 int colWidth;
270
271 if( GetTextAngle().IsVertical() )
272 colWidth = abs( size.y ) - ( GetMarginTop() + GetMarginBottom() );
273 else
274 colWidth = abs( size.x ) - ( GetMarginLeft() + GetMarginRight() );
275
276 GetDrawFont( aSettings )
278
279 // Convert escape markers back to literals for final display
280 text.Replace( wxT( "<<<ESC_DOLLAR:" ), wxT( "${" ) );
281 text.Replace( wxT( "<<<ESC_AT:" ), wxT( "@{" ) );
282
283 return text;
284}
285
286
287bool SCH_TEXTBOX::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
288{
289 BOX2I rect = GetBoundingBox();
290
291 rect.Inflate( aAccuracy );
292
293 return rect.Contains( aPosition );
294}
295
296
297bool SCH_TEXTBOX::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
298{
299 BOX2I rect = aRect;
300
301 rect.Inflate( aAccuracy );
302
303 if( aContained )
304 return rect.Contains( GetBoundingBox() );
305
306 return rect.Intersects( GetBoundingBox() );
307}
308
309
310bool SCH_TEXTBOX::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
311{
312 return KIGEOM::BoxHitTest( aPoly, GetBoundingBox(), aContained );
313}
314
315
317{
318 return HasHyperlink() || containsURL();
319}
320
321
323{
324 return !m_activeUrl.IsEmpty();
325}
326
327
328void SCH_TEXTBOX::DoHypertextAction( EDA_DRAW_FRAME* aFrame, const VECTOR2I& aMousePos ) const
329{
331
332 if( HasHyperlink() )
333 navTool->HypertextCommand( m_hyperlink );
334 else if( !m_activeUrl.IsEmpty() )
335 navTool->HypertextCommand( m_activeUrl );
336}
337
338
339wxString SCH_TEXTBOX::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
340{
341 return wxString::Format( _( "Text box '%s'" ),
342 aFull ? GetShownText( false ) : KIUI::EllipsizeMenuText( GetText() ) );
343}
344
345
350
351
352void SCH_TEXTBOX::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts, int aUnit, int aBodyStyle,
353 const VECTOR2I& aOffset, bool aDimmed )
354{
355 if( IsPrivate() )
356 return;
357
358 SCH_SHAPE::Plot( aPlotter, aBackground, aPlotOpts, aUnit, aBodyStyle, aOffset, aDimmed );
359
360 if( aBackground )
361 return;
362
363 SCH_SHEET_PATH* sheet = Schematic() ? &Schematic()->CurrentSheet() : nullptr;
364 SCH_RENDER_SETTINGS* renderSettings = getRenderSettings( aPlotter );
365 int penWidth = GetEffectivePenWidth( renderSettings );
366 COLOR4D color = GetStroke().GetColor();
367 COLOR4D bg = renderSettings->GetBackgroundColor();
368
369 KIFONT::FONT* font = GetDrawFont( renderSettings );
370
371 color = GetTextColor();
372
373 if( !aPlotter->GetColorMode() || color == COLOR4D::UNSPECIFIED )
374 color = renderSettings->GetLayerColor( m_layer );
375
376 if( bg == COLOR4D::UNSPECIFIED || !aPlotter->GetColorMode() )
377 bg = COLOR4D::WHITE;
378
379 if( color.m_text.has_value() && Schematic() )
380 color = COLOR4D( ResolveText( color.m_text.value(), &Schematic()->CurrentSheet() ) );
381
382 if( aDimmed )
383 {
384 color.Desaturate();
385 color = color.Mix( bg, 0.5f );
386 }
387
388 penWidth = GetEffectiveTextPenWidth( renderSettings->GetDefaultPenWidth() );
389 penWidth = std::max( penWidth, renderSettings->GetMinPenWidth() );
390 aPlotter->SetCurrentLineWidth( penWidth );
391
392 TEXT_ATTRIBUTES attrs;
393 std::vector<VECTOR2I> positions;
394 wxArrayString strings_list;
395
396 wxStringSplit( GetShownText( renderSettings, sheet, true ), strings_list, '\n' );
397 positions.reserve( strings_list.Count() );
398
399 if( renderSettings->m_Transform != TRANSFORM() || aOffset != VECTOR2I() )
400 {
401 SCH_TEXTBOX temp( *this );
402
403 if( renderSettings->m_Transform.y1 )
404 {
406 }
407
408 temp.SetStart( renderSettings->TransformCoordinate( m_start ) + aOffset );
409 temp.SetEnd( renderSettings->TransformCoordinate( m_end ) + aOffset );
410
411 attrs = temp.GetAttributes();
412 temp.GetLinePositions( renderSettings, positions, (int) strings_list.Count() );
413 }
414 else
415 {
416 attrs = GetAttributes();
417 GetLinePositions( renderSettings, positions, (int) strings_list.Count() );
418 }
419
420 attrs.m_StrokeWidth = penWidth;
421 attrs.m_Multiline = false;
422
423 for( unsigned ii = 0; ii < strings_list.Count(); ii++ )
424 {
425 aPlotter->PlotText( positions[ii], color, strings_list.Item( ii ), attrs, font, GetFontMetrics() );
426 }
427
428 if( HasHyperlink() )
429 aPlotter->HyperlinkBox( GetBoundingBox(), GetHyperlink() );
430}
431
432
433void SCH_TEXTBOX::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
434{
435 // Don't use GetShownText() here; we want to show the user the variable references
436 aList.emplace_back( _( "Text Box" ), KIUI::EllipsizeStatusText( aFrame, GetText() ) );
437
438 SCH_ITEM::GetMsgPanelInfo( aFrame, aList );
439
441 aList.emplace_back( _( "Exclude from" ), _( "Simulation" ) );
442
443 aList.emplace_back( _( "Font" ), GetFont() ? GetFont()->GetName() : _( "Default" ) );
444
445 wxString textStyle[] = { _( "Normal" ), _( "Italic" ), _( "Bold" ), _( "Bold Italic" ) };
446 int style = IsBold() && IsItalic() ? 3 : IsBold() ? 2 : IsItalic() ? 1 : 0;
447 aList.emplace_back( _( "Style" ), textStyle[style] );
448
449 aList.emplace_back( _( "Text Size" ), aFrame->MessageTextFromValue( GetTextWidth() ) );
450
451 aList.emplace_back( _( "Box Width" ), aFrame->MessageTextFromValue( std::abs( GetEnd().x - GetStart().x ) ) );
452
453 aList.emplace_back( _( "Box Height" ), aFrame->MessageTextFromValue( std::abs( GetEnd().y - GetStart().y ) ) );
454
455 m_stroke.GetMsgPanelInfo( aFrame, aList );
456}
457
458
459bool SCH_TEXTBOX::operator==( const SCH_ITEM& aOther ) const
460{
461 if( Type() != aOther.Type() )
462 return false;
463
464 const SCH_TEXTBOX& other = static_cast<const SCH_TEXTBOX&>( aOther );
465
467 return false;
468
469 if( GetMarginLeft() != other.GetMarginLeft() )
470 return false;
471
472 if( GetMarginTop() != other.GetMarginTop() )
473 return false;
474
475 if( GetMarginRight() != other.GetMarginRight() )
476 return false;
477
478 if( GetMarginBottom() != other.GetMarginBottom() )
479 return false;
480
481 return SCH_SHAPE::operator==( aOther ) && EDA_TEXT::operator==( other );
482}
483
484
485double SCH_TEXTBOX::Similarity( const SCH_ITEM& aOther ) const
486{
487 if( m_Uuid == aOther.m_Uuid )
488 return 1.0;
489
490 if( aOther.Type() != Type() )
491 return 0.0;
492
493 auto other = static_cast<const SCH_TEXTBOX&>( aOther );
494
495 double similarity = SimilarityBase( other );
496
497 if( m_excludedFromSim != other.m_excludedFromSim )
498 similarity *= 0.9;
499
500 if( GetMarginLeft() != other.GetMarginLeft() )
501 similarity *= 0.9;
502
503 if( GetMarginTop() != other.GetMarginTop() )
504 similarity *= 0.9;
505
506 if( GetMarginRight() != other.GetMarginRight() )
507 similarity *= 0.9;
508
509 if( GetMarginBottom() != other.GetMarginBottom() )
510 similarity *= 0.9;
511
512 similarity *= SCH_SHAPE::Similarity( aOther );
513 similarity *= EDA_TEXT::Similarity( other );
514
515 return similarity;
516}
517
518
519int SCH_TEXTBOX::compare( const SCH_ITEM& aOther, int aCompareFlags ) const
520{
521 wxASSERT( aOther.Type() == SCH_TEXTBOX_T );
522
523 int retv = SCH_SHAPE::compare( aOther, aCompareFlags );
524
525 if( retv )
526 return retv;
527
528 const SCH_TEXTBOX* tmp = static_cast<const SCH_TEXTBOX*>( &aOther );
529
530 int result = GetText().CmpNoCase( tmp->GetText() );
531
532 if( result != 0 )
533 return result;
534
535 if( GetTextWidth() != tmp->GetTextWidth() )
536 return GetTextWidth() - tmp->GetTextWidth();
537
538 if( GetTextHeight() != tmp->GetTextHeight() )
539 return GetTextHeight() - tmp->GetTextHeight();
540
541 if( IsBold() != tmp->IsBold() )
542 return IsBold() - tmp->IsBold();
543
544 if( IsItalic() != tmp->IsItalic() )
545 return IsItalic() - tmp->IsItalic();
546
547 if( GetHorizJustify() != tmp->GetHorizJustify() )
548 return (int) GetHorizJustify() - (int) tmp->GetHorizJustify();
549
550 if( GetTextAngle().AsTenthsOfADegree() != tmp->GetTextAngle().AsTenthsOfADegree() )
552
553 if( GetMarginLeft() != tmp->GetMarginLeft() )
554 return GetMarginLeft() - tmp->GetMarginLeft();
555
556 if( GetMarginTop() != tmp->GetMarginTop() )
557 return GetMarginTop() - tmp->GetMarginTop();
558
559 if( GetMarginRight() != tmp->GetMarginRight() )
560 return GetMarginRight() - tmp->GetMarginRight();
561
562 if( GetMarginBottom() != tmp->GetMarginBottom() )
563 return GetMarginBottom() - tmp->GetMarginBottom();
564
565 return 0;
566}
567
568
569static struct SCH_TEXTBOX_DESC
570{
572 {
575
582
583 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Shape" ) );
584 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Corner Radius" ) );
585
586 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Width" ) );
587 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Height" ) );
588 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Thickness" ) );
589
590 const wxString marginProps = _( "Margins" );
591
594 marginProps );
597 marginProps );
600 marginProps );
603 marginProps );
604
607 _HKI( "Text Properties" ) );
608
609 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Orientation" ) );
610 }
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:114
BITMAPS
A list of all bitmap identifiers.
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:990
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 BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
Definition box2.h:146
constexpr coord_type GetLeft() const
Definition box2.h:228
constexpr bool Contains(const Vec &aPoint) const
Definition box2.h:168
constexpr coord_type GetRight() const
Definition box2.h:217
constexpr coord_type GetTop() const
Definition box2.h:229
constexpr bool Intersects(const BOX2< Vec > &aRect) const
Definition box2.h:311
constexpr coord_type GetBottom() const
Definition box2.h:222
static const COLOR4D WHITE
Definition color4d.h:405
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Definition color4d.h:402
int AsTenthsOfADegree() const
Definition eda_angle.h:118
The base class for create windows for drawing purpose.
const KIID m_Uuid
Definition eda_item.h:522
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
wxString m_activeUrl
Definition eda_item.h:540
VECTOR2I m_start
Definition eda_shape.h:505
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
Definition eda_shape.h:215
void SetStart(const VECTOR2I &aStart)
Definition eda_shape.h:177
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
Definition eda_shape.h:173
void SetEnd(const VECTOR2I &aEnd)
Definition eda_shape.h:219
VECTOR2I m_end
Definition eda_shape.h:506
virtual int GetWidth() const
Definition eda_shape.h:156
STROKE_PARAMS m_stroke
Definition eda_shape.h:494
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
COLOR4D GetTextColor() const
Definition eda_text.h:270
bool IsItalic() const
Definition eda_text.h:169
const EDA_ANGLE & GetTextAngle() const
Definition eda_text.h:147
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition eda_text.h:98
KIFONT::FONT * GetFont() const
Definition eda_text.h:247
wxString m_hyperlink
A hyperlink URL.
Definition eda_text.h:453
int GetTextWidth() const
Definition eda_text.h:264
virtual bool HasHyperlink() const
Definition eda_text.h:400
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
Definition eda_text.cpp:426
wxString GetHyperlink() const
Definition eda_text.h:401
GR_TEXT_H_ALIGN_T GetHorizJustify() const
Definition eda_text.h:200
bool HasTextVars() const
Indicates the ShownText has text var references which need to be processed.
Definition eda_text.h:117
bool containsURL() const
Definition eda_text.cpp:994
EDA_TEXT(const EDA_IU_SCALE &aIuScale, const wxString &aText=wxEmptyString)
Definition eda_text.cpp:98
double Similarity(const EDA_TEXT &aOther) const
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:474
void SwapAttributes(EDA_TEXT &aTradingPartner)
Swap the text attributes of the two involved instances.
Definition eda_text.cpp:461
void GetLinePositions(const RENDER_SETTINGS *aSettings, std::vector< VECTOR2I > &aPositions, int aLineCount) const
Populate aPositions with the position of each line of a multiline text, according to the vertical jus...
Definition eda_text.cpp:916
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 SetTextAngle(const EDA_ANGLE &aAngle)
Definition eda_text.cpp:308
void SwapText(EDA_TEXT &aTradingPartner)
Definition eda_text.cpp:454
bool operator==(const EDA_TEXT &aRhs) const
Definition eda_text.h:396
void SetMultilineAllowed(bool aAllow)
Definition eda_text.cpp:410
VECTOR2I GetTextSize() const
Definition eda_text.h:261
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
Definition eda_text.cpp:418
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
void LinebreakText(wxString &aText, int aColumnWidth, const VECTOR2I &aGlyphSize, int aThickness, bool aBold, bool aItalic) const
Insert characters into text to ensure that no lines are wider than aColumnWidth.
Definition font.cpp:596
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:105
std::optional< wxString > m_text
Definition color4d.h:399
COLOR4D & Desaturate()
Removes color (in HSL model)
Definition color4d.cpp:532
COLOR4D Mix(const COLOR4D &aColor, double aFactor) const
Return a color that is mixed with the input by a factor.
Definition color4d.h:296
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
Base plotter engine class.
Definition plotter.h:136
virtual void HyperlinkBox(const BOX2I &aBox, const wxString &aDestinationURL)
Create a clickable hyperlink with a rectangular click area.
Definition plotter.h:506
bool GetColorMode() const
Definition plotter.h:164
virtual void SetCurrentLineWidth(int width, void *aData=nullptr)=0
Set the line width for the next drawing.
virtual void PlotText(const VECTOR2I &aPos, const COLOR4D &aColor, const wxString &aText, const TEXT_ATTRIBUTES &aAttributes, KIFONT::FONT *aFont=nullptr, const KIFONT::METRICS &aFontMetrics=KIFONT::METRICS::Default(), void *aData=nullptr)
Definition plotter.cpp:696
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 AddTypeCast(TYPE_CAST_BASE *aCast)
Register a type converter.
SCH_SHEET_PATH & CurrentSheet() const
Definition schematic.h:187
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.
Definition sch_item.cpp:796
SCH_RENDER_SETTINGS * getRenderSettings(PLOTTER *aPlotter) const
Definition sch_item.h:721
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:247
bool IsPrivate() const
Definition sch_item.h:253
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition sch_item.h:340
const wxString & GetDefaultFont(const RENDER_SETTINGS *aSettings) const
Definition sch_item.cpp:739
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
Definition sch_item.cpp:54
wxString ResolveText(const wxString &aText, const SCH_SHEET_PATH *aPath, int aDepth=0) const
Definition sch_item.cpp:356
const KIFONT::METRICS & GetFontMetrics() const
Definition sch_item.cpp:752
int GetEffectivePenWidth(const SCH_RENDER_SETTINGS *aSettings) const
Definition sch_item.cpp:761
SCH_LAYER_ID m_layer
Definition sch_item.h:772
double SimilarityBase(const SCH_ITEM &aItem) const
Calculate the boilerplate similarity for all LIB_ITEMs without preventing the use above of a pure vir...
Definition sch_item.h:379
Handle actions specific to the schematic editor.
void HypertextCommand(const wxString &aHref)
VECTOR2I TransformCoordinate(const VECTOR2I &aPoint) const
const KIGFX::COLOR4D & GetBackgroundColor() const override
Return current background color settings.
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
void swapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
Definition sch_shape.cpp:53
double Similarity(const SCH_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
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.
SCH_SHAPE(SHAPE_T aShape=SHAPE_T::UNDEFINED, SCH_LAYER_ID aLayer=LAYER_NOTES, int aLineWidth=0, FILL_T aFillType=FILL_T::NO_FILL, KICAD_T aType=SCH_SHAPE_T)
Definition sch_shape.cpp:38
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
bool operator==(const SCH_ITEM &aOther) const override
STROKE_PARAMS GetStroke() const override
Definition sch_shape.h:58
VECTOR2I GetPosition() const override
Definition sch_shape.h:85
int compare(const SCH_ITEM &aOther, int aCompareFlags=0) const override
Provide the draw object specific comparison called by the == and < operators.
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:48
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the sheet.
void SetMarginBottom(int aBottom)
Definition sch_textbox.h:61
int GetMarginBottom() const
Definition sch_textbox.h:66
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
bool m_excludedFromSim
virtual wxString GetShownText(const RENDER_SETTINGS *aSettings, const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
bool operator==(const SCH_ITEM &aOther) const override
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
int GetLegacyTextMargin() const
int GetMarginLeft() const
Definition sch_textbox.h:63
int GetSchTextSize() const
Definition sch_textbox.h:68
bool GetExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
Definition sch_textbox.h:98
int compare(const SCH_ITEM &aOther, int aCompareFlags=0) const override
Provide the draw object specific comparison called by the == and < operators.
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
bool operator<(const SCH_ITEM &aItem) const override
bool HasHypertext() const override
Indicates that the item has at least one hypertext action.
VECTOR2I GetDrawPos() const override
int GetMarginRight() const
Definition sch_textbox.h:65
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
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.
bool HasHoveredHypertext() const override
Indicates that a hypertext link is currently active.
int GetMarginTop() const
Definition sch_textbox.h:64
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 SetMarginLeft(int aLeft)
Definition sch_textbox.h:58
void swapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
void DoHypertextAction(EDA_DRAW_FRAME *aFrame, const VECTOR2I &aMousePos) const override
virtual void Rotate90(bool aClockwise)
void SetMarginRight(int aRight)
Definition sch_textbox.h:60
void SetSchTextSize(int aSize)
Definition sch_textbox.h:69
KIFONT::FONT * GetDrawFont(const RENDER_SETTINGS *aSettings) const override
SCH_TEXTBOX(SCH_LAYER_ID aLayer=LAYER_NOTES, int aLineWidth=0, FILL_T aFillType=FILL_T::NO_FILL, const wxString &aText=wxEmptyString, KICAD_T aType=SCH_TEXTBOX_T)
double Similarity(const SCH_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
void SetMarginTop(int aTop)
Definition sch_textbox.h:59
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
KIGFX::COLOR4D GetColor() const
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
for transforming drawing coordinates for a wxDC device context.
Definition transform.h:46
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
wxString ResolveTextVars(const wxString &aSource, const std::function< bool(wxString *)> *aResolver, int &aDepth)
Multi-pass text variable expansion and math expression evaluation.
Definition common.cpp:295
#define _(s)
static constexpr EDA_ANGLE ANGLE_VERTICAL
Definition eda_angle.h:408
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
Definition eda_angle.h:407
SHAPE_T
Definition eda_shape.h:43
FILL_T
Definition eda_shape.h:56
a few functions useful in geometry calculations.
SCH_LAYER_ID
Eeschema drawing layers.
Definition layer_ids.h:449
@ LAYER_DEVICE
Definition layer_ids.h:466
Message panel definition file.
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.
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
Definition eda_angle.h:400
#define _HKI(x)
Definition page_info.cpp:44
see class PGM_BASE
#define TYPE_HASH(x)
Definition property.h:74
@ PT_SIZE
Size expressed in distance units (mm/inch)
Definition property.h:63
#define REGISTER_TYPE(x)
static struct SCH_TEXTBOX_DESC _SCH_TEXTBOX_DESC
void wxStringSplit(const wxString &aText, wxArrayString &aStrings, wxChar aSplitter)
Split aString to a string list separated at aSplitter.
wxString result
Test unit parsing edge cases and error handling.
@ GR_TEXT_H_ALIGN_CENTER
@ GR_TEXT_H_ALIGN_RIGHT
@ GR_TEXT_H_ALIGN_LEFT
@ GR_TEXT_H_ALIGN_INDETERMINATE
@ GR_TEXT_V_ALIGN_BOTTOM
@ GR_TEXT_V_ALIGN_INDETERMINATE
@ GR_TEXT_V_ALIGN_CENTER
@ GR_TEXT_V_ALIGN_TOP
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition typeinfo.h:78
@ SCH_TEXTBOX_T
Definition typeinfo.h:156
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695