diff --git a/pcbnew/connectivity/connectivity_algo.cpp b/pcbnew/connectivity/connectivity_algo.cpp index a64a071bc2..fa8b251083 100644 --- a/pcbnew/connectivity/connectivity_algo.cpp +++ b/pcbnew/connectivity/connectivity_algo.cpp @@ -226,6 +226,12 @@ void CN_CONNECTIVITY_ALGO::searchConnections() m_itemList.RemoveInvalidItems( garbage ); + if( m_isLocal ) + { + for( CN_ITEM* item : m_globalConnectivity->m_itemList ) + item->RemoveInvalidRefs(); + } + for( CN_ITEM* item : garbage ) delete item; @@ -542,9 +548,13 @@ void CN_CONNECTIVITY_ALGO::Build( BOARD* aBoard, PROGRESS_REPORTER* aReporter ) } -void CN_CONNECTIVITY_ALGO::LocalBuild( const std::vector& aItems ) +void CN_CONNECTIVITY_ALGO::LocalBuild( std::shared_ptr aGlobalConnectivity, + const std::vector& aLocalItems ) { - for( BOARD_ITEM* item : aItems ) + m_isLocal = true; + m_globalConnectivity = aGlobalConnectivity; + + for( BOARD_ITEM* item : aLocalItems ) { switch( item->Type() ) { diff --git a/pcbnew/connectivity/connectivity_algo.h b/pcbnew/connectivity/connectivity_algo.h index 511b5fb04e..32db07c22f 100644 --- a/pcbnew/connectivity/connectivity_algo.h +++ b/pcbnew/connectivity/connectivity_algo.h @@ -154,8 +154,14 @@ public: std::list m_items; }; - CN_CONNECTIVITY_ALGO() {} - ~CN_CONNECTIVITY_ALGO() { Clear(); } + CN_CONNECTIVITY_ALGO() : + m_isLocal( false ) + {} + + ~CN_CONNECTIVITY_ALGO() + { + Clear(); + } bool ItemExists( const BOARD_CONNECTED_ITEM* aItem ) const { @@ -197,8 +203,9 @@ public: return m_dirtyNets.size(); } - void Build( BOARD* aZoneLayer, PROGRESS_REPORTER* aReporter = nullptr ); - void LocalBuild( const std::vector& aItems ); + void Build( BOARD* aBoard, PROGRESS_REPORTER* aReporter = nullptr ); + void LocalBuild( std::shared_ptr aGlobalConnectivity, + const std::vector& aLocalItems ); void Clear(); @@ -272,6 +279,9 @@ private: std::vector> m_ratsnestClusters; std::vector m_dirtyNets; + bool m_isLocal; + std::shared_ptr m_globalConnectivity; + PROGRESS_REPORTER* m_progressReporter = nullptr; }; diff --git a/pcbnew/connectivity/connectivity_data.cpp b/pcbnew/connectivity/connectivity_data.cpp index 8129c91421..3750475b6d 100644 --- a/pcbnew/connectivity/connectivity_data.cpp +++ b/pcbnew/connectivity/connectivity_data.cpp @@ -44,7 +44,8 @@ #include #include -CONNECTIVITY_DATA::CONNECTIVITY_DATA() +CONNECTIVITY_DATA::CONNECTIVITY_DATA() : + m_skipRatsnestUpdate( false ) { m_connAlgo.reset( new CN_CONNECTIVITY_ALGO ); m_progressReporter = nullptr; @@ -52,10 +53,12 @@ CONNECTIVITY_DATA::CONNECTIVITY_DATA() } -CONNECTIVITY_DATA::CONNECTIVITY_DATA( const std::vector& aItems, bool aSkipRatsnest ) - : m_skipRatsnest( aSkipRatsnest ) +CONNECTIVITY_DATA::CONNECTIVITY_DATA( std::shared_ptr aGlobalConnectivity, + const std::vector& aLocalItems, + bool aSkipRatsnestUpdate ) : + m_skipRatsnestUpdate( aSkipRatsnestUpdate ) { - Build( aItems ); + Build( aGlobalConnectivity, aLocalItems ); m_progressReporter = nullptr; m_fromToCache.reset( new FROM_TO_CACHE ); } @@ -140,7 +143,8 @@ bool CONNECTIVITY_DATA::Build( BOARD* aBoard, PROGRESS_REPORTER* aReporter ) } -void CONNECTIVITY_DATA::Build( const std::vector& aItems ) +void CONNECTIVITY_DATA::Build( std::shared_ptr& aGlobalConnectivity, + const std::vector& aLocalItems ) { std::unique_lock lock( m_lock, std::try_to_lock ); @@ -148,7 +152,7 @@ void CONNECTIVITY_DATA::Build( const std::vector& aItems ) return; m_connAlgo.reset( new CN_CONNECTIVITY_ALGO ); - m_connAlgo->LocalBuild( aItems ); + m_connAlgo->LocalBuild( aGlobalConnectivity->GetConnectivityAlgo(), aLocalItems ); internalRecalculateRatsnest(); } @@ -272,7 +276,7 @@ void CONNECTIVITY_DATA::internalRecalculateRatsnest( BOARD_COMMIT* aCommit ) m_connAlgo->ClearDirtyFlags(); - if( !m_skipRatsnest ) + if( !m_skipRatsnestUpdate ) updateRatsnest(); } diff --git a/pcbnew/connectivity/connectivity_data.h b/pcbnew/connectivity/connectivity_data.h index 3ca4975258..f53e3e38e5 100644 --- a/pcbnew/connectivity/connectivity_data.h +++ b/pcbnew/connectivity/connectivity_data.h @@ -88,7 +88,8 @@ public: CONNECTIVITY_DATA(); ~CONNECTIVITY_DATA(); - CONNECTIVITY_DATA( const std::vector& aItems, bool aSkipItems = false ); + CONNECTIVITY_DATA( std::shared_ptr aGlobalConnectivity, + const std::vector& aLocalItems, bool aSkipRatsnestUpdate = false ); /** * Function Build() @@ -100,7 +101,8 @@ public: * Function Build() * Builds the connectivity database for a set of items aItems. */ - void Build( const std::vector& aItems ); + void Build( std::shared_ptr& aGlobalConnectivity, + const std::vector& aLocalItems ); /** * Function Add() @@ -297,7 +299,7 @@ private: std::vector m_nets; /// Used to suppress ratsnest calculations on dynamic ratsnests - bool m_skipRatsnest = false; + bool m_skipRatsnestUpdate; KISPINLOCK m_lock; diff --git a/pcbnew/router/router_tool.cpp b/pcbnew/router/router_tool.cpp index 396ad3b7ae..bf9d1832c0 100644 --- a/pcbnew/router/router_tool.cpp +++ b/pcbnew/router/router_tool.cpp @@ -2099,7 +2099,8 @@ int ROUTER_TOOL::InlineDrag( const TOOL_EVENT& aEvent ) courtyardClearanceDRC.m_FpInMove.push_back( footprint ); } - dynamicData = std::make_unique( dynamicItems, true ); + dynamicData = std::make_unique( board()->GetConnectivity(), + dynamicItems, true ); connectivityData->BlockRatsnestItems( dynamicItems ); } else diff --git a/pcbnew/tools/board_inspection_tool.cpp b/pcbnew/tools/board_inspection_tool.cpp index 161432b116..a69023b97e 100644 --- a/pcbnew/tools/board_inspection_tool.cpp +++ b/pcbnew/tools/board_inspection_tool.cpp @@ -1724,7 +1724,7 @@ void BOARD_INSPECTION_TOOL::calculateSelectionRatsnest( const VECTOR2I& aDelta ) if( !m_dynamicData ) { - m_dynamicData = new CONNECTIVITY_DATA( items, true ); + m_dynamicData = new CONNECTIVITY_DATA( board()->GetConnectivity(), items, true ); connectivity->BlockRatsnestItems( items ); } else