KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pcb_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 <pcb_edit_frame.h>
26#include <base_units.h>
27#include <bitmaps.h>
28#include <board.h>
30#include <footprint.h>
31#include <pcb_textbox.h>
32#include <pcb_painter.h>
33#include <trigo.h>
34#include <string_utils.h>
36#include <geometry/shape_rect.h>
38#include <callback_gal.h>
40#include <macros.h>
41#include <core/ignore.h>
42#include <api/api_enums.h>
43#include <api/api_utils.h>
44#include <api/board/board_types.pb.h>
45
46
48 PCB_SHAPE( aParent, aType, SHAPE_T::RECTANGLE ),
50 m_borderEnabled( true )
51{
54 SetMultilineAllowed( true );
55
56 int defaultMargin = GetLegacyTextMargin();
57 m_marginLeft = defaultMargin;
58 m_marginTop = defaultMargin;
59 m_marginRight = defaultMargin;
60 m_marginBottom = defaultMargin;
61}
62
63
67
68
69void PCB_TEXTBOX::CopyFrom( const BOARD_ITEM* aOther )
70{
71 wxCHECK( aOther && aOther->Type() == PCB_TEXTBOX_T, /* void */ );
72 *this = *static_cast<const PCB_TEXTBOX*>( aOther );
73}
74
75
76void PCB_TEXTBOX::Serialize( google::protobuf::Any& aContainer ) const
77{
78 using namespace kiapi::common::types;
79 using namespace kiapi::board;
80 types::BoardTextBox boardText;
82 boardText.mutable_id()->set_value( m_Uuid.AsStdString() );
83 boardText.set_locked( IsLocked() ? LockedState::LS_LOCKED : LockedState::LS_UNLOCKED );
84
85 TextBox& text = *boardText.mutable_textbox();
86
87 kiapi::common::PackVector2( *text.mutable_top_left(), GetPosition() );
88 kiapi::common::PackVector2( *text.mutable_bottom_right(), GetEnd() );
89 text.set_text( GetText().ToStdString() );
90 //text.set_hyperlink( GetHyperlink().ToStdString() );
91
92 TextAttributes* attrs = text.mutable_attributes();
93
94 if( GetFont() )
95 attrs->set_font_name( GetFont()->GetName().ToStdString() );
96
97 attrs->set_horizontal_alignment( ToProtoEnum<GR_TEXT_H_ALIGN_T, HorizontalAlignment>( GetHorizJustify() ) );
98
99 attrs->set_vertical_alignment( ToProtoEnum<GR_TEXT_V_ALIGN_T, VerticalAlignment>( GetVertJustify() ) );
100
101 attrs->mutable_angle()->set_value_degrees( GetTextAngleDegrees() );
102 attrs->set_line_spacing( GetLineSpacing() );
103 attrs->mutable_stroke_width()->set_value_nm( GetTextThickness() );
104 attrs->set_italic( IsItalic() );
105 attrs->set_bold( IsBold() );
106 attrs->set_underlined( GetAttributes().m_Underlined );
107 attrs->set_mirrored( IsMirrored() );
108 attrs->set_multiline( IsMultilineAllowed() );
109 attrs->set_keep_upright( IsKeepUpright() );
110 kiapi::common::PackVector2( *attrs->mutable_size(), GetTextSize() );
111
112 aContainer.PackFrom( boardText );
113}
114
115
116bool PCB_TEXTBOX::Deserialize( const google::protobuf::Any& aContainer )
117{
118 using namespace kiapi::board;
119 types::BoardTextBox boardText;
120
121 if( !aContainer.UnpackTo( &boardText ) )
122 return false;
123
124 const_cast<KIID&>( m_Uuid ) = KIID( boardText.id().value() );
126 SetLocked( boardText.locked() == kiapi::common::types::LockedState::LS_LOCKED );
127
128 const kiapi::common::types::TextBox& text = boardText.textbox();
129
131 SetEnd( kiapi::common::UnpackVector2( text.bottom_right() ) );
132 SetText( wxString( text.text().c_str(), wxConvUTF8 ) );
133 //SetHyperlink( wxString::FromUTF8( text.hyperlink() );
134
135 if( text.has_attributes() )
136 {
138
139 attrs.m_Bold = text.attributes().bold();
140 attrs.m_Italic = text.attributes().italic();
141 attrs.m_Underlined = text.attributes().underlined();
142 attrs.m_Mirrored = text.attributes().mirrored();
143 attrs.m_Multiline = text.attributes().multiline();
144 attrs.m_KeepUpright = text.attributes().keep_upright();
145 attrs.m_Size = kiapi::common::UnpackVector2( text.attributes().size() );
146
147 if( !text.attributes().font_name().empty() )
148 {
149 attrs.m_Font = KIFONT::FONT::GetFont( wxString( text.attributes().font_name().c_str(), wxConvUTF8 ),
150 attrs.m_Bold, attrs.m_Italic );
151 }
152
153 attrs.m_Angle = EDA_ANGLE( text.attributes().angle().value_degrees(), DEGREES_T );
154 attrs.m_LineSpacing = text.attributes().line_spacing();
155 attrs.m_StrokeWidth = text.attributes().stroke_width().value_nm();
157 text.attributes().horizontal_alignment() );
158
160 text.attributes().vertical_alignment() );
161
162 SetAttributes( attrs );
163 }
164
165 return true;
166}
167
168
169void PCB_TEXTBOX::StyleFromSettings( const BOARD_DESIGN_SETTINGS& settings, bool aCheckSide )
170{
171 PCB_SHAPE::StyleFromSettings( settings, aCheckSide );
172
173 SetTextSize( settings.GetTextSize( GetLayer() ) );
175 SetItalic( settings.GetTextItalic( GetLayer() ) );
176
177 if( GetParentFootprint() )
178 SetKeepUpright( settings.GetTextUpright( GetLayer() ) );
179
180 if( aCheckSide )
181 {
182 if( BOARD* board = GetBoard() )
183 SetMirrored( board->IsBackLayer( GetLayer() ) );
184 else
186 }
187}
188
189
191{
192 return KiROUND( GetStroke().GetWidth() / 2.0 ) + KiROUND( GetTextSize().y * 0.75 );
193}
194
195
197{
198 EDA_ANGLE rotation = GetDrawRotation();
199
200 if( rotation == ANGLE_90 )
201 return VECTOR2I( GetStartX(), GetEndY() );
202 else if( rotation == ANGLE_180 )
203 return GetEnd();
204 else if( rotation == ANGLE_270 )
205 return VECTOR2I( GetEndX(), GetStartY() );
206 else
207 return GetStart();
208}
209
210
212{
213 EDA_ANGLE rotation = GetDrawRotation();
214
215 if( rotation == ANGLE_90 )
216 return VECTOR2I( GetEndX(), GetStartY() );
217 else if( rotation == ANGLE_180 )
218 return GetStart();
219 else if( rotation == ANGLE_270 )
220 return VECTOR2I( GetStartX(), GetEndY() );
221 else
222 return GetEnd();
223}
224
225
226void PCB_TEXTBOX::SetTop( int aVal )
227{
228 EDA_ANGLE rotation = GetDrawRotation();
229
230 if( rotation == ANGLE_90 || rotation == ANGLE_180 )
231 SetEndY( aVal );
232 else
233 SetStartY( aVal );
234}
235
236
238{
239 EDA_ANGLE rotation = GetDrawRotation();
240
241 if( rotation == ANGLE_90 || rotation == ANGLE_180 )
242 SetStartY( aVal );
243 else
244 SetEndY( aVal );
245}
246
247
248void PCB_TEXTBOX::SetLeft( int aVal )
249{
250 EDA_ANGLE rotation = GetDrawRotation();
251
252 if( rotation == ANGLE_180 || rotation == ANGLE_270 )
253 SetEndX( aVal );
254 else
255 SetStartX( aVal );
256}
257
258
259void PCB_TEXTBOX::SetRight( int aVal )
260{
261 EDA_ANGLE rotation = GetDrawRotation();
262
263 if( rotation == ANGLE_180 || rotation == ANGLE_270 )
264 SetStartX( aVal );
265 else
266 SetEndX( aVal );
267}
268
269
271{
272 EDA_ANGLE delta = aAngle.Normalized() - GetTextAngle();
274}
275
276
278{
279 return GetDrawPos( false );
280}
281
282
283VECTOR2I PCB_TEXTBOX::GetDrawPos( bool aIsFlipped ) const
284{
285 EDA_ANGLE drawAngle = GetDrawRotation();
286 std::vector<VECTOR2I> corners = GetCornersInSequence( drawAngle );
287 GR_TEXT_H_ALIGN_T horizontalAlignment = GetHorizJustify();
288 GR_TEXT_V_ALIGN_T verticalAlignment = GetVertJustify();
289 VECTOR2I textAnchor;
290 VECTOR2I offset;
291
292 // Calculate midpoints
293 VECTOR2I midTop = ( corners[0] + corners[1] ) / 2;
294 VECTOR2I midBottom = ( corners[3] + corners[2] ) / 2;
295 VECTOR2I midLeft = ( corners[0] + corners[3] ) / 2;
296 VECTOR2I midRight = ( corners[1] + corners[2] ) / 2;
297 VECTOR2I center = ( corners[0] + corners[1] + corners[2] + corners[3] ) / 4;
298
299 if( IsMirrored() != aIsFlipped )
300 {
301 switch( GetHorizJustify() )
302 {
303 case GR_TEXT_H_ALIGN_LEFT: horizontalAlignment = GR_TEXT_H_ALIGN_RIGHT; break;
304 case GR_TEXT_H_ALIGN_CENTER: horizontalAlignment = GR_TEXT_H_ALIGN_CENTER; break;
305 case GR_TEXT_H_ALIGN_RIGHT: horizontalAlignment = GR_TEXT_H_ALIGN_LEFT; break;
306 case GR_TEXT_H_ALIGN_INDETERMINATE: horizontalAlignment = GR_TEXT_H_ALIGN_INDETERMINATE; break;
307 }
308 }
309
310 wxASSERT_MSG( horizontalAlignment != GR_TEXT_H_ALIGN_INDETERMINATE
311 && verticalAlignment != GR_TEXT_V_ALIGN_INDETERMINATE,
312 wxS( "Indeterminate state legal only in dialogs. Horizontal and vertical alignment "
313 "must be set before calling PCB_TEXTBOX::GetDrawPos." ) );
314
315 if( horizontalAlignment == GR_TEXT_H_ALIGN_INDETERMINATE || verticalAlignment == GR_TEXT_V_ALIGN_INDETERMINATE )
316 {
317 return center;
318 }
319
320 if( horizontalAlignment == GR_TEXT_H_ALIGN_LEFT && verticalAlignment == GR_TEXT_V_ALIGN_TOP )
321 {
322 textAnchor = corners[0];
323 }
324 else if( horizontalAlignment == GR_TEXT_H_ALIGN_CENTER && verticalAlignment == GR_TEXT_V_ALIGN_TOP )
325 {
326 textAnchor = midTop;
327 }
328 else if( horizontalAlignment == GR_TEXT_H_ALIGN_RIGHT && verticalAlignment == GR_TEXT_V_ALIGN_TOP )
329 {
330 textAnchor = corners[1];
331 }
332 else if( horizontalAlignment == GR_TEXT_H_ALIGN_LEFT && verticalAlignment == GR_TEXT_V_ALIGN_CENTER )
333 {
334 textAnchor = midLeft;
335 }
336 else if( horizontalAlignment == GR_TEXT_H_ALIGN_CENTER && verticalAlignment == GR_TEXT_V_ALIGN_CENTER )
337 {
338 textAnchor = center;
339 }
340 else if( horizontalAlignment == GR_TEXT_H_ALIGN_RIGHT && verticalAlignment == GR_TEXT_V_ALIGN_CENTER )
341 {
342 textAnchor = midRight;
343 }
344 else if( horizontalAlignment == GR_TEXT_H_ALIGN_LEFT && verticalAlignment == GR_TEXT_V_ALIGN_BOTTOM )
345 {
346 textAnchor = corners[3];
347 }
348 else if( horizontalAlignment == GR_TEXT_H_ALIGN_CENTER && verticalAlignment == GR_TEXT_V_ALIGN_BOTTOM )
349 {
350 textAnchor = midBottom;
351 }
352 else if( horizontalAlignment == GR_TEXT_H_ALIGN_RIGHT && verticalAlignment == GR_TEXT_V_ALIGN_BOTTOM )
353 {
354 textAnchor = corners[2];
355 }
356
357 int marginLeft = GetMarginLeft();
358 int marginRight = GetMarginRight();
359 int marginTop = GetMarginTop();
360 int marginBottom = GetMarginBottom();
361
362 if( horizontalAlignment == GR_TEXT_H_ALIGN_LEFT )
363 offset.x = marginLeft;
364 else if( horizontalAlignment == GR_TEXT_H_ALIGN_RIGHT )
365 offset.x = -marginRight;
366
367 if( verticalAlignment == GR_TEXT_V_ALIGN_TOP )
368 offset.y = marginTop;
369 else if( verticalAlignment == GR_TEXT_V_ALIGN_BOTTOM )
370 offset.y = -marginBottom;
371
372 RotatePoint( offset, GetDrawRotation() );
373 return textAnchor + offset;
374}
375
376
377double PCB_TEXTBOX::ViewGetLOD( int aLayer, const KIGFX::VIEW* aView ) const
378{
379 KIGFX::PCB_PAINTER& painter = static_cast<KIGFX::PCB_PAINTER&>( *aView->GetPainter() );
380 KIGFX::PCB_RENDER_SETTINGS& renderSettings = *painter.GetSettings();
381
382 if( aLayer == LAYER_LOCKED_ITEM_SHADOW )
383 {
384 // Hide shadow if the main layer is not shown
385 if( !aView->IsLayerVisible( m_layer ) )
386 return LOD_HIDE;
387
388 // Hide shadow on dimmed tracks
389 if( renderSettings.GetHighContrast() )
390 {
391 if( m_layer != renderSettings.GetPrimaryHighContrastLayer() )
392 return LOD_HIDE;
393 }
394 }
395
396 return LOD_SHOW;
397}
398
399
400std::vector<int> PCB_TEXTBOX::ViewGetLayers() const
401{
404
405 return { GetLayer() };
406}
407
408
409wxString PCB_TEXTBOX::GetShownText( bool aAllowExtraText, int aDepth ) const
410{
411 const FOOTPRINT* parentFootprint = GetParentFootprint();
412 const BOARD* board = GetBoard();
413
414 std::function<bool( wxString* )> resolver = [&]( wxString* token ) -> bool
415 {
416 if( token->IsSameAs( wxT( "LAYER" ) ) )
417 {
418 *token = GetLayerName();
419 return true;
420 }
421
422 if( parentFootprint && parentFootprint->ResolveTextVar( token, aDepth + 1 ) )
423 return true;
424
425 if( board->ResolveTextVar( token, aDepth + 1 ) )
426 return true;
427
428 return false;
429 };
430
431 wxString text = EDA_TEXT::GetShownText( aAllowExtraText, aDepth );
432
433 if( HasTextVars() )
434 text = ResolveTextVars( text, &resolver, aDepth );
435
436 KIFONT::FONT* font = GetDrawFont( nullptr );
437 EDA_ANGLE drawAngle = GetDrawRotation();
438 std::vector<VECTOR2I> corners = GetCornersInSequence( drawAngle );
439 int colWidth = ( corners[1] - corners[0] ).EuclideanNorm();
440
441 if( GetTextAngle().IsHorizontal() )
442 colWidth -= ( GetMarginLeft() + GetMarginRight() );
443 else
444 colWidth -= ( GetMarginTop() + GetMarginBottom() );
445
446 font->LinebreakText( text, colWidth, GetTextSize(), GetTextThickness(), IsBold(), IsItalic() );
447
448 // Convert escape markers back to literal ${} and @{} for final display
449 text.Replace( wxT( "<<<ESC_DOLLAR:" ), wxT( "${" ) );
450 text.Replace( wxT( "<<<ESC_AT:" ), wxT( "@{" ) );
451
452 return text;
453}
454
455
456bool PCB_TEXTBOX::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const
457{
458 return BOARD_ITEM::Matches( UnescapeString( GetText() ), aSearchData );
459}
460
461
462void PCB_TEXTBOX::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
463{
464 // Don't use GetShownText() here; we want to show the user the variable references
465 aList.emplace_back( _( "Text Box" ), KIUI::EllipsizeStatusText( aFrame, GetText() ) );
466
467 if( aFrame->GetName() == PCB_EDIT_FRAME_NAME && IsLocked() )
468 aList.emplace_back( _( "Status" ), _( "Locked" ) );
469
470 aList.emplace_back( _( "Layer" ), GetLayerName() );
471 aList.emplace_back( _( "Mirror" ), IsMirrored() ? _( "Yes" ) : _( "No" ) );
472 aList.emplace_back( _( "Angle" ), wxString::Format( "%g", GetTextAngle().AsDegrees() ) );
473
474 aList.emplace_back( _( "Font" ), GetFont() ? GetFont()->GetName() : _( "Default" ) );
475
476 if( GetTextThickness() )
477 aList.emplace_back( _( "Text Thickness" ), aFrame->MessageTextFromValue( GetEffectiveTextPenWidth() ) );
478 else
479 aList.emplace_back( _( "Text Thickness" ), _( "Auto" ) );
480
481 aList.emplace_back( _( "Text Width" ), aFrame->MessageTextFromValue( GetTextWidth() ) );
482 aList.emplace_back( _( "Text Height" ), aFrame->MessageTextFromValue( GetTextHeight() ) );
483
484 aList.emplace_back( _( "Box Width" ), aFrame->MessageTextFromValue( std::abs( GetEnd().x - GetStart().x ) ) );
485
486 aList.emplace_back( _( "Box Height" ), aFrame->MessageTextFromValue( std::abs( GetEnd().y - GetStart().y ) ) );
487
488 m_stroke.GetMsgPanelInfo( aFrame, aList );
489}
490
491
492void PCB_TEXTBOX::Move( const VECTOR2I& aMoveVector )
493{
494 PCB_SHAPE::Move( aMoveVector );
495 EDA_TEXT::Offset( aMoveVector );
496}
497
498
499void PCB_TEXTBOX::Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle )
500{
501 PCB_SHAPE::Rotate( aRotCentre, aAngle );
503
504 if( GetTextAngle().IsCardinal() && GetShape() != SHAPE_T::RECTANGLE )
505 {
506 // To convert the polygon to its equivalent rectangle, we use GetCornersInSequence( drawAngle )
507 // but this method uses the polygon bounding box.
508 // set the line thickness to 0 to get the actual rectangle corner
509 int lineWidth = GetWidth();
510 SetWidth( 0 );
511 EDA_ANGLE drawAngle = GetDrawRotation();
512 std::vector<VECTOR2I> corners = GetCornersInSequence( drawAngle );
513 SetWidth( lineWidth );
514 VECTOR2I diag = corners[2] - corners[0];
515 EDA_ANGLE angle = GetTextAngle();
516
518 SetStart( corners[0] );
519
520 if( angle == ANGLE_90 )
521 SetEnd( VECTOR2I( corners[0].x + abs( diag.x ), corners[0].y - abs( diag.y ) ) );
522 else if( angle == ANGLE_180 )
523 SetEnd( VECTOR2I( corners[0].x - abs( diag.x ), corners[0].y - abs( diag.y ) ) );
524 else if( angle == ANGLE_270 )
525 SetEnd( VECTOR2I( corners[0].x - abs( diag.x ), corners[0].y + abs( diag.y ) ) );
526 else
527 SetEnd( VECTOR2I( corners[0].x + abs( diag.x ), corners[0].y + abs( diag.y ) ) );
528 }
529}
530
531
532void PCB_TEXTBOX::Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
533{
534 // the position and angle are mirrored, but not the text (or its justification)
535 PCB_SHAPE::Mirror( aCentre, aFlipDirection );
536
537 if( aFlipDirection == FLIP_DIRECTION::LEFT_RIGHT )
539 else
541}
542
543
544void PCB_TEXTBOX::Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
545{
546 PCB_SHAPE::Flip( aCentre, aFlipDirection );
547
548 if( aFlipDirection == FLIP_DIRECTION::LEFT_RIGHT )
550 else
552
553 if( IsSideSpecific() )
555}
556
557
558bool PCB_TEXTBOX::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
559{
560 BOX2I rect = GetBoundingBox();
561
562 rect.Inflate( aAccuracy );
563
564 return rect.Contains( aPosition );
565}
566
567
568bool PCB_TEXTBOX::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
569{
570 BOX2I rect = aRect;
571
572 rect.Inflate( aAccuracy );
573
574 if( aContained )
575 return rect.Contains( GetBoundingBox() );
576
577 return rect.Intersects( GetBoundingBox() );
578}
579
580
581bool PCB_TEXTBOX::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
582{
583 return PCB_SHAPE::HitTest( aPoly, aContained );
584}
585
586
587wxString PCB_TEXTBOX::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
588{
589 return wxString::Format( _( "PCB text box '%s' on %s" ),
590 aFull ? GetShownText( false ) : KIUI::EllipsizeMenuText( GetText() ), GetLayerName() );
591}
592
593
598
599
601{
602 return new PCB_TEXTBOX( *this );
603}
604
605
607{
608 wxASSERT( aImage->Type() == PCB_TEXTBOX_T );
609
610 std::swap( *( (PCB_TEXTBOX*) this ), *( (PCB_TEXTBOX*) aImage ) );
611}
612
613
614std::shared_ptr<SHAPE> PCB_TEXTBOX::GetEffectiveShape( PCB_LAYER_ID aLayer, FLASHING aFlash ) const
615{
616 std::shared_ptr<SHAPE_COMPOUND> shape = GetEffectiveTextShape();
617
618 if( PCB_SHAPE::GetStroke().GetWidth() >= 0 )
619 shape->AddShape( PCB_SHAPE::GetEffectiveShape( aLayer, aFlash ) );
620
621 return shape;
622}
623
624
625void PCB_TEXTBOX::TransformTextToPolySet( SHAPE_POLY_SET& aBuffer, int aClearance, int aMaxError,
626 ERROR_LOC aErrorLoc ) const
627{
629 KIFONT::FONT* font = GetDrawFont( nullptr );
630 int penWidth = GetEffectiveTextPenWidth();
632 wxString shownText = GetShownText( true );
633
634 // The polygonal shape of a text can have many basic shapes, so combining these shapes can
635 // be very useful to create a final shape with a lot less vertices to speedup calculations.
636 // Simplify shapes is not usually always efficient, but in this case it is.
637 SHAPE_POLY_SET textShape;
638
639 CALLBACK_GAL callback_gal(
640 empty_opts,
641 // Stroke callback
642 [&]( const VECTOR2I& aPt1, const VECTOR2I& aPt2 )
643 {
644 TransformOvalToPolygon( textShape, aPt1, aPt2, penWidth, aMaxError, aErrorLoc );
645 },
646 // Triangulation callback
647 [&]( const VECTOR2I& aPt1, const VECTOR2I& aPt2, const VECTOR2I& aPt3 )
648 {
649 textShape.NewOutline();
650
651 for( const VECTOR2I& point : { aPt1, aPt2, aPt3 } )
652 textShape.Append( point.x, point.y );
653 } );
654
655 if( auto* cache = GetRenderCache( font, shownText ) )
656 callback_gal.DrawGlyphs( *cache );
657 else
658 font->Draw( &callback_gal, shownText, GetDrawPos(), attrs, GetFontMetrics() );
659
660 textShape.Simplify();
661
662 if( IsKnockout() )
663 {
664 SHAPE_POLY_SET finalPoly;
665
666 TransformShapeToPolygon( finalPoly, GetLayer(), aClearance, aMaxError, aErrorLoc );
667 finalPoly.BooleanSubtract( textShape );
668
669 aBuffer.Append( finalPoly );
670 }
671 else
672 {
673 if( aClearance > 0 || aErrorLoc == ERROR_OUTSIDE )
674 {
675 if( aErrorLoc == ERROR_OUTSIDE )
676 aClearance += aMaxError;
677
678 textShape.Inflate( aClearance, CORNER_STRATEGY::ROUND_ALL_CORNERS, aMaxError, true );
679 }
680
681 aBuffer.Append( textShape );
682 }
683}
684
685
686void PCB_TEXTBOX::TransformShapeToPolygon( SHAPE_POLY_SET& aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aMaxError,
687 ERROR_LOC aErrorLoc, bool aIgnoreLineWidth ) const
688{
689 // Don't use PCB_SHAPE::TransformShapeToPolygon. We want to treat the textbox as filled even
690 // if there's no background colour.
691
692 int width = GetWidth() + ( 2 * aClearance );
693
695 {
696 std::vector<VECTOR2I> pts = GetRectCorners();
697
698 aBuffer.NewOutline();
699
700 for( const VECTOR2I& pt : pts )
701 aBuffer.Append( pt );
702
703 if( m_borderEnabled && width > 0 )
704 {
705 // Add in segments
706 TransformOvalToPolygon( aBuffer, pts[0], pts[1], width, aMaxError, aErrorLoc );
707 TransformOvalToPolygon( aBuffer, pts[1], pts[2], width, aMaxError, aErrorLoc );
708 TransformOvalToPolygon( aBuffer, pts[2], pts[3], width, aMaxError, aErrorLoc );
709 TransformOvalToPolygon( aBuffer, pts[3], pts[0], width, aMaxError, aErrorLoc );
710 }
711 }
712 else if( GetShape() == SHAPE_T::POLY ) // Non-cardinally-rotated rect
713 {
714 aBuffer.NewOutline();
715
716 const SHAPE_LINE_CHAIN& poly = m_poly.Outline( 0 );
717
718 for( int ii = 0; ii < poly.PointCount(); ++ii )
719 aBuffer.Append( poly.GetPoint( ii ) );
720
721 if( m_borderEnabled && width > 0 )
722 {
723 for( int ii = 0; ii < poly.SegmentCount(); ++ii )
724 {
725 const SEG& seg = poly.GetSegment( ii );
726 TransformOvalToPolygon( aBuffer, seg.A, seg.B, width, aMaxError, aErrorLoc );
727 }
728 }
729 }
730}
731
732
734{
735 return m_borderEnabled;
736}
737
738
740{
741 m_borderEnabled = enabled;
742}
743
744
745void PCB_TEXTBOX::SetBorderWidth( const int aSize )
746{
747 m_stroke.SetWidth( aSize );
748}
749
750
751bool PCB_TEXTBOX::operator==( const BOARD_ITEM& aBoardItem ) const
752{
753 if( aBoardItem.Type() != Type() )
754 return false;
755
756 const PCB_TEXTBOX& other = static_cast<const PCB_TEXTBOX&>( aBoardItem );
757
758 return *this == other;
759}
760
761
762bool PCB_TEXTBOX::operator==( const PCB_TEXTBOX& aOther ) const
763{
764 return m_borderEnabled == aOther.m_borderEnabled && EDA_TEXT::operator==( aOther );
765}
766
767
768double PCB_TEXTBOX::Similarity( const BOARD_ITEM& aBoardItem ) const
769{
770 if( aBoardItem.Type() != Type() )
771 return 0.0;
772
773 const PCB_TEXTBOX& other = static_cast<const PCB_TEXTBOX&>( aBoardItem );
774
775 double similarity = 1.0;
776
777 if( m_borderEnabled != other.m_borderEnabled )
778 similarity *= 0.9;
779
780 if( GetMarginLeft() != other.GetMarginLeft() )
781 similarity *= 0.9;
782
783 if( GetMarginTop() != other.GetMarginTop() )
784 similarity *= 0.9;
785
786 if( GetMarginRight() != other.GetMarginRight() )
787 similarity *= 0.9;
788
789 if( GetMarginBottom() != other.GetMarginBottom() )
790 similarity *= 0.9;
791
792 similarity *= EDA_TEXT::Similarity( other );
793
794 return similarity;
795}
796
797
798static struct PCB_TEXTBOX_DESC
799{
801 {
803
804 if( lineStyleEnum.Choices().GetCount() == 0 )
805 {
806 lineStyleEnum.Map( LINE_STYLE::SOLID, _HKI( "Solid" ) )
807 .Map( LINE_STYLE::DASH, _HKI( "Dashed" ) )
808 .Map( LINE_STYLE::DOT, _HKI( "Dotted" ) )
809 .Map( LINE_STYLE::DASHDOT, _HKI( "Dash-Dot" ) )
810 .Map( LINE_STYLE::DASHDOTDOT, _HKI( "Dash-Dot-Dot" ) );
811 }
812
819
820 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Shape" ) );
821 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Start X" ) );
822 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Start Y" ) );
823 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "End X" ) );
824 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "End Y" ) );
825 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Width" ) );
826 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Height" ) );
827 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Line Width" ) );
828 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Line Style" ) );
829 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Filled" ) );
830 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Corner Radius" ) );
831
832 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Color" ) );
833
834 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( PCB_SHAPE ), _HKI( "Soldermask" ) );
835 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( PCB_SHAPE ), _HKI( "Soldermask Margin Override" ) );
836
839 _HKI( "Text Properties" ) );
840
841 const wxString borderProps = _( "Border Properties" );
842
843 void ( PCB_TEXTBOX::*lineStyleSetter )( LINE_STYLE ) = &PCB_TEXTBOX::SetLineStyle;
844 LINE_STYLE ( PCB_TEXTBOX::*lineStyleGetter )() const = &PCB_TEXTBOX::GetLineStyle;
845
848 borderProps );
849
850 propMgr.AddProperty(
851 new PROPERTY_ENUM<PCB_TEXTBOX, LINE_STYLE>( _HKI( "Border Style" ), lineStyleSetter, lineStyleGetter ),
852 borderProps );
853
856 borderProps );
857
858 const wxString marginProps = _( "Margins" );
859
862 marginProps );
865 marginProps );
868 marginProps );
871 marginProps );
872
873 propMgr.Mask( TYPE_HASH( PCB_TEXT ), TYPE_HASH( EDA_TEXT ), _HKI( "Hyperlink" ) );
874 }
types::KiCadObjectType ToProtoEnum(KICAD_T aValue)
Definition api_enums.cpp:97
KICAD_T FromProtoEnum(types::KiCadObjectType aValue)
Definition api_enums.cpp:36
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
@ ERROR_OUTSIDE
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:112
BITMAPS
A list of all bitmap identifiers.
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:990
Container for design settings for a BOARD object.
bool GetTextUpright(PCB_LAYER_ID aLayer) const
int GetTextThickness(PCB_LAYER_ID aLayer) const
Return the default text thickness from the layer class for the given layer.
bool GetTextItalic(PCB_LAYER_ID aLayer) const
VECTOR2I GetTextSize(PCB_LAYER_ID aLayer) const
Return the default text size from the layer class for the given layer.
BOARD_ITEM(BOARD_ITEM *aParent, KICAD_T idtype, PCB_LAYER_ID aLayer=F_Cu)
Definition board_item.h:85
void SetLocked(bool aLocked) override
Definition board_item.h:327
PCB_LAYER_ID m_layer
Definition board_item.h:458
virtual bool IsKnockout() const
Definition board_item.h:323
bool IsLocked() const override
virtual void SetIsKnockout(bool aKnockout)
Definition board_item.h:324
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
FOOTPRINT * GetParentFootprint() const
const KIFONT::METRICS & GetFontMetrics() const
bool IsSideSpecific() const
wxString GetLayerName() const
Return the name of the PCB layer on which the item resides.
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:322
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 bool Contains(const Vec &aPoint) const
Definition box2.h:168
constexpr bool Intersects(const BOX2< Vec > &aRect) const
Definition box2.h:311
EDA_ANGLE Normalized() const
Definition eda_angle.h:240
The base class for create windows for drawing purpose.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition eda_item.h:98
const KIID m_Uuid
Definition eda_item.h:516
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
virtual bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const
Compare the item against the search criteria in aSearchData.
Definition eda_item.h:401
void SetStartX(int x)
Definition eda_shape.h:191
int GetStartY() const
Definition eda_shape.h:174
void SetEndY(int aY)
Definition eda_shape.h:226
int GetEndX() const
Definition eda_shape.h:217
void SetLineStyle(const LINE_STYLE aStyle)
void SetStartY(int y)
Definition eda_shape.h:184
std::vector< VECTOR2I > GetCornersInSequence(EDA_ANGLE angle) const
SHAPE_T GetShape() const
Definition eda_shape.h:168
int GetEndY() const
Definition eda_shape.h:216
void SetEndX(int aX)
Definition eda_shape.h:233
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
LINE_STYLE GetLineStyle() const
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
Definition eda_shape.h:173
void SetShape(SHAPE_T aShape)
Definition eda_shape.h:167
std::vector< VECTOR2I > GetRectCorners() const
void SetEnd(const VECTOR2I &aEnd)
Definition eda_shape.h:219
int GetStartX() const
Definition eda_shape.h:175
SHAPE_POLY_SET m_poly
Definition eda_shape.h:515
STROKE_PARAMS m_stroke
Definition eda_shape.h:494
void SetWidth(int aWidth)
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
bool IsItalic() const
Definition eda_text.h:169
const EDA_ANGLE & GetTextAngle() const
Definition eda_text.h:147
void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
Definition eda_text.cpp:540
bool IsMultilineAllowed() const
Definition eda_text.h:197
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition eda_text.h:98
bool IsKeepUpright() const
Definition eda_text.h:206
KIFONT::FONT * GetFont() const
Definition eda_text.h:247
void SetAttributes(const EDA_TEXT &aSrc, bool aSetPosition=true)
Set the text attributes from another instance.
Definition eda_text.cpp:441
void SetMirrored(bool isMirrored)
Definition eda_text.cpp:401
std::vector< std::unique_ptr< KIFONT::GLYPH > > * GetRenderCache(const KIFONT::FONT *aFont, const wxString &forResolvedText, const VECTOR2I &aOffset={ 0, 0 }) const
Definition eda_text.cpp:691
virtual EDA_ANGLE GetDrawRotation() const
Definition eda_text.h:377
int GetTextWidth() const
Definition eda_text.h:264
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
Definition eda_text.cpp:425
void Offset(const VECTOR2I &aOffset)
Definition eda_text.cpp:602
GR_TEXT_H_ALIGN_T GetHorizJustify() const
Definition eda_text.h:200
virtual KIFONT::FONT * GetDrawFont(const RENDER_SETTINGS *aSettings) const
Definition eda_text.cpp:655
bool HasTextVars() const
Indicates the ShownText has text var references which need to be processed.
Definition eda_text.h:117
EDA_TEXT(const EDA_IU_SCALE &aIuScale, const wxString &aText=wxEmptyString)
Definition eda_text.cpp:97
double GetLineSpacing() const
Definition eda_text.h:258
double Similarity(const EDA_TEXT &aOther) const
void SetTextThickness(int aWidth)
The TextThickness is that set by the user.
Definition eda_text.cpp:292
const TEXT_ATTRIBUTES & GetAttributes() const
Definition eda_text.h:231
bool IsMirrored() const
Definition eda_text.h:190
int GetEffectiveTextPenWidth(int aDefaultPenWidth=0) const
The EffectiveTextPenWidth uses the text thickness if > 1 or aDefaultPenWidth.
Definition eda_text.cpp:473
double GetTextAngleDegrees() const
Definition eda_text.h:154
std::shared_ptr< SHAPE_COMPOUND > GetEffectiveTextShape(bool aTriangulate=true, const BOX2I &aBBox=BOX2I(), const EDA_ANGLE &aAngle=ANGLE_0) const
build a list of segments (SHAPE_SEGMENT) to describe a text shape.
bool IsBold() const
Definition eda_text.h:184
void SetKeepUpright(bool aKeepUpright)
Definition eda_text.cpp:433
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 SetText(const wxString &aText)
Definition eda_text.cpp:278
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
Definition eda_text.cpp:307
int GetTextThickness() const
Definition eda_text.h:128
void SetItalic(bool aItalic)
Set the text to be italic - this will also update the font if needed.
Definition eda_text.cpp:315
bool operator==(const EDA_TEXT &aRhs) const
Definition eda_text.h:396
void SetMultilineAllowed(bool aAllow)
Definition eda_text.cpp:409
VECTOR2I GetTextSize() const
Definition eda_text.h:261
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
Definition eda_text.cpp:417
ENUM_MAP & Map(T aValue, const wxString &aName)
Definition property.h:727
static ENUM_MAP< T > & Instance()
Definition property.h:721
wxPGChoices & Choices()
Definition property.h:770
bool ResolveTextVar(wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the component.
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 Draw(KIGFX::GAL *aGal, const wxString &aText, const VECTOR2I &aPosition, const VECTOR2I &aCursor, const TEXT_ATTRIBUTES &aAttributes, const METRICS &aFontMetrics) const
Draw a string.
Definition font.cpp:250
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:572
virtual void DrawGlyphs(const std::vector< std::unique_ptr< KIFONT::GLYPH > > &aGlyphs)
Draw polygons representing font glyphs.
Contains methods for drawing PCB-specific items.
virtual PCB_RENDER_SETTINGS * GetSettings() override
Return a pointer to current settings that are going to be used when drawing items.
PCB specific render settings.
Definition pcb_painter.h:82
PCB_LAYER_ID GetPrimaryHighContrastLayer() const
Return the board layer which is in high-contrast mode.
static constexpr double LOD_HIDE
Return this constant from ViewGetLOD() to hide the item unconditionally.
Definition view_item.h:180
static constexpr double LOD_SHOW
Return this constant from ViewGetLOD() to show the item unconditionally.
Definition view_item.h:185
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition view.h:66
bool IsLayerVisible(int aLayer) const
Return information about visibility of a particular layer.
Definition view.h:422
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition view.h:220
Definition kiid.h:49
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
Definition pcb_shape.h:121
virtual void Mirror(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Mirror this object relative to a given horizontal axis the layer is not changed.
void StyleFromSettings(const BOARD_DESIGN_SETTINGS &settings, bool aCheckSide) override
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
PCB_SHAPE(BOARD_ITEM *aParent, KICAD_T aItemType, SHAPE_T aShapeType)
Definition pcb_shape.cpp:51
int GetWidth() const override
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
Definition pcb_shape.h:123
std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const override
Make a set of SHAPE objects representing the PCB_SHAPE.
void SetPosition(const VECTOR2I &aPos) override
Definition pcb_shape.h:78
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
STROKE_PARAMS GetStroke() const override
Definition pcb_shape.h:91
void Move(const VECTOR2I &aMoveVector) override
Move this object.
void Normalize() override
Perform any normalization required after a user rotate and/or flip.
VECTOR2I GetPosition() const override
Definition pcb_shape.h:79
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
Definition pcb_shape.h:71
bool HitTest(const VECTOR2I &aPosition, int aAccuracy) const override
Test if aPosition is inside or on the boundary of this item.
virtual void swapData(BOARD_ITEM *aImage) override
void SetBorderWidth(const int aSize)
double Similarity(const BOARD_ITEM &aBoardItem) const override
Return a measure of how likely the other object is to represent the same object.
bool IsBorderEnabled() const
Disables the border, this is done by changing the stroke internally.
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
int GetMarginBottom() const
Definition pcb_textbox.h:92
void StyleFromSettings(const BOARD_DESIGN_SETTINGS &settings, bool aCheckSide) override
PCB_TEXTBOX(BOARD_ITEM *aParent, KICAD_T aType=PCB_TEXTBOX_T)
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc, bool aIgnoreLineWidth=false) const override
Convert the shape to a closed polygon.
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
bool m_borderEnabled
Controls drawing the border (as defined by the stroke members)
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
void SetBorderEnabled(bool enabled)
void Mirror(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Mirror this object relative to a given horizontal axis the layer is not changed.
void TransformTextToPolySet(SHAPE_POLY_SET &aBuffer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc) const
Function TransformTextToPolySet Convert the text to a polygonSet describing the actual character stro...
double ViewGetLOD(int aLayer, const KIGFX::VIEW *aView) const override
Return the level of detail (LOD) of the item.
EDA_ITEM * Clone() const override
Tests whether the border is disabled, as configured by the stroke.
std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const override
Make a set of SHAPE objects representing the PCB_SHAPE.
bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const override
Compare the item against the search criteria in aSearchData.
VECTOR2I GetDrawPos() const override
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
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 SetMarginTop(int aTop)
Definition pcb_textbox.h:85
void SetLeft(int aVal) override
int GetMarginLeft() const
Definition pcb_textbox.h:89
void SetMarginLeft(int aLeft)
Definition pcb_textbox.h:84
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
void SetMarginBottom(int aBottom)
Definition pcb_textbox.h:87
int GetMarginRight() const
Definition pcb_textbox.h:91
void SetRight(int aVal) override
std::vector< int > ViewGetLayers() const override
void SetTop(int aVal) override
int GetMarginTop() const
Definition pcb_textbox.h:90
wxString GetShownText(bool aAllowExtraText, int aDepth=0) const override
Return the string actually shown after processing of the base text.
void SetTextAngle(const EDA_ANGLE &aAngle) override
bool operator==(const PCB_TEXTBOX &aOther) const
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
void SetMarginRight(int aRight)
Definition pcb_textbox.h:86
void Move(const VECTOR2I &aMoveVector) override
Move this object.
int GetLegacyTextMargin() const
void SetBottom(int aVal) override
VECTOR2I GetTopLeft() const override
VECTOR2I GetBotRight() const override
void CopyFrom(const BOARD_ITEM *aOther) override
int GetBorderWidth() const
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.
Definition seg.h:42
VECTOR2I A
Definition seg.h:49
VECTOR2I B
Definition seg.h:50
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
virtual const VECTOR2I GetPoint(int aIndex) const override
int PointCount() const
Return the number of points (vertices) in this line chain.
virtual const SEG GetSegment(int aIndex) const override
int SegmentCount() const
Return the number of segments in this line chain.
Represent a set of closed polygons.
void Inflate(int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError, bool aSimplify=false)
Perform outline inflation/deflation.
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
void Simplify()
Simplify the polyset (merges overlapping polys, eliminates degeneracy/self-intersections)
int NewOutline()
Creates a new empty polygon in the set and returns its index.
void BooleanSubtract(const SHAPE_POLY_SET &b)
Perform boolean polyset difference.
GR_TEXT_H_ALIGN_T m_Halign
GR_TEXT_V_ALIGN_T m_Valign
KIFONT::FONT * m_Font
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:247
void TransformOvalToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aStart, const VECTOR2I &aEnd, int aWidth, int aError, ERROR_LOC aErrorLoc, int aMinSegCount=0)
Convert a oblong shape to a polygon, using multiple segments.
@ ROUND_ALL_CORNERS
All angles are rounded.
#define _(s)
static constexpr EDA_ANGLE ANGLE_90
Definition eda_angle.h:413
@ DEGREES_T
Definition eda_angle.h:31
static constexpr EDA_ANGLE ANGLE_270
Definition eda_angle.h:416
static constexpr EDA_ANGLE ANGLE_180
Definition eda_angle.h:415
#define PCB_EDIT_FRAME_NAME
SHAPE_T
Definition eda_shape.h:43
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
Definition eda_shape.h:46
static FILENAME_RESOLVER * resolver
a few functions useful in geometry calculations.
FLASHING
Enum used during connectivity building to ensure we do not query connectivity while building the data...
Definition layer_ids.h:184
bool IsBackLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a back layer.
Definition layer_ids.h:803
@ LAYER_LOCKED_ITEM_SHADOW
Shadow layer for locked items.
Definition layer_ids.h:307
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:60
This file contains miscellaneous commonly used macros and functions.
FLIP_DIRECTION
Definition mirror.h:27
@ LEFT_RIGHT
Flip left to right (around the Y axis)
Definition mirror.h:28
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 VECTOR2I UnpackVector2(const types::Vector2 &aInput)
Definition api_utils.cpp:86
KICOMMON_API void PackVector2(types::Vector2 &aOutput, const VECTOR2I &aInput)
Definition api_utils.cpp:79
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
Definition eda_angle.h:400
#define _HKI(x)
Definition page_info.cpp:44
static struct PCB_TEXTBOX_DESC _PCB_TEXTBOX_DESC
#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)
wxString UnescapeString(const wxString &aSource)
LINE_STYLE
Dashed line types.
VECTOR2I center
int delta
GR_TEXT_H_ALIGN_T
This is API surface mapped to common.types.HorizontalAlignment.
@ GR_TEXT_H_ALIGN_CENTER
@ GR_TEXT_H_ALIGN_RIGHT
@ GR_TEXT_H_ALIGN_LEFT
@ GR_TEXT_H_ALIGN_INDETERMINATE
GR_TEXT_V_ALIGN_T
This is API surface mapped to common.types.VertialAlignment.
@ GR_TEXT_V_ALIGN_BOTTOM
@ GR_TEXT_V_ALIGN_INDETERMINATE
@ GR_TEXT_V_ALIGN_CENTER
@ GR_TEXT_V_ALIGN_TOP
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
Definition trigo.cpp:229
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition typeinfo.h:78
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
Definition typeinfo.h:93
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695