Stuff RecomputeIntersheetRefs into SCHEMATIC for reuse

This commit is contained in:
Marek Roszko 2022-11-03 00:12:53 -04:00
parent 0190606886
commit 55ca6145ea
4 changed files with 80 additions and 58 deletions

View File

@ -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;

View File

@ -1494,63 +1494,11 @@ void SCH_EDIT_FRAME::RecalculateConnections( SCH_CLEANUP_FLAGS aCleanupFlags )
void SCH_EDIT_FRAME::RecomputeIntersheetRefs( bool autoplaceUninitialized )
{
std::map<wxString, std::set<int>>& pageRefsMap = Schematic().GetPageRefsMap();
pageRefsMap.clear();
SCH_SCREENS screens( Schematic().Root() );
std::vector<int> 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<SCH_GLOBALLABEL*>( item );
std::set<int>& 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<SCH_GLOBALLABEL*> globalLabels;
for( EDA_ITEM* item : GetScreen()->Items().OfType( SCH_GLOBAL_LABEL_T ) )
globalLabels.push_back( static_cast<SCH_GLOBALLABEL*>( item ) );
for( SCH_GLOBALLABEL* globalLabel : globalLabels )
{
std::vector<SCH_FIELD>& 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 );
});
}

View File

@ -27,7 +27,7 @@
#include <schematic.h>
#include <sch_screen.h>
#include <sim/spice_settings.h>
#include <sch_label.h>
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<void( SCH_GLOBALLABEL* )>& aItemCallback )
{
std::map<wxString, std::set<int>>& pageRefsMap = GetPageRefsMap();
pageRefsMap.clear();
SCH_SCREENS screens( Root() );
std::vector<int> 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<SCH_GLOBALLABEL*>( item );
std::set<int>& 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<SCH_GLOBALLABEL*> globalLabels;
for( EDA_ITEM* item : CurrentSheet().LastScreen()->Items().OfType( SCH_GLOBAL_LABEL_T ) )
globalLabels.push_back( static_cast<SCH_GLOBALLABEL*>( item ) );
for( SCH_GLOBALLABEL* globalLabel : globalLabels )
{
std::vector<SCH_FIELD>& 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 );
}
}
}

View File

@ -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<void( SCH_GLOBALLABEL* )>& aItemCallback );
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const override {}
#endif