KiCad PCB EDA Suite
Loading...
Searching...
No Matches
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 The 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, see <https://www.gnu.org/licenses/>.
21 */
22
23#ifndef __CONNECTIVITY_DATA_H
24#define __CONNECTIVITY_DATA_H
25
26#include <core/typeinfo.h>
27#include <core/spinlock.h>
28
29#include <memory>
30#include <mutex>
31#include <set>
32#include <vector>
33#include <wx/string.h>
34
35#include <math/vector2d.h>
36#include <zone.h>
37
38class FROM_TO_CACHE;
39class NET_SETTINGS;
40class CN_CLUSTER;
42class CN_EDGE;
43class BOARD;
44class BOARD_COMMIT;
46class BOARD_ITEM;
47class ZONE;
48class RN_DATA;
49class RN_NET;
50class PCB_ARC;
51class PCB_TRACK;
52class PCB_VIA;
53class PAD;
54class FOOTPRINT;
56
57
64
65
67{
70};
71
72
81
82
83// a wrapper class encompassing the connectivity computation algorithm and the
85{
86public:
89
90 CONNECTIVITY_DATA( std::shared_ptr<CONNECTIVITY_DATA> aGlobalConnectivity,
91 const std::vector<BOARD_ITEM*>& aLocalItems, bool aSkipRatsnestUpdate = false );
92
97 bool Build( BOARD* aBoard, PROGRESS_REPORTER* aReporter = nullptr );
98
103 void Build( std::shared_ptr<CONNECTIVITY_DATA>& aGlobalConnectivity,
104 const std::vector<BOARD_ITEM*>& aLocalItems );
105
112 bool Add( BOARD_ITEM* aItem );
113
120 bool Remove( BOARD_ITEM* aItem );
121
128 bool Update( BOARD_ITEM* aItem );
129
137 void Move( const VECTOR2I& aDelta );
138
143 void ClearRatsnest();
144
149 int GetNetCount() const;
150
155 RN_NET* GetRatsnestForNet( int aNet );
156
162 void PropagateNets( BOARD_COMMIT* aCommit = nullptr );
163
168 void FillIsolatedIslandsMap( std::map<ZONE*, std::map<PCB_LAYER_ID, ISOLATED_ISLANDS>>& aMap,
169 bool aConnectivityAlreadyRebuilt = false );
170
176 void RecalculateRatsnest( BOARD_COMMIT* aCommit = nullptr );
177
182 unsigned int GetUnconnectedCount( bool aVisibileOnly ) const;
183
184 bool IsConnectedOnLayer( const BOARD_CONNECTED_ITEM* aItem, int aLayer,
185 const std::initializer_list<KICAD_T>& aTypes = {} ) const;
186
187 unsigned int GetNodeCount( int aNet = -1 ) const;
188
189 unsigned int GetPadCount( int aNet = -1 ) const;
190
191 const std::vector<PCB_TRACK*> GetConnectedTracks( const BOARD_CONNECTED_ITEM* aItem ) const;
192
193 const std::vector<PAD*> GetConnectedPads( const BOARD_CONNECTED_ITEM* aItem ) const;
194
195 void GetConnectedPads( const BOARD_CONNECTED_ITEM* aItem, std::set<PAD*>* pads ) const;
196
197 void GetConnectedPadsAndVias( const BOARD_CONNECTED_ITEM* aItem, std::vector<PAD*>* pads,
198 std::vector<PCB_VIA*>* vias );
199
204 void GetZoneIslandConnections( const ZONE* aZone, PCB_LAYER_ID aLayer,
205 std::vector<std::set<const BOARD_ITEM*>>* aIslands );
206
217 const std::vector<BOARD_CONNECTED_ITEM*>
218 GetConnectedItemsAtAnchor( const BOARD_CONNECTED_ITEM* aItem, const VECTOR2I& aAnchor,
219 const std::vector<KICAD_T>& aTypes, const int& aMaxError = 0 ) const;
220
221 void RunOnUnconnectedEdges( std::function<bool( CN_EDGE& )> aFunc );
222
223 bool TestTrackEndpointDangling( PCB_TRACK* aTrack, bool aIgnoreTracksInPads,
224 VECTOR2I* aPos = nullptr ) const;
225
231 void ClearLocalRatsnest();
232
236 void HideLocalRatsnest();
237
242 void ComputeLocalRatsnest( const std::vector<BOARD_ITEM*>& aItems,
243 const CONNECTIVITY_DATA* aDynamicData,
244 VECTOR2I aInternalOffset = { 0, 0 } );
245
246 const std::vector<RN_DYNAMIC_LINE>& GetLocalRatsnest() const { return m_dynamicRatsnest; }
247
254#define IGNORE_NETS 0x0001
255#define EXCLUDE_ZONES 0x0002
256 const std::vector<BOARD_CONNECTED_ITEM*> GetConnectedItems( const BOARD_CONNECTED_ITEM* aItem,
257 int aFlags = 0 ) const;
258
265 const std::vector<BOARD_CONNECTED_ITEM*>
266 GetNetItems( int aNetCode, const std::vector<KICAD_T>& aTypes ) const;
267
268 void BlockRatsnestItems( const std::vector<BOARD_ITEM*>& aItems );
269
270 std::shared_ptr<CN_CONNECTIVITY_ALGO> GetConnectivityAlgo() const { return m_connAlgo; }
271
272 KISPINLOCK& GetLock() { return m_lock; }
273
274 void MarkItemNetAsDirty( BOARD_ITEM* aItem );
275 void RemoveInvalidRefs();
276
277 void SetProgressReporter( PROGRESS_REPORTER* aReporter );
278
279 const NET_SETTINGS* GetNetSettings() const;
280
281 bool HasNetNameForNetCode( int nc ) const { return m_netcodeMap.count( nc ) > 0; }
282 const wxString& GetNetNameForNetCode( int nc ) const { return m_netcodeMap.at( nc ); }
283
285 void RefreshNetcodeMap( BOARD* aBoard );
286
287 const std::vector<CN_EDGE> GetRatsnestForItems( const std::vector<BOARD_ITEM*>& aItems );
288
289 const std::vector<CN_EDGE> GetRatsnestForPad( const PAD* aPad );
290
291 const std::vector<CN_EDGE> GetRatsnestForComponent( FOOTPRINT* aComponent,
292 bool aSkipInternalConnections = false );
293
294 std::shared_ptr<FROM_TO_CACHE> GetFromToCache() { return m_fromToCache; }
295
296private:
297
302 void internalRecalculateRatsnest( BOARD_COMMIT* aCommit = nullptr );
303 void updateRatsnest();
304
305 void addRatsnestCluster( const std::shared_ptr<CN_CLUSTER>& aCluster );
306
307private:
308 std::shared_ptr<CN_CONNECTIVITY_ALGO> m_connAlgo;
309
310 std::shared_ptr<FROM_TO_CACHE> m_fromToCache;
311 std::vector<RN_DYNAMIC_LINE> m_dynamicRatsnest;
312 std::vector<RN_NET*> m_nets;
313
316
318
320
322 std::weak_ptr<NET_SETTINGS> m_netSettings;
323
325 std::map<int, wxString> m_netcodeMap;
326};
327
328#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:84
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:409
CN_EDGE represents a point-to-point connection, whether realized or unrealized (ie: tracks etc.
void FillIsolatedIslandsMap(std::map< ZONE *, std::map< PCB_LAYER_ID, ISOLATED_ISLANDS > > &aMap, bool aConnectivityAlreadyRebuilt=false)
Fill the isolate islands list for each layer of each zone.
void RecalculateRatsnest(BOARD_COMMIT *aCommit=nullptr)
Function RecalculateRatsnest() Updates the ratsnest for the board.
void ClearLocalRatsnest()
Function ClearLocalRatsnest() Erases the temporary, selection-based ratsnest (i.e.
PROGRESS_REPORTER * m_progressReporter
const std::vector< RN_DYNAMIC_LINE > & GetLocalRatsnest() const
unsigned int GetPadCount(int aNet=-1) const
void MarkItemNetAsDirty(BOARD_ITEM *aItem)
std::weak_ptr< NET_SETTINGS > m_netSettings
Used to get netclass data when drawing ratsnests.
const std::vector< BOARD_CONNECTED_ITEM * > GetConnectedItems(const BOARD_CONNECTED_ITEM *aItem, int aFlags=0) const
void PropagateNets(BOARD_COMMIT *aCommit=nullptr)
Propagates the net codes from the source pads to the tracks/vias.
KISPINLOCK & GetLock()
void RunOnUnconnectedEdges(std::function< bool(CN_EDGE &)> aFunc)
std::vector< RN_DYNAMIC_LINE > m_dynamicRatsnest
bool m_skipRatsnestUpdate
Used to suppress ratsnest calculations on dynamic ratsnests.
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.
const std::vector< BOARD_CONNECTED_ITEM * > GetConnectedItemsAtAnchor(const BOARD_CONNECTED_ITEM *aItem, const VECTOR2I &aAnchor, const std::vector< KICAD_T > &aTypes, const int &aMaxError=0) const
Function GetConnectedItemsAtAnchor() Returns a list of items connected to a source item aItem at posi...
const wxString & GetNetNameForNetCode(int nc) const
void ClearRatsnest()
Function Clear() Erases the connectivity database.
bool Remove(BOARD_ITEM *aItem)
Function Remove() Removes an item from the connectivity data.
void GetConnectedPadsAndVias(const BOARD_CONNECTED_ITEM *aItem, std::vector< PAD * > *pads, std::vector< PCB_VIA * > *vias)
const NET_SETTINGS * GetNetSettings() const
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...
bool TestTrackEndpointDangling(PCB_TRACK *aTrack, bool aIgnoreTracksInPads, VECTOR2I *aPos=nullptr) const
unsigned int GetNodeCount(int aNet=-1) const
void SetProgressReporter(PROGRESS_REPORTER *aReporter)
void BlockRatsnestItems(const std::vector< BOARD_ITEM * > &aItems)
bool IsConnectedOnLayer(const BOARD_CONNECTED_ITEM *aItem, int aLayer, const std::initializer_list< KICAD_T > &aTypes={}) const
const std::vector< PCB_TRACK * > GetConnectedTracks(const BOARD_CONNECTED_ITEM *aItem) const
const std::vector< CN_EDGE > GetRatsnestForComponent(FOOTPRINT *aComponent, bool aSkipInternalConnections=false)
const std::vector< BOARD_CONNECTED_ITEM * > GetNetItems(int aNetCode, const std::vector< KICAD_T > &aTypes) const
Function GetNetItems() Returns the list of items that belong to a certain net.
bool Add(BOARD_ITEM *aItem)
Function Add() Adds an item to the connectivity data.
std::shared_ptr< CN_CONNECTIVITY_ALGO > m_connAlgo
bool Build(BOARD *aBoard, PROGRESS_REPORTER *aReporter=nullptr)
Function Build() Builds the connectivity database for the board aBoard.
std::shared_ptr< FROM_TO_CACHE > m_fromToCache
const std::vector< PAD * > GetConnectedPads(const BOARD_CONNECTED_ITEM *aItem) const
unsigned int GetUnconnectedCount(bool aVisibileOnly) const
bool HasNetNameForNetCode(int nc) const
std::map< int, wxString > m_netcodeMap
Used to map netcode to net name.
void internalRecalculateRatsnest(BOARD_COMMIT *aCommit=nullptr)
Updates the ratsnest for the board without locking the connectivity mutex.
void RefreshNetcodeMap(BOARD *aBoard)
Refresh the map of netcodes to net names.
void HideLocalRatsnest()
Hides the temporary, selection-based ratsnest lines.
const std::vector< CN_EDGE > GetRatsnestForItems(const std::vector< BOARD_ITEM * > &aItems)
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 Move(const VECTOR2I &aDelta)
Moves the connectivity list anchors.
int GetNetCount() const
Function GetNetCount() Returns the total number of nets in the connectivity database.
void GetZoneIslandConnections(const ZONE *aZone, PCB_LAYER_ID aLayer, std::vector< std::set< const BOARD_ITEM * > > *aIslands)
Return, for each filled island of aZone on aLayer, the items that island touches.
std::shared_ptr< CN_CONNECTIVITY_ALGO > GetConnectivityAlgo() const
A trivial spinlock implementation with no optimization.
Definition spinlock.h:30
NET_SETTINGS stores various net-related settings in a project context.
Definition pad.h:61
A progress reporter interface for use in multi-threaded environments.
Describe ratsnest for a single net.
Handle a list of polygons defining a copper zone.
Definition zone.h:70
PROPAGATE_MODE
Controls how nets are propagated through clusters.
@ SKIP_CONFLICTS
Clusters with conflicting drivers are not updated (default)
@ RESOLVE_CONFLICTS
Clusters with conflicting drivers are updated to the most popular net.
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
BOARD_CONNECTED_ITEM * b
BOARD_CONNECTED_ITEM * a
int net
VECTOR2I anchorB
VECTOR2I anchorA
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:683