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(
99
100 attrs->set_vertical_alignment(
102
103 attrs->mutable_angle()->set_value_degrees( GetTextAngleDegrees() );
104 attrs->set_line_spacing( GetLineSpacing() );
105 attrs->mutable_stroke_width()->set_value_nm( GetTextThickness() );
106 attrs->set_italic( IsItalic() );
107 attrs->set_bold( IsBold() );
108 attrs->set_underlined( GetAttributes().m_Underlined );
109 attrs->set_mirrored( IsMirrored() );
110 attrs->set_multiline( IsMultilineAllowed() );
111 attrs->set_keep_upright( IsKeepUpright() );
112 kiapi::common::PackVector2( *attrs->mutable_size(), GetTextSize() );
113
114 aContainer.PackFrom( boardText );
115}
116
117
118bool PCB_TEXTBOX::Deserialize( const google::protobuf::Any &aContainer )
119{
120 using namespace kiapi::board;
121 types::BoardTextBox boardText;
122
123 if( !aContainer.UnpackTo( &boardText ) )
124 return false;
125
126 const_cast<KIID&>( m_Uuid ) = KIID( boardText.id().value() );
128 SetLocked( boardText.locked() == kiapi::common::types::LockedState::LS_LOCKED );
129
130 const kiapi::common::types::TextBox& text = boardText.textbox();
131
133 SetEnd( kiapi::common::UnpackVector2( text.bottom_right() ) );
134 SetText( wxString( text.text().c_str(), wxConvUTF8 ) );
135 //SetHyperlink( wxString::FromUTF8( text.hyperlink() );
136
137 if( text.has_attributes() )
138 {
140
141 attrs.m_Bold = text.attributes().bold();
142 attrs.m_Italic = text.attributes().italic();
143 attrs.m_Underlined = text.attributes().underlined();
144 attrs.m_Mirrored = text.attributes().mirrored();
145 attrs.m_Multiline = text.attributes().multiline();
146 attrs.m_KeepUpright = text.attributes().keep_upright();
147 attrs.m_Size = kiapi::common::UnpackVector2( text.attributes().size() );
148
149 if( !text.attributes().font_name().empty() )
150 {
152 wxString( text.attributes().font_name().c_str(), wxConvUTF8 ), attrs.m_Bold,
153 attrs.m_Italic );
154 }
155
156 attrs.m_Angle = EDA_ANGLE( text.attributes().angle().value_degrees(), DEGREES_T );
157 attrs.m_LineSpacing = text.attributes().line_spacing();
158 attrs.m_StrokeWidth = text.attributes().stroke_width().value_nm();
159 attrs.m_Halign =
161 text.attributes().horizontal_alignment() );
162
164 text.attributes().vertical_alignment() );
165
166 SetAttributes( attrs );
167 }
168
169 return true;
170}
171
172
173void PCB_TEXTBOX::StyleFromSettings( const BOARD_DESIGN_SETTINGS& settings, bool aCheckSide )
174{
175 PCB_SHAPE::StyleFromSettings( settings, aCheckSide );
176
177 SetTextSize( settings.GetTextSize( GetLayer() ) );
179 SetItalic( settings.GetTextItalic( GetLayer() ) );
180
181 if( GetParentFootprint() )
182 SetKeepUpright( settings.GetTextUpright( GetLayer() ) );
183
184 if( aCheckSide )
185 {
186 if( BOARD* board = GetBoard() )
187 SetMirrored( board->IsBackLayer( GetLayer() ) );
188 else
190 }
191}
192
193
195{
196 return KiROUND( GetStroke().GetWidth() / 2.0 ) + KiROUND( GetTextSize().y * 0.75 );
197}
198
199
201{
202 EDA_ANGLE rotation = GetDrawRotation();
203
204 if( rotation == ANGLE_90 )
205 return VECTOR2I( GetStartX(), GetEndY() );
206 else if( rotation == ANGLE_180 )
207 return GetEnd();
208 else if( rotation == ANGLE_270 )
209 return VECTOR2I( GetEndX(), GetStartY() );
210 else
211 return GetStart();
212}
213
214
216{
217 EDA_ANGLE rotation = GetDrawRotation();
218
219 if( rotation == ANGLE_90 )
220 return VECTOR2I( GetEndX(), GetStartY() );
221 else if( rotation == ANGLE_180 )
222 return GetStart();
223 else if( rotation == ANGLE_270 )
224 return VECTOR2I( GetStartX(), GetEndY() );
225 else
226 return GetEnd();
227}
228
229
230void PCB_TEXTBOX::SetTop( int aVal )
231{
232 EDA_ANGLE rotation = GetDrawRotation();
233
234 if( rotation == ANGLE_90 || rotation == ANGLE_180 )
235 SetEndY( aVal );
236 else
237 SetStartY( aVal );
238}
239
240
242{
243 EDA_ANGLE rotation = GetDrawRotation();
244
245 if( rotation == ANGLE_90 || rotation == ANGLE_180 )
246 SetStartY( aVal );
247 else
248 SetEndY( aVal );
249}
250
251
252void PCB_TEXTBOX::SetLeft( int aVal )
253{
254 EDA_ANGLE rotation = GetDrawRotation();
255
256 if( rotation == ANGLE_180 || rotation == ANGLE_270 )
257 SetEndX( aVal );
258 else
259 SetStartX( aVal );
260}
261
262
263void PCB_TEXTBOX::SetRight( int aVal )
264{
265 EDA_ANGLE rotation = GetDrawRotation();
266
267 if( rotation == ANGLE_180 || rotation == ANGLE_270 )
268 SetStartX( aVal );
269 else
270 SetEndX( aVal );
271}
272
273
275{
276 EDA_ANGLE delta = aAngle.Normalized() - GetTextAngle();
278}
279
280
282{
283 return GetDrawPos( false );
284}
285
286
287VECTOR2I PCB_TEXTBOX::GetDrawPos( bool aIsFlipped ) const
288{
289 EDA_ANGLE drawAngle = GetDrawRotation();
290 std::vector<VECTOR2I> corners = GetCornersInSequence( drawAngle );
291 GR_TEXT_H_ALIGN_T horizontalAlignment = GetHorizJustify();
292 GR_TEXT_V_ALIGN_T verticalAlignment = GetVertJustify();
293 VECTOR2I textAnchor;
294 VECTOR2I offset;
295
296 // Calculate midpoints
297 VECTOR2I midTop = ( corners[0] + corners[1] ) / 2;
298 VECTOR2I midBottom = ( corners[3] + corners[2] ) / 2;
299 VECTOR2I midLeft = ( corners[0] + corners[3] ) / 2;
300 VECTOR2I midRight = ( corners[1] + corners[2] ) / 2;
301 VECTOR2I center = ( corners[0] + corners[1] + corners[2] + corners[3] ) / 4;
302
303 if( IsMirrored() != aIsFlipped )
304 {
305 switch( GetHorizJustify() )
306 {
307 case GR_TEXT_H_ALIGN_LEFT: horizontalAlignment = GR_TEXT_H_ALIGN_RIGHT; break;
308 case GR_TEXT_H_ALIGN_CENTER: horizontalAlignment = GR_TEXT_H_ALIGN_CENTER; break;
309 case GR_TEXT_H_ALIGN_RIGHT: horizontalAlignment = GR_TEXT_H_ALIGN_LEFT; break;
311 horizontalAlignment = GR_TEXT_H_ALIGN_INDETERMINATE;
312 break;
313 }
314 }
315
316 wxASSERT_MSG(
317 horizontalAlignment != GR_TEXT_H_ALIGN_INDETERMINATE
318 && verticalAlignment != GR_TEXT_V_ALIGN_INDETERMINATE,
319 wxS( "Indeterminate state legal only in dialogs. Horizontal and vertical alignment "
320 "must be set before calling PCB_TEXTBOX::GetDrawPos." ) );
321
322 if( horizontalAlignment == GR_TEXT_H_ALIGN_INDETERMINATE
323 || verticalAlignment == GR_TEXT_V_ALIGN_INDETERMINATE )
324 {
325 return center;
326 }
327
328 if( horizontalAlignment == GR_TEXT_H_ALIGN_LEFT && verticalAlignment == GR_TEXT_V_ALIGN_TOP )
329 {
330 textAnchor = corners[0];
331 }
332 else if( horizontalAlignment == GR_TEXT_H_ALIGN_CENTER
333 && verticalAlignment == GR_TEXT_V_ALIGN_TOP )
334 {
335 textAnchor = midTop;
336 }
337 else if( horizontalAlignment == GR_TEXT_H_ALIGN_RIGHT
338 && verticalAlignment == GR_TEXT_V_ALIGN_TOP )
339 {
340 textAnchor = corners[1];
341 }
342 else if( horizontalAlignment == GR_TEXT_H_ALIGN_LEFT
343 && verticalAlignment == GR_TEXT_V_ALIGN_CENTER )
344 {
345 textAnchor = midLeft;
346 }
347 else if( horizontalAlignment == GR_TEXT_H_ALIGN_CENTER
348 && verticalAlignment == GR_TEXT_V_ALIGN_CENTER )
349 {
350 textAnchor = center;
351 }
352 else if( horizontalAlignment == GR_TEXT_H_ALIGN_RIGHT
353 && verticalAlignment == GR_TEXT_V_ALIGN_CENTER )
354 {
355 textAnchor = midRight;
356 }
357 else if( horizontalAlignment == GR_TEXT_H_ALIGN_LEFT
358 && verticalAlignment == GR_TEXT_V_ALIGN_BOTTOM )
359 {
360 textAnchor = corners[3];
361 }
362 else if( horizontalAlignment == GR_TEXT_H_ALIGN_CENTER
363 && verticalAlignment == GR_TEXT_V_ALIGN_BOTTOM )
364 {
365 textAnchor = midBottom;
366 }
367 else if( horizontalAlignment == GR_TEXT_H_ALIGN_RIGHT
368 && verticalAlignment == GR_TEXT_V_ALIGN_BOTTOM )
369 {
370 textAnchor = corners[2];
371 }
372
373 int marginLeft = GetMarginLeft();
374 int marginRight = GetMarginRight();
375 int marginTop = GetMarginTop();
376 int marginBottom = GetMarginBottom();
377
378 if( horizontalAlignment == GR_TEXT_H_ALIGN_LEFT )
379 offset.x = marginLeft;
380 else if( horizontalAlignment == GR_TEXT_H_ALIGN_RIGHT )
381 offset.x = -marginRight;
382
383 if( verticalAlignment == GR_TEXT_V_ALIGN_TOP )
384 offset.y = marginTop;
385 else if( verticalAlignment == GR_TEXT_V_ALIGN_BOTTOM )
386 offset.y = -marginBottom;
387
388 RotatePoint( offset, GetDrawRotation() );
389 return textAnchor + offset;
390}
391
392
393double PCB_TEXTBOX::ViewGetLOD( int aLayer, const KIGFX::VIEW* aView ) const
394{
395 KIGFX::PCB_PAINTER& painter = static_cast<KIGFX::PCB_PAINTER&>( *aView->GetPainter() );
396 KIGFX::PCB_RENDER_SETTINGS& renderSettings = *painter.GetSettings();
397
398 if( aLayer == LAYER_LOCKED_ITEM_SHADOW )
399 {
400 // Hide shadow if the main layer is not shown
401 if( !aView->IsLayerVisible( m_layer ) )
402 return LOD_HIDE;
403
404 // Hide shadow on dimmed tracks
405 if( renderSettings.GetHighContrast() )
406 {
407 if( m_layer != renderSettings.GetPrimaryHighContrastLayer() )
408 return LOD_HIDE;
409 }
410 }
411
412 return LOD_SHOW;
413}
414
415
416std::vector<int> PCB_TEXTBOX::ViewGetLayers() const
417{
420
421 return { GetLayer() };
422}
423
424
425wxString PCB_TEXTBOX::GetShownText( bool aAllowExtraText, int aDepth ) const
426{
427 const FOOTPRINT* parentFootprint = GetParentFootprint();
428 const BOARD* board = GetBoard();
429
430 std::function<bool( wxString* )> resolver = [&]( wxString* token ) -> bool
431 {
432 if( token->IsSameAs( wxT( "LAYER" ) ) )
433 {
434 *token = GetLayerName();
435 return true;
436 }
437
438 if( parentFootprint && parentFootprint->ResolveTextVar( token, aDepth + 1 ) )
439 return true;
440
441 if( board->ResolveTextVar( token, aDepth + 1 ) )
442 return true;
443
444 return false;
445 };
446
447 wxString text = EDA_TEXT::GetShownText( aAllowExtraText, aDepth );
448
449 if( HasTextVars() )
450 {
451 if( aDepth < ADVANCED_CFG::GetCfg().m_ResolveTextRecursionDepth )
453 }
454
455 if( text.Contains( wxT( "@{" ) ) )
457
458 KIFONT::FONT* font = GetDrawFont( nullptr );
459 EDA_ANGLE drawAngle = GetDrawRotation();
460 std::vector<VECTOR2I> corners = GetCornersInSequence( drawAngle );
461 int colWidth = ( corners[1] - corners[0] ).EuclideanNorm();
462
463 if( GetTextAngle().IsHorizontal() )
464 colWidth -= ( GetMarginLeft() + GetMarginRight() );
465 else
466 colWidth -= ( GetMarginTop() + GetMarginBottom() );
467
468 font->LinebreakText( text, colWidth, GetTextSize(), GetTextThickness(), IsBold(), IsItalic() );
469
470 return text;
471}
472
473
474bool PCB_TEXTBOX::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const
475{
476 return BOARD_ITEM::Matches( UnescapeString( GetText() ), aSearchData );
477}
478
479
480void PCB_TEXTBOX::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
481{
482 // Don't use GetShownText() here; we want to show the user the variable references
483 aList.emplace_back( _( "Text Box" ), KIUI::EllipsizeStatusText( aFrame, GetText() ) );
484
485 if( aFrame->GetName() == PCB_EDIT_FRAME_NAME && IsLocked() )
486 aList.emplace_back( _( "Status" ), _( "Locked" ) );
487
488 aList.emplace_back( _( "Layer" ), GetLayerName() );
489 aList.emplace_back( _( "Mirror" ), IsMirrored() ? _( "Yes" ) : _( "No" ) );
490 aList.emplace_back( _( "Angle" ), wxString::Format( "%g", GetTextAngle().AsDegrees() ) );
491
492 aList.emplace_back( _( "Font" ), GetFont() ? GetFont()->GetName() : _( "Default" ) );
493
494 if( GetTextThickness() )
495 aList.emplace_back( _( "Text Thickness" ), aFrame->MessageTextFromValue( GetEffectiveTextPenWidth() ) );
496 else
497 aList.emplace_back( _( "Text Thickness" ), _( "Auto" ) );
498
499 aList.emplace_back( _( "Text Width" ), aFrame->MessageTextFromValue( GetTextWidth() ) );
500 aList.emplace_back( _( "Text Height" ), aFrame->MessageTextFromValue( GetTextHeight() ) );
501
502 aList.emplace_back( _( "Box Width" ),
503 aFrame->MessageTextFromValue( std::abs( GetEnd().x - GetStart().x ) ) );
504
505 aList.emplace_back( _( "Box Height" ),
506 aFrame->MessageTextFromValue( std::abs( GetEnd().y - GetStart().y ) ));
507
508 m_stroke.GetMsgPanelInfo( aFrame, aList );
509}
510
511
512void PCB_TEXTBOX::Move( const VECTOR2I& aMoveVector )
513{
514 PCB_SHAPE::Move( aMoveVector );
515 EDA_TEXT::Offset( aMoveVector );
516}
517
518
519void PCB_TEXTBOX::Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle )
520{
521 PCB_SHAPE::Rotate( aRotCentre, aAngle );
523
524 if( GetTextAngle().IsCardinal() && GetShape() != SHAPE_T::RECTANGLE )
525 {
526 // To convert the polygon to its equivalent rectangle, we use GetCornersInSequence( drawAngle )
527 // but this method uses the polygon bounding box.
528 // set the line thickness to 0 to get the actual rectangle corner
529 int lineWidth = GetWidth();
530 SetWidth( 0 );
531 EDA_ANGLE drawAngle = GetDrawRotation();
532 std::vector<VECTOR2I> corners = GetCornersInSequence( drawAngle );
533 SetWidth( lineWidth );
534 VECTOR2I diag = corners[2] - corners[0];
535 EDA_ANGLE angle = GetTextAngle();
536
538 SetStart( corners[0] );
539
540 if( angle == ANGLE_90 )
541 SetEnd( VECTOR2I( corners[0].x + abs( diag.x ), corners[0].y - abs( diag.y ) ) );
542 else if( angle == ANGLE_180 )
543 SetEnd( VECTOR2I( corners[0].x - abs( diag.x ), corners[0].y - abs( diag.y ) ) );
544 else if( angle == ANGLE_270 )
545 SetEnd( VECTOR2I( corners[0].x - abs( diag.x ), corners[0].y + abs( diag.y ) ) );
546 else
547 SetEnd( VECTOR2I( corners[0].x + abs( diag.x ), corners[0].y + abs( diag.y ) ) );
548 }
549}
550
551
552void PCB_TEXTBOX::Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
553{
554 // the position and angle are mirrored, but not the text (or its justification)
555 PCB_SHAPE::Mirror( aCentre, aFlipDirection );
556
557 if( aFlipDirection == FLIP_DIRECTION::LEFT_RIGHT )
559 else
561}
562
563
564void PCB_TEXTBOX::Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
565{
566 PCB_SHAPE::Flip( aCentre, aFlipDirection );
567
568 if( aFlipDirection == FLIP_DIRECTION::LEFT_RIGHT )
570 else
572
573 if( IsSideSpecific() )
575}
576
577
578bool PCB_TEXTBOX::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
579{
580 BOX2I rect = GetBoundingBox();
581
582 rect.Inflate( aAccuracy );
583
584 return rect.Contains( aPosition );
585}
586
587
588bool PCB_TEXTBOX::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
589{
590 BOX2I rect = aRect;
591
592 rect.Inflate( aAccuracy );
593
594 if( aContained )
595 return rect.Contains( GetBoundingBox() );
596
597 return rect.Intersects( GetBoundingBox() );
598}
599
600
601bool PCB_TEXTBOX::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
602{
603 return PCB_SHAPE::HitTest( aPoly, aContained );
604}
605
606
607wxString PCB_TEXTBOX::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
608{
609 return wxString::Format( _( "PCB text box '%s' on %s" ),
610 aFull ? GetShownText( false ) : KIUI::EllipsizeMenuText( GetText() ),
611 GetLayerName() );
612}
613
614
619
620
622{
623 return new PCB_TEXTBOX( *this );
624}
625
626
628{
629 wxASSERT( aImage->Type() == PCB_TEXTBOX_T );
630
631 std::swap( *((PCB_TEXTBOX*) this), *((PCB_TEXTBOX*) aImage) );
632}
633
634
635std::shared_ptr<SHAPE> PCB_TEXTBOX::GetEffectiveShape( PCB_LAYER_ID aLayer, FLASHING aFlash ) const
636{
637 std::shared_ptr<SHAPE_COMPOUND> shape = GetEffectiveTextShape();
638
639 if( PCB_SHAPE::GetStroke().GetWidth() >= 0 )
640 shape->AddShape( PCB_SHAPE::GetEffectiveShape( aLayer, aFlash ) );
641
642 return shape;
643}
644
645
646void PCB_TEXTBOX::TransformTextToPolySet( SHAPE_POLY_SET& aBuffer, int aClearance, int aMaxError,
647 ERROR_LOC aErrorLoc ) const
648{
650 KIFONT::FONT* font = GetDrawFont( nullptr );
651 int penWidth = GetEffectiveTextPenWidth();
653 wxString shownText = GetShownText( true );
654
655 // The polygonal shape of a text can have many basic shapes, so combining these shapes can
656 // be very useful to create a final shape with a lot less vertices to speedup calculations.
657 // Simplify shapes is not usually always efficient, but in this case it is.
658 SHAPE_POLY_SET textShape;
659
660 CALLBACK_GAL callback_gal( empty_opts,
661 // Stroke callback
662 [&]( const VECTOR2I& aPt1, const VECTOR2I& aPt2 )
663 {
664 TransformOvalToPolygon( textShape, aPt1, aPt2, penWidth, aMaxError, aErrorLoc );
665 },
666 // Triangulation callback
667 [&]( const VECTOR2I& aPt1, const VECTOR2I& aPt2, const VECTOR2I& aPt3 )
668 {
669 textShape.NewOutline();
670
671 for( const VECTOR2I& point : { aPt1, aPt2, aPt3 } )
672 textShape.Append( point.x, point.y );
673 } );
674
675 if( auto* cache = GetRenderCache( font, shownText ) )
676 callback_gal.DrawGlyphs( *cache );
677 else
678 font->Draw( &callback_gal, shownText, GetDrawPos(), attrs, GetFontMetrics() );
679
680 textShape.Simplify();
681
682 if( IsKnockout() )
683 {
684 SHAPE_POLY_SET finalPoly;
685
686 TransformShapeToPolygon( finalPoly, GetLayer(), aClearance, aMaxError, aErrorLoc );
687 finalPoly.BooleanSubtract( textShape );
688
689 aBuffer.Append( finalPoly );
690 }
691 else
692 {
693 if( aClearance > 0 || aErrorLoc == ERROR_OUTSIDE )
694 {
695 if( aErrorLoc == ERROR_OUTSIDE )
696 aClearance += aMaxError;
697
698 textShape.Inflate( aClearance, CORNER_STRATEGY::ROUND_ALL_CORNERS, aMaxError, true );
699 }
700
701 aBuffer.Append( textShape );
702 }
703}
704
705
707 int aClearance, int aMaxError, ERROR_LOC aErrorLoc,
708 bool aIgnoreLineWidth ) const
709{
710 // Don't use PCB_SHAPE::TransformShapeToPolygon. We want to treat the textbox as filled even
711 // if there's no background colour.
712
713 int width = GetWidth() + ( 2 * aClearance );
714
716 {
717 std::vector<VECTOR2I> pts = GetRectCorners();
718
719 aBuffer.NewOutline();
720
721 for( const VECTOR2I& pt : pts )
722 aBuffer.Append( pt );
723
724 if( m_borderEnabled && width > 0 )
725 {
726 // Add in segments
727 TransformOvalToPolygon( aBuffer, pts[0], pts[1], width, aMaxError, aErrorLoc );
728 TransformOvalToPolygon( aBuffer, pts[1], pts[2], width, aMaxError, aErrorLoc );
729 TransformOvalToPolygon( aBuffer, pts[2], pts[3], width, aMaxError, aErrorLoc );
730 TransformOvalToPolygon( aBuffer, pts[3], pts[0], width, aMaxError, aErrorLoc );
731 }
732 }
733 else if( GetShape() == SHAPE_T::POLY ) // Non-cardinally-rotated rect
734 {
735 aBuffer.NewOutline();
736
737 const SHAPE_LINE_CHAIN& poly = m_poly.Outline( 0 );
738
739 for( int ii = 0; ii < poly.PointCount(); ++ii )
740 aBuffer.Append( poly.GetPoint( ii ) );
741
742 if( m_borderEnabled && width > 0 )
743 {
744 for( int ii = 0; ii < poly.SegmentCount(); ++ii )
745 {
746 const SEG& seg = poly.GetSegment( ii );
747 TransformOvalToPolygon( aBuffer, seg.A, seg.B, width, aMaxError, aErrorLoc );
748 }
749 }
750 }
751}
752
753
755{
756 return m_borderEnabled;
757}
758
759
761{
762 m_borderEnabled = enabled;
763}
764
765
766void PCB_TEXTBOX::SetBorderWidth( const int aSize )
767{
768 m_stroke.SetWidth( aSize );
769}
770
771
772bool PCB_TEXTBOX::operator==( const BOARD_ITEM& aBoardItem ) const
773{
774 if( aBoardItem.Type() != Type() )
775 return false;
776
777 const PCB_TEXTBOX& other = static_cast<const PCB_TEXTBOX&>( aBoardItem );
778
779 return *this == other;
780}
781
782
783bool PCB_TEXTBOX::operator==( const PCB_TEXTBOX& aOther ) const
784{
785 return m_borderEnabled == aOther.m_borderEnabled
786 && EDA_TEXT::operator==( aOther );
787}
788
789
790double PCB_TEXTBOX::Similarity( const BOARD_ITEM& aBoardItem ) const
791{
792 if( aBoardItem.Type() != Type() )
793 return 0.0;
794
795 const PCB_TEXTBOX& other = static_cast<const PCB_TEXTBOX&>( aBoardItem );
796
797 double similarity = 1.0;
798
799 if( m_borderEnabled != other.m_borderEnabled )
800 similarity *= 0.9;
801
802 if( GetMarginLeft() != other.GetMarginLeft() )
803 similarity *= 0.9;
804
805 if( GetMarginTop() != other.GetMarginTop() )
806 similarity *= 0.9;
807
808 if( GetMarginRight() != other.GetMarginRight() )
809 similarity *= 0.9;
810
811 if( GetMarginBottom() != other.GetMarginBottom() )
812 similarity *= 0.9;
813
814 similarity *= EDA_TEXT::Similarity( other );
815
816 return similarity;
817}
818
819
820static struct PCB_TEXTBOX_DESC
821{
823 {
825
826 if( lineStyleEnum.Choices().GetCount() == 0 )
827 {
828 lineStyleEnum.Map( LINE_STYLE::SOLID, _HKI( "Solid" ) )
829 .Map( LINE_STYLE::DASH, _HKI( "Dashed" ) )
830 .Map( LINE_STYLE::DOT, _HKI( "Dotted" ) )
831 .Map( LINE_STYLE::DASHDOT, _HKI( "Dash-Dot" ) )
832 .Map( LINE_STYLE::DASHDOTDOT, _HKI( "Dash-Dot-Dot" ) );
833 }
834
841
842 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Shape" ) );
843 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Start X" ) );
844 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Start Y" ) );
845 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "End X" ) );
846 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "End Y" ) );
847 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Width" ) );
848 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Height" ) );
849 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Line Width" ) );
850 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Line Style" ) );
851 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Filled" ) );
852 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Corner Radius" ) );
853
854 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Color" ) );
855
856 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( PCB_SHAPE ), _HKI( "Soldermask" ) );
857 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( PCB_SHAPE ), _HKI( "Soldermask Margin Override" ) );
858
859 propMgr.AddProperty( new PROPERTY<PCB_TEXTBOX, bool, BOARD_ITEM>( _HKI( "Knockout" ),
861 _HKI( "Text Properties" ) );
862
863 const wxString borderProps = _( "Border Properties" );
864
865 void ( PCB_TEXTBOX::*lineStyleSetter )( LINE_STYLE ) = &PCB_TEXTBOX::SetLineStyle;
866 LINE_STYLE ( PCB_TEXTBOX::*lineStyleGetter )() const = &PCB_TEXTBOX::GetLineStyle;
867
868 propMgr.AddProperty( new PROPERTY<PCB_TEXTBOX, bool>( _HKI( "Border" ),
870 borderProps );
871
872 propMgr.AddProperty( new PROPERTY_ENUM<PCB_TEXTBOX, LINE_STYLE>( _HKI( "Border Style" ),
873 lineStyleSetter, lineStyleGetter ),
874 borderProps );
875
876 propMgr.AddProperty( new PROPERTY<PCB_TEXTBOX, int>( _HKI( "Border Width" ),
879 borderProps );
880
881 const wxString marginProps = _( "Margins" );
882
883 propMgr.AddProperty( new PROPERTY<PCB_TEXTBOX, int>( _HKI( "Margin Left" ),
886 marginProps );
887 propMgr.AddProperty( new PROPERTY<PCB_TEXTBOX, int>( _HKI( "Margin Top" ),
890 marginProps );
891 propMgr.AddProperty( new PROPERTY<PCB_TEXTBOX, int>( _HKI( "Margin Right" ),
894 marginProps );
895 propMgr.AddProperty( new PROPERTY<PCB_TEXTBOX, int>( _HKI( "Margin Bottom" ),
898 marginProps );
899
900 propMgr.Mask( TYPE_HASH( PCB_TEXT ), TYPE_HASH( EDA_TEXT ), _HKI( "Hyperlink" ) );
901 }
types::KiCadObjectType ToProtoEnum(KICAD_T aValue)
Definition api_enums.cpp:96
KICAD_T FromProtoEnum(types::KiCadObjectType aValue)
Definition api_enums.cpp:35
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
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
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:81
void SetLocked(bool aLocked) override
Definition board_item.h:323
PCB_LAYER_ID m_layer
Definition board_item.h:453
virtual bool IsKnockout() const
Definition board_item.h:319
bool IsLocked() const override
virtual void SetIsKnockout(bool aKnockout)
Definition board_item.h:320
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:516
STROKE_PARAMS m_stroke
Definition eda_shape.h:495
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:544
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:444
void SetMirrored(bool isMirrored)
Definition eda_text.cpp:404
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:696
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:428
void Offset(const VECTOR2I &aOffset)
Definition eda_text.cpp:607
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:660
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
wxString EvaluateText(const wxString &aText) const
Definition eda_text.cpp:652
void SetTextThickness(int aWidth)
The TextThickness is that set by the user.
Definition eda_text.cpp:295
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:476
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:436
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:281
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
Definition eda_text.cpp:310
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:318
bool operator==(const EDA_TEXT &aRhs) const
Definition eda_text.h:396
void SetMultilineAllowed(bool aAllow)
Definition eda_text.cpp:412
VECTOR2I GetTextSize() const
Definition eda_text.h:261
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
Definition eda_text.cpp:420
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 ExpandTextVars(const wxString &aSource, const PROJECT *aProject, int aFlags)
Definition common.cpp:59
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:802
@ 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