|
|
/*********************************************/ /* eesave.cpp Module to Save EESchema files */ /*********************************************/
#include "fctsys.h"
#include "gr_basic.h"
#include "common.h"
#include "program.h"
#include "libcmp.h"
#include "general.h"
#include "macros.h"
#include "protos.h"
/* Fonctions Locales */ static void SaveLayers( FILE* f );
/* Variables locales */
/*****************************************************************************
* 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. * *****************************************************************************/ bool WinEDA_SchematicFrame::SaveEEFile( SCH_SCREEN* screen, int FileSave ) { wxString msg; wxString Name, BakName; FILE* f; wxString dirbuf;
if( screen == NULL ) screen = (SCH_SCREEN*) GetScreen();
/* If no name exists in the window yet - save as new. */ if( screen->m_FileName.IsEmpty() ) FileSave = FILE_SAVE_NEW;
switch( FileSave ) { case FILE_SAVE_AS: dirbuf = wxGetCwd() + STRING_DIR_SEP; Name = MakeFileName( dirbuf, screen->m_FileName, g_SchExtBuffer ); /* Rename the old file to a '.bak' one: */ BakName = Name; if( wxFileExists( Name ) ) { ChangeFileNameExt( BakName, wxT( ".bak" ) ); wxRemoveFile( BakName ); /* delete Old .bak file */ if( !wxRenameFile( Name, BakName ) ) { DisplayError( this, wxT( "Warning: unable to rename old file" ), 10 ); } } break;
case FILE_SAVE_NEW: { wxString mask = wxT( "*" ) + g_SchExtBuffer; Name = EDA_FileSelector( _( "Schematic files:" ), wxEmptyString, /* Chemin par defaut */ screen->m_FileName, /* nom fichier par defaut, et resultat */ g_SchExtBuffer, /* extension par defaut */ mask, /* Masque d'affichage */ this, wxFD_SAVE, FALSE ); if( Name.IsEmpty() ) return FALSE;
screen->m_FileName = Name; dirbuf = wxGetCwd() + STRING_DIR_SEP; Name = MakeFileName( dirbuf, Name, g_SchExtBuffer );
break; }
default: break; }
if( ( f = wxFopen( Name, wxT( "wt" ) ) ) == NULL ) { msg = _( "Failed to create file " ) + Name; DisplayError( this, msg ); return FALSE; }
if( FileSave == FILE_SAVE_NEW ) screen->m_FileName = Name;
bool success = screen->Save( f ); if( !success ) DisplayError( this, _( "File write operation failed." ) ); else screen->ClrModify();
fclose( f );
return success; }
/*****************************************/ bool SCH_SCREEN::Save( FILE* aFile ) const /*****************************************/
/**
* Function Save * writes the data structures for this object out to a FILE in "*.brd" format. * @param aFile The FILE to write to. * @return bool - true if success writing else false. */ { const wxChar** LibNames; wxString Name, msg; Ki_PageDescr* PlotSheet;
LibNames = GetLibNames(); for( int ii = 0; LibNames[ii] != NULL; ii++ ) { if( ii > 0 ) Name += wxT( "," ); Name += LibNames[ii]; }
MyFree( LibNames );
// Creates header
if( fprintf( aFile, "%s %s %d\n", EESCHEMA_FILE_STAMP, SCHEMATIC_HEAD_STRING, EESCHEMA_VERSION ) == EOF || fprintf( aFile, "LIBS:%s\n", CONV_TO_UTF8( Name ) ) == EOF ) { return FALSE; }
SaveLayers( aFile );
/* Write page info */
PlotSheet = m_CurrentSheetDesc; fprintf( aFile, "$Descr %s %d %d\n", CONV_TO_UTF8( PlotSheet->m_Name ), PlotSheet->m_Size.x, PlotSheet->m_Size.y );
/* Write ScreenNumber and NumberOfScreen; not very meaningfull for SheetNumber and Sheet Count
* in a complex hierarchy, but usefull in simple hierarchy and flat hierarchy * Used also to serach the root sheet ( ScreenNumber = 1 ) withing the files */ fprintf( aFile, "Sheet %d %d\n", m_ScreenNumber, m_NumberOfScreen );
fprintf( aFile, "Title \"%s\"\n", CONV_TO_UTF8( m_Title ) ); fprintf( aFile, "Date \"%s\"\n", CONV_TO_UTF8( m_Date ) ); fprintf( aFile, "Rev \"%s\"\n", CONV_TO_UTF8( m_Revision ) ); fprintf( aFile, "Comp \"%s\"\n", CONV_TO_UTF8( m_Company ) ); fprintf( aFile, "Comment1 \"%s\"\n", CONV_TO_UTF8( m_Commentaire1 ) ); fprintf( aFile, "Comment2 \"%s\"\n", CONV_TO_UTF8( m_Commentaire2 ) ); fprintf( aFile, "Comment3 \"%s\"\n", CONV_TO_UTF8( m_Commentaire3 ) ); fprintf( aFile, "Comment4 \"%s\"\n", CONV_TO_UTF8( m_Commentaire4 ) );
fprintf( aFile, "$EndDescr\n" );
/* Saving schematic items */ bool failed = FALSE; for( SCH_ITEM* item = EEDrawList; item; item = item->Next() ) { switch( item->Type() ) { case TYPE_SCH_COMPONENT: /* Its a library item. */ case DRAW_SHEET_STRUCT_TYPE: /* Its a Sheet item. */ case DRAW_SEGMENT_STRUCT_TYPE: /* Its a Segment item. */ case DRAW_BUSENTRY_STRUCT_TYPE: /* Its a Raccord item. */ case DRAW_POLYLINE_STRUCT_TYPE: /* Its a polyline item. */ case DRAW_JUNCTION_STRUCT_TYPE: /* Its a connection item. */ case DRAW_NOCONNECT_STRUCT_TYPE: /* Its a NoConnection item. */ case TYPE_SCH_TEXT: /* Its a text item. */ case TYPE_SCH_LABEL: /* Its a label item. */ case TYPE_SCH_GLOBALLABEL: /* Its a Global label item. */ case TYPE_SCH_HIERLABEL: /* Its a Hierarchical label item. */ case DRAW_MARKER_STRUCT_TYPE: /* Its a marker item. */ if( !item->Save( aFile ) ) failed = TRUE; break;
/*
* case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: * case DRAW_PICK_ITEM_STRUCT_TYPE: * break; */
default: break; }
if( failed ) break; }
if( fprintf( aFile, "$EndSCHEMATC\n" ) == EOF ) failed = TRUE;
return !failed; }
/****************************/ static void SaveLayers( FILE* f ) /****************************/
/* Save a Layer Structure to a file
* theses infos are not used in eeschema */ { fprintf( f, "EELAYER %2d %2d\n", g_LayerDescr.NumberOfLayers, g_LayerDescr.CurrentLayer ); fprintf( f, "EELAYER END\n" ); }
|