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 if( GetText().IsEmpty() )
199 return VECTOR2I( 0, 0 );
200
201 BOX2I textBox = GetTextBox( nullptr );
202
203 int textHeight = std::abs( textBox.GetHeight() );
204
205 if( GetTextAngle().IsHorizontal() )
206 textHeight += GetMarginTop() + GetMarginBottom();
207 else
208 textHeight += GetMarginLeft() + GetMarginRight();
209
210 // Only enforce minimum height. Width returns 0 so the user can freely shrink width
211 // (text rewraps) while height is constrained to fit the wrapped text content.
212 // GetTextBox returns dimensions in text-local coordinates. For 90/270 degree rotations,
213 // the text's natural height maps to screen x-axis.
214 EDA_ANGLE rotation = GetDrawRotation();
215
216 if( rotation == ANGLE_90 || rotation == ANGLE_270 )
217 return VECTOR2I( textHeight, 0 );
218
219 return VECTOR2I( 0, textHeight );
220}
221
222
224{
225 EDA_ANGLE rotation = GetDrawRotation();
226
227 if( rotation == ANGLE_90 )
228 return VECTOR2I( GetStartX(), GetEndY() );
229 else if( rotation == ANGLE_180 )
230 return GetEnd();
231 else if( rotation == ANGLE_270 )
232 return VECTOR2I( GetEndX(), GetStartY() );
233 else
234 return GetStart();
235}
236
237
239{
240 EDA_ANGLE rotation = GetDrawRotation();
241
242 if( rotation == ANGLE_90 )
243 return VECTOR2I( GetEndX(), GetStartY() );
244 else if( rotation == ANGLE_180 )
245 return GetStart();
246 else if( rotation == ANGLE_270 )
247 return VECTOR2I( GetStartX(), GetEndY() );
248 else
249 return GetEnd();
250}
251
252
253void PCB_TEXTBOX::SetTop( int aVal )
254{
255 EDA_ANGLE rotation = GetDrawRotation();
256
257 if( rotation == ANGLE_90 || rotation == ANGLE_180 )
258 SetEndY( aVal );
259 else
260 SetStartY( aVal );
261}
262
263
265{
266 EDA_ANGLE rotation = GetDrawRotation();
267
268 if( rotation == ANGLE_90 || rotation == ANGLE_180 )
269 SetStartY( aVal );
270 else
271 SetEndY( aVal );
272}
273
274
275void PCB_TEXTBOX::SetLeft( int aVal )
276{
277 EDA_ANGLE rotation = GetDrawRotation();
278
279 if( rotation == ANGLE_180 || rotation == ANGLE_270 )
280 SetEndX( aVal );
281 else
282 SetStartX( aVal );
283}
284
285
286void PCB_TEXTBOX::SetRight( int aVal )
287{
288 EDA_ANGLE rotation = GetDrawRotation();
289
290 if( rotation == ANGLE_180 || rotation == ANGLE_270 )
291 SetStartX( aVal );
292 else
293 SetEndX( aVal );
294}
295
296
298{
299 EDA_ANGLE delta = aAngle.Normalized() - GetTextAngle();
301}
302
303
305{
306 return GetDrawPos( false );
307}
308
309
310VECTOR2I PCB_TEXTBOX::GetDrawPos( bool aIsFlipped ) const
311{
312 EDA_ANGLE drawAngle = GetDrawRotation();
313 std::vector<VECTOR2I> corners = GetCornersInSequence( drawAngle );
314 GR_TEXT_H_ALIGN_T horizontalAlignment = GetHorizJustify();
315 GR_TEXT_V_ALIGN_T verticalAlignment = GetVertJustify();
316 VECTOR2I textAnchor;
317 VECTOR2I offset;
318
319 // Calculate midpoints
320 VECTOR2I midTop = ( corners[0] + corners[1] ) / 2;
321 VECTOR2I midBottom = ( corners[3] + corners[2] ) / 2;
322 VECTOR2I midLeft = ( corners[0] + corners[3] ) / 2;
323 VECTOR2I midRight = ( corners[1] + corners[2] ) / 2;
324 VECTOR2I center = ( corners[0] + corners[1] + corners[2] + corners[3] ) / 4;
325
326 if( IsMirrored() != aIsFlipped )
327 {
328 switch( GetHorizJustify() )
329 {
330 case GR_TEXT_H_ALIGN_LEFT: horizontalAlignment = GR_TEXT_H_ALIGN_RIGHT; break;
331 case GR_TEXT_H_ALIGN_CENTER: horizontalAlignment = GR_TEXT_H_ALIGN_CENTER; break;
332 case GR_TEXT_H_ALIGN_RIGHT: horizontalAlignment = GR_TEXT_H_ALIGN_LEFT; break;
333 case GR_TEXT_H_ALIGN_INDETERMINATE: horizontalAlignment = GR_TEXT_H_ALIGN_INDETERMINATE; break;
334 }
335 }
336
337 wxASSERT_MSG( horizontalAlignment != GR_TEXT_H_ALIGN_INDETERMINATE
338 && verticalAlignment != GR_TEXT_V_ALIGN_INDETERMINATE,
339 wxS( "Indeterminate state legal only in dialogs. Horizontal and vertical alignment "
340 "must be set before calling PCB_TEXTBOX::GetDrawPos." ) );
341
342 if( horizontalAlignment == GR_TEXT_H_ALIGN_INDETERMINATE || verticalAlignment == GR_TEXT_V_ALIGN_INDETERMINATE )
343 {
344 return center;
345 }
346
347 if( horizontalAlignment == GR_TEXT_H_ALIGN_LEFT && verticalAlignment == GR_TEXT_V_ALIGN_TOP )
348 {
349 textAnchor = corners[0];
350 }
351 else if( horizontalAlignment == GR_TEXT_H_ALIGN_CENTER && verticalAlignment == GR_TEXT_V_ALIGN_TOP )
352 {
353 textAnchor = midTop;
354 }
355 else if( horizontalAlignment == GR_TEXT_H_ALIGN_RIGHT && verticalAlignment == GR_TEXT_V_ALIGN_TOP )
356 {
357 textAnchor = corners[1];
358 }
359 else if( horizontalAlignment == GR_TEXT_H_ALIGN_LEFT && verticalAlignment == GR_TEXT_V_ALIGN_CENTER )
360 {
361 textAnchor = midLeft;
362 }
363 else if( horizontalAlignment == GR_TEXT_H_ALIGN_CENTER && verticalAlignment == GR_TEXT_V_ALIGN_CENTER )
364 {
365 textAnchor = center;
366 }
367 else if( horizontalAlignment == GR_TEXT_H_ALIGN_RIGHT && verticalAlignment == GR_TEXT_V_ALIGN_CENTER )
368 {
369 textAnchor = midRight;
370 }
371 else if( horizontalAlignment == GR_TEXT_H_ALIGN_LEFT && verticalAlignment == GR_TEXT_V_ALIGN_BOTTOM )
372 {
373 textAnchor = corners[3];
374 }
375 else if( horizontalAlignment == GR_TEXT_H_ALIGN_CENTER && verticalAlignment == GR_TEXT_V_ALIGN_BOTTOM )
376 {
377 textAnchor = midBottom;
378 }
379 else if( horizontalAlignment == GR_TEXT_H_ALIGN_RIGHT && verticalAlignment == GR_TEXT_V_ALIGN_BOTTOM )
380 {
381 textAnchor = corners[2];
382 }
383
384 int marginLeft = GetMarginLeft();
385 int marginRight = GetMarginRight();
386 int marginTop = GetMarginTop();
387 int marginBottom = GetMarginBottom();
388
389 if( horizontalAlignment == GR_TEXT_H_ALIGN_LEFT )
390 offset.x = marginLeft;
391 else if( horizontalAlignment == GR_TEXT_H_ALIGN_RIGHT )
392 offset.x = -marginRight;
393
394 if( verticalAlignment == GR_TEXT_V_ALIGN_TOP )
395 offset.y = marginTop;
396 else if( verticalAlignment == GR_TEXT_V_ALIGN_BOTTOM )
397 offset.y = -marginBottom;
398
399 RotatePoint( offset, GetDrawRotation() );
400 return textAnchor + offset;
401}
402
403
404double PCB_TEXTBOX::ViewGetLOD( int aLayer, const KIGFX::VIEW* aView ) const
405{
406 KIGFX::PCB_PAINTER& painter = static_cast<KIGFX::PCB_PAINTER&>( *aView->GetPainter() );
407 KIGFX::PCB_RENDER_SETTINGS& renderSettings = *painter.GetSettings();
408
409 if( aLayer == LAYER_LOCKED_ITEM_SHADOW )
410 {
411 // Hide shadow if the main layer is not shown
412 if( !aView->IsLayerVisible( m_layer ) )
413 return LOD_HIDE;
414
415 // Hide shadow on dimmed tracks
416 if( renderSettings.GetHighContrast() )
417 {
418 if( m_layer != renderSettings.GetPrimaryHighContrastLayer() )
419 return LOD_HIDE;
420 }
421 }
422
423 return LOD_SHOW;
424}
425
426
427std::vector<int> PCB_TEXTBOX::ViewGetLayers() const
428{
431
432 return { GetLayer() };
433}
434
435
436wxString PCB_TEXTBOX::GetShownText( bool aAllowExtraText, int aDepth ) const
437{
438 const FOOTPRINT* parentFootprint = GetParentFootprint();
439 const BOARD* board = GetBoard();
440
441 std::function<bool( wxString* )> resolver = [&]( wxString* token ) -> bool
442 {
443 if( token->IsSameAs( wxT( "LAYER" ) ) )
444 {
445 *token = GetLayerName();
446 return true;
447 }
448
449 if( parentFootprint && parentFootprint->ResolveTextVar( token, aDepth + 1 ) )
450 return true;
451
452 if( board->ResolveTextVar( token, aDepth + 1 ) )
453 return true;
454
455 return false;
456 };
457
458 wxString text = EDA_TEXT::GetShownText( aAllowExtraText, aDepth );
459
460 if( HasTextVars() )
461 text = ResolveTextVars( text, &resolver, aDepth );
462
463 KIFONT::FONT* font = GetDrawFont( nullptr );
464 EDA_ANGLE drawAngle = GetDrawRotation();
465 std::vector<VECTOR2I> corners = GetCornersInSequence( drawAngle );
466 int colWidth = ( corners[1] - corners[0] ).EuclideanNorm();
467
468 if( GetTextAngle().IsHorizontal() )
469 colWidth -= ( GetMarginLeft() + GetMarginRight() );
470 else
471 colWidth -= ( GetMarginTop() + GetMarginBottom() );
472
473 font->LinebreakText( text, colWidth, GetTextSize(), GetTextThickness(), IsBold(), IsItalic() );
474
475 // Convert escape markers back to literal ${} and @{} for final display
476 text.Replace( wxT( "<<<ESC_DOLLAR:" ), wxT( "${" ) );
477 text.Replace( wxT( "<<<ESC_AT:" ), wxT( "@{" ) );
478
479 return text;
480}
481
482
483bool PCB_TEXTBOX::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const
484{
485 return BOARD_ITEM::Matches( UnescapeString( GetText() ), aSearchData );
486}
487
488
489void PCB_TEXTBOX::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
490{
491 // Don't use GetShownText() here; we want to show the user the variable references
492 aList.emplace_back( _( "Text Box" ), KIUI::EllipsizeStatusText( aFrame, GetText() ) );
493
494 if( aFrame->GetName() == PCB_EDIT_FRAME_NAME && IsLocked() )
495 aList.emplace_back( _( "Status" ), _( "Locked" ) );
496
497 aList.emplace_back( _( "Layer" ), GetLayerName() );
498 aList.emplace_back( _( "Mirror" ), IsMirrored() ? _( "Yes" ) : _( "No" ) );
499 aList.emplace_back( _( "Angle" ), wxString::Format( "%g", GetTextAngle().AsDegrees() ) );
500
501 aList.emplace_back( _( "Font" ), GetFont() ? GetFont()->GetName() : _( "Default" ) );
502
503 if( GetTextThickness() )
504 aList.emplace_back( _( "Text Thickness" ), aFrame->MessageTextFromValue( GetEffectiveTextPenWidth() ) );
505 else
506 aList.emplace_back( _( "Text Thickness" ), _( "Auto" ) );
507
508 aList.emplace_back( _( "Text Width" ), aFrame->MessageTextFromValue( GetTextWidth() ) );
509 aList.emplace_back( _( "Text Height" ), aFrame->MessageTextFromValue( GetTextHeight() ) );
510
511 aList.emplace_back( _( "Box Width" ), aFrame->MessageTextFromValue( std::abs( GetEnd().x - GetStart().x ) ) );
512
513 aList.emplace_back( _( "Box Height" ), aFrame->MessageTextFromValue( std::abs( GetEnd().y - GetStart().y ) ) );
514
515 m_stroke.GetMsgPanelInfo( aFrame, aList );
516}
517
518
519void PCB_TEXTBOX::Move( const VECTOR2I& aMoveVector )
520{
521 PCB_SHAPE::Move( aMoveVector );
522 EDA_TEXT::Offset( aMoveVector );
523}
524
525
526void PCB_TEXTBOX::Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle )
527{
528 PCB_SHAPE::Rotate( aRotCentre, aAngle );
530
531 if( GetTextAngle().IsCardinal() && GetShape() != SHAPE_T::RECTANGLE )
532 {
533 // To convert the polygon to its equivalent rectangle, we use GetCornersInSequence( drawAngle )
534 // but this method uses the polygon bounding box.
535 // set the line thickness to 0 to get the actual rectangle corner
536 int lineWidth = GetWidth();
537 SetWidth( 0 );
538 EDA_ANGLE drawAngle = GetDrawRotation();
539 std::vector<VECTOR2I> corners = GetCornersInSequence( drawAngle );
540 SetWidth( lineWidth );
541 VECTOR2I diag = corners[2] - corners[0];
542 EDA_ANGLE angle = GetTextAngle();
543
545 SetStart( corners[0] );
546
547 if( angle == ANGLE_90 )
548 SetEnd( VECTOR2I( corners[0].x + abs( diag.x ), corners[0].y - abs( diag.y ) ) );
549 else if( angle == ANGLE_180 )
550 SetEnd( VECTOR2I( corners[0].x - abs( diag.x ), corners[0].y - abs( diag.y ) ) );
551 else if( angle == ANGLE_270 )
552 SetEnd( VECTOR2I( corners[0].x - abs( diag.x ), corners[0].y + abs( diag.y ) ) );
553 else
554 SetEnd( VECTOR2I( corners[0].x + abs( diag.x ), corners[0].y + abs( diag.y ) ) );
555 }
556}
557
558
559void PCB_TEXTBOX::Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
560{
561 // the position and angle are mirrored, but not the text (or its justification)
562 PCB_SHAPE::Mirror( aCentre, aFlipDirection );
563
564 if( aFlipDirection == FLIP_DIRECTION::LEFT_RIGHT )
566 else
568}
569
570
571void PCB_TEXTBOX::Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
572{
573 PCB_SHAPE::Flip( aCentre, aFlipDirection );
574
575 if( aFlipDirection == FLIP_DIRECTION::LEFT_RIGHT )
577 else
579
580 if( IsSideSpecific() )
582}
583
584
585bool PCB_TEXTBOX::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
586{
587 BOX2I rect = GetBoundingBox();
588
589 rect.Inflate( aAccuracy );
590
591 return rect.Contains( aPosition );
592}
593
594
595bool PCB_TEXTBOX::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
596{
597 BOX2I rect = aRect;
598
599 rect.Inflate( aAccuracy );
600
601 if( aContained )
602 return rect.Contains( GetBoundingBox() );
603
604 return rect.Intersects( GetBoundingBox() );
605}
606
607
608bool PCB_TEXTBOX::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
609{
610 return PCB_SHAPE::HitTest( aPoly, aContained );
611}
612
613
614wxString PCB_TEXTBOX::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
615{
616 return wxString::Format( _( "PCB text box '%s' on %s" ),
617 aFull ? GetShownText( false ) : KIUI::EllipsizeMenuText( GetText() ), GetLayerName() );
618}
619
620
625
626
628{
629 return new PCB_TEXTBOX( *this );
630}
631
632
634{
635 wxASSERT( aImage->Type() == PCB_TEXTBOX_T );
636
637 std::swap( *( (PCB_TEXTBOX*) this ), *( (PCB_TEXTBOX*) aImage ) );
638}
639
640
641std::shared_ptr<SHAPE> PCB_TEXTBOX::GetEffectiveShape( PCB_LAYER_ID aLayer, FLASHING aFlash ) const
642{
643 std::shared_ptr<SHAPE_COMPOUND> shape = GetEffectiveTextShape();
644
645 if( PCB_SHAPE::GetStroke().GetWidth() >= 0 )
646 shape->AddShape( PCB_SHAPE::GetEffectiveShape( aLayer, aFlash ) );
647
648 return shape;
649}
650
651
652void PCB_TEXTBOX::TransformTextToPolySet( SHAPE_POLY_SET& aBuffer, int aClearance, int aMaxError,
653 ERROR_LOC aErrorLoc ) const
654{
656 KIFONT::FONT* font = GetDrawFont( nullptr );
657 int penWidth = GetEffectiveTextPenWidth();
659 wxString shownText = GetShownText( true );
660
661 // The polygonal shape of a text can have many basic shapes, so combining these shapes can
662 // be very useful to create a final shape with a lot less vertices to speedup calculations.
663 // Simplify shapes is not usually always efficient, but in this case it is.
664 SHAPE_POLY_SET textShape;
665
666 CALLBACK_GAL callback_gal(
667 empty_opts,
668 // Stroke callback
669 [&]( const VECTOR2I& aPt1, const VECTOR2I& aPt2 )
670 {
671 TransformOvalToPolygon( textShape, aPt1, aPt2, penWidth, aMaxError, aErrorLoc );
672 },
673 // Triangulation callback
674 [&]( const VECTOR2I& aPt1, const VECTOR2I& aPt2, const VECTOR2I& aPt3 )
675 {
676 textShape.NewOutline();
677
678 for( const VECTOR2I& point : { aPt1, aPt2, aPt3 } )
679 textShape.Append( point.x, point.y );
680 } );
681
682 if( auto* cache = GetRenderCache( font, shownText ) )
683 callback_gal.DrawGlyphs( *cache );
684 else
685 font->Draw( &callback_gal, shownText, GetDrawPos(), attrs, GetFontMetrics() );
686
687 textShape.Simplify();
688
689 if( IsKnockout() )
690 {
691 SHAPE_POLY_SET finalPoly;
692
693 TransformShapeToPolygon( finalPoly, GetLayer(), aClearance, aMaxError, aErrorLoc );
694 finalPoly.BooleanSubtract( textShape );
695
696 aBuffer.Append( finalPoly );
697 }
698 else
699 {
700 if( aClearance > 0 || aErrorLoc == ERROR_OUTSIDE )
701 {
702 if( aErrorLoc == ERROR_OUTSIDE )
703 aClearance += aMaxError;
704
705 textShape.Inflate( aClearance, CORNER_STRATEGY::ROUND_ALL_CORNERS, aMaxError, true );
706 }
707
708 aBuffer.Append( textShape );
709 }
710}
711
712
713void PCB_TEXTBOX::TransformShapeToPolygon( SHAPE_POLY_SET& aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aMaxError,
714 ERROR_LOC aErrorLoc, bool aIgnoreLineWidth ) const
715{
716 // Don't use PCB_SHAPE::TransformShapeToPolygon. We want to treat the textbox as filled even
717 // if there's no background colour.
718
719 int width = GetWidth() + ( 2 * aClearance );
720
722 {
723 std::vector<VECTOR2I> pts = GetRectCorners();
724
725 aBuffer.NewOutline();
726
727 for( const VECTOR2I& pt : pts )
728 aBuffer.Append( pt );
729
730 if( m_borderEnabled && width > 0 )
731 {
732 // Add in segments
733 TransformOvalToPolygon( aBuffer, pts[0], pts[1], width, aMaxError, aErrorLoc );
734 TransformOvalToPolygon( aBuffer, pts[1], pts[2], width, aMaxError, aErrorLoc );
735 TransformOvalToPolygon( aBuffer, pts[2], pts[3], width, aMaxError, aErrorLoc );
736 TransformOvalToPolygon( aBuffer, pts[3], pts[0], width, aMaxError, aErrorLoc );
737 }
738 }
739 else if( GetShape() == SHAPE_T::POLY ) // Non-cardinally-rotated rect
740 {
741 aBuffer.NewOutline();
742
743 const SHAPE_LINE_CHAIN& poly = m_poly.Outline( 0 );
744
745 for( int ii = 0; ii < poly.PointCount(); ++ii )
746 aBuffer.Append( poly.GetPoint( ii ) );
747
748 if( m_borderEnabled && width > 0 )
749 {
750 for( int ii = 0; ii < poly.SegmentCount(); ++ii )
751 {
752 const SEG& seg = poly.GetSegment( ii );
753 TransformOvalToPolygon( aBuffer, seg.A, seg.B, width, aMaxError, aErrorLoc );
754 }
755 }
756 }
757}
758
759
761{
762 return m_borderEnabled;
763}
764
765
767{
768 m_borderEnabled = enabled;
769}
770
771
772void PCB_TEXTBOX::SetBorderWidth( const int aSize )
773{
774 m_stroke.SetWidth( aSize );
775}
776
777
778bool PCB_TEXTBOX::operator==( const BOARD_ITEM& aBoardItem ) const
779{
780 if( aBoardItem.Type() != Type() )
781 return false;
782
783 const PCB_TEXTBOX& other = static_cast<const PCB_TEXTBOX&>( aBoardItem );
784
785 return *this == other;
786}
787
788
789bool PCB_TEXTBOX::operator==( const PCB_TEXTBOX& aOther ) const
790{
791 return m_borderEnabled == aOther.m_borderEnabled && EDA_TEXT::operator==( aOther );
792}
793
794
795double PCB_TEXTBOX::Similarity( const BOARD_ITEM& aBoardItem ) const
796{
797 if( aBoardItem.Type() != Type() )
798 return 0.0;
799
800 const PCB_TEXTBOX& other = static_cast<const PCB_TEXTBOX&>( aBoardItem );
801
802 double similarity = 1.0;
803
804 if( m_borderEnabled != other.m_borderEnabled )
805 similarity *= 0.9;
806
807 if( GetMarginLeft() != other.GetMarginLeft() )
808 similarity *= 0.9;
809
810 if( GetMarginTop() != other.GetMarginTop() )
811 similarity *= 0.9;
812
813 if( GetMarginRight() != other.GetMarginRight() )
814 similarity *= 0.9;
815
816 if( GetMarginBottom() != other.GetMarginBottom() )
817 similarity *= 0.9;
818
819 similarity *= EDA_TEXT::Similarity( other );
820
821 return similarity;
822}
823
824
825static struct PCB_TEXTBOX_DESC
826{
828 {
830
831 if( lineStyleEnum.Choices().GetCount() == 0 )
832 {
833 lineStyleEnum.Map( LINE_STYLE::SOLID, _HKI( "Solid" ) )
834 .Map( LINE_STYLE::DASH, _HKI( "Dashed" ) )
835 .Map( LINE_STYLE::DOT, _HKI( "Dotted" ) )
836 .Map( LINE_STYLE::DASHDOT, _HKI( "Dash-Dot" ) )
837 .Map( LINE_STYLE::DASHDOTDOT, _HKI( "Dash-Dot-Dot" ) );
838 }
839
846
847 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Shape" ) );
848 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Start X" ) );
849 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Start Y" ) );
850 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "End X" ) );
851 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "End Y" ) );
852 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Width" ) );
853 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Height" ) );
854 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Line Width" ) );
855 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Line Style" ) );
856 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Filled" ) );
857 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Corner Radius" ) );
858
859 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Color" ) );
860
861 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( PCB_SHAPE ), _HKI( "Soldermask" ) );
862 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( PCB_SHAPE ), _HKI( "Soldermask Margin Override" ) );
863
866 _HKI( "Text Properties" ) );
867
868 const wxString borderProps = _( "Border Properties" );
869
870 void ( PCB_TEXTBOX::*lineStyleSetter )( LINE_STYLE ) = &PCB_TEXTBOX::SetLineStyle;
871 LINE_STYLE ( PCB_TEXTBOX::*lineStyleGetter )() const = &PCB_TEXTBOX::GetLineStyle;
872
875 borderProps );
876
877 propMgr.AddProperty(
878 new PROPERTY_ENUM<PCB_TEXTBOX, LINE_STYLE>( _HKI( "Border Style" ), lineStyleSetter, lineStyleGetter ),
879 borderProps );
880
883 borderProps );
884
885 const wxString marginProps = _( "Margins" );
886
889 marginProps );
892 marginProps );
895 marginProps );
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: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 size_type GetHeight() const
Definition box2.h:215
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:521
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:406
void SetStartX(int x)
Definition eda_shape.h:192
int GetStartY() const
Definition eda_shape.h:175
void SetEndY(int aY)
Definition eda_shape.h:227
int GetEndX() const
Definition eda_shape.h:218
void SetLineStyle(const LINE_STYLE aStyle)
void SetStartY(int y)
Definition eda_shape.h:185
std::vector< VECTOR2I > GetCornersInSequence(EDA_ANGLE angle) const
SHAPE_T GetShape() const
Definition eda_shape.h:169
int GetEndY() const
Definition eda_shape.h:217
void SetEndX(int aX)
Definition eda_shape.h:234
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
Definition eda_shape.h:216
void SetStart(const VECTOR2I &aStart)
Definition eda_shape.h:178
LINE_STYLE GetLineStyle() const
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
Definition eda_shape.h:174
void SetShape(SHAPE_T aShape)
Definition eda_shape.h:168
std::vector< VECTOR2I > GetRectCorners() const
void SetEnd(const VECTOR2I &aEnd)
Definition eda_shape.h:220
int GetStartX() const
Definition eda_shape.h:176
SHAPE_POLY_SET m_poly
Definition eda_shape.h:517
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:445
void SetMirrored(bool isMirrored)
Definition eda_text.cpp:405
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:695
virtual EDA_ANGLE GetDrawRotation() const
Definition eda_text.h:379
int GetTextWidth() const
Definition eda_text.h:264
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:753
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
Definition eda_text.cpp:429
void Offset(const VECTOR2I &aOffset)
Definition eda_text.cpp:606
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:659
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:98
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:296
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:477
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:437
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:282
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
Definition eda_text.cpp:311
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:319
bool operator==(const EDA_TEXT &aRhs) const
Definition eda_text.h:398
void SetMultilineAllowed(bool aAllow)
Definition eda_text.cpp:413
VECTOR2I GetTextSize() const
Definition eda_text.h:261
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
Definition eda_text.cpp:421
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, std::optional< VECTOR2I > aMousePos=std::nullopt, wxString *aActiveUrl=nullptr) 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:609
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:99
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.
VECTOR2I GetMinSize() const
Return the minimum height needed to contain the textbox's wrapped text content plus margins.
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:92
void SetLeft(int aVal) override
int GetMarginLeft() const
Definition pcb_textbox.h:96
void SetMarginLeft(int aLeft)
Definition pcb_textbox.h:91
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
void SetMarginBottom(int aBottom)
Definition pcb_textbox.h:94
int GetMarginRight() const
Definition pcb_textbox.h:98
void SetRight(int aVal) override
std::vector< int > ViewGetLayers() const override
void SetTop(int aVal) override
int GetMarginTop() const
Definition pcb_textbox.h:97
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:93
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:296
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