kicad/eeschema/files-io.cpp

290 lines
8.1 KiB
C++
Raw Normal View History

2007-09-30 02:37:06 +00:00
/****************************/
/* EESCHEMA - files-io.cpp */
/****************************/
#include "fctsys.h"
#include "gr_basic.h"
#include "common.h"
#include "program.h"
#include "libcmp.h"
#include "general.h"
#include "protos.h"
#include "id.h"
/* Fonctions locales */
/****************************************************************/
2007-09-30 02:37:06 +00:00
void WinEDA_SchematicFrame::Save_File( wxCommandEvent& event )
/****************************************************************/
2007-09-30 02:37:06 +00:00
/* Commands to save project or the current page.
2007-09-30 02:37:06 +00:00
*/
{
2007-09-30 02:37:06 +00:00
int id = event.GetId();
switch( id )
{
case ID_SAVE_PROJECT: /* Update Schematic File */
SaveProject();
2007-09-30 02:37:06 +00:00
break;
case ID_SAVE_ONE_SHEET: /* Update Schematic File */
SaveEEFile( NULL, FILE_SAVE_AS );
break;
case ID_SAVE_ONE_SHEET_AS: /* Save EED (new name) */
SaveEEFile( NULL, FILE_SAVE_NEW );
break;
default:
DisplayError( this, wxT( "WinEDA_SchematicFrame::Save_File Internal Error" ) );
break;
}
}
/************************************************************************************/
int WinEDA_SchematicFrame::LoadOneEEProject( const wxString& FileName, bool IsNew )
/************************************************************************************/
{
2008-03-20 01:50:21 +00:00
/*
* Load an entire project
* ( schematic root file and its subhierarchies, the configuration and the libs
* which are not already loaded)
*/
2008-03-20 01:50:21 +00:00
SCH_SCREEN* screen;
wxString FullFileName, msg;
bool LibCacheExist = FALSE;
EDA_ScreenList ScreenList;
for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() )
{
if( screen->IsModify() )
break;
}
if( screen )
{
if( !IsOK( this, _( "Clear Schematic Hierarchy (modified!)?" ) ) )
return FALSE;
if( g_RootSheet->m_AssociatedScreen->m_FileName != g_DefaultSchematicFileName )
SetLastProject( g_RootSheet->m_AssociatedScreen->m_FileName );
}
FullFileName = FileName;
if( ( FullFileName.IsEmpty() ) && !IsNew )
{
wxString mask = wxT( "*" ) + g_SchExtBuffer;
FullFileName = EDA_FileSelector( _( "Schematic files:" ),
wxEmptyString, /* Chemin par defaut */
wxEmptyString, /* nom fichier par defaut */
g_SchExtBuffer, /* extension par defaut */
mask, /* Masque d'affichage */
this,
wxFD_OPEN,
TRUE
);
2008-03-20 01:50:21 +00:00
if( FullFileName.IsEmpty() )
return 0;
2008-03-20 01:50:21 +00:00
}
if( g_RootSheet )
{
SAFE_DELETE( g_RootSheet );
2008-03-20 01:50:21 +00:00
}
CreateScreens();
ActiveScreen = GetScreen();
screen = (SCH_SCREEN*) GetScreen();
2008-03-20 01:50:21 +00:00
wxSetWorkingDirectory( wxPathOnly( FullFileName ) );
GetScreen()->m_FileName = FullFileName;
g_RootSheet->SetFileName( FullFileName );
2008-03-20 01:50:21 +00:00
Affiche_Message( wxEmptyString );
MsgPanel->EraseMsgBox();
memset( &g_EESchemaVar, 0, sizeof(g_EESchemaVar) );
GetScreen()->ClrModify();
2008-03-20 01:50:21 +00:00
//m_CurrentSheet->m_AssociatedScreen->Pnext = NULL; should be by default
if( IsNew )
{
screen->m_CurrentSheetDesc = &g_Sheet_A4;
screen->SetZoom( 32 );
screen->m_Title = wxT( "noname.sch" );
GetScreen()->m_FileName = screen->m_Title;
screen->m_Company.Empty();
screen->m_Commentaire1.Empty();
screen->m_Commentaire2.Empty();
screen->m_Commentaire3.Empty();
screen->m_Commentaire4.Empty();
Read_Config( wxEmptyString, TRUE );
Zoom_Automatique( TRUE );
SetSheetNumberAndCount();
2008-03-20 01:50:21 +00:00
ReDrawPanel();
return 1;
}
// Rechargement de la configuration:
2008-03-20 01:50:21 +00:00
msg = _( "Ready\nWorking dir: \n" ) + wxGetCwd();
PrintMsg( msg );
2008-03-20 01:50:21 +00:00
Read_Config( wxEmptyString, FALSE );
// Delete old caches.
2008-03-20 01:50:21 +00:00
LibraryStruct* nextlib, * lib = g_LibraryList;
for( ; lib != NULL; lib = nextlib )
{
nextlib = lib->m_Pnext;
if( lib->m_IsLibCache )
FreeCmpLibrary( this, lib->m_Name );
}
if( IsNew )
{
if( DrawPanel )
DrawPanel->Refresh( true );
2008-03-20 01:50:21 +00:00
return 1;
}
// Loading the project library cache
2008-03-20 01:50:21 +00:00
wxString FullLibName;
wxString shortfilename;
wxSplitPath( g_RootSheet->m_AssociatedScreen->m_FileName, NULL, &shortfilename, NULL );
FullLibName << wxT( "." ) << STRING_DIR_SEP << shortfilename << wxT( ".cache" ) <<
g_LibExtBuffer;
2008-03-20 01:50:21 +00:00
if( wxFileExists( FullLibName ) )
{
wxString libname;
libname = FullLibName;
ChangeFileNameExt( libname, wxEmptyString );
msg = wxT( "Load " ) + FullLibName;
LibraryStruct* LibCache = LoadLibraryName( this, FullLibName, libname );
if( LibCache )
{
LibCache->m_IsLibCache = TRUE;
msg += wxT( " OK" );
}
else
msg += wxT( " ->Error" );
PrintMsg( msg );
LibCacheExist = TRUE;
}
if( !wxFileExists( g_RootSheet->m_AssociatedScreen->m_FileName ) && !LibCacheExist ) // Nouveau projet prpbablement
{
Zoom_Automatique( FALSE );
2008-03-20 01:50:21 +00:00
msg.Printf( _( "File %s not found (new project ?)" ),
g_RootSheet->m_AssociatedScreen->m_FileName.GetData() );
2008-03-20 01:50:21 +00:00
DisplayInfo( this, msg, 20 );
return -1;
}
//load the project.
SAFE_DELETE( g_RootSheet->m_AssociatedScreen );
bool diag = g_RootSheet->Load( this );
2008-03-20 01:50:21 +00:00
/* Reaffichage ecran de base (ROOT) si necessaire */
ActiveScreen = GetScreen();
Zoom_Automatique( FALSE );
SetSheetNumberAndCount();
DrawPanel->Refresh( true );
2008-03-20 01:50:21 +00:00
return diag;
}
/**********************************************************/
SCH_SCREEN* WinEDA_SchematicFrame::CreateNewScreen(
SCH_SCREEN* OldScreen, int TimeStamp )
/**********************************************************/
/* Routine de creation ( par allocation memoire ) d'un nouvel ecran
* cet ecran est en chainage arriere avec OldScreen
* la valeur TimeStamp est attribuee au parametre NewScreen->TimeStamp
*/
{
SCH_SCREEN* NewScreen;
NewScreen = new SCH_SCREEN( SCHEMATIC_FRAME );
2008-03-20 01:50:21 +00:00
NewScreen->SetRefreshReq();
if( OldScreen )
NewScreen->m_Company = OldScreen->m_Company;
2008-03-20 01:50:21 +00:00
NewScreen->m_TimeStamp = TimeStamp;
2008-03-20 01:50:21 +00:00
NewScreen->Pback = OldScreen;
return NewScreen;
}
2007-09-30 02:37:06 +00:00
/****************************************************/
void WinEDA_SchematicFrame::SaveProject()
/****************************************************/
2007-09-30 02:37:06 +00:00
/* Saves the entire project and creates an archive for components
* the library archive name is <root_name>.cache.lib
2007-09-30 02:37:06 +00:00
*/
{
SCH_SCREEN* screen;
wxString LibArchiveFileName;
2007-09-30 02:37:06 +00:00
EDA_ScreenList ScreenList;
for( screen = ScreenList.GetFirst(); screen != NULL;
screen = ScreenList.GetNext() )
2007-09-30 02:37:06 +00:00
{
D( printf( "SaveEEFile, %s\n", CONV_TO_UTF8( screen->m_FileName ) ); )
SaveEEFile( screen, FILE_SAVE_AS );
2007-09-30 02:37:06 +00:00
}
2007-09-30 02:37:06 +00:00
/* Creation du fichier d'archivage composants en repertoire courant */
LibArchiveFileName = MakeFileName( wxEmptyString, GetScreen()->m_FileName, wxEmptyString );
2007-09-30 02:37:06 +00:00
ChangeFileNameExt( LibArchiveFileName, wxEmptyString );
2008-03-20 01:50:21 +00:00
2007-09-30 02:37:06 +00:00
/* mise a jour extension */
LibArchiveFileName += wxT( ".cache" ) + g_LibExtBuffer;
LibArchive( this, LibArchiveFileName );
}
2007-09-30 02:37:06 +00:00
/************************/
int CountCmpNumber()
/************************/
2007-09-30 02:37:06 +00:00
/* Routine retournant le nombre de composants dans le schema,
2007-09-30 02:37:06 +00:00
* powers non comprises */
{
2008-03-20 01:50:21 +00:00
return g_RootSheet->ComponentCount();
2007-09-30 02:37:06 +00:00
/*
* BASE_SCREEN* Window;
* EDA_BaseStruct* Phead;
* int Nb = 0;
*
*
*
* Window = ScreenSch;
* while( Window )
* {
* for( Phead = Window->EEDrawList; Phead != NULL; Phead = Phead->Pnext )
* {
* if( Phead->Type() == TYPE_SCH_COMPONENT )
* {
* DrawPartStruct* Cmp = (DrawPartStruct*) Phead;
* if( Cmp->m_Field[VALUE].m_Text.GetChar( 0 ) != '#' )
* Nb++;
* }
* }
*
* Window = (BASE_SCREEN*) Window->Pnext;
* }
*
* return Nb;
*/
}