Eagle import: fix memory leak on schematic sheets import

This commit is contained in:
Maciej Suminski 2018-02-28 16:43:33 +01:00
parent 419a16ae58
commit 260f680c6c
2 changed files with 25 additions and 24 deletions

View File

@ -50,6 +50,7 @@
#include <sch_eagle_plugin.h> #include <sch_eagle_plugin.h>
#include <symbol_lib_table.h> #include <symbol_lib_table.h>
#include <dialog_symbol_remap.h> #include <dialog_symbol_remap.h>
#include <worksheet_shape_builder.h>
bool SCH_EDIT_FRAME::SaveEEFile( SCH_SCREEN* aScreen, bool aSaveUnderNewName, bool SCH_EDIT_FRAME::SaveEEFile( SCH_SCREEN* aScreen, bool aSaveUnderNewName,
@ -755,12 +756,9 @@ 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 )
{ {
wxString fullFileName( aFileName ); wxString fullFileName( aFileName );
SCH_PLUGIN::SCH_PLUGIN_RELEASER pi;
wxString projectpath; wxString projectpath;
wxFileName newfilename; wxFileName newfilename;
SCH_SHEET_LIST sheetList( g_RootSheet ); SCH_SHEET_LIST sheetList( g_RootSheet );
SCH_SCREENS schematic;
switch( (SCH_IO_MGR::SCH_FILE_T) aFileType ) switch( (SCH_IO_MGR::SCH_FILE_T) aFileType )
{ {
@ -779,9 +777,30 @@ bool SCH_EDIT_FRAME::importFile( const wxString& aFileName, int aFileType )
try try
{ {
pi.set( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_EAGLE ) ); delete g_RootSheet;
g_RootSheet = nullptr;
SCH_PLUGIN::SCH_PLUGIN_RELEASER pi( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_EAGLE ) );
g_RootSheet = pi->Load( fullFileName, &Kiway() ); g_RootSheet = pi->Load( fullFileName, &Kiway() );
// Eagle sheets do not use a worksheet frame by default, so set it to an empty one
WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance();
pglayout.SetEmptyLayout();
BASE_SCREEN::m_PageLayoutDescrFileName = "empty.kicad_wks";
wxFileName layoutfn( Kiway().Prj().GetProjectPath(),
BASE_SCREEN::m_PageLayoutDescrFileName );
wxFile layoutfile;
if( layoutfile.Create( layoutfn.GetFullPath() ) )
{
layoutfile.Write( WORKSHEET_LAYOUT::EmptyLayout() );
layoutfile.Close();
}
SaveProjectSettings( false );
projectpath = Kiway().Prj().GetProjectPath(); projectpath = Kiway().Prj().GetProjectPath();
newfilename.SetPath( Prj().GetProjectPath() ); newfilename.SetPath( Prj().GetProjectPath() );
newfilename.SetName( Prj().GetProjectName() ); newfilename.SetName( Prj().GetProjectName() );
@ -796,7 +815,8 @@ bool SCH_EDIT_FRAME::importFile( const wxString& aFileName, int aFileType )
GetScreen()->SetModify(); GetScreen()->SetModify();
UpdateFileHistory( fullFileName ); UpdateFileHistory( fullFileName );
schematic.UpdateSymbolLinks(); // Update all symbol library links for all sheets. SCH_SCREENS schematic;
schematic.UpdateSymbolLinks(); // Update all symbol library links for all sheets.
// Ensure the schematic is fully segmented on first display // Ensure the schematic is fully segmented on first display
BreakSegmentsOnJunctions(); BreakSegmentsOnJunctions();

View File

@ -25,7 +25,6 @@
#include <wx/filename.h> #include <wx/filename.h>
#include <memory> #include <memory>
#include <unordered_map>
#include <sch_junction.h> #include <sch_junction.h>
#include <sch_sheet.h> #include <sch_sheet.h>
@ -425,24 +424,6 @@ SCH_SHEET* SCH_EAGLE_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway,
m_pi->SaveLibrary( getLibFileName().GetFullPath() ); m_pi->SaveLibrary( getLibFileName().GetFullPath() );
// Eagle sheets do not use a worksheet frame by default
WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance();
pglayout.SetEmptyLayout();
wxFileName layoutfn( m_kiway->Prj().GetProjectPath(), "empty.kicad_wks" );
wxFile layoutfile;
if( layoutfile.Create( layoutfn.GetFullPath() ) )
{
layoutfile.Write( WORKSHEET_LAYOUT::EmptyLayout() );
layoutfile.Close();
}
BASE_SCREEN::m_PageLayoutDescrFileName = "empty.kicad_wks";
SCH_EDIT_FRAME* editor = (SCH_EDIT_FRAME*) m_kiway->Player( FRAME_SCH, true );
editor->SaveProjectSettings( false );
return m_rootSheet; return m_rootSheet;
} }