Eeschema: Add "append schematic" feature. Fix bug 1101718 <Empty plot filename>
This commit is contained in:
parent
72690e769c
commit
a641ebb344
|
@ -860,13 +860,13 @@ CMP_LIBRARY* CMP_LIBRARY::FindLibrary( const wxString& aName )
|
|||
|
||||
wxArrayString CMP_LIBRARY::GetLibraryNames( bool aSorted )
|
||||
{
|
||||
wxString cacheName;
|
||||
wxArrayString cacheNames;
|
||||
wxArrayString names;
|
||||
|
||||
BOOST_FOREACH( CMP_LIBRARY& lib, CMP_LIBRARY::libraryList )
|
||||
{
|
||||
if( lib.isCache && aSorted )
|
||||
cacheName = lib.GetName();
|
||||
cacheNames.Add( lib.GetName() );
|
||||
else
|
||||
names.Add( lib.GetName() );
|
||||
}
|
||||
|
@ -875,8 +875,8 @@ wxArrayString CMP_LIBRARY::GetLibraryNames( bool aSorted )
|
|||
if( aSorted )
|
||||
names.Sort();
|
||||
|
||||
if( !cacheName.IsEmpty() )
|
||||
names.Add( cacheName );
|
||||
for( unsigned int i = 0; i<cacheNames.Count(); i++ )
|
||||
names.Add( cacheNames.Item( i ) );
|
||||
|
||||
return names;
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
*
|
||||
* Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
|
||||
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
|
||||
* Copyright (C) 2013 CERN (www.cern.ch)
|
||||
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@ -40,6 +41,7 @@
|
|||
#include <class_library.h>
|
||||
#include <libeditframe.h>
|
||||
#include <sch_sheet.h>
|
||||
#include <sch_component.h>
|
||||
#include <wildcards_and_files_ext.h>
|
||||
|
||||
|
||||
|
@ -175,6 +177,73 @@ void SCH_EDIT_FRAME::Save_File( wxCommandEvent& event )
|
|||
}
|
||||
|
||||
|
||||
bool SCH_EDIT_FRAME::LoadCacheLibrary( const wxString& aFilename )
|
||||
{
|
||||
wxString msg;
|
||||
bool LibCacheExist = false;
|
||||
wxFileName fn = aFilename;
|
||||
|
||||
/* Loading the project library cache
|
||||
* until apr 2009 the lib is named <root_name>.cache.lib
|
||||
* and after (due to code change): <root_name>-cache.lib
|
||||
* so if the <name>-cache.lib is not found, the old way will be tried
|
||||
*/
|
||||
bool use_oldcachename = false;
|
||||
wxString cachename = fn.GetName() + wxT( "-cache" );
|
||||
|
||||
fn.SetName( cachename );
|
||||
fn.SetExt( SchematicLibraryFileExtension );
|
||||
|
||||
if( ! fn.FileExists() )
|
||||
{
|
||||
fn = aFilename;
|
||||
fn.SetExt( wxT( "cache.lib" ) );
|
||||
use_oldcachename = true;
|
||||
}
|
||||
|
||||
if( fn.FileExists() )
|
||||
{
|
||||
wxString errMsg;
|
||||
|
||||
wxLogDebug( wxT( "Load schematic cache library file <%s>" ),
|
||||
GetChars( fn.GetFullPath() ) );
|
||||
msg = wxT( "Load " ) + fn.GetFullPath();
|
||||
|
||||
CMP_LIBRARY* LibCache = CMP_LIBRARY::LoadLibrary( fn, errMsg );
|
||||
|
||||
if( LibCache )
|
||||
{
|
||||
LibCache->SetCache();
|
||||
msg += wxT( " OK" );
|
||||
|
||||
if ( use_oldcachename ) // set the new name
|
||||
{
|
||||
fn.SetName( cachename );
|
||||
fn.SetExt( SchematicLibraryFileExtension );
|
||||
LibCache->SetFileName( fn );
|
||||
}
|
||||
|
||||
LibCacheExist = true;
|
||||
CMP_LIBRARY::GetLibraryList().push_back( LibCache );
|
||||
}
|
||||
else
|
||||
{
|
||||
wxString prompt;
|
||||
|
||||
prompt.Printf( _( "Component library <%s> failed to load.\nError: %s" ),
|
||||
GetChars( fn.GetFullPath() ),
|
||||
GetChars( errMsg ) );
|
||||
DisplayError( this, prompt );
|
||||
msg += _( " ->Error" );
|
||||
}
|
||||
|
||||
PrintMsg( msg );
|
||||
}
|
||||
|
||||
return LibCacheExist;
|
||||
}
|
||||
|
||||
|
||||
bool SCH_EDIT_FRAME::LoadOneEEProject( const wxString& aFileName, bool aIsNew )
|
||||
{
|
||||
SCH_SCREEN* screen;
|
||||
|
@ -280,64 +349,7 @@ bool SCH_EDIT_FRAME::LoadOneEEProject( const wxString& aFileName, bool aIsNew )
|
|||
// Delete old caches.
|
||||
CMP_LIBRARY::RemoveCacheLibrary();
|
||||
|
||||
/* Loading the project library cache
|
||||
* until apr 2009 the lib is named <root_name>.cache.lib
|
||||
* and after (due to code change): <root_name>-cache.lib
|
||||
* so if the <name>-cache.lib is not found, the old way will be tried
|
||||
*/
|
||||
fn = g_RootSheet->GetScreen()->GetFileName();
|
||||
|
||||
bool use_oldcachename = false;
|
||||
wxString cachename = fn.GetName() + wxT( "-cache" );
|
||||
|
||||
fn.SetName( cachename );
|
||||
fn.SetExt( SchematicLibraryFileExtension );
|
||||
|
||||
if( ! fn.FileExists() )
|
||||
{
|
||||
fn = g_RootSheet->GetScreen()->GetFileName();
|
||||
fn.SetExt( wxT( "cache.lib" ) );
|
||||
use_oldcachename = true;
|
||||
}
|
||||
|
||||
if( fn.FileExists() )
|
||||
{
|
||||
wxString errMsg;
|
||||
|
||||
wxLogDebug( wxT( "LoadOneEEProject() load schematic cache library file <%s>" ),
|
||||
GetChars( fn.GetFullPath() ) );
|
||||
msg = wxT( "Load " ) + fn.GetFullPath();
|
||||
|
||||
CMP_LIBRARY* LibCache = CMP_LIBRARY::LoadLibrary( fn, errMsg );
|
||||
|
||||
if( LibCache )
|
||||
{
|
||||
LibCache->SetCache();
|
||||
msg += wxT( " OK" );
|
||||
|
||||
if ( use_oldcachename ) // set the new name
|
||||
{
|
||||
fn.SetName( cachename );
|
||||
fn.SetExt( SchematicLibraryFileExtension );
|
||||
LibCache->SetFileName( fn );
|
||||
}
|
||||
|
||||
LibCacheExist = true;
|
||||
CMP_LIBRARY::GetLibraryList().push_back( LibCache );
|
||||
}
|
||||
else
|
||||
{
|
||||
wxString prompt;
|
||||
|
||||
prompt.Printf( _( "Component library <%s> failed to load.\nError: %s" ),
|
||||
GetChars( fn.GetFullPath() ),
|
||||
GetChars( errMsg ) );
|
||||
DisplayError( this, prompt );
|
||||
msg += _( " ->Error" );
|
||||
}
|
||||
|
||||
PrintMsg( msg );
|
||||
}
|
||||
LibCacheExist = LoadCacheLibrary( g_RootSheet->GetScreen()->GetFileName() );
|
||||
|
||||
if( !wxFileExists( g_RootSheet->GetScreen()->GetFileName() ) && !LibCacheExist )
|
||||
{
|
||||
|
@ -364,6 +376,90 @@ bool SCH_EDIT_FRAME::LoadOneEEProject( const wxString& aFileName, bool aIsNew )
|
|||
}
|
||||
|
||||
|
||||
bool SCH_EDIT_FRAME::AppendOneEEProject()
|
||||
{
|
||||
SCH_SCREEN* screen;
|
||||
wxString FullFileName;
|
||||
wxString msg;
|
||||
|
||||
screen = GetScreen();
|
||||
|
||||
if( !screen )
|
||||
{
|
||||
wxLogError( wxT("Document not ready, cannot import") );
|
||||
return false;
|
||||
}
|
||||
|
||||
// open file chooser dialog
|
||||
wxFileDialog dlg( this, _( "Import Schematic" ), wxGetCwd(),
|
||||
wxEmptyString, SchematicFileWildcard,
|
||||
wxFD_OPEN | wxFD_FILE_MUST_EXIST );
|
||||
|
||||
if( dlg.ShowModal() == wxID_CANCEL )
|
||||
return false;
|
||||
|
||||
FullFileName = dlg.GetPath();
|
||||
|
||||
wxFileName fn = FullFileName;
|
||||
|
||||
if( fn.IsRelative() )
|
||||
{
|
||||
fn.MakeAbsolute();
|
||||
FullFileName = fn.GetFullPath();
|
||||
}
|
||||
|
||||
LoadCacheLibrary( FullFileName );
|
||||
|
||||
wxLogDebug( wxT( "Importing schematic " ) + FullFileName );
|
||||
|
||||
// load the project
|
||||
bool success = LoadOneEEFile( screen, FullFileName, true );
|
||||
if( success )
|
||||
{
|
||||
// load sub-sheets
|
||||
EDA_ITEM* bs = screen->GetDrawItems();
|
||||
while( bs )
|
||||
{
|
||||
// do not append hierarchical sheets
|
||||
if( bs->Type() == SCH_SHEET_T )
|
||||
{
|
||||
screen->Remove( (SCH_SHEET*) bs );
|
||||
}
|
||||
// clear annotation and init new time stamp for the new components
|
||||
else if( bs->Type() == SCH_COMPONENT_T )
|
||||
{
|
||||
( (SCH_COMPONENT*) bs )->SetTimeStamp( GetNewTimeStamp() );
|
||||
( (SCH_COMPONENT*) bs )->ClearAnnotation( NULL );
|
||||
// Clear flags, which are set by these previous modifications:
|
||||
bs->ClearFlags();
|
||||
}
|
||||
|
||||
bs = bs->Next();
|
||||
}
|
||||
}
|
||||
|
||||
// redraw base screen (ROOT) if necessary
|
||||
GetScreen()->SetGrid( ID_POPUP_GRID_LEVEL_1000 + m_LastGridSizeId );
|
||||
Zoom_Automatique( false );
|
||||
SetSheetNumberAndCount();
|
||||
m_canvas->Refresh( true );
|
||||
return success;
|
||||
}
|
||||
|
||||
|
||||
void SCH_EDIT_FRAME::OnAppendProject( wxCommandEvent& event )
|
||||
{
|
||||
wxString msg = _( "This operation cannot be undone. "
|
||||
"Besides, take into account that hierarchical sheets will not be appended.\n\n"
|
||||
"Do you want to save the current document before proceeding?" );
|
||||
|
||||
if( IsOK( this, msg ) )
|
||||
OnSaveProject( event );
|
||||
|
||||
AppendOneEEProject();
|
||||
}
|
||||
|
||||
|
||||
void SCH_EDIT_FRAME::OnSaveProject( wxCommandEvent& aEvent )
|
||||
{
|
||||
SCH_SCREEN* screen;
|
||||
|
|
|
@ -53,7 +53,7 @@ bool ReadSchemaDescr( LINE_READER* aLine, wxString& aMsgDiag, SCH_SCREEN* Window
|
|||
static void LoadLayers( LINE_READER* aLine );
|
||||
|
||||
|
||||
bool SCH_EDIT_FRAME::LoadOneEEFile( SCH_SCREEN* aScreen, const wxString& aFullFileName )
|
||||
bool SCH_EDIT_FRAME::LoadOneEEFile( SCH_SCREEN* aScreen, const wxString& aFullFileName, bool append )
|
||||
{
|
||||
char name1[256];
|
||||
bool itemLoaded = false;
|
||||
|
@ -74,7 +74,8 @@ bool SCH_EDIT_FRAME::LoadOneEEFile( SCH_SCREEN* aScreen, const wxString& aFullFi
|
|||
wxLogTrace( traceAutoSave, wxT( "Loading schematic file " ) + aFullFileName );
|
||||
|
||||
aScreen->SetCurItem( NULL );
|
||||
aScreen->SetFileName( aFullFileName );
|
||||
if( !append )
|
||||
aScreen->SetFileName( aFullFileName );
|
||||
|
||||
FILE* f;
|
||||
wxString fname = aFullFileName;
|
||||
|
|
|
@ -97,6 +97,12 @@ void SCH_EDIT_FRAME::ReCreateMenuBar()
|
|||
_( "Open a recent opened schematic project" ),
|
||||
KiBitmap( open_project_xpm ) );
|
||||
|
||||
// Import
|
||||
AddMenuItem( fileMenu,
|
||||
ID_APPEND_PROJECT, _( "&Append Schematic" ),
|
||||
_( "Append another schematic project to the current loaded schematic" ),
|
||||
KiBitmap( open_document_xpm ) );
|
||||
|
||||
// Separator
|
||||
fileMenu->AppendSeparator();
|
||||
|
||||
|
|
|
@ -75,6 +75,8 @@ BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, EDA_DRAW_FRAME )
|
|||
|
||||
EVT_MENU_RANGE( wxID_FILE1, wxID_FILE9, SCH_EDIT_FRAME::OnLoadFile )
|
||||
|
||||
EVT_MENU( ID_APPEND_PROJECT, SCH_EDIT_FRAME::OnAppendProject )
|
||||
|
||||
EVT_TOOL( ID_NEW_PROJECT, SCH_EDIT_FRAME::OnNewProject )
|
||||
EVT_TOOL( ID_LOAD_PROJECT, SCH_EDIT_FRAME::OnLoadProject )
|
||||
|
||||
|
@ -512,7 +514,8 @@ double SCH_EDIT_FRAME::BestZoom()
|
|||
|
||||
wxString SCH_EDIT_FRAME::GetUniqueFilenameForCurrentSheet()
|
||||
{
|
||||
wxFileName fn = g_RootSheet->GetFileName();
|
||||
SCH_SCREENS ScreenList;
|
||||
wxFileName fn = ScreenList.GetFirst()->GetFileName();
|
||||
|
||||
#ifndef KICAD_GOST
|
||||
wxString filename = fn.GetName();
|
||||
|
|
|
@ -47,6 +47,7 @@ enum main_id
|
|||
ID_TO_PCB = wxID_HIGHEST,
|
||||
ID_TO_CVPCB,
|
||||
ID_LOAD_PROJECT,
|
||||
ID_APPEND_PROJECT,
|
||||
ID_NEW_PROJECT,
|
||||
ID_NEW_PROJECT_FROM_TEMPLATE,
|
||||
ID_SAVE_PROJECT,
|
||||
|
|
|
@ -630,6 +630,14 @@ public:
|
|||
*/
|
||||
bool LoadOneEEProject( const wxString& aFileName, bool aIsNew );
|
||||
|
||||
/**
|
||||
* Function AppendOneEEProject
|
||||
* read an entire project and loads it into the schematic editor *whitout* replacing the
|
||||
* existing contents.
|
||||
* @return True if the project was imported properly.
|
||||
*/
|
||||
bool AppendOneEEProject();
|
||||
|
||||
/**
|
||||
* Function LoadOneEEFile
|
||||
* loads the schematic (.sch) file \a aFullFileName into \a aScreen.
|
||||
|
@ -638,9 +646,11 @@ public:
|
|||
* \a aFullFileName.
|
||||
* @param aFullFileName A reference to a wxString object containing the absolute path
|
||||
* and file name to load.
|
||||
* @param append True if loaded file is being appended to the currently open file instead
|
||||
* of replacing it.
|
||||
* @return True if \a aFullFileName has been loaded (at least partially.)
|
||||
*/
|
||||
bool LoadOneEEFile( SCH_SCREEN* aScreen, const wxString& aFullFileName );
|
||||
bool LoadOneEEFile( SCH_SCREEN* aScreen, const wxString& aFullFileName, bool append = false );
|
||||
|
||||
bool ReadInputStuffFile();
|
||||
|
||||
|
@ -746,6 +756,7 @@ private:
|
|||
void OnLoadStuffFile( wxCommandEvent& event );
|
||||
void OnNewProject( wxCommandEvent& event );
|
||||
void OnLoadProject( wxCommandEvent& event );
|
||||
void OnAppendProject( wxCommandEvent& event );
|
||||
void OnOpenPcbnew( wxCommandEvent& event );
|
||||
void OnOpenCvpcb( wxCommandEvent& event );
|
||||
void OnOpenLibraryEditor( wxCommandEvent& event );
|
||||
|
@ -874,6 +885,8 @@ private:
|
|||
void InstallHierarchyFrame( wxDC* DC, wxPoint& pos );
|
||||
SCH_SHEET* CreateSheet( wxDC* DC );
|
||||
void ReSizeSheet( SCH_SHEET* Sheet, wxDC* DC );
|
||||
// Loads the cache library associated to the aFileName
|
||||
bool LoadCacheLibrary( const wxString& aFileName );
|
||||
|
||||
public:
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue