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-2019 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 
32 #include <memory>
33 #include <mutex>
34 #include <vector>
35 #include <wx/string.h>
36 
37 #include <math/vector2d.h>
39 #include <class_zone.h>
40 
41 class CN_CLUSTER;
43 class CN_EDGE;
44 class BOARD;
45 class BOARD_COMMIT;
47 class BOARD_ITEM;
48 class ZONE_CONTAINER;
49 class RN_DATA;
50 class RN_NET;
51 class TRACK;
52 class D_PAD;
53 class MODULE;
54 class PROGRESS_REPORTER;
55 
57 {
58  int net;
61 };
62 
64 {
66  m_zone( aZone )
67  {}
68 
70  std::vector<int> m_islands;
71 };
72 
74 {
75  int netCode;
77 };
78 
79 // a wrapper class encompassing the connectivity computation algorithm and the
81 {
82 public:
85 
86  CONNECTIVITY_DATA( const std::vector<BOARD_ITEM*>& aItems );
87 
92  void Build( BOARD* aBoard );
93 
98  void Build( const std::vector<BOARD_ITEM*>& aItems );
99 
106  bool Add( BOARD_ITEM* aItem );
107 
114  bool Remove( BOARD_ITEM* aItem );
115 
122  bool Update( BOARD_ITEM* aItem );
123 
128  void Clear();
129 
134  int GetNetCount() const;
135 
140  RN_NET* GetRatsnestForNet( int aNet );
141 
146  void PropagateNets();
147 
148  bool CheckConnectivity( std::vector<CN_DISJOINT_NET_ENTRY>& aReport );
149 
156  void FindIsolatedCopperIslands( ZONE_CONTAINER* aZone, std::vector<int>& aIslands );
157  void FindIsolatedCopperIslands( std::vector<CN_ZONE_ISOLATED_ISLAND_LIST>& aZones );
158 
164  void RecalculateRatsnest( BOARD_COMMIT* aCommit = nullptr );
165 
170  unsigned int GetUnconnectedCount() const;
171 
172  unsigned int GetNodeCount( int aNet = -1 ) const;
173 
174  unsigned int GetPadCount( int aNet = -1 ) const;
175 
176  const std::vector<TRACK*> GetConnectedTracks( const BOARD_CONNECTED_ITEM* aItem ) const;
177 
178  const std::vector<D_PAD*> GetConnectedPads( const BOARD_CONNECTED_ITEM* aItem ) const;
179 
180  const void GetConnectedPads( const BOARD_CONNECTED_ITEM* aItem, std::set<D_PAD*>* pads ) const;
181 
182  const std::vector<BOARD_CONNECTED_ITEM*> GetConnectedItems( const BOARD_CONNECTED_ITEM* aItem, const VECTOR2I& aAnchor, KICAD_T aTypes[] );
183 
184  void GetUnconnectedEdges( std::vector<CN_EDGE>& aEdges ) const;
185 
191  void ClearDynamicRatsnest();
192 
196  void HideDynamicRatsnest();
197 
203  void ComputeDynamicRatsnest( const std::vector<BOARD_ITEM*>& aItems );
204 
205  const std::vector<RN_DYNAMIC_LINE>& GetDynamicRatsnest() const
206  {
207  return m_dynamicRatsnest;
208  }
209 
216  const std::vector<BOARD_CONNECTED_ITEM*> GetConnectedItems( const BOARD_CONNECTED_ITEM* aItem,
217  const KICAD_T aTypes[], bool aIgnoreNetcodes = false ) const;
218 
225  const std::vector<BOARD_CONNECTED_ITEM*> GetNetItems( int aNetCode,
226  const KICAD_T aTypes[] ) const;
227 
228  const std::vector<VECTOR2I> NearestUnconnectedTargets( const BOARD_CONNECTED_ITEM* aRef,
229  const VECTOR2I& aPos,
230  int aMaxCount = -1 );
231 
232  void BlockRatsnestItems( const std::vector<BOARD_ITEM*>& aItems );
233 
234  std::shared_ptr<CN_CONNECTIVITY_ALGO> GetConnectivityAlgo() const
235  {
236  return m_connAlgo;
237  }
238 
239  std::mutex& GetLock()
240  {
241  return m_lock;
242  }
243 
244  void MarkItemNetAsDirty( BOARD_ITEM* aItem );
245  void SetProgressReporter( PROGRESS_REPORTER* aReporter );
246 
247 #ifndef SWIG
248  const std::vector<CN_EDGE> GetRatsnestForComponent( MODULE* aComponent, bool aSkipInternalConnections = false );
249 #endif
250 
251 private:
252 
253  void updateRatsnest();
254  void addRatsnestCluster( const std::shared_ptr<CN_CLUSTER>& aCluster );
255 
256  std::shared_ptr<CN_CONNECTIVITY_ALGO> m_connAlgo;
257 
258  std::vector<RN_DYNAMIC_LINE> m_dynamicRatsnest;
259  std::vector<RN_NET*> m_nets;
260 
262 
263  std::mutex m_lock;
264 };
265 
266 #endif
const std::vector< TRACK * > GetConnectedTracks(const BOARD_CONNECTED_ITEM *aItem) const
void Clear()
Function Clear() Erases the connectivity database.
ZONE_CONTAINER handles a list of polygons defining a copper zone.
Definition: class_zone.h:60
unsigned int GetNodeCount(int aNet=-1) const
BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class,...
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.
const std::vector< BOARD_CONNECTED_ITEM * > GetConnectedItems(const BOARD_CONNECTED_ITEM *aItem, const VECTOR2I &aAnchor, KICAD_T aTypes[])
void ComputeDynamicRatsnest(const std::vector< BOARD_ITEM * > &aItems)
Function ComputeDynamicRatsnest() Calculates the temporary dynamic ratsnest (i.e.
void FindIsolatedCopperIslands(ZONE_CONTAINER *aZone, std::vector< int > &aIslands)
Function FindIsolatedCopperIslands() Searches for copper islands in zone aZone that are not connected...
BOARD_CONNECTED_ITEM * b
BOARD_CONNECTED_ITEM is a base class derived from BOARD_ITEM for items that can be connected and have...
std::vector< RN_DYNAMIC_LINE > m_dynamicRatsnest
VECTOR2I anchorB
KICAD_T
Enum KICAD_T is the set of class identification values, stored in EDA_ITEM::m_StructType.
Definition: typeinfo.h:78
std::mutex & GetLock()
unsigned int GetPadCount(int aNet=-1) const
VECTOR2I anchorA
const std::vector< VECTOR2I > NearestUnconnectedTargets(const BOARD_CONNECTED_ITEM *aRef, const VECTOR2I &aPos, int aMaxCount=-1)
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.
CN_ZONE_ISOLATED_ISLAND_LIST(ZONE_CONTAINER *aZone)
const std::vector< D_PAD * > GetConnectedPads(const BOARD_CONNECTED_ITEM *aItem) const
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)
const std::vector< RN_DYNAMIC_LINE > & GetDynamicRatsnest() const
BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:160
const std::vector< CN_EDGE > GetRatsnestForComponent(MODULE *aComponent, bool aSkipInternalConnections=false)
int net
int GetNetCount() const
Function GetNetCount() Returns the total number of nets in the connectivity database.
RN_NET Describes ratsnest for a single net.
Definition: ratsnest_data.h:59
void Build(BOARD *aBoard)
Function Build() Builds the connectivity database for the board aBoard.
void HideDynamicRatsnest()
Hides the temporary dynamic ratsnest lines.
void addRatsnestCluster(const std::shared_ptr< CN_CLUSTER > &aCluster)