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