diff options
Diffstat (limited to 'gerbview/files.cpp')
-rw-r--r-- | gerbview/files.cpp | 303 |
1 files changed, 303 insertions, 0 deletions
diff --git a/gerbview/files.cpp b/gerbview/files.cpp new file mode 100644 index 0000000..2bf2ef1 --- /dev/null +++ b/gerbview/files.cpp @@ -0,0 +1,303 @@ +/** + * @file gerbview/files.cpp + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2012 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 2004-2015 KiCad Developers, see change_log.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <fctsys.h> +#include <common.h> +#include <class_drawpanel.h> +#include <confirm.h> +#include <gestfich.h> + +#include <gerbview.h> +#include <gerbview_frame.h> +#include <gerbview_id.h> +#include <class_gerbview_layer_widget.h> +#include <wildcards_and_files_ext.h> + + +void GERBVIEW_FRAME::OnGbrFileHistory( wxCommandEvent& event ) +{ + wxString fn; + + fn = GetFileFromHistory( event.GetId(), _( "Gerber files" ) ); + + if( !fn.IsEmpty() ) + { + Erase_Current_DrawLayer( false ); + LoadGerberFiles( fn ); + } +} + + +void GERBVIEW_FRAME::OnDrlFileHistory( wxCommandEvent& event ) +{ + wxString fn; + + fn = GetFileFromHistory( event.GetId(), _( "Drill files" ), &m_drillFileHistory ); + + if( !fn.IsEmpty() ) + { + Erase_Current_DrawLayer( false ); + LoadExcellonFiles( fn ); + } +} + + +/* File commands. */ +void GERBVIEW_FRAME::Files_io( wxCommandEvent& event ) +{ + int id = event.GetId(); + + switch( id ) + { + case wxID_FILE: + Erase_Current_DrawLayer( false ); + LoadGerberFiles( wxEmptyString ); + break; + + case ID_GERBVIEW_ERASE_ALL: + Clear_DrawLayers( false ); + Zoom_Automatique( false ); + m_canvas->Refresh(); + ClearMsgPanel(); + ReFillLayerWidget(); + break; + + case ID_GERBVIEW_LOAD_DRILL_FILE: + LoadExcellonFiles( wxEmptyString ); + m_canvas->Refresh(); + break; + + default: + wxFAIL_MSG( wxT( "File_io: unexpected command id" ) ); + break; + } +} + + +bool GERBVIEW_FRAME::LoadGerberFiles( const wxString& aFullFileName ) +{ + wxString filetypes; + wxArrayString filenamesList; + wxFileName filename = aFullFileName; + wxString currentPath; + + if( !filename.IsOk() ) + { + /* Standard gerber filetypes + * (See http://en.wikipedia.org/wiki/Gerber_File) + * the .gbr (.pho in legacy files) extension is the default used in Pcbnew + * However there are a lot of other extensions used for gerber files + * Because the first letter is usually g, we accept g* as extension + * (Mainly internal copper layers do not have specific extension, + * and filenames are like *.g1, *.g2 *.gb1 ...). + * Now (2014) Ucamco (the company which manager the Gerber format) encourage + * use of .gbr only and the Gerber X2 file format. + */ + filetypes = _( "Gerber files (.g* .lgr .pho)" ); + filetypes << wxT("|"); + filetypes += wxT("*.g*;*.G*;*.pho;*.PHO" ); + filetypes << wxT("|"); + + /* Special gerber filetypes */ + filetypes += _( "Top layer (*.GTL)|*.GTL;*.gtl|" ); + filetypes += _( "Bottom layer (*.GBL)|*.GBL;*.gbl|" ); + filetypes += _( "Bottom solder resist (*.GBS)|*.GBS;*.gbs|" ); + filetypes += _( "Top solder resist (*.GTS)|*.GTS;*.gts|" ); + filetypes += _( "Bottom overlay (*.GBO)|*.GBO;*.gbo|" ); + filetypes += _( "Top overlay (*.GTO)|*.GTO;*.gto|" ); + filetypes += _( "Bottom paste (*.GBP)|*.GBP;*.gbp|" ); + filetypes += _( "Top paste (*.GTP)|*.GTP;*.gtp|" ); + filetypes += _( "Keep-out layer (*.GKO)|*.GKO;*.gko|" ); + filetypes += _( "Mechanical layers (*.GMx)|*.GM1;*.gm1;*.GM2;*.gm2;*.GM3;*.gm3|" ); + filetypes += _( "Top Pad Master (*.GPT)|*.GPT;*.gpt|" ); + filetypes += _( "Bottom Pad Master (*.GPB)|*.GPB;*.gpb|" ); + + /* All filetypes */ + filetypes += AllFilesWildcard; + + /* Use the current working directory if the file name path does not exist. */ + if( filename.DirExists() ) + currentPath = filename.GetPath(); + else + currentPath = m_mruPath; + + wxFileDialog dlg( this, + _( "Open Gerber File" ), + currentPath, + filename.GetFullName(), + filetypes, + wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE | wxFD_CHANGE_DIR ); + + if( dlg.ShowModal() == wxID_CANCEL ) + return false; + + dlg.GetPaths( filenamesList ); + + // @todo Take a closer look at the CWD switching here. The current working directory + // gets changed by wxFileDialog because the wxFD_CHANGE_DIR flag is set. Is this the + // appropriate behavior? The current working directory is not returned to the previous + // value so this may be an issue elsewhere. + currentPath = wxGetCwd(); + m_mruPath = currentPath; + } + else + { + wxFileName filename = aFullFileName; + filenamesList.Add( aFullFileName ); + currentPath = filename.GetPath(); + m_mruPath = currentPath; + } + + // Read gerber files: each file is loaded on a new GerbView layer + int layer = getActiveLayer(); + + for( unsigned ii = 0; ii < filenamesList.GetCount(); ii++ ) + { + wxFileName filename = filenamesList[ii]; + + if( !filename.IsAbsolute() ) + filename.SetPath( currentPath ); + + m_lastFileName = filename.GetFullPath(); + + setActiveLayer( layer, false ); + + if( Read_GERBER_File( filename.GetFullPath(), filename.GetFullPath() ) ) + { + UpdateFileHistory( m_lastFileName ); + + layer = getNextAvailableLayer( layer ); + + if( layer == NO_AVAILABLE_LAYERS ) + { + wxString msg = wxT( "No more empty available layers.\n" + "The remaining gerber files will not be loaded." ); + wxMessageBox( msg ); + break; + } + + setActiveLayer( layer, false ); + } + } + + Zoom_Automatique( false ); + + // Synchronize layers tools with actual active layer: + ReFillLayerWidget(); + setActiveLayer( getActiveLayer() ); + m_LayersManager->UpdateLayerIcons(); + syncLayerBox(); + return true; +} + + +bool GERBVIEW_FRAME::LoadExcellonFiles( const wxString& aFullFileName ) +{ + wxString filetypes; + wxArrayString filenamesList; + wxFileName filename = aFullFileName; + wxString currentPath; + + if( !filename.IsOk() ) + { + filetypes = wxGetTranslation( DrillFileWildcard ); + filetypes << wxT("|"); + /* All filetypes */ + filetypes += wxGetTranslation( AllFilesWildcard ); + + /* Use the current working directory if the file name path does not exist. */ + if( filename.DirExists() ) + currentPath = filename.GetPath(); + else + currentPath = m_mruPath; + + wxFileDialog dlg( this, + _( "Open Drill File" ), + currentPath, + filename.GetFullName(), + filetypes, + wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE | wxFD_CHANGE_DIR ); + + if( dlg.ShowModal() == wxID_CANCEL ) + return false; + + dlg.GetPaths( filenamesList ); + currentPath = wxGetCwd(); + m_mruPath = currentPath; + } + else + { + wxFileName filename = aFullFileName; + filenamesList.Add( aFullFileName ); + currentPath = filename.GetPath(); + m_mruPath = currentPath; + } + + // Read gerber files: each file is loaded on a new GerbView layer + int layer = getActiveLayer(); + + for( unsigned ii = 0; ii < filenamesList.GetCount(); ii++ ) + { + wxFileName filename = filenamesList[ii]; + + if( !filename.IsAbsolute() ) + filename.SetPath( currentPath ); + + m_lastFileName = filename.GetFullPath(); + + setActiveLayer( layer, false ); + + if( Read_EXCELLON_File( filename.GetFullPath() ) ) + { + // Update the list of recent drill files. + UpdateFileHistory( filename.GetFullPath(), &m_drillFileHistory ); + + layer = getNextAvailableLayer( layer ); + + if( layer == NO_AVAILABLE_LAYERS ) + { + wxString msg = wxT( "No more empty available layers.\n" + "The remaining gerber files will not be loaded." ); + wxMessageBox( msg ); + break; + } + + setActiveLayer( layer, false ); + } + } + + Zoom_Automatique( false ); + + // Synchronize layers tools with actual active layer: + ReFillLayerWidget(); + setActiveLayer( getActiveLayer() ); + m_LayersManager->UpdateLayerIcons(); + syncLayerBox(); + + return true; +} |