KiCad PCB EDA Suite
Loading...
Searching...
No Matches
board_item.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, see <https://www.gnu.org/licenses/>.
20 */
21
22#include <wx/debug.h>
23#include <wx/msgdlg.h>
24
25#include <i18n_utility.h>
26#include <macros.h>
27#include <board.h>
28#include <board_item_index.h>
31#include <lset.h>
32#include <pcb_group.h>
33#include <pcb_generator.h>
34#include <footprint.h>
35#include <font/font.h>
36#include <properties/property.h>
38
39
40bool BOARD_ITEM::FitsEnabledLayers( const LSET& aEnabledLayers, int aCopperLayerCount ) const
41{
42 return IsLayerAgnostic() || ( GetLayerSet() & aEnabledLayers ).any();
43}
44
45
47{
48 switch ( Type() )
49 {
50 case PCB_FOOTPRINT_T:
51 case PCB_PAD_T:
52 case PCB_SHAPE_T:
54 case PCB_FIELD_T:
55 case PCB_TEXT_T:
56 case PCB_TEXTBOX_T:
57 case PCB_TABLE_T:
59 case PCB_DRILL_MAP_T:
60 case PCB_GROUP_T:
61 case PCB_GENERATOR_T:
62 case PCB_TRACE_T:
63 case PCB_VIA_T:
64 case PCB_ARC_T:
65 case PCB_DIMENSION_T:
71 case PCB_ZONE_T:
72 case PCB_BARCODE_T:
73 case PCB_POINT_T:
74 case PCB_GRID_ITEM_T:
75 return true;
76 default:
77 return false;
78 }
79}
80
81
82void BOARD_ITEM::CopyFrom( const BOARD_ITEM* aOther )
83{
84 wxCHECK( aOther, /* void */ );
85 *this = *aOther;
86}
87
88
90{
91 if( Type() == PCB_T )
92 return static_cast<const BOARD*>( this );
93
94 return static_cast<const BOARD*>( findParent( PCB_T ) );
95}
96
97
99{
100 if( Type() == PCB_T )
101 return static_cast<BOARD*>( this );
102
103 return static_cast<BOARD*>( findParent( PCB_T ) );
104}
105
106
108{
109 // Backup for code paths that skip ::Remove(). Do not use the parent chain, it may be freed.
110 if( m_owningIndex )
111 m_owningIndex->UnbindItem( *this );
112}
113
114
116{
117 return static_cast<FOOTPRINT*>( findParent( PCB_FOOTPRINT_T ) );
118}
119
120
121void BOARD_ITEM::SetUuid( const KIID& aUuid )
122{
123 if( m_Uuid == aUuid )
124 return;
125
126 // Use the index that holds us, not GetBoard(). The parent chain may name a wrong or dead
127 // board.
128 if( BOARD_ITEM_INDEX* owningIndex = m_owningIndex )
129 {
130 owningIndex->Rebind( *this, aUuid );
131 return;
132 }
133
134 SetUuidDirect( aUuid );
135}
136
137
138void BOARD_ITEM::SetUuidDirect( const KIID& aUuid )
139{
140 const_cast<KIID&>( m_Uuid ) = aUuid;
141}
142
143
145{
147 {
148 if( group->AsEdaItem()->IsLocked() )
149 return true;
150 }
151
152 if( !GetBoard() || GetBoard()->GetBoardUse() == BOARD_USE::FPHOLDER )
153 return false;
154
155 return m_isLocked;
156}
157
158
160{
161 wxFAIL_MSG( wxString( "GetStroke() not defined by " ) + GetClass() );
162
163 return STROKE_PARAMS( pcbIUScale.mmToIU( DEFAULT_LINE_WIDTH ) );
164}
165
166
168{
169 wxFAIL_MSG( wxString( "SetStroke() not defined by " ) + GetClass() );
170}
171
172
177
178
180{
181 if( const BOARD* board = GetBoard() )
182 return board->GetDesignSettings().m_MaxError;
183
184 return ARC_HIGH_DEF;
185}
186
187
189{
190 wxASSERT_MSG( IsSingleLayerType( Type() ),
191 wxString::Format( wxT( "GetLayer() must be overridden for multi-layer types (%s)." ), GetClass() ) );
192
193 return m_layer;
194}
195
196
198{
199 const BOARD* board = GetBoard();
200
201 if( board )
202 return board->FlipLayer( aLayer );
203
204 return ::FlipLayer( aLayer );
205}
206
208{
209 const BOARD* board = GetBoard();
210
211 if( board )
212 return board->GetLayerSet().count();
213
214 return 64;
215}
216
217
219{
220 const BOARD* board = GetBoard();
221
222 if( board )
223 return board->GetCopperLayerCount();
224
225 return 32;
226}
227
228
230{
231 const BOARD* board = GetBoard();
232
233 if( board )
234 return board->GetEnabledLayers();
235
236 return LSET::AllLayersMask();
237}
238
239
241{
242 return GetLayerName( m_layer );
243}
244
245
247{
248 const BOARD* board = GetBoard();
249
250 if( board )
251 return board->GetLayerName( aLayer );
252
253 // If no parent, return standard name
254 return BOARD::GetStandardLayerName( aLayer );
255}
256
257
259{
260 if( ( GetLayerSet() & LSET::SideSpecificMask() ).any() )
261 return true;
262
263 if( const BOARD* board = GetBoard() )
264 {
265 LAYER_T principalLayerType = board->GetLayerType( m_layer );
266
267 if( principalLayerType == LT_FRONT || principalLayerType == LT_BACK )
268 return true;
269 }
270
271 return false;
272}
273
274
276{
277 const BOARD* board = GetBoard();
278 LSET layers = GetLayerSet();
279 int copperLayerCount = MAX_CU_LAYERS;
280
281 if( board )
282 {
283 layers &= board->GetEnabledLayers();
284 copperLayerCount = board->GetCopperLayerCount();
285 }
286
287 LSET copperLayers = layers & LSET::AllCuMask();
288 LSET techLayers = layers & LSET::AllTechMask();
289
290 // Try to be smart and useful. Check all copper first.
291 if( (int) copperLayers.count() == copperLayerCount )
292 return _( "all copper layers" );
293
294 for( LSET testLayers : { copperLayers, techLayers, layers } )
295 {
296 for( int layer = PCBNEW_LAYER_ID_START; layer < PCB_LAYER_ID_COUNT; ++layer )
297 {
298 if( testLayers[ layer ] )
299 {
300 wxString layerInfo = board ? board->GetLayerName( ToLAYER_ID( layer ) )
301 : LayerName( ToLAYER_ID( layer ) );
302
303 if( testLayers.count() > 1 )
304 layerInfo << wxS( " " ) + _( "and others" );
305
306 return layerInfo;
307 }
308 }
309 }
310
311 // No copper, no technicals: no layer
312 return _( "no layers" );
313}
314
315
316std::vector<int> BOARD_ITEM::ViewGetLayers() const
317{
318 // Basic fallback
319 if( IsLocked() )
321
322 return { m_layer };
323}
324
325
327{
329
330 if( parent )
331 parent->Remove( this );
332
333 delete this;
334}
335
336
338{
340}
341
342
344{
345 if( aImage == nullptr )
346 return;
347
348 EDA_ITEM* parent = GetParent();
350 EDA_GROUP* imageGroup = aImage->GetParentGroup();
351 BOARD* board = GetBoard();
352
353 // Evict children from the item-by-id cache before the swap moves them to the
354 // image. The image is typically deleted after the swap (undo/redo, commit revert),
355 // which would leave the cache holding dangling pointers to the destroyed children.
356 if( board )
357 {
358 board->UncacheChildrenById( *this );
359 }
360
361 swapData( aImage );
362 SetParent( parent );
363
364 // Group membership is a back-reference, not item data, so keep each side's own.
366 aImage->SetParentGroup( imageGroup );
367
368 if( board )
369 {
370 board->CacheChildrenById( *this );
371 }
372}
373
374
375BOARD_ITEM* BOARD_ITEM::Duplicate( bool addToParentGroup, BOARD_COMMIT* aCommit ) const
376{
377 BOARD_ITEM* dupe = static_cast<BOARD_ITEM*>( Clone() );
378 dupe->ResetUuid();
379
380 if( addToParentGroup )
381 {
382 wxCHECK_MSG( aCommit, dupe, "Must supply a commit to update parent group" );
383
384 if( EDA_GROUP* group = dupe->GetParentGroup() )
385 {
386 aCommit->Modify( group->AsEdaItem(), nullptr, RECURSE_MODE::NO_RECURSE );
387 group->AddItem( dupe );
388 }
389 }
390
391 return dupe;
392}
393
394
396 int aClearance, int aError, ERROR_LOC aErrorLoc,
397 bool ignoreLineWidth ) const
398{
399 wxCHECK_MSG( false, /* void */,
400 wxString::Format( wxT( "%s doesn't implement TransformShapeToPolygon()" ), GetClass() ) );
401}
402
403
404double BOARD_ITEM::GetCoverageArea( int aTextMargin ) const
405{
406 SHAPE_POLY_SET poly;
408 return polygonArea( poly );
409}
410
411
413{
414 for( int ii = 0; ii < aPolySet.OutlineCount(); ii++ )
415 {
416 aPolySet.Outline( ii ).SetClosed( true );
417
418 for( int jj = 0; jj < aPolySet.HoleCount( ii ); jj++ )
419 aPolySet.Hole( ii, jj ).SetClosed( true );
420 }
421
422 return aPolySet.Area();
423}
424
425
427{
428 if( a->Type() != b->Type() )
429 return a->Type() < b->Type();
430
431 if( a->GetLayerSet() != b->GetLayerSet() )
432 return a->GetLayerSet().Seq() < b->GetLayerSet().Seq();
433
434 if( a->m_Uuid != b->m_Uuid ) // UUIDs *should* always be unique (for valid boards anyway)
435 return a->m_Uuid < b->m_Uuid;
436
437 return a < b; // But just in case; ptrs are guaranteed to be different
438}
439
440
442{
443 static std::shared_ptr<SHAPE> shape;
444
446
447 return shape;
448}
449
450
452{
453 static std::shared_ptr<SHAPE_SEGMENT> slot;
454
456
457 return slot;
458}
459
460
462{
463 if( FOOTPRINT* parentFP = GetParentFootprint() )
464 return parentFP->GetTransform().InverseApply( GetPosition() );
465
466 return GetPosition();
467}
468
469
471{
472 if( FOOTPRINT* parentFP = GetParentFootprint() )
473 SetPosition( parentFP->GetTransform().Apply( aPos ) );
474 else
475 SetPosition( aPos );
476}
477
478
479void BOARD_ITEM::Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle )
480{
481 wxMessageBox( wxT( "virtual BOARD_ITEM::Rotate used, should not occur" ), GetClass() );
482}
483
484
485void BOARD_ITEM::Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
486{
487 wxMessageBox( wxT( "virtual BOARD_ITEM::Flip used, should not occur" ), GetClass() );
488}
489
490
491void BOARD_ITEM::Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
492{
493 wxMessageBox( wxT( "virtual BOARD_ITEM::Mirror used, should not occur" ), GetClass() );
494}
495
496
498{
499 if( FOOTPRINT* fp = dynamic_cast<FOOTPRINT*>( m_parent ) )
500 return fp->GetReference();
501
502 return m_parent->m_Uuid.AsString();
503}
504
505
506const std::vector<wxString>* BOARD_ITEM::GetEmbeddedFonts()
507{
508 if( BOARD* board = GetBoard() )
509 return board->GetFontFiles();
510
511 return nullptr;
512}
513
514
515static struct BOARD_ITEM_DESC
516{
518 {
520
521 if( layerEnum.Choices().GetCount() == 0 )
522 {
523 layerEnum.Undefined( UNDEFINED_LAYER );
524
525 for( PCB_LAYER_ID layer : LSET::AllLayersMask() )
526 layerEnum.Map( layer, LSET::Name( layer ) );
527 }
528
532
533 propMgr.AddProperty( new PROPERTY<BOARD_ITEM, wxString>( _HKI( "Parent" ),
537
538 auto isNotFootprintHolder =
539 []( INSPECTABLE* aItem ) -> bool
540 {
541 BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( aItem );
542 return item && item->GetBoard() && !item->GetBoard()->IsFootprintHolder();
543 };
544
545 propMgr.AddProperty( new PROPERTY<BOARD_ITEM, int>( _HKI( "Position X" ),
548 propMgr.AddProperty( new PROPERTY<BOARD_ITEM, int>( _HKI( "Position Y" ),
553 propMgr.AddProperty( new PROPERTY<BOARD_ITEM, bool>( _HKI( "Locked" ),
555 .SetAvailableFunc( isNotFootprintHolder );
556 }
558
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
@ ERROR_OUTSIDE
constexpr int ARC_HIGH_DEF
Definition base_units.h:144
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:128
constexpr int ARC_LOW_DEF
Definition base_units.h:143
@ FPHOLDER
Definition board.h:403
LAYER_T
The allowed types of layers, same as Specctra DSN spec.
Definition board.h:243
@ LT_FRONT
Definition board.h:250
@ LT_BACK
Definition board.h:251
#define DEFAULT_LINE_WIDTH
static struct BOARD_ITEM_DESC _BOARD_ITEM_DESC
Abstract interface for BOARD_ITEMs capable of storing other items inside.
virtual void Remove(BOARD_ITEM *aItem, REMOVE_MODE aMode=REMOVE_MODE::NORMAL)=0
Removes an item from the container.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition board_item.h:85
BOARD_ITEM(BOARD_ITEM *aParent, KICAD_T idtype, PCB_LAYER_ID aLayer=F_Cu)
Definition board_item.h:87
virtual void Mirror(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection)
Mirror this object relative to a given horizontal axis the layer is not changed.
void SetUuidDirect(const KIID &aUuid)
Raw UUID assignment.
int GetY() const
Definition board_item.h:140
bool IsGroupableType() const
virtual BOARD_ITEM * Duplicate(bool addToParentGroup, BOARD_COMMIT *aCommit=nullptr) const
Create a copy of this BOARD_ITEM.
void DeleteStructure()
Delete this object after removing from its parent if it has one.
const std::vector< wxString > * GetEmbeddedFonts() override
void SwapItemData(BOARD_ITEM *aImage)
Swap data between aItem and aImage.
void SetLocked(bool aLocked) override
Definition board_item.h:427
virtual STROKE_PARAMS GetStroke() const
PCB_LAYER_ID GetFlippedLayer(PCB_LAYER_ID aLayer) const
Return the layer paired with aLayer on the opposite side of the board.
virtual int BoardLayerCount() const
Return the total number of layers for the board that this item resides on.
virtual void SetStroke(const STROKE_PARAMS &aStroke)
void SetUuid(const KIID &aUuid)
static double polygonArea(SHAPE_POLY_SET &aPolySet)
Area of aPolySet with every contour closed first, holes subtracted.
PCB_LAYER_ID m_layer
Definition board_item.h:600
bool m_isLocked
Definition board_item.h:602
wxString GetParentAsString() const
For "parent" property.
virtual std::shared_ptr< SHAPE_SEGMENT > GetEffectiveHoleShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, DRC_CONSTRAINT_T aUsage=NULL_CONSTRAINT) const
int GetX() const
Definition board_item.h:134
bool IsLocked() const override
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
virtual void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const
Convert the item shape to a closed polygon.
virtual void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle)
Rotate this object.
void SetX(int aX)
Definition board_item.h:156
void SetY(int aY)
Definition board_item.h:162
virtual double GetCoverageArea(int aTextMargin) const
Return the board area this item covers, used to rank candidates under the cursor so a click on a smal...
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition board_item.h:383
virtual std::vector< int > ViewGetLayers() const override
Return the all the layers within the VIEW the object is painted on.
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
FOOTPRINT * GetParentFootprint() const
VECTOR2I GetFPRelativePosition() const
virtual LSET BoardLayerSet() const
Return the LSET for the board that this item resides on.
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
Definition board_item.h:355
virtual bool IsLayerAgnostic() const
Check if this item's layer set must not be confined to a board's enabled layers.
Definition board_item.h:308
virtual void swapData(BOARD_ITEM *aImage)
const KIFONT::METRICS & GetFontMetrics() const
~BOARD_ITEM() override
friend class BOARD_ITEM_INDEX
Definition board_item.h:610
void SetFPRelativePosition(const VECTOR2I &aPos)
virtual wxString LayerMaskDescribe() const
Return a string (to be shown to the user) describing a layer mask.
virtual bool FitsEnabledLayers(const LSET &aEnabledLayers, int aCopperLayerCount) const
Check if a board offering aEnabledLayers can hold this item.
virtual void CopyFrom(const BOARD_ITEM *aOther)
void ResetUuid()
Definition board_item.h:281
BOARD_ITEM_INDEX * m_owningIndex
Board index that indexes this item, or nullptr.
Definition board_item.h:608
BOARD_ITEM_CONTAINER * GetParent() const
Definition board_item.h:267
bool IsSideSpecific() const
virtual int BoardCopperLayerCount() const
Return the total number of copper layers for the board that this item resides on.
virtual std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT, DRC_CONSTRAINT_T aUsage=NULL_CONSTRAINT) const
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
wxString GetLayerName() const
Return the name of the PCB layer on which the item resides.
int GetMaxError() const
virtual void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection)
Flip this object, i.e.
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:411
bool IsFootprintHolder() const
Find out if the board is being used to hold a single footprint for editing/viewing.
Definition board.h:441
void CacheChildrenById(const BOARD_ITEM &aParent)
Definition board.h:1731
static wxString GetStandardLayerName(PCB_LAYER_ID aLayerId)
Return an "English Standard" name of a PCB layer when given aLayerNumber.
Definition board.h:1122
LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
Definition board.h:899
PCB_LAYER_ID FlipLayer(PCB_LAYER_ID aLayer) const
Definition board.cpp:1120
int GetCopperLayerCount() const
Definition board.cpp:1127
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
Definition board.cpp:932
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
Definition board.cpp:1174
void UncacheChildrenById(const BOARD_ITEM &aParent)
Definition board.h:1737
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
Definition commit.h:102
A set of EDA_ITEMs (i.e., without duplicates).
Definition eda_group.h:43
A base class for most all the KiCad significant classes used in schematics and boards.
Definition eda_item.h:98
virtual VECTOR2I GetPosition() const
Definition eda_item.h:348
virtual void SetPosition(const VECTOR2I &aPos)
Definition eda_item.h:349
const KIID m_Uuid
Definition eda_item.h:599
virtual EDA_GROUP * GetParentGroup() const
Definition eda_item.h:116
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
virtual void SetParentGroup(EDA_GROUP *aGroup)
Definition eda_item.h:115
virtual EDA_ITEM * Clone() const
Create a duplicate of this item with linked list members set to NULL.
Definition eda_item.cpp:278
virtual void SetParent(EDA_ITEM *aParent)
Definition eda_item.cpp:153
EDA_ITEM * m_parent
Owner.
Definition eda_item.h:609
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:84
EDA_ITEM * findParent(KICAD_T aType) const
Definition eda_item.cpp:137
ENUM_MAP & Map(T aValue, const wxString &aName)
Definition property.h:798
static ENUM_MAP< T > & Instance()
Definition property.h:792
ENUM_MAP & Undefined(T aValue)
Definition property.h:805
wxPGChoices & Choices()
Definition property.h:843
Class that other classes need to inherit from, in order to be inspectable.
Definition inspectable.h:39
static const METRICS & Default()
Definition font.cpp:49
virtual wxString GetClass() const =0
Return the class name.
Definition kiid.h:46
LSET is a set of PCB_LAYER_IDs.
Definition lset.h:37
static const LSET & AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
Definition lset.cpp:604
static const LSET & SideSpecificMask()
Definition lset.cpp:732
LSEQ Seq(const LSEQ &aSequence) const
Return an LSEQ from the union of this LSET and a desired sequence.
Definition lset.cpp:309
static const LSET & AllTechMask()
Return a mask holding all technical layers (no CU layer) on both side.
Definition lset.cpp:672
static const LSET & AllLayersMask()
Definition lset.cpp:637
static wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Definition lset.cpp:184
PROPERTY_BASE & SetAvailableFunc(std::function< bool(INSPECTABLE *)> aFunc)
Set a callback function to determine whether an object provides this property.
Definition property.h:275
PROPERTY_BASE & SetIsCopyable(bool aIsCopyable=true)
Definition property.h:371
PROPERTY_BASE & SetIsHiddenFromPropertiesManager(bool aHide=true)
Definition property.h:337
PROPERTY_BASE & SetIsHiddenFromLibraryEditors(bool aIsHidden=true)
Definition property.h:351
Provide class metadata.
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
static PROPERTY_MANAGER & Instance()
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
Represent a set of closed polygons.
double Area()
Return the area of this poly set.
int HoleCount(int aOutline) const
Returns the number of holes in a given outline.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
SHAPE_LINE_CHAIN & Hole(int aOutline, int aHole)
Return the reference to aHole-th hole in the aIndex-th outline.
int OutlineCount() const
Return the number of outlines in the set.
Simple container to manage line stroke parameters.
A type-safe container of any type.
Definition ki_any.h:92
#define _(s)
@ NO_RECURSE
Definition eda_item.h:52
Some functions to handle hotkeys in KiCad.
wxString LayerName(int aLayer)
Returns the default display name for a given layer.
Definition layer_id.cpp:31
constexpr PCB_LAYER_ID PCBNEW_LAYER_ID_START
Definition layer_ids.h:170
FLASHING
Enum used during connectivity building to ensure we do not query connectivity while building the data...
Definition layer_ids.h:180
#define MAX_CU_LAYERS
Definition layer_ids.h:172
@ LAYER_LOCKED_ITEM_SHADOW
Shadow layer for locked items.
Definition layer_ids.h:303
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
@ UNDEFINED_LAYER
Definition layer_ids.h:57
@ PCB_LAYER_ID_COUNT
Definition layer_ids.h:167
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition lset.cpp:750
This file contains miscellaneous commonly used macros and functions.
#define UNIMPLEMENTED_FOR(type)
Definition macros.h:92
FLIP_DIRECTION
Definition mirror.h:23
#define _HKI(x)
Definition page_info.cpp:40
Class to handle a set of BOARD_ITEMs.
#define TYPE_HASH(x)
Macro to generate unique identifier for a type.
Definition property.h:74
#define IMPLEMENT_ENUM_TO_WXANY(type)
Definition property.h:897
#define NO_SETTER(owner, type)
Macro to define read-only fields (no setter method available)
Definition property.h:904
@ PT_COORD
Coordinate expressed in distance units (mm/inch)
Definition property.h:65
#define REGISTER_TYPE(x)
Helper macro to map type hashes to names.
bool operator()(const BOARD_ITEM *a, const BOARD_ITEM *b) const
constexpr bool IsSingleLayerType(const KICAD_T aType)
Definition typeinfo.h:516
@ PCB_T
Definition typeinfo.h:74
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
Definition typeinfo.h:80
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
Definition typeinfo.h:98
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
Definition typeinfo.h:95
@ PCB_GENERATOR_T
class PCB_GENERATOR, generator on a layer
Definition typeinfo.h:83
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
Definition typeinfo.h:89
@ PCB_DRILL_MAP_T
class PCB_DRILL_MAP, drill symbols drawn at the holes
Definition typeinfo.h:240
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
Definition typeinfo.h:96
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
Definition typeinfo.h:103
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
Definition typeinfo.h:85
@ PCB_ZONE_T
class ZONE, a copper pour area
Definition typeinfo.h:100
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
Definition typeinfo.h:84
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
Definition typeinfo.h:81
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
Definition typeinfo.h:82
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
Definition typeinfo.h:93
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
Definition typeinfo.h:78
@ PCB_GRID_ITEM_T
a subgrid placed on a board
Definition typeinfo.h:238
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
Definition typeinfo.h:94
@ PCB_PAD_T
class PAD, a pad in a footprint
Definition typeinfo.h:79
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
Definition typeinfo.h:90
@ PCB_DIMENSION_T
class PCB_DIMENSION_BASE: abstract dimension meta-type
Definition typeinfo.h:92
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
Definition typeinfo.h:86
@ PCB_POINT_T
class PCB_POINT, a 0-dimensional point
Definition typeinfo.h:105
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
Definition typeinfo.h:88
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
Definition typeinfo.h:97
@ PCB_DRILL_CHART_T
class PCB_DRILL_CHART, a live drill chart derived from PCB_TABLE
Definition typeinfo.h:239
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:708