Move Eeschema globals to new SCHEMATIC object

Set up a new lineage for SCH_ITEMS to get back to the SCHEMATIC
they live on: Items will all be parented to the SCH_SCREEN that
they are added to, and each SCH_SCREEN will point back to the
SCHEMATIC that it is part of.  Note that this hierarchy is not
the same as the actual schematic hierarchy, which continues to
be managed through SCH_SHEETs and SCH_SHEET_PATHS.
This commit is contained in:
Jon Evans 2020-05-12 22:00:37 -04:00
parent c7da63151c
commit d7bd4c9b04
99 changed files with 1361 additions and 930 deletions

View File

@ -43,7 +43,9 @@
#ifdef EESCHEMA #ifdef EESCHEMA
#include <general.h> #include <general.h>
#include <sch_edit_frame.h>
#include <sch_screen.h> #include <sch_screen.h>
#include <schematic.h>
#include <eeschema_settings.h> #include <eeschema_settings.h>
#endif #endif
@ -611,8 +613,11 @@ bool DIALOG_PAGES_SETTINGS::SavePageSettings()
#ifdef EESCHEMA #ifdef EESCHEMA
wxCHECK_MSG( dynamic_cast<SCH_EDIT_FRAME*>( m_parent ), true,
"DIALOG_PAGES_SETTINGS::OnDateApplyClick frame is not a schematic frame!" );
// Exports settings to other sheets if requested: // Exports settings to other sheets if requested:
SCH_SCREENS ScreenList; SCH_SCREENS ScreenList( dynamic_cast<SCH_EDIT_FRAME*>( m_parent )->Schematic().Root() );
// Update page info and/or title blocks for all screens // Update page info and/or title blocks for all screens
for( SCH_SCREEN* screen = ScreenList.GetFirst(); screen; screen = ScreenList.GetNext() ) for( SCH_SCREEN* screen = ScreenList.GetFirst(); screen; screen = ScreenList.GetNext() )

View File

