diff --git a/eeschema/class_library.cpp b/eeschema/class_library.cpp index 4532f3aae3..3989682c9d 100644 --- a/eeschema/class_library.cpp +++ b/eeschema/class_library.cpp @@ -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 + * 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 #include #include +#include #include @@ -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 .cache.lib + * and after (due to code change): -cache.lib + * so if the -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 .cache.lib - * and after (due to code change): -cache.lib - * so if the -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; diff --git a/eeschema/load_one_schematic_file.cpp b/eeschema/load_one_schematic_file.cpp index 49122d010f..e621454278 100644 --- a/eeschema/load_one_schematic_file.cpp +++ b/eeschema/load_one_schematic_file.cpp @@ -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; diff --git a/eeschema/menubar.cpp b/eeschema/menubar.cpp index 6acce6e864..50befc38d4 100644 --- a/eeschema/menubar.cpp +++ b/eeschema/menubar.cpp @@ -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(); diff --git a/eeschema/schframe.cpp b/eeschema/schframe.cpp index 0b67607223..9f5d28d5ea 100644 --- a/eeschema/schframe.cpp +++ b/eeschema/schframe.cpp @@ -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(); diff --git a/include/id.h b/include/id.h index c92726be2e..51389bc8da 100644 --- a/include/id.h +++ b/include/id.h @@ -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, diff --git a/include/wxEeschemaStruct.h b/include/wxEeschemaStruct.h index 73d15325c2..30b254eb97 100644 --- a/include/wxEeschemaStruct.h +++ b/include/wxEeschemaStruct.h @@ -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: /**