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, see <https://www.gnu.org/licenses/>.
18 */
19
20#include <google/protobuf/any.pb.h>
21
22#include <advanced_config.h>
23#include <api/api_enums.h>
24#include <api/api_utils.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#include <properties/property.h>
45#include <api/schematic/schematic_types.pb.h>
46
47
48SCH_TEXTBOX::SCH_TEXTBOX( SCH_LAYER_ID aLayer, int aLineWidth, FILL_T aFillType, const wxString& aText,
49 KICAD_T aType ) :
50 SCH_SHAPE( SHAPE_T::RECTANGLE, aLayer, aLineWidth, aFillType, aType ),
51 EDA_TEXT( schIUScale, aText )
52{
53 m_layer = aLayer;
54
57 SetMultilineAllowed( true );
58
59 m_excludedFromSim = false;
60
61 int defaultMargin = GetLegacyTextMargin();
62 m_marginLeft = defaultMargin;
63 m_marginTop = defaultMargin;
64 m_marginRight = defaultMargin;
65 m_marginBottom = defaultMargin;
66}
67
68
79
80
81void SCH_TEXTBOX::Serialize( kiapi::schematic::types::SchematicTextBox& aOutput, const EDA_IU_SCALE& aScale ) const
82{
83 using namespace kiapi::common;
84
85 aOutput.mutable_id()->set_value( m_Uuid.AsStdString() );
86 aOutput.set_locked( IsLocked() ? types::LockedState::LS_LOCKED : types::LockedState::LS_UNLOCKED );
87 aOutput.set_exclude_from_sim( GetExcludedFromSim() );
88 PackDistance( *aOutput.mutable_margin_left(), GetMarginLeft(), aScale );
89 PackDistance( *aOutput.mutable_margin_top(), GetMarginTop(), aScale );
90 PackDistance( *aOutput.mutable_margin_right(), GetMarginRight(), aScale );
91 PackDistance( *aOutput.mutable_margin_bottom(), GetMarginBottom(), aScale );
92
93 types::TextBox& text = *aOutput.mutable_textbox();
94 PackVector2( *text.mutable_top_left(), GetPosition(), aScale );
95 PackVector2( *text.mutable_bottom_right(), GetEnd(), aScale );
96 text.set_text( GetText().ToUTF8() );
97 text.set_border_enabled( GetStroke().GetWidth() >= 0 );
98
99 types::TextAttributes* attrs = text.mutable_attributes();
100
101 if( GetFont() )
102 attrs->set_font_name( GetFont()->GetName().ToUTF8() );
103
106 attrs->mutable_angle()->set_value_degrees( GetTextAngleDegrees() );
107 attrs->set_line_spacing( GetLineSpacing() );
108 PackDistance( *attrs->mutable_stroke_width(), GetTextThickness(), aScale );
109 attrs->set_italic( IsItalic() );
110 attrs->set_bold( IsBold() );
111 attrs->set_underlined( GetAttributes().m_Underlined );
112 attrs->set_mirrored( IsMirrored() );
113 attrs->set_multiline( IsMultilineAllowed() );
114 attrs->set_keep_upright( IsKeepUpright() );
115 PackVector2( *attrs->mutable_size(), GetTextSize(), aScale );
116
118 PackColor( *attrs->mutable_color(), GetTextColor() );
119
120 types::StrokeAttributes* stroke = aOutput.mutable_graphic_attributes()->mutable_stroke();
121 PackDistance( *stroke->mutable_width(), GetStroke().GetWidth(), aScale );
123
124 if( GetStroke().GetColor() != COLOR4D::UNSPECIFIED )
125 PackColor( *stroke->mutable_color(), GetStroke().GetColor() );
126
127 types::GraphicFillAttributes* fill = aOutput.mutable_graphic_attributes()->mutable_fill();
129
131 PackColor( *fill->mutable_color(), GetFillColor() );
132
133 PackCustomProperties( aOutput.mutable_custom_properties(), *this );
134}
135
136
137void SCH_TEXTBOX::Serialize( google::protobuf::Any& aContainer ) const
138{
139 kiapi::schematic::types::SchematicTextBox textBox;
140 Serialize( textBox, schIUScale );
141 aContainer.PackFrom( textBox );
142}
143
144
145bool SCH_TEXTBOX::Deserialize( const kiapi::schematic::types::SchematicTextBox& aInput, const EDA_IU_SCALE& aScale )
146{
147 using namespace kiapi::common;
148
149 const_cast<KIID&>( m_Uuid ) = KIID( aInput.id().value() );
150 SetLocked( aInput.locked() == types::LockedState::LS_LOCKED );
151 SetExcludedFromSim( aInput.exclude_from_sim() );
152 SetPosition( UnpackVector2( aInput.textbox().top_left(), aScale ) );
153 SetEnd( UnpackVector2( aInput.textbox().bottom_right(), aScale ) );
154 SetText( wxString::FromUTF8( aInput.textbox().text() ) );
155 UnpackCustomProperties( aInput.custom_properties(), *this );
156
157 if( aInput.has_margin_left() )
158 SetMarginLeft( UnpackDistance( aInput.margin_left(), aScale ) );
159
160 if( aInput.has_margin_top() )
161 SetMarginTop( UnpackDistance( aInput.margin_top(), aScale ) );
162
163 if( aInput.has_margin_right() )
164 SetMarginRight( UnpackDistance( aInput.margin_right(), aScale ) );
165
166 if( aInput.has_margin_bottom() )
167 SetMarginBottom( UnpackDistance( aInput.margin_bottom(), aScale ) );
168
169 if( aInput.textbox().has_attributes() )
170 {
172
173 attrs.m_Bold = aInput.textbox().attributes().bold();
174 attrs.m_Italic = aInput.textbox().attributes().italic();
175 attrs.m_Underlined = aInput.textbox().attributes().underlined();
176 attrs.m_Mirrored = aInput.textbox().attributes().mirrored();
177 attrs.m_Multiline = aInput.textbox().attributes().multiline();
178 attrs.m_KeepUpright = aInput.textbox().attributes().keep_upright();
179 attrs.m_Size = UnpackVector2( aInput.textbox().attributes().size(), aScale );
180
181 if( aInput.textbox().attributes().has_color() )
182 attrs.m_Color = UnpackColor( aInput.textbox().attributes().color() );
183 else
185
186 if( !aInput.textbox().attributes().font_name().empty() )
187 {
188 attrs.m_Font = KIFONT::FONT::GetFont( wxString::FromUTF8( aInput.textbox().attributes().font_name() ),
189 attrs.m_Bold, attrs.m_Italic );
190 }
191
192 attrs.m_Angle = EDA_ANGLE( aInput.textbox().attributes().angle().value_degrees(), DEGREES_T );
193
194 if( aInput.textbox().attributes().has_line_spacing() )
195 attrs.m_LineSpacing = aInput.textbox().attributes().line_spacing();
196 else
197 attrs.m_LineSpacing = 1.0;
198
199 attrs.m_StrokeWidth = UnpackDistance( aInput.textbox().attributes().stroke_width(), aScale );
201 aInput.textbox().attributes().horizontal_alignment() );
203 aInput.textbox().attributes().vertical_alignment() );
204
205 SetAttributes( attrs );
206 }
207
208 if( aInput.has_graphic_attributes() )
209 {
210 if( aInput.graphic_attributes().stroke().has_color() )
211 m_stroke.SetColor( UnpackColor( aInput.graphic_attributes().stroke().color() ) );
212 else
213 m_stroke.SetColor( COLOR4D::UNSPECIFIED );
214
215 if( aInput.graphic_attributes().fill().has_color() )
216 SetFillColor( UnpackColor( aInput.graphic_attributes().fill().color() ) );
217 else
219
220 SetWidth( UnpackDistance( aInput.graphic_attributes().stroke().width(), aScale ) );
221
222 if( !aInput.textbox().border_enabled() )
223 SetWidth( -1 );
224 else
225 SetWidth( std::max( 0, GetStroke().GetWidth() ) );
226
228 FromProtoEnum<LINE_STYLE, types::StrokeLineStyle>( aInput.graphic_attributes().stroke().style() ) );
229 SetFillMode( FromProtoEnum<FILL_T, types::GraphicFillType>( aInput.graphic_attributes().fill().fill_type() ) );
230 }
231
232 return true;
233}
234
235
236bool SCH_TEXTBOX::Deserialize( const google::protobuf::Any& aContainer )
237{
238 kiapi::schematic::types::SchematicTextBox textBox;
239
240 if( !aContainer.UnpackTo( &textBox ) )
241 return false;
242
243 return Deserialize( textBox, schIUScale );
244}
245
246
248{
249 if( m_layer == LAYER_DEVICE )
250 return KiROUND( GetTextSize().y * 0.8 );
251 else
252 return KiROUND( GetStroke().GetWidth() / 2.0 ) + KiROUND( GetTextSize().y * 0.75 );
253}
254
255
257{
258 if( GetText().IsEmpty() )
259 return VECTOR2I( 0, 0 );
260
261 BOX2I textBox = GetTextBox( nullptr );
262
263 int textHeight = std::abs( textBox.GetHeight() );
264
265 if( GetTextAngle().IsVertical() )
266 {
267 textHeight += GetMarginLeft() + GetMarginRight();
268 return VECTOR2I( textHeight, 0 );
269 }
270
271 textHeight += GetMarginTop() + GetMarginBottom();
272 return VECTOR2I( 0, textHeight );
273}
274
275
277{
279
280 // Text is NOT really mirrored; it just has its justification flipped
282 {
287 }
288}
289
290
292{
294
295 // Text is NOT really mirrored; it just has its justification flipped
297 {
302 }
303}
304
305
306void SCH_TEXTBOX::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
307{
308 SCH_SHAPE::Rotate( aCenter, aRotateCCW );
310}
311
312
317
318
320{
321 BOX2I bbox = BOX2I( m_start, m_end - m_start );
322
323 bbox.Normalize();
324
325 VECTOR2I pos( bbox.GetLeft() + m_marginLeft, bbox.GetBottom() - m_marginBottom );
326
327 if( GetTextAngle().IsVertical() )
328 {
329 switch( GetHorizJustify() )
330 {
331 case GR_TEXT_H_ALIGN_LEFT: pos.y = bbox.GetBottom() - m_marginBottom; break;
332 case GR_TEXT_H_ALIGN_CENTER: pos.y = ( bbox.GetTop() + bbox.GetBottom() ) / 2; break;
333 case GR_TEXT_H_ALIGN_RIGHT: pos.y = bbox.GetTop() + m_marginTop; break;
334 case GR_TEXT_H_ALIGN_INDETERMINATE: wxFAIL_MSG( wxT( "Indeterminate state legal only in dialogs." ) ); break;
335 }
336
337 switch( GetVertJustify() )
338 {
339 case GR_TEXT_V_ALIGN_TOP: pos.x = bbox.GetLeft() + m_marginLeft; break;
340 case GR_TEXT_V_ALIGN_CENTER: pos.x = ( bbox.GetLeft() + bbox.GetRight() ) / 2; break;
341 case GR_TEXT_V_ALIGN_BOTTOM: pos.x = bbox.GetRight() - m_marginRight; break;
342 case GR_TEXT_V_ALIGN_INDETERMINATE: wxFAIL_MSG( wxT( "Indeterminate state legal only in dialogs." ) ); break;
343 }
344 }
345 else
346 {
347 switch( GetHorizJustify() )
348 {
349 case GR_TEXT_H_ALIGN_LEFT: pos.x = bbox.GetLeft() + m_marginLeft; break;
350 case GR_TEXT_H_ALIGN_CENTER: pos.x = ( bbox.GetLeft() + bbox.GetRight() ) / 2; break;
351 case GR_TEXT_H_ALIGN_RIGHT: pos.x = bbox.GetRight() - m_marginRight; break;
352 case GR_TEXT_H_ALIGN_INDETERMINATE: wxFAIL_MSG( wxT( "Indeterminate state legal only in dialogs." ) ); break;
353 }
354
355 switch( GetVertJustify() )
356 {
357 case GR_TEXT_V_ALIGN_TOP: pos.y = bbox.GetTop() + m_marginTop; break;
358 case GR_TEXT_V_ALIGN_CENTER: pos.y = ( bbox.GetTop() + bbox.GetBottom() ) / 2; break;
359 case GR_TEXT_V_ALIGN_BOTTOM: pos.y = bbox.GetBottom() - m_marginBottom; break;
360 case GR_TEXT_V_ALIGN_INDETERMINATE: wxFAIL_MSG( wxT( "Indeterminate state legal only in dialogs." ) ); break;
361 }
362 }
363
364 return pos;
365}
366
367
369{
370 SCH_SHAPE::swapData( aItem );
371
372 SCH_TEXTBOX* item = static_cast<SCH_TEXTBOX*>( aItem );
373
374 std::swap( m_marginLeft, item->m_marginLeft );
375 std::swap( m_marginTop, item->m_marginTop );
376 std::swap( m_marginRight, item->m_marginRight );
377 std::swap( m_marginBottom, item->m_marginBottom );
378
379 SwapText( *item );
380 SwapAttributes( *item );
381}
382
383
384bool SCH_TEXTBOX::operator<( const SCH_ITEM& aItem ) const
385{
386 if( Type() != aItem.Type() )
387 return Type() < aItem.Type();
388
389 auto other = static_cast<const SCH_TEXTBOX*>( &aItem );
390
391 if( GetLayer() != other->GetLayer() )
392 return GetLayer() < other->GetLayer();
393
394 if( GetPosition().x != other->GetPosition().x )
395 return GetPosition().x < other->GetPosition().x;
396
397 if( GetPosition().y != other->GetPosition().y )
398 return GetPosition().y < other->GetPosition().y;
399
400 if( GetMarginLeft() != other->GetMarginLeft() )
401 return GetMarginLeft() < other->GetMarginLeft();
402
403 if( GetMarginTop() != other->GetMarginTop() )
404 return GetMarginTop() < other->GetMarginTop();
405
406 if( GetMarginRight() != other->GetMarginRight() )
407 return GetMarginRight() < other->GetMarginRight();
408
409 if( GetMarginBottom() != other->GetMarginBottom() )
410 return GetMarginBottom() < other->GetMarginBottom();
411
412 if( GetExcludedFromSim() != other->GetExcludedFromSim() )
413 return GetExcludedFromSim() - other->GetExcludedFromSim();
414
415 return GetText() < other->GetText();
416}
417
418
420{
422
423 if( !font )
424 font = KIFONT::FONT::GetFont( GetDefaultFont( aSettings ), IsBold(), IsItalic() );
425
426 return font;
427}
428
429
430wxString SCH_TEXTBOX::GetShownText( const RENDER_SETTINGS* aSettings, const SCH_SHEET_PATH* aPath,
431 RESOLUTION_CONTEXT aContext, int aDepth ) const
432{
433 // Use local depth counter so each text element starts fresh
434 int depth = 0;
435
436 SCH_SHEET* sheet = nullptr;
437
438 if( aPath )
439 sheet = aPath->Last();
440
441 std::function<bool( wxString* )> textResolver =
442 [&]( wxString* token ) -> bool
443 {
444 if( sheet )
445 {
446 if( sheet->ResolveTextVar( aPath, token, depth + 1 ) )
447 return true;
448 }
449
450 return false;
451 };
452
453 wxString text = EDA_TEXT::GetShownText( aContext, depth );
454
455 if( HasTextVars() && aContext != RAW_VALUE )
456 {
457 text = ResolveTextVars( text, &textResolver, depth );
458 FinalizeTextVarExpansion( text, aContext );
459 }
460
461 if( aDepth == 0 )
462 {
463 VECTOR2I size = GetEnd() - GetStart();
464 int colWidth;
465
466 if( GetTextAngle().IsVertical() )
467 colWidth = abs( size.y ) - ( GetMarginTop() + GetMarginBottom() );
468 else
469 colWidth = abs( size.x ) - ( GetMarginLeft() + GetMarginRight() );
470
472 IsBold(), IsItalic() );
473 }
474
475 return text;
476}
477
478
479bool SCH_TEXTBOX::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
480{
481 BOX2I rect = GetBoundingBox();
482
483 rect.Inflate( aAccuracy );
484
485 return rect.Contains( aPosition );
486}
487
488
489bool SCH_TEXTBOX::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
490{
491 BOX2I rect = aRect;
492
493 rect.Inflate( aAccuracy );
494
495 if( aContained )
496 return rect.Contains( GetBoundingBox() );
497
498 return rect.Intersects( GetBoundingBox() );
499}
500
501
502bool SCH_TEXTBOX::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
503{
504 return KIGEOM::BoxHitTest( aPoly, GetBoundingBox(), aContained );
505}
506
507
509{
510 return HasHyperlink() || containsURL();
511}
512
513
515{
516 return !m_activeUrl.IsEmpty();
517}
518
519
520void SCH_TEXTBOX::DoHypertextAction( EDA_DRAW_FRAME* aFrame, const VECTOR2I& aMousePos ) const
521{
523
524 if( HasHyperlink() )
525 navTool->HypertextCommand( m_hyperlink );
526 else if( !m_activeUrl.IsEmpty() )
527 navTool->HypertextCommand( m_activeUrl );
528}
529
530
531wxString SCH_TEXTBOX::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
532{
533 return wxString::Format( _( "Text box '%s'" ), aFull ? GetShownText( FOR_GUI )
535}
536
537
542
543
544void SCH_TEXTBOX::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts, int aUnit, int aBodyStyle,
545 const VECTOR2I& aOffset, bool aDimmed )
546{
547 if( IsPrivate() )
548 return;
549
550 SCH_SHAPE::Plot( aPlotter, aBackground, aPlotOpts, aUnit, aBodyStyle, aOffset, aDimmed );
551
552 if( aBackground )
553 return;
554
555 SCH_SHEET_PATH* sheet = Schematic() ? &Schematic()->CurrentSheet() : nullptr;
556 SCH_RENDER_SETTINGS* renderSettings = getRenderSettings( aPlotter );
557 int penWidth = GetEffectivePenWidth( renderSettings );
558 COLOR4D color = GetStroke().GetColor();
559 COLOR4D bg = renderSettings->GetBackgroundColor();
560
561 KIFONT::FONT* font = GetDrawFont( renderSettings );
562
563 color = GetTextColor();
564
565 if( !aPlotter->GetColorMode() || color == COLOR4D::UNSPECIFIED )
566 color = renderSettings->GetLayerColor( m_layer );
567
568 if( bg == COLOR4D::UNSPECIFIED || !aPlotter->GetColorMode() )
569 bg = COLOR4D::WHITE;
570
571 if( color.m_text && Schematic() )
572 color = COLOR4D( ResolveText( *color.m_text, &Schematic()->CurrentSheet() ) );
573
574 if( aDimmed )
575 {
576 color.Desaturate();
577 color = color.Mix( bg, 0.5f );
578 }
579
580 penWidth = GetEffectiveTextPenWidth( renderSettings->GetDefaultPenWidth() );
581 penWidth = std::max( penWidth, renderSettings->GetMinPenWidth() );
582 aPlotter->SetCurrentLineWidth( penWidth );
583
584 TEXT_ATTRIBUTES attrs;
585 std::vector<VECTOR2I> positions;
586 wxArrayString strings_list;
587
588 wxStringSplit( GetShownText( renderSettings, sheet, FOR_CANVAS ), strings_list, '\n' );
589 positions.reserve( strings_list.Count() );
590
591 if( renderSettings->m_Transform != TRANSFORM() || aOffset != VECTOR2I() )
592 {
593 SCH_TEXTBOX temp( *this );
594
595 if( renderSettings->m_Transform.y1 )
597
598 temp.SetStart( renderSettings->TransformCoordinate( m_start ) + aOffset );
599 temp.SetEnd( renderSettings->TransformCoordinate( m_end ) + aOffset );
600
601 attrs = temp.GetAttributes();
602 temp.GetLinePositions( renderSettings, positions, (int) strings_list.Count() );
603 }
604 else
605 {
606 attrs = GetAttributes();
607 GetLinePositions( renderSettings, positions, (int) strings_list.Count() );
608 }
609
610 attrs.m_StrokeWidth = penWidth;
611 attrs.m_Multiline = false;
612
613 for( unsigned ii = 0; ii < strings_list.Count(); ii++ )
614 {
615 aPlotter->PlotText( positions[ii], color, strings_list.Item( ii ), attrs, font, GetFontMetrics() );
616 }
617
618 if( HasHyperlink() )
619 aPlotter->HyperlinkBox( GetBoundingBox(), GetHyperlink() );
620}
621
622
623void SCH_TEXTBOX::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
624{
625 // Don't use GetShownText() here; we want to show the user the variable references
626 aList.emplace_back( _( "Text Box" ), KIUI::EllipsizeStatusText( aFrame, GetText() ) );
627
628 SCH_ITEM::GetMsgPanelInfo( aFrame, aList );
629
631 aList.emplace_back( _( "Exclude from" ), _( "Simulation" ) );
632
633 aList.emplace_back( _( "Font" ), GetFont() ? GetFont()->GetName() : _( "Default" ) );
634
635 wxString textStyle[] = { _( "Normal" ), _( "Italic" ), _( "Bold" ), _( "Bold Italic" ) };
636 int style = IsBold() && IsItalic() ? 3 : IsBold() ? 2 : IsItalic() ? 1 : 0;
637 aList.emplace_back( _( "Style" ), textStyle[style] );
638
639 aList.emplace_back( _( "Text Size" ), aFrame->MessageTextFromValue( GetTextWidth() ) );
640
641 aList.emplace_back( _( "Box Width" ), aFrame->MessageTextFromValue( std::abs( GetEnd().x - GetStart().x ) ) );
642
643 aList.emplace_back( _( "Box Height" ), aFrame->MessageTextFromValue( std::abs( GetEnd().y - GetStart().y ) ) );
644
645 m_stroke.GetMsgPanelInfo( aFrame, aList );
646}
647
648
649bool SCH_TEXTBOX::operator==( const SCH_ITEM& aOther ) const
650{
651 if( Type() != aOther.Type() )
652 return false;
653
654 const SCH_TEXTBOX& other = static_cast<const SCH_TEXTBOX&>( aOther );
655
657 return false;
658
659 if( GetMarginLeft() != other.GetMarginLeft() )
660 return false;
661
662 if( GetMarginTop() != other.GetMarginTop() )
663 return false;
664
665 if( GetMarginRight() != other.GetMarginRight() )
666 return false;
667
668 if( GetMarginBottom() != other.GetMarginBottom() )
669 return false;
670
671 return SCH_SHAPE::operator==( aOther ) && EDA_TEXT::operator==( other );
672}
673
674
675double SCH_TEXTBOX::Similarity( const SCH_ITEM& aOther ) const
676{
677 if( m_Uuid == aOther.m_Uuid )
678 return 1.0;
679
680 if( aOther.Type() != Type() )
681 return 0.0;
682
683 auto other = static_cast<const SCH_TEXTBOX&>( aOther );
684
685 double similarity = SimilarityBase( other );
686
687 if( m_excludedFromSim != other.m_excludedFromSim )
688 similarity *= 0.9;
689
690 if( GetMarginLeft() != other.GetMarginLeft() )
691 similarity *= 0.9;
692
693 if( GetMarginTop() != other.GetMarginTop() )
694 similarity *= 0.9;
695
696 if( GetMarginRight() != other.GetMarginRight() )
697 similarity *= 0.9;
698
699 if( GetMarginBottom() != other.GetMarginBottom() )
700 similarity *= 0.9;
701
702 similarity *= SCH_SHAPE::Similarity( aOther );
703 similarity *= EDA_TEXT::Similarity( other );
704
705 return similarity;
706}
707
708
709int SCH_TEXTBOX::compare( const SCH_ITEM& aOther, int aCompareFlags ) const
710{
711 wxASSERT( aOther.Type() == SCH_TEXTBOX_T || aOther.Type() == SCH_TABLECELL_T );
712
713 int retv = SCH_SHAPE::compare( aOther, aCompareFlags );
714
715 if( retv )
716 return retv;
717
718 const SCH_TEXTBOX* tmp = static_cast<const SCH_TEXTBOX*>( &aOther );
719
720 int result = GetText().CmpNoCase( tmp->GetText() );
721
722 if( result != 0 )
723 return result;
724
725 if( GetTextWidth() != tmp->GetTextWidth() )
726 return GetTextWidth() - tmp->GetTextWidth();
727
728 if( GetTextHeight() != tmp->GetTextHeight() )
729 return GetTextHeight() - tmp->GetTextHeight();
730
731 if( IsBold() != tmp->IsBold() )
732 return IsBold() - tmp->IsBold();
733
734 if( IsItalic() != tmp->IsItalic() )
735 return IsItalic() - tmp->IsItalic();
736
737 if( GetHorizJustify() != tmp->GetHorizJustify() )
738 return (int) GetHorizJustify() - (int) tmp->GetHorizJustify();
739
740 if( GetTextAngle().AsTenthsOfADegree() != tmp->GetTextAngle().AsTenthsOfADegree() )
742
743 if( GetMarginLeft() != tmp->GetMarginLeft() )
744 return GetMarginLeft() - tmp->GetMarginLeft();
745
746 if( GetMarginTop() != tmp->GetMarginTop() )
747 return GetMarginTop() - tmp->GetMarginTop();
748
749 if( GetMarginRight() != tmp->GetMarginRight() )
750 return GetMarginRight() - tmp->GetMarginRight();
751
752 if( GetMarginBottom() != tmp->GetMarginBottom() )
753 return GetMarginBottom() - tmp->GetMarginBottom();
754
755 return 0;
756}
757
758
759static struct SCH_TEXTBOX_DESC
760{
762 {
765
772
773 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Shape" ) );
774 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Corner Radius" ) );
775
776 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Width" ) );
777 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Height" ) );
778 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Thickness" ) );
779
780 const wxString marginProps = _( "Margins" );
781
782 propMgr.AddProperty( new PROPERTY<SCH_TEXTBOX, int>( _HKI( "Margin Left" ),
784 marginProps );
785 propMgr.AddProperty( new PROPERTY<SCH_TEXTBOX, int>( _HKI( "Margin Top" ),
787 marginProps );
788 propMgr.AddProperty( new PROPERTY<SCH_TEXTBOX, int>( _HKI( "Margin Right" ),
790 marginProps );
791 propMgr.AddProperty( new PROPERTY<SCH_TEXTBOX, int>( _HKI( "Margin Bottom" ),
793 marginProps );
794
795 propMgr.AddProperty( new PROPERTY<SCH_TEXTBOX, int>( _HKI( "Text Size" ),
797 _HKI( "Text Properties" ) );
798
799 propMgr.Mask( TYPE_HASH( SCH_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Orientation" ) );
800 }
KICOMMON_API types::KiCadObjectType ToProtoEnum(KICAD_T aValue)
KICOMMON_API KICAD_T FromProtoEnum(types::KiCadObjectType aValue)
Definition api_enums.cpp:55
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:123
BITMAPS
A list of all bitmap identifiers.
BOX2< VECTOR2I > BOX2I
Definition box2.h:927
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:995
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition box2.h:553
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
Definition box2.h:143
constexpr size_type GetHeight() const
Definition box2.h:212
constexpr coord_type GetLeft() const
Definition box2.h:225
constexpr bool Contains(const Vec &aPoint) const
Definition box2.h:165
constexpr coord_type GetRight() const
Definition box2.h:214
constexpr coord_type GetTop() const
Definition box2.h:226
constexpr bool Intersects(const BOX2< Vec > &aRect) const
Definition box2.h:308
constexpr coord_type GetBottom() const
Definition box2.h:219
static const COLOR4D WHITE
Definition color4d.h:402
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Definition color4d.h:399
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:597
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
virtual void SetEnd(const VECTOR2I &aEnd)
Definition eda_shape.h:329
FILL_T GetFillMode() const
Definition eda_shape.h:148
void SetLineStyle(const LINE_STYLE aStyle)
void SetFillColor(const COLOR4D &aColor)
Definition eda_shape.h:160
VECTOR2I m_start
Definition eda_shape.h:747
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
Definition eda_shape.h:325
LINE_STYLE GetLineStyle() const
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
Definition eda_shape.h:275
COLOR4D GetFillColor() const
Definition eda_shape.h:159
VECTOR2I m_end
Definition eda_shape.h:748
virtual int GetWidth() const
Definition eda_shape.h:163
STROKE_PARAMS m_stroke
Definition eda_shape.h:734
virtual void SetWidth(int aWidth)
void SetFillMode(FILL_T aFill)
virtual void SetStart(const VECTOR2I &aStart)
Definition eda_shape.h:279
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition eda_text.h:94
virtual VECTOR2I GetTextSize() const
Definition eda_text.h:301
COLOR4D GetTextColor() const
Definition eda_text.h:310
bool IsItalic() const
Definition eda_text.h:200
bool IsMultilineAllowed() const
Definition eda_text.h:236
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition eda_text.h:118
bool IsKeepUpright() const
Definition eda_text.h:245
virtual int GetTextHeight() const
Definition eda_text.h:307
KIFONT::FONT * GetFont() const
Definition eda_text.h:286
void SetAttributes(const EDA_TEXT &aSrc, bool aSetPosition=true)
Set the text attributes from another instance.
Definition eda_text.cpp:389
wxString m_hyperlink
A hyperlink URL.
Definition eda_text.h:501
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:737
virtual bool HasHyperlink() const
Definition eda_text.h:442
virtual wxString GetShownText(RESOLUTION_CONTEXT aContext, int aDepth=0) const
Return the string actually shown after processing of the base text.
Definition eda_text.h:128
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
Definition eda_text.cpp:373
wxString GetHyperlink() const
Definition eda_text.h:443
virtual int GetTextWidth() const
Definition eda_text.h:304
GR_TEXT_H_ALIGN_T GetHorizJustify() const
Definition eda_text.h:239
bool HasTextVars() const
Indicates the ShownText has text var references which need to be processed.
Definition eda_text.h:139
bool containsURL() const
Definition eda_text.cpp:992
EDA_TEXT(const EDA_IU_SCALE &aIuScale, const wxString &aText=wxEmptyString)
Definition eda_text.cpp:98
wxString m_activeUrl
Definition eda_text.h:503
double GetLineSpacing() const
Definition eda_text.h:298
double Similarity(const EDA_TEXT &aOther) const
virtual EDA_ANGLE GetTextAngle() const
Definition eda_text.h:178
const TEXT_ATTRIBUTES & GetAttributes() const
Definition eda_text.h:270
bool IsMirrored() const
Definition eda_text.h:229
int GetEffectiveTextPenWidth(int aDefaultPenWidth=0) const
The EffectiveTextPenWidth uses the text thickness if > 1 or aDefaultPenWidth.
Definition eda_text.cpp:422
void SwapAttributes(EDA_TEXT &aTradingPartner)
Swap the text attributes of the two involved instances.
Definition eda_text.cpp:409
double GetTextAngleDegrees() const
Definition eda_text.h:185
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:914
bool IsBold() const
Definition eda_text.h:215
GR_TEXT_V_ALIGN_T GetVertJustify() const
Definition eda_text.h:242
virtual int GetTextThickness() const
Definition eda_text.h:159
virtual void SetText(const wxString &aText)
Definition eda_text.cpp:231
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
Definition eda_text.cpp:263
void SwapText(EDA_TEXT &aTradingPartner)
Definition eda_text.cpp:401
bool operator==(const EDA_TEXT &aRhs) const
Definition eda_text.h:438
void SetMultilineAllowed(bool aAllow)
Definition eda_text.cpp:357
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
Definition eda_text.cpp:365
FONT is an abstract base class for both outline and stroke fonts.
Definition font.h:94
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:143
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:609
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:101
std::shared_ptr< wxString > m_text
Definition color4d.h:396
COLOR4D & Desaturate()
Removes color (in HSL model)
Definition color4d.cpp:530
COLOR4D Mix(const COLOR4D &aColor, double aFactor) const
Return a color that is mixed with the input by a factor.
Definition color4d.h:292
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.
Definition kiid.h:46
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:617
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:303
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:859
void SetLocked(bool aLocked) override
Definition sch_item.h:256
SCH_RENDER_SETTINGS * getRenderSettings(PLOTTER *aPlotter) const
Definition sch_item.h:739
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:281
bool IsLocked() const override
Definition sch_item.cpp:158
bool IsPrivate() const
Definition sch_item.h:253
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition sch_item.h:345
const wxString & GetDefaultFont(const RENDER_SETTINGS *aSettings) const
Definition sch_item.cpp:802
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
Definition sch_item.cpp:52
wxString ResolveText(const wxString &aText, const SCH_SHEET_PATH *aPath, int aDepth=0) const
Definition sch_item.cpp:390
const KIFONT::METRICS & GetFontMetrics() const
Definition sch_item.cpp:815
int GetEffectivePenWidth(const SCH_RENDER_SETTINGS *aSettings) const
Definition sch_item.cpp:824
SCH_LAYER_ID m_layer
Definition sch_item.h:790
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:384
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 SetPosition(const VECTOR2I &aPos) override
Definition sch_shape.h:87
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:89
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:41
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:57
VECTOR2I GetPosition() const override
Definition sch_shape.h:86
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:77
int GetMarginBottom() const
Definition sch_textbox.h:82
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
bool m_excludedFromSim
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:79
int GetSchTextSize() const
Definition sch_textbox.h:84
bool GetExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
virtual wxString GetShownText(const RENDER_SETTINGS *aSettings, const SCH_SHEET_PATH *aPath, RESOLUTION_CONTEXT aContext, int aDepth=0) const
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 Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
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:81
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
VECTOR2I GetMinSize() const
Return the minimum height needed to contain the textbox's wrapped text content plus margins.
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:80
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
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:74
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:76
void SetSchTextSize(int aSize)
Definition sch_textbox.h:85
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 SetExcludedFromSim(bool aExclude, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
void SetMarginTop(int aTop)
Definition sch_textbox.h:75
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
KIGFX::COLOR4D GetColor() const
KIGFX::COLOR4D m_Color
GR_TEXT_H_ALIGN_T m_Halign
GR_TEXT_V_ALIGN_T m_Valign
KIFONT::FONT * m_Font
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
for transforming drawing coordinates for a wxDC device context.
Definition transform.h:42
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
void FinalizeTextVarExpansion(wxString &aText, RESOLUTION_CONTEXT aContext)
Definition common.cpp:88
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:333
RESOLUTION_CONTEXT
Definition common.h:87
@ FOR_GUI
Definition common.h:89
@ FOR_CANVAS
Definition common.h:88
@ RAW_VALUE
Definition common.h:94
#define _(s)
@ DEGREES_T
Definition eda_angle.h:31
static constexpr EDA_ANGLE ANGLE_VERTICAL
Definition eda_angle.h:419
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
Definition eda_angle.h:418
FILL_T
Definition eda_fill.h:29
SHAPE_T
Definition eda_shape.h:54
a few functions useful in geometry calculations.
SCH_LAYER_ID
Eeschema drawing layers.
Definition layer_ids.h:471
@ LAYER_DEVICE
Definition layer_ids.h:488
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.
KICOMMON_API void PackColor(types::Color &aOutput, const KIGFX::COLOR4D &aInput)
KICOMMON_API int UnpackDistance(const types::Distance &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API KIGFX::COLOR4D UnpackColor(const types::Color &aInput)
KICOMMON_API void PackCustomProperties(google::protobuf::RepeatedPtrField< types::CustomProperty > *aOutput, const EDA_ITEM &aItem)
KICOMMON_API VECTOR2I UnpackVector2(const types::Vector2 &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void PackDistance(types::Distance &aOutput, int aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void PackVector2(types::Vector2 &aOutput, const VECTOR2I &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void UnpackCustomProperties(const google::protobuf::RepeatedPtrField< types::CustomProperty > &aInput, EDA_ITEM &aItem)
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
Definition eda_angle.h:411
#define _HKI(x)
Definition page_info.cpp:40
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:70
@ SCH_TABLECELL_T
Definition typeinfo.h:162
@ SCH_TEXTBOX_T
Definition typeinfo.h:148
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:683