@ -216,6 +216,7 @@ set( EESCHEMA_SRCS
sch_sheet_pin.cpp sch_sheet_pin.cpp
sch_text.cpp sch_text.cpp
sch_validators.cpp sch_validators.cpp
schematic.cpp
schematic_undo_redo.cpp schematic_undo_redo.cpp
sch_edit_frame.cpp sch_edit_frame.cpp
sheet.cpp sheet.cpp

View File

@ -28,17 +28,17 @@
#include <confirm.h> #include <confirm.h>
#include <reporter.h> #include <reporter.h>
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <schematic.h>
#include <sch_reference_list.h> #include <sch_reference_list.h>
#include <class_library.h> #include <class_library.h>
void mapExistingAnnotation( std::map<wxString, wxString>& aMap ) void SCH_EDIT_FRAME::mapExistingAnnotation( std::map<wxString, wxString>& aMap )
{ {
SCH_SHEET_LIST sheets( g_RootSheet );
SCH_REFERENCE_LIST references; SCH_REFERENCE_LIST references;
sheets.GetComponents( references ); Schematic().GetSheets().GetComponents( references );
for( size_t i = 0; i < references.GetCount(); i++ ) for( size_t i = 0; i < references.GetCount(); i++ )
{ {
@ -64,16 +64,16 @@ void SCH_EDIT_FRAME::DeleteAnnotation( bool aCurrentSheetOnly )
{ {
SCH_SCREEN* screen = GetScreen(); SCH_SCREEN* screen = GetScreen();
wxCHECK_RET( screen != NULL, wxT( "Attempt to clear annotation of a NULL screen." ) ); wxCHECK_RET( screen != NULL, wxT( "Attempt to clear annotation of a NULL screen." ) );
screen->ClearAnnotation( g_CurrentSheet ); screen->ClearAnnotation( &GetCurrentSheet() );
} }
else else
{ {
SCH_SCREENS ScreenList; SCH_SCREENS ScreenList( Schematic().Root() );
ScreenList.ClearAnnotation(); ScreenList.ClearAnnotation();
} }
// Update the references for the sheet that is currently being displayed. // Update the references for the sheet that is currently being displayed.
g_CurrentSheet->UpdateAllScreenReferences(); GetCurrentSheet().UpdateAllScreenReferences();
SyncView(); SyncView();
GetCanvas()->Refresh(); GetCanvas()->Refresh();
@ -92,10 +92,10 @@ void SCH_EDIT_FRAME::AnnotateComponents( bool aAnnotateSchematic,
{ {
SCH_REFERENCE_LIST references; SCH_REFERENCE_LIST references;
SCH_SCREENS screens; SCH_SCREENS screens( Schematic().Root() );
// Build the sheet list. // Build the sheet list.
SCH_SHEET_LIST sheets( g_RootSheet ); SCH_SHEET_LIST sheets = Schematic().GetSheets();
// Map of locked components // Map of locked components
SCH_MULTI_UNIT_REFERENCE_MAP lockedComponents; SCH_MULTI_UNIT_REFERENCE_MAP lockedComponents;
@ -124,7 +124,7 @@ void SCH_EDIT_FRAME::AnnotateComponents( bool aAnnotateSchematic,
if( aAnnotateSchematic ) if( aAnnotateSchematic )
sheets.GetMultiUnitComponents( lockedComponents ); sheets.GetMultiUnitComponents( lockedComponents );
else else
g_CurrentSheet->GetMultiUnitComponents( lockedComponents ); GetCurrentSheet().GetMultiUnitComponents( lockedComponents );
} }
// Store previous annotations for building info messages // Store previous annotations for building info messages
@ -141,7 +141,7 @@ void SCH_EDIT_FRAME::AnnotateComponents( bool aAnnotateSchematic,
if( aAnnotateSchematic ) if( aAnnotateSchematic )
sheets.GetComponents( references ); sheets.GetComponents( references );
else else
g_CurrentSheet->GetComponents( references ); GetCurrentSheet().GetComponents( references );
// Break full components reference in name (prefix) and number: // Break full components reference in name (prefix) and number:
// example: IC1 become IC, and 1 // example: IC1 become IC, and 1
@ -229,7 +229,7 @@ void SCH_EDIT_FRAME::AnnotateComponents( bool aAnnotateSchematic,
aReporter.ReportTail( _( "Annotation complete." ), RPT_SEVERITY_ACTION ); aReporter.ReportTail( _( "Annotation complete." ), RPT_SEVERITY_ACTION );
// Update on screen references, that can be modified by previous calculations: // Update on screen references, that can be modified by previous calculations:
g_CurrentSheet->UpdateAllScreenReferences(); GetCurrentSheet().UpdateAllScreenReferences();
SetSheetNumberAndCount(); SetSheetNumberAndCount();
SyncView(); SyncView();
@ -240,15 +240,13 @@ void SCH_EDIT_FRAME::AnnotateComponents( bool aAnnotateSchematic,
int SCH_EDIT_FRAME::CheckAnnotate( REPORTER& aReporter, bool aOneSheetOnly ) int SCH_EDIT_FRAME::CheckAnnotate( REPORTER& aReporter, bool aOneSheetOnly )
{ {
// build the screen list
SCH_SHEET_LIST sheetList( g_RootSheet );
SCH_REFERENCE_LIST componentsList; SCH_REFERENCE_LIST componentsList;
// Build the list of components // Build the list of components
if( !aOneSheetOnly ) if( !aOneSheetOnly )
sheetList.GetComponents( componentsList ); Schematic().GetSheets().GetComponents( componentsList );
else else
g_CurrentSheet->GetComponents( componentsList ); GetCurrentSheet().GetComponents( componentsList );
// Empty schematic does not need annotation // Empty schematic does not need annotation
if( componentsList.GetCount() == 0 ) if( componentsList.GetCount() == 0 )

View File

@ -38,6 +38,7 @@
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <sch_text.h> #include <sch_text.h>
#include <schematic.h>
#include <advanced_config.h> #include <advanced_config.h>
#include <connection_graph.h> #include <connection_graph.h>
@ -297,7 +298,10 @@ void CONNECTION_SUBGRAPH::UpdateItemConnections()
SCH_CONNECTION* item_conn = item->Connection( m_sheet ); SCH_CONNECTION* item_conn = item->Connection( m_sheet );
if( !item_conn ) if( !item_conn )
{
item_conn = item->InitializeConnection( m_sheet ); item_conn = item->InitializeConnection( m_sheet );
item_conn->SetGraph( m_graph );
}
if( ( m_driver_connection->IsBus() && item_conn->IsNet() ) || if( ( m_driver_connection->IsBus() && item_conn->IsNet() ) ||
( m_driver_connection->IsNet() && item_conn->IsBus() ) ) ( m_driver_connection->IsNet() && item_conn->IsBus() ) )
@ -432,7 +436,7 @@ void CONNECTION_GRAPH::updateItemConnectivity( SCH_SHEET_PATH aSheet,
for( SCH_SHEET_PIN* pin : static_cast<SCH_SHEET*>( item )->GetPins() ) for( SCH_SHEET_PIN* pin : static_cast<SCH_SHEET*>( item )->GetPins() )
{ {
if( !pin->Connection( aSheet ) ) if( !pin->Connection( aSheet ) )
pin->InitializeConnection( aSheet ); pin->InitializeConnection( aSheet )->SetGraph( this );
pin->ConnectedItems( aSheet ).clear(); pin->ConnectedItems( aSheet ).clear();
pin->Connection( aSheet )->Reset(); pin->Connection( aSheet )->Reset();
@ -454,7 +458,7 @@ void CONNECTION_GRAPH::updateItemConnectivity( SCH_SHEET_PATH aSheet,
for( SCH_PIN* pin : component->GetSchPins( &aSheet ) ) for( SCH_PIN* pin : component->GetSchPins( &aSheet ) )
{ {
pin->InitializeConnection( aSheet ); pin->InitializeConnection( aSheet )->SetGraph( this );
wxPoint pos = pin->GetPosition(); wxPoint pos = pin->GetPosition();
@ -475,6 +479,7 @@ void CONNECTION_GRAPH::updateItemConnectivity( SCH_SHEET_PATH aSheet,
{ {
m_items.insert( item ); m_items.insert( item );
auto conn = item->InitializeConnection( aSheet ); auto conn = item->InitializeConnection( aSheet );
conn->SetGraph( this );
// Set bus/net property here so that the propagation code uses it // Set bus/net property here so that the propagation code uses it
switch( item->Type() ) switch( item->Type() )
@ -636,8 +641,9 @@ void CONNECTION_GRAPH::updateItemConnectivity( SCH_SHEET_PATH aSheet,
void CONNECTION_GRAPH::buildConnectionGraph() void CONNECTION_GRAPH::buildConnectionGraph()
{ {
// Recache all bus aliases for later use // Recache all bus aliases for later use
wxCHECK_RET( m_schematic, "Connection graph cannot be built without schematic pointer" );
SCH_SHEET_LIST all_sheets( g_RootSheet ); SCH_SHEET_LIST all_sheets = m_schematic->GetSheets();
for( unsigned i = 0; i < all_sheets.size(); i++ ) for( unsigned i = 0; i < all_sheets.size(); i++ )
{ {
@ -656,7 +662,7 @@ void CONNECTION_GRAPH::buildConnectionGraph()
if( connection->SubgraphCode() == 0 ) if( connection->SubgraphCode() == 0 )
{ {
auto subgraph = new CONNECTION_SUBGRAPH( m_frame ); auto subgraph = new CONNECTION_SUBGRAPH( this );
subgraph->m_code = m_last_subgraph_code++; subgraph->m_code = m_last_subgraph_code++;
subgraph->m_sheet = sheet; subgraph->m_sheet = sheet;
@ -667,12 +673,16 @@ void CONNECTION_GRAPH::buildConnectionGraph()
std::list<SCH_ITEM*> members; std::list<SCH_ITEM*> members;
auto get_items = [ &sheet ] ( SCH_ITEM* aItem ) -> bool auto get_items =
[&]( SCH_ITEM* aItem ) -> bool
{ {
auto* conn = aItem->Connection( sheet ); auto* conn = aItem->Connection( sheet );
if( !conn ) if( !conn )
{
conn = aItem->InitializeConnection( sheet ); conn = aItem->InitializeConnection( sheet );
conn->SetGraph( this );
}
return ( conn->SubgraphCode() == 0 ); return ( conn->SubgraphCode() == 0 );
}; };
@ -916,7 +926,10 @@ void CONNECTION_GRAPH::buildConnectionGraph()
SCH_CONNECTION* connection = pin->Connection( sheet ); SCH_CONNECTION* connection = pin->Connection( sheet );
if( !connection ) if( !connection )
{
connection = pin->InitializeConnection( sheet ); connection = pin->InitializeConnection( sheet );
connection->SetGraph( this );
}
// If this pin already has a subgraph, don't need to process // If this pin already has a subgraph, don't need to process
if( connection->SubgraphCode() > 0 ) if( connection->SubgraphCode() > 0 )
@ -937,7 +950,7 @@ void CONNECTION_GRAPH::buildConnectionGraph()
} }
else else
{ {
subgraph = new CONNECTION_SUBGRAPH( m_frame ); subgraph = new CONNECTION_SUBGRAPH( this );
subgraph->m_code = m_last_subgraph_code++; subgraph->m_code = m_last_subgraph_code++;
subgraph->m_sheet = sheet; subgraph->m_sheet = sheet;
@ -1920,6 +1933,10 @@ int CONNECTION_GRAPH::RunERC()
{ {
int error_count = 0; int error_count = 0;
wxCHECK_MSG( m_schematic, true, "Null m_schematic in CONNECTION_GRAPH::ercCheckLabels" );
ERC_SETTINGS* settings = m_schematic->ErcSettings();
for( auto&& subgraph : m_subgraphs ) for( auto&& subgraph : m_subgraphs )
{ {
// Graph is supposed to be up-to-date before calling RunERC() // Graph is supposed to be up-to-date before calling RunERC()
@ -1936,18 +1953,18 @@ int CONNECTION_GRAPH::RunERC()
* format due to their TestDanglingEnds() implementation. * format due to their TestDanglingEnds() implementation.
*/ */
if( g_ErcSettings->IsTestEnabled( ERCE_DRIVER_CONFLICT ) && !subgraph->ResolveDrivers() ) if( settings->IsTestEnabled( ERCE_DRIVER_CONFLICT ) && !subgraph->ResolveDrivers() )
error_count++; error_count++;
if( g_ErcSettings->IsTestEnabled( ERCE_BUS_TO_NET_CONFLICT ) if( settings->IsTestEnabled( ERCE_BUS_TO_NET_CONFLICT )
&& !ercCheckBusToNetConflicts( subgraph ) ) && !ercCheckBusToNetConflicts( subgraph ) )
error_count++; error_count++;
if( g_ErcSettings->IsTestEnabled( ERCE_BUS_ENTRY_CONFLICT ) if( settings->IsTestEnabled( ERCE_BUS_ENTRY_CONFLICT )
&& !ercCheckBusToBusEntryConflicts( subgraph ) ) && !ercCheckBusToBusEntryConflicts( subgraph ) )
error_count++; error_count++;
if( g_ErcSettings->IsTestEnabled( ERCE_BUS_TO_BUS_CONFLICT ) if( settings->IsTestEnabled( ERCE_BUS_TO_BUS_CONFLICT )
&& !ercCheckBusToBusConflicts( subgraph ) ) && !ercCheckBusToBusConflicts( subgraph ) )
error_count++; error_count++;
@ -1957,8 +1974,8 @@ int CONNECTION_GRAPH::RunERC()
if( !ercCheckNoConnects( subgraph ) ) if( !ercCheckNoConnects( subgraph ) )
error_count++; error_count++;
if( ( g_ErcSettings->IsTestEnabled( ERCE_LABEL_NOT_CONNECTED ) if( ( settings->IsTestEnabled( ERCE_LABEL_NOT_CONNECTED )
|| g_ErcSettings->IsTestEnabled( ERCE_GLOBLABEL ) ) && !ercCheckLabels( subgraph ) ) || settings->IsTestEnabled( ERCE_GLOBLABEL ) ) && !ercCheckLabels( subgraph ) )
error_count++; error_count++;
} }
@ -2329,8 +2346,10 @@ bool CONNECTION_GRAPH::ercCheckLabels( const CONNECTION_SUBGRAPH* aSubgraph )
bool is_global = text->Type() == SCH_GLOBAL_LABEL_T; bool is_global = text->Type() == SCH_GLOBAL_LABEL_T;
wxCHECK_MSG( m_schematic, true, "Null m_schematic in CONNECTION_GRAPH::ercCheckLabels" );
// Global label check can be disabled independently // Global label check can be disabled independently
if( !g_ErcSettings->IsTestEnabled( ERCE_GLOBLABEL ) && is_global ) if( !m_schematic->ErcSettings()->IsTestEnabled( ERCE_GLOBLABEL ) && is_global )
return true; return true;
wxString name = text->GetShownText(); wxString name = text->GetShownText();

View File

@ -36,6 +36,8 @@
#endif #endif
class CONNECTION_GRAPH;
class SCHEMATIC;
class SCH_EDIT_FRAME; class SCH_EDIT_FRAME;
class SCH_HIERLABEL; class SCH_HIERLABEL;
class SCH_PIN; class SCH_PIN;
@ -70,11 +72,20 @@ public:
GLOBAL GLOBAL
}; };
explicit CONNECTION_SUBGRAPH( SCH_EDIT_FRAME* aFrame ) : explicit CONNECTION_SUBGRAPH( CONNECTION_GRAPH* aGraph ) :
m_dirty( false ), m_absorbed( false ), m_absorbed_by( nullptr ), m_code( -1 ), m_graph( aGraph ),
m_multiple_drivers( false ), m_strong_driver( false ), m_local_driver( false ), m_dirty( false ),
m_no_connect( nullptr ), m_bus_entry( nullptr ), m_driver( nullptr ), m_frame( aFrame ), m_absorbed( false ),
m_driver_connection( nullptr ), m_hier_parent( nullptr ) m_absorbed_by( nullptr ),
m_code( -1 ),
m_multiple_drivers( false ),
m_strong_driver( false ),
m_local_driver( false ),
m_no_connect( nullptr ),
m_bus_entry( nullptr ),
m_driver( nullptr ),
m_driver_connection( nullptr ),
m_hier_parent( nullptr )
{} {}
~CONNECTION_SUBGRAPH() = default; ~CONNECTION_SUBGRAPH() = default;
@ -126,6 +137,8 @@ public:
*/ */
static PRIORITY GetDriverPriority( SCH_ITEM* aDriver ); static PRIORITY GetDriverPriority( SCH_ITEM* aDriver );
CONNECTION_GRAPH* m_graph;
bool m_dirty; bool m_dirty;
/// True if this subgraph has been absorbed into another. No pointers here are safe if so! /// True if this subgraph has been absorbed into another. No pointers here are safe if so!
@ -163,9 +176,6 @@ public:
SCH_SHEET_PATH m_sheet; SCH_SHEET_PATH m_sheet;
// Needed for m_userUnits for now; maybe refactor later
SCH_EDIT_FRAME* m_frame;
/// Cache for driver connection /// Cache for driver connection
SCH_CONNECTION* m_driver_connection; SCH_CONNECTION* m_driver_connection;
@ -210,11 +220,11 @@ typedef std::map<NET_NAME_CODE, std::vector<CONNECTION_SUBGRAPH*>> NET_MAP;
class CONNECTION_GRAPH class CONNECTION_GRAPH
{ {
public: public:
CONNECTION_GRAPH( SCH_EDIT_FRAME* aFrame ) CONNECTION_GRAPH( SCHEMATIC* aSchematic = nullptr ) :
: m_last_net_code( 1 ), m_last_net_code( 1 ),
m_last_bus_code( 1 ), m_last_bus_code( 1 ),
m_last_subgraph_code( 1 ), m_last_subgraph_code( 1 ),
m_frame( aFrame ) m_schematic( aSchematic )
{} {}
~CONNECTION_GRAPH() ~CONNECTION_GRAPH()
@ -224,6 +234,11 @@ public:
void Reset(); void Reset();
void SetSchematic( SCHEMATIC* aSchematic )
{
m_schematic = aSchematic;
}
/** /**
* Updates the connection graph for the given list of sheets. * Updates the connection graph for the given list of sheets.
* *
@ -301,10 +316,7 @@ private:
int m_last_subgraph_code; int m_last_subgraph_code;
std::mutex m_item_mutex; SCHEMATIC* m_schematic; ///< The schematic this graph represents
// Needed for m_userUnits for now; maybe refactor later
SCH_EDIT_FRAME* m_frame;
/** /**
* Updates the graphical connectivity between items (i.e. where they touch) * Updates the graphical connectivity between items (i.e. where they touch)

View File

@ -36,6 +36,7 @@
#include <sch_component.h> #include <sch_component.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_view.h> #include <sch_view.h>
#include <schematic.h>
#include <reporter.h> #include <reporter.h>
#include <netlist_exporters/netlist_exporter_kicad.h> #include <netlist_exporters/netlist_exporter_kicad.h>
#include <tools/ee_actions.h> #include <tools/ee_actions.h>
@ -48,16 +49,16 @@ SCH_ITEM* SCH_EDITOR_CONTROL::FindComponentAndItem( const wxString& aReference,
const wxString& aSearchText ) const wxString& aSearchText )
{ {
SCH_SHEET_PATH* sheetWithComponentFound = NULL; SCH_SHEET_PATH* sheetWithComponentFound = NULL;
SCH_COMPONENT* Component = NULL; SCH_COMPONENT* component = NULL;
wxPoint pos; wxPoint pos;
LIB_PIN* pin = nullptr; LIB_PIN* pin = nullptr;
SCH_SHEET_LIST sheetList( g_RootSheet ); SCH_SHEET_LIST sheetList;
SCH_ITEM* foundItem = nullptr; SCH_ITEM* foundItem = nullptr;
if( !aSearchHierarchy ) if( !aSearchHierarchy )
sheetList.push_back( *g_CurrentSheet ); sheetList.push_back( m_frame->GetCurrentSheet() );
else else
sheetList.BuildSheetList( g_RootSheet ); sheetList.BuildSheetList( &m_frame->Schematic().Root() );
for( SCH_SHEET_PATH& sheet : sheetList ) for( SCH_SHEET_PATH& sheet : sheetList )
{ {
@ -69,7 +70,7 @@ SCH_ITEM* SCH_EDITOR_CONTROL::FindComponentAndItem( const wxString& aReference,
if( aReference.CmpNoCase( pSch->GetRef( &sheet ) ) == 0 ) if( aReference.CmpNoCase( pSch->GetRef( &sheet ) ) == 0 )
{ {
Component = pSch; component = pSch;
sheetWithComponentFound = &sheet; sheetWithComponentFound = &sheet;
if( aSearchType == HIGHLIGHT_PIN ) if( aSearchType == HIGHLIGHT_PIN )
@ -80,14 +81,14 @@ SCH_ITEM* SCH_EDITOR_CONTROL::FindComponentAndItem( const wxString& aReference,
if( pin ) if( pin )
{ {
pos += pin->GetPosition(); pos += pin->GetPosition();
foundItem = Component; foundItem = component;
break; break;
} }
} }
else else
{ {
pos = pSch->GetPosition(); pos = pSch->GetPosition();
foundItem = Component; foundItem = component;
break; break;
} }
} }
@ -97,19 +98,19 @@ SCH_ITEM* SCH_EDITOR_CONTROL::FindComponentAndItem( const wxString& aReference,
break; break;
} }
if( Component ) if( component )
{ {
if( *sheetWithComponentFound != *g_CurrentSheet ) if( *sheetWithComponentFound != m_frame->GetCurrentSheet() )
{ {
sheetWithComponentFound->LastScreen()->SetZoom( m_frame->GetScreen()->GetZoom() ); sheetWithComponentFound->LastScreen()->SetZoom( m_frame->GetScreen()->GetZoom() );
*g_CurrentSheet = *sheetWithComponentFound; m_frame->Schematic().SetCurrentSheet( *sheetWithComponentFound );
m_frame->DisplayCurrentSheet(); m_frame->DisplayCurrentSheet();
} }
wxPoint delta; wxPoint delta;
pos -= Component->GetPosition(); pos -= component->GetPosition();
delta = Component->GetTransform().TransformCoordinate( pos ); delta = component->GetTransform().TransformCoordinate( pos );
pos = delta + Component->GetPosition(); pos = delta + component->GetPosition();
m_frame->GetCanvas()->GetViewControls()->SetCrossHairCursorPosition( pos, false ); m_frame->GetCanvas()->GetViewControls()->SetCrossHairCursorPosition( pos, false );
m_frame->CenterScreen( pos, false ); m_frame->CenterScreen( pos, false );
@ -124,7 +125,7 @@ SCH_ITEM* SCH_EDITOR_CONTROL::FindComponentAndItem( const wxString& aReference,
else else
msg_item = _( "component" ); msg_item = _( "component" );
if( Component ) if( component )
{ {
if( foundItem ) if( foundItem )
msg.Printf( _( "%s %s found" ), aReference, msg_item ); msg.Printf( _( "%s %s found" ), aReference, msg_item );
@ -390,8 +391,7 @@ void SCH_EDIT_FRAME::KiwayMailIn( KIWAY_EXPRESS& mail )
case MAIL_SCH_GET_NETLIST: case MAIL_SCH_GET_NETLIST:
if( payload.find( "quiet-annotate" ) != std::string::npos ) if( payload.find( "quiet-annotate" ) != std::string::npos )
{ {
SCH_SHEET_LIST sheets( g_RootSheet ); Schematic().GetSheets().AnnotatePowerSymbols();
sheets.AnnotatePowerSymbols();
AnnotateComponents( true, UNSORTED, INCREMENTAL_BY_REF, 0, false, false, true, AnnotateComponents( true, UNSORTED, INCREMENTAL_BY_REF, 0, false, false, true,
NULL_REPORTER::GetInstance() ); NULL_REPORTER::GetInstance() );
} }
@ -405,7 +405,8 @@ void SCH_EDIT_FRAME::KiwayMailIn( KIWAY_EXPRESS& mail )
{ {
NETLIST_OBJECT_LIST* net_atoms = BuildNetListBase(); NETLIST_OBJECT_LIST* net_atoms = BuildNetListBase();
NETLIST_EXPORTER_KICAD exporter( this, net_atoms, g_ConnectionGraph ); NETLIST_EXPORTER_KICAD exporter(
this, net_atoms, &Schematic(), Schematic().ConnectionGraph() );
STRING_FORMATTER formatter; STRING_FORMATTER formatter;
exporter.Format( &formatter, GNL_ALL ); exporter.Format( &formatter, GNL_ALL );
@ -428,7 +429,7 @@ void SCH_EDIT_FRAME::KiwayMailIn( KIWAY_EXPRESS& mail )
case MAIL_SCH_REFRESH: case MAIL_SCH_REFRESH:
{ {
SCH_SCREENS schematic; SCH_SCREENS schematic( Schematic().Root() );
schematic.TestDanglingEnds(); schematic.TestDanglingEnds();
GetCanvas()->GetView()->UpdateAllItems( KIGFX::ALL ); GetCanvas()->GetView()->UpdateAllItems( KIGFX::ALL );

View File

@ -44,6 +44,7 @@
#include <pgm_base.h> #include <pgm_base.h>
#include <reporter.h> #include <reporter.h>
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <schematic.h>
#include <dialogs/dialog_bom_cfg_lexer.h> #include <dialogs/dialog_bom_cfg_lexer.h>
@ -456,7 +457,7 @@ void DIALOG_BOM::pluginInit()
void DIALOG_BOM::OnRunGenerator( wxCommandEvent& event ) void DIALOG_BOM::OnRunGenerator( wxCommandEvent& event )
{ {
// Calculate the xml netlist filename // Calculate the xml netlist filename
wxFileName fn = g_RootSheet->GetScreen()->GetFileName(); wxFileName fn = m_parent->Schematic().GetFileName();
fn.SetPath( wxPathOnly( Prj().GetProjectFullName() ) ); fn.SetPath( wxPathOnly( Prj().GetProjectFullName() ) );
fn.ClearExt(); fn.ClearExt();

View File

@ -22,6 +22,7 @@
#include <invoke_sch_dialog.h> #include <invoke_sch_dialog.h>
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <schematic.h>
#include "dialog_bus_manager.h" #include "dialog_bus_manager.h"
@ -192,13 +193,14 @@ bool DIALOG_BUS_MANAGER::TransferDataToWindow()
{ {
m_aliases.clear(); m_aliases.clear();
SCH_SHEET_LIST aSheets( g_RootSheet ); const SCH_SHEET_LIST& sheets = m_parent->Schematic().GetSheets();
std::vector< std::shared_ptr< BUS_ALIAS > > original_aliases; std::vector< std::shared_ptr< BUS_ALIAS > > original_aliases;
// collect aliases from each open sheet // collect aliases from each open sheet
for( unsigned i = 0; i < aSheets.size(); i++ ) for( unsigned i = 0; i < sheets.size(); i++ )
{ {
auto sheet_aliases = aSheets[i].LastScreen()->GetBusAliases(); auto sheet_aliases = sheets[i].LastScreen()->GetBusAliases();
original_aliases.insert( original_aliases.end(), sheet_aliases.begin(), original_aliases.insert( original_aliases.end(), sheet_aliases.begin(),
sheet_aliases.end() ); sheet_aliases.end() );
} }

View File

@ -34,6 +34,7 @@
#include <sch_draw_panel.h> #include <sch_draw_panel.h>
#include <sch_component.h> #include <sch_component.h>
#include <sch_reference_list.h> #include <sch_reference_list.h>
#include <schematic.h>
#include <pgm_base.h> #include <pgm_base.h>
#include <symbol_lib_table.h> #include <symbol_lib_table.h>
#include <trace_helpers.h> #include <trace_helpers.h>
@ -423,7 +424,7 @@ void DIALOG_EDIT_COMPONENTS_LIBID::initDlg()
// In complex hierarchies, the same component is in fact duplicated, but // In complex hierarchies, the same component is in fact duplicated, but
// it is listed with different references (one by sheet instance) // it is listed with different references (one by sheet instance)
// the list is larger and looks like it contains all components // the list is larger and looks like it contains all components
SCH_SHEET_LIST sheets( g_RootSheet ); const SCH_SHEET_LIST& sheets = GetParent()->Schematic().GetSheets();
SCH_REFERENCE_LIST references; SCH_REFERENCE_LIST references;
// build the full list of components including component having no symbol in loaded libs // build the full list of components including component having no symbol in loaded libs
// (orphan components) // (orphan components)

View File

@ -34,6 +34,7 @@
#include <sch_text.h> #include <sch_text.h>
#include <sch_component.h> #include <sch_component.h>
#include <sch_reference_list.h> #include <sch_reference_list.h>
#include <schematic.h>
#include <widgets/unit_binder.h> #include <widgets/unit_binder.h>
#include <dialog_edit_label_base.h> #include <dialog_edit_label_base.h>
#include <kicad_string.h> #include <kicad_string.h>
@ -79,6 +80,10 @@ private:
bool TransferDataToWindow() override; bool TransferDataToWindow() override;
bool TransferDataFromWindow() override; bool TransferDataFromWindow() override;
wxString convertKIIDsToReferences( const wxString& aSource ) const;
wxString convertReferencesToKIIDs( const wxString& aSource ) const;
SCH_EDIT_FRAME* m_Parent; SCH_EDIT_FRAME* m_Parent;
SCH_TEXT* m_CurrentText; SCH_TEXT* m_CurrentText;
wxWindow* m_activeTextCtrl; wxWindow* m_activeTextCtrl;
@ -204,7 +209,7 @@ DIALOG_LABEL_EDITOR::~DIALOG_LABEL_EDITOR()
} }
wxString convertKIIDsToReferences( const wxString& aSource ) wxString DIALOG_LABEL_EDITOR::convertKIIDsToReferences( const wxString& aSource ) const
{ {
wxString newbuf; wxString newbuf;
size_t sourceLen = aSource.length(); size_t sourceLen = aSource.length();
@ -229,7 +234,7 @@ wxString convertKIIDsToReferences( const wxString& aSource )
if( isCrossRef ) if( isCrossRef )
{ {
SCH_SHEET_LIST sheetList( g_RootSheet ); SCH_SHEET_LIST sheetList = m_Parent->Schematic().GetSheets();
wxString remainder; wxString remainder;
wxString ref = token.BeforeFirst( ':', &remainder ); wxString ref = token.BeforeFirst( ':', &remainder );
@ -255,7 +260,7 @@ wxString convertKIIDsToReferences( const wxString& aSource )
} }
wxString convertReferencesToKIIDs( const wxString& aSource ) wxString DIALOG_LABEL_EDITOR::convertReferencesToKIIDs( const wxString& aSource ) const
{ {
wxString newbuf; wxString newbuf;
size_t sourceLen = aSource.length(); size_t sourceLen = aSource.length();
@ -280,7 +285,7 @@ wxString convertReferencesToKIIDs( const wxString& aSource )
if( isCrossRef ) if( isCrossRef )
{ {
SCH_SHEET_LIST sheets( g_RootSheet ); SCH_SHEET_LIST sheets = m_Parent->Schematic().GetSheets();
wxString remainder; wxString remainder;
wxString ref = token.BeforeFirst( ':', &remainder ); wxString ref = token.BeforeFirst( ':', &remainder );
SCH_REFERENCE_LIST references; SCH_REFERENCE_LIST references;
@ -335,7 +340,7 @@ bool DIALOG_LABEL_EDITOR::TransferDataToWindow()
{ {
// Load the combobox with the existing labels of the same type // Load the combobox with the existing labels of the same type
std::set<wxString> existingLabels; std::set<wxString> existingLabels;
SCH_SCREENS allScreens; SCH_SCREENS allScreens( m_Parent->Schematic().Root() );
for( SCH_SCREEN* screen = allScreens.GetFirst(); screen; screen = allScreens.GetNext() ) for( SCH_SCREEN* screen = allScreens.GetFirst(); screen; screen = allScreens.GetNext() )
{ {

View File

@ -28,6 +28,7 @@
#include <pgm_base.h> #include <pgm_base.h>
#include <sch_screen.h> #include <sch_screen.h>
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <schematic.h>
#include <invoke_sch_dialog.h> #include <invoke_sch_dialog.h>
#include <project.h> #include <project.h>
#include <kiface_i.h> #include <kiface_i.h>
@ -57,7 +58,7 @@ DIALOG_ERC::DIALOG_ERC( SCH_EDIT_FRAME* parent ) :
EESCHEMA_SETTINGS* settings = dynamic_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() ); EESCHEMA_SETTINGS* settings = dynamic_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
m_severities = settings->m_Appearance.erc_severities; m_severities = settings->m_Appearance.erc_severities;
m_markerProvider = new SHEETLIST_ERC_ITEMS_PROVIDER(); m_markerProvider = new SHEETLIST_ERC_ITEMS_PROVIDER( &m_parent->Schematic() );
m_markerTreeModel = new RC_TREE_MODEL( parent, m_markerDataView ); m_markerTreeModel = new RC_TREE_MODEL( parent, m_markerDataView );
m_markerDataView->AssociateModel( m_markerTreeModel ); m_markerDataView->AssociateModel( m_markerTreeModel );
@ -180,9 +181,10 @@ void DIALOG_ERC::TestErc( REPORTER& aReporter )
{ {
wxFileName fn; wxFileName fn;
SCHEMATIC* sch = &m_parent->Schematic();
// Build the whole sheet list in hierarchy (sheet, not screen) // Build the whole sheet list in hierarchy (sheet, not screen)
SCH_SHEET_LIST sheets( g_RootSheet ); sch->GetSheets().AnnotatePowerSymbols();
sheets.AnnotatePowerSymbols();
if( m_parent->CheckAnnotate( aReporter, false ) ) if( m_parent->CheckAnnotate( aReporter, false ) )
{ {
@ -192,31 +194,33 @@ void DIALOG_ERC::TestErc( REPORTER& aReporter )
return; return;
} }
SCH_SCREENS screens; SCH_SCREENS screens( sch->Root() );
ERC_SETTINGS* settings = sch->ErcSettings();
// Test duplicate sheet names inside a given sheet. While one can have multiple references // Test duplicate sheet names inside a given sheet. While one can have multiple references
// to the same file, each must have a unique name. // to the same file, each must have a unique name.
if( g_ErcSettings->IsTestEnabled( ERCE_DUPLICATE_SHEET_NAME ) ) if( settings->IsTestEnabled( ERCE_DUPLICATE_SHEET_NAME ) )
{ {
aReporter.ReportTail( _( "Checking sheet names...\n" ), RPT_SEVERITY_INFO ); aReporter.ReportTail( _( "Checking sheet names...\n" ), RPT_SEVERITY_INFO );
TestDuplicateSheetNames( true ); TestDuplicateSheetNames( sch, true );
} }
if( g_ErcSettings->IsTestEnabled( ERCE_BUS_ALIAS_CONFLICT ) ) if( settings->IsTestEnabled( ERCE_BUS_ALIAS_CONFLICT ) )
{ {
aReporter.ReportTail( _( "Checking bus conflicts...\n" ), RPT_SEVERITY_INFO ); aReporter.ReportTail( _( "Checking bus conflicts...\n" ), RPT_SEVERITY_INFO );
TestConflictingBusAliases(); TestConflictingBusAliases( sch );
} }
// The connection graph has a whole set of ERC checks it can run // The connection graph has a whole set of ERC checks it can run
aReporter.ReportTail( _( "Checking conflicts...\n" ) ); aReporter.ReportTail( _( "Checking conflicts...\n" ) );
m_parent->RecalculateConnections( NO_CLEANUP ); m_parent->RecalculateConnections( NO_CLEANUP );
g_ConnectionGraph->RunERC(); sch->ConnectionGraph()->RunERC();
// Test is all units of each multiunit component have the same footprint assigned. // Test is all units of each multiunit component have the same footprint assigned.
if( g_ErcSettings->IsTestEnabled( ERCE_DIFFERENT_UNIT_FP ) ) if( settings->IsTestEnabled( ERCE_DIFFERENT_UNIT_FP ) )
{ {
aReporter.ReportTail( _( "Checking footprints...\n" ), RPT_SEVERITY_INFO ); aReporter.ReportTail( _( "Checking footprints...\n" ), RPT_SEVERITY_INFO );
SCH_SHEET_LIST sheets = sch->GetSheets();
TestMultiunitFootprints( sheets ); TestMultiunitFootprints( sheets );
} }
@ -273,7 +277,7 @@ void DIALOG_ERC::TestErc( REPORTER& aReporter )
case NETLIST_ITEM::PIN: case NETLIST_ITEM::PIN:
{ {
// Check if this pin has appeared before on a different net // Check if this pin has appeared before on a different net
if( item->m_Link && g_ErcSettings->IsTestEnabled( ERCE_DIFFERENT_UNIT_NET ) ) if( item->m_Link && settings->IsTestEnabled( ERCE_DIFFERENT_UNIT_NET ) )
{ {
wxString ref = item->GetComponentParent()->GetRef( &item->m_SheetPath ); wxString ref = item->GetComponentParent()->GetRef( &item->m_SheetPath );
wxString pin_name = ref + "_" + item->m_PinNum; wxString pin_name = ref + "_" + item->m_PinNum;
@ -312,14 +316,14 @@ void DIALOG_ERC::TestErc( REPORTER& aReporter )
// Test similar labels (i;e. labels which are identical when // Test similar labels (i;e. labels which are identical when
// using case insensitive comparisons) // using case insensitive comparisons)
if( g_ErcSettings->IsTestEnabled( ERCE_SIMILAR_LABELS ) ) if( settings->IsTestEnabled( ERCE_SIMILAR_LABELS ) )
{ {
aReporter.ReportTail( _( "Checking labels...\n" ), RPT_SEVERITY_INFO ); aReporter.ReportTail( _( "Checking labels...\n" ), RPT_SEVERITY_INFO );
objectsConnectedList->TestforSimilarLabels(); objectsConnectedList->TestforSimilarLabels();
} }
if( g_ErcSettings->IsTestEnabled( ERCE_UNRESOLVED_VARIABLE ) ) if( settings->IsTestEnabled( ERCE_UNRESOLVED_VARIABLE ) )
TestTextVars(); TestTextVars( sch );
// Display diags: // Display diags:
m_markerTreeModel->SetProvider( m_markerProvider ); m_markerTreeModel->SetProvider( m_markerProvider );
@ -343,9 +347,8 @@ void DIALOG_ERC::TestErc( REPORTER& aReporter )
void DIALOG_ERC::OnERCItemSelected( wxDataViewEvent& aEvent ) void DIALOG_ERC::OnERCItemSelected( wxDataViewEvent& aEvent )
{ {
const KIID& itemID = RC_TREE_MODEL::ToUUID( aEvent.GetItem() ); const KIID& itemID = RC_TREE_MODEL::ToUUID( aEvent.GetItem() );
SCH_SHEET_LIST sheetList( g_RootSheet );
SCH_SHEET_PATH sheet; SCH_SHEET_PATH sheet;
SCH_ITEM* item = sheetList.GetItem( itemID, &sheet ); SCH_ITEM* item = m_parent->Schematic().GetSheets().GetItem( itemID, &sheet );
if( item ) if( item )
{ {
@ -391,12 +394,14 @@ void DIALOG_ERC::OnERCItemRClick( wxDataViewEvent& aEvent )
if( !node ) if( !node )
return; return;
SCHEMATIC& sch = m_parent->Schematic();
RC_ITEM* rcItem = node->m_RcItem; RC_ITEM* rcItem = node->m_RcItem;
wxString listName; wxString listName;
wxMenu menu; wxMenu menu;
wxString msg; wxString msg;
switch( GetSeverity( rcItem->GetErrorCode() ) ) switch( sch.GetErcSeverity( rcItem->GetErrorCode() ) )
{ {
case RPT_SEVERITY_ERROR: listName = _( "errors" ); break; case RPT_SEVERITY_ERROR: listName = _( "errors" ); break;
case RPT_SEVERITY_WARNING: listName = _( "warnings" ); break; case RPT_SEVERITY_WARNING: listName = _( "warnings" ); break;
@ -421,7 +426,7 @@ void DIALOG_ERC::OnERCItemRClick( wxDataViewEvent& aEvent )
{ {
// Pin to pin severities edited through pin conflict map // Pin to pin severities edited through pin conflict map
} }
else if( GetSeverity( rcItem->GetErrorCode() ) == RPT_SEVERITY_WARNING ) else if( sch.GetErcSeverity( rcItem->GetErrorCode() ) == RPT_SEVERITY_WARNING )
{ {
menu.Append( 4, wxString::Format( _( "Change severity to Error for all '%s' violations" ), menu.Append( 4, wxString::Format( _( "Change severity to Error for all '%s' violations" ),
rcItem->GetErrorText( rcItem->GetErrorCode() ) ), rcItem->GetErrorText( rcItem->GetErrorCode() ) ),
@ -474,7 +479,7 @@ void DIALOG_ERC::OnERCItemRClick( wxDataViewEvent& aEvent )
break; break;
case 4: case 4:
SetSeverity( rcItem->GetErrorCode(), RPT_SEVERITY_ERROR ); sch.SetErcSeverity( rcItem->GetErrorCode(), RPT_SEVERITY_ERROR );
// Rebuild model and view // Rebuild model and view
static_cast<RC_TREE_MODEL*>( aEvent.GetModel() )->SetProvider( m_markerProvider ); static_cast<RC_TREE_MODEL*>( aEvent.GetModel() )->SetProvider( m_markerProvider );
@ -482,7 +487,7 @@ void DIALOG_ERC::OnERCItemRClick( wxDataViewEvent& aEvent )
break; break;
case 5: case 5:
SetSeverity( rcItem->GetErrorCode(), RPT_SEVERITY_WARNING ); sch.SetErcSeverity( rcItem->GetErrorCode(), RPT_SEVERITY_WARNING );
// Rebuild model and view // Rebuild model and view
static_cast<RC_TREE_MODEL*>( aEvent.GetModel() )->SetProvider( m_markerProvider ); static_cast<RC_TREE_MODEL*>( aEvent.GetModel() )->SetProvider( m_markerProvider );
@ -491,12 +496,12 @@ void DIALOG_ERC::OnERCItemRClick( wxDataViewEvent& aEvent )
case 6: case 6:
{ {
SetSeverity( rcItem->GetErrorCode(), RPT_SEVERITY_IGNORE ); sch.SetErcSeverity( rcItem->GetErrorCode(), RPT_SEVERITY_IGNORE );
if( rcItem->GetErrorCode() == ERCE_PIN_TO_PIN_ERROR ) if( rcItem->GetErrorCode() == ERCE_PIN_TO_PIN_ERROR )
SetSeverity( ERCE_PIN_TO_PIN_WARNING, RPT_SEVERITY_IGNORE ); sch.SetErcSeverity( ERCE_PIN_TO_PIN_WARNING, RPT_SEVERITY_IGNORE );
SCH_SCREENS ScreenList; SCH_SCREENS ScreenList( sch.Root() );
ScreenList.DeleteMarkers( MARKER_BASE::MARKER_ERC, rcItem->GetErrorCode() ); ScreenList.DeleteMarkers( MARKER_BASE::MARKER_ERC, rcItem->GetErrorCode() );
// Rebuild model and view // Rebuild model and view
@ -607,7 +612,7 @@ bool DIALOG_ERC::writeReport( const wxString& aFullFileName )
int err_count = 0; int err_count = 0;
int warn_count = 0; int warn_count = 0;
int total_count = 0; int total_count = 0;
SCH_SHEET_LIST sheetList( g_RootSheet ); SCH_SHEET_LIST sheetList = m_parent->Schematic().GetSheets();
sheetList.FillItemMap( itemMap ); sheetList.FillItemMap( itemMap );
@ -624,7 +629,7 @@ bool DIALOG_ERC::writeReport( const wxString& aFullFileName )
total_count++; total_count++;
switch( GetSeverity( marker->GetRCItem()->GetErrorCode() ) ) switch( m_parent->Schematic().GetErcSeverity( marker->GetRCItem()->GetErrorCode() ) )
{ {
case RPT_SEVERITY_ERROR: err_count++; break; case RPT_SEVERITY_ERROR: err_count++; break;
case RPT_SEVERITY_WARNING: warn_count++; break; case RPT_SEVERITY_WARNING: warn_count++; break;

View File

@ -36,6 +36,7 @@
#include <refdes_utils.h> #include <refdes_utils.h>
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <sch_reference_list.h> #include <sch_reference_list.h>
#include <schematic.h>
#include <tools/sch_editor_control.h> #include <tools/sch_editor_control.h>
#include <widgets/grid_text_button_helpers.h> #include <widgets/grid_text_button_helpers.h>
#include <widgets/wx_grid.h> #include <widgets/wx_grid.h>
@ -678,8 +679,7 @@ DIALOG_FIELDS_EDITOR_GLOBAL::DIALOG_FIELDS_EDITOR_GLOBAL( SCH_EDIT_FRAME* parent
wxSize defaultDlgSize = ConvertDialogToPixels( wxSize( 600, 300 ) ); wxSize defaultDlgSize = ConvertDialogToPixels( wxSize( 600, 300 ) );
// Get all components from the list of schematic sheets // Get all components from the list of schematic sheets
SCH_SHEET_LIST sheets( g_RootSheet ); m_parent->Schematic().GetSheets().GetComponents( m_componentRefs, false );
sheets.GetComponents( m_componentRefs, false );
m_bRefresh->SetBitmap( KiBitmap( refresh_xpm ) ); m_bRefresh->SetBitmap( KiBitmap( refresh_xpm ) );

View File

@ -30,6 +30,7 @@
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <sch_line.h> #include <sch_line.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <schematic.h>
#include <advanced_config.h> #include <advanced_config.h>
#include <tool/tool_manager.h> #include <tool/tool_manager.h>
#include <tools/ee_selection_tool.h> #include <tools/ee_selection_tool.h>
@ -179,7 +180,7 @@ bool DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::TransferDataToWindow()
else if( selection.GetSize() ) else if( selection.GetSize() )
{ {
SCH_ITEM* sch_item = (SCH_ITEM*) selection.Front(); SCH_ITEM* sch_item = (SCH_ITEM*) selection.Front();
SCH_CONNECTION* connection = sch_item->Connection( *g_CurrentSheet ); SCH_CONNECTION* connection = sch_item->Connection( m_parent->GetCurrentSheet() );
if( connection ) if( connection )
m_netFilter->SetValue( connection->Name() ); m_netFilter->SetValue( connection->Name() );
@ -430,10 +431,8 @@ bool DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::TransferDataFromWindow()
if( !m_textSize.Validate( Mils2iu( 1 ), Mils2iu( 10000 ) ) ) // 1 mil .. 10 inches if( !m_textSize.Validate( Mils2iu( 1 ), Mils2iu( 10000 ) ) ) // 1 mil .. 10 inches
return false; return false;
SCH_SHEET_LIST aSheets( g_RootSheet );
// Go through sheets // Go through sheets
for( const SCH_SHEET_PATH& sheetPath : aSheets ) for( const SCH_SHEET_PATH& sheetPath : m_parent->Schematic().GetSheets() )
{ {
SCH_SCREEN* screen = sheetPath.LastScreen(); SCH_SCREEN* screen = sheetPath.LastScreen();

View File

@ -19,6 +19,7 @@
*/ */
#include <sch_connection.h> #include <sch_connection.h>
#include <schematic.h>
#include <connection_graph.h> #include <connection_graph.h>
#include <tool/tool_manager.h> #include <tool/tool_manager.h>
#include <tool/actions.h> #include <tool/actions.h>
@ -72,7 +73,7 @@ DIALOG_MIGRATE_BUSES::DIALOG_MIGRATE_BUSES( SCH_EDIT_FRAME* aParent )
void DIALOG_MIGRATE_BUSES::loadGraphData() void DIALOG_MIGRATE_BUSES::loadGraphData()
{ {
m_items.clear(); m_items.clear();
auto subgraphs = g_ConnectionGraph->GetBusesNeedingMigration(); auto subgraphs = m_frame->Schematic().ConnectionGraph()->GetBusesNeedingMigration();
for( auto subgraph : subgraphs ) for( auto subgraph : subgraphs )
{ {
@ -172,11 +173,13 @@ void DIALOG_MIGRATE_BUSES::onItemSelected( wxListEvent& aEvent )
auto sheet = subgraph->m_sheet; auto sheet = subgraph->m_sheet;
auto driver = subgraph->m_driver; auto driver = subgraph->m_driver;
if( sheet != *g_CurrentSheet ) const SCH_SHEET_PATH& current = m_frame->GetCurrentSheet();
if( sheet != current )
{ {
sheet.LastScreen()->SetZoom( m_frame->GetScreen()->GetZoom() ); sheet.LastScreen()->SetZoom( m_frame->GetScreen()->GetZoom() );
*g_CurrentSheet = sheet; sheet.UpdateAllScreenReferences();
g_CurrentSheet->UpdateAllScreenReferences(); m_frame->Schematic().SetCurrentSheet( sheet );
sheet.LastScreen()->TestDanglingEnds(); sheet.LastScreen()->TestDanglingEnds();
} }

View File

@ -45,6 +45,7 @@
#include <invoke_sch_dialog.h> #include <invoke_sch_dialog.h>
#include <netlist_exporters/netlist_exporter_pspice.h> #include <netlist_exporters/netlist_exporter_pspice.h>
#include <eeschema_settings.h> #include <eeschema_settings.h>
#include <schematic.h>
#include <eeschema_id.h> #include <eeschema_id.h>
#include <wx/regex.h> #include <wx/regex.h>
@ -439,7 +440,7 @@ bool NETLIST_DIALOG::TransferDataFromWindow()
unsigned netlist_opt = 0; unsigned netlist_opt = 0;
// Calculate the netlist filename // Calculate the netlist filename
fn = g_RootSheet->GetScreen()->GetFileName(); fn = m_Parent->Schematic().GetFileName();
FilenamePrms( currPage->m_IdNetType, &fileExt, &fileWildcard ); FilenamePrms( currPage->m_IdNetType, &fileExt, &fileWildcard );
// Set some parameters // Set some parameters

View File

@ -29,10 +29,10 @@
#include <eeschema_settings.h> #include <eeschema_settings.h>
#include <kiface_i.h> #include <kiface_i.h>
#include <pgm_base.h> #include <pgm_base.h>
#include <sch_sheet.h>
#include <settings/settings_manager.h> #include <settings/settings_manager.h>
#include <ws_painter.h> #include <ws_painter.h>
#include <sch_painter.h> #include <sch_painter.h>
#include <schematic.h>
// static members (static to remember last state): // static members (static to remember last state):
int DIALOG_PLOT_SCHEMATIC::m_pageSizeSelect = PAGE_SIZE_AUTO; int DIALOG_PLOT_SCHEMATIC::m_pageSizeSelect = PAGE_SIZE_AUTO;
@ -151,7 +151,7 @@ void DIALOG_PLOT_SCHEMATIC::OnOutputDirectoryBrowseClicked( wxCommandEvent& even
wxFileName dirName = wxFileName::DirName( dirDialog.GetPath() ); wxFileName dirName = wxFileName::DirName( dirDialog.GetPath() );
wxFileName fn( Prj().AbsolutePath( g_RootSheet->GetFileName() ) ); wxFileName fn( Prj().AbsolutePath( m_parent->Schematic().Root().GetFileName() ) );
wxString defaultPath = fn.GetPathWithSep(); wxString defaultPath = fn.GetPathWithSep();
wxString msg; wxString msg;
msg.Printf( _( "Do you want to use a path relative to\n\"%s\"" ), GetChars( defaultPath ) ); msg.Printf( _( "Do you want to use a path relative to\n\"%s\"" ), GetChars( defaultPath ) );

View File

@ -33,6 +33,7 @@
#include <settings/color_settings.h> #include <settings/color_settings.h>
#include <settings/settings_manager.h> #include <settings/settings_manager.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <schematic.h>
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <dialog_print_using_printer_base.h> #include <dialog_print_using_printer_base.h>
#include <sch_painter.h> #include <sch_painter.h>
@ -319,10 +320,12 @@ bool DIALOG_PRINT_USING_PRINTER::TransferDataFromWindow()
SavePrintOptions(); SavePrintOptions();
wxPrintDialogData printDialogData( m_parent->GetPageSetupData().GetPrintData() ); int sheet_count = m_parent->Schematic().Root().CountSheets();
printDialogData.SetMaxPage( g_RootSheet->CountSheets() );
if( g_RootSheet->CountSheets() > 1 ) wxPrintDialogData printDialogData( m_parent->GetPageSetupData().GetPrintData() );
printDialogData.SetMaxPage( sheet_count );
if( sheet_count > 1 )
printDialogData.EnablePageNumbers( true ); printDialogData.EnablePageNumbers( true );
wxPrinter printer( &printDialogData ); wxPrinter printer( &printDialogData );
@ -348,7 +351,7 @@ bool DIALOG_PRINT_USING_PRINTER::TransferDataFromWindow()
bool SCH_PRINTOUT::OnPrintPage( int page ) bool SCH_PRINTOUT::OnPrintPage( int page )
{ {
SCH_SHEET_LIST sheetList( g_RootSheet ); SCH_SHEET_LIST sheetList = m_parent->Schematic().GetSheets();
wxCHECK_MSG( page >= 1 && page <= (int)sheetList.size(), false, wxCHECK_MSG( page >= 1 && page <= (int)sheetList.size(), false,
wxT( "Cannot print invalid page number." ) ); wxT( "Cannot print invalid page number." ) );
@ -379,13 +382,13 @@ bool SCH_PRINTOUT::OnPrintPage( int page )
void SCH_PRINTOUT::GetPageInfo( int* minPage, int* maxPage, int* selPageFrom, int* selPageTo ) void SCH_PRINTOUT::GetPageInfo( int* minPage, int* maxPage, int* selPageFrom, int* selPageTo )
{ {
*minPage = *selPageFrom = 1; *minPage = *selPageFrom = 1;
*maxPage = *selPageTo = g_RootSheet->CountSheets(); *maxPage = *selPageTo = m_parent->Schematic().Root().CountSheets();
} }
bool SCH_PRINTOUT::HasPage( int pageNum ) bool SCH_PRINTOUT::HasPage( int pageNum )
{ {
return g_RootSheet->CountSheets() >= pageNum; return m_parent->Schematic().Root().CountSheets() >= pageNum;
} }

View File

@ -25,6 +25,7 @@
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <wildcards_and_files_ext.h> #include <wildcards_and_files_ext.h>
#include <confirm.h> #include <confirm.h>
#include <schematic.h>
#include <dialog_sch_import_settings.h> #include <dialog_sch_import_settings.h>
@ -54,7 +55,7 @@ bool DIALOG_SCH_IMPORT_SETTINGS::TransferDataToWindow()
void DIALOG_SCH_IMPORT_SETTINGS::OnBrowseClicked( wxCommandEvent& event ) void DIALOG_SCH_IMPORT_SETTINGS::OnBrowseClicked( wxCommandEvent& event )
{ {
wxFileName fn = g_RootSheet->GetFileName(); wxFileName fn = m_frame->Schematic().Root().GetFileName();
fn.SetExt( ProjectFileExtension ); fn.SetExt( ProjectFileExtension );
wxFileDialog dlg( this, _( "Import Settings From" ), fn.GetPath(), fn.GetFullName(), wxFileDialog dlg( this, _( "Import Settings From" ), fn.GetPath(), fn.GetFullName(),

View File

@ -32,6 +32,7 @@
#include <widgets/tab_traversal.h> #include <widgets/tab_traversal.h>
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <schematic.h>
#include <bitmaps.h> #include <bitmaps.h>
#include <eeschema_settings.h> #include <eeschema_settings.h>
#include <settings/color_settings.h> #include <settings/color_settings.h>
@ -168,7 +169,7 @@ bool DIALOG_SCH_SHEET_PROPS::TransferDataToWindow()
m_backgroundSwatch->SetSwatchBackground( canvas ); m_backgroundSwatch->SetSwatchBackground( canvas );
// set up the read-only fields // set up the read-only fields
m_heirarchyPath->SetValue( g_CurrentSheet->PathHumanReadable() ); m_heirarchyPath->SetValue( m_frame->GetCurrentSheet().PathHumanReadable() );
m_textCtrlTimeStamp->SetValue( m_sheet->m_Uuid.AsString() ); m_textCtrlTimeStamp->SetValue( m_sheet->m_Uuid.AsString() );
Layout(); Layout();
@ -356,7 +357,7 @@ bool DIALOG_SCH_SHEET_PROPS::onSheetFilenameChanged( const wxString& aNewFilenam
if( !fileName.IsAbsolute() ) if( !fileName.IsAbsolute() )
{ {
const SCH_SCREEN* currentScreen = g_CurrentSheet->LastScreen(); const SCH_SCREEN* currentScreen = m_frame->GetCurrentSheet().LastScreen();
wxCHECK_MSG( currentScreen, false, "Invalid sheet path object." ); wxCHECK_MSG( currentScreen, false, "Invalid sheet path object." );
wxFileName currentSheetFileName = currentScreen->GetFileName(); wxFileName currentSheetFileName = currentScreen->GetFileName();
@ -382,7 +383,7 @@ bool DIALOG_SCH_SHEET_PROPS::onSheetFilenameChanged( const wxString& aNewFilenam
// Search for a schematic file having the same filename already in use in the hierarchy // Search for a schematic file having the same filename already in use in the hierarchy
// or on disk, in order to reuse it. // or on disk, in order to reuse it.
if( !g_RootSheet->SearchHierarchy( newAbsoluteFilename, &useScreen ) ) if( !m_frame->Schematic().Root().SearchHierarchy( newAbsoluteFilename, &useScreen ) )
{ {
loadFromFile = wxFileExists( newAbsoluteFilename ); loadFromFile = wxFileExists( newAbsoluteFilename );
@ -521,6 +522,7 @@ bool DIALOG_SCH_SHEET_PROPS::onSheetFilenameChanged( const wxString& aNewFilenam
} }
wxFileName nativeFileName( aNewFilename ); wxFileName nativeFileName( aNewFilename );
SCH_SHEET_PATH& currentSheet = m_frame->GetCurrentSheet();
if( useScreen ) if( useScreen )
{ {
@ -531,10 +533,10 @@ bool DIALOG_SCH_SHEET_PROPS::onSheetFilenameChanged( const wxString& aNewFilenam
tmpSheet->SetScreen( useScreen ); tmpSheet->SetScreen( useScreen );
// No need to check for valid library IDs if we are using an existing screen. // No need to check for valid library IDs if we are using an existing screen.
if( m_frame->CheckSheetForRecursion( tmpSheet.get(), g_CurrentSheet ) ) if( m_frame->CheckSheetForRecursion( tmpSheet.get(), &currentSheet ) )
{ {
if( restoreSheet ) if( restoreSheet )
g_CurrentSheet->LastScreen()->Append( m_sheet ); currentSheet.LastScreen()->Append( m_sheet );
return false; return false;
} }
@ -549,20 +551,20 @@ bool DIALOG_SCH_SHEET_PROPS::onSheetFilenameChanged( const wxString& aNewFilenam
// Temporarily remove the sheet from the current schematic page so that recursion // Temporarily remove the sheet from the current schematic page so that recursion
// and symbol library link tests can be performed with the modified sheet settings. // and symbol library link tests can be performed with the modified sheet settings.
restoreSheet = true; restoreSheet = true;
g_CurrentSheet->LastScreen()->Remove( m_sheet ); currentSheet.LastScreen()->Remove( m_sheet );
} }
if( !m_frame->LoadSheetFromFile( m_sheet, g_CurrentSheet, newAbsoluteFilename ) if( !m_frame->LoadSheetFromFile( m_sheet, &currentSheet, newAbsoluteFilename )
|| m_frame->CheckSheetForRecursion( m_sheet, g_CurrentSheet ) ) || m_frame->CheckSheetForRecursion( m_sheet, &currentSheet ) )
{ {
if( restoreSheet ) if( restoreSheet )
g_CurrentSheet->LastScreen()->Append( m_sheet ); currentSheet.LastScreen()->Append( m_sheet );
return false; return false;
} }
if( restoreSheet ) if( restoreSheet )
g_CurrentSheet->LastScreen()->Append( m_sheet ); currentSheet.LastScreen()->Append( m_sheet );
} }
if( m_clearAnnotationNewItems ) if( m_clearAnnotationNewItems )

View File

@ -18,6 +18,7 @@
*/ */
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <schematic.h>
#include <kiface_i.h> #include <kiface_i.h>
#include <dialog_sch_import_settings.h> #include <dialog_sch_import_settings.h>
#include <panel_setup_severities.h> #include <panel_setup_severities.h>
@ -41,8 +42,9 @@ DIALOG_SCHEMATIC_SETUP::DIALOG_SCHEMATIC_SETUP( SCH_EDIT_FRAME* aFrame ) :
m_pinMap = new PANEL_SETUP_PINMAP( m_treebook, aFrame ); m_pinMap = new PANEL_SETUP_PINMAP( m_treebook, aFrame );
ERC_ITEM dummyItem( 0 ); ERC_ITEM dummyItem( 0 );
m_severities = new PANEL_SETUP_SEVERITIES( this, dummyItem, g_ErcSettings->m_Severities, m_severities = new PANEL_SETUP_SEVERITIES( this, dummyItem,
ERCE_FIRST, ERCE_LAST, ERCE_PIN_TO_PIN_WARNING ); m_frame->Schematic().ErcSettings()->m_Severities, ERCE_FIRST, ERCE_LAST,
ERCE_PIN_TO_PIN_WARNING );
m_textVars = new PANEL_TEXT_VARIABLES( m_treebook, &Prj() ); m_textVars = new PANEL_TEXT_VARIABLES( m_treebook, &Prj() );

View File

@ -35,10 +35,10 @@
#include <lib_view_frame.h> #include <lib_view_frame.h>
#include <project_rescue.h> #include <project_rescue.h>
#include <sch_io_mgr.h> #include <sch_io_mgr.h>
#include <sch_sheet.h>
#include <sch_component.h> #include <sch_component.h>
#include <sch_screen.h> #include <sch_screen.h>
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <schematic.h>
#include <symbol_lib_table.h> #include <symbol_lib_table.h>
#include <env_paths.h> #include <env_paths.h>
@ -46,7 +46,8 @@
DIALOG_SYMBOL_REMAP::DIALOG_SYMBOL_REMAP( SCH_EDIT_FRAME* aParent ) : DIALOG_SYMBOL_REMAP::DIALOG_SYMBOL_REMAP( SCH_EDIT_FRAME* aParent ) :
DIALOG_SYMBOL_REMAP_BASE( aParent ) DIALOG_SYMBOL_REMAP_BASE( aParent ),
m_frame( aParent )
{ {
m_remapped = false; m_remapped = false;
@ -87,7 +88,8 @@ void DIALOG_SYMBOL_REMAP::OnRemapSymbols( wxCommandEvent& aEvent )
// Ignore the never show rescue setting for one last rescue of legacy symbol // Ignore the never show rescue setting for one last rescue of legacy symbol
// libraries before remapping to the symbol library table. This ensures the // libraries before remapping to the symbol library table. This ensures the
// best remapping results. // best remapping results.
LEGACY_RESCUER rescuer( Prj(), &parent->GetCurrentSheet(), parent->GetCanvas()->GetBackend() ); LEGACY_RESCUER rescuer( Prj(), &parent->Schematic(), &parent->GetCurrentSheet(),
parent->GetCanvas()->GetBackend() );
if( RESCUER::RescueProject( this, rescuer, false ) ) if( RESCUER::RescueProject( this, rescuer, false ) )
{ {
@ -241,7 +243,7 @@ void DIALOG_SYMBOL_REMAP::createProjectSymbolLibTable( REPORTER& aReporter )
void DIALOG_SYMBOL_REMAP::remapSymbolsToLibTable( REPORTER& aReporter ) void DIALOG_SYMBOL_REMAP::remapSymbolsToLibTable( REPORTER& aReporter )
{ {
wxString msg; wxString msg;
SCH_SCREENS schematic; SCH_SCREENS schematic( m_frame->Schematic().Root() );
SCH_COMPONENT* symbol; SCH_COMPONENT* symbol;
SCH_SCREEN* screen; SCH_SCREEN* screen;
@ -327,7 +329,7 @@ bool DIALOG_SYMBOL_REMAP::backupProject( REPORTER& aReporter )
wxFileName srcFileName; wxFileName srcFileName;
wxFileName destFileName; wxFileName destFileName;
wxFileName backupPath; wxFileName backupPath;
SCH_SCREENS schematic; SCH_SCREENS schematic( m_frame->Schematic().Root() );
// Copy backup files to different folder so as not to pollute the project folder. // Copy backup files to different folder so as not to pollute the project folder.
destFileName.SetPath( Prj().GetProjectPath() ); destFileName.SetPath( Prj().GetProjectPath() );

View File

@ -87,6 +87,8 @@ private:
bool backupProject( REPORTER& aReporter ); bool backupProject( REPORTER& aReporter );
bool m_remapped; bool m_remapped;
SCH_EDIT_FRAME* m_frame;
}; };
#endif // _DIALOG_SYMBOL_REMAP_H_ #endif // _DIALOG_SYMBOL_REMAP_H_

View File

@ -123,7 +123,7 @@ void DIALOG_UPDATE_FROM_PCB::OnUpdateClick( wxCommandEvent& event )
if( backAnno.FetchNetlistFromPCB( netlist ) && backAnno.BackAnnotateSymbols( netlist ) ) if( backAnno.FetchNetlistFromPCB( netlist ) && backAnno.BackAnnotateSymbols( netlist ) )
{ {
g_CurrentSheet->UpdateAllScreenReferences(); m_frame->GetCurrentSheet().UpdateAllScreenReferences();
m_frame->SetSheetNumberAndCount(); m_frame->SetSheetNumberAndCount();
m_frame->SyncView(); m_frame->SyncView();
m_frame->OnModify(); m_frame->OnModify();

View File

@ -42,6 +42,7 @@
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <sch_junction.h> #include <sch_junction.h>
#include <sch_painter.h> #include <sch_painter.h>
#include <schematic.h>
#include <settings/app_settings.h> #include <settings/app_settings.h>
#include <settings/settings_manager.h> #include <settings/settings_manager.h>
#include <symbol_lib_table.h> #include <symbol_lib_table.h>
@ -207,35 +208,6 @@ public:
}; };
int GetSeverity( int aErrorCode )
{
// Special-case pin-to-pin errors:
// Ignore-or-not is controlled by ERCE_PIN_TO_PIN_WARNING (for both)
// Warning-or-error is controlled by which errorCode it is
if( aErrorCode == ERCE_PIN_TO_PIN_ERROR )
{
if( g_ErcSettings->m_Severities[ ERCE_PIN_TO_PIN_WARNING ] == RPT_SEVERITY_IGNORE )
return RPT_SEVERITY_IGNORE;
else
return RPT_SEVERITY_ERROR;
}
else if( aErrorCode == ERCE_PIN_TO_PIN_WARNING )
{
if( g_ErcSettings->m_Severities[ ERCE_PIN_TO_PIN_WARNING ] == RPT_SEVERITY_IGNORE )
return RPT_SEVERITY_IGNORE;
else
return RPT_SEVERITY_WARNING;
}
return g_ErcSettings->m_Severities[ aErrorCode ];
}
void SetSeverity( int aErrorCode, int aSeverity )
{
g_ErcSettings->m_Severities[ aErrorCode ] = aSeverity;
}
/// Helper for all the old plotting/printing code while it still exists /// Helper for all the old plotting/printing code while it still exists
COLOR4D GetLayerColor( SCH_LAYER_ID aLayer ) COLOR4D GetLayerColor( SCH_LAYER_ID aLayer )
{ {
@ -327,7 +299,7 @@ std::vector<PARAM_CFG*>& SCH_EDIT_FRAME::GetProjectFileParameters()
params.push_back( new PARAM_CFG_FIELDNAMES( &m_templateFieldNames ) ); params.push_back( new PARAM_CFG_FIELDNAMES( &m_templateFieldNames ) );
params.push_back( new PARAM_CFG_SEVERITIES( g_ErcSettings ) ); params.push_back( new PARAM_CFG_SEVERITIES( Schematic().ErcSettings() ) );
return params; return params;
} }
@ -393,7 +365,7 @@ void SCH_EDIT_FRAME::DoShowSchematicSetupDialog( const wxString& aInitialPage,
void SCH_EDIT_FRAME::SaveProjectSettings() void SCH_EDIT_FRAME::SaveProjectSettings()
{ {
PROJECT& prj = Prj(); PROJECT& prj = Prj();
wxFileName fn = g_RootSheet->GetScreen()->GetFileName(); //ConfigFileName wxFileName fn = Schematic().RootScreen()->GetFileName(); //ConfigFileName
fn.SetExt( ProjectFileExtension ); fn.SetExt( ProjectFileExtension );

View File

@ -38,6 +38,7 @@
#include <sch_marker.h> #include <sch_marker.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_reference_list.h> #include <sch_reference_list.h>
#include <schematic.h>
#include <wx/ffile.h> #include <wx/ffile.h>
@ -154,11 +155,12 @@ static int MinimalReq[ELECTRICAL_PINTYPES_TOTAL][ELECTRICAL_PINTYPES_TOTAL] =
}; };
int TestDuplicateSheetNames( bool aCreateMarker ) int TestDuplicateSheetNames( SCHEMATIC* aSchematic, bool aCreateMarker )
{ {
SCH_SCREEN* screen; SCH_SCREEN* screen;
int err_count = 0; int err_count = 0;
SCH_SCREENS screenList; // Created the list of screen
SCH_SCREENS screenList( aSchematic->Root() );
for( screen = screenList.GetFirst(); screen != NULL; screen = screenList.GetNext() ) for( screen = screenList.GetFirst(); screen != NULL; screen = screenList.GetNext() )
{ {
@ -199,9 +201,9 @@ int TestDuplicateSheetNames( bool aCreateMarker )
} }
void TestTextVars() void TestTextVars( SCHEMATIC* aSchematic )
{ {
SCH_SCREENS screens; SCH_SCREENS screens( aSchematic->Root() );
for( SCH_SCREEN* screen = screens.GetFirst(); screen != NULL; screen = screens.GetNext() ) for( SCH_SCREEN* screen = screens.GetFirst(); screen != NULL; screen = screens.GetNext() )
{ {
@ -271,11 +273,12 @@ void TestTextVars()
} }
int TestConflictingBusAliases() int TestConflictingBusAliases( SCHEMATIC* aSchematic )
{ {
wxString msg; wxString msg;
int err_count = 0; int err_count = 0;
SCH_SCREENS screens;
SCH_SCREENS screens( aSchematic->Root() );
std::vector< std::shared_ptr<BUS_ALIAS> > aliases; std::vector< std::shared_ptr<BUS_ALIAS> > aliases;
for( SCH_SCREEN* screen = screens.GetFirst(); screen != NULL; screen = screens.GetNext() ) for( SCH_SCREEN* screen = screens.GetFirst(); screen != NULL; screen = screens.GetNext() )
@ -311,7 +314,7 @@ int TestConflictingBusAliases()
} }
int TestMultiunitFootprints( SCH_SHEET_LIST& aSheetList ) int TestMultiunitFootprints( const SCH_SHEET_LIST& aSheetList )
{ {
int errors = 0; int errors = 0;
std::map<wxString, LIB_ID> footprints; std::map<wxString, LIB_ID> footprints;

View File

@ -34,6 +34,7 @@
class NETLIST_OBJECT; class NETLIST_OBJECT;
class NETLIST_OBJECT_LIST; class NETLIST_OBJECT_LIST;
class SCH_SHEET_LIST; class SCH_SHEET_LIST;
class SCHEMATIC;
/* For ERC markers: error types (used in diags, and to set the color): /* For ERC markers: error types (used in diags, and to set the color):
*/ */
@ -115,13 +116,13 @@ void TestOthersItems( NETLIST_OBJECT_LIST* aList, unsigned aNetItemRef, unsigned
* @param aCreateMarker: true = create error markers in schematic, * @param aCreateMarker: true = create error markers in schematic,
* false = calculate error count only * false = calculate error count only
*/ */
int TestDuplicateSheetNames( bool aCreateMarker ); int TestDuplicateSheetNames( SCHEMATIC* aSchematic, bool aCreateMarker );
/** /**
* Function TestTextVars() * Function TestTextVars()
* Checks for any unresolved text variable references. * Checks for any unresolved text variable references.
*/ */
void TestTextVars(); void TestTextVars( SCHEMATIC* aSchematic );
/** /**
* Checks that there are not conflicting bus alias definitions in the schematic * Checks that there are not conflicting bus alias definitions in the schematic
@ -131,14 +132,14 @@ void TestTextVars();
* *
* @return the error count * @return the error count
*/ */
int TestConflictingBusAliases(); int TestConflictingBusAliases( SCHEMATIC* aSchematic );
/** /**
* Test if all units of each multiunit component have the same footprint assigned. * Test if all units of each multiunit component have the same footprint assigned.
* @param aSheetList contains components to be validated. * @param aSheetList contains components to be validated.
* @return The error count. * @return The error count.
*/ */
int TestMultiunitFootprints( SCH_SHEET_LIST& aSheetList ); int TestMultiunitFootprints( const SCH_SHEET_LIST& aSheetList );
#endif // _ERC_H #endif // _ERC_H

View File

@ -40,6 +40,7 @@
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <sch_component.h> #include <sch_component.h>
#include <schematic.h>
#include <wildcards_and_files_ext.h> #include <wildcards_and_files_ext.h>
#include <project_rescue.h> #include <project_rescue.h>
#include <eeschema_config.h> #include <eeschema_config.h>
@ -258,18 +259,11 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
// unload current project file before loading new // unload current project file before loading new
{ {
SetScreen( nullptr ); SetScreen( nullptr );
delete g_RootSheet;
if( g_CurrentSheet )
g_CurrentSheet->clear();
g_RootSheet = nullptr;
CreateScreens(); CreateScreens();
} }
GetScreen()->SetFileName( fullFileName ); GetScreen()->SetFileName( fullFileName );
g_RootSheet->SetFileName( fullFileName ); Schematic().Root().SetFileName( fullFileName );
SetStatusText( wxEmptyString ); SetStatusText( wxEmptyString );
ClearMsgPanel(); ClearMsgPanel();
@ -323,8 +317,7 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
else else
{ {
SetScreen( nullptr ); SetScreen( nullptr );
delete g_RootSheet; // Delete the current project. Schematic().Reset();
g_RootSheet = NULL; // Force CreateScreens() to build new empty project on load failure.
SCH_PLUGIN* plugin = SCH_IO_MGR::FindPlugin( schFileType ); SCH_PLUGIN* plugin = SCH_IO_MGR::FindPlugin( schFileType );
SCH_PLUGIN::SCH_PLUGIN_RELEASER pi( plugin ); SCH_PLUGIN::SCH_PLUGIN_RELEASER pi( plugin );
@ -334,11 +327,9 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
try try
{ {
g_RootSheet = pi->Load( fullFileName, &Kiway() ); Schematic().SetRoot( pi->Load( fullFileName, &Kiway(), &Schematic() ) );
g_CurrentSheet = new SCH_SHEET_PATH(); GetCurrentSheet().push_back( &Schematic().Root() );
g_CurrentSheet->clear();
g_CurrentSheet->push_back( g_RootSheet );
if( !pi->GetError().IsEmpty() ) if( !pi->GetError().IsEmpty() )
{ {
@ -368,7 +359,7 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
// It's possible the schematic parser fixed errors due to bugs so warn the user // It's possible the schematic parser fixed errors due to bugs so warn the user
// that the schematic has been fixed (modified). // that the schematic has been fixed (modified).
SCH_SHEET_LIST sheetList( g_RootSheet ); SCH_SHEET_LIST sheetList = Schematic().GetSheets();
if( sheetList.IsModified() ) if( sheetList.IsModified() )
{ {
@ -381,7 +372,7 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
UpdateFileHistory( fullFileName ); UpdateFileHistory( fullFileName );
SCH_SCREENS schematic; SCH_SCREENS schematic( Schematic().Root() );
// LIB_ID checks and symbol rescue only apply to the legacy file formats. // LIB_ID checks and symbol rescue only apply to the legacy file formats.
if( schFileType == SCH_IO_MGR::SCH_LEGACY ) if( schFileType == SCH_IO_MGR::SCH_LEGACY )
@ -464,16 +455,16 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
screen->UpdateLocalLibSymbolLinks(); screen->UpdateLocalLibSymbolLinks();
// Restore all of the loaded symbol instances from the root sheet screen. // Restore all of the loaded symbol instances from the root sheet screen.
sheetList.UpdateSymbolInstances( g_RootSheet->GetScreen()->m_symbolInstances ); sheetList.UpdateSymbolInstances( Schematic().RootScreen()->m_symbolInstances );
} }
g_ConnectionGraph->Reset(); Schematic().ConnectionGraph()->Reset();
SetScreen( g_CurrentSheet->LastScreen() ); SetScreen( GetCurrentSheet().LastScreen() );
// Migrate conflicting bus definitions // Migrate conflicting bus definitions
// TODO(JE) This should only run once based on schematic file version // TODO(JE) This should only run once based on schematic file version
if( g_ConnectionGraph->GetBusesNeedingMigration().size() > 0 ) if( Schematic().ConnectionGraph()->GetBusesNeedingMigration().size() > 0 )
{ {
DIALOG_MIGRATE_BUSES dlg( this ); DIALOG_MIGRATE_BUSES dlg( this );
dlg.ShowQuasiModal(); dlg.ShowQuasiModal();
@ -603,12 +594,12 @@ bool SCH_EDIT_FRAME::SaveProject()
{ {
wxString msg; wxString msg;
SCH_SCREEN* screen; SCH_SCREEN* screen;
SCH_SCREENS screens; SCH_SCREENS screens( Schematic().Root() );
bool success = true; bool success = true;
bool updateFileType = false; bool updateFileType = false;
// I want to see it in the debugger, show me the string! Can't do that with wxFileName. // I want to see it in the debugger, show me the string! Can't do that with wxFileName.
wxString fileName = Prj().AbsolutePath( g_RootSheet->GetFileName() ); wxString fileName = Prj().AbsolutePath( Schematic().Root().GetFileName() );
wxFileName fn = fileName; wxFileName fn = fileName;
if( !fn.IsDirWritable() ) if( !fn.IsDirWritable() )
@ -697,7 +688,7 @@ bool SCH_EDIT_FRAME::SaveProject()
} }
if( updateFileType ) if( updateFileType )
UpdateFileHistory( g_RootSheet->GetScreen()->GetFileName() ); UpdateFileHistory( Schematic().RootScreen()->GetFileName() );
// Save the sheet name map to the project file // Save the sheet name map to the project file
wxString configFile = Prj().GetProjectFullName(); wxString configFile = Prj().GetProjectFullName();
@ -707,9 +698,7 @@ bool SCH_EDIT_FRAME::SaveProject()
config->DeleteGroup( GROUP_SHEET_NAMES ); config->DeleteGroup( GROUP_SHEET_NAMES );
config->SetPath( GROUP_SHEET_NAMES ); config->SetPath( GROUP_SHEET_NAMES );
SCH_SHEET_LIST sheetList( g_RootSheet ); for( SCH_SHEET_PATH& sheetPath : Schematic().GetSheets() )
for( SCH_SHEET_PATH& sheetPath : sheetList )
{ {
SCH_SHEET* sheet = sheetPath.Last(); SCH_SHEET* sheet = sheetPath.Last();
config->Write( wxString::Format( "%d", index++ ), config->Write( wxString::Format( "%d", index++ ),
@ -727,10 +716,10 @@ bool SCH_EDIT_FRAME::SaveProject()
bool SCH_EDIT_FRAME::doAutoSave() bool SCH_EDIT_FRAME::doAutoSave()
{ {
wxFileName tmpFileName = g_RootSheet->GetFileName(); wxFileName tmpFileName = Schematic().Root().GetFileName();
wxFileName fn = tmpFileName; wxFileName fn = tmpFileName;
wxFileName tmp; wxFileName tmp;
SCH_SCREENS screens; SCH_SCREENS screens( Schematic().Root() );
bool autoSaveOk = true; bool autoSaveOk = true;
@ -773,7 +762,7 @@ bool SCH_EDIT_FRAME::doAutoSave()
bool SCH_EDIT_FRAME::importFile( const wxString& aFileName, int aFileType ) bool SCH_EDIT_FRAME::importFile( const wxString& aFileName, int aFileType )
{ {
wxFileName newfilename; wxFileName newfilename;
SCH_SHEET_LIST sheetList( g_RootSheet ); SCH_SHEET_LIST sheetList = Schematic().GetSheets();
switch( (SCH_IO_MGR::SCH_FILE_T) aFileType ) switch( (SCH_IO_MGR::SCH_FILE_T) aFileType )
{ {
@ -792,10 +781,10 @@ bool SCH_EDIT_FRAME::importFile( const wxString& aFileName, int aFileType )
try try
{ {
delete g_RootSheet; Schematic().Reset();
g_RootSheet = nullptr;
SCH_PLUGIN::SCH_PLUGIN_RELEASER pi( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_EAGLE ) ); SCH_PLUGIN::SCH_PLUGIN_RELEASER pi( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_EAGLE ) );
g_RootSheet = pi->Load( aFileName, &Kiway() ); Schematic().SetRoot( pi->Load( aFileName, &Kiway(), &Schematic() ) );
// Eagle sheets do not use a worksheet frame by default, so set it to an empty one // Eagle sheets do not use a worksheet frame by default, so set it to an empty one
WS_DATA_MODEL& pglayout = WS_DATA_MODEL::GetTheInstance(); WS_DATA_MODEL& pglayout = WS_DATA_MODEL::GetTheInstance();
@ -815,23 +804,21 @@ bool SCH_EDIT_FRAME::importFile( const wxString& aFileName, int aFileType )
newfilename.SetName( Prj().GetProjectName() ); newfilename.SetName( Prj().GetProjectName() );
newfilename.SetExt( LegacySchematicFileExtension ); newfilename.SetExt( LegacySchematicFileExtension );
g_CurrentSheet->clear(); GetCurrentSheet().push_back( &Schematic().Root() );
g_CurrentSheet->push_back( g_RootSheet ); SetScreen( GetCurrentSheet().LastScreen() );
SetScreen( g_CurrentSheet->LastScreen() );
g_RootSheet->SetFileName( newfilename.GetFullPath() ); Schematic().Root().SetFileName( newfilename.GetFullPath() );
GetScreen()->SetFileName( newfilename.GetFullPath() ); GetScreen()->SetFileName( newfilename.GetFullPath() );
GetScreen()->SetModify(); GetScreen()->SetModify();
SaveProjectSettings(); SaveProjectSettings();
UpdateFileHistory( aFileName ); UpdateFileHistory( aFileName );
SCH_SCREENS schematic; SCH_SCREENS schematic( Schematic().Root() );
schematic.UpdateSymbolLinks(); // Update all symbol library links for all sheets. schematic.UpdateSymbolLinks(); // Update all symbol library links for all sheets.
GetScreen()->m_Initialized = true; GetScreen()->m_Initialized = true;
SCH_SCREENS allScreens;
for( SCH_SCREEN* screen = allScreens.GetFirst(); screen; screen = allScreens.GetNext() ) for( SCH_SCREEN* screen = schematic.GetFirst(); screen; screen = schematic.GetNext() )
{ {
for( auto item : screen->Items().OfType( SCH_COMPONENT_T ) ) for( auto item : screen->Items().OfType( SCH_COMPONENT_T ) )
{ {
@ -888,7 +875,7 @@ bool SCH_EDIT_FRAME::importFile( const wxString& aFileName, int aFileType )
bool SCH_EDIT_FRAME::AskToSaveChanges() bool SCH_EDIT_FRAME::AskToSaveChanges()
{ {
SCH_SCREENS screenList; SCH_SCREENS screenList( Schematic().Root() );
// Save any currently open and modified project files. // Save any currently open and modified project files.
for( SCH_SCREEN* screen = screenList.GetFirst(); screen; screen = screenList.GetNext() ) for( SCH_SCREEN* screen = screenList.GetFirst(); screen; screen = screenList.GetNext() )

View File

@ -27,15 +27,10 @@
#include <gal/color4d.h> #include <gal/color4d.h>
#include <layers_id_colors_and_visibility.h> #include <layers_id_colors_and_visibility.h>
#include <erc_settings.h>
using KIGFX::COLOR4D; using KIGFX::COLOR4D;
class CONNECTION_GRAPH;
class TRANSFORM; class TRANSFORM;
class SCH_SHEET;
class SCH_SHEET_PATH;
class ERC_SETTINGS;
#define EESCHEMA_VERSION 5 #define EESCHEMA_VERSION 5
#define SCHEMATIC_HEAD_STRING "Schematic File Version" #define SCHEMATIC_HEAD_STRING "Schematic File Version"
@ -48,27 +43,4 @@ class ERC_SETTINGS;
*/ */
extern TRANSFORM DefaultTransform; extern TRANSFORM DefaultTransform;
/* First and main (root) screen */
extern SCH_SHEET* g_RootSheet;
/**
* With the new connectivity algorithm, many more places than before want to
* know what the current sheet is. This was moved here from SCH_EDIT_FRAME
* but we could refactor things to get rid of this global.
*/
extern SCH_SHEET_PATH* g_CurrentSheet; ///< which sheet we are presently working on.
/**
* This also wants to live in the eventual SCHEMATIC object
*/
extern CONNECTION_GRAPH* g_ConnectionGraph;
/**
* This also wants to live in the eventual SCHEMATIC object
*/
extern ERC_SETTINGS* g_ErcSettings;
int GetSeverity( int aErrorCode );
void SetSeverity( int aErrorCode, int aSeverity );
#endif // _GENERAL_H_ #endif // _GENERAL_H_

View File

@ -214,7 +214,7 @@ void SCH_EDIT_FRAME::SelectUnit( SCH_COMPONENT* aComponent, int aUnit )
SaveCopyInUndoList( aComponent, UR_CHANGED ); SaveCopyInUndoList( aComponent, UR_CHANGED );
/* Update the unit number. */ /* Update the unit number. */
aComponent->SetUnitSelection( g_CurrentSheet, aUnit ); aComponent->SetUnitSelection( &GetCurrentSheet(), aUnit );
aComponent->SetUnit( aUnit ); aComponent->SetUnit( aUnit );
aComponent->ClearFlags(); aComponent->ClearFlags();
aComponent->SetFlags( savedFlags ); // Restore m_Flag modified by SetUnit() aComponent->SetFlags( savedFlags ); // Restore m_Flag modified by SetUnit()

View File

@ -33,6 +33,7 @@
#include <general.h> #include <general.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <schematic.h>
#include <wx/imaglist.h> #include <wx/imaglist.h>
#include <wx/treectrl.h> #include <wx/treectrl.h>
#include <tool/tool_manager.h> #include <tool/tool_manager.h>
@ -95,10 +96,10 @@ HIERARCHY_NAVIG_DLG::HIERARCHY_NAVIG_DLG( SCH_EDIT_FRAME* aParent ) :
wxTreeItemId root = m_Tree->AddRoot( _( "Root" ), 0, 1 ); wxTreeItemId root = m_Tree->AddRoot( _( "Root" ), 0, 1 );
m_Tree->SetItemBold( root, true ); m_Tree->SetItemBold( root, true );
m_list.push_back( g_RootSheet ); m_list.push_back( &m_SchFrameEditor->Schematic().Root() );
m_Tree->SetItemData( root, new TreeItemData( m_list ) ); m_Tree->SetItemData( root, new TreeItemData( m_list ) );
if( m_SchFrameEditor->GetCurrentSheet().Last() == g_RootSheet ) if( m_SchFrameEditor->GetCurrentSheet().Last() == &m_SchFrameEditor->Schematic().Root() )
m_Tree->SelectItem( root ); m_Tree->SelectItem( root );
buildHierarchyTree( &m_list, &root ); buildHierarchyTree( &m_list, &root );
@ -195,7 +196,7 @@ void HIERARCHY_NAVIG_DLG::UpdateHierarchyTree()
wxTreeItemId root = m_Tree->GetRootItem(); wxTreeItemId root = m_Tree->GetRootItem();
m_Tree->DeleteChildren( root ); m_Tree->DeleteChildren( root );
m_list.clear(); m_list.clear();
m_list.push_back( g_RootSheet ); m_list.push_back( &m_SchFrameEditor->Schematic().Root() );
buildHierarchyTree( &m_list, &root ); buildHierarchyTree( &m_list, &root );
Thaw(); Thaw();
@ -230,7 +231,7 @@ void SCH_EDIT_FRAME::DisplayCurrentSheet()
m_toolManager->RunAction( ACTIONS::cancelInteractive, true ); m_toolManager->RunAction( ACTIONS::cancelInteractive, true );
m_toolManager->RunAction( EE_ACTIONS::clearSelection, true ); m_toolManager->RunAction( EE_ACTIONS::clearSelection, true );
SCH_SCREEN* screen = g_CurrentSheet->LastScreen(); SCH_SCREEN* screen = GetCurrentSheet().LastScreen();
wxASSERT( screen ); wxASSERT( screen );
@ -240,7 +241,7 @@ void SCH_EDIT_FRAME::DisplayCurrentSheet()
GetScreen()->SetGrid( m_LastGridSizeId + ID_POPUP_GRID_LEVEL_1000 ); GetScreen()->SetGrid( m_LastGridSizeId + ID_POPUP_GRID_LEVEL_1000 );
// update the References // update the References
g_CurrentSheet->UpdateAllScreenReferences(); GetCurrentSheet().UpdateAllScreenReferences();
SetSheetNumberAndCount(); SetSheetNumberAndCount();
if( !screen->m_Initialized ) if( !screen->m_Initialized )

View File

@ -48,6 +48,7 @@
#include <lib_pin.h> #include <lib_pin.h>
#include <transform.h> #include <transform.h>
#include <sch_component.h> #include <sch_component.h>
#include <sch_edit_frame.h> // For message panel debug info
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <settings/settings_manager.h> #include <settings/settings_manager.h>
#include <settings/color_settings.h> #include <settings/color_settings.h>
@ -1482,7 +1483,12 @@ void LIB_PIN::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITE
#if defined(DEBUG) #if defined(DEBUG)
auto conn = aComponent->GetConnectionForPin( this, *g_CurrentSheet ); SCH_EDIT_FRAME* frame = dynamic_cast<SCH_EDIT_FRAME*>( aFrame );
if( !frame )
return;
auto conn = aComponent->GetConnectionForPin( this, frame->GetCurrentSheet() );
if( conn ) if( conn )
conn->AppendDebugInfoToMsgPanel( aList ); conn->AppendDebugInfoToMsgPanel( aList );

View File

@ -37,6 +37,7 @@
#include <class_library.h> #include <class_library.h>
#include <sch_component.h> #include <sch_component.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <schematic.h>
bool SCH_EDIT_FRAME::CreateArchiveLibraryCacheFile( bool aUseCurrentSheetFilename ) bool SCH_EDIT_FRAME::CreateArchiveLibraryCacheFile( bool aUseCurrentSheetFilename )
@ -46,7 +47,7 @@ bool SCH_EDIT_FRAME::CreateArchiveLibraryCacheFile( bool aUseCurrentSheetFilenam
if( aUseCurrentSheetFilename ) if( aUseCurrentSheetFilename )
fn = GetScreen()->GetFileName(); fn = GetScreen()->GetFileName();
else else
fn = g_RootSheet->GetScreen()->GetFileName(); fn = Schematic().RootScreen()->GetFileName();
fn.SetName( fn.GetName() + "-cache" ); fn.SetName( fn.GetName() + "-cache" );
fn.SetExt( SchematicLibraryFileExtension ); fn.SetExt( SchematicLibraryFileExtension );
@ -55,7 +56,7 @@ bool SCH_EDIT_FRAME::CreateArchiveLibraryCacheFile( bool aUseCurrentSheetFilenam
// Update the schematic symbol library links. // Update the schematic symbol library links.
// because the lib cache has changed // because the lib cache has changed
SCH_SCREENS schematic; SCH_SCREENS schematic( Schematic().Root() );
schematic.UpdateSymbolLinks(); schematic.UpdateSymbolLinks();
return success; return success;
@ -66,7 +67,7 @@ bool SCH_EDIT_FRAME::CreateArchiveLibrary( const wxString& aFileName )
{ {
wxString tmp; wxString tmp;
wxString errorMsg; wxString errorMsg;
SCH_SCREENS screens; SCH_SCREENS screens( Schematic().Root() );
// Create a new empty library to archive components: // Create a new empty library to archive components:
std::unique_ptr<PART_LIB> archLib( new PART_LIB( LIBRARY_TYPE_EESCHEMA, aFileName ) ); std::unique_ptr<PART_LIB> archLib( new PART_LIB( LIBRARY_TYPE_EESCHEMA, aFileName ) );

View File

@ -28,6 +28,7 @@
#include <kiface_i.h> #include <kiface_i.h>
#include <menus_helpers.h> #include <menus_helpers.h>
#include <pgm_base.h> #include <pgm_base.h>
#include <schematic.h>
#include <tool/conditional_menu.h> #include <tool/conditional_menu.h>
#include <tool/tool_manager.h> #include <tool/tool_manager.h>
#include <tools/ee_selection_tool.h> #include <tools/ee_selection_tool.h>
@ -46,9 +47,9 @@ void SCH_EDIT_FRAME::ReCreateMenuBar()
wxMenuBar* oldMenuBar = GetMenuBar(); wxMenuBar* oldMenuBar = GetMenuBar();
wxMenuBar* menuBar = new wxMenuBar(); wxMenuBar* menuBar = new wxMenuBar();
auto modifiedDocumentCondition = [] ( const SELECTION& sel ) { auto modifiedDocumentCondition = [&]( const SELECTION& sel )
SCH_SHEET_LIST sheetList( g_RootSheet ); {
return sheetList.IsModified(); return Schematic().GetSheets().IsModified();
}; };
//-- File menu ----------------------------------------------------------- //-- File menu -----------------------------------------------------------
@ -162,22 +163,38 @@ void SCH_EDIT_FRAME::ReCreateMenuBar()
// //
CONDITIONAL_MENU* viewMenu = new CONDITIONAL_MENU( false, selTool ); CONDITIONAL_MENU* viewMenu = new CONDITIONAL_MENU( false, selTool );
auto belowRootSheetCondition = [] ( const SELECTION& aSel ) { auto belowRootSheetCondition =
return g_CurrentSheet->Last() != g_RootSheet; [this]( const SELECTION& aSel )
{
return GetCurrentSheet().Last() != &Schematic().Root();
}; };
auto gridShownCondition = [ this ] ( const SELECTION& aSel ) {
auto gridShownCondition =
[this]( const SELECTION& aSel )
{
return IsGridVisible(); return IsGridVisible();
}; };
auto imperialUnitsCondition = [this]( const SELECTION& aSel ) {
auto imperialUnitsCondition =
[this]( const SELECTION& aSel )
{
return GetUserUnits() == EDA_UNITS::INCHES; return GetUserUnits() == EDA_UNITS::INCHES;
}; };
auto metricUnitsCondition = [this]( const SELECTION& aSel ) {
auto metricUnitsCondition =
[this]( const SELECTION& aSel )
{
return GetUserUnits() == EDA_UNITS::MILLIMETRES; return GetUserUnits() == EDA_UNITS::MILLIMETRES;
}; };
auto fullCrosshairCondition = [ this ] ( const SELECTION& aSel ) {
auto fullCrosshairCondition =
[this]( const SELECTION& aSel )
{
return GetGalDisplayOptions().m_fullscreenCursor; return GetGalDisplayOptions().m_fullscreenCursor;
}; };
auto hiddenPinsCondition = [ this ] ( const SELECTION& aSel ) { auto hiddenPinsCondition =
[this]( const SELECTION& aSel )
{
return GetShowAllPins(); return GetShowAllPins();
}; };
@ -256,8 +273,10 @@ void SCH_EDIT_FRAME::ReCreateMenuBar()
// //
CONDITIONAL_MENU* toolsMenu = new CONDITIONAL_MENU( false, selTool ); CONDITIONAL_MENU* toolsMenu = new CONDITIONAL_MENU( false, selTool );
auto remapSymbolsCondition = [] ( const SELECTION& aSel ) { auto remapSymbolsCondition =
SCH_SCREENS schematic; [&]( const SELECTION& aSel )
{
SCH_SCREENS schematic( Schematic().Root() );
// The remapping can only be performed on legacy projects. // The remapping can only be performed on legacy projects.
return schematic.HasNoFullyDefinedLibIds(); return schematic.HasNoFullyDefinedLibIds();

View File

@ -305,7 +305,7 @@ void NETLIST_EXPORTER::findAllUnitsOfComponent( SCH_COMPONENT* aComponent,
wxString ref = aComponent->GetRef( aSheetPath ); wxString ref = aComponent->GetRef( aSheetPath );
wxString ref2; wxString ref2;
SCH_SHEET_LIST sheetList( g_RootSheet ); SCH_SHEET_LIST sheetList = m_schematic->GetSheets();
for( unsigned i = 0; i < sheetList.size(); i++ ) for( unsigned i = 0; i < sheetList.size(); i++ )
{ {

View File

@ -34,6 +34,7 @@
#include <sch_component.h> #include <sch_component.h>
#include <sch_text.h> #include <sch_text.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <schematic.h>
/** /**
* UNIQUE_STRINGS * UNIQUE_STRINGS
@ -102,6 +103,9 @@ protected:
/// unique library parts used. LIB_PART items are sorted by names /// unique library parts used. LIB_PART items are sorted by names
std::set<LIB_PART*, LIB_PART_LESS_THAN> m_LibParts; std::set<LIB_PART*, LIB_PART_LESS_THAN> m_LibParts;
/// The schematic we're generating a netlist for
SCHEMATIC* m_schematic;
/** /**
* Function sprintPinNetName * Function sprintPinNetName
* formats the net name for \a aPin using \a aNetNameFormat into \a aResult. * formats the net name for \a aPin using \a aNetNameFormat into \a aResult.
@ -171,8 +175,9 @@ public:
* @param aMasterList we take ownership of this here. * @param aMasterList we take ownership of this here.
* @param aLibTable is the symbol library table of the project. * @param aLibTable is the symbol library table of the project.
*/ */
NETLIST_EXPORTER( NETLIST_OBJECT_LIST* aMasterList ) : NETLIST_EXPORTER( NETLIST_OBJECT_LIST* aMasterList, SCHEMATIC* aSchematic ) :
m_masterList( aMasterList ) m_masterList( aMasterList ),
m_schematic( aSchematic )
{ {
wxASSERT( aMasterList ); wxASSERT( aMasterList );
} }

View File

@ -69,7 +69,7 @@ bool NETLIST_EXPORTER_CADSTAR::WriteNetlist( const wxString& aOutFileName, unsig
// Create netlist module section // Create netlist module section
m_ReferencesAlreadyFound.Clear(); m_ReferencesAlreadyFound.Clear();
SCH_SHEET_LIST sheetList( g_RootSheet ); SCH_SHEET_LIST sheetList = m_schematic->GetSheets();
for( unsigned i = 0; i < sheetList.size(); i++ ) for( unsigned i = 0; i < sheetList.size(); i++ )
{ {

View File

@ -48,8 +48,8 @@ class NETLIST_EXPORTER_CADSTAR : public NETLIST_EXPORTER
bool writeListOfNets( FILE* f ); bool writeListOfNets( FILE* f );
public: public:
NETLIST_EXPORTER_CADSTAR( NETLIST_OBJECT_LIST* aMasterList ) : NETLIST_EXPORTER_CADSTAR( NETLIST_OBJECT_LIST* aMasterList, SCHEMATIC* aSchematic ) :
NETLIST_EXPORTER( aMasterList ) NETLIST_EXPORTER( aMasterList, aSchematic )
{ {
} }

View File

@ -106,7 +106,7 @@ void NETLIST_EXPORTER_GENERIC::addComponentFields( XNODE* xcomp, SCH_COMPONENT*
wxString ref = comp->GetRef( aSheet ); wxString ref = comp->GetRef( aSheet );
SCH_SHEET_LIST sheetList( g_RootSheet ); SCH_SHEET_LIST sheetList = m_schematic->GetSheets();
int minUnit = comp->GetUnit(); int minUnit = comp->GetUnit();
for( unsigned i = 0; i < sheetList.size(); i++ ) for( unsigned i = 0; i < sheetList.size(); i++ )
@ -193,7 +193,6 @@ void NETLIST_EXPORTER_GENERIC::addComponentFields( XNODE* xcomp, SCH_COMPONENT*
xfield->AddAttribute( "name", it->first ); xfield->AddAttribute( "name", it->first );
} }
} }
} }
@ -203,7 +202,7 @@ XNODE* NETLIST_EXPORTER_GENERIC::makeComponents()
m_ReferencesAlreadyFound.Clear(); m_ReferencesAlreadyFound.Clear();
SCH_SHEET_LIST sheetList( g_RootSheet ); SCH_SHEET_LIST sheetList = m_schematic->GetSheets();
// Output is xml, so there is no reason to remove spaces from the field values. // Output is xml, so there is no reason to remove spaces from the field values.
// And XML element names need not be translated to various languages. // And XML element names need not be translated to various languages.
@ -290,7 +289,7 @@ XNODE* NETLIST_EXPORTER_GENERIC::makeDesignHeader()
wxFileName sourceFileName; wxFileName sourceFileName;
// the root sheet is a special sheet, call it source // the root sheet is a special sheet, call it source
xdesign->AddChild( node( "source", g_RootSheet->GetScreen()->GetFileName() ) ); xdesign->AddChild( node( "source", m_schematic->GetFileName() ) );
xdesign->AddChild( node( "date", DateAndTime() ) ); xdesign->AddChild( node( "date", DateAndTime() ) );
@ -300,7 +299,7 @@ XNODE* NETLIST_EXPORTER_GENERIC::makeDesignHeader()
/* /*
Export the sheets information Export the sheets information
*/ */
SCH_SHEET_LIST sheetList( g_RootSheet ); SCH_SHEET_LIST sheetList = m_schematic->GetSheets();
for( unsigned i = 0; i < sheetList.size(); i++ ) for( unsigned i = 0; i < sheetList.size(); i++ )
{ {

View File

@ -70,8 +70,9 @@ protected:
public: public:
NETLIST_EXPORTER_GENERIC( SCH_EDIT_FRAME* aFrame, NETLIST_EXPORTER_GENERIC( SCH_EDIT_FRAME* aFrame,
NETLIST_OBJECT_LIST* aMasterList, NETLIST_OBJECT_LIST* aMasterList,
SCHEMATIC* aSchematic,
CONNECTION_GRAPH* aGraph = nullptr ) : CONNECTION_GRAPH* aGraph = nullptr ) :
NETLIST_EXPORTER( aMasterList ), NETLIST_EXPORTER( aMasterList, aSchematic ),
m_libTable( aFrame->Prj().SchSymbolLibTable() ), m_libTable( aFrame->Prj().SchSymbolLibTable() ),
m_graph( aGraph ) m_graph( aGraph )
{} {}

View File

@ -40,8 +40,9 @@ class NETLIST_EXPORTER_KICAD : public NETLIST_EXPORTER_GENERIC
public: public:
NETLIST_EXPORTER_KICAD( SCH_EDIT_FRAME* aFrame, NETLIST_EXPORTER_KICAD( SCH_EDIT_FRAME* aFrame,
NETLIST_OBJECT_LIST* aMasterList, NETLIST_OBJECT_LIST* aMasterList,
SCHEMATIC* aSchematic,
CONNECTION_GRAPH* aGraph = nullptr ) : CONNECTION_GRAPH* aGraph = nullptr ) :
NETLIST_EXPORTER_GENERIC( aFrame, aMasterList, aGraph ) NETLIST_EXPORTER_GENERIC( aFrame, aMasterList, aSchematic, aGraph )
{} {}
/** /**

View File

@ -68,7 +68,7 @@ bool NETLIST_EXPORTER_ORCADPCB2::WriteNetlist( const wxString& aOutFileName,
// Create netlist module section // Create netlist module section
m_ReferencesAlreadyFound.Clear(); m_ReferencesAlreadyFound.Clear();
SCH_SHEET_LIST sheetList( g_RootSheet ); SCH_SHEET_LIST sheetList = m_schematic->GetSheets();
for( unsigned i = 0; i < sheetList.size(); i++ ) for( unsigned i = 0; i < sheetList.size(); i++ )
{ {

View File

@ -35,8 +35,8 @@
class NETLIST_EXPORTER_ORCADPCB2 : public NETLIST_EXPORTER class NETLIST_EXPORTER_ORCADPCB2 : public NETLIST_EXPORTER
{ {
public: public:
NETLIST_EXPORTER_ORCADPCB2( NETLIST_OBJECT_LIST* aMasterList ) : NETLIST_EXPORTER_ORCADPCB2( NETLIST_OBJECT_LIST* aMasterList, SCHEMATIC* aSchematic ) :
NETLIST_EXPORTER( aMasterList ) NETLIST_EXPORTER( aMasterList, aSchematic )
{ {
} }

View File

@ -267,7 +267,8 @@ wxString NETLIST_EXPORTER_PSPICE::GetSpiceFieldDefVal( SPICE_FIELD aField,
bool NETLIST_EXPORTER_PSPICE::ProcessNetlist( unsigned aCtl ) bool NETLIST_EXPORTER_PSPICE::ProcessNetlist( unsigned aCtl )
{ {
const wxString delimiters( "{:,; }" ); const wxString delimiters( "{:,; }" );
SCH_SHEET_LIST sheetList( g_RootSheet );
SCH_SHEET_LIST sheetList = m_schematic->GetSheets();
// Set of reference names, to check for duplications // Set of reference names, to check for duplications
std::set<wxString> refNames; std::set<wxString> refNames;
@ -378,7 +379,7 @@ bool NETLIST_EXPORTER_PSPICE::ProcessNetlist( unsigned aCtl )
void NETLIST_EXPORTER_PSPICE::UpdateDirectives( unsigned aCtl ) void NETLIST_EXPORTER_PSPICE::UpdateDirectives( unsigned aCtl )
{ {
const SCH_SHEET_LIST& sheetList = g_RootSheet; const SCH_SHEET_LIST& sheetList = m_schematic->GetSheets();
wxRegEx couplingK( "^[kK][[:digit:]]*[[:space:]]+[[:alnum:]]+[[:space:]]+[[:alnum:]]+", wxRegEx couplingK( "^[kK][[:digit:]]*[[:space:]]+[[:alnum:]]+[[:space:]]+[[:alnum:]]+",
wxRE_ADVANCED ); wxRE_ADVANCED );

View File

@ -101,8 +101,9 @@ struct SPICE_ITEM
class NETLIST_EXPORTER_PSPICE : public NETLIST_EXPORTER class NETLIST_EXPORTER_PSPICE : public NETLIST_EXPORTER
{ {
public: public:
NETLIST_EXPORTER_PSPICE( NETLIST_OBJECT_LIST* aMasterList, PROJECT* aProject = NULL ) : NETLIST_EXPORTER_PSPICE( NETLIST_OBJECT_LIST* aMasterList, SCHEMATIC* aSchematic,
NETLIST_EXPORTER( aMasterList ), PROJECT* aProject = nullptr ) :
NETLIST_EXPORTER( aMasterList, aSchematic ),
m_project( aProject ) m_project( aProject )
{ {
} }

View File

@ -33,6 +33,7 @@
#include <gestfich.h> #include <gestfich.h>
#include <pgm_base.h> #include <pgm_base.h>
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <schematic.h>
#include <reporter.h> #include <reporter.h>
#include <confirm.h> #include <confirm.h>
#include <kiway.h> #include <kiway.h>
@ -61,22 +62,25 @@ bool SCH_EDIT_FRAME::WriteNetListFile( NETLIST_OBJECT_LIST* aConnectedItemsList,
NETLIST_EXPORTER *helper; NETLIST_EXPORTER *helper;
SCHEMATIC* sch = &Schematic();
switch( aFormat ) switch( aFormat )
{ {
case NET_TYPE_PCBNEW: case NET_TYPE_PCBNEW:
helper = new NETLIST_EXPORTER_KICAD( this, aConnectedItemsList, g_ConnectionGraph ); helper = new NETLIST_EXPORTER_KICAD(
this, aConnectedItemsList, sch, sch->ConnectionGraph() );
break; break;
case NET_TYPE_ORCADPCB2: case NET_TYPE_ORCADPCB2:
helper = new NETLIST_EXPORTER_ORCADPCB2( aConnectedItemsList ); helper = new NETLIST_EXPORTER_ORCADPCB2( aConnectedItemsList, sch );
break; break;
case NET_TYPE_CADSTAR: case NET_TYPE_CADSTAR:
helper = new NETLIST_EXPORTER_CADSTAR( aConnectedItemsList ); helper = new NETLIST_EXPORTER_CADSTAR( aConnectedItemsList, sch );
break; break;
case NET_TYPE_SPICE: case NET_TYPE_SPICE:
helper = new NETLIST_EXPORTER_PSPICE( aConnectedItemsList ); helper = new NETLIST_EXPORTER_PSPICE( aConnectedItemsList, sch );
break; break;
default: default:
@ -85,8 +89,8 @@ bool SCH_EDIT_FRAME::WriteNetListFile( NETLIST_OBJECT_LIST* aConnectedItemsList,
tmpFile.SetExt( GENERIC_INTERMEDIATE_NETLIST_EXT ); tmpFile.SetExt( GENERIC_INTERMEDIATE_NETLIST_EXT );
fileName = tmpFile.GetFullPath(); fileName = tmpFile.GetFullPath();
helper = new NETLIST_EXPORTER_GENERIC( this, aConnectedItemsList, helper = new NETLIST_EXPORTER_GENERIC( this, aConnectedItemsList, sch,
g_ConnectionGraph ); sch->ConnectionGraph() );
executeCommandLine = true; executeCommandLine = true;
} }
break; break;
@ -158,14 +162,13 @@ bool SCH_EDIT_FRAME::WriteNetListFile( NETLIST_OBJECT_LIST* aConnectedItemsList,
//Imported function: //Imported function:
int TestDuplicateSheetNames( bool aCreateMarker ); int TestDuplicateSheetNames( SCHEMATIC* aSchematic, bool aCreateMarker );
bool SCH_EDIT_FRAME::prepareForNetlist() bool SCH_EDIT_FRAME::prepareForNetlist()
{ {
// Ensure all power symbols have a valid reference // Ensure all power symbols have a valid reference
SCH_SHEET_LIST sheets( g_RootSheet ); Schematic().GetSheets().AnnotatePowerSymbols();
sheets.AnnotatePowerSymbols();
// Performs some controls: // Performs some controls:
if( CheckAnnotate( NULL_REPORTER::GetInstance(), 0 ) ) if( CheckAnnotate( NULL_REPORTER::GetInstance(), 0 ) )
@ -178,7 +181,7 @@ bool SCH_EDIT_FRAME::prepareForNetlist()
} }
// Test duplicate sheet names: // Test duplicate sheet names:
if( TestDuplicateSheetNames( false ) > 0 ) if( TestDuplicateSheetNames( &Schematic(), false ) > 0 )
{ {
if( !IsOK( this, _( "Error: duplicate sheet names. Continue?" ) ) ) if( !IsOK( this, _( "Error: duplicate sheet names. Continue?" ) ) )
return false; return false;
@ -191,7 +194,7 @@ bool SCH_EDIT_FRAME::prepareForNetlist()
void SCH_EDIT_FRAME::sendNetlistToCvpcb() void SCH_EDIT_FRAME::sendNetlistToCvpcb()
{ {
NETLIST_OBJECT_LIST* net_atoms = BuildNetListBase(); NETLIST_OBJECT_LIST* net_atoms = BuildNetListBase();
NETLIST_EXPORTER_KICAD exporter( this, net_atoms, g_ConnectionGraph ); NETLIST_EXPORTER_KICAD exporter( this, net_atoms, &Schematic(), Schematic().ConnectionGraph() );
STRING_FORMATTER formatter; STRING_FORMATTER formatter;
// @todo : trim GNL_ALL down to minimum for CVPCB // @todo : trim GNL_ALL down to minimum for CVPCB
@ -212,8 +215,7 @@ NETLIST_OBJECT_LIST* SCH_EDIT_FRAME::CreateNetlist( bool aSilent,
} }
else // performs similar function as prepareForNetlist but without a dialog. else // performs similar function as prepareForNetlist but without a dialog.
{ {
SCH_SHEET_LIST sheets( g_RootSheet ); Schematic().GetSheets().AnnotatePowerSymbols();
sheets.AnnotatePowerSymbols();
if( aSilentAnnotate ) if( aSilentAnnotate )
AnnotateComponents( true, UNSORTED, INCREMENTAL_BY_REF, 0, false, false, true, AnnotateComponents( true, UNSORTED, INCREMENTAL_BY_REF, 0, false, false, true,
@ -236,7 +238,7 @@ NETLIST_OBJECT_LIST* SCH_EDIT_FRAME::BuildNetListBase( bool updateStatusText )
std::unique_ptr<NETLIST_OBJECT_LIST> ret( new NETLIST_OBJECT_LIST() ); std::unique_ptr<NETLIST_OBJECT_LIST> ret( new NETLIST_OBJECT_LIST() );
// Creates the flattened sheet list: // Creates the flattened sheet list:
SCH_SHEET_LIST aSheets( g_RootSheet ); SCH_SHEET_LIST aSheets = Schematic().GetSheets();
// Build netlist info // Build netlist info
bool success = ret->BuildNetListInfo( aSheets ); bool success = ret->BuildNetListInfo( aSheets );

View File

@ -36,6 +36,7 @@
#include <sch_connection.h> #include <sch_connection.h>
#include <netlist_object.h> #include <netlist_object.h>
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <schematic.h>
#if defined(DEBUG) #if defined(DEBUG)
@ -242,7 +243,7 @@ void NETLIST_OBJECT::ConvertBusToNetListItems( NETLIST_OBJECT_LIST& aNetListItem
// bus groups (including with nested vectors) the code is something arbitrary. // bus groups (including with nested vectors) the code is something arbitrary.
long member_offset = 0; long member_offset = 0;
auto alias = SCH_SCREEN::GetBusAlias( m_Label ); auto alias = static_cast<SCH_ITEM*>( m_Comp )->Schematic()->GetBusAlias( m_Label );
wxString group_name; wxString group_name;
bool self_set = false; bool self_set = false;
std::vector<wxString> bus_contents_vec; std::vector<wxString> bus_contents_vec;
@ -286,7 +287,8 @@ void NETLIST_OBJECT::ConvertBusToNetListItems( NETLIST_OBJECT_LIST& aNetListItem
fillBusVector( aNetListItems, prefix, begin, end, member_offset ); fillBusVector( aNetListItems, prefix, begin, end, member_offset );
member_offset += std::abs( end - begin ); member_offset += std::abs( end - begin );
} }
else if( auto nested_alias = SCH_SCREEN::GetBusAlias( bus_member ) ) else if( auto nested_alias = static_cast<SCH_ITEM*>( m_Comp )->Schematic()->GetBusAlias(
bus_member ) )
{ {
// Nested alias inside a group // Nested alias inside a group
for( const auto& alias_member : nested_alias->Members() ) for( const auto& alias_member : nested_alias->Members() )

View File

@ -29,6 +29,7 @@
#include <plotter.h> #include <plotter.h>
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <schematic.h>
#include <project.h> #include <project.h>
#include <pgm_base.h> #include <pgm_base.h>
#include <settings/settings_manager.h> #include <settings/settings_manager.h>
@ -52,7 +53,7 @@ void DIALOG_PLOT_SCHEMATIC::CreateDXFFile( bool aPlotAll, bool aPlotFrameRef )
SCH_SHEET_LIST sheetList; SCH_SHEET_LIST sheetList;
if( aPlotAll ) if( aPlotAll )
sheetList.BuildSheetList( g_RootSheet ); sheetList.BuildSheetList( &schframe->Schematic().Root() );
else else
sheetList.push_back( schframe->GetCurrentSheet() ); sheetList.push_back( schframe->GetCurrentSheet() );

View File

@ -30,6 +30,7 @@
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <base_units.h> #include <base_units.h>
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <schematic.h>
#include <project.h> #include <project.h>
#include <pgm_base.h> #include <pgm_base.h>
#include <settings/settings_manager.h> #include <settings/settings_manager.h>
@ -98,7 +99,7 @@ void DIALOG_PLOT_SCHEMATIC::createHPGLFile( bool aPlotAll, bool aPlotFrameRef )
SCH_SHEET_LIST sheetList; SCH_SHEET_LIST sheetList;
if( aPlotAll ) if( aPlotAll )
sheetList.BuildSheetList( g_RootSheet ); sheetList.BuildSheetList( &m_parent->Schematic().Root() );
else else
sheetList.push_back( m_parent->GetCurrentSheet() ); sheetList.push_back( m_parent->GetCurrentSheet() );

View File

@ -31,6 +31,7 @@
#include <base_units.h> #include <base_units.h>
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <sch_painter.h> #include <sch_painter.h>
#include <schematic.h>
#include <pgm_base.h> #include <pgm_base.h>
#include <project.h> #include <project.h>
#include <general.h> #include <general.h>
@ -56,7 +57,7 @@ void DIALOG_PLOT_SCHEMATIC::createPDFFile( bool aPlotAll, bool aPlotFrameRef,
SCH_SHEET_LIST sheetList; SCH_SHEET_LIST sheetList;
if( aPlotAll ) if( aPlotAll )
sheetList.BuildSheetList( g_RootSheet ); sheetList.BuildSheetList( &m_parent->Schematic().Root() );
else else
sheetList.push_back( m_parent->GetCurrentSheet() ); sheetList.push_back( m_parent->GetCurrentSheet() );

View File

@ -34,6 +34,7 @@
#include <reporter.h> #include <reporter.h>
#include <settings/settings_manager.h> #include <settings/settings_manager.h>
#include <sch_painter.h> #include <sch_painter.h>
#include <schematic.h>
#include <dialog_plot_schematic.h> #include <dialog_plot_schematic.h>
#include <wx_html_report_panel.h> #include <wx_html_report_panel.h>
@ -52,7 +53,7 @@ void DIALOG_PLOT_SCHEMATIC::createPSFile( bool aPlotAll, bool aPlotFrameRef,
SCH_SHEET_LIST sheetList; SCH_SHEET_LIST sheetList;
if( aPlotAll ) if( aPlotAll )
sheetList.BuildSheetList( g_RootSheet ); sheetList.BuildSheetList( &m_parent->Schematic().Root() );
else else
sheetList.push_back( m_parent->GetCurrentSheet() ); sheetList.push_back( m_parent->GetCurrentSheet() );

View File

@ -34,6 +34,7 @@
#include <base_units.h> #include <base_units.h>
#include <lib_edit_frame.h> #include <lib_edit_frame.h>
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <schematic.h>
#include <project.h> #include <project.h>
#include <reporter.h> #include <reporter.h>
#include <settings/settings_manager.h> #include <settings/settings_manager.h>
@ -51,7 +52,7 @@ void DIALOG_PLOT_SCHEMATIC::createSVGFile( bool aPrintAll, bool aPrintFrameRef,
SCH_SHEET_LIST sheetList; SCH_SHEET_LIST sheetList;
if( aPrintAll ) if( aPrintAll )
sheetList.BuildSheetList( g_RootSheet ); sheetList.BuildSheetList( &m_parent->Schematic().Root() );
else else
sheetList.push_back( m_parent->GetCurrentSheet() ); sheetList.push_back( m_parent->GetCurrentSheet() );

View File

@ -33,6 +33,7 @@
#include <sch_component.h> #include <sch_component.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <schematic.h>
#include <symbol_lib_table.h> #include <symbol_lib_table.h>
#include <wildcards_and_files_ext.h> #include <wildcards_and_files_ext.h>
@ -59,9 +60,9 @@ static bool sort_by_libid( const SCH_COMPONENT* ref, SCH_COMPONENT* cmp )
* *
* @param aComponents - a vector that will take the symbols * @param aComponents - a vector that will take the symbols
*/ */
static void get_components( std::vector<SCH_COMPONENT*>& aComponents ) static void get_components( SCHEMATIC* aSchematic, std::vector<SCH_COMPONENT*>& aComponents )
{ {
SCH_SCREENS screens; SCH_SCREENS screens( aSchematic->Root() );
// Get the full list // Get the full list
for( SCH_SCREEN* screen = screens.GetFirst(); screen; screen = screens.GetNext() ) for( SCH_SCREEN* screen = screens.GetFirst(); screen; screen = screens.GetNext() )
@ -108,9 +109,9 @@ static LIB_PART* find_component( const wxString& aName, PART_LIBS* aLibs, bool a
} }
static wxFileName GetRescueLibraryFileName() static wxFileName GetRescueLibraryFileName( SCHEMATIC* aSchematic )
{ {
wxFileName fn( g_RootSheet->GetScreen()->GetFileName() ); wxFileName fn = aSchematic->GetFileName();
fn.SetName( fn.GetName() + wxT( "-rescue" ) ); fn.SetName( fn.GetName() + wxT( "-rescue" ) );
fn.SetExt( SchematicLibraryFileExtension ); fn.SetExt( SchematicLibraryFileExtension );
return fn; return fn;
@ -429,7 +430,7 @@ void RESCUE_SYMBOL_LIB_TABLE_CANDIDATE::FindRescues(
// Differentiate symbol name in the rescue library by appending the symbol library // Differentiate symbol name in the rescue library by appending the symbol library
// table nickname to the symbol name to prevent name clashes in the rescue library. // table nickname to the symbol name to prevent name clashes in the rescue library.
wxString libNickname = GetRescueLibraryFileName().GetName(); wxString libNickname = GetRescueLibraryFileName( aRescuer.Schematic() ).GetName();
// Spaces in the file name will break the symbol name because they are not // Spaces in the file name will break the symbol name because they are not
// quoted in the symbol library file format. // quoted in the symbol library file format.
@ -495,10 +496,14 @@ bool RESCUE_SYMBOL_LIB_TABLE_CANDIDATE::PerformAction( RESCUER* aRescuer )
} }
RESCUER::RESCUER( PROJECT& aProject, SCH_SHEET_PATH* aCurrentSheet, RESCUER::RESCUER( PROJECT& aProject, SCHEMATIC* aSchematic, SCH_SHEET_PATH* aCurrentSheet,
EDA_DRAW_PANEL_GAL::GAL_TYPE aGalBackEndType ) EDA_DRAW_PANEL_GAL::GAL_TYPE aGalBackEndType )
{ {
get_components( m_components ); m_schematic = aSchematic ? aSchematic : aCurrentSheet->LastScreen()->Schematic();
wxASSERT( m_schematic );
get_components( m_schematic, m_components );
m_prj = &aProject; m_prj = &aProject;
m_currentSheet = aCurrentSheet; m_currentSheet = aCurrentSheet;
m_galBackEndType = aGalBackEndType; m_galBackEndType = aGalBackEndType;
@ -634,7 +639,7 @@ void LEGACY_RESCUER::InvokeDialog( wxWindow* aParent, bool aAskShowAgain )
void LEGACY_RESCUER::OpenRescueLibrary() void LEGACY_RESCUER::OpenRescueLibrary()
{ {
wxFileName fn = GetRescueLibraryFileName(); wxFileName fn = GetRescueLibraryFileName( m_schematic );
std::unique_ptr<PART_LIB> rescue_lib( new PART_LIB( LIBRARY_TYPE_EESCHEMA, fn.GetFullPath() ) ); std::unique_ptr<PART_LIB> rescue_lib( new PART_LIB( LIBRARY_TYPE_EESCHEMA, fn.GetFullPath() ) );
@ -736,10 +741,8 @@ bool LEGACY_RESCUER::WriteRescueLibrary( wxWindow *aParent )
m_prj->SetElem( PROJECT::ELEM_SCH_PART_LIBS, libs ); m_prj->SetElem( PROJECT::ELEM_SCH_PART_LIBS, libs );
// Update the schematic symbol library links since the library list has changed. // Update the schematic symbol library links since the library list has changed.
SCH_SCREENS schematic; SCH_SCREENS schematic( m_schematic->Root() );
schematic.UpdateSymbolLinks(); schematic.UpdateSymbolLinks();
return true; return true;
} }
@ -753,10 +756,10 @@ void LEGACY_RESCUER::AddPart( LIB_PART* aNewPart )
} }
SYMBOL_LIB_TABLE_RESCUER::SYMBOL_LIB_TABLE_RESCUER( PROJECT& aProject, SYMBOL_LIB_TABLE_RESCUER::SYMBOL_LIB_TABLE_RESCUER( PROJECT& aProject, SCHEMATIC* aSchematic,
SCH_SHEET_PATH* aCurrentSheet, SCH_SHEET_PATH* aCurrentSheet,
EDA_DRAW_PANEL_GAL::GAL_TYPE aGalBackEndType ) : EDA_DRAW_PANEL_GAL::GAL_TYPE aGalBackEndType ) :
RESCUER( aProject, aCurrentSheet, aGalBackEndType ) RESCUER( aProject, aSchematic, aCurrentSheet, aGalBackEndType )
{ {
m_properties = std::make_unique<PROPERTIES>(); m_properties = std::make_unique<PROPERTIES>();
} }
@ -785,7 +788,7 @@ void SYMBOL_LIB_TABLE_RESCUER::OpenRescueLibrary()
bool SYMBOL_LIB_TABLE_RESCUER::WriteRescueLibrary( wxWindow *aParent ) bool SYMBOL_LIB_TABLE_RESCUER::WriteRescueLibrary( wxWindow *aParent )
{ {
wxString msg; wxString msg;
wxFileName fn = GetRescueLibraryFileName(); wxFileName fn = GetRescueLibraryFileName( m_schematic );
// If the rescue library already exists in the symbol library table no need save it to add // If the rescue library already exists in the symbol library table no need save it to add
// it to the table. // it to the table.
@ -835,8 +838,7 @@ bool SYMBOL_LIB_TABLE_RESCUER::WriteRescueLibrary( wxWindow *aParent )
return false; return false;
// Update the schematic symbol library links since the library list has changed. // Update the schematic symbol library links since the library list has changed.
SCH_SCREENS schematic; SCH_SCREENS schematic( m_schematic->Root() );
schematic.UpdateSymbolLinks(); schematic.UpdateSymbolLinks();
return true; return true;
} }
@ -846,7 +848,7 @@ void SYMBOL_LIB_TABLE_RESCUER::AddPart( LIB_PART* aNewPart )
{ {
wxCHECK_RET( aNewPart, "Invalid LIB_PART pointer." ); wxCHECK_RET( aNewPart, "Invalid LIB_PART pointer." );
wxFileName fn = GetRescueLibraryFileName(); wxFileName fn = GetRescueLibraryFileName( m_schematic );
try try
{ {

View File

@ -53,6 +53,7 @@ class RESCUER;
class SCH_EDIT_FRAME; class SCH_EDIT_FRAME;
class SCH_LEGACY_PLUGIN; class SCH_LEGACY_PLUGIN;
class SCH_SHEET_PATH; class SCH_SHEET_PATH;
class SCHEMATIC;
enum RESCUE_TYPE enum RESCUE_TYPE
@ -234,6 +235,7 @@ protected:
std::vector<SCH_COMPONENT*> m_components; std::vector<SCH_COMPONENT*> m_components;
PROJECT* m_prj; PROJECT* m_prj;
SCHEMATIC* m_schematic;
EDA_DRAW_PANEL_GAL::GAL_TYPE m_galBackEndType; EDA_DRAW_PANEL_GAL::GAL_TYPE m_galBackEndType;
SCH_SHEET_PATH* m_currentSheet; SCH_SHEET_PATH* m_currentSheet;
@ -243,7 +245,7 @@ protected:
std::vector<RESCUE_LOG> m_rescue_log; std::vector<RESCUE_LOG> m_rescue_log;
public: public:
RESCUER( PROJECT& aProject, SCH_SHEET_PATH* aCurrentSheet, RESCUER( PROJECT& aProject, SCHEMATIC* aSchematic, SCH_SHEET_PATH* aCurrentSheet,
EDA_DRAW_PANEL_GAL::GAL_TYPE aGalBackeEndType ); EDA_DRAW_PANEL_GAL::GAL_TYPE aGalBackeEndType );
virtual ~RESCUER() virtual ~RESCUER()
@ -299,6 +301,8 @@ public:
*/ */
PROJECT* GetPrj() { return m_prj; } PROJECT* GetPrj() { return m_prj; }
SCHEMATIC* Schematic() { return m_schematic; }
/** /**
* Used by individual #RESCUE_CANDIDATE objects to log a rescue for undoing. * Used by individual #RESCUE_CANDIDATE objects to log a rescue for undoing.
*/ */
@ -327,9 +331,9 @@ private:
std::unique_ptr<PART_LIB> m_rescue_lib; std::unique_ptr<PART_LIB> m_rescue_lib;
public: public:
LEGACY_RESCUER( PROJECT& aProject, SCH_SHEET_PATH* aCurrentSheet, LEGACY_RESCUER( PROJECT& aProject, SCHEMATIC* aSchematic, SCH_SHEET_PATH* aCurrentSheet,
EDA_DRAW_PANEL_GAL::GAL_TYPE aGalBackEndType ) : EDA_DRAW_PANEL_GAL::GAL_TYPE aGalBackEndType ) :
RESCUER( aProject, aCurrentSheet, aGalBackEndType ) RESCUER( aProject, aSchematic, aCurrentSheet, aGalBackEndType )
{ {
} }
@ -357,7 +361,8 @@ private:
std::unique_ptr< PROPERTIES > m_properties; ///< Library plugin properties std::unique_ptr< PROPERTIES > m_properties; ///< Library plugin properties
public: public:
SYMBOL_LIB_TABLE_RESCUER( PROJECT& aProject, SCH_SHEET_PATH* aCurrentSheet, SYMBOL_LIB_TABLE_RESCUER( PROJECT& aProject, SCHEMATIC* aSchematic,
SCH_SHEET_PATH* aCurrentSheet,
EDA_DRAW_PANEL_GAL::GAL_TYPE aGalBackeEndType ); EDA_DRAW_PANEL_GAL::GAL_TYPE aGalBackeEndType );
virtual ~SYMBOL_LIB_TABLE_RESCUER() virtual ~SYMBOL_LIB_TABLE_RESCUER()

View File

@ -345,35 +345,6 @@ void SCH_BASE_FRAME::CenterScreen( const wxPoint& aCenterPoint, bool aWarpPointe
} }
void SCH_BASE_FRAME::FocusOnItem( SCH_ITEM* aItem )
{
static KIID lastBrightenedItemID( niluuid );
SCH_SHEET_LIST sheetList( g_RootSheet );
SCH_SHEET_PATH dummy;
SCH_ITEM* lastItem = sheetList.GetItem( lastBrightenedItemID, &dummy );
if( lastItem && lastItem != aItem )
{
lastItem->ClearBrightened();
RefreshItem( lastItem );
lastBrightenedItemID = niluuid;
}
if( aItem )
{
aItem->SetBrightened();
RefreshItem( aItem );
lastBrightenedItemID = aItem->m_Uuid;
// JEY TODO: test this with pins and fields (and with rotated symbols) ....
FocusOnLocation( aItem->GetFocusPosition() );
}
}
void SCH_BASE_FRAME::HardRedraw() void SCH_BASE_FRAME::HardRedraw()
{ {
GetCanvas()->GetView()->UpdateAllItems( KIGFX::ALL ); GetCanvas()->GetView()->UpdateAllItems( KIGFX::ALL );

View File

@ -34,6 +34,7 @@
#include <eeschema_config.h> #include <eeschema_config.h>
#include <general.h> #include <general.h>
#include <sch_bus_entry.h> #include <sch_bus_entry.h>
#include <sch_edit_frame.h>
#include <sch_line.h> #include <sch_line.h>
#include <sch_text.h> #include <sch_text.h>
#include <settings/color_settings.h> #include <settings/color_settings.h>
@ -402,7 +403,13 @@ void SCH_BUS_ENTRY_BASE::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, MSG_PANEL_ITEM
} }
aList.push_back( MSG_PANEL_ITEM( _( "Bus Entry Type" ), msg, DARKCYAN ) ); aList.push_back( MSG_PANEL_ITEM( _( "Bus Entry Type" ), msg, DARKCYAN ) );
if( auto conn = Connection( *g_CurrentSheet ) )
SCH_EDIT_FRAME* frame = dynamic_cast<SCH_EDIT_FRAME*>( aFrame );
if( !frame )
return;
if( auto conn = Connection( frame->GetCurrentSheet() ) )
{ {
#if defined(DEBUG) #if defined(DEBUG)
conn->AppendDebugInfoToMsgPanel( aList ); conn->AppendDebugInfoToMsgPanel( aList );

View File

@ -37,6 +37,7 @@
#include <sch_component.h> #include <sch_component.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <schematic.h>
#include <netlist_object.h> #include <netlist_object.h>
#include <lib_item.h> #include <lib_item.h>
@ -722,13 +723,17 @@ void SCH_COMPONENT::GetPins( std::vector<LIB_PIN*>& aPinsList )
SCH_PIN_PTRS SCH_COMPONENT::GetSchPins( const SCH_SHEET_PATH* aSheet ) const SCH_PIN_PTRS SCH_COMPONENT::GetSchPins( const SCH_SHEET_PATH* aSheet ) const
{ {
if( aSheet == nullptr )
aSheet = g_CurrentSheet;
// TODO(JE) if this works, consider caching in m_sheet_pins
int unit = GetUnitSelection( aSheet );
SCH_PIN_PTRS ptrs; SCH_PIN_PTRS ptrs;
if( aSheet == nullptr )
{
wxCHECK_MSG( Schematic(), ptrs, "Can't call GetSchPins on a component with no schematic" );
aSheet = &Schematic()->CurrentSheet();
}
int unit = GetUnitSelection( aSheet );
for( const auto& p : m_pins ) for( const auto& p : m_pins )
{ {
if( unit && p->GetLibPin()->GetUnit() && ( p->GetLibPin()->GetUnit() != unit ) ) if( unit && p->GetLibPin()->GetUnit() && ( p->GetLibPin()->GetUnit() != unit ) )
@ -1160,14 +1165,18 @@ void SCH_COMPONENT::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, MSG_PANEL_ITEMS& aL
{ {
wxString msg; wxString msg;
SCH_EDIT_FRAME* schframe = dynamic_cast<SCH_EDIT_FRAME*>( aFrame );
// part and alias can differ if alias is not the root // part and alias can differ if alias is not the root
if( m_part ) if( m_part )
{ {
if( m_part.get() != dummy() ) if( m_part.get() != dummy() )
{ {
if( g_CurrentSheet ) if( schframe )
aList.push_back( MSG_PANEL_ITEM( _( "Reference" ), GetRef( g_CurrentSheet ), {
DARKCYAN ) ); aList.push_back( MSG_PANEL_ITEM(
_( "Reference" ), GetRef( &schframe->GetCurrentSheet() ), DARKCYAN ) );
}
msg = m_part->IsPower() ? _( "Power symbol" ) : _( "Value" ); msg = m_part->IsPower() ? _( "Power symbol" ) : _( "Value" );
@ -1213,9 +1222,11 @@ void SCH_COMPONENT::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, MSG_PANEL_ITEMS& aL
} }
else else
{ {
if( g_CurrentSheet ) if( schframe )
aList.push_back( MSG_PANEL_ITEM( _( "Reference" ), GetRef( g_CurrentSheet ), {
DARKCYAN ) ); aList.push_back( MSG_PANEL_ITEM(
_( "Reference" ), GetRef( &schframe->GetCurrentSheet() ), DARKCYAN ) );
}
aList.push_back( MSG_PANEL_ITEM( _( "Value" ), GetField( VALUE )->GetShownText(), aList.push_back( MSG_PANEL_ITEM( _( "Value" ), GetField( VALUE )->GetShownText(),
DARKCYAN ) ); DARKCYAN ) );

View File

@ -150,7 +150,7 @@ void SCH_CONNECTION::ConfigureFromLabel( const wxString& aLabel )
for( const wxString& group_member : members ) for( const wxString& group_member : members )
{ {
// Handle alias inside bus group member list // Handle alias inside bus group member list
if( auto alias = g_ConnectionGraph->GetBusAlias( group_member ) ) if( auto alias = m_graph->GetBusAlias( group_member ) )
{ {
for( const wxString& alias_member : alias->Members() ) for( const wxString& alias_member : alias->Members() )
{ {
@ -332,7 +332,7 @@ void SCH_CONNECTION::AppendInfoToMsgPanel( MSG_PANEL_ITEMS& aList ) const
} }
#endif #endif
if( auto alias = g_ConnectionGraph->GetBusAlias( m_name ) ) if( auto alias = m_graph->GetBusAlias( m_name ) )
{ {
msg.Printf( _( "Bus Alias %s Members" ), m_name ); msg.Printf( _( "Bus Alias %s Members" ), m_name );
@ -347,7 +347,7 @@ void SCH_CONNECTION::AppendInfoToMsgPanel( MSG_PANEL_ITEMS& aList ) const
{ {
for( const auto& group_member : group_members ) for( const auto& group_member : group_members )
{ {
if( auto group_alias = g_ConnectionGraph->GetBusAlias( group_member ) ) if( auto group_alias = m_graph->GetBusAlias( group_member ) )
{ {
msg.Printf( _( "Bus Alias %s Members" ), group_alias->GetName() ); msg.Printf( _( "Bus Alias %s Members" ), group_alias->GetName() );

View File

@ -32,6 +32,7 @@
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
class CONNECTION_GRAPH;
class SCH_ITEM; class SCH_ITEM;
class SCH_SHEET_PATH; class SCH_SHEET_PATH;
@ -73,6 +74,11 @@ public:
bool operator!=( const SCH_CONNECTION& aOther ) const; bool operator!=( const SCH_CONNECTION& aOther ) const;
void SetGraph( CONNECTION_GRAPH* aGraph )
{
m_graph = aGraph;
}
/** /**
* Configures the connection given a label. * Configures the connection given a label.
* For CONNECTION_NET, this just sets the name. * For CONNECTION_NET, this just sets the name.
@ -370,6 +376,12 @@ private:
*/ */
std::vector< std::shared_ptr< SCH_CONNECTION > > m_members; std::vector< std::shared_ptr< SCH_CONNECTION > > m_members;
/**
* Pointer to the connection graph for the schematic this connection exists on.
* Needed for bus alias lookups.
*/
CONNECTION_GRAPH* m_graph;
}; };
#endif #endif

View File

@ -57,6 +57,7 @@
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <sch_text.h> #include <sch_text.h>
#include <schematic.h>
#include <symbol_lib_table.h> #include <symbol_lib_table.h>
#include <template_fieldnames.h> #include <template_fieldnames.h>
#include <wildcards_and_files_ext.h> #include <wildcards_and_files_ext.h>
@ -389,7 +390,8 @@ int SCH_EAGLE_PLUGIN::GetModifyHash() const
} }
SCH_SHEET* SCH_EAGLE_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway, SCH_SHEET* aAppendToMe, SCH_SHEET* SCH_EAGLE_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway, SCHEMATIC* aSchematic,
SCH_SHEET* aAppendToMe,
const PROPERTIES* aProperties ) const PROPERTIES* aProperties )
{ {
wxASSERT( !aFileName || aKiway != NULL ); wxASSERT( !aFileName || aKiway != NULL );
@ -400,6 +402,7 @@ SCH_SHEET* SCH_EAGLE_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway, SCH
m_filename = aFileName; m_filename = aFileName;
m_kiway = aKiway; m_kiway = aKiway;
m_schematic = aSchematic;
if( !xmlDocument.Load( m_filename.GetFullPath() ) ) if( !xmlDocument.Load( m_filename.GetFullPath() ) )
THROW_IO_ERROR( THROW_IO_ERROR(
@ -410,11 +413,12 @@ SCH_SHEET* SCH_EAGLE_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway, SCH
if( aAppendToMe ) if( aAppendToMe )
{ {
m_rootSheet = aAppendToMe->GetRootSheet(); wxCHECK_MSG( aSchematic->IsValid(), nullptr, "Can't append to a schematic with no root!" );
m_rootSheet = &aSchematic->Root();
} }
else else
{ {
m_rootSheet = new SCH_SHEET(); m_rootSheet = new SCH_SHEET( aSchematic );
m_rootSheet->SetFileName( aFileName ); m_rootSheet->SetFileName( aFileName );
} }
@ -422,6 +426,7 @@ SCH_SHEET* SCH_EAGLE_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway, SCH
{ {
SCH_SCREEN* screen = new SCH_SCREEN( aKiway ); SCH_SCREEN* screen = new SCH_SCREEN( aKiway );
screen->SetFileName( aFileName ); screen->SetFileName( aFileName );
screen->SetParent( m_schematic );
m_rootSheet->SetScreen( screen ); m_rootSheet->SetScreen( screen );
} }
@ -593,12 +598,12 @@ void SCH_EAGLE_PLUGIN::loadSchematic( wxXmlNode* aSchematicNode )
while( sheetNode ) while( sheetNode )
{ {
wxPoint pos = wxPoint( x * Mils2iu( 1000 ), y * Mils2iu( 1000 ) ); wxPoint pos = wxPoint( x * Mils2iu( 1000 ), y * Mils2iu( 1000 ) );
std::unique_ptr<SCH_SHEET> sheet( new SCH_SHEET( pos ) ); std::unique_ptr<SCH_SHEET> sheet( new SCH_SHEET( m_rootSheet, pos ) );
SCH_SCREEN* screen = new SCH_SCREEN( m_kiway ); SCH_SCREEN* screen = new SCH_SCREEN( m_kiway );
sheet->SetParent( m_rootSheet );
sheet->SetScreen( screen ); sheet->SetScreen( screen );
sheet->GetScreen()->SetFileName( sheet->GetFileName() ); sheet->GetScreen()->SetFileName( sheet->GetFileName() );
sheet->GetScreen()->SetParent( m_schematic );
m_currentSheet = sheet.get(); m_currentSheet = sheet.get();
loadSheet( sheetNode, i ); loadSheet( sheetNode, i );

View File

@ -91,8 +91,8 @@ public:
int GetModifyHash() const override; int GetModifyHash() const override;
SCH_SHEET* Load( const wxString& aFileName, KIWAY* aKiway, SCH_SHEET* aAppendToMe = NULL, SCH_SHEET* Load( const wxString& aFileName, KIWAY* aKiway, SCHEMATIC* aSchematic,
const PROPERTIES* aProperties = NULL ) override; SCH_SHEET* aAppendToMe = NULL, const PROPERTIES* aProperties = NULL ) override;
bool CheckHeader( const wxString& aFileName ) override; bool CheckHeader( const wxString& aFileName ) override;
@ -188,6 +188,7 @@ private:
wxString m_version; ///< Eagle file version. wxString m_version; ///< Eagle file version.
wxFileName m_filename; wxFileName m_filename;
wxString m_libName; ///< Library name to save symbols wxString m_libName; ///< Library name to save symbols
SCHEMATIC* m_schematic; ///< Passed to Load(), the schematic object being loaded
EPART_MAP m_partlist; EPART_MAP m_partlist;
std::map<wxString, EAGLE_LIBRARY> m_eagleLibs; std::map<wxString, EAGLE_LIBRARY> m_eagleLibs;

View File

@ -49,6 +49,7 @@
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <sch_painter.h> #include <sch_painter.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <schematic.h>
#include <advanced_config.h> #include <advanced_config.h>
#include <sim/sim_plot_frame.h> #include <sim/sim_plot_frame.h>
#include <symbol_lib_table.h> #include <symbol_lib_table.h>
@ -73,10 +74,6 @@
#include <gal/graphics_abstraction_layer.h> #include <gal/graphics_abstraction_layer.h>
SCH_SHEET_PATH* g_CurrentSheet = nullptr; // declared in general.h
CONNECTION_GRAPH* g_ConnectionGraph = nullptr;
ERC_SETTINGS* g_ErcSettings = nullptr;
// non-member so it can be moved easily, and kept REALLY private. // non-member so it can be moved easily, and kept REALLY private.
// Do NOT Clear() in here. // Do NOT Clear() in here.
static void add_search_paths( SEARCH_STACK* aDst, const SEARCH_STACK& aSrc, int aIndex ) static void add_search_paths( SEARCH_STACK* aDst, const SEARCH_STACK& aSrc, int aIndex )
@ -210,9 +207,7 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ):
wxDefaultPosition, wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE, SCH_EDIT_FRAME_NAME ), wxDefaultPosition, wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE, SCH_EDIT_FRAME_NAME ),
m_item_to_repeat( nullptr ) m_item_to_repeat( nullptr )
{ {
g_CurrentSheet = new SCH_SHEET_PATH(); m_schematic = new SCHEMATIC();
g_ConnectionGraph = new CONNECTION_GRAPH( this );
g_ErcSettings = new ERC_SETTINGS();
m_showBorderAndTitleBlock = true; // true to show sheet references m_showBorderAndTitleBlock = true; // true to show sheet references
m_hasAutoSave = true; m_hasAutoSave = true;
@ -269,6 +264,9 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ):
{ {
GetCanvas()->GetGAL()->SetGridVisibility( IsGridVisible() ); GetCanvas()->GetGAL()->SetGridVisibility( IsGridVisible() );
GetCanvas()->GetGAL()->SetAxesEnabled( false ); GetCanvas()->GetGAL()->SetAxesEnabled( false );
if( auto p = dynamic_cast<KIGFX::SCH_PAINTER*>( GetCanvas()->GetView()->GetPainter() ) )
p->SetSchematic( m_schematic );
} }
InitExitKey(); InitExitKey();
@ -296,15 +294,7 @@ SCH_EDIT_FRAME::~SCH_EDIT_FRAME()
SetScreen( NULL ); SetScreen( NULL );
delete g_CurrentSheet; // a SCH_SHEET_PATH, on the heap. delete m_schematic;
delete g_ConnectionGraph;
delete g_RootSheet;
delete g_ErcSettings;
g_CurrentSheet = nullptr;
g_ConnectionGraph = nullptr;
g_RootSheet = nullptr;
g_ErcSettings = nullptr;
} }
@ -358,58 +348,54 @@ void SCH_EDIT_FRAME::SaveCopyForRepeatItem( SCH_ITEM* aItem )
EDA_ITEM* SCH_EDIT_FRAME::GetItem( const KIID& aId ) EDA_ITEM* SCH_EDIT_FRAME::GetItem( const KIID& aId )
{ {
SCH_SHEET_LIST schematic( g_RootSheet ); return Schematic().GetSheets().GetItem( aId );
SCH_SHEET_PATH dummy;
return schematic.GetItem( aId, &dummy );
} }
void SCH_EDIT_FRAME::SetSheetNumberAndCount() void SCH_EDIT_FRAME::SetSheetNumberAndCount()
{ {
SCH_SCREEN* screen; SCH_SCREEN* screen;
SCH_SCREENS s_list; SCH_SCREENS s_list( Schematic().Root() );
// Set the sheet count, and the sheet number (1 for root sheet) // Set the sheet count, and the sheet number (1 for root sheet)
int sheet_count = g_RootSheet->CountSheets(); int sheet_count = Schematic().Root().CountSheets();
int SheetNumber = 1; int sheet_number = 1;
const KIID_PATH& current_sheetpath = g_CurrentSheet->Path(); const KIID_PATH& current_sheetpath = GetCurrentSheet().Path();
SCH_SHEET_LIST sheetList( g_RootSheet );
// Examine all sheets path to find the current sheets path, // Examine all sheets path to find the current sheets path,
// and count them from root to the current sheet path: // and count them from root to the current sheet path:
for( const SCH_SHEET_PATH& sheet : sheetList ) for( const SCH_SHEET_PATH& sheet : Schematic().GetSheets() )
{ {
if( sheet.Path() == current_sheetpath ) // Current sheet path found if( sheet.Path() == current_sheetpath ) // Current sheet path found
break; break;
SheetNumber++; // Not found, increment before this current path sheet_number++; // Not found, increment before this current path
} }
g_CurrentSheet->SetPageNumber( SheetNumber ); GetCurrentSheet().SetPageNumber( sheet_number );
for( screen = s_list.GetFirst(); screen != NULL; screen = s_list.GetNext() ) for( screen = s_list.GetFirst(); screen != NULL; screen = s_list.GetNext() )
screen->m_NumberOfScreens = sheet_count; screen->m_NumberOfScreens = sheet_count;
GetScreen()->m_ScreenNumber = SheetNumber; GetScreen()->m_ScreenNumber = sheet_number;
} }
SCH_SCREEN* SCH_EDIT_FRAME::GetScreen() const SCH_SCREEN* SCH_EDIT_FRAME::GetScreen() const
{ {
if( !g_CurrentSheet ) return GetCurrentSheet().LastScreen();
return nullptr; }
return g_CurrentSheet->LastScreen();
SCHEMATIC& SCH_EDIT_FRAME::Schematic() const
{
return *m_schematic;
} }
wxString SCH_EDIT_FRAME::GetScreenDesc() const wxString SCH_EDIT_FRAME::GetScreenDesc() const
{ {
if(! g_CurrentSheet ) wxString s = GetCurrentSheet().PathHumanReadable();
return wxT("<unknown>");
wxString s = g_CurrentSheet->PathHumanReadable();
return s; return s;
} }
@ -417,22 +403,17 @@ wxString SCH_EDIT_FRAME::GetScreenDesc() const
void SCH_EDIT_FRAME::CreateScreens() void SCH_EDIT_FRAME::CreateScreens()
{ {
if( g_RootSheet == NULL ) m_schematic->Reset();
g_RootSheet = new SCH_SHEET(); m_schematic->SetRoot( new SCH_SHEET( m_schematic ) );
if( g_RootSheet->GetScreen() == NULL ) SCH_SCREEN* rootScreen = new SCH_SCREEN( &Kiway() );
{ rootScreen->SetMaxUndoItems( m_UndoRedoCountMax );
SCH_SCREEN* screen = new SCH_SCREEN( &Kiway() ); m_schematic->Root().SetScreen( rootScreen );
screen->SetMaxUndoItems( m_UndoRedoCountMax ); SetScreen( Schematic().RootScreen() );
g_RootSheet->SetScreen( screen );
SetScreen( g_RootSheet->GetScreen() );
}
g_RootSheet->GetScreen()->SetFileName( wxEmptyString ); m_schematic->RootScreen()->SetFileName( wxEmptyString );
g_CurrentSheet->clear(); GetCurrentSheet().push_back( &m_schematic->Root() );
g_CurrentSheet->push_back( g_RootSheet );
g_ConnectionGraph->Reset();
if( GetScreen() == NULL ) if( GetScreen() == NULL )
{ {
@ -445,22 +426,20 @@ void SCH_EDIT_FRAME::CreateScreens()
} }
SCH_SHEET_PATH& SCH_EDIT_FRAME::GetCurrentSheet() SCH_SHEET_PATH& SCH_EDIT_FRAME::GetCurrentSheet() const
{ {
wxASSERT_MSG( g_CurrentSheet != NULL, wxT( "SCH_EDIT_FRAME g_CurrentSheet member is NULL." ) ); return m_schematic->CurrentSheet();
return *g_CurrentSheet;
} }
void SCH_EDIT_FRAME::SetCurrentSheet( const SCH_SHEET_PATH& aSheet ) void SCH_EDIT_FRAME::SetCurrentSheet( const SCH_SHEET_PATH& aSheet )
{ {
if( aSheet != *g_CurrentSheet ) if( aSheet != GetCurrentSheet() )
{ {
FocusOnItem( nullptr ); FocusOnItem( nullptr );
*g_CurrentSheet = aSheet; Schematic().SetCurrentSheet( aSheet );
GetCanvas()->DisplaySheet( g_CurrentSheet->LastScreen() ); GetCanvas()->DisplaySheet( aSheet.LastScreen() );
} }
} }
@ -469,18 +448,16 @@ void SCH_EDIT_FRAME::HardRedraw()
{ {
FocusOnItem( nullptr ); FocusOnItem( nullptr );
GetCanvas()->DisplaySheet( g_CurrentSheet->LastScreen() ); GetCanvas()->DisplaySheet( GetCurrentSheet().LastScreen() );
GetCanvas()->ForceRefresh(); GetCanvas()->ForceRefresh();
} }
void SCH_EDIT_FRAME::OnCloseWindow( wxCloseEvent& aEvent ) void SCH_EDIT_FRAME::OnCloseWindow( wxCloseEvent& aEvent )
{ {
SCH_SHEET_LIST sheetList( g_RootSheet );
// Shutdown blocks must be determined and vetoed as early as possible // Shutdown blocks must be determined and vetoed as early as possible
if( SupportsShutdownBlockReason() && aEvent.GetId() == wxEVT_QUERY_END_SESSION if( SupportsShutdownBlockReason() && aEvent.GetId() == wxEVT_QUERY_END_SESSION
&& sheetList.IsModified() ) && Schematic().GetSheets().IsModified() )
{ {
aEvent.Veto(); aEvent.Veto();
return; return;
@ -507,9 +484,11 @@ void SCH_EDIT_FRAME::OnCloseWindow( wxCloseEvent& aEvent )
if( simFrame && !simFrame->Close() ) // Can close the simulator? if( simFrame && !simFrame->Close() ) // Can close the simulator?
return; return;
if( sheetList.IsModified() ) SCH_SHEET_LIST sheetlist = Schematic().GetSheets();
if( sheetlist.IsModified() )
{ {
wxFileName fileName = g_RootSheet->GetScreen()->GetFileName(); wxFileName fileName = Schematic().RootScreen()->GetFileName();
wxString msg = _( "Save changes to \"%s\" before closing?" ); wxString msg = _( "Save changes to \"%s\" before closing?" );
if( !HandleUnsavedChanges( this, wxString::Format( msg, fileName.GetFullName() ), if( !HandleUnsavedChanges( this, wxString::Format( msg, fileName.GetFullName() ),
@ -546,7 +525,7 @@ void SCH_EDIT_FRAME::OnCloseWindow( wxCloseEvent& aEvent )
if( FindHierarchyNavigator() ) if( FindHierarchyNavigator() )
FindHierarchyNavigator()->Close( true ); FindHierarchyNavigator()->Close( true );
SCH_SCREENS screens; SCH_SCREENS screens( Schematic().Root() );
wxFileName fn; wxFileName fn;
for( SCH_SCREEN* screen = screens.GetFirst(); screen != NULL; screen = screens.GetNext() ) for( SCH_SCREEN* screen = screens.GetFirst(); screen != NULL; screen = screens.GetNext() )
@ -560,17 +539,17 @@ void SCH_EDIT_FRAME::OnCloseWindow( wxCloseEvent& aEvent )
wxRemoveFile( fn.GetFullPath() ); wxRemoveFile( fn.GetFullPath() );
} }
sheetList.ClearModifyStatus(); sheetlist.ClearModifyStatus();
wxString fileName = Prj().AbsolutePath( g_RootSheet->GetScreen()->GetFileName() ); wxString fileName = Prj().AbsolutePath( Schematic().RootScreen()->GetFileName() );
if( !g_RootSheet->GetScreen()->GetFileName().IsEmpty() && !g_RootSheet->GetScreen()->IsEmpty() ) if( !Schematic().GetFileName().IsEmpty() && !Schematic().RootScreen()->IsEmpty() )
UpdateFileHistory( fileName ); UpdateFileHistory( fileName );
g_RootSheet->GetScreen()->Clear(); Schematic().RootScreen()->Clear();
// all sub sheets are deleted, only the main sheet is usable // all sub sheets are deleted, only the main sheet is usable
g_CurrentSheet->clear(); GetCurrentSheet().clear();
Destroy(); Destroy();
} }
@ -582,11 +561,11 @@ wxString SCH_EDIT_FRAME::GetUniqueFilenameForCurrentSheet()
// Note that we need to fetch the rootSheetName out of its filename, as the root SCH_SHEET's // Note that we need to fetch the rootSheetName out of its filename, as the root SCH_SHEET's
// name is just a timestamp. // name is just a timestamp.
wxFileName rootFn( g_CurrentSheet->at( 0 )->GetFileName() ); wxFileName rootFn( GetCurrentSheet().at( 0 )->GetFileName() );
wxString filename = rootFn.GetName(); wxString filename = rootFn.GetName();
for( unsigned i = 1; i < g_CurrentSheet->size(); i++ ) for( unsigned i = 1; i < GetCurrentSheet().size(); i++ )
filename += wxT( "-" ) + g_CurrentSheet->at( i )->GetName(); filename += wxT( "-" ) + GetCurrentSheet().at( i )->GetName();
return filename; return filename;
} }
@ -611,7 +590,7 @@ void SCH_EDIT_FRAME::OnModify()
void SCH_EDIT_FRAME::OnUpdatePCB( wxCommandEvent& event ) void SCH_EDIT_FRAME::OnUpdatePCB( wxCommandEvent& event )
{ {
wxFileName fn = Prj().AbsolutePath( g_RootSheet->GetScreen()->GetFileName() ); wxFileName fn = Prj().AbsolutePath( Schematic().GetFileName() );
fn.SetExt( PcbFileExtension ); fn.SetExt( PcbFileExtension );
@ -811,7 +790,7 @@ void SCH_EDIT_FRAME::ParseArgs( wxCmdLineParser& aParser )
void SCH_EDIT_FRAME::OnOpenPcbnew( wxCommandEvent& event ) void SCH_EDIT_FRAME::OnOpenPcbnew( wxCommandEvent& event )
{ {
wxFileName kicad_board = Prj().AbsolutePath( g_RootSheet->GetScreen()->GetFileName() ); wxFileName kicad_board = Prj().AbsolutePath( Schematic().GetFileName() );
if( kicad_board.IsOk() ) if( kicad_board.IsOk() )
{ {
@ -857,7 +836,7 @@ void SCH_EDIT_FRAME::OnOpenPcbnew( wxCommandEvent& event )
void SCH_EDIT_FRAME::OnOpenCvpcb( wxCommandEvent& event ) void SCH_EDIT_FRAME::OnOpenCvpcb( wxCommandEvent& event )
{ {
wxFileName fn = Prj().AbsolutePath( g_RootSheet->GetScreen()->GetFileName() ); wxFileName fn = Prj().AbsolutePath( Schematic().GetFileName() );
fn.SetExt( NetlistFileExtension ); fn.SetExt( NetlistFileExtension );
if( !prepareForNetlist() ) if( !prepareForNetlist() )
@ -909,9 +888,9 @@ bool SCH_EDIT_FRAME::isAutoSaveRequired() const
// In case this event happens before g_RootSheet is initialized which does happen // In case this event happens before g_RootSheet is initialized which does happen
// on mingw64 builds. // on mingw64 builds.
if( g_RootSheet != NULL ) if( Schematic().IsValid() )
{ {
SCH_SCREENS screenList; SCH_SCREENS screenList( Schematic().Root() );
for( SCH_SCREEN* screen = screenList.GetFirst(); screen; screen = screenList.GetNext() ) for( SCH_SCREEN* screen = screenList.GetFirst(); screen; screen = screenList.GetNext() )
{ {
@ -1004,7 +983,7 @@ void SCH_EDIT_FRAME::AddItemToScreenAndUndoList( SCH_ITEM* aItem, bool aUndoAppe
TestDanglingEnds(); TestDanglingEnds();
for( SCH_ITEM* item : aItem->ConnectedItems( *g_CurrentSheet ) ) for( SCH_ITEM* item : aItem->ConnectedItems( GetCurrentSheet() ) )
RefreshItem( item ); RefreshItem( item );
} }
@ -1028,7 +1007,7 @@ void SCH_EDIT_FRAME::UpdateTitle()
title.Printf( _( "Eeschema" ) + wxT( " \u2014 %s [%s] \u2014 %s" ), title.Printf( _( "Eeschema" ) + wxT( " \u2014 %s [%s] \u2014 %s" ),
fn.GetFullName(), fn.GetFullName(),
g_CurrentSheet->PathHumanReadable(), GetCurrentSheet().PathHumanReadable(),
fn.GetPath() ); fn.GetPath() );
if( fn.FileExists() ) if( fn.FileExists() )
@ -1044,15 +1023,9 @@ void SCH_EDIT_FRAME::UpdateTitle()
} }
int SCH_EDIT_FRAME::GetSeverity( int aErrorCode ) const
{
return ::GetSeverity( aErrorCode );
}
void SCH_EDIT_FRAME::RecalculateConnections( SCH_CLEANUP_FLAGS aCleanupFlags ) void SCH_EDIT_FRAME::RecalculateConnections( SCH_CLEANUP_FLAGS aCleanupFlags )
{ {
SCH_SHEET_LIST list( g_RootSheet ); SCH_SHEET_LIST list = Schematic().GetSheets();
PROF_COUNTER timer; PROF_COUNTER timer;
// Ensure schematic graph is accurate // Ensure schematic graph is accurate
@ -1069,7 +1042,7 @@ void SCH_EDIT_FRAME::RecalculateConnections( SCH_CLEANUP_FLAGS aCleanupFlags )
timer.Stop(); timer.Stop();
wxLogTrace( "CONN_PROFILE", "SchematicCleanUp() %0.4f ms", timer.msecs() ); wxLogTrace( "CONN_PROFILE", "SchematicCleanUp() %0.4f ms", timer.msecs() );
g_ConnectionGraph->Recalculate( list, true ); Schematic().ConnectionGraph()->Recalculate( list, true );
} }
@ -1133,8 +1106,7 @@ void SCH_EDIT_FRAME::FixupJunctions()
bool modified = false; bool modified = false;
SCH_SHEET_LIST sheetList; SCH_SHEET_LIST sheetList = Schematic().GetSheets();
sheetList.BuildSheetList( g_RootSheet );
for( const SCH_SHEET_PATH& sheet : sheetList ) for( const SCH_SHEET_PATH& sheet : sheetList )
{ {
@ -1179,9 +1151,7 @@ void SCH_EDIT_FRAME::FixupJunctions()
bool SCH_EDIT_FRAME::IsContentModified() bool SCH_EDIT_FRAME::IsContentModified()
{ {
SCH_SHEET_LIST sheetList( g_RootSheet ); return Schematic().GetSheets().IsModified();
return sheetList.IsModified();
} }
@ -1192,6 +1162,35 @@ bool SCH_EDIT_FRAME::GetShowAllPins() const
} }
void SCH_EDIT_FRAME::FocusOnItem( SCH_ITEM* aItem )
{
static KIID lastBrightenedItemID( niluuid );
SCH_SHEET_LIST sheetList = Schematic().GetSheets();
SCH_SHEET_PATH dummy;
SCH_ITEM* lastItem = sheetList.GetItem( lastBrightenedItemID, &dummy );
if( lastItem && lastItem != aItem )
{
lastItem->ClearBrightened();
RefreshItem( lastItem );
lastBrightenedItemID = niluuid;
}
if( aItem )
{
aItem->SetBrightened();
RefreshItem( aItem );
lastBrightenedItemID = aItem->m_Uuid;
// JEY TODO: test this with pins and fields (and with rotated symbols) ....
FocusOnLocation( aItem->GetFocusPosition() );
}
}
void SCH_EDIT_FRAME::ConvertTimeStampUuids() void SCH_EDIT_FRAME::ConvertTimeStampUuids()
{ {
// Remove this once this method is fully implemented. Otherwise, don't use it. // Remove this once this method is fully implemented. Otherwise, don't use it.
@ -1201,14 +1200,14 @@ void SCH_EDIT_FRAME::ConvertTimeStampUuids()
// sheet paths using the new UUID based sheet paths. // sheet paths using the new UUID based sheet paths.
// Save the time stamp sheet paths. // Save the time stamp sheet paths.
SCH_SHEET_LIST timeStampSheetPaths( g_RootSheet ); SCH_SHEET_LIST timeStampSheetPaths = Schematic().GetSheets();
std::vector<KIID_PATH> oldSheetPaths = timeStampSheetPaths.GetPaths(); std::vector<KIID_PATH> oldSheetPaths = timeStampSheetPaths.GetPaths();
// The root sheet now gets a permanent UUID. // The root sheet now gets a permanent UUID.
const_cast<KIID&>( g_RootSheet->m_Uuid ).ConvertTimestampToUuid(); const_cast<KIID&>( Schematic().Root().m_Uuid ).ConvertTimestampToUuid();
SCH_SCREENS schematic; SCH_SCREENS schematic( Schematic().Root() );
// Change the sheet and symbol time stamps to UUIDs. // Change the sheet and symbol time stamps to UUIDs.
for( SCH_SCREEN* screen = schematic.GetFirst(); screen; screen = schematic.GetNext() ) for( SCH_SCREEN* screen = schematic.GetFirst(); screen; screen = schematic.GetNext() )
@ -1220,18 +1219,11 @@ void SCH_EDIT_FRAME::ConvertTimeStampUuids()
const_cast<KIID&>( symbol->m_Uuid ).ConvertTimestampToUuid(); const_cast<KIID&>( symbol->m_Uuid ).ConvertTimestampToUuid();
} }
SCH_SHEET_LIST uuidSheetPaths( g_RootSheet );
timeStampSheetPaths.ReplaceLegacySheetPaths( oldSheetPaths ); timeStampSheetPaths.ReplaceLegacySheetPaths( oldSheetPaths );
} }
wxString SCH_EDIT_FRAME::GetCurrentFileName() const wxString SCH_EDIT_FRAME::GetCurrentFileName() const
{ {
SCH_SCREEN* screen = g_RootSheet->GetScreen(); return Schematic().GetFileName();
if( screen )
return screen->GetFileName();
return wxEmptyString;
} }

View File

@ -58,6 +58,7 @@ class SCH_SHEET_PIN;
class SCH_COMPONENT; class SCH_COMPONENT;
class SCH_FIELD; class SCH_FIELD;
class SCH_JUNCTION; class SCH_JUNCTION;
class SCHEMATIC;
class DIALOG_SCH_FIND; class DIALOG_SCH_FIND;
class wxFindReplaceData; class wxFindReplaceData;
class RESCUER; class RESCUER;
@ -121,6 +122,7 @@ class SCH_EDIT_FRAME : public SCH_BASE_FRAME
friend class SCH_EDITOR_CONTROL; friend class SCH_EDITOR_CONTROL;
private: private:
SCHEMATIC* m_schematic; ///< The currently loaded schematic
wxString m_SelectedNetName; wxString m_SelectedNetName;
std::vector<PARAM_CFG*> m_projectFileParams; std::vector<PARAM_CFG*> m_projectFileParams;
@ -185,6 +187,8 @@ public:
SCH_SCREEN* GetScreen() const override; SCH_SCREEN* GetScreen() const override;
SCHEMATIC& Schematic() const;
void OnCloseWindow( wxCloseEvent& Event ); void OnCloseWindow( wxCloseEvent& Event );
/** /**
@ -506,11 +510,8 @@ public:
*/ */
int ModalAnnotate( const wxString& aMessage ); int ModalAnnotate( const wxString& aMessage );
///> @copydoc EDA_BASE_FRAME::GetSeverity()
int GetSeverity( int aErrorCode ) const override;
// Functions used for hierarchy handling // Functions used for hierarchy handling
SCH_SHEET_PATH& GetCurrentSheet(); SCH_SHEET_PATH& GetCurrentSheet() const;
void SetCurrentSheet( const SCH_SHEET_PATH& aSheet ); void SetCurrentSheet( const SCH_SHEET_PATH& aSheet );
@ -691,6 +692,12 @@ private:
*/ */
bool importFile( const wxString& aFileName, int aFileType ); bool importFile( const wxString& aFileName, int aFileType );
/**
* Fills a map of uuid -> reference from the currently loaded schematic
* @param aMap is a map to fill
*/
void mapExistingAnnotation( std::map<wxString, wxString>& aMap );
public: public:
/** /**
* Verify that \a aSheet will not cause a recursion error in \a aHierarchy. * Verify that \a aSheet will not cause a recursion error in \a aHierarchy.
@ -984,6 +991,8 @@ public:
void FixupJunctions(); void FixupJunctions();
void FocusOnItem( SCH_ITEM* aItem );
/** /**
* Convert sheet and symbol legacy time stamp UUIDs to full UUIDs. * Convert sheet and symbol legacy time stamp UUIDs to full UUIDs.
* *

View File

@ -43,6 +43,7 @@
#include <class_library.h> #include <class_library.h>
#include <sch_component.h> #include <sch_component.h>
#include <sch_field.h> #include <sch_field.h>
#include <schematic.h>
#include <settings/color_settings.h> #include <settings/color_settings.h>
#include <kicad_string.h> #include <kicad_string.h>
#include <trace_helpers.h> #include <trace_helpers.h>
@ -120,8 +121,8 @@ wxString SCH_FIELD::GetShownText( int aDepth ) const
if( processTextVars ) if( processTextVars )
{ {
if( g_RootSheet && g_RootSheet->GetScreen() ) if( Schematic() )
project = &g_RootSheet->GetScreen()->Kiway().Prj(); project = &Schematic()->RootScreen()->Kiway().Prj();
if( aDepth < 10 ) if( aDepth < 10 )
{ {

View File

@ -32,6 +32,7 @@
class SCH_SHEET; class SCH_SHEET;
class SCH_SCREEN; class SCH_SCREEN;
class SCH_PLUGIN; class SCH_PLUGIN;
class SCHEMATIC;
class KIWAY; class KIWAY;
class LIB_PART; class LIB_PART;
class PART_LIB; class PART_LIB;
@ -208,7 +209,7 @@ public:
* wrong, using line number and character offsets of the input file if * wrong, using line number and character offsets of the input file if
* possible. * possible.
*/ */
virtual SCH_SHEET* Load( const wxString& aFileName, KIWAY* aKiway, virtual SCH_SHEET* Load( const wxString& aFileName, KIWAY* aKiway, SCHEMATIC* aSchematic,
SCH_SHEET* aAppendToMe = NULL, const PROPERTIES* aProperties = NULL ); SCH_SHEET* aAppendToMe = NULL, const PROPERTIES* aProperties = NULL );
/** /**

View File

@ -35,6 +35,7 @@
#include <sch_component.h> #include <sch_component.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_pin.h> #include <sch_pin.h>
#include <schematic.h>
#include <general.h> #include <general.h>
@ -48,7 +49,6 @@ SCH_ITEM::SCH_ITEM( EDA_ITEM* aParent, KICAD_T aType ) :
{ {
m_Layer = LAYER_WIRE; // It's only a default, in fact m_Layer = LAYER_WIRE; // It's only a default, in fact
m_fieldsAutoplaced = FIELDS_AUTOPLACED_NO; m_fieldsAutoplaced = FIELDS_AUTOPLACED_NO;
m_connectivity_dirty = true; m_connectivity_dirty = true;
} }
@ -58,7 +58,6 @@ SCH_ITEM::SCH_ITEM( const SCH_ITEM& aItem ) :
{ {
m_Layer = aItem.m_Layer; m_Layer = aItem.m_Layer;
m_fieldsAutoplaced = aItem.m_fieldsAutoplaced; m_fieldsAutoplaced = aItem.m_fieldsAutoplaced;
m_connectivity_dirty = true; m_connectivity_dirty = true;
} }
@ -111,6 +110,22 @@ SCH_ITEM* SCH_ITEM::Duplicate( bool doClone ) const
} }
SCHEMATIC* SCH_ITEM::Schematic() const
{
EDA_ITEM* parent = GetParent();
while( parent )
{
if( parent->Type() == SCHEMATIC_T )
return static_cast<SCHEMATIC*>( parent );
else
parent = parent->GetParent();
}
return nullptr;
}
void SCH_ITEM::ViewGetLayers( int aLayers[], int& aCount ) const void SCH_ITEM::ViewGetLayers( int aLayers[], int& aCount ) const
{ {
// Basic fallback // Basic fallback

View File

@ -36,6 +36,7 @@
class SCH_CONNECTION; class SCH_CONNECTION;
class SCH_SHEET_PATH; class SCH_SHEET_PATH;
class SCHEMATIC;
class LINE_READER; class LINE_READER;
class SCH_EDIT_FRAME; class SCH_EDIT_FRAME;
class wxFindReplaceData; class wxFindReplaceData;
@ -208,6 +209,19 @@ public:
wxPoint& GetStoredPos() { return m_storedPos; } wxPoint& GetStoredPos() { return m_storedPos; }
void SetStoredPos( wxPoint aPos ) { m_storedPos = aPos; } void SetStoredPos( wxPoint aPos ) { m_storedPos = aPos; }
/**
* Searches the item hierarchy to find a SCHEMATIC
*
* Every SCH_ITEM that lives on a SCH_SCREEN should be parented to either that screen
* or another SCH_ITEM on the same screen (for example, pins to their components).
*
* Every SCH_SCREEN should be parented to the SCHEMATIC.
* Note that this hierarchy is not the same as the sheet hierarchy!
*
* @return the parent schematic this item lives on, or nullptr
*/
SCHEMATIC* Schematic() const;
/** /**
* Function IsLocked * Function IsLocked
* @return bool - true if the object is locked, else false * @return bool - true if the object is locked, else false

View File

@ -53,6 +53,7 @@
#include <sch_legacy_plugin.h> #include <sch_legacy_plugin.h>
#include <template_fieldnames.h> #include <template_fieldnames.h>
#include <sch_screen.h> #include <sch_screen.h>
#include <schematic.h>
#include <class_libentry.h> #include <class_libentry.h>
#include <class_library.h> #include <class_library.h>
#include <lib_arc.h> #include <lib_arc.h>
@ -586,7 +587,7 @@ void SCH_LEGACY_PLUGIN::init( KIWAY* aKiway, const PROPERTIES* aProperties )
} }
SCH_SHEET* SCH_LEGACY_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway, SCH_SHEET* SCH_LEGACY_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway, SCHEMATIC* aSchematic,
SCH_SHEET* aAppendToMe, const PROPERTIES* aProperties ) SCH_SHEET* aAppendToMe, const PROPERTIES* aProperties )
{ {
wxASSERT( !aFileName || aKiway != NULL ); wxASSERT( !aFileName || aKiway != NULL );
@ -594,6 +595,8 @@ SCH_SHEET* SCH_LEGACY_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway,
LOCALE_IO toggle; // toggles on, then off, the C locale. LOCALE_IO toggle; // toggles on, then off, the C locale.
SCH_SHEET* sheet; SCH_SHEET* sheet;
m_schematic = aSchematic;
wxFileName fn = aFileName; wxFileName fn = aFileName;
// Unfortunately child sheet file names the legacy schematic file format are not fully // Unfortunately child sheet file names the legacy schematic file format are not fully
@ -630,7 +633,7 @@ SCH_SHEET* SCH_LEGACY_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway,
if( aAppendToMe == NULL ) if( aAppendToMe == NULL )
{ {
// Clean up any allocated memory if an exception occurs loading the schematic. // Clean up any allocated memory if an exception occurs loading the schematic.
std::unique_ptr< SCH_SHEET > newSheet( new SCH_SHEET ); std::unique_ptr< SCH_SHEET > newSheet( new SCH_SHEET( aSchematic ) );
newSheet->SetFileName( aFileName ); newSheet->SetFileName( aFileName );
m_rootSheet = newSheet.get(); m_rootSheet = newSheet.get();
loadHierarchy( newSheet.get() ); loadHierarchy( newSheet.get() );
@ -640,8 +643,8 @@ SCH_SHEET* SCH_LEGACY_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway,
} }
else else
{ {
m_rootSheet = aAppendToMe->GetRootSheet(); wxCHECK_MSG( aSchematic->IsValid(), nullptr, "Can't append to a schematic with no root!" );
wxASSERT( m_rootSheet ); m_rootSheet = &aSchematic->Root();
sheet = aAppendToMe; sheet = aAppendToMe;
loadHierarchy( sheet ); loadHierarchy( sheet );
} }
@ -682,13 +685,14 @@ void SCH_LEGACY_PLUGIN::loadHierarchy( SCH_SHEET* aSheet )
if( screen ) if( screen )
{ {
aSheet->SetScreen( screen ); aSheet->SetScreen( screen );
screen->SetParent( m_schematic );
// Do not need to load the sub-sheets - this has already been done. // Do not need to load the sub-sheets - this has already been done.
} }
else else
{ {
aSheet->SetScreen( new SCH_SCREEN( m_kiway ) ); aSheet->SetScreen( new SCH_SCREEN( m_kiway ) );
aSheet->GetScreen()->SetFileName( fileName.GetFullPath() ); aSheet->GetScreen()->SetFileName( fileName.GetFullPath() );
aSheet->GetScreen()->SetParent( m_schematic );
try try
{ {
@ -757,10 +761,9 @@ void SCH_LEGACY_PLUGIN::LoadContent( LINE_READER& aReader, SCH_SCREEN* aScreen,
{ {
m_version = version; m_version = version;
// We cannot safely load content without a set root level. If we haven't been given one, // We cannot safely load content without a set root level.
// pick the default wxCHECK_RET( m_rootSheet,
if( m_rootSheet == nullptr ) "Cannot call SCH_LEGACY_PLUGIN::LoadContent() without setting root sheet." );
m_rootSheet = g_RootSheet;
while( aReader.ReadLine() ) while( aReader.ReadLine() )
{ {

View File

@ -97,7 +97,7 @@ public:
int GetModifyHash() const override; int GetModifyHash() const override;
SCH_SHEET* Load( const wxString& aFileName, KIWAY* aKiway, SCH_SHEET* Load( const wxString& aFileName, KIWAY* aKiway , SCHEMATIC* aSchematic,
SCH_SHEET* aAppendToMe = nullptr, SCH_SHEET* aAppendToMe = nullptr,
const PROPERTIES* aProperties = nullptr ) override; const PROPERTIES* aProperties = nullptr ) override;
@ -181,6 +181,7 @@ protected:
SCH_SHEET* m_rootSheet; ///< The root sheet of the schematic being loaded.. SCH_SHEET* m_rootSheet; ///< The root sheet of the schematic being loaded..
OUTPUTFORMATTER* m_out; ///< The output formatter for saving SCH_SCREEN objects. OUTPUTFORMATTER* m_out; ///< The output formatter for saving SCH_SCREEN objects.
SCH_LEGACY_PLUGIN_CACHE* m_cache; SCH_LEGACY_PLUGIN_CACHE* m_cache;
SCHEMATIC* m_schematic; ///< Passed to Load(), the schematic object being loaded
/// initialize PLUGIN like a constructor would. /// initialize PLUGIN like a constructor would.
void init( KIWAY* aKiway, const PROPERTIES* aProperties = nullptr ); void init( KIWAY* aKiway, const PROPERTIES* aProperties = nullptr );

View File

@ -791,7 +791,12 @@ void SCH_LINE::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, MSG_PANEL_ITEMS& aList )
aList.push_back( MSG_PANEL_ITEM( _( "Line Type" ), msg, DARKCYAN ) ); aList.push_back( MSG_PANEL_ITEM( _( "Line Type" ), msg, DARKCYAN ) );
if( auto conn = Connection( *g_CurrentSheet ) ) SCH_EDIT_FRAME* frame = dynamic_cast<SCH_EDIT_FRAME*>( aFrame );
if( !frame )
return;
if( auto conn = Connection( frame->GetCurrentSheet() ) )
{ {
#if defined(DEBUG) #if defined(DEBUG)
conn->AppendDebugInfoToMsgPanel( aList ); conn->AppendDebugInfoToMsgPanel( aList );

View File

@ -29,6 +29,7 @@
#include <bitmaps.h> #include <bitmaps.h>
#include <base_units.h> #include <base_units.h>
#include <sch_marker.h> #include <sch_marker.h>
#include <schematic.h>
#include <widgets/ui_common.h> #include <widgets/ui_common.h>
#include <pgm_base.h> #include <pgm_base.h>
#include <settings/settings_manager.h> #include <settings/settings_manager.h>
@ -77,7 +78,9 @@ void SCH_MARKER::ViewGetLayers( int aLayers[], int& aCount ) const
{ {
aCount = 2; aCount = 2;
switch( GetSeverity( m_rcItem->GetErrorCode() ) ) wxCHECK_RET( Schematic(), "No SCHEMATIC set for SCH_MARKER!" );
switch( Schematic()->GetErcSeverity( m_rcItem->GetErrorCode() ) )
{ {
default: default:
case SEVERITY::RPT_SEVERITY_ERROR: aLayers[0] = LAYER_ERC_ERR; break; case SEVERITY::RPT_SEVERITY_ERROR: aLayers[0] = LAYER_ERC_ERR; break;
@ -93,7 +96,9 @@ SCH_LAYER_ID SCH_MARKER::GetColorLayer() const
if( IsExcluded() ) if( IsExcluded() )
return LAYER_HIDDEN; return LAYER_HIDDEN;
switch( GetSeverity( m_rcItem->GetErrorCode() ) ) wxCHECK_MSG( Schematic(), LAYER_ERC_ERR, "No SCHEMATIC set for SCH_MARKER!" );
switch( Schematic()->GetErcSeverity( m_rcItem->GetErrorCode() ) )
{ {
default: default:
case SEVERITY::RPT_SEVERITY_ERROR: return LAYER_ERC_ERR; case SEVERITY::RPT_SEVERITY_ERROR: return LAYER_ERC_ERR;

View File

@ -57,6 +57,7 @@
#include <sch_no_connect.h> #include <sch_no_connect.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_text.h> #include <sch_text.h>
#include <schematic.h>
#include <settings/color_settings.h> #include <settings/color_settings.h>
#include <view/view.h> #include <view/view.h>
#include <kiface_i.h> #include <kiface_i.h>
@ -150,7 +151,8 @@ static LIB_PART* dummy()
SCH_PAINTER::SCH_PAINTER( GAL* aGal ) : SCH_PAINTER::SCH_PAINTER( GAL* aGal ) :
KIGFX::PAINTER( aGal ) KIGFX::PAINTER( aGal ),
m_schematic( nullptr )
{ } { }
@ -1268,10 +1270,14 @@ void SCH_PAINTER::draw( SCH_TEXT *aText, int aLayer )
} }
COLOR4D color = getRenderColor( aText, aLayer, drawingShadows ); COLOR4D color = getRenderColor( aText, aLayer, drawingShadows );
SCH_CONNECTION* conn = aText->Connection( *g_CurrentSheet );
if( m_schematic )
{
SCH_CONNECTION* conn = aText->Connection( m_schematic->CurrentSheet() );
if( conn && conn->IsBus() ) if( conn && conn->IsBus() )
color = getRenderColor( aText, LAYER_BUS, drawingShadows ); color = getRenderColor( aText, LAYER_BUS, drawingShadows );
}
if( !( aText->IsVisible() || aText->IsForceVisible() ) ) if( !( aText->IsVisible() || aText->IsForceVisible() ) )
{ {
@ -1565,10 +1571,13 @@ void SCH_PAINTER::draw( SCH_HIERLABEL *aLabel, int aLayer )
COLOR4D color = getRenderColor( aLabel, LAYER_SHEETLABEL, drawingShadows ); COLOR4D color = getRenderColor( aLabel, LAYER_SHEETLABEL, drawingShadows );
SCH_CONNECTION* conn = aLabel->Connection( *g_CurrentSheet ); if( m_schematic )
{
SCH_CONNECTION* conn = aLabel->Connection( m_schematic->CurrentSheet() );
if( conn && conn->IsBus() ) if( conn && conn->IsBus() )
color = getRenderColor( aLabel, LAYER_BUS, drawingShadows ); color = getRenderColor( aLabel, LAYER_BUS, drawingShadows );
}
std::vector<wxPoint> pts; std::vector<wxPoint> pts;
std::deque<VECTOR2D> pts2; std::deque<VECTOR2D> pts2;

View File

@ -54,6 +54,7 @@ class SCH_NO_CONNECT;
class SCH_LINE; class SCH_LINE;
class SCH_BUS_ENTRY_BASE; class SCH_BUS_ENTRY_BASE;
class SCH_BITMAP; class SCH_BITMAP;
class SCHEMATIC;
namespace KIGFX namespace KIGFX
{ {
@ -143,6 +144,11 @@ public:
return &m_schSettings; return &m_schSettings;
} }
void SetSchematic( SCHEMATIC* aSchematic )
{
m_schematic = aSchematic;
}
private: private:
void draw( LIB_RECTANGLE* aRect, int aLayer ); void draw( LIB_RECTANGLE* aRect, int aLayer );
void draw( LIB_PIN* aPin, int aLayer ); void draw( LIB_PIN* aPin, int aLayer );
@ -190,6 +196,8 @@ private:
void strokeText( const wxString& aText, const VECTOR2D& aPosition, double aRotationAngle ); void strokeText( const wxString& aText, const VECTOR2D& aPosition, double aRotationAngle );
SCH_RENDER_SETTINGS m_schSettings; SCH_RENDER_SETTINGS m_schSettings;
SCHEMATIC* m_schematic;
}; };
}; // namespace KIGFX }; // namespace KIGFX

View File

@ -47,8 +47,8 @@ void SCH_PLUGIN::SaveLibrary( const wxString& aFileName, const PROPERTIES* aProp
} }
SCH_SHEET* SCH_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway, SCH_SHEET* aAppendToMe, SCH_SHEET* SCH_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway, SCHEMATIC* aSchematic,
const PROPERTIES* aProperties ) SCH_SHEET* aAppendToMe, const PROPERTIES* aProperties )
{ {
not_implemented( this, __FUNCTION__ ); not_implemented( this, __FUNCTION__ );
return NULL; return NULL;

View File

@ -55,6 +55,7 @@
#include <sch_marker.h> #include <sch_marker.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_text.h> #include <sch_text.h>
#include <schematic.h>
#include <symbol_lib_table.h> #include <symbol_lib_table.h>
#include <tool/common_tools.h> #include <tool/common_tools.h>
@ -154,6 +155,15 @@ SCH_SCREEN::~SCH_SCREEN()
} }
SCHEMATIC* SCH_SCREEN::Schematic() const
{
wxCHECK_MSG( GetParent() && GetParent()->Type() == SCHEMATIC_T, nullptr,
"SCH_SCREEN must have a SCHEMATIC parent!" );
return static_cast<SCHEMATIC*>( GetParent() );
}
void SCH_SCREEN::clearLibSymbols() void SCH_SCREEN::clearLibSymbols()
{ {
for( auto libSymbol : m_libSymbols ) for( auto libSymbol : m_libSymbols )
@ -187,6 +197,9 @@ bool SCH_SCREEN::HasItems( KICAD_T aItemType ) const
void SCH_SCREEN::Append( SCH_ITEM* aItem ) void SCH_SCREEN::Append( SCH_ITEM* aItem )
{ {
// Ensure the item can reach the SCHEMATIC through this screen
aItem->SetParent( this );
if( aItem->Type() != SCH_SHEET_PIN_T && aItem->Type() != SCH_FIELD_T ) if( aItem->Type() != SCH_SHEET_PIN_T && aItem->Type() != SCH_FIELD_T )
{ {
if( aItem->Type() == SCH_COMPONENT_T ) if( aItem->Type() == SCH_COMPONENT_T )
@ -1178,42 +1191,6 @@ void SCH_SCREEN::AddBusAlias( std::shared_ptr<BUS_ALIAS> aAlias )
} }
bool SCH_SCREEN::IsBusAlias( const wxString& aLabel )
{
SCH_SHEET_LIST aSheets( g_RootSheet );
for( unsigned i = 0; i < aSheets.size(); i++ )
{
for( const auto& alias : aSheets[i].LastScreen()->GetBusAliases() )
{
if( alias->GetName() == aLabel )
{
return true;
}
}
}
return false;
}
std::shared_ptr<BUS_ALIAS> SCH_SCREEN::GetBusAlias( const wxString& aLabel )
{
SCH_SHEET_LIST aSheets( g_RootSheet );
for( unsigned i = 0; i < aSheets.size(); i++ )
{
for( auto alias : aSheets[i].LastScreen()->GetBusAliases() )
{
if( alias->GetName() == aLabel )
{
return alias;
}
}
}
return NULL;
}
#if defined(DEBUG) #if defined(DEBUG)
void SCH_SCREEN::Show( int nestLevel, std::ostream& os ) const void SCH_SCREEN::Show( int nestLevel, std::ostream& os ) const
{ {
@ -1231,7 +1208,7 @@ void SCH_SCREEN::Show( int nestLevel, std::ostream& os ) const
SCH_SCREENS::SCH_SCREENS( SCH_SHEET* aSheet ) SCH_SCREENS::SCH_SCREENS( SCH_SHEET* aSheet )
{ {
m_index = 0; m_index = 0;
buildScreenList( ( !aSheet ) ? g_RootSheet : aSheet ); buildScreenList( aSheet );
} }
@ -1317,16 +1294,18 @@ void SCH_SCREENS::ClearAnnotation()
void SCH_SCREENS::ClearAnnotationOfNewSheetPaths( SCH_SHEET_LIST& aInitialSheetPathList ) void SCH_SCREENS::ClearAnnotationOfNewSheetPaths( SCH_SHEET_LIST& aInitialSheetPathList )
{ {
SCHEMATIC* sch = GetFirst()->Schematic();
wxCHECK_RET( sch, "Null schematic in SCH_SCREENS::ClearAnnotationOfNewSheetPaths" );
// Clear the annotation for the components inside new sheetpaths // Clear the annotation for the components inside new sheetpaths
// not already in aInitialSheetList // not already in aInitialSheetList
SCH_SCREENS screensList( g_RootSheet ); // The list of screens, shared by sheet paths SCH_SCREENS screensList( sch->Root() ); // The list of screens, shared by sheet paths
screensList.BuildClientSheetPathList(); // build the shared by sheet paths, by screen screensList.BuildClientSheetPathList(); // build the shared by sheet paths, by screen
// Search for new sheet paths, not existing in aInitialSheetPathList // Search for new sheet paths, not existing in aInitialSheetPathList
// and existing in sheetpathList // and existing in sheetpathList
SCH_SHEET_LIST sheetpathList( g_RootSheet ); for( SCH_SHEET_PATH& sheetpath : sch->GetSheets() )
for( SCH_SHEET_PATH& sheetpath: sheetpathList )
{ {
bool path_exists = false; bool path_exists = false;
@ -1440,12 +1419,16 @@ void SCH_SCREENS::UpdateSymbolLinks( REPORTER* aReporter )
for( SCH_SCREEN* screen = GetFirst(); screen; screen = GetNext() ) for( SCH_SCREEN* screen = GetFirst(); screen; screen = GetNext() )
screen->UpdateSymbolLinks( aReporter ); screen->UpdateSymbolLinks( aReporter );
SCH_SHEET_LIST sheets( g_RootSheet ); SCHEMATIC* sch = GetFirst()->Schematic();
wxCHECK_RET( sch, "Null schematic in SCH_SCREENS::UpdateSymbolLinks" );
SCH_SHEET_LIST sheets = sch->GetSheets();
// All of the library symbols have been replaced with copies so the connection graph // All of the library symbols have been replaced with copies so the connection graph
// pointer are stale. // pointer are stale.
if( g_ConnectionGraph ) if( sch->ConnectionGraph() )
g_ConnectionGraph->Recalculate( sheets, true ); sch->ConnectionGraph()->Recalculate( sheets, true );
} }
@ -1588,12 +1571,14 @@ bool SCH_SCREENS::CanCauseCaseSensitivityIssue( const wxString& aSchematicFileNa
void SCH_SCREENS::BuildClientSheetPathList() void SCH_SCREENS::BuildClientSheetPathList()
{ {
SCH_SHEET_LIST sheetList( g_RootSheet ); SCHEMATIC* sch = GetFirst()->Schematic();
wxCHECK_RET( sch, "Null schematic in SCH_SCREENS::BuildClientSheetPathList" );
for( SCH_SCREEN* curr_screen = GetFirst(); curr_screen; curr_screen = GetNext() ) for( SCH_SCREEN* curr_screen = GetFirst(); curr_screen; curr_screen = GetNext() )
curr_screen->GetClientSheetPaths().clear(); curr_screen->GetClientSheetPaths().clear();
for( SCH_SHEET_PATH& sheetpath: sheetList ) for( SCH_SHEET_PATH& sheetpath : sch->GetSheets() )
{ {
SCH_SCREEN* used_screen = sheetpath.LastScreen(); SCH_SCREEN* used_screen = sheetpath.LastScreen();

View File

@ -157,6 +157,8 @@ public:
~SCH_SCREEN(); ~SCH_SCREEN();
SCHEMATIC* Schematic() const;
EE_RTREE& Items() EE_RTREE& Items()
{ {
return m_rtree; return m_rtree;
@ -534,17 +536,6 @@ public:
return m_aliases; return m_aliases;
} }
/**
* Returns true if the given string is a valid bus alias in a loaded screen
*/
static bool IsBusAlias( const wxString& aLabel );
/**
* Returns a pointer to a bus alias object for the given label,
* or null if one doesn't exist
*/
static std::shared_ptr<BUS_ALIAS> GetBusAlias( const wxString& aLabel );
#if defined(DEBUG) #if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const override; void Show( int nestLevel, std::ostream& os ) const override;
#endif #endif
@ -555,6 +546,10 @@ public:
* Container class that holds multiple #SCH_SCREEN objects in a hierarchy. * Container class that holds multiple #SCH_SCREEN objects in a hierarchy.
* *
* Individual #SCH_SCREEN objects are unique and correspond to .sch files. * Individual #SCH_SCREEN objects are unique and correspond to .sch files.
*
* NOTE: It may be desirable to fold the functionality of SCH_SCREENS into
* the new SCHEMATIC class at some point, since SCHEMATIC can also be thought
* of as owning the collection of all the SCH_SCREEN objects.
*/ */
class SCH_SCREENS class SCH_SCREENS
{ {
@ -564,7 +559,8 @@ private:
unsigned int m_index; unsigned int m_index;
public: public:
SCH_SCREENS( SCH_SHEET* aSheet = NULL ); SCH_SCREENS( SCH_SHEET* aSheet );
SCH_SCREENS( SCH_SHEET& aSheet ) : SCH_SCREENS( &aSheet ) {}
~SCH_SCREENS(); ~SCH_SCREENS();
size_t GetCount() const { return m_screens.size(); } size_t GetCount() const { return m_screens.size(); }
SCH_SCREEN* GetFirst(); SCH_SCREEN* GetFirst();

View File

@ -54,6 +54,7 @@
#include <sch_text.h> #include <sch_text.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_bitmap.h> #include <sch_bitmap.h>
#include <schematic.h>
#include <bus_alias.h> #include <bus_alias.h>
#include <sch_sexpr_plugin.h> #include <sch_sexpr_plugin.h>
#include <template_fieldnames.h> #include <template_fieldnames.h>
@ -418,7 +419,7 @@ void SCH_SEXPR_PLUGIN::init( KIWAY* aKiway, const PROPERTIES* aProperties )
} }
SCH_SHEET* SCH_SEXPR_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway, SCH_SHEET* SCH_SEXPR_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway, SCHEMATIC* aSchematic,
SCH_SHEET* aAppendToMe, const PROPERTIES* aProperties ) SCH_SHEET* aAppendToMe, const PROPERTIES* aProperties )
{ {
wxASSERT( !aFileName || aKiway != NULL ); wxASSERT( !aFileName || aKiway != NULL );
@ -459,10 +460,12 @@ SCH_SHEET* SCH_SEXPR_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway,
m_currentPath.push( m_path ); m_currentPath.push( m_path );
init( aKiway, aProperties ); init( aKiway, aProperties );
m_schematic = aSchematic;
if( aAppendToMe == NULL ) if( aAppendToMe == NULL )
{ {
// Clean up any allocated memory if an exception occurs loading the schematic. // Clean up any allocated memory if an exception occurs loading the schematic.
std::unique_ptr< SCH_SHEET > newSheet( new SCH_SHEET ); std::unique_ptr< SCH_SHEET > newSheet( new SCH_SHEET( aSchematic ) );
newSheet->SetFileName( aFileName ); newSheet->SetFileName( aFileName );
m_rootSheet = newSheet.get(); m_rootSheet = newSheet.get();
loadHierarchy( newSheet.get() ); loadHierarchy( newSheet.get() );
@ -473,8 +476,8 @@ SCH_SHEET* SCH_SEXPR_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway,
} }
else else
{ {
m_rootSheet = aAppendToMe->GetRootSheet(); wxCHECK_MSG( aSchematic->IsValid(), nullptr, "Can't append to a schematic with no root!" );
wxASSERT( m_rootSheet != NULL ); m_rootSheet = &aSchematic->Root();
sheet = aAppendToMe; sheet = aAppendToMe;
loadHierarchy( sheet ); loadHierarchy( sheet );
} }
@ -514,13 +517,14 @@ void SCH_SEXPR_PLUGIN::loadHierarchy( SCH_SHEET* aSheet )
if( screen ) if( screen )
{ {
aSheet->SetScreen( screen ); aSheet->SetScreen( screen );
aSheet->GetScreen()->SetParent( m_schematic );
// Do not need to load the sub-sheets - this has already been done. // Do not need to load the sub-sheets - this has already been done.
} }
else else
{ {
aSheet->SetScreen( new SCH_SCREEN( m_kiway ) ); aSheet->SetScreen( new SCH_SCREEN( m_kiway ) );
aSheet->GetScreen()->SetFileName( fileName.GetFullPath() ); aSheet->GetScreen()->SetFileName( fileName.GetFullPath() );
aSheet->GetScreen()->SetParent( m_schematic );
try try
{ {

View File

@ -84,7 +84,7 @@ public:
int GetModifyHash() const override; int GetModifyHash() const override;
SCH_SHEET* Load( const wxString& aFileName, KIWAY* aKiway, SCH_SHEET* Load( const wxString& aFileName, KIWAY* aKiway, SCHEMATIC* aSchematic,
SCH_SHEET* aAppendToMe = nullptr, SCH_SHEET* aAppendToMe = nullptr,
const PROPERTIES* aProperties = nullptr ) override; const PROPERTIES* aProperties = nullptr ) override;
@ -156,6 +156,7 @@ protected:
const PROPERTIES* m_props; ///< Passed via Save() or Load(), no ownership, may be nullptr. const PROPERTIES* m_props; ///< Passed via Save() or Load(), no ownership, may be nullptr.
KIWAY* m_kiway; ///< Required for path to legacy component libraries. KIWAY* m_kiway; ///< Required for path to legacy component libraries.
SCH_SHEET* m_rootSheet; ///< The root sheet of the schematic being loaded.. SCH_SHEET* m_rootSheet; ///< The root sheet of the schematic being loaded..
SCHEMATIC* m_schematic; ///< Passed to Load(), the schematic object being loaded
OUTPUTFORMATTER* m_out; ///< The output formatter for saving SCH_SCREEN objects. OUTPUTFORMATTER* m_out; ///< The output formatter for saving SCH_SCREEN objects.
SCH_SEXPR_PLUGIN_CACHE* m_cache; SCH_SEXPR_PLUGIN_CACHE* m_cache;

View File

@ -34,6 +34,7 @@
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <sch_component.h> #include <sch_component.h>
#include <schematic.h>
#include <settings/color_settings.h> #include <settings/color_settings.h>
#include <netlist_object.h> #include <netlist_object.h>
#include <trace_helpers.h> #include <trace_helpers.h>
@ -67,8 +68,8 @@ const wxString SCH_SHEET::GetDefaultFieldName( int aFieldNdx )
} }
SCH_SHEET::SCH_SHEET( const wxPoint& pos ) : SCH_SHEET::SCH_SHEET( EDA_ITEM* aParent, const wxPoint& pos ) :
SCH_ITEM( NULL, SCH_SHEET_T ) SCH_ITEM( aParent, SCH_SHEET_T )
{ {
m_Layer = LAYER_SHEET; m_Layer = LAYER_SHEET;
m_pos = pos; m_pos = pos;
@ -146,19 +147,6 @@ EDA_ITEM* SCH_SHEET::Clone() const
} }
void SCH_SHEET::SetParent( EDA_ITEM* aSheet )
{
m_Parent = nullptr;
if( aSheet )
{
// Parent must be another SCH_SHEET object or nullptr
wxCHECK( aSheet->Type() == SCH_SHEET_T, /* void */ );
m_Parent = aSheet;
}
}
void SCH_SHEET::SetScreen( SCH_SCREEN* aScreen ) void SCH_SHEET::SetScreen( SCH_SCREEN* aScreen )
{ {
if( aScreen == m_screen ) if( aScreen == m_screen )
@ -191,20 +179,11 @@ int SCH_SHEET::GetScreenCount() const
} }
SCH_SHEET* SCH_SHEET::GetRootSheet() bool SCH_SHEET::IsRootSheet() const
{ {
EDA_ITEM* item = GetParent(); wxCHECK_MSG( Schematic(), false, "Can't call IsRootSheet without setting a schematic" );
if( item == nullptr ) return &Schematic()->Root() == this;
return this;
SCH_SHEET* sheet = dynamic_cast< SCH_SHEET* >( item );
// The parent must be a SCH_SHEET object.
wxCHECK( sheet, nullptr );
// Recurse until a sheet is found with no parent which is the root sheet.
return sheet->GetRootSheet();
} }
@ -230,9 +209,7 @@ bool SCH_SHEET::ResolveTextVar( wxString* token, int aDepth ) const
if( token->IsSameAs( wxT( "#" ) ) ) if( token->IsSameAs( wxT( "#" ) ) )
{ {
SCH_SHEET_LIST sheetList( g_RootSheet ); for( const SCH_SHEET_PATH& sheet : Schematic()->GetSheets() )
for( const SCH_SHEET_PATH& sheet : sheetList )
{ {
if( sheet.Last() == this ) // Current sheet path found if( sheet.Last() == this ) // Current sheet path found
{ {
@ -243,7 +220,7 @@ bool SCH_SHEET::ResolveTextVar( wxString* token, int aDepth ) const
} }
else if( token->IsSameAs( wxT( "##" ) ) ) else if( token->IsSameAs( wxT( "##" ) ) )
{ {
SCH_SHEET_LIST sheetList( g_RootSheet ); SCH_SHEET_LIST sheetList = Schematic()->GetSheets();
*token = wxString::Format( wxT( "%d" ), (int) sheetList.size() ); *token = wxString::Format( wxT( "%d" ), (int) sheetList.size() );
return true; return true;
} }
@ -703,7 +680,7 @@ bool SCH_SHEET::LocatePathOfScreen( SCH_SCREEN* aScreen, SCH_SHEET_PATH* aList )
} }
int SCH_SHEET::CountSheets() int SCH_SHEET::CountSheets() const
{ {
int count = 1; //1 = this!! int count = 1; //1 = this!!
@ -723,11 +700,15 @@ void SCH_SHEET::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, MSG_PANEL_ITEMS& aList
aList.emplace_back( _( "File Name" ), m_fields[ SHEETFILENAME ].GetText(), BROWN ); aList.emplace_back( _( "File Name" ), m_fields[ SHEETFILENAME ].GetText(), BROWN );
#if 1 // Set to 1 to display the sheet UUID and hierarchical path #if 1 // Set to 1 to display the sheet UUID and hierarchical path
if( auto schframe = dynamic_cast<SCH_EDIT_FRAME*>( aFrame ) )
{
wxString msgU, msgL; wxString msgU, msgL;
msgU << _( "UUID" ) << ": " << m_Uuid.AsString(); msgU << _( "UUID" ) << ": " << m_Uuid.AsString();
msgL << _( "Path" ) << ": " << g_CurrentSheet->PathHumanReadable(); msgL << _( "Path" ) << ": " << schframe->GetCurrentSheet().PathHumanReadable();
aList.push_back( MSG_PANEL_ITEM( msgU, msgL, BLUE ) ); aList.push_back( MSG_PANEL_ITEM( msgU, msgL, BLUE ) );
}
#endif #endif
} }

View File

@ -234,7 +234,7 @@ class SCH_SHEET : public SCH_ITEM
KIGFX::COLOR4D m_backgroundColor; KIGFX::COLOR4D m_backgroundColor;
public: public:
SCH_SHEET( const wxPoint& pos = wxPoint( 0, 0 ) ); SCH_SHEET( EDA_ITEM* aParent = nullptr, const wxPoint& pos = wxPoint( 0, 0 ) );
/** /**
* Copy \a aSheet into a new object. All sheet pins are copied as is except and * Copy \a aSheet into a new object. All sheet pins are copied as is except and
@ -254,8 +254,6 @@ public:
return wxT( "SCH_SHEET" ); return wxT( "SCH_SHEET" );
} }
virtual void SetParent( EDA_ITEM* aSheet ) override;
/** /**
* Return true for items which are moved with the anchor point at mouse cursor * Return true for items which are moved with the anchor point at mouse cursor
* and false for items moved with no reference to anchor. * and false for items moved with no reference to anchor.
@ -281,7 +279,7 @@ public:
wxString GetName() const { return m_fields[ SHEETNAME ].GetText(); } wxString GetName() const { return m_fields[ SHEETNAME ].GetText(); }
SCH_SCREEN* GetScreen() { return m_screen; } SCH_SCREEN* GetScreen() const { return m_screen; }
wxSize GetSize() { return m_size; } wxSize GetSize() { return m_size; }
void SetSize( const wxSize& aSize ) { m_size = aSize; } void SetSize( const wxSize& aSize ) { m_size = aSize; }
@ -307,21 +305,10 @@ public:
*/ */
bool UsesDefaultStroke() const; bool UsesDefaultStroke() const;
/**
* Return the root sheet of this SCH_SHEET object.
*
* The root (top level) sheet can be found by walking up the parent links until the only
* sheet that has no parent is found. The root sheet can be found from any sheet without
* having to maintain a global root sheet pointer.
*
* @return a SCH_SHEET pointer to the root sheet.
*/
SCH_SHEET* GetRootSheet();
/** /**
* @return true if this sheet is the root sheet. * @return true if this sheet is the root sheet.
*/ */
bool IsRootSheet() { return GetRootSheet() == this; } bool IsRootSheet() const;
/** /**
* Set the #SCH_SCREEN associated with this sheet to \a aScreen. * Set the #SCH_SCREEN associated with this sheet to \a aScreen.
@ -494,7 +481,7 @@ public:
* *
* @return the full count of sheets+subsheets contained by "this" * @return the full count of sheets+subsheets contained by "this"
*/ */
int CountSheets(); int CountSheets() const;
/** /**
* Return the filename corresponding to this sheet. * Return the filename corresponding to this sheet.

View File

@ -33,6 +33,7 @@
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <sch_component.h> #include <sch_component.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <schematic.h>
#include <template_fieldnames.h> #include <template_fieldnames.h>
#include <trace_helpers.h> #include <trace_helpers.h>
@ -209,7 +210,7 @@ void SCH_SHEET_PATH::GetComponents( SCH_REFERENCE_LIST& aReferences, bool aInclu
void SCH_SHEET_PATH::GetMultiUnitComponents( SCH_MULTI_UNIT_REFERENCE_MAP& aRefList, void SCH_SHEET_PATH::GetMultiUnitComponents( SCH_MULTI_UNIT_REFERENCE_MAP& aRefList,
bool aIncludePowerSymbols ) bool aIncludePowerSymbols ) const
{ {
for( auto item : LastScreen()->Items().OfType( SCH_COMPONENT_T ) ) for( auto item : LastScreen()->Items().OfType( SCH_COMPONENT_T ) )
{ {
@ -263,7 +264,11 @@ bool SCH_SHEET_PATH::TestForRecursion( const wxString& aSrcFileName, const wxStr
if( m_recursion_test_cache.count( pair ) ) if( m_recursion_test_cache.count( pair ) )
return m_recursion_test_cache.at( pair ); return m_recursion_test_cache.at( pair );
wxFileName rootFn = g_RootSheet->GetFileName(); SCHEMATIC* sch = LastScreen()->Schematic();
wxCHECK_MSG( sch, false, "No SCHEMATIC found in SCH_SHEET_PATH::TestForRecursion!" );
wxFileName rootFn = sch->GetFileName();
wxFileName srcFn = aSrcFileName; wxFileName srcFn = aSrcFileName;
wxFileName destFn = aDestFileName; wxFileName destFn = aDestFileName;
@ -335,8 +340,6 @@ bool SCH_SHEET_PATH::TestForRecursion( const wxString& aSrcFileName, const wxStr
SCH_SHEET_LIST::SCH_SHEET_LIST( SCH_SHEET* aSheet ) SCH_SHEET_LIST::SCH_SHEET_LIST( SCH_SHEET* aSheet )
{ {
m_isRootSheet = false;
if( aSheet != NULL ) if( aSheet != NULL )
BuildSheetList( aSheet ); BuildSheetList( aSheet );
} }
@ -348,9 +351,6 @@ void SCH_SHEET_LIST::BuildSheetList( SCH_SHEET* aSheet )
std::vector<SCH_SHEET*> badSheets; std::vector<SCH_SHEET*> badSheets;
if( aSheet == g_RootSheet )
m_isRootSheet = true;
m_currentSheetPath.push_back( aSheet ); m_currentSheetPath.push_back( aSheet );
/** /**
@ -432,7 +432,9 @@ SCH_ITEM* SCH_SHEET_LIST::GetItem( const KIID& aID, SCH_SHEET_PATH* aPathOut )
{ {
if( aItem->m_Uuid == aID ) if( aItem->m_Uuid == aID )
{ {
if( aPathOut )
*aPathOut = sheet; *aPathOut = sheet;
return aItem; return aItem;
} }
else if( aItem->Type() == SCH_COMPONENT_T ) else if( aItem->Type() == SCH_COMPONENT_T )
@ -443,7 +445,9 @@ SCH_ITEM* SCH_SHEET_LIST::GetItem( const KIID& aID, SCH_SHEET_PATH* aPathOut )
{ {
if( field.m_Uuid == aID ) if( field.m_Uuid == aID )
{ {
if( aPathOut )
*aPathOut = sheet; *aPathOut = sheet;
return &field; return &field;
} }
} }
@ -452,7 +456,9 @@ SCH_ITEM* SCH_SHEET_LIST::GetItem( const KIID& aID, SCH_SHEET_PATH* aPathOut )
{ {
if( pin->m_Uuid == aID ) if( pin->m_Uuid == aID )
{ {
if( aPathOut )
*aPathOut = sheet; *aPathOut = sheet;
return pin; return pin;
} }
} }
@ -465,6 +471,7 @@ SCH_ITEM* SCH_SHEET_LIST::GetItem( const KIID& aID, SCH_SHEET_PATH* aPathOut )
{ {
if( field.m_Uuid == aID ) if( field.m_Uuid == aID )
{ {
if( aPathOut )
*aPathOut = sheet; *aPathOut = sheet;
return &field; return &field;
} }
@ -474,7 +481,9 @@ SCH_ITEM* SCH_SHEET_LIST::GetItem( const KIID& aID, SCH_SHEET_PATH* aPathOut )
{ {
if( pin->m_Uuid == aID ) if( pin->m_Uuid == aID )
{ {
if( aPathOut )
*aPathOut = sheet; *aPathOut = sheet;
return pin; return pin;
} }
} }
@ -595,16 +604,17 @@ void SCH_SHEET_LIST::AnnotatePowerSymbols()
void SCH_SHEET_LIST::GetComponents( SCH_REFERENCE_LIST& aReferences, bool aIncludePowerSymbols, void SCH_SHEET_LIST::GetComponents( SCH_REFERENCE_LIST& aReferences, bool aIncludePowerSymbols,
bool aForceIncludeOrphanComponents ) bool aForceIncludeOrphanComponents ) const
{ {
for( SCH_SHEET_PATH& sheet : *this ) for( const SCH_SHEET_PATH& sheet : *this )
sheet.GetComponents( aReferences, aIncludePowerSymbols, aForceIncludeOrphanComponents ); sheet.GetComponents( aReferences, aIncludePowerSymbols, aForceIncludeOrphanComponents );
} }
void SCH_SHEET_LIST::GetMultiUnitComponents( SCH_MULTI_UNIT_REFERENCE_MAP &aRefList, void SCH_SHEET_LIST::GetMultiUnitComponents( SCH_MULTI_UNIT_REFERENCE_MAP &aRefList,
bool aIncludePowerSymbols ) bool aIncludePowerSymbols ) const
{ {
for( SCH_SHEET_PATHS_ITER it = begin(); it != end(); ++it ) for( SCH_SHEET_PATHS::const_iterator it = begin(); it != end(); ++it )
{ {
SCH_MULTI_UNIT_REFERENCE_MAP tempMap; SCH_MULTI_UNIT_REFERENCE_MAP tempMap;
(*it).GetMultiUnitComponents( tempMap ); (*it).GetMultiUnitComponents( tempMap );
@ -638,7 +648,14 @@ bool SCH_SHEET_LIST::SetComponentFootprint( const wxString& aReference,
bool SCH_SHEET_LIST::TestForRecursion( const SCH_SHEET_LIST& aSrcSheetHierarchy, bool SCH_SHEET_LIST::TestForRecursion( const SCH_SHEET_LIST& aSrcSheetHierarchy,
const wxString& aDestFileName ) const wxString& aDestFileName )
{ {
wxFileName rootFn = g_RootSheet->GetFileName(); if( empty() )
return false;
SCHEMATIC* sch = at( 0 ).LastScreen()->Schematic();
wxCHECK_MSG( sch, false, "No SCHEMATIC found in SCH_SHEET_LIST::TestForRecursion!" );
wxFileName rootFn = sch->GetFileName();
wxFileName destFn = aDestFileName; wxFileName destFn = aDestFileName;
if( destFn.IsRelative() ) if( destFn.IsRelative() )
@ -681,8 +698,6 @@ SCH_SHEET_PATH* SCH_SHEET_LIST::FindSheetForScreen( SCH_SCREEN* aScreen )
void SCH_SHEET_LIST::UpdateSymbolInstances( void SCH_SHEET_LIST::UpdateSymbolInstances(
std::vector<COMPONENT_INSTANCE_REFERENCE>& aSymbolInstances ) std::vector<COMPONENT_INSTANCE_REFERENCE>& aSymbolInstances )
{ {
wxCHECK( m_isRootSheet, /* void */ ); // Only performed for the entire schematic.
SCH_REFERENCE_LIST symbolInstances; SCH_REFERENCE_LIST symbolInstances;
GetComponents( symbolInstances, true, true ); GetComponents( symbolInstances, true, true );
@ -749,95 +764,3 @@ void SCH_SHEET_LIST::ReplaceLegacySheetPaths( const std::vector<KIID_PATH>& aOld
} }
} }
} }
void SHEETLIST_ERC_ITEMS_PROVIDER::SetSeverities( int aSeverities )
{
m_severities = aSeverities;
m_filteredMarkers.clear();
SCH_SHEET_LIST sheetList( g_RootSheet);
for( unsigned i = 0; i < sheetList.size(); i++ )
{
for( SCH_ITEM* aItem : sheetList[i].LastScreen()->Items().OfType( SCH_MARKER_T ) )
{
SCH_MARKER* marker = static_cast<SCH_MARKER*>( aItem );
int markerSeverity;
if( marker->GetMarkerType() != MARKER_BASE::MARKER_ERC )
continue;
if( marker->IsExcluded() )
markerSeverity = RPT_SEVERITY_EXCLUSION;
else
markerSeverity = GetSeverity( marker->GetRCItem()->GetErrorCode() );
if( markerSeverity & m_severities )
m_filteredMarkers.push_back( marker );
}
}
}
int SHEETLIST_ERC_ITEMS_PROVIDER::GetCount( int aSeverity )
{
if( aSeverity < 0 )
return m_filteredMarkers.size();
int count = 0;
SCH_SHEET_LIST sheetList( g_RootSheet);
for( unsigned i = 0; i < sheetList.size(); i++ )
{
for( SCH_ITEM* aItem : sheetList[i].LastScreen()->Items().OfType( SCH_MARKER_T ) )
{
SCH_MARKER* marker = static_cast<SCH_MARKER*>( aItem );
int markerSeverity;
if( marker->GetMarkerType() != MARKER_BASE::MARKER_ERC )
continue;
if( marker->IsExcluded() )
markerSeverity = RPT_SEVERITY_EXCLUSION;
else
markerSeverity = GetSeverity( marker->GetRCItem()->GetErrorCode() );
if( markerSeverity == aSeverity )
count++;
}
}
return count;
}
ERC_ITEM* SHEETLIST_ERC_ITEMS_PROVIDER::GetItem( int aIndex )
{
SCH_MARKER* marker = m_filteredMarkers[ aIndex ];
return marker ? static_cast<ERC_ITEM*>( marker->GetRCItem() ) : nullptr;
}
void SHEETLIST_ERC_ITEMS_PROVIDER::DeleteItem( int aIndex, bool aDeep )
{
SCH_MARKER* marker = m_filteredMarkers[ aIndex ];
m_filteredMarkers.erase( m_filteredMarkers.begin() + aIndex );
if( aDeep )
{
SCH_SCREENS ScreenList;
ScreenList.DeleteMarker( marker );
}
}
void SHEETLIST_ERC_ITEMS_PROVIDER::DeleteAllItems()
{
SCH_SCREENS ScreenList;
ScreenList.DeleteAllMarkers( MARKER_BASE::MARKER_ERC );
m_filteredMarkers.clear();
}

View File

@ -270,7 +270,7 @@ public:
* @param aIncludePowerSymbols : false to only get normal components. * @param aIncludePowerSymbols : false to only get normal components.
*/ */
void GetMultiUnitComponents( SCH_MULTI_UNIT_REFERENCE_MAP &aRefList, void GetMultiUnitComponents( SCH_MULTI_UNIT_REFERENCE_MAP &aRefList,
bool aIncludePowerSymbols = true ); bool aIncludePowerSymbols = true ) const;
/** /**
* Function SetFootprintField * Function SetFootprintField
@ -333,7 +333,6 @@ typedef SCH_SHEET_PATHS::iterator SCH_SHEET_PATHS_ITER;
class SCH_SHEET_LIST : public SCH_SHEET_PATHS class SCH_SHEET_LIST : public SCH_SHEET_PATHS
{ {
private: private:
bool m_isRootSheet;
SCH_SHEET_PATH m_currentSheetPath; SCH_SHEET_PATH m_currentSheetPath;
public: public:
@ -360,7 +359,7 @@ public:
/** /**
* Fetch a SCH_ITEM by ID. Also returns the sheet the item was found on in \a aPathOut. * Fetch a SCH_ITEM by ID. Also returns the sheet the item was found on in \a aPathOut.
*/ */
SCH_ITEM* GetItem( const KIID& aID, SCH_SHEET_PATH* aPathOut ); SCH_ITEM* GetItem( const KIID& aID, SCH_SHEET_PATH* aPathOut = nullptr );
/** /**
* Fill an item cache for temporary use when many items need to be fetched. * Fill an item cache for temporary use when many items need to be fetched.
@ -389,7 +388,7 @@ public:
* The normal option is false, and set to true only to build the full list of components. * The normal option is false, and set to true only to build the full list of components.
*/ */
void GetComponents( SCH_REFERENCE_LIST& aReferences, bool aIncludePowerSymbols = true, void GetComponents( SCH_REFERENCE_LIST& aReferences, bool aIncludePowerSymbols = true,
bool aForceIncludeOrphanComponents = false ); bool aForceIncludeOrphanComponents = false ) const;
/** /**
* Function GetMultiUnitComponents * Function GetMultiUnitComponents
@ -401,7 +400,7 @@ public:
* @param aIncludePowerSymbols Set to false to only get normal components. * @param aIncludePowerSymbols Set to false to only get normal components.
*/ */
void GetMultiUnitComponents( SCH_MULTI_UNIT_REFERENCE_MAP &aRefList, void GetMultiUnitComponents( SCH_MULTI_UNIT_REFERENCE_MAP &aRefList,
bool aIncludePowerSymbols = true ); bool aIncludePowerSymbols = true ) const;
/** /**
* Function SetFootprintField * Function SetFootprintField
@ -451,7 +450,7 @@ public:
/** /**
* Update all of the symbol instance information using \a aSymbolInstances. * Update all of the symbol instance information using \a aSymbolInstances.
* * WARNING: Do not call this on anything other than the full hierarchy.
* @param aSymbolInstances is the symbol path information loaded from the root schematic. * @param aSymbolInstances is the symbol path information loaded from the root schematic.
*/ */
void UpdateSymbolInstances( std::vector<COMPONENT_INSTANCE_REFERENCE>& aSymbolInstances ); void UpdateSymbolInstances( std::vector<COMPONENT_INSTANCE_REFERENCE>& aSymbolInstances );
@ -473,33 +472,4 @@ public:
void ReplaceLegacySheetPaths( const std::vector<KIID_PATH>& aOldSheetPaths ); void ReplaceLegacySheetPaths( const std::vector<KIID_PATH>& aOldSheetPaths );
}; };
/**
* SHEETLIST_ERC_ITEMS_PROVIDER
* is an implementation of the RC_ITEM_LISTinterface which uses the global SHEETLIST
* to fulfill the contract.
*/
class SHEETLIST_ERC_ITEMS_PROVIDER : public RC_ITEMS_PROVIDER
{
private:
int m_severities;
std::vector<SCH_MARKER*> m_filteredMarkers;
public:
SHEETLIST_ERC_ITEMS_PROVIDER() :
m_severities( 0 )
{ }
void SetSeverities( int aSeverities ) override;
int GetCount( int aSeverity = -1 ) override;
ERC_ITEM* GetItem( int aIndex ) override;
void DeleteItem( int aIndex, bool aDeep ) override;
void DeleteAllItems() override;
};
#endif // CLASS_DRAWSHEET_PATH_H #endif // CLASS_DRAWSHEET_PATH_H

View File

@ -41,6 +41,7 @@
#include <math/util.h> // for KiROUND #include <math/util.h> // for KiROUND
#include <kiway.h> #include <kiway.h>
#include <sch_text.h> #include <sch_text.h>
#include <schematic.h>
#include <netlist_object.h> #include <netlist_object.h>
#include <settings/color_settings.h> #include <settings/color_settings.h>
#include <sch_painter.h> #include <sch_painter.h>
@ -474,7 +475,10 @@ wxString SCH_TEXT::GetShownText( int aDepth ) const
{ {
if( token->Contains( ':' ) ) if( token->Contains( ':' ) )
{ {
SCH_SHEET_LIST sheetList( g_RootSheet ); wxCHECK_MSG( Schematic(), wxEmptyString,
"No parent SCHEMATIC set for SCH_TEXT!" );
SCH_SHEET_LIST sheetList = Schematic()->GetSheets();
wxString remainder; wxString remainder;
wxString ref = token->BeforeFirst( ':', &remainder ); wxString ref = token->BeforeFirst( ':', &remainder );
SCH_SHEET_PATH dummy; SCH_SHEET_PATH dummy;
@ -511,10 +515,13 @@ wxString SCH_TEXT::GetShownText( int aDepth ) const
if( processTextVars ) if( processTextVars )
{ {
wxCHECK_MSG( Schematic(), wxEmptyString,
"No parent SCHEMATIC set for SCH_TEXT!" );
PROJECT* project = nullptr; PROJECT* project = nullptr;
if( g_RootSheet && g_RootSheet->GetScreen() ) if( Schematic()->RootScreen() )
project = &g_RootSheet->GetScreen()->Kiway().Prj(); project = &Schematic()->RootScreen()->Kiway().Prj();
if( aDepth < 10 ) if( aDepth < 10 )
text = ExpandTextVars( text, &textResolver, project ); text = ExpandTextVars( text, &textResolver, project );
@ -675,8 +682,13 @@ void SCH_TEXT::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, MSG_PANEL_ITEMS& aList )
aList.push_back( MSG_PANEL_ITEM( _( "Size" ), msg, RED ) ); aList.push_back( MSG_PANEL_ITEM( _( "Size" ), msg, RED ) );
#if defined(DEBUG) #if defined(DEBUG)
if( auto conn = Connection( *g_CurrentSheet ) ) SCH_EDIT_FRAME* schframe = dynamic_cast<SCH_EDIT_FRAME*>( aFrame );
if( schframe )
{
if( auto conn = Connection( schframe->GetCurrentSheet() ) )
conn->AppendDebugInfoToMsgPanel( aList ); conn->AppendDebugInfoToMsgPanel( aList );
}
msg.Printf( "%p", this ); msg.Printf( "%p", this );
aList.push_back( MSG_PANEL_ITEM( "Object Address", msg, RED ) ); aList.push_back( MSG_PANEL_ITEM( "Object Address", msg, RED ) );
@ -727,13 +739,17 @@ bool SCH_LABEL::IsType( const KICAD_T aScanTypes[] ) const
if( SCH_ITEM::IsType( aScanTypes ) ) if( SCH_ITEM::IsType( aScanTypes ) )
return true; return true;
wxCHECK_MSG( Schematic(), false, "No parent SCHEMATIC set for SCH_LABEL!" );
SCH_SHEET_PATH current = Schematic()->CurrentSheet();
for( const KICAD_T* p = aScanTypes; *p != EOT; ++p ) for( const KICAD_T* p = aScanTypes; *p != EOT; ++p )
{ {
if( *p == SCH_LABEL_LOCATE_WIRE_T ) if( *p == SCH_LABEL_LOCATE_WIRE_T )
{ {
wxASSERT( m_connected_items.count( *g_CurrentSheet ) ); wxASSERT( m_connected_items.count( current ) );
for( SCH_ITEM* connection : m_connected_items.at( *g_CurrentSheet ) ) for( SCH_ITEM* connection : m_connected_items.at( current ) )
{ {
if( connection->IsType( wireTypes ) ) if( connection->IsType( wireTypes ) )
return true; return true;
@ -741,9 +757,9 @@ bool SCH_LABEL::IsType( const KICAD_T aScanTypes[] ) const
} }
else if ( *p == SCH_LABEL_LOCATE_BUS_T ) else if ( *p == SCH_LABEL_LOCATE_BUS_T )
{ {
wxASSERT( m_connected_items.count( *g_CurrentSheet ) ); wxASSERT( m_connected_items.count( current ) );
for( SCH_ITEM* connection : m_connected_items.at( *g_CurrentSheet ) ) for( SCH_ITEM* connection : m_connected_items.at( current ) )
{ {
if( connection->IsType( busTypes ) ) if( connection->IsType( busTypes ) )
return true; return true;
@ -1097,10 +1113,12 @@ void SCH_HIERLABEL::SetLabelSpinStyle( LABEL_SPIN_STYLE aSpinStyle )
void SCH_HIERLABEL::Print( RENDER_SETTINGS* aSettings, const wxPoint& offset ) void SCH_HIERLABEL::Print( RENDER_SETTINGS* aSettings, const wxPoint& offset )
{ {
wxCHECK_RET( Schematic(), "No parent SCHEMATIC set for SCH_LABEL!" );
static std::vector <wxPoint> Poly; static std::vector <wxPoint> Poly;
wxDC* DC = aSettings->GetPrintDC(); wxDC* DC = aSettings->GetPrintDC();
SCH_CONNECTION* conn = Connection( *g_CurrentSheet ); SCH_CONNECTION* conn = Connection( Schematic()->CurrentSheet() );
bool isBus = conn && conn->IsBus(); bool isBus = conn && conn->IsBus();
COLOR4D color = aSettings->GetLayerColor( isBus ? LAYER_BUS : m_Layer ); COLOR4D color = aSettings->GetLayerColor( isBus ? LAYER_BUS : m_Layer );
int penWidth = std::max( GetPenWidth(), aSettings->GetDefaultPenWidth() ); int penWidth = std::max( GetPenWidth(), aSettings->GetDefaultPenWidth() );

203
eeschema/schematic.cpp Normal file
View File

@ -0,0 +1,203 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <bus_alias.h>
#include <connection_graph.h>
#include <erc_settings.h>
#include <schematic.h>
#include <sch_screen.h>
#include <sch_marker.h>
SCHEMATIC::SCHEMATIC() :
EDA_ITEM( nullptr, SCHEMATIC_T ),
m_rootSheet( nullptr )
{
m_currentSheet = new SCH_SHEET_PATH();
m_connectionGraph = new CONNECTION_GRAPH( this );
m_ercSettings = new ERC_SETTINGS();
}
SCHEMATIC::~SCHEMATIC()
{
delete m_currentSheet;
delete m_connectionGraph;
delete m_ercSettings;
}
void SCHEMATIC::Reset()
{
delete m_rootSheet;
m_rootSheet = nullptr;
m_connectionGraph->Reset();
m_currentSheet->clear();
}
SCH_SCREEN* SCHEMATIC::RootScreen() const
{
return IsValid() ? m_rootSheet->GetScreen() : nullptr;
}
wxString SCHEMATIC::GetFileName() const
{
return IsValid() ? m_rootSheet->GetScreen()->GetFileName() : wxString( wxEmptyString );
}
std::shared_ptr<BUS_ALIAS> SCHEMATIC::GetBusAlias( const wxString& aLabel ) const
{
for( const auto& sheet : GetSheets() )
{
for( const auto& alias : sheet.LastScreen()->GetBusAliases() )
{
if( alias->GetName() == aLabel )
return alias;
}
}
return nullptr;
}
int SCHEMATIC::GetErcSeverity( int aErrorCode ) const
{
// Special-case pin-to-pin errors:
// Ignore-or-not is controlled by ERCE_PIN_TO_PIN_WARNING (for both)
// Warning-or-error is controlled by which errorCode it is
if( aErrorCode == ERCE_PIN_TO_PIN_ERROR )
{
if( m_ercSettings->m_Severities[ ERCE_PIN_TO_PIN_WARNING ] == RPT_SEVERITY_IGNORE )
return RPT_SEVERITY_IGNORE;
else
return RPT_SEVERITY_ERROR;
}
else if( aErrorCode == ERCE_PIN_TO_PIN_WARNING )
{
if( m_ercSettings->m_Severities[ ERCE_PIN_TO_PIN_WARNING ] == RPT_SEVERITY_IGNORE )
return RPT_SEVERITY_IGNORE;
else
return RPT_SEVERITY_WARNING;
}
return m_ercSettings->m_Severities[ aErrorCode ];
}
void SCHEMATIC::SetErcSeverity( int aErrorCode, int aSeverity )
{
m_ercSettings->m_Severities[ aErrorCode ] = aSeverity;
}
void SHEETLIST_ERC_ITEMS_PROVIDER::SetSeverities( int aSeverities )
{
m_severities = aSeverities;
m_filteredMarkers.clear();
SCH_SHEET_LIST sheetList = m_schematic->GetSheets();
for( unsigned i = 0; i < sheetList.size(); i++ )
{
for( SCH_ITEM* aItem : sheetList[i].LastScreen()->Items().OfType( SCH_MARKER_T ) )
{
SCH_MARKER* marker = static_cast<SCH_MARKER*>( aItem );
int markerSeverity;
if( marker->GetMarkerType() != MARKER_BASE::MARKER_ERC )
continue;
if( marker->IsExcluded() )
markerSeverity = RPT_SEVERITY_EXCLUSION;
else
markerSeverity = m_schematic->GetErcSeverity( marker->GetRCItem()->GetErrorCode() );
if( markerSeverity & m_severities )
m_filteredMarkers.push_back( marker );
}
}
}
int SHEETLIST_ERC_ITEMS_PROVIDER::GetCount( int aSeverity )
{
if( aSeverity < 0 )
return m_filteredMarkers.size();
int count = 0;
SCH_SHEET_LIST sheetList = m_schematic->GetSheets();
for( unsigned i = 0; i < sheetList.size(); i++ )
{
for( SCH_ITEM* aItem : sheetList[i].LastScreen()->Items().OfType( SCH_MARKER_T ) )
{
SCH_MARKER* marker = static_cast<SCH_MARKER*>( aItem );
int markerSeverity;
if( marker->GetMarkerType() != MARKER_BASE::MARKER_ERC )
continue;
if( marker->IsExcluded() )
markerSeverity = RPT_SEVERITY_EXCLUSION;
else
markerSeverity = m_schematic->GetErcSeverity( marker->GetRCItem()->GetErrorCode() );
if( markerSeverity == aSeverity )
count++;
}
}
return count;
}
ERC_ITEM* SHEETLIST_ERC_ITEMS_PROVIDER::GetItem( int aIndex )
{
SCH_MARKER* marker = m_filteredMarkers[ aIndex ];
return marker ? static_cast<ERC_ITEM*>( marker->GetRCItem() ) : nullptr;
}
void SHEETLIST_ERC_ITEMS_PROVIDER::DeleteItem( int aIndex, bool aDeep )
{
SCH_MARKER* marker = m_filteredMarkers[ aIndex ];
m_filteredMarkers.erase( m_filteredMarkers.begin() + aIndex );
if( aDeep )
{
SCH_SCREENS screens( m_schematic->Root() );
screens.DeleteMarker( marker );
}
}
void SHEETLIST_ERC_ITEMS_PROVIDER::DeleteAllItems()
{
SCH_SCREENS screens( m_schematic->Root() );
screens.DeleteAllMarkers( MARKER_BASE::MARKER_ERC );
m_filteredMarkers.clear();
}

179
eeschema/schematic.h Normal file
View File

@ -0,0 +1,179 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef KICAD_SCHEMATIC_H
#define KICAD_SCHEMATIC_H
#include <base_struct.h>
#include <sch_sheet_path.h>
class BUS_ALIAS;
class CONNECTION_GRAPH;
class EDA_BASE_FRAME;
class ERC_SETTINGS;
class SCH_SCREEN;
class SCH_SHEET;
/**
* Holds all the data relating to one schematic
* A schematic may consist of one or more sheets (and one root sheet)
* Right now, eeschema can have only one schematic open at a time, but this could change.
* Please keep this possibility in mind when adding to this object.
*/
class SCHEMATIC : public EDA_ITEM
{
friend class SCH_EDIT_FRAME;
private:
/// The top-level sheet in this schematic hierarchy (or potentially the only one)
SCH_SHEET* m_rootSheet;
/**
* The sheet path of the sheet currently being edited or displayed.
* Note that this was moved here from SCH_EDIT_FRAME because currently many places in the code
* want to know the current sheet. Potentially this can be moved back to the UI code once
* the only places that want to know it are UI-related
*/
SCH_SHEET_PATH* m_currentSheet;
/// Holds and calculates connectivity information of this schematic
CONNECTION_GRAPH* m_connectionGraph;
/// Holds this schematic's ERC settings
// TODO: This should be moved to project settings, not schematic
ERC_SETTINGS* m_ercSettings;
public:
SCHEMATIC();
~SCHEMATIC();
virtual wxString GetClass() const override
{
return wxT( "SCHEMATIC" );
}
/// Initializes this schematic to a blank one, unloading anything existing
void Reset();
/**
* Builds and returns an updated schematic hierarchy
* TODO: can this be cached?
* @return a SCH_SHEET_LIST containing the schematic hierarchy
*/
SCH_SHEET_LIST GetSheets() const
{
return SCH_SHEET_LIST( m_rootSheet );
}
SCH_SHEET& Root() const
{
return *m_rootSheet;
}
void SetRoot( SCH_SHEET* aRootSheet )
{
m_rootSheet = aRootSheet;
}
/// A simple test if the schematic is loaded, not a complete one
bool IsValid() const
{
return m_rootSheet != nullptr;
}
/// Helper to retreive the screen of the root sheet
SCH_SCREEN* RootScreen() const;
/// Helper to retrieve the filename from the root sheet screen
wxString GetFileName() const;
SCH_SHEET_PATH& CurrentSheet() const
{
return *m_currentSheet;
}
void SetCurrentSheet( const SCH_SHEET_PATH& aPath )
{
*m_currentSheet = aPath;
}
CONNECTION_GRAPH* ConnectionGraph() const
{
return m_connectionGraph;
}
/**
* Returns a pointer to a bus alias object for the given label,
* or null if one doesn't exist
*/
std::shared_ptr<BUS_ALIAS> GetBusAlias( const wxString& aLabel ) const;
ERC_SETTINGS* ErcSettings() const
{
return m_ercSettings;
}
// TODO(JE) Move out of SCHEMATIC
int GetErcSeverity( int aErrorCode ) const;
// TODO(JE) Move out of SCHEMATIC
void SetErcSeverity( int aErrorCode, int aSeverity );
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const override {}
#endif
};
/**
* SHEETLIST_ERC_ITEMS_PROVIDER
* is an implementation of the RC_ITEM_LISTinterface which uses the global SHEETLIST
* to fulfill the contract.
*/
class SHEETLIST_ERC_ITEMS_PROVIDER : public RC_ITEMS_PROVIDER
{
private:
SCHEMATIC* m_schematic;
int m_severities;
std::vector<SCH_MARKER*> m_filteredMarkers;
public:
SHEETLIST_ERC_ITEMS_PROVIDER( SCHEMATIC* aSchematic ) :
m_schematic( aSchematic ),
m_severities( 0 )
{ }
void SetSeverities( int aSeverities ) override;
int GetCount( int aSeverity = -1 ) override;
ERC_ITEM* GetItem( int aIndex ) override;
void DeleteItem( int aIndex, bool aDeep ) override;
void DeleteAllItems() override;
};
#endif

View File

@ -36,6 +36,7 @@
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <sch_view.h> #include <sch_view.h>
#include <sch_painter.h> #include <sch_painter.h>
#include <schematic.h>
#include <symbol_lib_table.h> #include <symbol_lib_table.h>
#include <dialogs/dialog_sch_sheet_props.h> #include <dialogs/dialog_sch_sheet_props.h>
#include <dialogs/dialog_edit_sheet_pin.h> #include <dialogs/dialog_edit_sheet_pin.h>
@ -47,7 +48,7 @@ bool SCH_EDIT_FRAME::CheckSheetForRecursion( SCH_SHEET* aSheet, SCH_SHEET_PATH*
wxASSERT( aSheet && aHierarchy ); wxASSERT( aSheet && aHierarchy );
wxString msg; wxString msg;
SCH_SHEET_LIST hierarchy( g_RootSheet ); // This is the full schematic sheet hierarchy. SCH_SHEET_LIST hierarchy = Schematic().GetSheets(); // The full schematic sheet hierarchy.
SCH_SHEET_LIST sheetHierarchy( aSheet ); // This is the hierarchy of the loaded file. SCH_SHEET_LIST sheetHierarchy( aSheet ); // This is the hierarchy of the loaded file.
wxFileName destFile = aHierarchy->LastScreen()->GetFileName(); wxFileName destFile = aHierarchy->LastScreen()->GetFileName();
@ -113,7 +114,7 @@ bool SCH_EDIT_FRAME::LoadSheetFromFile( SCH_SHEET* aSheet, SCH_SHEET_PATH* aHier
SCH_SCREEN* currentScreen = aHierarchy->LastScreen(); SCH_SCREEN* currentScreen = aHierarchy->LastScreen();
SCH_IO_MGR::SCH_FILE_T schFileType = SCH_IO_MGR::GuessPluginTypeFromSchPath( aFileName ); SCH_IO_MGR::SCH_FILE_T schFileType = SCH_IO_MGR::GuessPluginTypeFromSchPath( aFileName );
SCH_PLUGIN::SCH_PLUGIN_RELEASER pi( SCH_IO_MGR::FindPlugin( schFileType ) ); SCH_PLUGIN::SCH_PLUGIN_RELEASER pi( SCH_IO_MGR::FindPlugin( schFileType ) );
std::unique_ptr< SCH_SHEET> newSheet( new SCH_SHEET ); std::unique_ptr< SCH_SHEET> newSheet( new SCH_SHEET( &Schematic() ) );
// This will cause the sheet UUID to be set to the loaded schematic UUID. This is required // This will cause the sheet UUID to be set to the loaded schematic UUID. This is required
// to ensure all of the sheet paths in any subsheets are correctly generated. // to ensure all of the sheet paths in any subsheets are correctly generated.
@ -133,12 +134,12 @@ bool SCH_EDIT_FRAME::LoadSheetFromFile( SCH_SHEET* aSheet, SCH_SHEET_PATH* aHier
{ {
if( aSheet->GetScreen() != nullptr ) if( aSheet->GetScreen() != nullptr )
{ {
newSheet.reset( pi->Load( fullFilename, &Kiway() ) ); newSheet.reset( pi->Load( fullFilename, &Kiway(), &Schematic() ) );
} }
else else
{ {
newSheet->SetFileName( fullFilename ); newSheet->SetFileName( fullFilename );
pi->Load( fullFilename, &Kiway(), newSheet.get() ); pi->Load( fullFilename, &Kiway(), &Schematic(), newSheet.get() );
} }
if( !pi->GetError().IsEmpty() ) if( !pi->GetError().IsEmpty() )
@ -209,7 +210,7 @@ bool SCH_EDIT_FRAME::LoadSheetFromFile( SCH_SHEET* aSheet, SCH_SHEET_PATH* aHier
} }
// Make sure any new sheet changes do not cause any recursion issues. // Make sure any new sheet changes do not cause any recursion issues.
SCH_SHEET_LIST hierarchy( g_RootSheet ); // This is the schematic sheet hierarchy. SCH_SHEET_LIST hierarchy = Schematic().GetSheets(); // This is the schematic sheet hierarchy.
SCH_SHEET_LIST sheetHierarchy( newSheet.get() ); // This is the hierarchy of the loaded file. SCH_SHEET_LIST sheetHierarchy( newSheet.get() ); // This is the hierarchy of the loaded file.
if( CheckSheetForRecursion( newSheet.get(), aHierarchy ) if( CheckSheetForRecursion( newSheet.get(), aHierarchy )
@ -221,7 +222,7 @@ bool SCH_EDIT_FRAME::LoadSheetFromFile( SCH_SHEET* aSheet, SCH_SHEET_PATH* aHier
wxArrayString names; wxArrayString names;
wxArrayString newLibNames; wxArrayString newLibNames;
SCH_SCREENS newScreens( newSheet.get() ); // All screens associated with the import. SCH_SCREENS newScreens( newSheet.get() ); // All screens associated with the import.
SCH_SCREENS prjScreens( g_RootSheet ); SCH_SCREENS prjScreens( &Schematic().Root() );
newScreens.GetLibNicknames( names ); newScreens.GetLibNicknames( names );
@ -471,7 +472,7 @@ bool SCH_EDIT_FRAME::LoadSheetFromFile( SCH_SHEET* aSheet, SCH_SHEET_PATH* aHier
else else
aSheet->GetScreen()->Append( newScreen ); aSheet->GetScreen()->Append( newScreen );
SCH_SCREENS allScreens; SCH_SCREENS allScreens( Schematic().Root() );
allScreens.ReplaceDuplicateTimeStamps(); allScreens.ReplaceDuplicateTimeStamps();
return true; return true;
@ -628,7 +629,7 @@ void SCH_EDIT_FRAME::DrawCurrentSheetToClipboard()
bool SCH_EDIT_FRAME::AllowCaseSensitiveFileNameClashes( const wxString& aSchematicFileName ) bool SCH_EDIT_FRAME::AllowCaseSensitiveFileNameClashes( const wxString& aSchematicFileName )
{ {
wxString msg; wxString msg;
SCH_SCREENS screens; SCH_SCREENS screens( Schematic().Root() );
wxFileName fn = aSchematicFileName; wxFileName fn = aSchematicFileName;
wxCHECK( fn.IsAbsolute(), false ); wxCHECK( fn.IsAbsolute(), false );

View File

@ -46,8 +46,9 @@ struct SPICE_DC_PARAMS
class NETLIST_EXPORTER_PSPICE_SIM : public NETLIST_EXPORTER_PSPICE class NETLIST_EXPORTER_PSPICE_SIM : public NETLIST_EXPORTER_PSPICE
{ {
public: public:
NETLIST_EXPORTER_PSPICE_SIM( NETLIST_OBJECT_LIST* aMasterList, PROJECT* aProject = nullptr ) : NETLIST_EXPORTER_PSPICE_SIM( NETLIST_OBJECT_LIST* aMasterList, SCHEMATIC* aSchematic,
NETLIST_EXPORTER_PSPICE( aMasterList, aProject ) PROJECT* aProject = nullptr ) :
NETLIST_EXPORTER_PSPICE( aMasterList, aSchematic, aProject )
{ {
} }

View File

@ -672,7 +672,8 @@ void SIM_PLOT_FRAME::removePlot( const wxString& aPlotName, bool aErase )
void SIM_PLOT_FRAME::updateNetlistExporter() void SIM_PLOT_FRAME::updateNetlistExporter()
{ {
m_exporter.reset( new NETLIST_EXPORTER_PSPICE_SIM( m_schematicFrame->BuildNetListBase(), &Prj() ) ); m_exporter.reset( new NETLIST_EXPORTER_PSPICE_SIM(
m_schematicFrame->BuildNetListBase(), &m_schematicFrame->Schematic(), &Prj() ) );
} }

View File

@ -35,6 +35,7 @@
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <sch_component.h> #include <sch_component.h>
#include <sch_reference_list.h> #include <sch_reference_list.h>
#include <schematic.h>
#include <dsnlexer.h> #include <dsnlexer.h>
#include <ptree.h> #include <ptree.h>
#include <boost/property_tree/ptree.hpp> #include <boost/property_tree/ptree.hpp>
@ -46,7 +47,7 @@ void SCH_EDITOR_CONTROL::BackAnnotateFootprints( const std::string& aChangedSetO
{ {
// Build a flat list of components in schematic: // Build a flat list of components in schematic:
SCH_REFERENCE_LIST refs; SCH_REFERENCE_LIST refs;
SCH_SHEET_LIST sheets( g_RootSheet ); SCH_SHEET_LIST sheets = m_frame->Schematic().GetSheets();
bool isChanged = false; bool isChanged = false;
sheets.GetComponents( refs, false ); sheets.GetComponents( refs, false );
@ -127,7 +128,7 @@ bool SCH_EDITOR_CONTROL::processCmpToFootprintLinkFile( const wxString& aFullFil
{ {
// Build a flat list of components in schematic: // Build a flat list of components in schematic:
SCH_REFERENCE_LIST referencesList; SCH_REFERENCE_LIST referencesList;
SCH_SHEET_LIST sheetList( g_RootSheet ); SCH_SHEET_LIST sheetList = m_frame->Schematic().GetSheets();
sheetList.GetComponents( referencesList, false ); sheetList.GetComponents( referencesList, false );

View File

@ -37,6 +37,7 @@
#include <reporter.h> #include <reporter.h>
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <schematic.h>
#include <utf8.h> #include <utf8.h>
@ -68,7 +69,7 @@ bool BACK_ANNOTATE::BackAnnotateSymbols( const std::string& aNetlist )
int errors = getPcbModulesFromString( aNetlist ); int errors = getPcbModulesFromString( aNetlist );
SCH_SHEET_LIST sheets( g_RootSheet ); SCH_SHEET_LIST sheets = m_frame->Schematic().GetSheets();
sheets.GetComponents( m_refs, false ); sheets.GetComponents( m_refs, false );
sheets.GetMultiUnitComponents( m_multiUnitsRefs ); sheets.GetMultiUnitComponents( m_multiUnitsRefs );

View File

@ -43,6 +43,7 @@
#include <sch_item.h> #include <sch_item.h>
#include <sch_line.h> #include <sch_line.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <schematic.h>
#include <tool/tool_event.h> #include <tool/tool_event.h>
#include <tool/tool_manager.h> #include <tool/tool_manager.h>
#include <tools/sch_line_wire_bus_tool.h> #include <tools/sch_line_wire_bus_tool.h>
@ -163,11 +164,20 @@ bool EE_SELECTION_TOOL::Init()
auto schEditCondition = [this] ( const SELECTION& aSel ) { auto schEditCondition = [this] ( const SELECTION& aSel ) {
return !m_isLibEdit && !m_isLibView; return !m_isLibEdit && !m_isLibView;
}; };
auto belowRootSheetCondition = [this] ( const SELECTION& aSel ) { auto belowRootSheetCondition =
return !m_isLibEdit && !m_isLibView && g_CurrentSheet->Last() != g_RootSheet; [&]( const SELECTION& aSel )
{
SCH_EDIT_FRAME* schEditFrame = dynamic_cast<SCH_EDIT_FRAME*>( m_frame );
return ( schEditFrame&&
schEditFrame->GetCurrentSheet().Last() !=
&schEditFrame->Schematic().Root() );
}; };
auto havePartCondition = [ this ] ( const SELECTION& sel ) {
return m_isLibEdit && ( (LIB_EDIT_FRAME*) m_frame )->GetCurPart(); auto havePartCondition =
[&]( const SELECTION& sel )
{
return m_isLibEdit && libEditFrame->GetCurPart();
}; };
auto& menu = m_menu.GetMenu(); auto& menu = m_menu.GetMenu();
@ -315,7 +325,8 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
// Single click? Select single object // Single click? Select single object
if( evt->IsClick( BUT_LEFT ) ) if( evt->IsClick( BUT_LEFT ) )
{ {
m_frame->FocusOnItem( nullptr ); if( auto schframe = dynamic_cast<SCH_EDIT_FRAME*>( m_frame ) )
schframe->FocusOnItem( nullptr );
SelectPoint( evt->Position(), EE_COLLECTOR::AllItems, nullptr, false, SelectPoint( evt->Position(), EE_COLLECTOR::AllItems, nullptr, false,
m_additive, m_subtractive, m_exclusive_or ); m_additive, m_subtractive, m_exclusive_or );
@ -341,7 +352,8 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
// double click? Display the properties window // double click? Display the properties window
else if( evt->IsDblClick( BUT_LEFT ) ) else if( evt->IsDblClick( BUT_LEFT ) )
{ {
m_frame->FocusOnItem( nullptr ); if( auto schframe = dynamic_cast<SCH_EDIT_FRAME*>( m_frame ) )
schframe->FocusOnItem( nullptr );
if( m_selection.Empty() ) if( m_selection.Empty() )
SelectPoint( evt->Position()); SelectPoint( evt->Position());
@ -357,7 +369,8 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
// drag with LMB? Select multiple objects (or at least draw a selection box) or drag them // drag with LMB? Select multiple objects (or at least draw a selection box) or drag them
else if( evt->IsDrag( BUT_LEFT ) ) else if( evt->IsDrag( BUT_LEFT ) )
{ {
m_frame->FocusOnItem( nullptr ); if( auto schframe = dynamic_cast<SCH_EDIT_FRAME*>( m_frame ) )
schframe->FocusOnItem( nullptr );
if( m_additive || m_subtractive || m_exclusive_or || m_frame->GetDragSelects() ) if( m_additive || m_subtractive || m_exclusive_or || m_frame->GetDragSelects() )
{ {
@ -412,14 +425,16 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
else if( evt->IsCancelInteractive() ) else if( evt->IsCancelInteractive() )
{ {
m_frame->FocusOnItem( nullptr ); if( auto schframe = dynamic_cast<SCH_EDIT_FRAME*>( m_frame ) )
schframe->FocusOnItem( nullptr );
ClearSelection(); ClearSelection();
} }
else if( evt->Action() == TA_UNDO_REDO_PRE ) else if( evt->Action() == TA_UNDO_REDO_PRE )
{ {
m_frame->FocusOnItem( nullptr ); if( auto schframe = dynamic_cast<SCH_EDIT_FRAME*>( m_frame ) )
schframe->FocusOnItem( nullptr );
ClearSelection(); ClearSelection();
} }
@ -1244,7 +1259,10 @@ void EE_SELECTION_TOOL::highlight( EDA_ITEM* aItem, int aMode, EE_SELECTION* aGr
// represented in the LIB_PART and will inherit the settings of the parent component.) // represented in the LIB_PART and will inherit the settings of the parent component.)
if( itemType == SCH_COMPONENT_T ) if( itemType == SCH_COMPONENT_T )
{ {
SCH_PIN_PTRS pins = static_cast<SCH_COMPONENT*>( aItem )->GetSchPins( g_CurrentSheet ); if( auto schframe = dynamic_cast<SCH_EDIT_FRAME*>( m_frame ) )
{
SCH_PIN_PTRS pins = static_cast<SCH_COMPONENT*>( aItem )->GetSchPins(
&schframe->GetCurrentSheet() );
for( SCH_PIN* pin : pins ) for( SCH_PIN* pin : pins )
{ {
@ -1253,6 +1271,7 @@ void EE_SELECTION_TOOL::highlight( EDA_ITEM* aItem, int aMode, EE_SELECTION* aGr
else if( aMode == BRIGHTENED ) else if( aMode == BRIGHTENED )
pin->SetBrightened(); pin->SetBrightened();
} }
}
for( SCH_FIELD& field : static_cast<SCH_COMPONENT*>( aItem )->GetFields() ) for( SCH_FIELD& field : static_cast<SCH_COMPONENT*>( aItem )->GetFields() )
{ {
@ -1304,7 +1323,10 @@ void EE_SELECTION_TOOL::unhighlight( EDA_ITEM* aItem, int aMode, EE_SELECTION* a
// represented in the LIB_PART.) // represented in the LIB_PART.)
if( itemType == SCH_COMPONENT_T ) if( itemType == SCH_COMPONENT_T )
{ {
SCH_PIN_PTRS pins = static_cast<SCH_COMPONENT*>( aItem )->GetSchPins( g_CurrentSheet ); if( auto schframe = dynamic_cast<SCH_EDIT_FRAME*>( m_frame ) )
{
SCH_PIN_PTRS pins = static_cast<SCH_COMPONENT*>( aItem )->GetSchPins(
&schframe->GetCurrentSheet() );
for( SCH_PIN* pin : pins ) for( SCH_PIN* pin : pins )
{ {
@ -1313,6 +1335,7 @@ void EE_SELECTION_TOOL::unhighlight( EDA_ITEM* aItem, int aMode, EE_SELECTION* a
else if( aMode == BRIGHTENED ) else if( aMode == BRIGHTENED )
pin->ClearBrightened(); pin->ClearBrightened();
} }
}
for( SCH_FIELD& field : static_cast<SCH_COMPONENT*>( aItem )->GetFields() ) for( SCH_FIELD& field : static_cast<SCH_COMPONENT*>( aItem )->GetFields() )
{ {

View File

@ -442,7 +442,8 @@ int LIB_CONTROL::AddSymbolToSchematic( const TOOL_EVENT& aEvent )
wxCHECK( part->GetLibId().IsValid(), 0 ); wxCHECK( part->GetLibId().IsValid(), 0 );
SCH_COMPONENT* comp = new SCH_COMPONENT( *part, libId, g_CurrentSheet, unit, convert ); SCH_COMPONENT* comp =
new SCH_COMPONENT( *part, libId, &schframe->GetCurrentSheet(), unit, convert );
if( schframe->eeconfig()->m_AutoplaceFields.enable ) if( schframe->eeconfig()->m_AutoplaceFields.enable )
comp->AutoplaceFields( /* aScreen */ nullptr, /* aManual */ false ); comp->AutoplaceFields( /* aScreen */ nullptr, /* aManual */ false );

View File

@ -43,6 +43,7 @@
#include <sch_text.h> #include <sch_text.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_bitmap.h> #include <sch_bitmap.h>
#include <schematic.h>
#include <class_library.h> #include <class_library.h>
#include <eeschema_settings.h> #include <eeschema_settings.h>
@ -56,8 +57,10 @@ bool SCH_DRAWING_TOOLS::Init()
{ {
EE_TOOL_BASE::Init(); EE_TOOL_BASE::Init();
auto belowRootSheetCondition = [] ( const SELECTION& aSel ) { auto belowRootSheetCondition =
return g_CurrentSheet->Last() != g_RootSheet; [&]( const SELECTION& aSel )
{
return m_frame->GetCurrentSheet().Last() != &m_frame->Schematic().Root();
}; };
auto& ctxMenu = m_menu.GetMenu(); auto& ctxMenu = m_menu.GetMenu();
@ -171,7 +174,8 @@ int SCH_DRAWING_TOOLS::PlaceComponent( const TOOL_EVENT& aEvent )
if( !part ) if( !part )
continue; continue;
component = new SCH_COMPONENT( *part, g_CurrentSheet, sel, (wxPoint) cursorPos ); component = new SCH_COMPONENT(
*part, &m_frame->GetCurrentSheet(), sel, (wxPoint) cursorPos );
component->SetFlags( IS_NEW | IS_MOVED ); component->SetFlags( IS_NEW | IS_MOVED );
if( m_frame->eeconfig()->m_AutoplaceFields.enable ) if( m_frame->eeconfig()->m_AutoplaceFields.enable )
@ -218,7 +222,7 @@ int SCH_DRAWING_TOOLS::PlaceComponent( const TOOL_EVENT& aEvent )
next_comp = static_cast<SCH_COMPONENT*>( component->Duplicate() ); next_comp = static_cast<SCH_COMPONENT*>( component->Duplicate() );
next_comp->SetFlags( IS_NEW | IS_MOVED ); next_comp->SetFlags( IS_NEW | IS_MOVED );
next_comp->SetUnit( new_unit ); next_comp->SetUnit( new_unit );
next_comp->SetUnitSelection( g_CurrentSheet, new_unit ); next_comp->SetUnitSelection( &m_frame->GetCurrentSheet(), new_unit );
if( m_frame->eeconfig()->m_AutoplaceFields.enable ) if( m_frame->eeconfig()->m_AutoplaceFields.enable )
component->AutoplaceFields( /* aScreen */ NULL, /* aManual */ false ); component->AutoplaceFields( /* aScreen */ NULL, /* aManual */ false );
@ -838,9 +842,9 @@ int SCH_DRAWING_TOOLS::DrawSheet( const TOOL_EVENT& aEvent )
m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true ); m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
sheet = new SCH_SHEET( (wxPoint) cursorPos ); sheet = new SCH_SHEET(
m_frame->GetCurrentSheet().Last(), static_cast<wxPoint>( cursorPos ) );
sheet->SetFlags( IS_NEW | IS_RESIZED ); sheet->SetFlags( IS_NEW | IS_RESIZED );
sheet->SetParent( m_frame->GetCurrentSheet().Last() );
sheet->SetScreen( NULL ); sheet->SetScreen( NULL );
sheet->SetBorderWidth( m_frame->GetDefaultLineWidth() ); sheet->SetBorderWidth( m_frame->GetDefaultLineWidth() );
sheet->SetBorderColor( cfg->m_Drawing.default_sheet_border_color ); sheet->SetBorderColor( cfg->m_Drawing.default_sheet_border_color );
@ -858,7 +862,8 @@ int SCH_DRAWING_TOOLS::DrawSheet( const TOOL_EVENT& aEvent )
getViewControls()->SetAutoPan( false ); getViewControls()->SetAutoPan( false );
getViewControls()->CaptureCursor( false ); getViewControls()->CaptureCursor( false );
if( m_frame->EditSheetProperties((SCH_SHEET*) sheet, g_CurrentSheet, nullptr ) ) if( m_frame->EditSheetProperties(
static_cast<SCH_SHEET*>( sheet ), &m_frame->GetCurrentSheet(), nullptr ) )
{ {
sheet->AutoplaceFields( /* aScreen */ NULL, /* aManual */ false ); sheet->AutoplaceFields( /* aScreen */ NULL, /* aManual */ false );

View File

@ -40,6 +40,7 @@
#include <sch_line.h> #include <sch_line.h>
#include <sch_bus_entry.h> #include <sch_bus_entry.h>
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <schematic.h>
#include <ws_proxy_view_item.h> #include <ws_proxy_view_item.h>
#include <eeschema_id.h> #include <eeschema_id.h>
#include <status_popup.h> #include <status_popup.h>
@ -770,7 +771,7 @@ int SCH_EDIT_TOOL::Duplicate( const TOOL_EVENT& aEvent )
// Keep track of existing sheet paths. Duplicating a selection can modify this list // Keep track of existing sheet paths. Duplicating a selection can modify this list
bool copiedSheets = false; bool copiedSheets = false;
SCH_SHEET_LIST initial_sheetpathList( g_RootSheet ); SCH_SHEET_LIST initial_sheetpathList = m_frame->Schematic().GetSheets();
for( unsigned ii = 0; ii < selection.GetSize(); ++ii ) for( unsigned ii = 0; ii < selection.GetSize(); ++ii )
{ {
@ -797,7 +798,7 @@ int SCH_EDIT_TOOL::Duplicate( const TOOL_EVENT& aEvent )
case SCH_SHEET_T: case SCH_SHEET_T:
{ {
SCH_SHEET_LIST hierarchy( g_RootSheet ); SCH_SHEET_LIST hierarchy = m_frame->Schematic().GetSheets();
SCH_SHEET* sheet = (SCH_SHEET*) newItem; SCH_SHEET* sheet = (SCH_SHEET*) newItem;
SCH_FIELD& nameField = sheet->GetFields()[SHEETNAME]; SCH_FIELD& nameField = sheet->GetFields()[SHEETNAME];
wxString baseName = nameField.GetText(); wxString baseName = nameField.GetText();
@ -834,7 +835,7 @@ int SCH_EDIT_TOOL::Duplicate( const TOOL_EVENT& aEvent )
{ {
// We clear annotation of new sheet paths. // We clear annotation of new sheet paths.
// Annotation of new components added in current sheet is already cleared. // Annotation of new components added in current sheet is already cleared.
SCH_SCREENS screensList( g_RootSheet ); SCH_SCREENS screensList( &m_frame->Schematic().Root() );
screensList.ClearAnnotationOfNewSheetPaths( initial_sheetpathList ); screensList.ClearAnnotationOfNewSheetPaths( initial_sheetpathList );
m_frame->SetSheetNumberAndCount(); m_frame->SetSheetNumberAndCount();
} }
@ -1113,7 +1114,7 @@ void SCH_EDIT_TOOL::editFieldText( SCH_FIELD* aField )
if( dlg.ShowQuasiModal() != wxID_OK ) if( dlg.ShowQuasiModal() != wxID_OK )
return; return;
dlg.UpdateField( aField, g_CurrentSheet ); dlg.UpdateField( aField, &m_frame->GetCurrentSheet() );
if( m_frame->eeconfig()->m_AutoplaceFields.enable || aField->GetParent()->Type() == SCH_SHEET_T ) if( m_frame->eeconfig()->m_AutoplaceFields.enable || aField->GetParent()->Type() == SCH_SHEET_T )
static_cast<SCH_ITEM*>( aField->GetParent() )->AutoAutoplaceFields( m_frame->GetScreen() ); static_cast<SCH_ITEM*>( aField->GetParent() )->AutoAutoplaceFields( m_frame->GetScreen() );
@ -1304,22 +1305,23 @@ int SCH_EDIT_TOOL::Properties( const TOOL_EVENT& aEvent )
bool doClearAnnotation; bool doClearAnnotation;
bool doRefresh = false; bool doRefresh = false;
// Keep track of existing sheet paths. EditSheet() can modify this list // Keep track of existing sheet paths. EditSheet() can modify this list
SCH_SHEET_LIST initial_sheetpathList( g_RootSheet ); SCH_SHEET_LIST initial_sheetpathList = m_frame->Schematic().GetSheets();
doRefresh = m_frame->EditSheetProperties( sheet, g_CurrentSheet, &doClearAnnotation ); doRefresh = m_frame->EditSheetProperties(
sheet, &m_frame->GetCurrentSheet(), &doClearAnnotation );
// If the sheet file is changed and new sheet contents are loaded then we have to // If the sheet file is changed and new sheet contents are loaded then we have to
// clear the annotations on the new content (as it may have been set from some other // clear the annotations on the new content (as it may have been set from some other
// sheet path reference) // sheet path reference)
if( doClearAnnotation ) if( doClearAnnotation )
{ {
SCH_SCREENS screensList( g_RootSheet ); SCH_SCREENS screensList( &m_frame->Schematic().Root() );
// We clear annotation of new sheet paths here: // We clear annotation of new sheet paths here:
screensList.ClearAnnotationOfNewSheetPaths( initial_sheetpathList ); screensList.ClearAnnotationOfNewSheetPaths( initial_sheetpathList );
// Clear annotation of g_CurrentSheet itself, because its sheetpath is not a new // Clear annotation of g_CurrentSheet itself, because its sheetpath is not a new
// path, but components managed by its sheet path must have their annotation // path, but components managed by its sheet path must have their annotation
// cleared, because they are new: // cleared, because they are new:
sheet->GetScreen()->ClearAnnotation( g_CurrentSheet ); sheet->GetScreen()->ClearAnnotation( &m_frame->GetCurrentSheet() );
} }
if( doRefresh ) if( doRefresh )

View File

@ -43,6 +43,7 @@
#include <sch_painter.h> #include <sch_painter.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_view.h> #include <sch_view.h>
#include <schematic.h>
#include <advanced_config.h> #include <advanced_config.h>
#include <sim/sim_plot_frame.h> #include <sim/sim_plot_frame.h>
#include <simulation_cursors.h> #include <simulation_cursors.h>
@ -115,7 +116,7 @@ int SCH_EDITOR_CONTROL::PageSetup( const TOOL_EVENT& aEvent )
int SCH_EDITOR_CONTROL::RescueSymbols( const TOOL_EVENT& aEvent ) int SCH_EDITOR_CONTROL::RescueSymbols( const TOOL_EVENT& aEvent )
{ {
SCH_SCREENS schematic; SCH_SCREENS schematic( m_frame->Schematic().Root() );
if( schematic.HasNoFullyDefinedLibIds() ) if( schematic.HasNoFullyDefinedLibIds() )
RescueLegacyProject( true ); RescueLegacyProject( true );
@ -128,7 +129,7 @@ int SCH_EDITOR_CONTROL::RescueSymbols( const TOOL_EVENT& aEvent )
bool SCH_EDITOR_CONTROL::RescueLegacyProject( bool aRunningOnDemand ) bool SCH_EDITOR_CONTROL::RescueLegacyProject( bool aRunningOnDemand )
{ {
LEGACY_RESCUER rescuer( m_frame->Prj(), &m_frame->GetCurrentSheet(), LEGACY_RESCUER rescuer( m_frame->Prj(), &m_frame->Schematic(), &m_frame->GetCurrentSheet(),
m_frame->GetCanvas()->GetBackend() ); m_frame->GetCanvas()->GetBackend() );
return rescueProject( rescuer, aRunningOnDemand ); return rescueProject( rescuer, aRunningOnDemand );
@ -137,7 +138,8 @@ bool SCH_EDITOR_CONTROL::RescueLegacyProject( bool aRunningOnDemand )
bool SCH_EDITOR_CONTROL::RescueSymbolLibTableProject( bool aRunningOnDemand ) bool SCH_EDITOR_CONTROL::RescueSymbolLibTableProject( bool aRunningOnDemand )
{ {
SYMBOL_LIB_TABLE_RESCUER rescuer( m_frame->Prj(), &m_frame->GetCurrentSheet(), SYMBOL_LIB_TABLE_RESCUER rescuer( m_frame->Prj(), &m_frame->Schematic(),
&m_frame->GetCurrentSheet(),
m_frame->GetCanvas()->GetBackend() ); m_frame->GetCanvas()->GetBackend() );
return rescueProject( rescuer, aRunningOnDemand ); return rescueProject( rescuer, aRunningOnDemand );
@ -158,10 +160,9 @@ bool SCH_EDITOR_CONTROL::rescueProject( RESCUER& aRescuer, bool aRunningOnDemand
if( aRunningOnDemand ) if( aRunningOnDemand )
{ {
SCH_SCREENS schematic; SCH_SCREENS schematic( m_frame->Schematic().Root() );
schematic.UpdateSymbolLinks(); schematic.UpdateSymbolLinks();
g_ConnectionGraph->Reset();
m_frame->RecalculateConnections( GLOBAL_CLEANUP ); m_frame->RecalculateConnections( GLOBAL_CLEANUP );
} }
@ -191,7 +192,7 @@ int SCH_EDITOR_CONTROL::Print( const TOOL_EVENT& aEvent )
{ {
InvokeDialogPrintUsingPrinter( m_frame ); InvokeDialogPrintUsingPrinter( m_frame );
wxFileName fn = m_frame->Prj().AbsolutePath( g_RootSheet->GetScreen()->GetFileName() ); wxFileName fn = m_frame->Prj().AbsolutePath( m_frame->Schematic().RootScreen()->GetFileName() );
if( fn.GetName() != NAMELESS_PROJECT ) if( fn.GetName() != NAMELESS_PROJECT )
m_frame->SaveProjectSettings(); m_frame->SaveProjectSettings();
@ -409,8 +410,8 @@ int SCH_EDITOR_CONTROL::FindNext( const TOOL_EVENT& aEvent )
if( !item && searchAllSheets ) if( !item && searchAllSheets )
{ {
SCH_SHEET_LIST schematic( g_RootSheet ); SCH_SHEET_LIST schematic = m_frame->Schematic().GetSheets();
SCH_SCREENS screens; SCH_SCREENS screens( m_frame->Schematic().Root() );
for( SCH_SCREEN* screen = screens.GetFirst(); screen; screen = screens.GetNext() ) for( SCH_SCREEN* screen = screens.GetFirst(); screen; screen = screens.GetNext() )
{ {
@ -429,8 +430,8 @@ int SCH_EDITOR_CONTROL::FindNext( const TOOL_EVENT& aEvent )
SCH_SHEET_PATH* sheet = schematic.FindSheetForScreen( screen ); SCH_SHEET_PATH* sheet = schematic.FindSheetForScreen( screen );
wxCHECK_MSG( sheet, 0, "Sheet not found for " + screen->GetFileName() ); wxCHECK_MSG( sheet, 0, "Sheet not found for " + screen->GetFileName() );
*g_CurrentSheet = *sheet; m_frame->Schematic().SetCurrentSheet( *sheet );
g_CurrentSheet->UpdateAllScreenReferences(); m_frame->GetCurrentSheet().UpdateAllScreenReferences();
screen->SetZoom( m_frame->GetScreen()->GetZoom() ); screen->SetZoom( m_frame->GetScreen()->GetZoom() );
screen->TestDanglingEnds(); screen->TestDanglingEnds();
@ -481,7 +482,7 @@ int SCH_EDITOR_CONTROL::ReplaceAndFindNext( const TOOL_EVENT& aEvent )
if( item && item->Matches( *data, nullptr ) ) if( item && item->Matches( *data, nullptr ) )
{ {
if( item->Replace( *data, g_CurrentSheet ) ) if( item->Replace( *data, &m_frame->GetCurrentSheet() ) )
{ {
m_frame->RefreshItem( item ); m_frame->RefreshItem( item );
m_frame->OnModify(); m_frame->OnModify();
@ -501,8 +502,8 @@ int SCH_EDITOR_CONTROL::ReplaceAll( const TOOL_EVENT& aEvent )
if( !data ) if( !data )
return FindAndReplace( ACTIONS::find.MakeEvent() ); return FindAndReplace( ACTIONS::find.MakeEvent() );
SCH_SHEET_LIST schematic( g_RootSheet ); SCH_SHEET_LIST schematic = m_frame->Schematic().GetSheets();
SCH_SCREENS screens; SCH_SCREENS screens( m_frame->Schematic().Root() );
for( SCH_SCREEN* screen = screens.GetFirst(); screen; screen = screens.GetNext() ) for( SCH_SCREEN* screen = screens.GetFirst(); screen; screen = screens.GetNext() )
{ {
@ -663,7 +664,7 @@ int SCH_EDITOR_CONTROL::SimProbe( const TOOL_EVENT& aEvent )
else else
param = wxString::Format( wxT( "I%s" ), pin->GetName().Lower() ); param = wxString::Format( wxT( "I%s" ), pin->GetName().Lower() );
simFrame->AddCurrentPlot( comp->GetRef( g_CurrentSheet ), param ); simFrame->AddCurrentPlot( comp->GetRef( &m_frame->GetCurrentSheet() ), param );
} }
return true; return true;
@ -687,8 +688,8 @@ int SCH_EDITOR_CONTROL::SimProbe( const TOOL_EVENT& aEvent )
{ {
item = nullptr; item = nullptr;
if( wire->Connection( *g_CurrentSheet ) ) if( wire->Connection( m_frame->GetCurrentSheet() ) )
netName = wire->Connection( *g_CurrentSheet )->Name(); netName = wire->Connection( m_frame->GetCurrentSheet() )->Name();
} }
if( item && item->Type() == SCH_PIN_T ) if( item && item->Type() == SCH_PIN_T )
@ -828,7 +829,7 @@ static bool highlightNet( TOOL_MANAGER* aToolMgr, const VECTOR2D& aPosition )
if( aPosition != CLEAR ) if( aPosition != CLEAR )
{ {
if( TestDuplicateSheetNames( false ) > 0 ) if( TestDuplicateSheetNames( &editFrame->Schematic(), false ) > 0 )
{ {
wxMessageBox( _( "Error: duplicate sub-sheet names found in current sheet." ) ); wxMessageBox( _( "Error: duplicate sub-sheet names found in current sheet." ) );
retVal = false; retVal = false;
@ -848,8 +849,8 @@ static bool highlightNet( TOOL_MANAGER* aToolMgr, const VECTOR2D& aPosition )
if( comp && comp->GetPartRef() && comp->GetPartRef()->IsPower() ) if( comp && comp->GetPartRef() && comp->GetPartRef()->IsPower() )
netName = comp->GetPartRef()->GetName(); netName = comp->GetPartRef()->GetName();
else if( item && item->Connection( *g_CurrentSheet ) ) else if( item && item->Connection( editFrame->GetCurrentSheet() ) )
netName = item->Connection( *g_CurrentSheet )->Name(); netName = item->Connection( editFrame->GetCurrentSheet() )->Name();
} }
} }
@ -894,7 +895,7 @@ int SCH_EDITOR_CONTROL::ClearHighlight( const TOOL_EVENT& aEvent )
int SCH_EDITOR_CONTROL::UpdateNetHighlighting( const TOOL_EVENT& aEvent ) int SCH_EDITOR_CONTROL::UpdateNetHighlighting( const TOOL_EVENT& aEvent )
{ {
SCH_SCREEN* screen = g_CurrentSheet->LastScreen(); SCH_SCREEN* screen = m_frame->GetCurrentSheet().LastScreen();
std::vector<EDA_ITEM*> itemsToRedraw; std::vector<EDA_ITEM*> itemsToRedraw;
wxString selectedNetName = m_frame->GetSelectedNetName(); wxString selectedNetName = m_frame->GetSelectedNetName();
@ -916,7 +917,7 @@ int SCH_EDITOR_CONTROL::UpdateNetHighlighting( const TOOL_EVENT& aEvent )
} }
else else
{ {
SCH_CONNECTION* connection = item->Connection( *g_CurrentSheet ); SCH_CONNECTION* connection = item->Connection( m_frame->GetCurrentSheet() );
if( connection ) if( connection )
itemConnectionName = connection->Name(); itemConnectionName = connection->Name();
@ -939,7 +940,8 @@ int SCH_EDITOR_CONTROL::UpdateNetHighlighting( const TOOL_EVENT& aEvent )
for( LIB_PIN* pin : pins ) for( LIB_PIN* pin : pins )
{ {
SCH_CONNECTION* pin_conn = comp->GetConnectionForPin( pin, *g_CurrentSheet ); SCH_CONNECTION* pin_conn =
comp->GetConnectionForPin( pin, m_frame->GetCurrentSheet() );
if( comp && pin_conn && pin_conn->Name( false ) == selectedNetName ) if( comp && pin_conn && pin_conn->Name( false ) == selectedNetName )
{ {
@ -965,7 +967,7 @@ int SCH_EDITOR_CONTROL::UpdateNetHighlighting( const TOOL_EVENT& aEvent )
{ {
for( SCH_SHEET_PIN* pin : static_cast<SCH_SHEET*>( item )->GetPins() ) for( SCH_SHEET_PIN* pin : static_cast<SCH_SHEET*>( item )->GetPins() )
{ {
SCH_CONNECTION* pin_conn = pin->Connection( *g_CurrentSheet ); SCH_CONNECTION* pin_conn = pin->Connection( m_frame->GetCurrentSheet() );
bool redrawPin = pin->IsBrightened(); bool redrawPin = pin->IsBrightened();
if( pin_conn && pin_conn->Name() == selectedNetName ) if( pin_conn && pin_conn->Name() == selectedNetName )
@ -1216,8 +1218,9 @@ int SCH_EDITOR_CONTROL::Paste( const TOOL_EVENT& aEvent )
// //
EDA_ITEMS loadedItems; EDA_ITEMS loadedItems;
bool sheetsPasted = false; bool sheetsPasted = false;
SCH_SHEET_LIST hierarchy( g_RootSheet ); SCH_SHEET_LIST hierarchy = m_frame->Schematic().GetSheets();
wxFileName destFn = g_CurrentSheet->Last()->GetFileName(); SCH_SHEET_PATH& currentSheet = m_frame->GetCurrentSheet();
wxFileName destFn = currentSheet.Last()->GetFileName();
if( destFn.IsRelative() ) if( destFn.IsRelative() )
destFn.MakeAbsolute( m_frame->Prj().GetProjectPath() ); destFn.MakeAbsolute( m_frame->Prj().GetProjectPath() );
@ -1318,17 +1321,18 @@ int SCH_EDITOR_CONTROL::Paste( const TOOL_EVENT& aEvent )
nameField.SetText( candidateName ); nameField.SetText( candidateName );
sheet->SetParent( g_CurrentSheet->Last() ); sheet->SetParent( currentSheet.Last() );
sheet->SetScreen( nullptr ); sheet->SetScreen( nullptr );
sheetsPasted = true; sheetsPasted = true;
if( !fn.IsAbsolute() ) if( !fn.IsAbsolute() )
{ {
wxFileName currentSheetFileName = g_CurrentSheet->LastScreen()->GetFileName(); wxFileName currentSheetFileName = currentSheet.LastScreen()->GetFileName();
fn.Normalize( wxPATH_NORM_ALL, currentSheetFileName.GetPath() ); fn.Normalize( wxPATH_NORM_ALL, currentSheetFileName.GetPath() );
} }
if( g_RootSheet->SearchHierarchy( fn.GetFullPath( wxPATH_UNIX ), &existingScreen ) ) if( m_frame->Schematic().Root().SearchHierarchy(
fn.GetFullPath( wxPATH_UNIX ), &existingScreen ) )
dropSheetAnnotations = !forceKeepAnnotations; dropSheetAnnotations = !forceKeepAnnotations;
else else
searchSupplementaryClipboard( sheet->GetFileName(), &existingScreen ); searchSupplementaryClipboard( sheet->GetFileName(), &existingScreen );
@ -1337,7 +1341,7 @@ int SCH_EDITOR_CONTROL::Paste( const TOOL_EVENT& aEvent )
{ {
sheet->SetScreen( existingScreen ); sheet->SetScreen( existingScreen );
SCH_SHEET_PATH sheetpath = *g_CurrentSheet; SCH_SHEET_PATH sheetpath = currentSheet;
sheetpath.push_back( sheet ); sheetpath.push_back( sheet );
// Clear annotation and create the AR for this path, if not exists, // Clear annotation and create the AR for this path, if not exists,
@ -1351,7 +1355,7 @@ int SCH_EDITOR_CONTROL::Paste( const TOOL_EVENT& aEvent )
} }
else else
{ {
if( !m_frame->LoadSheetFromFile( sheet, g_CurrentSheet, fn.GetFullPath() ) ) if( !m_frame->LoadSheetFromFile( sheet, &currentSheet, fn.GetFullPath() ) )
m_frame->InitSheet( sheet, sheet->GetFileName() ); m_frame->InitSheet( sheet, sheet->GetFileName() );
} }
} }
@ -1517,7 +1521,7 @@ int SCH_EDITOR_CONTROL::EnterSheet( const TOOL_EVENT& aEvent )
m_toolMgr->RunAction( ACTIONS::cancelInteractive, true ); m_toolMgr->RunAction( ACTIONS::cancelInteractive, true );
m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true ); m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
g_CurrentSheet->push_back( sheet ); m_frame->GetCurrentSheet().push_back( sheet );
m_frame->DisplayCurrentSheet(); m_frame->DisplayCurrentSheet();
m_frame->UpdateHierarchyNavigator(); m_frame->UpdateHierarchyNavigator();
} }
@ -1528,12 +1532,12 @@ int SCH_EDITOR_CONTROL::EnterSheet( const TOOL_EVENT& aEvent )
int SCH_EDITOR_CONTROL::LeaveSheet( const TOOL_EVENT& aEvent ) int SCH_EDITOR_CONTROL::LeaveSheet( const TOOL_EVENT& aEvent )
{ {
if( g_CurrentSheet->Last() != g_RootSheet ) if( m_frame->GetCurrentSheet().Last() != &m_frame->Schematic().Root() )
{ {
m_toolMgr->RunAction( ACTIONS::cancelInteractive, true ); m_toolMgr->RunAction( ACTIONS::cancelInteractive, true );
m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true ); m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
g_CurrentSheet->pop_back(); m_frame->GetCurrentSheet().pop_back();
m_frame->DisplayCurrentSheet(); m_frame->DisplayCurrentSheet();
m_frame->UpdateHierarchyNavigator(); m_frame->UpdateHierarchyNavigator();
} }

View File

@ -74,6 +74,7 @@
#include <sch_sheet_path.h> #include <sch_sheet_path.h>
#include <sch_text.h> #include <sch_text.h>
#include <sch_view.h> #include <sch_view.h>
#include <schematic.h>
#include <ee_actions.h> #include <ee_actions.h>
#include <ee_point_editor.h> #include <ee_point_editor.h>
@ -131,7 +132,7 @@ private:
return; return;
} }
SCH_CONNECTION* connection = bus->Connection( *g_CurrentSheet ); SCH_CONNECTION* connection = bus->Connection( frame->GetCurrentSheet() );
if( !connection || !connection->IsBus() || connection->Members().empty() ) if( !connection || !connection->IsBus() || connection->Members().empty() )
{ {
@ -203,8 +204,10 @@ bool SCH_LINE_WIRE_BUS_TOOL::Init()
return ( m_frame->IsCurrentTool( EE_ACTIONS::drawLines ) ); return ( m_frame->IsCurrentTool( EE_ACTIONS::drawLines ) );
}; };
auto belowRootSheetCondition = [] ( const SELECTION& aSel ) { auto belowRootSheetCondition =
return g_CurrentSheet->Last() != g_RootSheet; [&]( const SELECTION& aSel )
{
return m_frame->GetCurrentSheet().Last() != &m_frame->Schematic().Root();
}; };
auto busSelection = EE_CONDITIONS::MoreThan( 0 ) auto busSelection = EE_CONDITIONS::MoreThan( 0 )

View File

@ -159,6 +159,8 @@ enum KICAD_T
// General // General
SCH_SCREEN_T, SCH_SCREEN_T,
SCHEMATIC_T,
/* /*
* Draw items in library component. * Draw items in library component.
* *

View File

@ -39,7 +39,8 @@ class TEST_NETLIST_EXPORTER_PSPICE_SIM
{ {
public: public:
TEST_NETLIST_EXPORTER_PSPICE_SIM() TEST_NETLIST_EXPORTER_PSPICE_SIM()
: m_netlist( new NETLIST_OBJECT_LIST ), m_exporter( m_netlist ) : m_netlist( new NETLIST_OBJECT_LIST ),
m_exporter( m_netlist, nullptr )
{ {
} }

View File

@ -30,6 +30,7 @@
// Code under test // Code under test
#include <sch_sheet.h> #include <sch_sheet.h>
#include <schematic.h>
#include "uuid_test_utils.h" #include "uuid_test_utils.h"
@ -42,6 +43,9 @@ public:
{ {
} }
///> Dummy schematic to attach the test sheet to
SCHEMATIC m_schematic;
SCH_SHEET m_sheet; SCH_SHEET m_sheet;
///> Can use when you need a const ref (lots of places need fixing here) ///> Can use when you need a const ref (lots of places need fixing here)
@ -73,8 +77,7 @@ BOOST_AUTO_TEST_CASE( Default )
{ {
BOOST_CHECK_EQUAL( m_csheet.GetPosition(), wxPoint( 0, 0 ) ); BOOST_CHECK_EQUAL( m_csheet.GetPosition(), wxPoint( 0, 0 ) );
// it is it's own root sheet BOOST_CHECK_EQUAL( m_sheet.GetParent(), nullptr );
BOOST_CHECK_EQUAL( m_sheet.GetRootSheet(), &m_sheet );
BOOST_CHECK_EQUAL( m_sheet.CountSheets(), 1 ); BOOST_CHECK_EQUAL( m_sheet.CountSheets(), 1 );
BOOST_CHECK_EQUAL( m_csheet.GetScreenCount(), 0 ); BOOST_CHECK_EQUAL( m_csheet.GetScreenCount(), 0 );
@ -82,6 +85,20 @@ BOOST_AUTO_TEST_CASE( Default )
BOOST_CHECK_EQUAL( m_sheet.ComponentCount(), 0 ); BOOST_CHECK_EQUAL( m_sheet.ComponentCount(), 0 );
} }
/**
* Test setting parent schematic
*/
BOOST_AUTO_TEST_CASE( SchematicParent )
{
m_sheet.SetParent( &m_schematic );
BOOST_CHECK_EQUAL( m_sheet.IsRootSheet(), false );
m_schematic.SetRoot( &m_sheet );
BOOST_CHECK_EQUAL( m_sheet.IsRootSheet(), true );
}
/** /**
* Test adding pins to a sheet * Test adding pins to a sheet
*/ */

View File

@ -44,7 +44,7 @@ public:
{ {
for( unsigned i = 0; i < 4; ++i ) for( unsigned i = 0; i < 4; ++i )
{ {
m_sheets.emplace_back( wxPoint( i, i ) ); m_sheets.emplace_back( nullptr, wxPoint( i, i ) );
std::ostringstream ss; std::ostringstream ss;
ss << "Sheet" << i; ss << "Sheet" << i;