From 9b9efb9002bd2cab5a8e48783849062b77477dda Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Mon, 6 Mar 2023 13:55:40 +0000 Subject: [PATCH] Cache for netclass pattern assignments. --- common/dialogs/dialog_assign_netclass.cpp | 2 ++ common/dialogs/panel_setup_netclasses.cpp | 2 ++ common/project/net_settings.cpp | 8 ++++++++ include/project/net_settings.h | 1 + pcbnew/board.cpp | 1 + 5 files changed, 14 insertions(+) diff --git a/common/dialogs/dialog_assign_netclass.cpp b/common/dialogs/dialog_assign_netclass.cpp index 10a97900bd..debaafc83b 100644 --- a/common/dialogs/dialog_assign_netclass.cpp +++ b/common/dialogs/dialog_assign_netclass.cpp @@ -86,6 +86,8 @@ bool DIALOG_ASSIGN_NETCLASS::TransferDataFromWindow() m_netclassCtrl->GetStringSelection() } ); + netSettings->m_NetClassPatternAssignmentCache.clear(); + return true; } diff --git a/common/dialogs/panel_setup_netclasses.cpp b/common/dialogs/panel_setup_netclasses.cpp index 3135654817..d82ab7640e 100644 --- a/common/dialogs/panel_setup_netclasses.cpp +++ b/common/dialogs/panel_setup_netclasses.cpp @@ -411,6 +411,8 @@ bool PANEL_SETUP_NETCLASSES::TransferDataFromWindow() std::make_unique( pattern, CTX_NETCLASS ), netclass } ); + + m_netSettings->m_NetClassPatternAssignmentCache.clear(); } return true; diff --git a/common/project/net_settings.cpp b/common/project/net_settings.cpp index d41614edc8..d67c510c82 100644 --- a/common/project/net_settings.cpp +++ b/common/project/net_settings.cpp @@ -391,13 +391,21 @@ std::shared_ptr NET_SETTINGS::GetEffectiveNetClass( const wxString& aN if( it != m_NetClassLabelAssignments.end() ) return getNetclass( it->second ); + auto it2 = m_NetClassPatternAssignmentCache.find( aNetName ); + + if( it2 != m_NetClassPatternAssignmentCache.end() ) + return getNetclass( it2->second ); + for( const auto& [ matcher, netclassName ] : m_NetClassPatternAssignments ) { int matches; int offset; if( matcher->Find( aNetName, matches, offset ) && offset == 0 ) + { + m_NetClassPatternAssignmentCache[ aNetName ] = netclassName; return getNetclass( netclassName ); + } } return m_DefaultNetClass; diff --git a/include/project/net_settings.h b/include/project/net_settings.h index b7d7cee379..236f73c2b8 100644 --- a/include/project/net_settings.h +++ b/include/project/net_settings.h @@ -43,6 +43,7 @@ public: std::vector, wxString>> m_NetClassPatternAssignments; + mutable std::map m_NetClassPatternAssignmentCache; std::map m_NetClassLabelAssignments; diff --git a/pcbnew/board.cpp b/pcbnew/board.cpp index 52ee8b6dbd..c428628d11 100644 --- a/pcbnew/board.cpp +++ b/pcbnew/board.cpp @@ -203,6 +203,7 @@ void BOARD::SetProject( PROJECT* aProject, bool aReferenceOnly ) projectSettings->m_NetClasses = legacySettings->m_NetClasses; projectSettings->m_NetClassPatternAssignments = std::move( legacySettings->m_NetClassPatternAssignments ); + projectSettings->m_NetClassPatternAssignmentCache.clear(); } // Now update the DesignSettings' netclass pointer to point into the project.