← Back to team overview

kicad-developers team mailing list archive

Re: [PATCH] Append schematic: copy the contents of one schematic file into another

 

Second attempt. Make me know what you think.

Thanks for your time.
-- 
Jacobo Aragunde
Software Engineer at Igalia
=== modified file 'eeschema/class_library.cpp'
--- eeschema/class_library.cpp	2012-10-29 21:56:18 +0000
+++ eeschema/class_library.cpp	2013-01-23 16:58:35 +0000
@@ -860,13 +860,13 @@
 
 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 @@
     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;
 }

=== modified file 'eeschema/files-io.cpp'
--- eeschema/files-io.cpp	2013-01-21 19:58:02 +0000
+++ eeschema/files-io.cpp	2013-01-24 08:35:22 +0000
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@xxxxxxxxxxxxxxxxxx
  * Copyright (C) 2011 Wayne Stambaugh <stambaughw@xxxxxxxxxxx>
+ * 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 @@
 }
 
 
+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 @@
     // 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,88 @@
 }
 
 
+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 );
+            }
+
+            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;

=== modified file 'eeschema/load_one_schematic_file.cpp'
--- eeschema/load_one_schematic_file.cpp	2012-10-13 18:54:33 +0000
+++ eeschema/load_one_schematic_file.cpp	2013-01-23 16:58:35 +0000
@@ -53,7 +53,7 @@
 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 @@
     wxLogTrace( traceAutoSave, wxT( "Loading schematic file " ) + aFullFileName );
 
     aScreen->SetCurItem( NULL );
-    aScreen->SetFileName( aFullFileName );
+    if( !append )
+        aScreen->SetFileName( aFullFileName );
 
     FILE* f;
     wxString fname = aFullFileName;

=== modified file 'eeschema/menubar.cpp'
--- eeschema/menubar.cpp	2012-09-28 17:47:41 +0000
+++ eeschema/menubar.cpp	2013-01-23 16:58:35 +0000
@@ -97,6 +97,12 @@
                  _( "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();
 

=== modified file 'eeschema/schframe.cpp'
--- eeschema/schframe.cpp	2013-01-12 17:32:24 +0000
+++ eeschema/schframe.cpp	2013-01-23 16:58:48 +0000
@@ -75,6 +75,8 @@
 
     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 )
 

=== modified file 'include/id.h'
--- include/id.h	2012-10-14 16:57:11 +0000
+++ include/id.h	2013-01-23 16:58:35 +0000
@@ -47,6 +47,7 @@
     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,

=== modified file 'include/wxEeschemaStruct.h'
--- include/wxEeschemaStruct.h	2013-01-21 19:58:02 +0000
+++ include/wxEeschemaStruct.h	2013-01-23 16:58:48 +0000
@@ -631,6 +631,14 @@
     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 @@
      *                \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 @@
     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 @@
     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:
     /**


Follow ups

References