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-2020 KiCad Developers, see AUTHORS.txt for contributors.
6  * @author Maciej Suminski <maciej.suminski@cern.ch>
7  * @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
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 
42 class FROM_TO_CACHE;
43 class CN_CLUSTER;
45 class CN_EDGE;
46 class BOARD;
47 class BOARD_COMMIT;
49 class BOARD_ITEM;
50 class ZONE;
51 class RN_DATA;
52 class RN_NET;
53 class TRACK;
54 class PAD;
55 class FOOTPRINT;
56 class PROGRESS_REPORTER;
57 
59 {
60  int net;
63 };
64 
69 {
71  m_zone( aZone )
72  {}
73 
75 
76  std::map<PCB_LAYER_ID, std::vector<int>> m_islands;
77 };
78 
80 {
81  int netCode;
83 };
84 
85 // a wrapper class encompassing the connectivity computation algorithm and the
87 {
88 public:
91 
92  CONNECTIVITY_DATA( const std::vector<BOARD_ITEM*>& aItems, bool aSkipItems = false );
93 
98  void Build( BOARD* aBoard, PROGRESS_REPORTER* aReporter = nullptr );
99 
104  void Build( const std::vector<BOARD_ITEM*>& aItems );
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 Clear();
144 
149  int GetNetCount() const;
150 
155  RN_NET* GetRatsnestForNet( int aNet );
156 
161  void PropagateNets();
162 
163  bool CheckConnectivity( std::vector<CN_DISJOINT_NET_ENTRY>& aReport );
164 
171  void FindIsolatedCopperIslands( ZONE* aZone, std::vector<int>& aIslands );
172  void FindIsolatedCopperIslands( std::vector<CN_ZONE_ISOLATED_ISLAND_LIST>& aZones );
173 
179  void RecalculateRatsnest( BOARD_COMMIT* aCommit = nullptr );
180 
185  unsigned int GetUnconnectedCount() const;
186 
187  bool IsConnectedOnLayer( const BOARD_CONNECTED_ITEM* aItem, int aLayer, std::vector<KICAD_T> aTypes = {} ) const;
188 
189  unsigned int GetNodeCount( int aNet = -1 ) const;
190 
191  unsigned int GetPadCount( int aNet = -1 ) const;
192 
193  const std::vector<TRACK*> GetConnectedTracks( const BOARD_CONNECTED_ITEM* aItem ) const;
194 
195  const std::vector<PAD*> GetConnectedPads( const BOARD_CONNECTED_ITEM* aItem ) const;
196 
197  void GetConnectedPads( const BOARD_CONNECTED_ITEM* aItem, std::set<PAD*>* pads ) const;
198 
207  const std::vector<BOARD_CONNECTED_ITEM*> GetConnectedItemsAtAnchor( const BOARD_CONNECTED_ITEM* aItem,
208  const VECTOR2I& aAnchor,
209  const KICAD_T aTypes[] ) const;
210 
211  void GetUnconnectedEdges( std::vector<CN_EDGE>& aEdges ) const;
212 
213  bool TestTrackEndpointDangling( TRACK* aTrack, wxPoint* aPos = nullptr );
214 
220  void ClearDynamicRatsnest();
221 
225  void HideDynamicRatsnest();
226 
232  void ComputeDynamicRatsnest( const std::vector<BOARD_ITEM*>& aItems,
233  const CONNECTIVITY_DATA* aDynamicData );
234 
235  const std::vector<RN_DYNAMIC_LINE>& GetDynamicRatsnest() const
236  {
237  return m_dynamicRatsnest;
238  }
239 
246  const std::vector<BOARD_CONNECTED_ITEM*> GetConnectedItems( const BOARD_CONNECTED_ITEM* aItem,
247  const KICAD_T aTypes[], bool aIgnoreNetcodes = false ) const;
248 
255  const std::vector<BOARD_CONNECTED_ITEM*> GetNetItems( int aNetCode,
256  const KICAD_T aTypes[] ) const;
257 
258  void BlockRatsnestItems( const std::vector<BOARD_ITEM*>& aItems );
259 
260  std::shared_ptr<CN_CONNECTIVITY_ALGO> GetConnectivityAlgo() const
261  {
262  return m_connAlgo;
263  }
264 
266  {
267  return m_lock;
268  }
269 
270  void MarkItemNetAsDirty( BOARD_ITEM* aItem );
271  void SetProgressReporter( PROGRESS_REPORTER* aReporter );
272 
273  const std::map<int, wxString>& GetNetclassMap() const
274  {
275  return m_netclassMap;
276  }
277 
278 #ifndef SWIG
279  const std::vector<CN_EDGE> GetRatsnestForItems( const std::vector<BOARD_ITEM*> aItems );
280 
281  const std::vector<CN_EDGE> GetRatsnestForComponent( FOOTPRINT* aComponent,
282  bool aSkipInternalConnections = false );
283 #endif
284 
285  std::shared_ptr<FROM_TO_CACHE> GetFromToCache()
286  {
287  return m_fromToCache;
288  }
289 
290 private:
291 
292  void updateRatsnest();
293 
299  void updateItemPositions( const std::vector<BOARD_ITEM*>& aItems );
300  void addRatsnestCluster( const std::shared_ptr<CN_CLUSTER>& aCluster );
301 
302  std::shared_ptr<CN_CONNECTIVITY_ALGO> m_connAlgo;
303  std::shared_ptr<FROM_TO_CACHE> m_fromToCache;
304  std::vector<RN_DYNAMIC_LINE> m_dynamicRatsnest;
305  std::vector<RN_NET*> m_nets;
306 
308 
309  bool m_skipRatsnest = false;
310 
312 
314  std::map<int, wxString> m_netclassMap;
315 };
316 
317 #endif
const std::vector< TRACK * > GetConnectedTracks(const BOARD_CONNECTED_ITEM *aItem) const
void Clear()
Function Clear() Erases the connectivity database.
const std::vector< CN_EDGE > GetRatsnestForComponent(FOOTPRINT *aComponent, bool aSkipInternalConnections=false)
bool IsConnectedOnLayer(const BOARD_CONNECTED_ITEM *aItem, int aLayer, std::vector< KICAD_T > aTypes={}) const
unsigned int GetNodeCount(int aNet=-1) const
const std::vector< BOARD_CONNECTED_ITEM * > GetConnectedItemsAtAnchor(const BOARD_CONNECTED_ITEM *aItem, const VECTOR2I &aAnchor, const KICAD_T aTypes[]) const
Function GetConnectedItemsAtAnchor() Returns a list of items connected to a source item aItem at posi...
bool TestTrackEndpointDangling(TRACK *aTrack, wxPoint *aPos=nullptr)
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:82
A progress reporter for use in multi-threaded environments.
std::shared_ptr< CN_CONNECTIVITY_ALGO > m_connAlgo
PROGRESS_REPORTER * m_progressReporter
std::shared_ptr< CN_CONNECTIVITY_ALGO > GetConnectivityAlgo() const
bool Update(BOARD_ITEM *aItem)
Function Update() Updates the connectivity data for an item.
const std::vector< BOARD_CONNECTED_ITEM * > GetNetItems(int aNetCode, const KICAD_T aTypes[]) const
Function GetNetItems() Returns the list of items that belong to a certain net.
void RecalculateRatsnest(BOARD_COMMIT *aCommit=nullptr)
Function RecalculateRatsnest() Updates the ratsnest for the board.
std::shared_ptr< FROM_TO_CACHE > m_fromToCache
void updateItemPositions(const std::vector< BOARD_ITEM * > &aItems)
Updates the item positions without modifying the dirtyNet flag.
std::map< PCB_LAYER_ID, std::vector< int > > m_islands
BOARD_CONNECTED_ITEM * b
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
std::vector< RN_DYNAMIC_LINE > m_dynamicRatsnest
VECTOR2I anchorB
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition: typeinfo.h:77
const std::map< int, wxString > & GetNetclassMap() const
unsigned int GetPadCount(int aNet=-1) const
std::shared_ptr< FROM_TO_CACHE > GetFromToCache()
void Build(BOARD *aBoard, PROGRESS_REPORTER *aReporter=nullptr)
Function Build() Builds the connectivity database for the board aBoard.
VECTOR2I anchorA
const std::vector< BOARD_CONNECTED_ITEM * > GetConnectedItems(const BOARD_CONNECTED_ITEM *aItem, const KICAD_T aTypes[], bool aIgnoreNetcodes=false) const
Function GetConnectedItems() Returns a list of items connected to a source item aItem.
std::map< int, wxString > m_netclassMap
Map of netcode -> netclass the net is a member of; used for ratsnest painting.
unsigned int GetUnconnectedCount() const
Function GetUnconnectedCount() Returns the number of remaining edges in the ratsnest.
void PropagateNets()
Function PropagateNets() Propagates the net codes from the source pads to the tracks/vias.
ZONE handles a list of polygons defining a copper zone.
Definition: zone.h:57
void ClearDynamicRatsnest()
Function ClearDynamicRatsnest() Erases the temporary dynamic ratsnest (i.e.
void SetProgressReporter(PROGRESS_REPORTER *aReporter)
bool Remove(BOARD_ITEM *aItem)
Function Remove() Removes an item from the connectivity data.
void MarkItemNetAsDirty(BOARD_ITEM *aItem)
std::vector< RN_NET * > m_nets
void GetUnconnectedEdges(std::vector< CN_EDGE > &aEdges) const
bool Add(BOARD_ITEM *aItem)
Function Add() Adds an item to the connectivity data.
void BlockRatsnestItems(const std::vector< BOARD_ITEM * > &aItems)
RN_NET * GetRatsnestForNet(int aNet)
Function GetRatsnestForNet() Returns the ratsnest, expressed as a set of graph edges for a given net.
BOARD_CONNECTED_ITEM * a
bool CheckConnectivity(std::vector< CN_DISJOINT_NET_ENTRY > &aReport)
A trivial spinlock implementation with no optimization.
Definition: spinlock.h:29
void ComputeDynamicRatsnest(const std::vector< BOARD_ITEM * > &aItems, const CONNECTIVITY_DATA *aDynamicData)
Function ComputeDynamicRatsnest() Calculates the temporary dynamic ratsnest (i.e.
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 > & GetDynamicRatsnest() const
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:190
int net
int GetNetCount() const
Function GetNetCount() Returns the total number of nets in the connectivity database.
Describe ratsnest for a single net.
Definition: ratsnest_data.h:61
const std::vector< PAD * > GetConnectedPads(const BOARD_CONNECTED_ITEM *aItem) const
Definition: pad.h:60
void HideDynamicRatsnest()
Hides the temporary dynamic ratsnest lines.
void addRatsnestCluster(const std::shared_ptr< CN_CLUSTER > &aCluster)
void Move(const VECTOR2I &aDelta)
Moves the connectivity list anchors.
A structure used for calculating isolated islands on a given zone across all its layers.
Definition: track.h:83
const std::vector< CN_EDGE > GetRatsnestForItems(const std::vector< BOARD_ITEM * > aItems)
KISPINLOCK & GetLock()