Eeschema: Add "append schematic" feature. Fix bug 1101718 <Empty plot filename>

This commit is contained in:
Jacobo Aragunde Perez 2013-01-24 18:46:37 +01:00 committed by jean-pierre charras
parent 72690e769c
commit a641ebb344
7 changed files with 186 additions and 66 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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:
/**