KiCad PCB EDA Suite
connectivity_data.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) 2013-2017 CERN
5 * Copyright (C) 2018-2022 KiCad Developers, see AUTHORS.txt for contributors.
6 * @author Maciej Suminski <[email protected]>
7 * @author Tomasz Wlostowski <[email protected]>
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, you may find one here:
21 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
22 * or you may search the http://www.gnu.org website for the version 2 license,
23 * or you may write to the Free Software Foundation, Inc.,
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
25 */
26
27#ifndef __CONNECTIVITY_DATA_H
28#define __CONNECTIVITY_DATA_H
29
30#include <core/typeinfo.h>
31#include <core/spinlock.h>
32
33#include <memory>
34#include <mutex>
35#include <vector>
36#include <wx/string.h>
37
38#include <math/vector2d.h>
40#include <zone.h>
41
42class FROM_TO_CACHE;
43class CN_CLUSTER;
45class CN_EDGE;
46class BOARD;
47class BOARD_COMMIT;
49class BOARD_ITEM;
50class ZONE;
51class RN_DATA;
52class RN_NET;
53class PCB_TRACK;
54class PAD;
55class FOOTPRINT;
57
58
60{
61 int net;
64};
65
66
71{
73 m_zone( aZone )
74 {}
75
77
78 std::map<PCB_LAYER_ID, std::vector<int>> m_islands;
79};
80
81
83{
86};
87
88
93{
96};
97
98
99// a wrapper class encompassing the connectivity computation algorithm and the
101{
102public:
105
106 CONNECTIVITY_DATA( const std::vector<BOARD_ITEM*>& aItems, bool aSkipItems = false );
107
112 void Build( BOARD* aBoard, PROGRESS_REPORTER* aReporter = nullptr );
113
118 void Build( const std::vector<BOARD_ITEM*>& aItems );
119
126 bool Add( BOARD_ITEM* aItem );
127
134 bool Remove( BOARD_ITEM* aItem );
135
142 bool Update( BOARD_ITEM* aItem );
143
151 void Move( const VECTOR2I& aDelta );
152
157 void Clear();
158
163 int GetNetCount() const;
164
169 RN_NET* GetRatsnestForNet( int aNet );
170
176 void PropagateNets( BOARD_COMMIT* aCommit = nullptr,
178
185 void FindIsolatedCopperIslands( ZONE* aZone, std::vector<int>& aIslands );
186 void FindIsolatedCopperIslands( std::vector<CN_ZONE_ISOLATED_ISLAND_LIST>& aZones,
187 bool aConnectivityAlreadyRebuilt = false );
188
194 void RecalculateRatsnest( BOARD_COMMIT* aCommit = nullptr );
195
200 unsigned int GetUnconnectedCount( bool aVisibileOnly ) const;
201
202 bool IsConnectedOnLayer( const BOARD_CONNECTED_ITEM* aItem, int aLayer,
203 const std::initializer_list<KICAD_T>& aTypes = {},
204 bool aCheckOptionalFlashing = false ) const;
205
206 unsigned int GetNodeCount( int aNet = -1 ) const;
207
208 unsigned int GetPadCount( int aNet = -1 ) const;
209
210 const std::vector<PCB_TRACK*> GetConnectedTracks( const BOARD_CONNECTED_ITEM* aItem ) const;
211
212 const std::vector<PAD*> GetConnectedPads( const BOARD_CONNECTED_ITEM* aItem ) const;
213
214 void GetConnectedPads( const BOARD_CONNECTED_ITEM* aItem, std::set<PAD*>* pads ) const;
215
226 const std::vector<BOARD_CONNECTED_ITEM*>
227 GetConnectedItemsAtAnchor( const BOARD_CONNECTED_ITEM* aItem, const VECTOR2I& aAnchor,
228 const std::initializer_list<KICAD_T>& aTypes,
229 const int& aMaxError = 0 ) const;
230
231 void RunOnUnconnectedEdges( std::function<bool( CN_EDGE& )> aFunc );
232
233 bool TestTrackEndpointDangling( PCB_TRACK* aTrack, VECTOR2I* aPos = nullptr );
234
240 void ClearLocalRatsnest();
241
245 void HideLocalRatsnest();
246
251 void ComputeLocalRatsnest( const std::vector<BOARD_ITEM*>& aItems,
252 const CONNECTIVITY_DATA* aDynamicData,
253 VECTOR2I aInternalOffset = { 0, 0 } );
254
255 const std::vector<RN_DYNAMIC_LINE>& GetLocalRatsnest() const { return m_dynamicRatsnest; }
256
263 const std::vector<BOARD_CONNECTED_ITEM*>
265 const std::initializer_list<KICAD_T>& aTypes,
266 bool aIgnoreNetcodes = false ) const;
267
274 const std::vector<BOARD_CONNECTED_ITEM*>
275 GetNetItems( int aNetCode, const std::initializer_list<KICAD_T>& aTypes ) const;
276
277 void BlockRatsnestItems( const std::vector<BOARD_ITEM*>& aItems );
278
279 std::shared_ptr<CN_CONNECTIVITY_ALGO> GetConnectivityAlgo() const { return m_connAlgo; }
280
281 KISPINLOCK& GetLock() { return m_lock; }
282
283 void MarkItemNetAsDirty( BOARD_ITEM* aItem );
284 void SetProgressReporter( PROGRESS_REPORTER* aReporter );
285
286 const std::map<int, wxString>& GetNetclassMap() const { return m_netclassMap; }
287
288#ifndef SWIG
289 const std::vector<CN_EDGE> GetRatsnestForItems( const std::vector<BOARD_ITEM*> aItems );
290
291 const std::vector<CN_EDGE> GetRatsnestForPad( const PAD* aPad );
292
293 const std::vector<CN_EDGE> GetRatsnestForComponent( FOOTPRINT* aComponent,
294 bool aSkipInternalConnections = false );
295#endif
296
297 std::shared_ptr<FROM_TO_CACHE> GetFromToCache() { return m_fromToCache; }
298
299private:
300 void updateRatsnest();
301
302 void addRatsnestCluster( const std::shared_ptr<CN_CLUSTER>& aCluster );
303
304private:
305 std::shared_ptr<CN_CONNECTIVITY_ALGO> m_connAlgo;
306
307 std::shared_ptr<FROM_TO_CACHE> m_fromToCache;
308 std::vector<RN_DYNAMIC_LINE> m_dynamicRatsnest;
309 std::vector<RN_NET*> m_nets;
310
312 bool m_skipRatsnest = false;
313
315
317 std::map<int, wxString> m_netclassMap;
318
320};
321
322#endif
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:50
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:265
CN_EDGE represents a point-to-point connection, whether realized or unrealized (ie: tracks etc.
bool IsConnectedOnLayer(const BOARD_CONNECTED_ITEM *aItem, int aLayer, const std::initializer_list< KICAD_T > &aTypes={}, bool aCheckOptionalFlashing=false) const
void RecalculateRatsnest(BOARD_COMMIT *aCommit=nullptr)
Function RecalculateRatsnest() Updates the ratsnest for the board.
const std::map< int, wxString > & GetNetclassMap() const
void ClearLocalRatsnest()
Function ClearLocalRatsnest() Erases the temporary, selection-based ratsnest (i.e.
PROGRESS_REPORTER * m_progressReporter
bool m_skipRatsnest
Used to suppress ratsnest calculations on dynamic ratsnests.
void FindIsolatedCopperIslands(ZONE *aZone, std::vector< int > &aIslands)
Function FindIsolatedCopperIslands() Searches for copper islands in zone aZone that are not connected...
const std::vector< RN_DYNAMIC_LINE > & GetLocalRatsnest() const
unsigned int GetPadCount(int aNet=-1) const
const std::vector< BOARD_CONNECTED_ITEM * > GetConnectedItemsAtAnchor(const BOARD_CONNECTED_ITEM *aItem, const VECTOR2I &aAnchor, const std::initializer_list< KICAD_T > &aTypes, const int &aMaxError=0) const
Function GetConnectedItemsAtAnchor() Returns a list of items connected to a source item aItem at posi...
void MarkItemNetAsDirty(BOARD_ITEM *aItem)
KISPINLOCK & GetLock()
void RunOnUnconnectedEdges(std::function< bool(CN_EDGE &)> aFunc)
std::vector< RN_DYNAMIC_LINE > m_dynamicRatsnest
const std::vector< CN_EDGE > GetRatsnestForPad(const PAD *aPad)
RN_NET * GetRatsnestForNet(int aNet)
Function GetRatsnestForNet() Returns the ratsnest, expressed as a set of graph edges for a given net.
bool Remove(BOARD_ITEM *aItem)
Function Remove() Removes an item from the connectivity data.
void ComputeLocalRatsnest(const std::vector< BOARD_ITEM * > &aItems, const CONNECTIVITY_DATA *aDynamicData, VECTOR2I aInternalOffset={ 0, 0 })
Function ComputeLocalRatsnest() Calculates the temporary (usually selection-based) ratsnest for the s...
unsigned int GetNodeCount(int aNet=-1) const
void SetProgressReporter(PROGRESS_REPORTER *aReporter)
void BlockRatsnestItems(const std::vector< BOARD_ITEM * > &aItems)
const std::vector< PCB_TRACK * > GetConnectedTracks(const BOARD_CONNECTED_ITEM *aItem) const
std::map< int, wxString > m_netclassMap
Map of netcode -> netclass the net is a member of; used for ratsnest painting.
const std::vector< CN_EDGE > GetRatsnestForComponent(FOOTPRINT *aComponent, bool aSkipInternalConnections=false)
bool TestTrackEndpointDangling(PCB_TRACK *aTrack, VECTOR2I *aPos=nullptr)
bool Add(BOARD_ITEM *aItem)
Function Add() Adds an item to the connectivity data.
const std::vector< BOARD_CONNECTED_ITEM * > GetConnectedItems(const BOARD_CONNECTED_ITEM *aItem, const std::initializer_list< KICAD_T > &aTypes, bool aIgnoreNetcodes=false) const
Function GetConnectedItems() Returns a list of items connected to a source item aItem.
std::shared_ptr< CN_CONNECTIVITY_ALGO > m_connAlgo
void Clear()
Function Clear() Erases the connectivity database.
std::shared_ptr< FROM_TO_CACHE > m_fromToCache
const std::vector< PAD * > GetConnectedPads(const BOARD_CONNECTED_ITEM *aItem) const
const std::vector< CN_EDGE > GetRatsnestForItems(const std::vector< BOARD_ITEM * > aItems)
const std::vector< BOARD_CONNECTED_ITEM * > GetNetItems(int aNetCode, const std::initializer_list< KICAD_T > &aTypes) const
Function GetNetItems() Returns the list of items that belong to a certain net.
unsigned int GetUnconnectedCount(bool aVisibileOnly) const
void HideLocalRatsnest()
Hides the temporary, selection-based ratsnest lines.
void addRatsnestCluster(const std::shared_ptr< CN_CLUSTER > &aCluster)
std::vector< RN_NET * > m_nets
std::shared_ptr< FROM_TO_CACHE > GetFromToCache()
bool Update(BOARD_ITEM *aItem)
Function Update() Updates the connectivity data for an item.
void PropagateNets(BOARD_COMMIT *aCommit=nullptr, PROPAGATE_MODE aMode=PROPAGATE_MODE::SKIP_CONFLICTS)
Propagates the net codes from the source pads to the tracks/vias.
void Build(BOARD *aBoard, PROGRESS_REPORTER *aReporter=nullptr)
Function Build() Builds the connectivity database for the board aBoard.
void Move(const VECTOR2I &aDelta)
Moves the connectivity list anchors.
int GetNetCount() const
Function GetNetCount() Returns the total number of nets in the connectivity database.
std::shared_ptr< CN_CONNECTIVITY_ALGO > GetConnectivityAlgo() const
A trivial spinlock implementation with no optimization.
Definition: spinlock.h:30
Definition: pad.h:58
A progress reporter interface for use in multi-threaded environments.
Describe ratsnest for a single net.
Definition: ratsnest_data.h:63
Handle a list of polygons defining a copper zone.
Definition: zone.h:57
PROPAGATE_MODE
Controls how nets are propagated through clusters.
@ RESOLVE_CONFLICTS
Clusters with conflicting drivers are not updated (default)
BOARD_CONNECTED_ITEM * b
BOARD_CONNECTED_ITEM * a
int net
VECTOR2I anchorB
VECTOR2I anchorA
A structure used for calculating isolated islands on a given zone across all its layers.
std::map< PCB_LAYER_ID, std::vector< int > > m_islands