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 (C) 1992-2022 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 <pybind11/pybind11.h>
27
28#include <wx/debug.h>
29#include <wx/msgdlg.h>
30#include <i18n_utility.h>
31#include <macros.h>
32#include <board.h>
34#include <pcb_group.h>
35#include <footprint.h>
36
37
39{
40 wxASSERT( m_group == nullptr );
41}
42
43
45{
46 if( Type() == PCB_T )
47 return static_cast<const BOARD*>( this );
48
49 BOARD_ITEM* parent = GetParent();
50
51 if( parent )
52 return parent->GetBoard();
53
54 return nullptr;
55}
56
57
59{
60 if( Type() == PCB_T )
61 return static_cast<BOARD*>( this );
62
63 BOARD_ITEM* parent = GetParent();
64
65 if( parent )
66 return parent->GetBoard();
67
68 return nullptr;
69}
70
71
73{
74 if( GetParentGroup() )
75 return GetParentGroup()->IsLocked();
76
77 const BOARD* board = GetBoard();
78
79 return board && board->GetBoardUse() != BOARD_USE::FPHOLDER && m_isLocked;
80}
81
82
84{
85 wxCHECK( false, STROKE_PARAMS( pcbIUScale.mmToIU( DEFAULT_LINE_WIDTH ) ) );
86}
87
88
90{
91 wxCHECK( false, /* void */ );
92}
93
94
96{
97 const BOARD* board = GetBoard();
98
99 if( board )
100 return board->GetLayerName( m_layer );
101
102 // If no parent, return standard name
104}
105
106
108{
109 const BOARD* board = GetBoard();
110 LSET layers = GetLayerSet() & board->GetEnabledLayers();
111
112 LSET copperLayers = layers & LSET::AllCuMask();
113 LSET techLayers = layers & LSET::AllTechMask();
114
115 // Try to be smart and useful. Check all copper first.
116 if( (int) copperLayers.count() == board->GetCopperLayerCount() )
117 return _( "all copper layers" );
118
119 for( LSET testLayers : { copperLayers, techLayers, layers } )
120 {
121 for( int bit = PCBNEW_LAYER_ID_START; bit < PCB_LAYER_ID_COUNT; ++bit )
122 {
123 if( testLayers[ bit ] )
124 {
125 wxString layerInfo = board->GetLayerName( static_cast<PCB_LAYER_ID>( bit ) );
126
127 if( testLayers.count() > 1 )
128 layerInfo << wxS( " " ) + _( "and others" );
129
130 return layerInfo;
131 }
132 }
133 }
134
135 // No copper, no technicals: no layer
136 return _( "no layers" );
137}
138
139
140void BOARD_ITEM::ViewGetLayers( int aLayers[], int& aCount ) const
141{
142 // Basic fallback
143 aCount = 1;
144 aLayers[0] = m_layer;
145
146 if( IsLocked() )
147 aLayers[aCount++] = LAYER_LOCKED_ITEM_SHADOW;
148}
149
150
152{
154
155 if( parent )
156 parent->Remove( this );
157
158 delete this;
159}
160
161
163{
164}
165
166
168{
169 if( aImage == nullptr )
170 return;
171
172 EDA_ITEM* parent = GetParent();
174
175 SetParentGroup( nullptr );
176 aImage->SetParentGroup( nullptr );
177 swapData( aImage );
178
179 // Restore pointers to be sure they are not broken
180 SetParent( parent );
182}
183
184
186{
187 BOARD_ITEM* dupe = static_cast<BOARD_ITEM*>( Clone() );
188 const_cast<KIID&>( dupe->m_Uuid ) = KIID();
189
190 if( dupe->GetParentGroup() )
191 dupe->GetParentGroup()->AddItem( dupe );
192
193 return static_cast<BOARD_ITEM*>( dupe );
194}
195
196
198 int aClearance, int aError, ERROR_LOC aErrorLoc,
199 bool ignoreLineWidth ) const
200{
201 wxASSERT_MSG( false, wxT( "Called TransformShapeToPolygon() on unsupported BOARD_ITEM." ) );
202};
203
204
206{
207 if( a->Type() != b->Type() )
208 return a->Type() < b->Type();
209
210 if( a->GetLayerSet() != b->GetLayerSet() )
211 return a->GetLayerSet().Seq() < b->GetLayerSet().Seq();
212
213 if( a->m_Uuid != b->m_Uuid ) // UUIDs *should* always be unique (for valid boards anyway)
214 return a->m_Uuid < b->m_Uuid;
215
216 return a < b; // But just in case; ptrs are guaranteed to be different
217}
218
219
220std::shared_ptr<SHAPE> BOARD_ITEM::GetEffectiveShape( PCB_LAYER_ID aLayer, FLASHING aFlash ) const
221{
222 static std::shared_ptr<SHAPE> shape;
223
225
226 return shape;
227}
228
229
230std::shared_ptr<SHAPE_SEGMENT> BOARD_ITEM::GetEffectiveHoleShape() const
231{
232 static std::shared_ptr<SHAPE_SEGMENT> slot;
233
235
236 return slot;
237}
238
239
241{
242 BOARD_ITEM_CONTAINER* ancestor = GetParent();
243
244 while( ancestor && ancestor->Type() == PCB_GROUP_T )
245 ancestor = ancestor->GetParent();
246
247 if( ancestor && ancestor->Type() == PCB_FOOTPRINT_T )
248 return static_cast<FOOTPRINT*>( ancestor );
249
250 return nullptr;
251}
252
253
255{
256 VECTOR2I pos = GetPosition();
257
258 if( FOOTPRINT* parentFP = GetParentFootprint() )
259 {
260 pos -= parentFP->GetPosition();
261 RotatePoint( pos, -parentFP->GetOrientation() );
262 }
263
264 return pos;
265}
266
267
269{
270 VECTOR2I pos( aPos );
271
272 if( FOOTPRINT* parentFP = GetParentFootprint() )
273 {
274 RotatePoint( pos, parentFP->GetOrientation() );
275 pos += parentFP->GetPosition();
276 }
277
278 SetPosition( pos );
279}
280
281
282void BOARD_ITEM::Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle )
283{
284 wxMessageBox( wxT( "virtual BOARD_ITEM::Rotate used, should not occur" ), GetClass() );
285}
286
287
288void BOARD_ITEM::Flip( const VECTOR2I& aCentre, bool aFlipLeftRight )
289{
290 wxMessageBox( wxT( "virtual BOARD_ITEM::Flip used, should not occur" ), GetClass() );
291}
292
293
294static struct BOARD_ITEM_DESC
295{
297 {
299
300 if( layerEnum.Choices().GetCount() == 0 )
301 {
302 layerEnum.Undefined( UNDEFINED_LAYER );
303
304 for( LSEQ seq = LSET::AllLayersMask().Seq(); seq; ++seq )
305 layerEnum.Map( *seq, LSET::Name( *seq ) );
306 }
307
311
312 propMgr.AddProperty( new PROPERTY<BOARD_ITEM, int>( _HKI( "Position X" ),
313 &BOARD_ITEM::SetX, &BOARD_ITEM::GetX, PROPERTY_DISPLAY::PT_COORD,
315 propMgr.AddProperty( new PROPERTY<BOARD_ITEM, int>( _HKI( "Position Y" ),
316 &BOARD_ITEM::SetY, &BOARD_ITEM::GetY, PROPERTY_DISPLAY::PT_COORD,
320 propMgr.AddProperty( new PROPERTY<BOARD_ITEM, bool>( _HKI( "Locked" ),
322 }
324
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:109
#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:71
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:196
void SetParentGroup(PCB_GROUP *aGroup)
Definition: board_item.h:84
int GetY() const
Definition: board_item.h:95
void DeleteStructure()
Delete this object after removing from its parent if it has one.
Definition: board_item.cpp:151
void SwapItemData(BOARD_ITEM *aImage)
Swap data between aItem and aImage.
Definition: board_item.cpp:167
virtual void Flip(const VECTOR2I &aCentre, bool aFlipLeftRight)
Flip this object, i.e.
Definition: board_item.cpp:288
virtual STROKE_PARAMS GetStroke() const
Definition: board_item.cpp:83
virtual void SetLocked(bool aLocked)
Definition: board_item.h:270
PCB_GROUP * GetParentGroup() const
Definition: board_item.h:85
PCB_GROUP * m_group
Definition: board_item.h:350
virtual void SetStroke(const STROKE_PARAMS &aStroke)
Definition: board_item.cpp:89
PCB_LAYER_ID m_layer
Definition: board_item.h:345
bool m_isLocked
Definition: board_item.h:348
int GetX() const
Definition: board_item.h:89
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:197
virtual void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle)
Rotate this object.
Definition: board_item.cpp:282
void SetX(int aX)
Definition: board_item.h:111
virtual BOARD_ITEM * Duplicate() const
Create a copy of this BOARD_ITEM.
Definition: board_item.cpp:185
void SetY(int aY)
Definition: board_item.h:117
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:230
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:220
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Definition: board_item.cpp:44
FOOTPRINT * GetParentFootprint() const
Definition: board_item.cpp:240
VECTOR2I GetFPRelativePosition() const
Definition: board_item.cpp:254
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
Definition: board_item.h:201
virtual void swapData(BOARD_ITEM *aImage)
Definition: board_item.cpp:162
void SetFPRelativePosition(const VECTOR2I &aPos)
Definition: board_item.cpp:268
virtual bool IsLocked() const
Definition: board_item.cpp:72
BOARD_ITEM_CONTAINER * GetParent() const
Definition: board_item.h:176
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:140
virtual wxString layerMaskDescribe() const
Return a string (to be shown to the user) describing a layer mask.
Definition: board_item.cpp:107
wxString GetLayerName() const
Return the name of the PCB layer on which the item resides.
Definition: board_item.cpp:95
virtual std::shared_ptr< SHAPE_SEGMENT > GetEffectiveHoleShape() const
Definition: board_item.cpp:230
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:270
LSET GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
Definition: board.cpp:611
BOARD_USE GetBoardUse() const
Get what the board use is.
Definition: board.h:289
static wxString GetStandardLayerName(PCB_LAYER_ID aLayerId)
Return an "English Standard" name of a PCB layer when given aLayerNumber.
Definition: board.h:731
int GetCopperLayerCount() const
Definition: board.cpp:587
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
Definition: board.cpp:498
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:232
virtual void SetPosition(const VECTOR2I &aPos)
Definition: eda_item.h:233
const KIID m_Uuid
Definition: eda_item.h:475
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:97
virtual void SetParent(EDA_ITEM *aParent)
Definition: eda_item.h:100
virtual EDA_ITEM * Clone() const
Create a duplicate of this item with linked list members set to NULL.
Definition: eda_item.cpp:81
virtual wxString GetClass() const =0
Return the class name.
ENUM_MAP & Map(T aValue, const wxString &aName)
Definition: property.h:633
static ENUM_MAP< T > & Instance()
Definition: property.h:627
ENUM_MAP & Undefined(T aValue)
Definition: property.h:640
wxPGChoices & Choices()
Definition: property.h:676
Definition: kiid.h:48
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
Definition: layer_ids.h:497
LSET is a set of PCB_LAYER_IDs.
Definition: layer_ids.h:536
static LSET AllLayersMask()
Definition: lset.cpp:808
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
static LSET AllTechMask()
Return a mask holding all technical layers (no CU layer) on both side.
Definition: lset.cpp:841
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:773
static const wxChar * Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Definition: lset.cpp:82
A set of BOARD_ITEMs (i.e., without duplicates).
Definition: pcb_group.h:51
bool AddItem(BOARD_ITEM *aItem)
Add item to group.
Definition: pcb_group.cpp:71
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.
static PROPERTY_MANAGER & Instance()
Definition: property_mgr.h:76
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
Represent a set of closed polygons.
Simple container to manage line stroke parameters.
Definition: stroke_params.h:88
#define _HKI(x)
#define _(s)
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
Some functions to handle hotkeys in KiCad.
FLASHING
Enum used during connectivity building to ensure we do not query connectivity while building the data...
Definition: layer_ids.h:147
@ LAYER_LOCKED_ITEM_SHADOW
shadow layer for locked items
Definition: layer_ids.h:239
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:59
@ PCBNEW_LAYER_ID_START
Definition: layer_ids.h:63
@ UNDEFINED_LAYER
Definition: layer_ids.h:60
@ PCB_LAYER_ID_COUNT
Definition: layer_ids.h:137
This file contains miscellaneous commonly used macros and functions.
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120
Class to handle a set of BOARD_ITEMs.
#define TYPE_HASH(x)
Definition: property.h:63
#define IMPLEMENT_ENUM_TO_WXANY(type)
Definition: property.h:727
#define REGISTER_TYPE(x)
Definition: property_mgr.h:328
bool operator()(const BOARD_ITEM *a, const BOARD_ITEM *b) const
Definition: board_item.cpp:205
constexpr int mmToIU(double mm) const
Definition: base_units.h:89
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Definition: trigo.cpp:183
@ PCB_T
Definition: typeinfo.h:82
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
Definition: typeinfo.h:106
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
Definition: typeinfo.h:86