KiCad PCB EDA Suite
Loading...
Searching...
No Matches
board_item.h
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) 2018 Jean-Pierre Charras, jp.charras at wandadoo.fr
5 * Copyright (C) 1992-2024 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#pragma once
26
27
28#include <core/mirror.h>
29#include <eda_item.h>
31#include <layer_ids.h>
32#include <lseq.h>
33#include <lset.h>
34#include <stroke_params.h>
35#include <geometry/eda_angle.h>
36
37class BOARD;
40class SHAPE_POLY_SET;
41class SHAPE_SEGMENT;
42class PCB_BASE_FRAME;
43class SHAPE;
44class PCB_GROUP;
45class FOOTPRINT;
46
47namespace KIFONT
48{
49class METRICS;
50}
51
52
66{
70};
71
72
78class BOARD_ITEM : public EDA_ITEM
79{
80public:
81 BOARD_ITEM( BOARD_ITEM* aParent, KICAD_T idtype, PCB_LAYER_ID aLayer = F_Cu ) :
82 EDA_ITEM( aParent, idtype, false, true ), m_layer( aLayer ), m_isKnockout( false ),
83 m_isLocked( false ), m_group( nullptr )
84 {
85 }
86
88
89 void SetParentGroup( PCB_GROUP* aGroup ) { m_group = aGroup; }
90 PCB_GROUP* GetParentGroup() const { return m_group; }
91
92 // Do not create a copy constructor & operator=.
93 // The ones generated by the compiler are adequate.
94 int GetX() const
95 {
97 return p.x;
98 }
99
100 int GetY() const
101 {
102 VECTOR2I p = GetPosition();
103 return p.y;
104 }
105
111 virtual VECTOR2I GetCenter() const
112 {
113 return GetBoundingBox().GetCenter();
114 }
115
116 void SetX( int aX )
117 {
118 VECTOR2I p( aX, GetY() );
119 SetPosition( p );
120 }
121
122 void SetY( int aY )
123 {
124 VECTOR2I p( GetX(), aY );
125 SetPosition( p );
126 }
127
133 virtual bool IsConnected() const
134 {
135 return false;
136 }
137
144 virtual double Similarity( const BOARD_ITEM& aItem ) const = 0;
145 virtual bool operator==( const BOARD_ITEM& aItem ) const = 0;
146
150 virtual bool IsOnCopperLayer() const
151 {
152 return IsCopperLayer( GetLayer() );
153 }
154
155 virtual bool HasHole() const
156 {
157 return false;
158 }
159
160 virtual bool HasDrilledHole() const
161 {
162 return false;
163 }
164
172 virtual bool IsTented( PCB_LAYER_ID aLayer ) const
173 {
174 return false;
175 }
176
181
197 virtual std::shared_ptr<SHAPE> GetEffectiveShape( PCB_LAYER_ID aLayer = UNDEFINED_LAYER,
198 FLASHING aFlash = FLASHING::DEFAULT ) const;
199
200 virtual std::shared_ptr<SHAPE_SEGMENT> GetEffectiveHoleShape() const;
201
206 virtual void RunOnChildren( const std::function<void ( BOARD_ITEM* )>& aFunction ) const { }
207
212 virtual void RunOnDescendants( const std::function<void ( BOARD_ITEM* )>& aFunction,
213 int aDepth = 0 ) const { }
214
216
218
220 void SetFPRelativePosition( const VECTOR2I& aPos );
221
227 virtual bool HasLineStroke() const { return false; }
228
229 virtual STROKE_PARAMS GetStroke() const;
230 virtual void SetStroke( const STROKE_PARAMS& aStroke );
231
232 const KIFONT::METRICS& GetFontMetrics() const;
233
237 virtual PCB_LAYER_ID GetLayer() const { return m_layer; }
238
242 virtual int BoardLayerCount() const;
243
247 virtual int BoardCopperLayerCount() const;
248
252 virtual LSET BoardLayerSet() const;
253
257 virtual LSET GetLayerSet() const
258 {
259 if( m_layer == UNDEFINED_LAYER )
260 return LSET();
261 else
262 return LSET( { m_layer } );
263 }
264
265 virtual void SetLayerSet( const LSET& aLayers )
266 {
267 if( aLayers.count() == 1 )
268 {
269 SetLayer( aLayers.Seq()[0] );
270 return;
271 }
272
273 wxFAIL_MSG( wxT( "Attempted to SetLayerSet() on a single-layer object." ) );
274
275 // Derived classes which support multiple layers must implement this
276 }
277
278 bool IsSideSpecific() const;
279
288 virtual void SetLayer( PCB_LAYER_ID aLayer )
289 {
290 m_layer = aLayer;
291 }
292
296 virtual BOARD_ITEM* Duplicate() const;
297
308 void SwapItemData( BOARD_ITEM* aImage );
309
319 virtual bool IsOnLayer( PCB_LAYER_ID aLayer ) const
320 {
321 return m_layer == aLayer;
322 }
323
324 virtual bool IsKnockout() const { return m_isKnockout; }
325 virtual void SetIsKnockout( bool aKnockout ) { m_isKnockout = aKnockout; }
326
327 virtual bool IsLocked() const;
328 virtual void SetLocked( bool aLocked ) { m_isLocked = aLocked; }
329
330 virtual void StyleFromSettings( const BOARD_DESIGN_SETTINGS& settings ) { }
331
335 void DeleteStructure();
336
342 virtual void Move( const VECTOR2I& aMoveVector )
343 {
344 wxFAIL_MSG( wxT( "virtual BOARD_ITEM::Move called for " ) + GetClass() );
345 }
346
352 virtual void Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle );
353
360 virtual void Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection );
361
368 virtual void Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection );
369
373 virtual void Normalize() {}
374
380 virtual void NormalizeForCompare() { Normalize(); }
381
385 virtual const BOARD* GetBoard() const;
386 virtual BOARD* GetBoard();
387
392 wxString GetParentAsString() const;
393
399 wxString GetLayerName() const;
400
401 virtual void ViewGetLayers( int aLayers[], int& aCount ) const override;
402
413 virtual void TransformShapeToPolygon( SHAPE_POLY_SET& aBuffer, PCB_LAYER_ID aLayer,
414 int aClearance, int aError, ERROR_LOC aErrorLoc,
415 bool ignoreLineWidth = false ) const;
416
417 enum COMPARE_FLAGS : int
418 {
419 DRC = 0x01
420 };
421
422 struct ptr_cmp
423 {
424 bool operator() ( const BOARD_ITEM* a, const BOARD_ITEM* b ) const;
425 };
426
427protected:
431 virtual wxString layerMaskDescribe() const;
432
433 virtual void swapData( BOARD_ITEM* aImage );
434
435protected:
438
440
442};
443
444#ifndef SWIG
446#endif
447
448
455{
456public:
458 BOARD_ITEM( nullptr, NOT_USED )
459 {}
460
461 wxString GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const override
462 {
463 return _( "(Deleted Item)" );
464 }
465
466 wxString GetClass() const override
467 {
468 return wxT( "DELETED_BOARD_ITEM" );
469 }
470
471 // pure virtuals:
472 void SetPosition( const VECTOR2I& ) override {}
473 VECTOR2I GetPosition() const override { return VECTOR2I( 0, 0 ); }
474
476 {
477 static DELETED_BOARD_ITEM* item = nullptr;
478
479 if( !item )
480 item = new DELETED_BOARD_ITEM();
481
482 return item;
483 }
484
485 double Similarity( const BOARD_ITEM& aItem ) const override
486 {
487 return ( this == &aItem ) ? 1.0 : 0.0;
488 }
489
490 bool operator==( const BOARD_ITEM& aBoardItem ) const override
491 {
492 return ( this == &aBoardItem );
493 }
494
495 bool operator==( const DELETED_BOARD_ITEM& aOther ) const
496 {
497 return ( this == &aOther );
498 }
499
500#if defined(DEBUG)
501 void Show( int , std::ostream& ) const override {}
502#endif
503};
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
ZONE_LAYER_OVERRIDE
Conditionally flashed vias and pads that interact with zones of different priority can be very squirr...
Definition: board_item.h:66
@ ZLO_NONE
Definition: board_item.h:67
@ ZLO_FORCE_NO_ZONE_CONNECTION
Definition: board_item.h:69
@ ZLO_FORCE_FLASHED
Definition: board_item.h:68
Container for design settings for a BOARD object.
Abstract interface for BOARD_ITEMs capable of storing other items inside.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:79
BOARD_ITEM(BOARD_ITEM *aParent, KICAD_T idtype, PCB_LAYER_ID aLayer=F_Cu)
Definition: board_item.h:81
virtual void Mirror(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection)
Mirror this object relative to a given horizontal axis the layer is not changed.
Definition: board_item.cpp:368
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:237
virtual void StyleFromSettings(const BOARD_DESIGN_SETTINGS &settings)
Definition: board_item.h:330
void SetParentGroup(PCB_GROUP *aGroup)
Definition: board_item.h:89
int GetY() const
Definition: board_item.h:100
virtual void NormalizeForCompare()
Perform any normalization required to compare 2 graphics, especially if the can be rotated and/or fli...
Definition: board_item.h:380
void DeleteStructure()
Delete this object after removing from its parent if it has one.
Definition: board_item.cpp:210
void SwapItemData(BOARD_ITEM *aImage)
Swap data between aItem and aImage.
Definition: board_item.cpp:226
virtual STROKE_PARAMS GetStroke() const
Definition: board_item.cpp:86
virtual bool IsConnected() const
Returns information if the object is derived from BOARD_CONNECTED_ITEM.
Definition: board_item.h:133
bool m_isKnockout
Definition: board_item.h:437
virtual void SetLocked(bool aLocked)
Definition: board_item.h:328
virtual int BoardLayerCount() const
Return the total number of layers for the board that this item resides on.
Definition: board_item.cpp:106
PCB_GROUP * GetParentGroup() const
Definition: board_item.h:90
PCB_GROUP * m_group
Definition: board_item.h:441
virtual void SetStroke(const STROKE_PARAMS &aStroke)
Definition: board_item.cpp:94
PCB_LAYER_ID m_layer
Definition: board_item.h:436
virtual void SetLayerSet(const LSET &aLayers)
Definition: board_item.h:265
bool m_isLocked
Definition: board_item.h:439
wxString GetParentAsString() const
For "parent" property.
Definition: board_item.cpp:374
virtual bool IsKnockout() const
Definition: board_item.h:324
int GetX() const
Definition: board_item.h:94
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.
Definition: board_item.cpp:256
virtual void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle)
Rotate this object.
Definition: board_item.cpp:356
void SetX(int aX)
Definition: board_item.h:116
virtual BOARD_ITEM * Duplicate() const
Create a copy of this BOARD_ITEM.
Definition: board_item.cpp:244
void SetY(int aY)
Definition: board_item.h:122
virtual VECTOR2I GetCenter() const
This defaults to the center of the bounding box if not overridden.
Definition: board_item.h:111
virtual void Move(const VECTOR2I &aMoveVector)
Move this object.
Definition: board_item.h:342
virtual bool IsOnLayer(PCB_LAYER_ID aLayer) const
Test to see if this object is on the given layer.
Definition: board_item.h:319
virtual void SetIsKnockout(bool aKnockout)
Definition: board_item.h:325
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:288
virtual std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
Definition: board_item.cpp:279
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Definition: board_item.cpp:47
FOOTPRINT * GetParentFootprint() const
Definition: board_item.cpp:299
VECTOR2I GetFPRelativePosition() const
Definition: board_item.cpp:328
virtual LSET BoardLayerSet() const
Return the LSET for the board that this item resides on.
Definition: board_item.cpp:128
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
Definition: board_item.h:257
virtual bool IsTented(PCB_LAYER_ID aLayer) const
Checks if the given object is tented (its copper shape is covered by solder mask) on a given side of ...
Definition: board_item.h:172
virtual void swapData(BOARD_ITEM *aImage)
Definition: board_item.cpp:221
const KIFONT::METRICS & GetFontMetrics() const
Definition: board_item.cpp:100
void SetFPRelativePosition(const VECTOR2I &aPos)
Definition: board_item.cpp:342
static VECTOR2I ZeroOffset
A value of wxPoint(0,0) which can be passed to the Draw() functions.
Definition: board_item.h:180
virtual bool IsLocked() const
Definition: board_item.cpp:75
virtual bool operator==(const BOARD_ITEM &aItem) const =0
virtual bool HasDrilledHole() const
Definition: board_item.h:160
BOARD_ITEM_CONTAINER * GetParent() const
Definition: board_item.h:215
virtual void ViewGetLayers(int aLayers[], int &aCount) const override
Return the all the layers within the VIEW the object is painted on.
Definition: board_item.cpp:199
bool IsSideSpecific() const
Definition: board_item.cpp:149
virtual int BoardCopperLayerCount() const
Return the total number of copper layers for the board that this item resides on.
Definition: board_item.cpp:117
virtual bool IsOnCopperLayer() const
Definition: board_item.h:150
virtual void RunOnDescendants(const std::function< void(BOARD_ITEM *)> &aFunction, int aDepth=0) const
Invoke a function on all descendants.
Definition: board_item.h:212
virtual bool HasLineStroke() const
Check if this item has line stoke properties.
Definition: board_item.h:227
virtual void Normalize()
Perform any normalization required after a user rotate and/or flip.
Definition: board_item.h:373
virtual wxString layerMaskDescribe() const
Return a string (to be shown to the user) describing a layer mask.
Definition: board_item.cpp:166
wxString GetLayerName() const
Return the name of the PCB layer on which the item resides.
Definition: board_item.cpp:139
virtual double Similarity(const BOARD_ITEM &aItem) const =0
Return a measure of how likely the other object is to represent the same object.
virtual std::shared_ptr< SHAPE_SEGMENT > GetEffectiveHoleShape() const
Definition: board_item.cpp:289
virtual void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection)
Flip this object, i.e.
Definition: board_item.cpp:362
virtual bool HasHole() const
Definition: board_item.h:155
virtual void RunOnChildren(const std::function< void(BOARD_ITEM *)> &aFunction) const
Invoke a function on all children.
Definition: board_item.h:206
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:290
constexpr const Vec GetCenter() const
Definition: box2.h:230
A singleton item of this class is returned for a weak reference that no longer exists.
Definition: board_item.h:455
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
Definition: board_item.h:461
static DELETED_BOARD_ITEM * GetInstance()
Definition: board_item.h:475
wxString GetClass() const override
Return the class name.
Definition: board_item.h:466
double Similarity(const BOARD_ITEM &aItem) const override
Return a measure of how likely the other object is to represent the same object.
Definition: board_item.h:485
VECTOR2I GetPosition() const override
Definition: board_item.h:473
void SetPosition(const VECTOR2I &) override
Definition: board_item.h:472
bool operator==(const BOARD_ITEM &aBoardItem) const override
Definition: board_item.h:490
bool operator==(const DELETED_BOARD_ITEM &aOther) const
Definition: board_item.h:495
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:89
virtual VECTOR2I GetPosition() const
Definition: eda_item.h:243
virtual void SetPosition(const VECTOR2I &aPos)
Definition: eda_item.h:244
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
Definition: eda_item.cpp:77
virtual wxString GetClass() const =0
Return the class name.
EDA_ITEM * m_parent
Linked list: Link (parent struct)
Definition: eda_item.h:500
LSET is a set of PCB_LAYER_IDs.
Definition: lset.h:36
LSEQ Seq(const LSEQ &aSequence) const
Return an LSEQ from the union of this LSET and a desired sequence.
Definition: lset.cpp:410
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
A set of BOARD_ITEMs (i.e., without duplicates).
Definition: pcb_group.h:52
Represent a set of closed polygons.
An abstract shape on 2D plane.
Definition: shape.h:126
Simple container to manage line stroke parameters.
Definition: stroke_params.h:79
#define _(s)
FLASHING
Enum used during connectivity building to ensure we do not query connectivity while building the data...
Definition: layer_ids.h:147
bool IsCopperLayer(int aLayerId)
Tests whether a layer is a copper layer.
Definition: layer_ids.h:531
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
@ UNDEFINED_LAYER
Definition: layer_ids.h:61
@ F_Cu
Definition: layer_ids.h:64
FLIP_DIRECTION
Definition: mirror.h:27
#define DECLARE_ENUM_TO_WXANY(type)
Definition: property.h:729
bool operator()(const BOARD_ITEM *a, const BOARD_ITEM *b) const
Definition: board_item.cpp:264
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition: typeinfo.h:78
@ NOT_USED
the 3d code uses this value
Definition: typeinfo.h:79
VECTOR2< int32_t > VECTOR2I
Definition: vector2d.h:691