From 55ca6145eaac88914be11131db0d5a81dd0129a4 Mon Sep 17 00:00:00 2001 From: Marek Roszko Date: Thu, 3 Nov 2022 00:12:53 -0400 Subject: [PATCH] Stuff RecomputeIntersheetRefs into SCHEMATIC for reuse --- eeschema/eeschema_helpers.cpp | 4 +++ eeschema/sch_edit_frame.cpp | 62 +++------------------------------ eeschema/schematic.cpp | 64 ++++++++++++++++++++++++++++++++++- eeschema/schematic.h | 8 +++++ 4 files changed, 80 insertions(+), 58 deletions(-) diff --git a/eeschema/eeschema_helpers.cpp b/eeschema/eeschema_helpers.cpp index 12f95294cc..78f5c54220 100644 --- a/eeschema/eeschema_helpers.cpp +++ b/eeschema/eeschema_helpers.cpp @@ -148,6 +148,10 @@ SCHEMATIC* EESCHEMA_HELPERS::LoadSchematic( wxString& aFileName, SCH_IO_MGR::SCH schematic->ConnectionGraph()->Reset(); + schematic->SetSheetNumberAndCount(); + schematic->RecomputeIntersheetRefs( true, []( SCH_GLOBALLABEL* ) { } ); + schematic->CurrentSheet().UpdateAllScreenReferences(); + schematic->CurrentSheet().LastScreen()->TestDanglingEnds( nullptr, nullptr ); return schematic; diff --git a/eeschema/sch_edit_frame.cpp b/eeschema/sch_edit_frame.cpp index b23c9f5d71..9d176e7156 100644 --- a/eeschema/sch_edit_frame.cpp +++ b/eeschema/sch_edit_frame.cpp @@ -1494,63 +1494,11 @@ void SCH_EDIT_FRAME::RecalculateConnections( SCH_CLEANUP_FLAGS aCleanupFlags ) void SCH_EDIT_FRAME::RecomputeIntersheetRefs( bool autoplaceUninitialized ) { - std::map>& pageRefsMap = Schematic().GetPageRefsMap(); - - pageRefsMap.clear(); - - SCH_SCREENS screens( Schematic().Root() ); - std::vector virtualPageNumbers; - - /* Iterate over screens */ - for( SCH_SCREEN* screen = screens.GetFirst(); screen != nullptr; screen = screens.GetNext() ) - { - virtualPageNumbers.clear(); - - /* Find in which sheets this screen is used */ - for( const SCH_SHEET_PATH& sheet : Schematic().GetSheets() ) - { - if( sheet.LastScreen() == screen ) - virtualPageNumbers.push_back( sheet.GetVirtualPageNumber() ); - } - - for( SCH_ITEM* item : screen->Items() ) - { - if( item->Type() == SCH_GLOBAL_LABEL_T ) - { - SCH_GLOBALLABEL* globalLabel = static_cast( item ); - std::set& virtualpageList = pageRefsMap[ globalLabel->GetText() ]; - - for( const int& pageNo : virtualPageNumbers ) - virtualpageList.insert( pageNo ); - } - } - } - - bool show = Schematic().Settings().m_IntersheetRefsShow; - - // Refresh all global labels. Note that we have to collect them first as the - // SCH_SCREEN::Update() call is going to invalidate the RTree iterator. - - std::vector globalLabels; - - for( EDA_ITEM* item : GetScreen()->Items().OfType( SCH_GLOBAL_LABEL_T ) ) - globalLabels.push_back( static_cast( item ) ); - - for( SCH_GLOBALLABEL* globalLabel : globalLabels ) - { - std::vector& fields = globalLabel->GetFields(); - - fields[0].SetVisible( show ); - - if( show ) - { - if( fields.size() == 1 && fields[0].GetTextPos() == globalLabel->GetPosition() ) - globalLabel->AutoplaceFields( GetScreen(), false ); - - GetScreen()->Update( globalLabel ); - GetCanvas()->GetView()->Update( globalLabel ); - } - } + Schematic().RecomputeIntersheetRefs( autoplaceUninitialized, + [&]( SCH_GLOBALLABEL* label ) + { + GetCanvas()->GetView()->Update( label ); + }); } diff --git a/eeschema/schematic.cpp b/eeschema/schematic.cpp index 8c8f96ba53..7e54126f6e 100644 --- a/eeschema/schematic.cpp +++ b/eeschema/schematic.cpp @@ -27,7 +27,7 @@ #include #include #include - +#include SCHEMATIC::SCHEMATIC( PROJECT* aPrj ) : EDA_ITEM( nullptr, SCHEMATIC_T ), @@ -496,4 +496,66 @@ void SCHEMATIC::SetSheetNumberAndCount() CurrentSheet().SetVirtualPageNumber( sheet_number ); CurrentSheet().LastScreen()->SetVirtualPageNumber( sheet_number ); CurrentSheet().LastScreen()->SetPageNumber( CurrentSheet().GetPageNumber() ); +} + + +void SCHEMATIC::RecomputeIntersheetRefs( bool autoplaceUninitialized, const std::function& aItemCallback ) +{ + std::map>& pageRefsMap = GetPageRefsMap(); + + pageRefsMap.clear(); + + SCH_SCREENS screens( Root() ); + std::vector virtualPageNumbers; + + /* Iterate over screens */ + for( SCH_SCREEN* screen = screens.GetFirst(); screen != nullptr; screen = screens.GetNext() ) + { + virtualPageNumbers.clear(); + + /* Find in which sheets this screen is used */ + for( const SCH_SHEET_PATH& sheet : GetSheets() ) + { + if( sheet.LastScreen() == screen ) + virtualPageNumbers.push_back( sheet.GetVirtualPageNumber() ); + } + + for( SCH_ITEM* item : screen->Items() ) + { + if( item->Type() == SCH_GLOBAL_LABEL_T ) + { + SCH_GLOBALLABEL* globalLabel = static_cast( item ); + std::set& virtualpageList = pageRefsMap[globalLabel->GetText()]; + + for( const int& pageNo : virtualPageNumbers ) + virtualpageList.insert( pageNo ); + } + } + } + + bool show = Settings().m_IntersheetRefsShow; + + // Refresh all global labels. Note that we have to collect them first as the + // SCH_SCREEN::Update() call is going to invalidate the RTree iterator. + + std::vector globalLabels; + + for( EDA_ITEM* item : CurrentSheet().LastScreen()->Items().OfType( SCH_GLOBAL_LABEL_T ) ) + globalLabels.push_back( static_cast( item ) ); + + for( SCH_GLOBALLABEL* globalLabel : globalLabels ) + { + std::vector& fields = globalLabel->GetFields(); + + fields[0].SetVisible( show ); + + if( show ) + { + if( fields.size() == 1 && fields[0].GetTextPos() == globalLabel->GetPosition() ) + globalLabel->AutoplaceFields( CurrentSheet().LastScreen(), false ); + + CurrentSheet().LastScreen()->Update( globalLabel ); + aItemCallback( globalLabel ); + } + } } \ No newline at end of file diff --git a/eeschema/schematic.h b/eeschema/schematic.h index 97d8a5441f..120a5bb8f5 100644 --- a/eeschema/schematic.h +++ b/eeschema/schematic.h @@ -33,6 +33,7 @@ class PROJECT; class SCH_SCREEN; class SCH_SHEET; class SCH_SHEET_LIST; +class SCH_GLOBALLABEL; class SCHEMATIC_IFACE @@ -195,6 +196,13 @@ public: */ void SetSheetNumberAndCount(); + /** + * Update the schematic's page reference map for all global labels, and refresh the labels + * so that they are redrawn with up-to-date references. + */ + void RecomputeIntersheetRefs( bool autoplaceUninitialized, + const std::function& aItemCallback ); + #if defined(DEBUG) void Show( int nestLevel, std::ostream& os ) const override {} #endif