KiCad PCB EDA Suite
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
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 <callback_gal.h>
38#include <macros.h>
39#include <core/ignore.h>
40#include <api/api_enums.h>
41#include <api/api_utils.h>
42#include <api/board/board_types.pb.h>
43
45 PCB_SHAPE( aParent, aType, SHAPE_T::RECTANGLE ),
47 m_borderEnabled( true )
48{
51 SetMultilineAllowed( true );
52
53 int defaultMargin = GetLegacyTextMargin();
54 m_marginLeft = defaultMargin;
55 m_marginTop = defaultMargin;
56 m_marginRight = defaultMargin;
57 m_marginBottom = defaultMargin;
58}
59
61{
62}
63
64
65void PCB_TEXTBOX::CopyFrom( const BOARD_ITEM* aOther )
66{
67 wxCHECK( aOther && aOther->Type() == PCB_TEXTBOX_T, /* void */ );
68 *this = *static_cast<const PCB_TEXTBOX*>( aOther );
69}
70
71
72void PCB_TEXTBOX::Serialize( google::protobuf::Any &aContainer ) const
73{
74 using namespace kiapi::common::types;
75 using namespace kiapi::board;
76 types::BoardTextBox boardText;
77 boardText.set_layer( ToProtoEnum<PCB_LAYER_ID, types::BoardLayer>( GetLayer() ) );
78 boardText.mutable_id()->set_value( m_Uuid.AsStdString() );
79 boardText.set_locked( IsLocked() ? LockedState::LS_LOCKED : LockedState::LS_UNLOCKED );
80
81 TextBox& text = *boardText.mutable_textbox();
82
83 kiapi::common::PackVector2( *text.mutable_top_left(), GetPosition() );
84 kiapi::common::PackVector2( *text.mutable_bottom_right(), GetEnd() );
85 text.set_text( GetText().ToStdString() );
86 //text.set_hyperlink( GetHyperlink().ToStdString() );
87
88 TextAttributes* attrs = text.mutable_attributes();
89
90 if( GetFont() )
91 attrs->set_font_name( GetFont()->GetName().ToStdString() );
92
93 attrs->set_horizontal_alignment(
94 ToProtoEnum<GR_TEXT_H_ALIGN_T, HorizontalAlignment>( GetHorizJustify() ) );
95
96 attrs->set_vertical_alignment(
97 ToProtoEnum<GR_TEXT_V_ALIGN_T, VerticalAlignment>( GetVertJustify() ) );
98
99 attrs->mutable_angle()->set_value_degrees( GetTextAngleDegrees() );
100 attrs->set_line_spacing( GetLineSpacing() );
101 attrs->mutable_stroke_width()->set_value_nm( GetTextThickness() );
102 attrs->set_italic( IsItalic() );
103 attrs->set_bold( IsBold() );
104 attrs->set_underlined( GetAttributes().m_Underlined );
105 attrs->set_mirrored( IsMirrored() );
106 attrs->set_multiline( IsMultilineAllowed() );
107 attrs->set_keep_upright( IsKeepUpright() );
108 kiapi::common::PackVector2( *attrs->mutable_size(), GetTextSize() );
109
110 aContainer.PackFrom( boardText );
111}
112
113
114bool PCB_TEXTBOX::Deserialize( const google::protobuf::Any &aContainer )
115{
116 using namespace kiapi::board;
117 types::BoardTextBox boardText;
118
119 if( !aContainer.UnpackTo( &boardText ) )
120 return false;
121
122 const_cast<KIID&>( m_Uuid ) = KIID( boardText.id().value() );
123 SetLayer( FromProtoEnum<PCB_LAYER_ID, types::BoardLayer>( boardText.layer() ) );
124 SetLocked( boardText.locked() == kiapi::common::types::LockedState::LS_LOCKED );
125
126 const kiapi::common::types::TextBox& text = boardText.textbox();
127
129 SetEnd( kiapi::common::UnpackVector2( text.bottom_right() ) );
130 SetText( wxString( text.text().c_str(), wxConvUTF8 ) );
131 //SetHyperlink( wxString::FromUTF8( text.hyperlink() );
132
133 if( text.has_attributes() )
134 {
136
137 attrs.m_Bold = text.attributes().bold();
138 attrs.m_Italic = text.attributes().italic();
139 attrs.m_Underlined = text.attributes().underlined();
140 attrs.m_Mirrored = text.attributes().mirrored();
141 attrs.m_Multiline = text.attributes().multiline();
142 attrs.m_KeepUpright = text.attributes().keep_upright();
143 attrs.m_Size = kiapi::common::UnpackVector2( text.attributes().size() );
144
145 if( !text.attributes().font_name().empty() )
146 {
148 wxString( text.attributes().font_name().c_str(), wxConvUTF8 ), attrs.m_Bold,
149 attrs.m_Italic );
150 }
151
152 attrs.m_Angle = EDA_ANGLE( text.attributes().angle().value_degrees(), DEGREES_T );
153 attrs.m_LineSpacing = text.attributes().line_spacing();
154 attrs.m_StrokeWidth = text.attributes().stroke_width().value_nm();
155 attrs.m_Halign =
156 FromProtoEnum<GR_TEXT_H_ALIGN_T, kiapi::common::types::HorizontalAlignment>(
157 text.attributes().horizontal_alignment() );
158
159 attrs.m_Valign = FromProtoEnum<GR_TEXT_V_ALIGN_T, kiapi::common::types::VerticalAlignment>(
160 text.attributes().vertical_alignment() );
161
162 SetAttributes( attrs );
163 }
164
165 return true;
166}
167
168
170{
172
173 SetTextSize( settings.GetTextSize( GetLayer() ) );
175 SetItalic( settings.GetTextItalic( GetLayer() ) );
176 SetKeepUpright( settings.GetTextUpright( GetLayer() ) );
178}
179
180
182{
183 return KiROUND( GetStroke().GetWidth() / 2.0 ) + KiROUND( GetTextSize().y * 0.75 );
184}
185
186
188{
189 EDA_ANGLE rotation = GetDrawRotation();
190
191 if( rotation == ANGLE_90 )
192 return VECTOR2I( GetStartX(), GetEndY() );
193 else if( rotation == ANGLE_180 )
194 return GetEnd();
195 else if( rotation == ANGLE_270 )
196 return VECTOR2I( GetEndX(), GetStartY() );
197 else
198 return GetStart();
199}
200
201
203{
204 EDA_ANGLE rotation = GetDrawRotation();
205
206 if( rotation == ANGLE_90 )
207 return VECTOR2I( GetEndX(), GetStartY() );
208 else if( rotation == ANGLE_180 )
209 return GetStart();
210 else if( rotation == ANGLE_270 )
211 return VECTOR2I( GetStartX(), GetEndY() );
212 else
213 return GetEnd();
214}
215
216
217void PCB_TEXTBOX::SetTop( int aVal )
218{
219 EDA_ANGLE rotation = GetDrawRotation();
220
221 if( rotation == ANGLE_90 || rotation == ANGLE_180 )
222 SetEndY( aVal );
223 else
224 SetStartY( aVal );
225}
226
227
229{
230 EDA_ANGLE rotation = GetDrawRotation();
231
232 if( rotation == ANGLE_90 || rotation == ANGLE_180 )
233 SetStartY( aVal );
234 else
235 SetEndY( aVal );
236}
237
238
239void PCB_TEXTBOX::SetLeft( int aVal )
240{
241 EDA_ANGLE rotation = GetDrawRotation();
242
243 if( rotation == ANGLE_180 || rotation == ANGLE_270 )
244 SetEndX( aVal );
245 else
246 SetStartX( aVal );
247}
248
249
250void PCB_TEXTBOX::SetRight( int aVal )
251{
252 EDA_ANGLE rotation = GetDrawRotation();
253
254 if( rotation == ANGLE_180 || rotation == ANGLE_270 )
255 SetStartX( aVal );
256 else
257 SetEndX( aVal );
258}
259
260
262{
263 EDA_ANGLE delta = aAngle.Normalized() - GetTextAngle();
265}
266
267
269{
270 return GetDrawPos( false );
271}
272
273
274VECTOR2I PCB_TEXTBOX::GetDrawPos( bool aIsFlipped ) const
275{
276 std::vector<VECTOR2I> corners = GetCornersInSequence();
277 GR_TEXT_H_ALIGN_T horizontalAlignment = GetHorizJustify();
278 GR_TEXT_V_ALIGN_T verticalAlignment = GetVertJustify();
279 VECTOR2I textAnchor;
280 VECTOR2I offset;
281
282 // Calculate midpoints
283 VECTOR2I midTop = ( corners[0] + corners[1] ) / 2;
284 VECTOR2I midBottom = ( corners[3] + corners[2] ) / 2;
285 VECTOR2I midLeft = ( corners[0] + corners[3] ) / 2;
286 VECTOR2I midRight = ( corners[1] + corners[2] ) / 2;
287 VECTOR2I center = ( corners[0] + corners[1] + corners[2] + corners[3] ) / 4;
288
289 if( IsMirrored() != aIsFlipped )
290 {
291 switch( GetHorizJustify() )
292 {
293 case GR_TEXT_H_ALIGN_LEFT: horizontalAlignment = GR_TEXT_H_ALIGN_RIGHT; break;
294 case GR_TEXT_H_ALIGN_CENTER: horizontalAlignment = GR_TEXT_H_ALIGN_CENTER; break;
295 case GR_TEXT_H_ALIGN_RIGHT: horizontalAlignment = GR_TEXT_H_ALIGN_LEFT; break;
297 horizontalAlignment = GR_TEXT_H_ALIGN_INDETERMINATE;
298 break;
299 }
300 }
301
302 wxASSERT_MSG(
303 horizontalAlignment != GR_TEXT_H_ALIGN_INDETERMINATE
304 && verticalAlignment != GR_TEXT_V_ALIGN_INDETERMINATE,
305 wxS( "Indeterminate state legal only in dialogs. Horizontal and vertical alignment "
306 "must be set before calling PCB_TEXTBOX::GetDrawPos." ) );
307
308 if( horizontalAlignment == GR_TEXT_H_ALIGN_INDETERMINATE
309 || verticalAlignment == GR_TEXT_V_ALIGN_INDETERMINATE )
310 {
311 return center;
312 }
313
314 if( horizontalAlignment == GR_TEXT_H_ALIGN_LEFT && verticalAlignment == GR_TEXT_V_ALIGN_TOP )
315 {
316 textAnchor = corners[0];
317 }
318 else if( horizontalAlignment == GR_TEXT_H_ALIGN_CENTER
319 && verticalAlignment == GR_TEXT_V_ALIGN_TOP )
320 {
321 textAnchor = midTop;
322 }
323 else if( horizontalAlignment == GR_TEXT_H_ALIGN_RIGHT
324 && verticalAlignment == GR_TEXT_V_ALIGN_TOP )
325 {
326 textAnchor = corners[1];
327 }
328 else if( horizontalAlignment == GR_TEXT_H_ALIGN_LEFT
329 && verticalAlignment == GR_TEXT_V_ALIGN_CENTER )
330 {
331 textAnchor = midLeft;
332 }
333 else if( horizontalAlignment == GR_TEXT_H_ALIGN_CENTER
334 && verticalAlignment == GR_TEXT_V_ALIGN_CENTER )
335 {
336 textAnchor = center;
337 }
338 else if( horizontalAlignment == GR_TEXT_H_ALIGN_RIGHT
339 && verticalAlignment == GR_TEXT_V_ALIGN_CENTER )
340 {
341 textAnchor = midRight;
342 }
343 else if( horizontalAlignment == GR_TEXT_H_ALIGN_LEFT
344 && verticalAlignment == GR_TEXT_V_ALIGN_BOTTOM )
345 {
346 textAnchor = corners[3];
347 }
348 else if( horizontalAlignment == GR_TEXT_H_ALIGN_CENTER
349 && verticalAlignment == GR_TEXT_V_ALIGN_BOTTOM )
350 {
351 textAnchor = midBottom;
352 }
353 else if( horizontalAlignment == GR_TEXT_H_ALIGN_RIGHT
354 && verticalAlignment == GR_TEXT_V_ALIGN_BOTTOM )
355 {
356 textAnchor = corners[2];
357 }
358
359 int marginLeft = GetMarginLeft();
360 int marginRight = GetMarginRight();
361 int marginTop = GetMarginTop();
362 int marginBottom = GetMarginBottom();
363
364 if( horizontalAlignment == GR_TEXT_H_ALIGN_LEFT )
365 offset.x = marginLeft;
366 else if( horizontalAlignment == GR_TEXT_H_ALIGN_RIGHT )
367 offset.x = -marginRight;
368
369 if( verticalAlignment == GR_TEXT_V_ALIGN_TOP )
370 offset.y = marginTop;
371 else if( verticalAlignment == GR_TEXT_V_ALIGN_BOTTOM )
372 offset.y = -marginBottom;
373
374 RotatePoint( offset, GetDrawRotation() );
375 return textAnchor + offset;
376}
377
378
379double PCB_TEXTBOX::ViewGetLOD( int aLayer, const KIGFX::VIEW* aView ) const
380{
381 KIGFX::PCB_PAINTER& painter = static_cast<KIGFX::PCB_PAINTER&>( *aView->GetPainter() );
382 KIGFX::PCB_RENDER_SETTINGS& renderSettings = *painter.GetSettings();
383
384 if( aLayer == LAYER_LOCKED_ITEM_SHADOW )
385 {
386 // Hide shadow if the main layer is not shown
387 if( !aView->IsLayerVisible( m_layer ) )
388 return LOD_HIDE;
389
390 // Hide shadow on dimmed tracks
391 if( renderSettings.GetHighContrast() )
392 {
393 if( m_layer != renderSettings.GetPrimaryHighContrastLayer() )
394 return LOD_HIDE;
395 }
396 }
397
398 return LOD_SHOW;
399}
400
401
402std::vector<int> PCB_TEXTBOX::ViewGetLayers() const
403{
406
407 return { GetLayer() };
408}
409
410
411wxString PCB_TEXTBOX::GetShownText( bool aAllowExtraText, int aDepth ) const
412{
413 const FOOTPRINT* parentFootprint = GetParentFootprint();
414 const BOARD* board = GetBoard();
415
416 std::function<bool( wxString* )> resolver = [&]( wxString* token ) -> bool
417 {
418 if( parentFootprint && parentFootprint->ResolveTextVar( token, aDepth + 1 ) )
419 return true;
420
421 if( token->IsSameAs( wxT( "LAYER" ) ) )
422 {
423 *token = GetLayerName();
424 return true;
425 }
426
427 if( board->ResolveTextVar( token, aDepth + 1 ) )
428 return true;
429
430 return false;
431 };
432
433 wxString text = EDA_TEXT::GetShownText( aAllowExtraText, aDepth );
434
435 if( HasTextVars() )
436 {
437 if( aDepth < ADVANCED_CFG::GetCfg().m_ResolveTextRecursionDepth )
439 }
440
441 KIFONT::FONT* font = getDrawFont();
442 std::vector<VECTOR2I> corners = GetCornersInSequence();
443 int colWidth = ( corners[1] - corners[0] ).EuclideanNorm();
444
445 if( GetTextAngle().IsHorizontal() )
446 colWidth -= ( GetMarginLeft() + GetMarginRight() );
447 else
448 colWidth -= ( GetMarginTop() + GetMarginBottom() );
449
450 font->LinebreakText( text, colWidth, GetTextSize(), GetTextThickness(), IsBold(), IsItalic() );
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 aList.emplace_back( _( "Text Thickness" ), aFrame->MessageTextFromValue( GetTextThickness() ) );
476 aList.emplace_back( _( "Text Width" ), aFrame->MessageTextFromValue( GetTextWidth() ) );
477 aList.emplace_back( _( "Text Height" ), aFrame->MessageTextFromValue( GetTextHeight() ) );
478
479 aList.emplace_back( _( "Box Width" ),
480 aFrame->MessageTextFromValue( std::abs( GetEnd().x - GetStart().x ) ) );
481
482 aList.emplace_back( _( "Box Height" ),
483 aFrame->MessageTextFromValue( std::abs( GetEnd().y - GetStart().y ) ));
484
485 m_stroke.GetMsgPanelInfo( aFrame, aList );
486}
487
488
489void PCB_TEXTBOX::Move( const VECTOR2I& aMoveVector )
490{
491 PCB_SHAPE::Move( aMoveVector );
492 EDA_TEXT::Offset( aMoveVector );
493}
494
495
496void PCB_TEXTBOX::Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle )
497{
498 PCB_SHAPE::Rotate( aRotCentre, aAngle );
500
501 if( GetTextAngle().IsCardinal() && GetShape() != SHAPE_T::RECTANGLE )
502 {
503 // To convert the polygon to its equivalent rectangle, we use GetCornersInSequence()
504 // but this method uses the polygon bounding box.
505 // set the line thickness to 0 to get the actual rectangle corner
506 int lineWidth = GetWidth();
507 SetWidth( 0 );
508 std::vector<VECTOR2I> corners = GetCornersInSequence();
509 SetWidth( lineWidth );
510 VECTOR2I diag = corners[2] - corners[0];
511 EDA_ANGLE angle = GetTextAngle();
512
513 SetShape( SHAPE_T::RECTANGLE );
514 SetStart( corners[0] );
515
516 if( angle == ANGLE_90 )
517 SetEnd( VECTOR2I( corners[0].x + abs( diag.x ), corners[0].y - abs( diag.y ) ) );
518 else if( angle == ANGLE_180 )
519 SetEnd( VECTOR2I( corners[0].x - abs( diag.x ), corners[0].y - abs( diag.y ) ) );
520 else if( angle == ANGLE_270 )
521 SetEnd( VECTOR2I( corners[0].x - abs( diag.x ), corners[0].y + abs( diag.y ) ) );
522 else
523 SetEnd( VECTOR2I( corners[0].x + abs( diag.x ), corners[0].y + abs( diag.y ) ) );
524 }
525}
526
527
528void PCB_TEXTBOX::Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
529{
530 // the position and angle are mirrored, but not the text (or its justification)
531 PCB_SHAPE::Mirror( aCentre, aFlipDirection );
532
533 if( aFlipDirection == FLIP_DIRECTION::LEFT_RIGHT )
535 else
537}
538
539
540void PCB_TEXTBOX::Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
541{
542 PCB_SHAPE::Flip( aCentre, aFlipDirection );
543
545
546 if( IsSideSpecific() )
548}
549
550
551bool PCB_TEXTBOX::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
552{
553 BOX2I rect = GetBoundingBox();
554
555 rect.Inflate( aAccuracy );
556
557 return rect.Contains( aPosition );
558}
559
560
561bool PCB_TEXTBOX::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
562{
563 BOX2I rect = aRect;
564
565 rect.Inflate( aAccuracy );
566
567 if( aContained )
568 return rect.Contains( GetBoundingBox() );
569
570 return rect.Intersects( GetBoundingBox() );
571}
572
573
574wxString PCB_TEXTBOX::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
575{
576 return wxString::Format( _( "PCB Text Box '%s' on %s" ),
577 aFull ? GetShownText( false ) : KIUI::EllipsizeMenuText( GetText() ),
578 GetLayerName() );
579}
580
581
583{
584 return BITMAPS::add_textbox;
585}
586
587
589{
590 return new PCB_TEXTBOX( *this );
591}
592
593
595{
596 wxASSERT( aImage->Type() == PCB_TEXTBOX_T );
597
598 std::swap( *((PCB_TEXTBOX*) this), *((PCB_TEXTBOX*) aImage) );
599}
600
601
602std::shared_ptr<SHAPE> PCB_TEXTBOX::GetEffectiveShape( PCB_LAYER_ID aLayer, FLASHING aFlash ) const
603{
604 std::shared_ptr<SHAPE_COMPOUND> shape = GetEffectiveTextShape();
605
606 if( PCB_SHAPE::GetStroke().GetWidth() >= 0 )
607 shape->AddShape( PCB_SHAPE::GetEffectiveShape( aLayer, aFlash ) );
608
609 return shape;
610}
611
612
613void PCB_TEXTBOX::TransformTextToPolySet( SHAPE_POLY_SET& aBuffer, int aClearance, int aMaxError,
614 ERROR_LOC aErrorLoc ) const
615{
617 KIFONT::FONT* font = getDrawFont();
618 int penWidth = GetEffectiveTextPenWidth();
620 wxString shownText = GetShownText( true );
621
622 // The polygonal shape of a text can have many basic shapes, so combining these shapes can
623 // be very useful to create a final shape with a lot less vertices to speedup calculations.
624 // Simplify shapes is not usually always efficient, but in this case it is.
625 SHAPE_POLY_SET textShape;
626
627 CALLBACK_GAL callback_gal( empty_opts,
628 // Stroke callback
629 [&]( const VECTOR2I& aPt1, const VECTOR2I& aPt2 )
630 {
631 TransformOvalToPolygon( textShape, aPt1, aPt2, penWidth, aMaxError, aErrorLoc );
632 },
633 // Triangulation callback
634 [&]( const VECTOR2I& aPt1, const VECTOR2I& aPt2, const VECTOR2I& aPt3 )
635 {
636 textShape.NewOutline();
637
638 for( const VECTOR2I& point : { aPt1, aPt2, aPt3 } )
639 textShape.Append( point.x, point.y );
640 } );
641
642 if( auto* cache = GetRenderCache( font, shownText ) )
643 callback_gal.DrawGlyphs( *cache );
644 else
645 font->Draw( &callback_gal, shownText, GetDrawPos(), attrs, GetFontMetrics() );
646
647 textShape.Simplify();
648
649 if( IsKnockout() )
650 {
651 SHAPE_POLY_SET finalPoly;
652
653 TransformShapeToPolygon( finalPoly, GetLayer(), aClearance, aMaxError, aErrorLoc );
654 finalPoly.BooleanSubtract( textShape );
655
656 aBuffer.Append( finalPoly );
657 }
658 else
659 {
660 if( aClearance > 0 || aErrorLoc == ERROR_OUTSIDE )
661 {
662 if( aErrorLoc == ERROR_OUTSIDE )
663 aClearance += aMaxError;
664
665 textShape.Inflate( aClearance, CORNER_STRATEGY::ROUND_ALL_CORNERS, aMaxError, true );
666 }
667
668 aBuffer.Append( textShape );
669 }
670}
671
672
674 int aClearance, int aMaxError, ERROR_LOC aErrorLoc,
675 bool aIgnoreLineWidth ) const
676{
677 // Don't use PCB_SHAPE::TransformShapeToPolygon. We want to treat the textbox as filled even
678 // if there's no background colour.
679
680 int width = GetWidth() + ( 2 * aClearance );
681
682 if( GetShape() == SHAPE_T::RECTANGLE )
683 {
684 std::vector<VECTOR2I> pts = GetRectCorners();
685
686 aBuffer.NewOutline();
687
688 for( const VECTOR2I& pt : pts )
689 aBuffer.Append( pt );
690
691 if( m_borderEnabled && width > 0 )
692 {
693 // Add in segments
694 TransformOvalToPolygon( aBuffer, pts[0], pts[1], width, aMaxError, aErrorLoc );
695 TransformOvalToPolygon( aBuffer, pts[1], pts[2], width, aMaxError, aErrorLoc );
696 TransformOvalToPolygon( aBuffer, pts[2], pts[3], width, aMaxError, aErrorLoc );
697 TransformOvalToPolygon( aBuffer, pts[3], pts[0], width, aMaxError, aErrorLoc );
698 }
699 }
700 else if( GetShape() == SHAPE_T::POLY ) // Non-cardinally-rotated rect
701 {
702 aBuffer.NewOutline();
703
704 const SHAPE_LINE_CHAIN& poly = m_poly.Outline( 0 );
705
706 for( int ii = 0; ii < poly.PointCount(); ++ii )
707 aBuffer.Append( poly.GetPoint( ii ) );
708
709 if( m_borderEnabled && width > 0 )
710 {
711 for( int ii = 0; ii < poly.SegmentCount(); ++ii )
712 {
713 const SEG& seg = poly.GetSegment( ii );
714 TransformOvalToPolygon( aBuffer, seg.A, seg.B, width, aMaxError, aErrorLoc );
715 }
716 }
717 }
718}
719
720
722{
723 return m_borderEnabled;
724}
725
726
728{
729 m_borderEnabled = enabled;
730}
731
732
733void PCB_TEXTBOX::SetBorderWidth( const int aSize )
734{
735 m_stroke.SetWidth( aSize );
736}
737
738
739bool PCB_TEXTBOX::operator==( const BOARD_ITEM& aBoardItem ) const
740{
741 if( aBoardItem.Type() != Type() )
742 return false;
743
744 const PCB_TEXTBOX& other = static_cast<const PCB_TEXTBOX&>( aBoardItem );
745
746 return *this == other;
747}
748
749
750bool PCB_TEXTBOX::operator==( const PCB_TEXTBOX& aOther ) const
751{
752 return m_borderEnabled == aOther.m_borderEnabled
753 && EDA_TEXT::operator==( aOther );
754}
755
756
757double PCB_TEXTBOX::Similarity( const BOARD_ITEM& aBoardItem ) const
758{
759 if( aBoardItem.Type() != Type() )
760 return 0.0;
761
762 const PCB_TEXTBOX& other = static_cast<const PCB_TEXTBOX&>( aBoardItem );
763
764 double similarity = 1.0;
765
766 if( m_borderEnabled != other.m_borderEnabled )
767 similarity *= 0.9;
768
769 if( GetMarginLeft() != other.GetMarginLeft() )
770 similarity *= 0.9;
771
772 if( GetMarginTop() != other.GetMarginTop() )
773 similarity *= 0.9;
774
775 if( GetMarginRight() != other.GetMarginRight() )
776 similarity *= 0.9;
777
778 if( GetMarginBottom() != other.GetMarginBottom() )
779 similarity *= 0.9;
780
781 similarity *= EDA_TEXT::Similarity( other );
782
783 return similarity;
784}
785
786
787static struct PCB_TEXTBOX_DESC
788{
790 {
792
793 if( lineStyleEnum.Choices().GetCount() == 0 )
794 {
795 lineStyleEnum.Map( LINE_STYLE::SOLID, _HKI( "Solid" ) )
796 .Map( LINE_STYLE::DASH, _HKI( "Dashed" ) )
797 .Map( LINE_STYLE::DOT, _HKI( "Dotted" ) )
798 .Map( LINE_STYLE::DASHDOT, _HKI( "Dash-Dot" ) )
799 .Map( LINE_STYLE::DASHDOTDOT, _HKI( "Dash-Dot-Dot" ) );
800 }
801
808
809 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Shape" ) );
810 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Start X" ) );
811 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Start Y" ) );
812 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "End X" ) );
813 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "End Y" ) );
814 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Width" ) );
815 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Height" ) );
816 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Line Width" ) );
817 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Line Style" ) );
818 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_SHAPE ), _HKI( "Filled" ) );
819 propMgr.Mask( TYPE_HASH( PCB_TEXTBOX ), TYPE_HASH( EDA_TEXT ), _HKI( "Color" ) );
820
821 propMgr.AddProperty( new PROPERTY<PCB_TEXTBOX, bool, BOARD_ITEM>( _HKI( "Knockout" ),
823 _HKI( "Text Properties" ) );
824
825 const wxString borderProps = _( "Border Properties" );
826
827 void ( PCB_TEXTBOX::*lineStyleSetter )( LINE_STYLE ) = &PCB_TEXTBOX::SetLineStyle;
828 LINE_STYLE ( PCB_TEXTBOX::*lineStyleGetter )() const = &PCB_TEXTBOX::GetLineStyle;
829
830 propMgr.AddProperty( new PROPERTY<PCB_TEXTBOX, bool>( _HKI( "Border" ),
832 borderProps );
833
834 propMgr.AddProperty( new PROPERTY_ENUM<PCB_TEXTBOX, LINE_STYLE>( _HKI( "Border Style" ),
835 lineStyleSetter, lineStyleGetter ),
836 borderProps );
837
838 propMgr.AddProperty( new PROPERTY<PCB_TEXTBOX, int>( _HKI( "Border Width" ),
840 PROPERTY_DISPLAY::PT_SIZE ),
841 borderProps );
842
843 const wxString marginProps = _( "Margins" );
844
845 propMgr.AddProperty( new PROPERTY<PCB_TEXTBOX, int>( _HKI( "Margin Left" ),
847 PROPERTY_DISPLAY::PT_SIZE ),
848 marginProps );
849 propMgr.AddProperty( new PROPERTY<PCB_TEXTBOX, int>( _HKI( "Margin Top" ),
851 PROPERTY_DISPLAY::PT_SIZE ),
852 marginProps );
853 propMgr.AddProperty( new PROPERTY<PCB_TEXTBOX, int>( _HKI( "Margin Right" ),
855 PROPERTY_DISPLAY::PT_SIZE ),
856 marginProps );
857 propMgr.AddProperty( new PROPERTY<PCB_TEXTBOX, int>( _HKI( "Margin Bottom" ),
859 PROPERTY_DISPLAY::PT_SIZE ),
860 marginProps );
861
862 propMgr.Mask( TYPE_HASH( PCB_TEXT ), TYPE_HASH( EDA_TEXT ), _HKI( "Hyperlink" ) );
863 }
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
Definition: approximation.h:32
@ ERROR_OUTSIDE
Definition: approximation.h:33
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:108
BITMAPS
A list of all bitmap identifiers.
Definition: bitmaps_list.h:33
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.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:78
virtual void SetLocked(bool aLocked)
Definition: board_item.h:320
PCB_LAYER_ID m_layer
Definition: board_item.h:445
virtual bool IsKnockout() const
Definition: board_item.h:316
virtual void SetIsKnockout(bool aKnockout)
Definition: board_item.h:317
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Definition: board_item.cpp:48
FOOTPRINT * GetParentFootprint() const
Definition: board_item.cpp:299
const KIFONT::METRICS & GetFontMetrics() const
Definition: board_item.cpp:101
virtual bool IsLocked() const
Definition: board_item.cpp:76
bool IsSideSpecific() const
Definition: board_item.cpp:150
wxString GetLayerName() const
Return the name of the PCB layer on which the item resides.
Definition: board_item.cpp:140
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:297
bool ResolveTextVar(wxString *token, int aDepth) const
Definition: board.cpp:434
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
bool IsHorizontal() const
Definition: eda_angle.h:138
EDA_ANGLE Normalized() const
Definition: eda_angle.h:232
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:96
const KIID m_Uuid
Definition: eda_item.h:498
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:108
virtual bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const
Compare the item against the search criteria in aSearchData.
Definition: eda_item.h:386
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)
Definition: eda_shape.cpp:2310
void SetStartY(int y)
Definition: eda_shape.h:184
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
Definition: eda_shape.cpp:2316
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
Definition: eda_shape.cpp:1544
std::vector< VECTOR2I > GetCornersInSequence() const
Definition: eda_shape.cpp:1559
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:508
STROKE_PARAMS m_stroke
Definition: eda_shape.h:485
void SetWidth(int aWidth)
Definition: eda_shape.cpp:2303
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:254
bool IsItalic() const
Definition: eda_text.h:156
const EDA_ANGLE & GetTextAngle() const
Definition: eda_text.h:134
void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
Definition: eda_text.cpp:526
bool IsMultilineAllowed() const
Definition: eda_text.h:184
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:193
KIFONT::FONT * GetFont() const
Definition: eda_text.h:234
void SetAttributes(const EDA_TEXT &aSrc, bool aSetPosition=true)
Set the text attributes from another instance.
Definition: eda_text.cpp:426
void SetMirrored(bool isMirrored)
Definition: eda_text.cpp:386
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:664
virtual EDA_ANGLE GetDrawRotation() const
Definition: eda_text.h:365
int GetTextWidth() const
Definition: eda_text.h:251
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
Definition: eda_text.cpp:410
void Offset(const VECTOR2I &aOffset)
Definition: eda_text.cpp:589
GR_TEXT_H_ALIGN_T GetHorizJustify() const
Definition: eda_text.h:187
bool HasTextVars() const
Indicates the ShownText has text var references which need to be processed.
Definition: eda_text.h:117
virtual KIFONT::FONT * getDrawFont() const
Definition: eda_text.cpp:634
double GetLineSpacing() const
Definition: eda_text.h:245
double Similarity(const EDA_TEXT &aOther) const
Definition: eda_text.cpp:1279
void SetTextThickness(int aWidth)
The TextThickness is that set by the user.
Definition: eda_text.cpp:284
const TEXT_ATTRIBUTES & GetAttributes() const
Definition: eda_text.h:218
bool IsMirrored() const
Definition: eda_text.h:177
int GetEffectiveTextPenWidth(int aDefaultPenWidth=0) const
The EffectiveTextPenWidth uses the text thickness if > 1 or aDefaultPenWidth.
Definition: eda_text.cpp:458
double GetTextAngleDegrees() const
Definition: eda_text.h:141
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.
Definition: eda_text.cpp:1120
bool IsBold() const
Definition: eda_text.h:171
void SetKeepUpright(bool aKeepUpright)
Definition: eda_text.cpp:418
GR_TEXT_V_ALIGN_T GetVertJustify() const
Definition: eda_text.h:190
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:270
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
Definition: eda_text.cpp:292
int GetTextThickness() const
Definition: eda_text.h:126
void SetItalic(bool aItalic)
Set the text to be italic - this will also update the font if needed.
Definition: eda_text.cpp:300
bool operator==(const EDA_TEXT &aRhs) const
Definition: eda_text.h:382
void SetMultilineAllowed(bool aAllow)
Definition: eda_text.cpp:394
VECTOR2I GetTextSize() const
Definition: eda_text.h:248
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
Definition: eda_text.cpp:402
ENUM_MAP & Map(T aValue, const wxString &aName)
Definition: property.h:686
static ENUM_MAP< T > & Instance()
Definition: property.h:680
wxPGChoices & Choices()
Definition: property.h:729
bool ResolveTextVar(wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the component.
Definition: footprint.cpp:992
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.
Definition: pcb_painter.h:181
virtual PCB_RENDER_SETTINGS * GetSettings() override
Return a pointer to current settings that are going to be used when drawing items.
Definition: pcb_painter.h:186
PCB specific render settings.
Definition: pcb_painter.h:79
PCB_LAYER_ID GetPrimaryHighContrastLayer() const
Return the board layer which is in high-contrast mode.
bool GetHighContrast() const
static constexpr double LOD_HIDE
Return this constant from ViewGetLOD() to hide the item unconditionally.
Definition: view_item.h:174
static constexpr double LOD_SHOW
Return this constant from ViewGetLOD() to show the item unconditionally.
Definition: view_item.h:179
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:67
bool IsLayerVisible(int aLayer) const
Return information about visibility of a particular layer.
Definition: view.h:418
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:216
Definition: kiid.h:49
std::string AsStdString() const
Definition: kiid.cpp:252
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.
Definition: pcb_shape.cpp:568
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
Definition: pcb_shape.cpp:554
int GetWidth() const override
Definition: pcb_shape.cpp:375
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.
Definition: pcb_shape.cpp:797
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.
Definition: pcb_shape.cpp:560
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
Definition: pcb_shape.cpp:179
STROKE_PARAMS GetStroke() const override
Definition: pcb_shape.h:91
void StyleFromSettings(const BOARD_DESIGN_SETTINGS &settings) override
Definition: pcb_shape.cpp:385
void Move(const VECTOR2I &aMoveVector) override
Move this object.
Definition: pcb_shape.cpp:461
void Normalize() override
Perform any normalization required after a user rotate and/or flip.
Definition: pcb_shape.cpp:473
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
PCB_TEXTBOX(BOARD_ITEM *aParent, KICAD_T aType=PCB_TEXTBOX_T)
Definition: pcb_textbox.cpp:44
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)
Definition: pcb_textbox.h:174
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
int m_marginLeft
Definition: pcb_textbox.h:177
int m_marginBottom
Definition: pcb_textbox.h:180
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...
int m_marginRight
Definition: pcb_textbox.h:179
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.
Definition: pcb_textbox.cpp:72
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
Definition: pcb_textbox.cpp:65
int GetBorderWidth() const
Definition: pcb_textbox.h:159
void StyleFromSettings(const BOARD_DESIGN_SETTINGS &settings) override
Provide class metadata.Helper macro to map type hashes to names.
Definition: property_mgr.h:85
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()
Definition: property_mgr.h:87
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)
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
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.
void SetWidth(int aWidth)
void GetMsgPanelInfo(UNITS_PROVIDER *aUnitsProvider, std::vector< MSG_PANEL_ITEM > &aList, bool aIncludeStyle=true, bool aIncludeWidth=true)
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.
#define _HKI(x)
#define _(s)
static constexpr EDA_ANGLE ANGLE_90
Definition: eda_angle.h:403
@ DEGREES_T
Definition: eda_angle.h:31
static constexpr EDA_ANGLE ANGLE_270
Definition: eda_angle.h:406
static constexpr EDA_ANGLE ANGLE_180
Definition: eda_angle.h:405
#define PCB_EDIT_FRAME_NAME
SHAPE_T
Definition: eda_shape.h:43
static FILENAME_RESOLVER * resolver
Definition: export_idf.cpp:53
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:788
@ LAYER_LOCKED_ITEM_SHADOW
Shadow layer for locked items.
Definition: layer_ids.h:306
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
KICOMMON_API wxString EllipsizeMenuText(const wxString &aString)
Ellipsize text (at the end) to be no more than 36 characters.
Definition: ui_common.cpp:215
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.
Definition: ui_common.cpp:197
KICOMMON_API VECTOR2I UnpackVector2(const types::Vector2 &aInput)
Definition: api_utils.cpp:84
KICOMMON_API void PackVector2(types::Vector2 &aOutput, const VECTOR2I &aInput)
Definition: api_utils.cpp:77
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
Definition: eda_angle.h:390
static struct PCB_TEXTBOX_DESC _PCB_TEXTBOX_DESC
#define TYPE_HASH(x)
Definition: property.h:71
#define REGISTER_TYPE(x)
Definition: property_mgr.h:371
wxString UnescapeString(const wxString &aSource)
LINE_STYLE
Dashed line types.
Definition: stroke_params.h:46
VECTOR2I center
constexpr 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