50    switch( aItem->
Type() )
 
 
  118                return !it->second.GetItems().empty();
 
  121    switch( aItem->
Type() )
 
  134            if( alreadyAdded( 
pad ) )
 
  151        if( alreadyAdded( aItem ) )
 
  159        if( alreadyAdded( aItem ) )
 
  166        if( alreadyAdded( aItem ) )
 
  173        if( alreadyAdded( aItem ) )
 
  180        if( alreadyAdded( aItem ) )
 
  191        ZONE* zone = 
static_cast<ZONE*
>( aItem );
 
  193        if( alreadyAdded( aItem ) )
 
 
  225        item->RemoveInvalidRefs();
 
 
  231    std::lock_guard lock( 
m_mutex );
 
  233    PROF_TIMER garbage_collection( 
"garbage-collection" );
 
  235    std::vector<CN_ITEM*> garbage;
 
  236    garbage.reserve( 1024 );
 
  249    garbage_collection.
Show();
 
  254    std::vector<CN_ITEM*> dirtyItems;
 
  258                      return aItem->Dirty();
 
  271        std::vector<std::future<size_t>> returns( dirtyItems.size() );
 
  273        for( 
size_t ii = 0; ii < dirtyItems.size(); ++ii )
 
  275            returns[ii] = 
tp.submit_task(
 
  276                    [&dirtyItems, ii, 
this] () ->
size_t 
  282                        m_itemList.FindNearby( dirtyItems[ii], visitor );
 
  291        for( 
const std::future<size_t>& ret : returns )
 
  294            std::future_status status = ret.wait_for( std::chrono::milliseconds( 250 ) );
 
  296            while( status != std::future_status::ready )
 
  301                status = ret.wait_for( std::chrono::milliseconds( 250 ) );
 
 
  328    std::deque<CN_ITEM*> 
Q;
 
  329    std::set<CN_ITEM*> item_set;
 
  336    std::set<CN_ITEM*> visited;
 
  338    auto addToSearchList =
 
  339            [&item_set, withinAnyNet, aSingleNet, &aExcludeZones]( 
CN_ITEM *aItem )
 
  341                if( withinAnyNet && aItem->Net() <= 0 )
 
  344                if( !aItem->Valid() )
 
  347                if( aSingleNet >=0 && aItem->Net() != aSingleNet )
 
  350                if( aExcludeZones && aItem->Parent()->Type() == 
PCB_ZONE_T )
 
  353                item_set.insert( aItem );
 
  361    while( !item_set.empty() )
 
  363        std::shared_ptr<CN_CLUSTER> cluster = std::make_shared<CN_CLUSTER>();
 
  365        auto                        it = item_set.begin();
 
  367        while( it != item_set.end() && visited.contains( *it ) )
 
  368            it = item_set.erase( item_set.begin() );
 
  370        if( it == item_set.end() )
 
  374        visited.insert( root );
 
  384            cluster->Add( current );
 
  388                if( withinAnyNet && n->Net() != root->
Net() )
 
  391                if( aExcludeZones && n->Parent()->Type() == 
PCB_ZONE_T )
 
  394                if( !visited.contains( n ) && n->Valid() )
 
  402        clusters.push_back( std::move( cluster ) );
 
  408    std::sort( clusters.begin(), clusters.end(),
 
  409               []( 
const std::shared_ptr<CN_CLUSTER>& a, 
const std::shared_ptr<CN_CLUSTER>& b )
 
  411                   return a->OriginNet() < b->OriginNet();
 
 
  422    std::vector<CN_ZONE_LAYER*> zitems;
 
  426        if( zone->IsOnCopperLayer() )
 
  439                        for( 
int j = 0; j < zone->GetFilledPolysList( layer )->OutlineCount(); j++ )
 
  447    int    progressDelta = 50;
 
  450    size += zitems.size();        
 
  451    size += zitems.size();        
 
  452    size += aBoard->
Tracks().size();
 
  456        size += footprint->Pads().size();
 
  460    progressDelta = std::max( progressDelta, (
int) size / 4 );
 
  465                if( aReporter && ( progress % progressDelta ) == 0 )
 
  475    std::vector<std::future<size_t>> returns( zitems.size() );
 
  483                aZoneLayer->BuildRTree();
 
  491    for( 
size_t ii = 0; ii < zitems.size(); ++ii )
 
  494        returns[ii] = 
tp.submit_task(
 
  495            [cache_zones, ptr] { 
return cache_zones( ptr ); } );
 
  498    for( 
const std::future<size_t>& ret : returns )
 
  500        std::future_status status = ret.wait_for( std::chrono::milliseconds( 250 ) );
 
  502        while( status != std::future_status::ready )
 
  507            status = ret.wait_for( std::chrono::milliseconds( 250 ) );
 
  514    int ii = zitems.size();
 
  519        m_itemMap[ zitem->Parent() ].Link( zitem );
 
  531        for( 
PAD* 
pad : footprint->Pads() )
 
  542            if( shape->IsOnCopperLayer() )
 
 
  558                                       const std::vector<BOARD_ITEM*>& aLocalItems )
 
  565        switch( item->Type() )
 
 
  585    for( 
const std::shared_ptr<CN_CLUSTER>& cluster : 
m_connClusters )
 
  587        if( cluster->IsConflicting() )
 
  591            wxLogTrace( wxT( 
"CN" ), wxT( 
"Conflicting pads in cluster %p; skipping propagation" ),
 
  594        else if( cluster->HasValidNet() )
 
  600            for( 
CN_ITEM* item : *cluster )
 
  602                if( item->Valid() && item->CanChangeNet()
 
  603                        && item->Parent()->GetNetCode() != cluster->OriginNet() )
 
  609                        aCommit->
Modify( item->Parent() );
 
  611                    item->Parent()->SetNetCode( cluster->OriginNet() );
 
  618                wxLogTrace( wxT( 
"CN" ), wxT( 
"Cluster %p: net: %d %s" ),
 
  620                            cluster->OriginNet(),
 
  621                            (
const char*) cluster->OriginNetName().c_str() );
 
  625                wxLogTrace( wxT( 
"CN" ), wxT( 
"Cluster %p: no changeable items to propagate to" ),
 
  631            wxLogTrace( wxT( 
"CN" ), wxT( 
"Cluster %p: connected to unused net" ),
 
 
  647                                                   bool aConnectivityAlreadyRebuilt )
 
  649    int progressDelta = 50;
 
  652    progressDelta = std::max( progressDelta, (
int) aMap.size() / 4 );
 
  654    if( !aConnectivityAlreadyRebuilt )
 
  656        for( 
const auto& [ zone, islands ] : aMap )
 
  675    for( 
auto& [ zone, zoneIslands ] : aMap )
 
  677        for( 
auto& [ layer, layerIslands ] : zoneIslands )
 
  679            if( zone->GetFilledPolysList( layer )->IsEmpty() )
 
  682            for( 
const std::shared_ptr<CN_CLUSTER>& cluster : 
m_connClusters )
 
  684                for( 
CN_ITEM* item : *cluster )
 
  686                    if( item->Parent() == zone && item->GetBoardLayer() == layer )
 
  690                        if( cluster->IsOrphaned() )
 
  691                            layerIslands.m_IsolatedOutlines.push_back( z->
SubpolyIndex() );
 
  693                            layerIslands.m_SingleConnectionOutlines.push_back( z->
SubpolyIndex() );
 
 
  723        for( 
int i = lastNet; i < aNet + 1; i++ )
 
 
  755        if( 
pad->ConditionallyFlashed( layer )
 
  765        if( 
via->ConditionallyFlashed( layer )
 
 
  797    const ZONE* zoneA = 
static_cast<const ZONE*
>( aZoneLayerA->
Parent() );
 
  798    const ZONE* zoneB = 
static_cast<const ZONE*
>( aZoneLayerB->
Parent() );
 
  805    if( aZoneLayerB->
GetLayer() != layer )
 
  813    for( 
int i = 0; i < outline.
PointCount(); i++ )
 
  820            aZoneLayerA->
Connect( aZoneLayerB );
 
  821            aZoneLayerB->
Connect( aZoneLayerA );
 
  828    for( 
int i = 0; i < outline2.
PointCount(); i++ )
 
  835            aZoneLayerA->
Connect( aZoneLayerB );
 
  836            aZoneLayerB->
Connect( aZoneLayerA );
 
 
  851    if( parentA == parentB )
 
  887        commonLayers &= board->GetEnabledLayers();
 
  896            if( !
static_cast<const PAD*
>( parentA )->ConditionallyFlashed( layer ) )
 
  901            if( !
static_cast<const PCB_VIA*
>( parentA )->ConditionallyFlashed( layer ) )
 
  907            if( !
static_cast<const PAD*
>( parentB )->ConditionallyFlashed( layer ) )
 
  912            if( !
static_cast<const PCB_VIA*
>( parentB )->ConditionallyFlashed( layer ) )
 
  919            m_item->Connect( aCandidate );
 
 
  947    std::map<FOOTPRINT*, std::map<wxString, std::vector<CN_ITEM*>>> padsByFootprint;
 
  951        if( !item->Valid() || item->Parent()->Type() != 
PCB_PAD_T )
 
  954        auto pad = 
static_cast<const PAD*
>( item->Parent() );
 
  958        padsByFootprint[fp][ 
pad->GetNumber() ].emplace_back( item );
 
  961    for( 
auto& [footprint, padsMap] : padsByFootprint )
 
  963        if( footprint->GetDuplicatePadNumbersAreJumpers() )
 
  965            for( 
const std::vector<CN_ITEM*>& padsList : padsMap | std::views::values )
 
  967                for( 
size_t i = 0; i < padsList.size(); ++i )
 
  969                    for( 
size_t j = 1; j < padsList.size(); ++j )
 
  971                        padsList[i]->Connect( padsList[j] );
 
  972                        padsList[j]->Connect( padsList[i] );
 
  978        for( 
const std::set<wxString>& 
group : footprint->JumperPadGroups() )
 
  980            std::vector<CN_ITEM*> toConnect;
 
  982            for( 
const wxString& padNumber : 
group )
 
  983                std::ranges::copy( padsMap[padNumber], std::back_inserter( toConnect ) );
 
  985            for( 
size_t i = 0; i < toConnect.size(); ++i )
 
  987                for( 
size_t j = 1; j < toConnect.size(); ++j )
 
  989                    toConnect[i]->Connect( toConnect[j] );
 
  990                    toConnect[j]->Connect( toConnect[i] );
 
 
@ ZLO_FORCE_NO_ZONE_CONNECTION
 
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
 
bool SetNetCode(int aNetCode, bool aNoAssert)
Set net using a net code.
 
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
 
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
 
virtual bool IsConnected() const
Returns information if the object is derived from BOARD_CONNECTED_ITEM.
 
virtual bool IsOnLayer(PCB_LAYER_ID aLayer) const
Test to see if this object is on the given layer.
 
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.
 
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
 
FOOTPRINT * GetParentFootprint() const
 
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
 
virtual bool IsOnCopperLayer() const
 
Information pertinent to a Pcbnew printed circuit board.
 
const ZONES & Zones() const
 
const FOOTPRINTS & Footprints() const
 
const TRACKS & Tracks() const
 
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
 
const DRAWINGS & Drawings() const
 
constexpr bool Contains(const Vec &aPoint) const
 
constexpr bool Intersects(const BOX2< Vec > &aRect) const
 
void FillIsolatedIslandsMap(std::map< ZONE *, std::map< PCB_LAYER_ID, ISOLATED_ISLANDS > > &aMap, bool aConnectivityAlreadyRebuilt)
Fill in the isolated islands map with copper islands that are not connected to a net.
 
bool Remove(BOARD_ITEM *aItem)
 
CONNECTIVITY_DATA * m_parentConnectivityData
 
void add(Container &c, BItem brditem)
 
PROGRESS_REPORTER * m_progressReporter
 
std::vector< std::shared_ptr< CN_CLUSTER > > m_connClusters
 
void propagateConnections(BOARD_COMMIT *aCommit=nullptr)
 
const CLUSTERS & GetClusters()
 
void LocalBuild(const std::shared_ptr< CONNECTIVITY_DATA > &aGlobalConnectivity, const std::vector< BOARD_ITEM * > &aLocalItems)
 
void MarkNetAsDirty(int aNet)
 
const CLUSTERS SearchClusters(CLUSTER_SEARCH_MODE aMode, bool aExcludeZones, int aSingleNet)
 
void markItemNetAsDirty(const BOARD_ITEM *aItem)
 
std::vector< std::shared_ptr< CN_CLUSTER > > m_ratsnestClusters
 
void PropagateNets(BOARD_COMMIT *aCommit=nullptr)
Propagate nets from pads to other items in clusters.
 
std::shared_ptr< CONNECTIVITY_DATA > m_globalConnectivityData
 
std::vector< bool > m_dirtyNets
 
std::unordered_map< const BOARD_ITEM *, ITEM_MAP_ENTRY > m_itemMap
 
void SetProgressReporter(PROGRESS_REPORTER *aReporter)
 
std::vector< std::shared_ptr< CN_CLUSTER > > CLUSTERS
 
void Build(BOARD *aBoard, PROGRESS_REPORTER *aReporter=nullptr)
 
bool Add(BOARD_ITEM *aItem)
 
CN_ITEM represents a BOARD_CONNETED_ITEM in the connectivity system (ie: a pad, track/arc/via,...
 
virtual int AnchorCount() const
 
const std::vector< CN_ITEM * > & ConnectedItems() const
 
virtual const VECTOR2I GetAnchor(int n) const
 
bool CanChangeNet() const
 
BOARD_CONNECTED_ITEM * Parent() const
 
void checkZoneItemConnection(CN_ZONE_LAYER *aZoneLayer, CN_ITEM *aItem)
 
CN_ITEM * m_item
The item we are looking for connections to.
 
void checkZoneZoneConnection(CN_ZONE_LAYER *aZoneLayerA, CN_ZONE_LAYER *aZoneLayerB)
 
bool operator()(CN_ITEM *aCandidate)
 
bool HasSingleConnection()
 
PCB_LAYER_ID GetLayer() const
 
bool Collide(SHAPE *aRefShape) const
 
bool ContainsPoint(const VECTOR2I &p) const
 
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
 
KICAD_T Type() const
Returns the type of object.
 
LSET is a set of PCB_LAYER_IDs.
 
void RunOnLayers(const std::function< void(PCB_LAYER_ID)> &aFunction) const
Execute a function on each layer of the LSET.
 
static LSET AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
 
Handle the data for a net.
 
A small class to help profiling.
 
void Show(std::ostream &aStream=std::cerr)
Print the elapsed time (in a suitable unit) to a stream.
 
A progress reporter interface for use in multi-threaded environments.
 
virtual bool IsCancelled() const =0
 
virtual bool KeepRefreshing(bool aWait=false)=0
Update the UI (if any).
 
virtual void AdvanceProgress()=0
Increment the progress bar length (inside the current virtual zone).
 
virtual void SetCurrentProgress(double aProgress)=0
Set the progress value to aProgress (0..1).
 
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
 
int PointCount() const
Return the number of points (vertices) in this line chain.
 
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
 
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
 
virtual bool Collide(const VECTOR2I &aP, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const
Check if the boundary of shape (this) lies closer to the point aP than aClearance,...
 
Handle a list of polygons defining a copper zone.
 
const std::shared_ptr< SHAPE_POLY_SET > & GetFilledPolysList(PCB_LAYER_ID aLayer) const
 
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
 
a few functions useful in geometry calculations.
 
FLASHING
Enum used during connectivity building to ensure we do not query connectivity while building the data...
 
@ NEVER_FLASHED
Never flashed for connectivity.
 
@ ALWAYS_FLASHED
Always flashed for connectivity.
 
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
 
PCB_LAYER_ID
A quick note on layer IDs:
 
thread_pool & GetKiCadThreadPool()
Get a reference to the current thread pool.
 
BS::thread_pool< 0 > thread_pool
 
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
 
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
 
@ PCB_ZONE_T
class ZONE, a copper pour area
 
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
 
@ PCB_PAD_T
class PAD, a pad in a footprint
 
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
 
@ PCB_NETINFO_T
class NETINFO_ITEM, a description of a net
 
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)