kicad/eeschema/save_schemas.cpp

160 lines
5.1 KiB
C++
Raw Normal View History

/**********************************************/
/* eesave.cpp Module to Save EESchema files */
/**********************************************/
#include "fctsys.h"
#include "gr_basic.h"
#include "common.h"
#include "confirm.h"
#include "kicad_string.h"
#include "gestfich.h"
#include "macros.h"
#include "program.h"
#include "general.h"
#include "protos.h"
#include "class_library.h"
#include <boost/foreach.hpp>
/*****************************************************************************
* Routine to save an EESchema file. *
* FileSave controls how the file is to be saved - under what name. *
* Returns TRUE if the file has been saved. *
*****************************************************************************/
2008-04-15 19:38:19 +00:00
bool WinEDA_SchematicFrame::SaveEEFile( SCH_SCREEN* screen, int FileSave )
{
wxString msg, tmp;
wxFileName schematicFileName, backupFileName;
2008-04-15 19:38:19 +00:00
FILE* f;
2008-03-20 01:50:21 +00:00
wxString dirbuf;
2008-04-15 19:38:19 +00:00
if( screen == NULL )
screen = (SCH_SCREEN*) GetScreen();
2008-03-20 01:50:21 +00:00
/* If no name exists in the window yet - save as new. */
2008-04-15 19:38:19 +00:00
if( screen->m_FileName.IsEmpty() )
FileSave = FILE_SAVE_NEW;
2008-03-20 01:50:21 +00:00
2008-04-15 19:38:19 +00:00
switch( FileSave )
2008-03-20 01:50:21 +00:00
{
2008-04-15 19:38:19 +00:00
case FILE_SAVE_AS:
schematicFileName = screen->m_FileName;
backupFileName = schematicFileName;
2008-04-15 19:38:19 +00:00
/* Rename the old file to a '.bak' one: */
if( schematicFileName.FileExists() )
2008-04-15 19:38:19 +00:00
{
backupFileName.SetExt( wxT( "bak" ) );
wxRemoveFile( backupFileName.GetFullPath() );
if( !wxRenameFile( schematicFileName.GetFullPath(),
backupFileName.GetFullPath() ) )
2008-03-20 01:50:21 +00:00
{
DisplayError( this,
wxT( "Warning: unable to rename old file" ), 10 );
2008-03-20 01:50:21 +00:00
}
}
2008-04-15 19:38:19 +00:00
break;
case FILE_SAVE_NEW:
{
wxFileDialog dlg( this, _( "Schematic Files" ), wxGetCwd(),
screen->m_FileName, SchematicFileWildcard,
wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
if( dlg.ShowModal() == wxID_CANCEL )
return false;
screen->m_FileName = dlg.GetPath();
schematicFileName = dlg.GetPath();
2008-04-15 19:38:19 +00:00
break;
}
2008-03-20 01:50:21 +00:00
2008-04-15 19:38:19 +00:00
default:
break;
2008-03-20 01:50:21 +00:00
}
if( ( f = wxFopen( schematicFileName.GetFullPath(), wxT( "wt" ) ) ) == NULL )
2008-03-20 01:50:21 +00:00
{
msg = _( "Failed to create file " ) + schematicFileName.GetFullPath();
2008-04-15 19:38:19 +00:00
DisplayError( this, msg );
return false;
2008-03-20 01:50:21 +00:00
}
2008-04-15 19:38:19 +00:00
if( FileSave == FILE_SAVE_NEW )
screen->m_FileName = schematicFileName.GetFullPath();
2008-04-15 19:38:19 +00:00
bool success = screen->Save( f );
2008-04-15 19:38:19 +00:00
if( !success )
DisplayError( this, _( "File write operation failed." ) );
else
screen->ClrModify();
fclose( f );
return success;
}
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.sch" format.
2008-04-15 19:38:19 +00:00
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool SCH_SCREEN::Save( FILE* aFile ) const
2008-04-15 19:38:19 +00:00
{
// Creates header
if( fprintf( aFile, "%s %s %d", EESCHEMA_FILE_STAMP,
SCHEMATIC_HEAD_STRING, EESCHEMA_VERSION ) < 0
|| fprintf( aFile, " date %s\n", CONV_TO_UTF8( DateAndTime() ) ) < 0 )
return FALSE;
2009-10-15 11:35:53 +00:00
BOOST_FOREACH( const CMP_LIBRARY& lib, CMP_LIBRARY::GetLibraryList() )
{
if( fprintf( aFile, "LIBS:%s\n", CONV_TO_UTF8( lib.GetName() ) ) < 0 )
2009-10-15 11:35:53 +00:00
return FALSE;
}
2008-03-20 01:50:21 +00:00
if( fprintf( aFile, "EELAYER %2d %2d\n", g_LayerDescr.NumberOfLayers,
g_LayerDescr.CurrentLayer ) < 0
|| fprintf( aFile, "EELAYER END\n" ) < 0 )
return FALSE;
2008-03-20 01:50:21 +00:00
/* Write page info, ScreenNumber and NumberOfScreen; not very meaningful for
* SheetNumber and Sheet Count in a complex hierarchy, but useful in
* simple hierarchy and flat hierarchy. Used also to search the root
* sheet ( ScreenNumber = 1 ) within the files
*/
if( fprintf( aFile, "$Descr %s %d %d\n", CONV_TO_UTF8( m_CurrentSheetDesc->m_Name ),
m_CurrentSheetDesc->m_Size.x, m_CurrentSheetDesc->m_Size.y ) < 0
|| fprintf( aFile, "Sheet %d %d\n", m_ScreenNumber, m_NumberOfScreen ) < 0
|| fprintf( aFile, "Title \"%s\"\n", CONV_TO_UTF8( m_Title ) ) < 0
|| fprintf( aFile, "Date \"%s\"\n", CONV_TO_UTF8( m_Date ) ) < 0
|| fprintf( aFile, "Rev \"%s\"\n", CONV_TO_UTF8( m_Revision ) ) < 0
|| fprintf( aFile, "Comp \"%s\"\n", CONV_TO_UTF8( m_Company ) ) < 0
|| fprintf( aFile, "Comment1 \"%s\"\n", CONV_TO_UTF8( m_Commentaire1 ) ) < 0
|| fprintf( aFile, "Comment2 \"%s\"\n", CONV_TO_UTF8( m_Commentaire2 ) ) < 0
|| fprintf( aFile, "Comment3 \"%s\"\n", CONV_TO_UTF8( m_Commentaire3 ) ) < 0
|| fprintf( aFile, "Comment4 \"%s\"\n", CONV_TO_UTF8( m_Commentaire4 ) ) < 0
|| fprintf( aFile, "$EndDescr\n" ) < 0 )
return FALSE;
for( SCH_ITEM* item = EEDrawList; item; item = item->Next() )
{
if( !item->Save( aFile ) )
return FALSE;
2008-04-15 19:38:19 +00:00
}
if( fprintf( aFile, "$EndSCHEMATC\n" ) < 0 )
return FALSE;
return TRUE;
}