KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pcb_text.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 (C) 2012 Jean-Pierre Charras, [email protected]
5 * Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <[email protected]>
6 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25
26#include <google/protobuf/any.pb.h>
27
28#include <advanced_config.h>
29#include <pcb_edit_frame.h>
30#include <base_units.h>
31#include <bitmaps.h>
32#include <board.h>
34#include <core/mirror.h>
35#include <footprint.h>
36#include <pcb_text.h>
37#include <pcb_painter.h>
38#include <trigo.h>
39#include <string_utils.h>
42#include <callback_gal.h>
44#include <api/api_enums.h>
45#include <api/api_utils.h>
46#include <api/board/board_types.pb.h>
47
48
50 BOARD_ITEM( parent, idtype ),
52{
53 SetMultilineAllowed( true );
54}
55
56
58 BOARD_ITEM( aParent, idtype ),
60{
61 SetKeepUpright( true );
62
63 // N.B. Do not automatically set text effects
64 // These are optional in the file format and so need to be defaulted to off.
65
67
68 if( aParent )
69 {
70 SetTextPos( aParent->GetPosition() );
71
72 if( IsBackLayer( aParent->GetLayer() ) )
74 }
75}
76
77
79{
80}
81
82
83void PCB_TEXT::CopyFrom( const BOARD_ITEM* aOther )
84{
85 wxCHECK( aOther && aOther->Type() == PCB_TEXT_T, /* void */ );
86 *this = *static_cast<const PCB_TEXT*>( aOther );
87}
88
89
90void PCB_TEXT::Serialize( google::protobuf::Any &aContainer ) const
91{
92 using namespace kiapi::common;
93 kiapi::board::types::BoardText boardText;
94
95 boardText.mutable_id()->set_value( m_Uuid.AsStdString() );
96 boardText.set_layer( ToProtoEnum<PCB_LAYER_ID, kiapi::board::types::BoardLayer>( GetLayer() ) );
97 boardText.set_knockout( IsKnockout() );
98 boardText.set_locked( IsLocked() ? types::LockedState::LS_LOCKED
99 : types::LockedState::LS_UNLOCKED );
100
101 google::protobuf::Any any;
102 EDA_TEXT::Serialize( any );
103 any.UnpackTo( boardText.mutable_text() );
104
105 // Some of the common Text message fields are not stored in EDA_TEXT
106 types::Text* text = boardText.mutable_text();
107
108 PackVector2( *text->mutable_position(), GetPosition() );
109
110 aContainer.PackFrom( boardText );
111}
112
113
114bool PCB_TEXT::Deserialize( const google::protobuf::Any &aContainer )
115{
116 using namespace kiapi::common;
117 kiapi::board::types::BoardText boardText;
118
119 if( !aContainer.UnpackTo( &boardText ) )
120 return false;
121
122 SetLayer( FromProtoEnum<PCB_LAYER_ID, kiapi::board::types::BoardLayer>( boardText.layer() ) );
123 const_cast<KIID&>( m_Uuid ) = KIID( boardText.id().value() );
124 SetIsKnockout( boardText.knockout() );
125 SetLocked( boardText.locked() == types::LockedState::LS_LOCKED );
126
127 google::protobuf::Any any;
128 any.PackFrom( boardText.text() );
130
131 const types::Text& text = boardText.text();
132
133 SetPosition( UnpackVector2( text.position() ) );
134
135 return true;
136}
137
138
139wxString PCB_TEXT::GetShownText( bool aAllowExtraText, int aDepth ) const
140{
141 const FOOTPRINT* parentFootprint = GetParentFootprint();
142 const BOARD* board = GetBoard();
143
144 std::function<bool( wxString* )> resolver =
145 [&]( wxString* token ) -> bool
146 {
147 if( token->IsSameAs( wxT( "LAYER" ) ) )
148 {
149 *token = GetLayerName();
150 return true;
151 }
152
153 if( parentFootprint && parentFootprint->ResolveTextVar( token, aDepth + 1 ) )
154 return true;
155
156 // board can be null in some cases when saving a footprint in FP editor
157 if( board && board->ResolveTextVar( token, aDepth + 1 ) )
158 return true;
159
160 return false;
161 };
162
163 wxString text = EDA_TEXT::GetShownText( aAllowExtraText, aDepth );
164
165 if( HasTextVars() )
166 {
167 if( aDepth < ADVANCED_CFG::GetCfg().m_ResolveTextRecursionDepth )
169 }
170
171 return text;
172}
173
174
175bool PCB_TEXT::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const
176{
177 return BOARD_ITEM::Matches( UnescapeString( GetText() ), aSearchData );
178}
179
180
182{
183 EDA_ANGLE rotation = GetTextAngle();
184
186 {
187 // Keep angle between ]-90..90] deg. Otherwise the text is not easy to read
188 while( rotation > ANGLE_90 )
189 rotation -= ANGLE_180;
190
191 while( rotation <= -ANGLE_90 )
192 rotation += ANGLE_180;
193 }
194 else
195 {
196 rotation.Normalize();
197 }
198
199 return rotation;
200}
201
202
204{
205 return GetBoundingBox();
206}
207
208
209std::vector<int> PCB_TEXT::ViewGetLayers() const
210{
213
214 return { GetLayer() };
215}
216
217
218double PCB_TEXT::ViewGetLOD( int aLayer, const KIGFX::VIEW* aView ) const
219{
220 if( !aView )
221 return LOD_SHOW;
222
223 KIGFX::PCB_PAINTER& painter = static_cast<KIGFX::PCB_PAINTER&>( *aView->GetPainter() );
224 KIGFX::PCB_RENDER_SETTINGS& renderSettings = *painter.GetSettings();
225
226 if( !aView->IsLayerVisible( GetLayer() ) )
227 return LOD_HIDE;
228
229 if( aLayer == LAYER_LOCKED_ITEM_SHADOW )
230 {
231 // Hide shadow on dimmed tracks
232 if( renderSettings.GetHighContrast() )
233 {
234 if( m_layer != renderSettings.GetPrimaryHighContrastLayer() )
235 return LOD_HIDE;
236 }
237 }
238
239 if( FOOTPRINT* parentFP = GetParentFootprint() )
240 {
241 // Handle Render tab switches
242 if( GetText() == wxT( "${VALUE}" ) )
243 {
244 if( !aView->IsLayerVisible( LAYER_FP_VALUES ) )
245 return LOD_HIDE;
246 }
247
248 if( GetText() == wxT( "${REFERENCE}" ) )
249 {
250 if( !aView->IsLayerVisible( LAYER_FP_REFERENCES ) )
251 return LOD_HIDE;
252 }
253
254 if( parentFP->GetLayer() == F_Cu && !aView->IsLayerVisible( LAYER_FOOTPRINTS_FR ) )
255 return LOD_HIDE;
256
257 if( parentFP->GetLayer() == B_Cu && !aView->IsLayerVisible( LAYER_FOOTPRINTS_BK ) )
258 return LOD_HIDE;
259
260 if( !aView->IsLayerVisible( LAYER_FP_TEXT ) )
261 return LOD_HIDE;
262 }
263
264 return LOD_SHOW;
265}
266
267
268void PCB_TEXT::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
269{
270 FOOTPRINT* parentFP = GetParentFootprint();
271
272 if( parentFP && aFrame->GetName() == PCB_EDIT_FRAME_NAME )
273 aList.emplace_back( _( "Footprint" ), parentFP->GetReference() );
274
275 // Don't use GetShownText() here; we want to show the user the variable references
276 if( parentFP )
277 aList.emplace_back( _( "Text" ), KIUI::EllipsizeStatusText( aFrame, GetText() ) );
278 else
279 aList.emplace_back( _( "PCB Text" ), KIUI::EllipsizeStatusText( aFrame, GetText() ) );
280
281 if( parentFP )
282 aList.emplace_back( _( "Type" ), GetTextTypeDescription() );
283
284 if( aFrame->GetName() == PCB_EDIT_FRAME_NAME && IsLocked() )
285 aList.emplace_back( _( "Status" ), _( "Locked" ) );
286
287 aList.emplace_back( _( "Layer" ), GetLayerName() );
288
289 aList.emplace_back( _( "Mirror" ), IsMirrored() ? _( "Yes" ) : _( "No" ) );
290
291 aList.emplace_back( _( "Angle" ), wxString::Format( wxT( "%g" ), GetTextAngle().AsDegrees() ) );
292
293 aList.emplace_back( _( "Font" ), GetFont() ? GetFont()->GetName() : _( "Default" ) );
294
295 if( GetTextThickness() )
296 aList.emplace_back( _( "Text Thickness" ), aFrame->MessageTextFromValue( GetEffectiveTextPenWidth() ) );
297 else
298 aList.emplace_back( _( "Text Thickness" ), _( "Auto" ) );
299
300 aList.emplace_back( _( "Width" ), aFrame->MessageTextFromValue( GetTextWidth() ) );
301 aList.emplace_back( _( "Height" ), aFrame->MessageTextFromValue( GetTextHeight() ) );
302}
303
304
306{
308}
309
310
312{
313 SetTextSize( settings.GetTextSize( GetLayer() ) );
315 SetItalic( settings.GetTextItalic( GetLayer() ) );
316 SetKeepUpright( settings.GetTextUpright( GetLayer() ) );
317
318 if( BOARD* board = GetBoard() )
319 SetMirrored( board->IsBackLayer( GetLayer() ) );
320 else
322}
323
324
326{
327 if( !IsKeepUpright() )
328 return;
329
330 EDA_ANGLE newAngle = GetTextAngle();
331 newAngle.Normalize();
332
333 bool needsFlipped = newAngle >= ANGLE_180;
334
335 if( needsFlipped )
336 {
338 SetVertJustify( static_cast<GR_TEXT_V_ALIGN_T>( -GetVertJustify() ) );
339 newAngle += ANGLE_180;
340 newAngle.Normalize();
341 SetTextAngle( newAngle );
342 }
343}
344
345
347{
348 EDA_ANGLE angle = GetDrawRotation();
349 BOX2I rect = GetTextBox( nullptr );
350
351 if( IsKnockout() )
352 rect.Inflate( getKnockoutMargin() );
353
354 if( !angle.IsZero() )
355 rect = rect.GetBoundingBoxRotated( GetTextPos(), angle );
356
357 return rect;
358}
359
360
361bool PCB_TEXT::TextHitTest( const VECTOR2I& aPoint, int aAccuracy ) const
362{
363 int accuracy = aAccuracy;
364
365 if( IsKnockout() )
367
368 return EDA_TEXT::TextHitTest( aPoint, accuracy );
369}
370
371
372bool PCB_TEXT::TextHitTest( const BOX2I& aRect, bool aContains, int aAccuracy ) const
373{
374 BOX2I rect = aRect;
375
376 rect.Inflate( aAccuracy );
377
378 if( aContains )
379 return rect.Contains( GetBoundingBox() );
380
381 return rect.Intersects( GetBoundingBox() );
382}
383
384
385bool PCB_TEXT::TextHitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
386{
387 BOX2I rect = GetTextBox( nullptr );
388
389 if( IsKnockout() )
390 rect.Inflate( getKnockoutMargin() );
391
392 return KIGEOM::BoxHitTest( aPoly, rect, GetDrawRotation(), GetDrawPos(), aContained );
393}
394
395
396void PCB_TEXT::Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle )
397{
398 VECTOR2I pt = GetTextPos();
399 RotatePoint( pt, aRotCentre, aAngle );
400 SetTextPos( pt );
401
402 EDA_ANGLE new_angle = GetTextAngle() + aAngle;
403 new_angle.Normalize();
404 SetTextAngle( new_angle );
405}
406
407
408void PCB_TEXT::Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
409{
410 // the position and justification are mirrored, but not the text itself
411
412 if( aFlipDirection == FLIP_DIRECTION::LEFT_RIGHT )
413 {
416
417 SetTextY( MIRRORVAL( GetTextPos().y, aCentre.y ) );
418 }
419 else
420 {
423
424 SetTextX( MIRRORVAL( GetTextPos().x, aCentre.x ) );
425 }
426}
427
428
429void PCB_TEXT::Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
430{
431 if( aFlipDirection == FLIP_DIRECTION::LEFT_RIGHT )
432 {
433 SetTextX( MIRRORVAL( GetTextPos().x, aCentre.x ) );
435 }
436 else
437 {
438 SetTextY( MIRRORVAL( GetTextPos().y, aCentre.y ) );
440 }
441
443
444 if( IsSideSpecific() )
446}
447
448
450{
451 return _( "Text" );
452}
453
454
455wxString PCB_TEXT::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
456{
457 wxString content = aFull ? GetShownText( false ) : KIUI::EllipsizeMenuText( GetText() );
458
459 if( FOOTPRINT* parentFP = GetParentFootprint() )
460 {
461 wxString ref = parentFP->GetReference();
462 return wxString::Format( _( "Footprint text of %s (%s)" ), ref, content );
463 }
464
465 return wxString::Format( _( "PCB text '%s' on %s" ), content, GetLayerName() );
466}
467
468
470{
471 return BITMAPS::text;
472}
473
474
476{
477 return new PCB_TEXT( *this );
478}
479
480
482{
483 assert( aImage->Type() == PCB_TEXT_T );
484
485 std::swap( *((PCB_TEXT*) this), *((PCB_TEXT*) aImage) );
486}
487
488
489std::shared_ptr<SHAPE> PCB_TEXT::GetEffectiveShape( PCB_LAYER_ID aLayer, FLASHING aFlash ) const
490{
491 if( IsKnockout() )
492 {
493 SHAPE_POLY_SET poly;
494
496
497 return std::make_shared<SHAPE_POLY_SET>( std::move( poly ) );
498 }
499
500 return GetEffectiveTextShape();
501}
502
503
504SHAPE_POLY_SET PCB_TEXT::GetKnockoutCache( const KIFONT::FONT* aFont, const wxString& forResolvedText,
505 int aMaxError ) const
506{
508 EDA_ANGLE drawAngle = GetDrawRotation();
509 VECTOR2I drawPos = GetDrawPos();
510
513 || m_knockout_cache_text != forResolvedText
514 || m_knockout_cache_angle != drawAngle )
515 {
517
520
522 m_knockout_cache_angle = drawAngle;
523 m_knockout_cache_text = forResolvedText;
524 m_knockout_cache_pos = drawPos;
525 }
526 else if( m_knockout_cache_pos != drawPos )
527 {
529 m_knockout_cache_pos = drawPos;
530 }
531
532 return m_knockout_cache;
533}
534
535
536void PCB_TEXT::buildBoundingHull( SHAPE_POLY_SET* aBuffer, const SHAPE_POLY_SET& aRenderedText,
537 int aClearance ) const
538{
539 SHAPE_POLY_SET poly( aRenderedText );
540
541 poly.Rotate( -GetDrawRotation(), GetDrawPos() );
542
543 BOX2I rect = poly.BBox( aClearance );
544 VECTOR2I corners[4];
545
546 corners[0].x = rect.GetOrigin().x;
547 corners[0].y = rect.GetOrigin().y;
548 corners[1].y = corners[0].y;
549 corners[1].x = rect.GetRight();
550 corners[2].x = corners[1].x;
551 corners[2].y = rect.GetBottom();
552 corners[3].y = corners[2].y;
553 corners[3].x = corners[0].x;
554
555 aBuffer->NewOutline();
556
557 for( VECTOR2I& corner : corners )
558 {
559 RotatePoint( corner, GetDrawPos(), GetDrawRotation() );
560 aBuffer->Append( corner.x, corner.y );
561 }
562}
563
564
565void PCB_TEXT::TransformTextToPolySet( SHAPE_POLY_SET& aBuffer, int aClearance, int aMaxError,
566 ERROR_LOC aErrorLoc ) const
567{
569 KIFONT::FONT* font = GetDrawFont( nullptr );
570 int penWidth = GetEffectiveTextPenWidth();
572 wxString shownText = GetShownText( true );
573
574 attrs.m_Angle = GetDrawRotation();
575
576 // The polygonal shape of a text can have many basic shapes, so combining these shapes can
577 // be very useful to create a final shape with a lot less vertices to speedup calculations.
578 // Simplify shapes is not usually always efficient, but in this case it is.
579 SHAPE_POLY_SET textShape;
580
581 CALLBACK_GAL callback_gal( empty_opts,
582 // Stroke callback
583 [&]( const VECTOR2I& aPt1, const VECTOR2I& aPt2 )
584 {
585 TransformOvalToPolygon( textShape, aPt1, aPt2, penWidth, aMaxError, aErrorLoc );
586 },
587 // Triangulation callback
588 [&]( const VECTOR2I& aPt1, const VECTOR2I& aPt2, const VECTOR2I& aPt3 )
589 {
590 textShape.NewOutline();
591
592 for( const VECTOR2I& point : { aPt1, aPt2, aPt3 } )
593 textShape.Append( point.x, point.y );
594 } );
595
596 if( auto* cache = GetRenderCache( font, shownText ) )
597 callback_gal.DrawGlyphs( *cache );
598 else
599 font->Draw( &callback_gal, shownText, GetTextPos(), attrs, GetFontMetrics() );
600
601 textShape.Simplify();
602
603 if( IsKnockout() )
604 {
605 SHAPE_POLY_SET finalPoly;
606 int margin = GetKnockoutTextMargin( attrs.m_Size, penWidth );
607
608 buildBoundingHull( &finalPoly, textShape, margin + aClearance );
609 finalPoly.BooleanSubtract( textShape );
610
611 aBuffer.Append( finalPoly );
612 }
613 else
614 {
615 if( aClearance > 0 || aErrorLoc == ERROR_OUTSIDE )
616 {
617 if( aErrorLoc == ERROR_OUTSIDE )
618 aClearance += aMaxError;
619
620 textShape.Inflate( aClearance, CORNER_STRATEGY::ROUND_ALL_CORNERS, aMaxError );
621 }
622
623 aBuffer.Append( textShape );
624 }
625}
626
627
629 int aClearance, int aMaxError, ERROR_LOC aErrorLoc,
630 bool aIgnoreLineWidth ) const
631{
632 SHAPE_POLY_SET poly;
633
634 TransformTextToPolySet( poly, 0, aMaxError, aErrorLoc );
635
636 buildBoundingHull( &aBuffer, poly, aClearance );
637}
638
639
640bool PCB_TEXT::operator==( const BOARD_ITEM& aBoardItem ) const
641{
642 if( aBoardItem.Type() != Type() )
643 return false;
644
645 const PCB_TEXT& other = static_cast<const PCB_TEXT&>( aBoardItem );
646
647 return *this == other;
648}
649
650
651bool PCB_TEXT::operator==( const PCB_TEXT& aOther ) const
652{
653 return EDA_TEXT::operator==( aOther );
654}
655
656
657double PCB_TEXT::Similarity( const BOARD_ITEM& aOther ) const
658{
659 if( aOther.Type() != Type() )
660 return 0.0;
661
662 const PCB_TEXT& other = static_cast<const PCB_TEXT&>( aOther );
663
664 return EDA_TEXT::Similarity( other );
665}
666
667
668static struct PCB_TEXT_DESC
669{
671 {
678
679 propMgr.Mask( TYPE_HASH( PCB_TEXT ), TYPE_HASH( EDA_TEXT ), _HKI( "Color" ) );
680
681 propMgr.AddProperty( new PROPERTY<PCB_TEXT, bool, BOARD_ITEM>( _HKI( "Knockout" ),
683 _HKI( "Text Properties" ) );
684
685 propMgr.AddProperty( new PROPERTY<PCB_TEXT, bool, EDA_TEXT>( _HKI( "Keep Upright" ),
687 _HKI( "Text Properties" ) );
688
689 auto isFootprintText =
690 []( INSPECTABLE* aItem ) -> bool
691 {
692 if( PCB_TEXT* text = dynamic_cast<PCB_TEXT*>( aItem ) )
693 return text->GetParentFootprint();
694
695 return false;
696 };
697
699 _HKI( "Keep Upright" ), isFootprintText );
700
701 propMgr.Mask( TYPE_HASH( PCB_TEXT ), TYPE_HASH( EDA_TEXT ), _HKI( "Hyperlink" ) );
702 }
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
@ ERROR_INSIDE
Definition: approximation.h:34
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:112
BITMAPS
A list of all bitmap identifiers.
Definition: bitmaps_list.h:33
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:79
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:232
void SetLocked(bool aLocked) override
Definition: board_item.h:323
PCB_LAYER_ID m_layer
Definition: board_item.h:453
virtual bool IsKnockout() const
Definition: board_item.h:319
bool IsLocked() const override
Definition: board_item.cpp:103
virtual void SetIsKnockout(bool aKnockout)
Definition: board_item.h:320
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:280
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Definition: board_item.cpp:79
FOOTPRINT * GetParentFootprint() const
Definition: board_item.cpp:97
const KIFONT::METRICS & GetFontMetrics() const
Definition: board_item.cpp:132
bool IsSideSpecific() const
Definition: board_item.cpp:190
wxString GetLayerName() const
Return the name of the PCB layer on which the item resides.
Definition: board_item.cpp:180
int GetMaxError() const
Definition: board_item.cpp:138
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:317
bool ResolveTextVar(wxString *token, int aDepth) const
Definition: board.cpp:500
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 const Vec & GetOrigin() const
Definition: box2.h:210
const BOX2< Vec > GetBoundingBoxRotated(const VECTOR2I &aRotCenter, const EDA_ANGLE &aAngle) const
Useful to calculate bounding box of rotated items, when rotation is not cardinal.
Definition: box2.h:720
constexpr coord_type GetRight() const
Definition: box2.h:217
constexpr bool Intersects(const BOX2< Vec > &aRect) const
Definition: box2.h:311
constexpr coord_type GetBottom() const
Definition: box2.h:222
EDA_ANGLE Normalize()
Definition: eda_angle.h:229
bool IsZero() const
Definition: eda_angle.h:136
The base class for create windows for drawing purpose.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:98
const KIID m_Uuid
Definition: eda_item.h:516
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:110
virtual bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const
Compare the item against the search criteria in aSearchData.
Definition: eda_item.h:401
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition: eda_text.h:79
int GetTextHeight() const
Definition: eda_text.h:264
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
Definition: eda_text.cpp:187
const VECTOR2I & GetTextPos() const
Definition: eda_text.h:270
const EDA_ANGLE & GetTextAngle() const
Definition: eda_text.h:144
void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
Definition: eda_text.cpp:533
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:97
bool IsKeepUpright() const
Definition: eda_text.h:203
void SetTextPos(const VECTOR2I &aPoint)
Definition: eda_text.cpp:578
void SetTextX(int aX)
Definition: eda_text.cpp:584
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
Definition: eda_text.cpp:223
KIFONT::FONT * GetFont() const
Definition: eda_text.h:244
void SetMirrored(bool isMirrored)
Definition: eda_text.cpp:393
void SetTextY(int aY)
Definition: eda_text.cpp:590
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:676
virtual VECTOR2I GetDrawPos() const
Definition: eda_text.h:375
int GetTextWidth() const
Definition: eda_text.h:261
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:735
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
Definition: eda_text.cpp:417
GR_TEXT_H_ALIGN_T GetHorizJustify() const
Definition: eda_text.h:197
virtual KIFONT::FONT * GetDrawFont(const RENDER_SETTINGS *aSettings) const
Definition: eda_text.cpp:641
bool HasTextVars() const
Indicates the ShownText has text var references which need to be processed.
Definition: eda_text.h:116
double Similarity(const EDA_TEXT &aOther) const
Definition: eda_text.cpp:1267
void SetTextThickness(int aWidth)
The TextThickness is that set by the user.
Definition: eda_text.cpp:284
virtual bool TextHitTest(const VECTOR2I &aPoint, int aAccuracy=0) const
Test if aPoint is within the bounds of this object.
Definition: eda_text.cpp:862
const TEXT_ATTRIBUTES & GetAttributes() const
Definition: eda_text.h:228
bool IsMirrored() const
Definition: eda_text.h:187
int GetEffectiveTextPenWidth(int aDefaultPenWidth=0) const
The EffectiveTextPenWidth uses the text thickness if > 1 or aDefaultPenWidth.
Definition: eda_text.cpp:465
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:1108
void SetKeepUpright(bool aKeepUpright)
Definition: eda_text.cpp:425
GR_TEXT_V_ALIGN_T GetVertJustify() const
Definition: eda_text.h:200
virtual wxString GetShownText(bool aAllowExtraText, int aDepth=0) const
Return the string actually shown after processing of the base text.
Definition: eda_text.h:108
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
Definition: eda_text.cpp:299
int GetTextThickness() const
Definition: eda_text.h:125
void SetItalic(bool aItalic)
Set the text to be italic - this will also update the font if needed.
Definition: eda_text.cpp:307
bool operator==(const EDA_TEXT &aRhs) const
Definition: eda_text.h:393
void SetMultilineAllowed(bool aAllow)
Definition: eda_text.cpp:401
VECTOR2I GetTextSize() const
Definition: eda_text.h:258
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
Definition: eda_text.cpp:409
bool ResolveTextVar(wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the component.
Definition: footprint.cpp:1003
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
Definition: footprint.h:239
const wxString & GetReference() const
Definition: footprint.h:627
VECTOR2I GetPosition() const override
Definition: footprint.h:227
Class that other classes need to inherit from, in order to be inspectable.
Definition: inspectable.h:37
FONT is an abstract base class for both outline and stroke fonts.
Definition: font.h:131
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
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:182
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:187
PCB specific render settings.
Definition: pcb_painter.h:80
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: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
std::string AsStdString() const
Definition: kiid.cpp:252
SHAPE_POLY_SET GetKnockoutCache(const KIFONT::FONT *aFont, const wxString &forResolvedText, int aMaxError) const
Definition: pcb_text.cpp:504
void CopyFrom(const BOARD_ITEM *aOther) override
Definition: pcb_text.cpp:83
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
Definition: pcb_text.cpp:268
double Similarity(const BOARD_ITEM &aBoardItem) const override
Return a measure of how likely the other object is to represent the same object.
Definition: pcb_text.cpp:657
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc, bool aIgnoreLineWidth=false) const override
Convert the item shape to a closed polygon.
Definition: pcb_text.cpp:628
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
Definition: pcb_text.cpp:455
const BOX2I ViewBBox() const override
Return the bounding box of the item covering all its layers.
Definition: pcb_text.cpp:203
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
Definition: pcb_text.cpp:429
virtual void swapData(BOARD_ITEM *aImage) override
Definition: pcb_text.cpp:481
virtual std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const override
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
Definition: pcb_text.cpp:489
void KeepUpright()
Called when rotating the parent footprint.
Definition: pcb_text.cpp:325
bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const override
Compare the item against the search criteria in aSearchData.
Definition: pcb_text.cpp:175
EDA_ANGLE m_knockout_cache_angle
Definition: pcb_text.h:204
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
Definition: pcb_text.cpp:90
wxString GetShownText(bool aAllowExtraText, int aDepth=0) const override
Return the string actually shown after processing of the base text.
Definition: pcb_text.cpp:139
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_text.cpp:408
double ViewGetLOD(int aLayer, const KIGFX::VIEW *aView) const override
Return the level of detail (LOD) of the item.
Definition: pcb_text.cpp:218
~PCB_TEXT()
Definition: pcb_text.cpp:78
virtual VECTOR2I GetPosition() const override
Definition: pcb_text.h:84
PCB_TEXT(BOARD_ITEM *parent, KICAD_T idtype=PCB_TEXT_T)
Definition: pcb_text.cpp:49
wxString m_knockout_cache_text
Definition: pcb_text.h:202
TEXT_ATTRIBUTES m_knockout_cache_text_attrs
Definition: pcb_text.h:203
void StyleFromSettings(const BOARD_DESIGN_SETTINGS &settings) override
Definition: pcb_text.cpp:311
bool operator==(const PCB_TEXT &aOther) const
Definition: pcb_text.cpp:651
int getKnockoutMargin() const
Definition: pcb_text.cpp:305
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...
Definition: pcb_text.cpp:565
SHAPE_POLY_SET m_knockout_cache
Definition: pcb_text.h:206
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
Definition: pcb_text.cpp:346
virtual wxString GetTextTypeDescription() const
Definition: pcb_text.cpp:449
std::vector< int > ViewGetLayers() const override
Definition: pcb_text.cpp:209
void buildBoundingHull(SHAPE_POLY_SET *aBuffer, const SHAPE_POLY_SET &aRenderedText, int aClearance) const
Build a nominally rectangular bounding box for the rendered text.
Definition: pcb_text.cpp:536
bool TextHitTest(const VECTOR2I &aPoint, int aAccuracy=0) const override
Test if aPoint is within the bounds of this object.
Definition: pcb_text.cpp:361
virtual void SetPosition(const VECTOR2I &aPos) override
Definition: pcb_text.h:89
VECTOR2I m_knockout_cache_pos
Definition: pcb_text.h:205
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
Definition: pcb_text.cpp:475
EDA_ANGLE GetDrawRotation() const override
Definition: pcb_text.cpp:181
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
Definition: pcb_text.cpp:114
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
Definition: pcb_text.cpp:396
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
Definition: pcb_text.cpp:469
Provide class metadata.Helper macro to map type hashes to names.
Definition: property_mgr.h:74
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:76
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
void OverrideAvailability(TYPE_ID aDerived, TYPE_ID aBase, const wxString &aName, std::function< bool(INSPECTABLE *)> aFunc)
Sets an override availability functor for a base class property of a given derived class.
void AddTypeCast(TYPE_CAST_BASE *aCast)
Register a type converter.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
Represent a set of closed polygons.
void Rotate(const EDA_ANGLE &aAngle, const VECTOR2I &aCenter={ 0, 0 }) override
Rotate all vertices by a given angle.
void RemoveAllContours()
Remove all outlines & holes (clears) the polygon set.
bool IsEmpty() const
Return true if the set is empty (no polygons at all)
void Fracture()
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
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 Move(const VECTOR2I &aVector) override
void BooleanSubtract(const SHAPE_POLY_SET &b)
Perform boolean polyset difference.
const BOX2I BBox(int aClearance=0) const override
Compute a bounding box of the shape, with a margin of aClearance a collision.
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:413
static constexpr EDA_ANGLE ANGLE_VERTICAL
Definition: eda_angle.h:408
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
Definition: eda_angle.h:407
static constexpr EDA_ANGLE ANGLE_180
Definition: eda_angle.h:415
#define PCB_EDIT_FRAME_NAME
static FILENAME_RESOLVER * resolver
Definition: export_idf.cpp:53
a few functions useful in geometry calculations.
int GetKnockoutTextMargin(const VECTOR2I &aSize, int aThickness)
Return the margin for knocking out text.
Definition: gr_text.h:95
PCB_LAYER_ID FlipLayer(PCB_LAYER_ID aLayerId, int aCopperLayersCount)
Definition: layer_id.cpp:170
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:790
@ LAYER_LOCKED_ITEM_SHADOW
Shadow layer for locked items.
Definition: layer_ids.h:306
@ LAYER_FOOTPRINTS_FR
Show footprints on front.
Definition: layer_ids.h:258
@ LAYER_FP_REFERENCES
Show footprints references (when texts are visible).
Definition: layer_ids.h:265
@ LAYER_FP_TEXT
Definition: layer_ids.h:239
@ LAYER_FOOTPRINTS_BK
Show footprints on back.
Definition: layer_ids.h:259
@ LAYER_FP_VALUES
Show footprints values (when texts are visible).
Definition: layer_ids.h:262
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
@ B_Cu
Definition: layer_ids.h:65
@ F_SilkS
Definition: layer_ids.h:100
@ B_SilkS
Definition: layer_ids.h:101
@ F_Cu
Definition: layer_ids.h:64
constexpr T MIRRORVAL(T aPoint, T aMirrorRef)
Returns the mirror of aPoint relative to the aMirrorRef.
Definition: mirror.h:36
FLIP_DIRECTION
Definition: mirror.h:27
bool BoxHitTest(const VECTOR2I &aHitPoint, const BOX2I &aHittee, int aAccuracy)
Perform a point-to-box hit test.
KICOMMON_API wxString EllipsizeMenuText(const wxString &aString)
Ellipsize text (at the end) to be no more than 36 characters.
Definition: ui_common.cpp:221
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:203
static struct PCB_TEXT_DESC _PCB_TEXT_DESC
#define TYPE_HASH(x)
Definition: property.h:72
#define REGISTER_TYPE(x)
Definition: property_mgr.h:351
wxString UnescapeString(const wxString &aSource)
const int accuracy
GR_TEXT_H_ALIGN_T
This is API surface mapped to common.types.HorizontalAlignment.
GR_TEXT_V_ALIGN_T
This is API surface mapped to common.types.VertialAlignment.
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_TEXT_T
class PCB_TEXT, text on a layer
Definition: typeinfo.h:92
VECTOR2< int32_t > VECTOR2I
Definition: vector2d.h:695