kicad/gerbview/files.cpp

227 lines
5.5 KiB
C++

/******************************************************/
/* Files.cp: Lecture / Sauvegarde des fichiers gerber */
/******************************************************/
#include "fctsys.h"
#include "common.h"
#include "gerbview.h"
#include "pcbplot.h"
#include "protos.h"
#include "id.h"
/* Routines locales */
static void LoadDCodeFile(WinEDA_GerberFrame * frame, const wxString & FullFileName, wxDC * DC);
/********************************************************/
void WinEDA_GerberFrame::Files_io(wxCommandEvent& event)
/********************************************************/
/* Gestion generale des commandes de lecture de fichiers
*/
{
int id = event.GetId();
wxClientDC dc(DrawPanel);
DrawPanel->CursorOff(&dc);
switch (id)
{
case ID_MENU_LOAD_FILE:
case ID_LOAD_FILE:
if ( Clear_Pcb(&dc, TRUE) )
{
LoadOneGerberFile(wxEmptyString, &dc, 0);
}
break;
case ID_MENU_INC_LAYER_AND_APPEND_FILE:
case ID_INC_LAYER_AND_APPEND_FILE:
{
int layer = GetScreen()->m_Active_Layer;
GetScreen()->m_Active_Layer++;
if( ! LoadOneGerberFile(wxEmptyString, &dc, 0) )
GetScreen()->m_Active_Layer = layer;
SetToolbars();
}
break;
case ID_MENU_APPEND_FILE:
case ID_APPEND_FILE:
LoadOneGerberFile(wxEmptyString, &dc, 0);
break;
case ID_MENU_NEW_BOARD:
case ID_NEW_BOARD:
Clear_Pcb(&dc, TRUE);
Zoom_Automatique(FALSE);
GetScreen()->SetRefreshReq();
break;
case ID_LOAD_FILE_1:
case ID_LOAD_FILE_2:
case ID_LOAD_FILE_3:
case ID_LOAD_FILE_4:
case ID_LOAD_FILE_5:
case ID_LOAD_FILE_6:
case ID_LOAD_FILE_7:
case ID_LOAD_FILE_8:
case ID_LOAD_FILE_9:
case ID_LOAD_FILE_10:
if ( Clear_Pcb(&dc, TRUE) )
{
LoadOneGerberFile(
GetLastProject(id - ID_LOAD_FILE_1).GetData(),
&dc, FALSE);
}
break;
case ID_GERBVIEW_LOAD_DRILL_FILE:
DisplayError(this, _("Not yet available..."));
break;
case ID_GERBVIEW_LOAD_DCODE_FILE:
LoadDCodeFile(this, wxEmptyString, &dc);
break;
case ID_SAVE_BOARD:
case ID_MENU_SAVE_BOARD:
SaveGerberFile(GetScreen()->m_FileName, &dc);
break;
case ID_MENU_SAVE_BOARD_AS:
SaveGerberFile(wxEmptyString, &dc);
break;
default:
DisplayError(this, wxT("File_io Internal Error") );
break;
}
DrawPanel->MouseToCursorSchema();
DrawPanel->CursorOn(&dc);
}
/*******************************************************************************************/
int WinEDA_GerberFrame::LoadOneGerberFile(const wxString & FullFileName,
wxDC * DC, int mode)
/*******************************************************************************************/
/*
Lecture d'un fichier PCB, le nom etant dans PcbNameBuffer.s
retourne:
0 si fichier non lu ( annulation de commande ... )
1 si OK
*/
{
wxString filename = FullFileName;
wxString path = wxPathOnly(FullFileName);
ActiveScreen = GetScreen();
if( filename == wxEmptyString)
{
wxString mask = wxT("*") + g_PhotoFilenameExt;
mask += wxT(";*.gbr;*.gbx;*.lgr;*.ger");
filename = EDA_FileSelector(_("Gerber files:"),
path, /* Chemin par defaut */
wxEmptyString, /* nom fichier par defaut */
g_PhotoFilenameExt, /* extension par defaut */
mask, /* Masque d'affichage */
this,
0,
FALSE
);
if ( filename == wxEmptyString ) return FALSE;
}
GetScreen()->m_FileName = filename;
wxSetWorkingDirectory(path);
ChangeFileNameExt(filename,g_PenFilenameExt);
if ( Read_GERBER_File(DC, GetScreen()->m_FileName, filename) )
SetLastProject(GetScreen()->m_FileName);
Zoom_Automatique(FALSE);
GetScreen()->SetRefreshReq();
g_SaveTime = time(NULL);
return(1);
}
/**********************************************************************************************/
static void LoadDCodeFile(WinEDA_GerberFrame * frame, const wxString & FullFileName, wxDC * DC)
/**********************************************************************************************/
/*
Lecture d'un fichier PCB, le nom etant dans PcbNameBuffer.s
retourne:
0 si fichier non lu ( annulation de commande ... )
1 si OK
*/
{
wxString filename = FullFileName;
ActiveScreen = frame->GetScreen();
if( filename == wxEmptyString)
{
wxString penfilesmask( wxT("*") );
penfilesmask += g_PenFilenameExt;
filename = frame->GetScreen()->m_FileName;
ChangeFileNameExt(filename,g_PenFilenameExt);
filename = EDA_FileSelector(_("D CODES files:"),
wxEmptyString, /* Chemin par defaut */
filename, /* nom fichier par defaut */
g_PenFilenameExt, /* extension par defaut */
penfilesmask, /* Masque d'affichage */
frame,
0,
TRUE
);
if ( filename == wxEmptyString ) return;
}
frame->Read_D_Code_File(filename);
frame->CopyDCodesSizeToItems();
frame->GetScreen()->SetRefreshReq();
}
/*******************************************************************************/
bool WinEDA_GerberFrame::SaveGerberFile(const wxString & FullFileName, wxDC * DC)
/*******************************************************************************/
/* Sauvegarde du fichier PCB en format ASCII
*/
{
wxString filename = FullFileName;
if( filename == wxEmptyString )
{
wxString mask( wxT("*"));
mask += g_PhotoFilenameExt;
filename = EDA_FileSelector(_("Gerber files:"),
wxEmptyString, /* Chemin par defaut */
GetScreen()->m_FileName, /* nom fichier par defaut */
g_PhotoFilenameExt, /* extension par defaut */
mask, /* Masque d'affichage */
this,
wxFD_SAVE,
FALSE
);
if ( filename.IsEmpty() ) return FALSE;
}
GetScreen()->m_FileName = filename;
// TODO
return TRUE;
}