KiCad PCB EDA Suite
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-2022 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#ifndef BOARD_ITEM_STRUCT_H
26#define BOARD_ITEM_STRUCT_H
27
28
29#include <eda_item.h>
30#include <layer_ids.h>
32#include <stroke_params.h>
33#include <geometry/eda_angle.h>
34
35class BOARD;
37class SHAPE_POLY_SET;
38class SHAPE_SEGMENT;
39class PCB_BASE_FRAME;
40class SHAPE;
41class PCB_GROUP;
42
43
45{
49};
50
51
57class BOARD_ITEM : public EDA_ITEM
58{
59public:
60 BOARD_ITEM( BOARD_ITEM* aParent, KICAD_T idtype, PCB_LAYER_ID aLayer = F_Cu ) :
61 EDA_ITEM( aParent, idtype ),
62 m_layer( aLayer ),
63 m_isKnockout( false ),
64 m_isLocked( false ),
65 m_group( nullptr )
66 {
67 }
68
70
71 void SetParentGroup( PCB_GROUP* aGroup ) { m_group = aGroup; }
72 PCB_GROUP* GetParentGroup() const { return m_group; }
73
74 // Do not create a copy constructor & operator=.
75 // The ones generated by the compiler are adequate.
76 int GetX() const
77 {
79 return p.x;
80 }
81
82 int GetY() const
83 {
85 return p.y;
86 }
87
93 virtual VECTOR2I GetCenter() const
94 {
95 return GetBoundingBox().GetCenter();
96 }
97
98 void SetX( int aX )
99 {
100 VECTOR2I p( aX, GetY() );
101 SetPosition( p );
102 }
103
104 void SetY( int aY )
105 {
106 VECTOR2I p( GetX(), aY );
107 SetPosition( p );
108 }
109
115 virtual bool IsConnected() const
116 {
117 return false;
118 }
119
123 virtual bool IsOnCopperLayer() const
124 {
125 return IsCopperLayer( GetLayer() );
126 }
127
128 virtual bool HasHole() const
129 {
130 return false;
131 }
132
133 virtual bool IsTented() const
134 {
135 return false;
136 }
137
142
158 virtual std::shared_ptr<SHAPE> GetEffectiveShape( PCB_LAYER_ID aLayer = UNDEFINED_LAYER,
159 FLASHING aFlash = FLASHING::DEFAULT ) const;
160
161 virtual std::shared_ptr<SHAPE_SEGMENT> GetEffectiveHoleShape() const;
162
164
166
172 virtual bool HasLineStroke() const { return false; }
173
174 virtual STROKE_PARAMS GetStroke() const;
175 virtual void SetStroke( const STROKE_PARAMS& aStroke );
176
180 virtual PCB_LAYER_ID GetLayer() const { return m_layer; }
181
185 virtual LSET GetLayerSet() const
186 {
187 if( m_layer == UNDEFINED_LAYER )
188 return LSET();
189 else
190 return LSET( m_layer );
191 }
192
193 virtual void SetLayerSet( LSET aLayers )
194 {
195 if( aLayers.count() == 1 )
196 {
197 SetLayer( aLayers.Seq()[0] );
198 return;
199 }
200
201 wxFAIL_MSG( wxT( "Attempted to SetLayerSet() on a single-layer object." ) );
202
203 // Derived classes which support multiple layers must implement this
204 }
205
214 virtual void SetLayer( PCB_LAYER_ID aLayer )
215 {
216 m_layer = aLayer;
217 }
218
222 virtual BOARD_ITEM* Duplicate() const;
223
234 void SwapItemData( BOARD_ITEM* aImage );
235
245 virtual bool IsOnLayer( PCB_LAYER_ID aLayer ) const
246 {
247 return m_layer == aLayer;
248 }
249
250 virtual bool IsKnockout() const { return m_isKnockout; }
251 virtual void SetIsKnockout( bool aKnockout ) { m_isKnockout = aKnockout; }
252
253 virtual bool IsLocked() const;
254 virtual void SetLocked( bool aLocked ) { m_isLocked = aLocked; }
255
259 void DeleteStructure();
260
266 virtual void Move( const VECTOR2I& aMoveVector )
267 {
268 wxFAIL_MSG( wxT( "virtual BOARD_ITEM::Move called for " ) + GetClass() );
269 }
270
276 virtual void Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle );
277
284 virtual void Flip( const VECTOR2I& aCentre, bool aFlipLeftRight );
285
289 virtual const BOARD* GetBoard() const;
290 virtual BOARD* GetBoard();
291
297 wxString GetLayerName() const;
298
299 virtual void ViewGetLayers( int aLayers[], int& aCount ) const override;
300
311 virtual void TransformShapeToPolygon( SHAPE_POLY_SET& aBuffer, PCB_LAYER_ID aLayer,
312 int aClearance, int aError, ERROR_LOC aErrorLoc,
313 bool ignoreLineWidth = false ) const;
314
315 struct ptr_cmp
316 {
317 bool operator() ( const BOARD_ITEM* a, const BOARD_ITEM* b ) const;
318 };
319
320protected:
324 virtual wxString layerMaskDescribe() const;
325
326 virtual void swapData( BOARD_ITEM* aImage );
327
328protected:
331
333
335};
336
337#ifndef SWIG
339#endif
340
341
348{
349public:
351 BOARD_ITEM( nullptr, NOT_USED )
352 {}
353
354 wxString GetItemDescription( UNITS_PROVIDER* aUnitsProvider ) const override
355 {
356 return _( "(Deleted Item)" );
357 }
358
359 wxString GetClass() const override
360 {
361 return wxT( "DELETED_BOARD_ITEM" );
362 }
363
364 // pure virtuals:
365 void SetPosition( const VECTOR2I& ) override {}
366 VECTOR2I GetPosition() const override { return VECTOR2I( 0, 0 ); }
367
369 {
370 static DELETED_BOARD_ITEM* item = nullptr;
371
372 if( !item )
373 item = new DELETED_BOARD_ITEM();
374
375 return item;
376 }
377
378#if defined(DEBUG)
379 void Show( int , std::ostream& ) const override {}
380#endif
381};
382
383
384#endif /* BOARD_ITEM_STRUCT_H */
ZONE_LAYER_CONNECTION
Definition: board_item.h:45
@ ZLC_UNRESOLVED
Definition: board_item.h:46
@ ZLC_CONNECTED
Definition: board_item.h:47
@ ZLC_UNCONNECTED
Definition: board_item.h:48
DECLARE_ENUM_TO_WXANY(PCB_LAYER_ID)
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:58
BOARD_ITEM(BOARD_ITEM *aParent, KICAD_T idtype, PCB_LAYER_ID aLayer=F_Cu)
Definition: board_item.h:60
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:180
void SetParentGroup(PCB_GROUP *aGroup)
Definition: board_item.h:71
int GetY() const
Definition: board_item.h:82
void DeleteStructure()
Delete this object after removing from its parent if it has one.
Definition: board_item.cpp:150
void SwapItemData(BOARD_ITEM *aImage)
Swap data between aItem and aImage.
Definition: board_item.cpp:166
virtual void Flip(const VECTOR2I &aCentre, bool aFlipLeftRight)
Flip this object, i.e.
Definition: board_item.cpp:256
virtual STROKE_PARAMS GetStroke() const
Definition: board_item.cpp:82
virtual bool IsConnected() const
Returns information if the object is derived from BOARD_CONNECTED_ITEM.
Definition: board_item.h:115
bool m_isKnockout
Definition: board_item.h:330
virtual void SetLocked(bool aLocked)
Definition: board_item.h:254
PCB_GROUP * GetParentGroup() const
Definition: board_item.h:72
PCB_GROUP * m_group
Definition: board_item.h:334
virtual void SetStroke(const STROKE_PARAMS &aStroke)
Definition: board_item.cpp:88
PCB_LAYER_ID m_layer
Definition: board_item.h:329
bool m_isLocked
Definition: board_item.h:332
virtual bool IsKnockout() const
Definition: board_item.h:250
int GetX() const
Definition: board_item.h:76
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:196
virtual void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle)
Rotate this object.
Definition: board_item.cpp:250
void SetX(int aX)
Definition: board_item.h:98
virtual BOARD_ITEM * Duplicate() const
Create a copy of this BOARD_ITEM.
Definition: board_item.cpp:184
void SetY(int aY)
Definition: board_item.h:104
virtual bool IsTented() const
Definition: board_item.h:133
virtual VECTOR2I GetCenter() const
This defaults to the center of the bounding box if not overridden.
Definition: board_item.h:93
virtual void Move(const VECTOR2I &aMoveVector)
Move this object.
Definition: board_item.h:266
virtual bool IsOnLayer(PCB_LAYER_ID aLayer) const
Test to see if this object is on the given layer.
Definition: board_item.h:245
virtual void SetIsKnockout(bool aKnockout)
Definition: board_item.h:251
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:214
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:219
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Definition: board_item.cpp:43
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
Definition: board_item.h:185
virtual void swapData(BOARD_ITEM *aImage)
Definition: board_item.cpp:161
static VECTOR2I ZeroOffset
A value of wxPoint(0,0) which can be passed to the Draw() functions.
Definition: board_item.h:141
virtual bool IsLocked() const
Definition: board_item.cpp:71
BOARD_ITEM_CONTAINER * GetParentFootprint() const
Definition: board_item.cpp:239
BOARD_ITEM_CONTAINER * GetParent() const
Definition: board_item.h:163
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:139
virtual bool IsOnCopperLayer() const
Definition: board_item.h:123
virtual bool HasLineStroke() const
Check if this item has line stoke properties.
Definition: board_item.h:172
virtual wxString layerMaskDescribe() const
Return a string (to be shown to the user) describing a layer mask.
Definition: board_item.cpp:106
wxString GetLayerName() const
Return the name of the PCB layer on which the item resides.
Definition: board_item.cpp:94
virtual std::shared_ptr< SHAPE_SEGMENT > GetEffectiveHoleShape() const
Definition: board_item.cpp:229
virtual void SetLayerSet(LSET aLayers)
Definition: board_item.h:193
virtual bool HasHole() const
Definition: board_item.h:128
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:265
const Vec GetCenter() const
Definition: box2.h:195
A singleton item of this class is returned for a weak reference that no longer exists.
Definition: board_item.h:348
static DELETED_BOARD_ITEM * GetInstance()
Definition: board_item.h:368
wxString GetClass() const override
Return the class name.
Definition: board_item.h:359
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider) const override
Return a user-visible description string of this item.
Definition: board_item.h:354
VECTOR2I GetPosition() const override
Definition: board_item.h:366
void SetPosition(const VECTOR2I &) override
Definition: board_item.h:365
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:85
virtual VECTOR2I GetPosition() const
Definition: eda_item.h:249
virtual void SetPosition(const VECTOR2I &aPos)
Definition: eda_item.h:250
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
Definition: eda_item.cpp:74
virtual wxString GetClass() const =0
Return the class name.
EDA_ITEM * m_parent
Linked list: Link (parent struct)
Definition: eda_item.h:496
LSET is a set of PCB_LAYER_IDs.
Definition: layer_ids.h:530
LSEQ Seq(const PCB_LAYER_ID *aWishListSequence, unsigned aCount) const
Return an LSEQ from the union of this LSET and a desired sequence.
Definition: lset.cpp:411
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:51
Represent a set of closed polygons.
An abstract shape on 2D plane.
Definition: shape.h:123
Simple container to manage line stroke parameters.
Definition: stroke_params.h:88
#define _(s)
a few functions useful in geometry calculations.
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
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:825
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:59
@ UNDEFINED_LAYER
Definition: layer_ids.h:60
@ F_Cu
Definition: layer_ids.h:64
bool operator()(const BOARD_ITEM *a, const BOARD_ITEM *b) const
Definition: board_item.cpp:204
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< int > VECTOR2I
Definition: vector2d.h:618