Commit a641ebb3 authored by Jacobo Aragunde Perez's avatar Jacobo Aragunde Perez Committed by jean-pierre charras

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

parent 72690e76
...@@ -860,13 +860,13 @@ CMP_LIBRARY* CMP_LIBRARY::FindLibrary( const wxString& aName ) ...@@ -860,13 +860,13 @@ CMP_LIBRARY* CMP_LIBRARY::FindLibrary( const wxString& aName )
wxArrayString CMP_LIBRARY::GetLibraryNames( bool aSorted ) wxArrayString CMP_LIBRARY::GetLibraryNames( bool aSorted )
{ {
wxString cacheName; wxArrayString cacheNames;
wxArrayString names; wxArrayString names;
BOOST_FOREACH( CMP_LIBRARY& lib, CMP_LIBRARY::libraryList ) BOOST_FOREACH( CMP_LIBRARY& lib, CMP_LIBRARY::libraryList )
{ {
if( lib.isCache && aSorted ) if( lib.isCache && aSorted )
cacheName = lib.GetName(); cacheNames.Add( lib.GetName() );
else else
names.Add( lib.GetName() ); names.Add( lib.GetName() );
} }
...@@ -875,8 +875,8 @@ wxArrayString CMP_LIBRARY::GetLibraryNames( bool aSorted ) ...@@ -875,8 +875,8 @@ wxArrayString CMP_LIBRARY::GetLibraryNames( bool aSorted )
if( aSorted ) if( aSorted )
names.Sort(); names.Sort();
if( !cacheName.IsEmpty() ) for( unsigned int i = 0; i<cacheNames.Count(); i++ )
names.Add( cacheName ); names.Add( cacheNames.Item( i ) );
return names; return names;
} }
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
* *
* Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com * Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net> * 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. * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
...@@ -40,6 +41,7 @@ ...@@ -40,6 +41,7 @@
#include <class_library.h> #include <class_library.h>
#include <libeditframe.h> #include <libeditframe.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_component.h>
#include <wildcards_and_files_ext.h> #include <wildcards_and_files_ext.h>
...@@ -175,6 +177,73 @@ void SCH_EDIT_FRAME::Save_File( wxCommandEvent& event ) ...@@ -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 ) bool SCH_EDIT_FRAME::LoadOneEEProject( const wxString& aFileName, bool aIsNew )
{ {
SCH_SCREEN* screen; SCH_SCREEN* screen;
...@@ -280,87 +349,114 @@ bool SCH_EDIT_FRAME::LoadOneEEProject( const wxString& aFileName, bool aIsNew ) ...@@ -280,87 +349,114 @@ bool SCH_EDIT_FRAME::LoadOneEEProject( const wxString& aFileName, bool aIsNew )
// Delete old caches. // Delete old caches.
CMP_LIBRARY::RemoveCacheLibrary(); CMP_LIBRARY::RemoveCacheLibrary();
/* Loading the project library cache LibCacheExist = LoadCacheLibrary( g_RootSheet->GetScreen()->GetFileName() );
* 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; if( !wxFileExists( g_RootSheet->GetScreen()->GetFileName() ) && !LibCacheExist )
wxString cachename = fn.GetName() + wxT( "-cache" ); {
Zoom_Automatique( false );
msg.Printf( _( "File <%s> not found." ),
GetChars( g_RootSheet->GetScreen()->GetFileName() ) );
DisplayInfoMessage( this, msg );
return false;
}
fn.SetName( cachename ); // load the project.
fn.SetExt( SchematicLibraryFileExtension ); g_RootSheet->SetScreen( NULL );
bool diag = g_RootSheet->Load( this );
SetScreen( m_CurrentSheet->LastScreen() );
if( ! fn.FileExists() ) UpdateFileHistory( g_RootSheet->GetScreen()->GetFileName() );
/* Redraw base screen (ROOT) if necessary. */
GetScreen()->SetGrid( ID_POPUP_GRID_LEVEL_1000 + m_LastGridSizeId );
Zoom_Automatique( false );
SetSheetNumberAndCount();
m_canvas->Refresh( true );
return diag;
}
bool SCH_EDIT_FRAME::AppendOneEEProject()
{
SCH_SCREEN* screen;
wxString FullFileName;
wxString msg;
screen = GetScreen();
if( !screen )
{ {
fn = g_RootSheet->GetScreen()->GetFileName(); wxLogError( wxT("Document not ready, cannot import") );
fn.SetExt( wxT( "cache.lib" ) ); return false;
use_oldcachename = true;
} }
if( fn.FileExists() ) // open file chooser dialog
{ wxFileDialog dlg( this, _( "Import Schematic" ), wxGetCwd(),
wxString errMsg; wxEmptyString, SchematicFileWildcard,
wxFD_OPEN | wxFD_FILE_MUST_EXIST );
wxLogDebug( wxT( "LoadOneEEProject() load schematic cache library file <%s>" ), if( dlg.ShowModal() == wxID_CANCEL )
GetChars( fn.GetFullPath() ) ); return false;
msg = wxT( "Load " ) + fn.GetFullPath();
CMP_LIBRARY* LibCache = CMP_LIBRARY::LoadLibrary( fn, errMsg ); FullFileName = dlg.GetPath();
if( LibCache ) wxFileName fn = FullFileName;
{
LibCache->SetCache();
msg += wxT( " OK" );
if ( use_oldcachename ) // set the new name if( fn.IsRelative() )
{ {
fn.SetName( cachename ); fn.MakeAbsolute();
fn.SetExt( SchematicLibraryFileExtension ); FullFileName = fn.GetFullPath();
LibCache->SetFileName( fn );
} }
LibCacheExist = true; LoadCacheLibrary( FullFileName );
CMP_LIBRARY::GetLibraryList().push_back( LibCache );
}
else
{
wxString prompt;
prompt.Printf( _( "Component library <%s> failed to load.\nError: %s" ), wxLogDebug( wxT( "Importing schematic " ) + FullFileName );
GetChars( fn.GetFullPath() ),
GetChars( errMsg ) );
DisplayError( this, prompt );
msg += _( " ->Error" );
}
PrintMsg( msg ); // 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
if( !wxFileExists( g_RootSheet->GetScreen()->GetFileName() ) && !LibCacheExist ) else if( bs->Type() == SCH_COMPONENT_T )
{ {
Zoom_Automatique( false ); ( (SCH_COMPONENT*) bs )->SetTimeStamp( GetNewTimeStamp() );
msg.Printf( _( "File <%s> not found." ), ( (SCH_COMPONENT*) bs )->ClearAnnotation( NULL );
GetChars( g_RootSheet->GetScreen()->GetFileName() ) ); // Clear flags, which are set by these previous modifications:
DisplayInfoMessage( this, msg ); bs->ClearFlags();
return false;
} }
// load the project. bs = bs->Next();
g_RootSheet->SetScreen( NULL ); }
bool diag = g_RootSheet->Load( this ); }
SetScreen( m_CurrentSheet->LastScreen() );
UpdateFileHistory( g_RootSheet->GetScreen()->GetFileName() );
/* Redraw base screen (ROOT) if necessary. */ // redraw base screen (ROOT) if necessary
GetScreen()->SetGrid( ID_POPUP_GRID_LEVEL_1000 + m_LastGridSizeId ); GetScreen()->SetGrid( ID_POPUP_GRID_LEVEL_1000 + m_LastGridSizeId );
Zoom_Automatique( false ); Zoom_Automatique( false );
SetSheetNumberAndCount(); SetSheetNumberAndCount();
m_canvas->Refresh( true ); m_canvas->Refresh( true );
return diag; 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();
} }
......
...@@ -53,7 +53,7 @@ bool ReadSchemaDescr( LINE_READER* aLine, wxString& aMsgDiag, SCH_SCREEN* Window ...@@ -53,7 +53,7 @@ bool ReadSchemaDescr( LINE_READER* aLine, wxString& aMsgDiag, SCH_SCREEN* Window
static void LoadLayers( LINE_READER* aLine ); 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]; char name1[256];
bool itemLoaded = false; bool itemLoaded = false;
...@@ -74,6 +74,7 @@ bool SCH_EDIT_FRAME::LoadOneEEFile( SCH_SCREEN* aScreen, const wxString& aFullFi ...@@ -74,6 +74,7 @@ bool SCH_EDIT_FRAME::LoadOneEEFile( SCH_SCREEN* aScreen, const wxString& aFullFi
wxLogTrace( traceAutoSave, wxT( "Loading schematic file " ) + aFullFileName ); wxLogTrace( traceAutoSave, wxT( "Loading schematic file " ) + aFullFileName );
aScreen->SetCurItem( NULL ); aScreen->SetCurItem( NULL );
if( !append )
aScreen->SetFileName( aFullFileName ); aScreen->SetFileName( aFullFileName );
FILE* f; FILE* f;
......
...@@ -97,6 +97,12 @@ void SCH_EDIT_FRAME::ReCreateMenuBar() ...@@ -97,6 +97,12 @@ void SCH_EDIT_FRAME::ReCreateMenuBar()
_( "Open a recent opened schematic project" ), _( "Open a recent opened schematic project" ),
KiBitmap( open_project_xpm ) ); 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 // Separator
fileMenu->AppendSeparator(); fileMenu->AppendSeparator();
......
...@@ -75,6 +75,8 @@ BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, EDA_DRAW_FRAME ) ...@@ -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_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_NEW_PROJECT, SCH_EDIT_FRAME::OnNewProject )
EVT_TOOL( ID_LOAD_PROJECT, SCH_EDIT_FRAME::OnLoadProject ) EVT_TOOL( ID_LOAD_PROJECT, SCH_EDIT_FRAME::OnLoadProject )
...@@ -512,7 +514,8 @@ double SCH_EDIT_FRAME::BestZoom() ...@@ -512,7 +514,8 @@ double SCH_EDIT_FRAME::BestZoom()
wxString SCH_EDIT_FRAME::GetUniqueFilenameForCurrentSheet() wxString SCH_EDIT_FRAME::GetUniqueFilenameForCurrentSheet()
{ {
wxFileName fn = g_RootSheet->GetFileName(); SCH_SCREENS ScreenList;
wxFileName fn = ScreenList.GetFirst()->GetFileName();
#ifndef KICAD_GOST #ifndef KICAD_GOST
wxString filename = fn.GetName(); wxString filename = fn.GetName();
......
...@@ -47,6 +47,7 @@ enum main_id ...@@ -47,6 +47,7 @@ enum main_id
ID_TO_PCB = wxID_HIGHEST, ID_TO_PCB = wxID_HIGHEST,
ID_TO_CVPCB, ID_TO_CVPCB,
ID_LOAD_PROJECT, ID_LOAD_PROJECT,
ID_APPEND_PROJECT,
ID_NEW_PROJECT, ID_NEW_PROJECT,
ID_NEW_PROJECT_FROM_TEMPLATE, ID_NEW_PROJECT_FROM_TEMPLATE,
ID_SAVE_PROJECT, ID_SAVE_PROJECT,
......
...@@ -630,6 +630,14 @@ public: ...@@ -630,6 +630,14 @@ public:
*/ */
bool LoadOneEEProject( const wxString& aFileName, bool aIsNew ); 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 * Function LoadOneEEFile
* loads the schematic (.sch) file \a aFullFileName into \a aScreen. * loads the schematic (.sch) file \a aFullFileName into \a aScreen.
...@@ -638,9 +646,11 @@ public: ...@@ -638,9 +646,11 @@ public:
* \a aFullFileName. * \a aFullFileName.
* @param aFullFileName A reference to a wxString object containing the absolute path * @param aFullFileName A reference to a wxString object containing the absolute path
* and file name to load. * 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.) * @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(); bool ReadInputStuffFile();
...@@ -746,6 +756,7 @@ private: ...@@ -746,6 +756,7 @@ private:
void OnLoadStuffFile( wxCommandEvent& event ); void OnLoadStuffFile( wxCommandEvent& event );
void OnNewProject( wxCommandEvent& event ); void OnNewProject( wxCommandEvent& event );
void OnLoadProject( wxCommandEvent& event ); void OnLoadProject( wxCommandEvent& event );
void OnAppendProject( wxCommandEvent& event );
void OnOpenPcbnew( wxCommandEvent& event ); void OnOpenPcbnew( wxCommandEvent& event );
void OnOpenCvpcb( wxCommandEvent& event ); void OnOpenCvpcb( wxCommandEvent& event );
void OnOpenLibraryEditor( wxCommandEvent& event ); void OnOpenLibraryEditor( wxCommandEvent& event );
...@@ -874,6 +885,8 @@ private: ...@@ -874,6 +885,8 @@ private:
void InstallHierarchyFrame( wxDC* DC, wxPoint& pos ); void InstallHierarchyFrame( wxDC* DC, wxPoint& pos );
SCH_SHEET* CreateSheet( wxDC* DC ); SCH_SHEET* CreateSheet( wxDC* DC );
void ReSizeSheet( SCH_SHEET* Sheet, wxDC* DC ); void ReSizeSheet( SCH_SHEET* Sheet, wxDC* DC );
// Loads the cache library associated to the aFileName
bool LoadCacheLibrary( const wxString& aFileName );
public: public:
/** /**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment