2011-10-13 19:56:32 +00:00
|
|
|
/*
|
|
|
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2004-2010 Jean-Pierre Charras, jean-pierre.charras@gpisa-lab.inpg.fr
|
|
|
|
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
|
|
|
|
* Copyright (C) 2010 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
|
|
|
|
*/
|
|
|
|
|
2011-09-23 13:57:12 +00:00
|
|
|
/**
|
|
|
|
* @file pcbnew/files.cpp
|
|
|
|
* @brief Read and write board files.
|
|
|
|
*/
|
2007-06-05 12:10:51 +00:00
|
|
|
|
2012-01-23 04:33:36 +00:00
|
|
|
#include <fctsys.h>
|
|
|
|
#include <class_drawpanel.h>
|
|
|
|
#include <confirm.h>
|
|
|
|
#include <kicad_string.h>
|
|
|
|
#include <gestfich.h>
|
|
|
|
#include <wxPcbStruct.h>
|
|
|
|
#include <macros.h>
|
|
|
|
#include <pcbcommon.h>
|
|
|
|
#include <3d_viewer.h>
|
|
|
|
#include <richio.h>
|
|
|
|
#include <filter_reader.h>
|
|
|
|
#include <appl_wxstruct.h>
|
2013-01-12 17:32:24 +00:00
|
|
|
#include <msgpanel.h>
|
2007-06-05 12:10:51 +00:00
|
|
|
|
2012-01-23 04:33:36 +00:00
|
|
|
#include <pcbnew.h>
|
|
|
|
#include <pcbnew_id.h>
|
|
|
|
#include <io_mgr.h>
|
2012-02-16 20:03:33 +00:00
|
|
|
#include <wildcards_and_files_ext.h>
|
2011-09-23 13:57:12 +00:00
|
|
|
|
2012-01-23 04:33:36 +00:00
|
|
|
#include <class_board.h>
|
2012-04-07 18:05:56 +00:00
|
|
|
#include <build_version.h> // LEGACY_BOARD_FILE_VERSION
|
2011-09-23 13:57:12 +00:00
|
|
|
|
2013-07-01 06:47:36 +00:00
|
|
|
//#define USE_INSTRUMENTATION true
|
|
|
|
#define USE_INSTRUMENTATION false
|
|
|
|
|
2011-12-05 17:22:19 +00:00
|
|
|
|
2012-12-20 20:20:56 +00:00
|
|
|
static const wxString backupFileExtensionSuffix( wxT( "-bak" ) );
|
2012-12-27 16:42:41 +00:00
|
|
|
static const wxString autosaveFilePrefix( wxT( "_autosave-" ) );
|
2010-04-28 14:06:14 +00:00
|
|
|
|
2011-03-01 19:26:17 +00:00
|
|
|
void PCB_EDIT_FRAME::OnFileHistory( wxCommandEvent& event )
|
2009-01-17 20:31:19 +00:00
|
|
|
{
|
|
|
|
wxString fn;
|
|
|
|
|
|
|
|
fn = GetFileFromHistory( event.GetId(), _( "Printed circuit board" ) );
|
|
|
|
|
|
|
|
if( fn != wxEmptyString )
|
|
|
|
{
|
2011-12-22 13:28:11 +00:00
|
|
|
m_canvas->EndMouseCapture( ID_NO_TOOL_SELECTED, m_canvas->GetDefaultCursor() );
|
2009-01-17 20:31:19 +00:00
|
|
|
::wxSetWorkingDirectory( ::wxPathOnly( fn ) );
|
2010-05-30 09:46:37 +00:00
|
|
|
LoadOnePcbFile( fn );
|
2009-01-17 20:31:19 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-08-06 02:02:39 +00:00
|
|
|
|
2011-03-01 19:26:17 +00:00
|
|
|
void PCB_EDIT_FRAME::Files_io( wxCommandEvent& event )
|
2007-06-05 12:10:51 +00:00
|
|
|
{
|
2007-08-06 02:02:39 +00:00
|
|
|
int id = event.GetId();
|
|
|
|
wxString msg;
|
|
|
|
|
2011-02-09 18:41:46 +00:00
|
|
|
// If an edition is in progress, stop it.
|
|
|
|
// For something else than save, get rid of current tool.
|
|
|
|
if( id == ID_SAVE_BOARD )
|
2011-12-22 13:28:11 +00:00
|
|
|
m_canvas->EndMouseCapture( -1, m_canvas->GetDefaultCursor() );
|
2011-02-09 18:41:46 +00:00
|
|
|
else
|
2011-12-22 13:28:11 +00:00
|
|
|
m_canvas->EndMouseCapture( ID_NO_TOOL_SELECTED, m_canvas->GetDefaultCursor() );
|
2007-08-06 02:02:39 +00:00
|
|
|
|
|
|
|
switch( id )
|
|
|
|
{
|
|
|
|
case ID_LOAD_FILE:
|
2012-08-29 16:59:50 +00:00
|
|
|
LoadOnePcbFile( GetBoard()->GetFileName(), false, true );
|
2007-08-06 02:02:39 +00:00
|
|
|
break;
|
|
|
|
|
2012-12-21 07:58:51 +00:00
|
|
|
case ID_MENU_READ_BOARD_BACKUP_FILE:
|
|
|
|
case ID_MENU_RECOVER_BOARD_AUTOSAVE:
|
2009-04-05 20:49:15 +00:00
|
|
|
{
|
2012-12-21 07:58:51 +00:00
|
|
|
wxFileName currfn = GetBoard()->GetFileName();
|
|
|
|
wxFileName fn = currfn;
|
|
|
|
if( id == ID_MENU_RECOVER_BOARD_AUTOSAVE )
|
|
|
|
{
|
2012-12-27 16:42:41 +00:00
|
|
|
wxString rec_name = autosaveFilePrefix + fn.GetName();
|
2012-12-21 07:58:51 +00:00
|
|
|
fn.SetName( rec_name );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
wxString backup_ext = fn.GetExt()+ backupFileExtensionSuffix;
|
|
|
|
fn.SetExt( backup_ext );
|
|
|
|
}
|
2011-08-26 17:01:17 +00:00
|
|
|
|
2012-05-29 21:01:17 +00:00
|
|
|
if( !fn.FileExists() )
|
|
|
|
{
|
2012-12-20 20:20:56 +00:00
|
|
|
msg.Printf( _( "Recovery file <%s> not found." ),
|
|
|
|
GetChars( fn.GetFullPath() ) );
|
2012-05-29 21:01:17 +00:00
|
|
|
DisplayInfoMessage( this, msg );
|
2007-08-06 02:02:39 +00:00
|
|
|
break;
|
2012-05-29 21:01:17 +00:00
|
|
|
}
|
2009-04-05 20:49:15 +00:00
|
|
|
|
2012-12-21 07:58:51 +00:00
|
|
|
msg.Printf( _( "OK to load recovery or backup file <%s>" ),
|
|
|
|
GetChars(fn.GetFullPath() ) );
|
|
|
|
|
|
|
|
if( !IsOK( this, msg ) )
|
|
|
|
break;
|
2012-05-29 21:01:17 +00:00
|
|
|
|
2012-12-21 07:58:51 +00:00
|
|
|
GetScreen()->ClrModify(); // do not prompt the user for changes
|
2012-05-29 21:01:17 +00:00
|
|
|
LoadOnePcbFile( fn.GetFullPath(), false );
|
2012-08-29 16:59:50 +00:00
|
|
|
|
2012-12-21 07:58:51 +00:00
|
|
|
// Re-set the name since name or extension was changed
|
|
|
|
GetBoard()->SetFileName( currfn.GetFullPath() );
|
2012-05-29 21:01:17 +00:00
|
|
|
UpdateTitle();
|
|
|
|
}
|
2007-08-06 02:02:39 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case ID_APPEND_FILE:
|
2009-09-27 11:00:21 +00:00
|
|
|
LoadOnePcbFile( wxEmptyString, true );
|
2007-08-06 02:02:39 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case ID_NEW_BOARD:
|
2012-08-29 16:59:50 +00:00
|
|
|
{
|
|
|
|
Clear_Pcb( true );
|
2012-10-18 19:31:40 +00:00
|
|
|
wxFileName fn( wxT( "noname" ) );
|
|
|
|
fn.AssignCwd();
|
|
|
|
fn.SetExt( PcbFileExtension );
|
|
|
|
GetBoard()->SetFileName( fn.GetFullPath() );
|
2012-08-29 16:59:50 +00:00
|
|
|
UpdateTitle();
|
|
|
|
ReCreateLayerBox( NULL );
|
|
|
|
}
|
2007-08-06 02:02:39 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case ID_SAVE_BOARD:
|
2012-08-29 16:59:50 +00:00
|
|
|
SavePcbFile( GetBoard()->GetFileName() );
|
2007-08-06 02:02:39 +00:00
|
|
|
break;
|
|
|
|
|
2009-09-22 12:27:57 +00:00
|
|
|
case ID_SAVE_BOARD_AS:
|
2007-08-06 02:02:39 +00:00
|
|
|
SavePcbFile( wxEmptyString );
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
DisplayError( this, wxT( "File_io Internal Error" ) ); break;
|
|
|
|
}
|
2007-06-05 12:10:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-03-01 19:26:17 +00:00
|
|
|
bool PCB_EDIT_FRAME::LoadOnePcbFile( const wxString& aFileName, bool aAppend,
|
|
|
|
bool aForceFileDialog )
|
2007-06-05 12:10:51 +00:00
|
|
|
{
|
2010-12-29 17:47:32 +00:00
|
|
|
if( GetScreen()->IsModify() && !aAppend )
|
2007-08-06 02:02:39 +00:00
|
|
|
{
|
2013-04-05 07:38:00 +00:00
|
|
|
if( !IsOK( this,
|
|
|
|
_( "The current board has been modified.\n"
|
|
|
|
"Do you wish to discard the changes?" ) ) )
|
2009-09-22 12:27:57 +00:00
|
|
|
return false;
|
2007-08-06 02:02:39 +00:00
|
|
|
}
|
|
|
|
|
2010-12-29 17:47:32 +00:00
|
|
|
if( aAppend )
|
2007-08-06 02:02:39 +00:00
|
|
|
{
|
2012-08-29 16:59:50 +00:00
|
|
|
GetBoard()->SetFileName( wxEmptyString );
|
2010-02-19 13:23:58 +00:00
|
|
|
OnModify();
|
2009-01-05 05:21:35 +00:00
|
|
|
GetBoard()->m_Status_Pcb = 0;
|
2007-08-06 02:02:39 +00:00
|
|
|
}
|
|
|
|
|
2012-05-29 21:01:17 +00:00
|
|
|
wxFileName fileName = aFileName;
|
|
|
|
|
|
|
|
IO_MGR::PCB_FILE_T pluginType = IO_MGR::LEGACY;
|
|
|
|
|
2012-05-30 14:14:42 +00:00
|
|
|
// This is a subset of all PLUGINs which are trusted to be able to
|
|
|
|
// load a BOARD. Order is subject to change as KICAD plugin matures.
|
2012-05-30 21:40:32 +00:00
|
|
|
// User may occasionally use the wrong plugin to load a *.brd file,
|
2012-10-08 19:34:04 +00:00
|
|
|
// (since both legacy and eagle use *.brd extension),
|
2012-05-30 14:14:42 +00:00
|
|
|
// but eventually *.kicad_pcb will be more common than legacy *.brd files.
|
2012-06-14 19:10:32 +00:00
|
|
|
static const struct
|
|
|
|
{
|
2012-05-29 21:01:17 +00:00
|
|
|
const wxString& filter;
|
|
|
|
IO_MGR::PCB_FILE_T pluginType;
|
2012-06-14 19:10:32 +00:00
|
|
|
} loaders[] =
|
|
|
|
{
|
2012-05-29 21:01:17 +00:00
|
|
|
{ PcbFileWildcard, IO_MGR::KICAD },
|
2012-12-14 16:54:54 +00:00
|
|
|
{ LegacyPcbFileWildcard, IO_MGR::LEGACY },
|
2012-05-29 21:01:17 +00:00
|
|
|
{ EaglePcbFileWildcard, IO_MGR::EAGLE },
|
2012-12-29 09:54:25 +00:00
|
|
|
{ PCadPcbFileWildcard, IO_MGR::PCAD },
|
2012-05-29 21:01:17 +00:00
|
|
|
};
|
2008-04-29 03:18:02 +00:00
|
|
|
|
2010-05-17 20:35:46 +00:00
|
|
|
if( !fileName.IsOk() || !fileName.FileExists() || aForceFileDialog )
|
2007-08-06 02:02:39 +00:00
|
|
|
{
|
2010-05-17 20:35:46 +00:00
|
|
|
wxString name;
|
|
|
|
wxString path = wxGetCwd();
|
2012-05-29 21:01:17 +00:00
|
|
|
wxString fileFilters;
|
|
|
|
|
2012-05-30 14:14:42 +00:00
|
|
|
for( unsigned i=0; i<DIM( loaders ); ++i )
|
2012-05-29 21:01:17 +00:00
|
|
|
{
|
|
|
|
if( i > 0 )
|
|
|
|
fileFilters += wxChar( '|' );
|
|
|
|
|
2012-05-30 14:14:42 +00:00
|
|
|
fileFilters += wxGetTranslation( loaders[i].filter );
|
2012-05-29 21:01:17 +00:00
|
|
|
}
|
2010-05-17 20:35:46 +00:00
|
|
|
|
|
|
|
if( aForceFileDialog && fileName.FileExists() )
|
|
|
|
{
|
|
|
|
path = fileName.GetPath();
|
|
|
|
name = fileName.GetFullName();
|
|
|
|
}
|
2009-09-22 12:27:57 +00:00
|
|
|
|
2012-05-29 21:01:17 +00:00
|
|
|
wxFileDialog dlg( this, _( "Open Board File" ), path, name, fileFilters,
|
2010-05-17 20:35:46 +00:00
|
|
|
wxFD_OPEN | wxFD_FILE_MUST_EXIST );
|
2009-09-22 12:27:57 +00:00
|
|
|
|
|
|
|
if( dlg.ShowModal() == wxID_CANCEL )
|
|
|
|
return false;
|
|
|
|
|
|
|
|
fileName = dlg.GetPath();
|
2010-05-17 20:35:46 +00:00
|
|
|
|
2012-05-29 21:01:17 +00:00
|
|
|
int chosenFilter = dlg.GetFilterIndex();
|
|
|
|
pluginType = loaders[chosenFilter].pluginType;
|
2007-08-06 02:02:39 +00:00
|
|
|
}
|
2012-12-20 20:20:56 +00:00
|
|
|
else // if a filename is given, force IO_MGR::KICAD if the file ext is kicad_pcb
|
2012-06-14 19:10:32 +00:00
|
|
|
// for instance if the filename comes from file history
|
2012-12-20 20:20:56 +00:00
|
|
|
// or it is a backup file with ext = kicad_pcb-bak
|
2012-06-14 19:10:32 +00:00
|
|
|
{
|
2012-12-20 20:20:56 +00:00
|
|
|
wxString backup_ext = IO_MGR::GetFileExtension( IO_MGR::KICAD ) +
|
|
|
|
backupFileExtensionSuffix;
|
|
|
|
if( fileName.GetExt() == IO_MGR::GetFileExtension( IO_MGR::KICAD ) ||
|
|
|
|
fileName.GetExt() == backup_ext )
|
2012-06-14 19:10:32 +00:00
|
|
|
pluginType = IO_MGR::KICAD;
|
|
|
|
}
|
2008-04-29 03:18:02 +00:00
|
|
|
|
2012-05-29 21:01:17 +00:00
|
|
|
PLUGIN::RELEASER pi( IO_MGR::PluginFind( pluginType ) );
|
|
|
|
|
|
|
|
if( !fileName.HasExt() )
|
|
|
|
fileName.SetExt( pi->GetFileExtension() );
|
|
|
|
|
2010-12-29 17:47:32 +00:00
|
|
|
if( !aAppend )
|
2013-01-04 17:47:59 +00:00
|
|
|
{
|
|
|
|
if( !wxGetApp().LockFile( fileName.GetFullPath() ) )
|
|
|
|
{
|
|
|
|
DisplayError( this, _( "This file is already open." ) );
|
|
|
|
return false;
|
|
|
|
}
|
2008-04-29 03:18:02 +00:00
|
|
|
Clear_Pcb( false ); // pass false since we prompted above for a modified board
|
2013-01-04 17:47:59 +00:00
|
|
|
}
|
2008-04-29 03:18:02 +00:00
|
|
|
|
2012-12-20 20:20:56 +00:00
|
|
|
CheckForAutoSaveFile( fileName, fileName.GetExt() );
|
2007-08-06 02:02:39 +00:00
|
|
|
|
2012-08-29 16:59:50 +00:00
|
|
|
GetBoard()->SetFileName( fileName.GetFullPath() );
|
2007-08-06 02:02:39 +00:00
|
|
|
|
2011-11-29 03:08:14 +00:00
|
|
|
if( !aAppend )
|
|
|
|
{
|
|
|
|
// Update the option toolbar
|
|
|
|
m_DisplayPcbTrackFill = DisplayOpt.DisplayPcbTrackFill;
|
|
|
|
m_DisplayModText = DisplayOpt.DisplayModText;
|
|
|
|
m_DisplayModEdge = DisplayOpt.DisplayModEdge;
|
|
|
|
m_DisplayPadFill = DisplayOpt.DisplayPadFill;
|
|
|
|
m_DisplayViaFill = DisplayOpt.DisplayViaFill;
|
2012-02-29 15:25:38 +00:00
|
|
|
|
|
|
|
// load project settings before BOARD, in case BOARD file has overrides.
|
2012-08-29 16:59:50 +00:00
|
|
|
LoadProjectSettings( GetBoard()->GetFileName() );
|
2011-11-29 03:08:14 +00:00
|
|
|
}
|
2011-12-15 02:24:52 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
GetBoard()->m_NetClasses.Clear();
|
|
|
|
}
|
|
|
|
|
2012-11-19 16:19:38 +00:00
|
|
|
BOARD* loadedBoard = 0; // it will be set to non-NULL if loaded OK
|
2011-11-29 03:08:14 +00:00
|
|
|
|
|
|
|
try
|
|
|
|
{
|
2012-06-01 07:39:32 +00:00
|
|
|
PROPERTIES props;
|
|
|
|
|
2012-11-19 16:19:38 +00:00
|
|
|
// EAGLE_PLUGIN can use this info to center the BOARD, but it does not yet.
|
2012-06-01 07:39:32 +00:00
|
|
|
props["page_width"] = wxString::Format( wxT( "%d" ), GetPageSizeIU().x );
|
|
|
|
props["page_height"] = wxString::Format( wxT( "%d" ), GetPageSizeIU().y );
|
|
|
|
|
2013-07-01 06:47:36 +00:00
|
|
|
#if USE_INSTRUMENTATION
|
2013-07-01 01:05:40 +00:00
|
|
|
// measure the time to load a BOARD.
|
|
|
|
unsigned startTime = GetRunningMicroSecs();
|
|
|
|
#endif
|
|
|
|
|
2011-11-29 03:08:14 +00:00
|
|
|
// load or append either:
|
2012-08-29 16:59:50 +00:00
|
|
|
loadedBoard = pi->Load( GetBoard()->GetFileName(), aAppend ? GetBoard() : NULL, &props );
|
|
|
|
|
2013-07-01 06:47:36 +00:00
|
|
|
#if USE_INSTRUMENTATION
|
2013-07-01 01:05:40 +00:00
|
|
|
unsigned stopTime = GetRunningMicroSecs();
|
|
|
|
printf( "PLUGIN::Load(): %u usecs\n", stopTime - startTime );
|
|
|
|
#endif
|
|
|
|
|
2012-08-29 16:59:50 +00:00
|
|
|
// the Load plugin method makes a 'fresh' board, so we need to
|
|
|
|
// set its own name
|
|
|
|
GetBoard()->SetFileName( fileName.GetFullPath() );
|
2011-11-29 03:08:14 +00:00
|
|
|
|
|
|
|
if( !aAppend )
|
++PCBNew
* Removed Pcb_Frame argument from BOARD() constructor, since it precludes
having a BOARD being edited by more than one editor, it was a bad design.
And this meant removing m_PcbFrame from BOARD.
* removed BOARD::SetWindowFrame(), and BOARD::m_PcbFrame
* Removed the global BOARD_DESIGN_SETTINGS which was in class_board.cpp
* added BOARD_DESIGN_SETTINGS to the BOARD class, a full instance
* a couple dialogs now only change BOARD_DESIGN_SETTINGS when OK is pressed,
such as dialog_mask_clearance, dialog_drc, etc.
* Removed common/pcbcommon.cpp's int g_CurrentVersionPCB = 1 and replaced it
with build_version.h's #define BOARD_FILE_VERSION, although there may be a
better place for this constant.
* Made the public functions in PARAM_CFG_ARRAY be type const.
void SaveParam(..) const and void ReadParam(..) const
* PARAM_CFG_BASE now has virtual destructor since we have various way of
destroying the derived class and boost::ptr_vector must be told about this.
* Pass const PARAM_CFG_ARRAY& instead of PARAM_CFG_ARRAY so that we can use
an automatic PARAM_CFG_ARRAY which is on the stack.\
* PCB_EDIT_FRAME::GetProjectFileParameters() may no longer cache the array,
since it has to access the current BOARD and the BOARD can change.
Remember BOARD_DESIGN_SETTINGS are now in the BOARD.
* Made the m_BoundingBox member private, this was a brutally hard task,
and indicative of the lack of commitment to accessors and object oriented
design on the part of KiCad developers. We must do better.
Added BOARD::GetBoundingBox, SetBoundingBox(), ComputeBoundingBox().
* Added PCB_BASE_FRAME::GetBoardBoundingBox() which calls BOARD::ComputeBoundingBox()
2011-12-05 06:15:33 +00:00
|
|
|
{
|
2012-05-29 21:01:17 +00:00
|
|
|
if( pluginType == IO_MGR::LEGACY &&
|
|
|
|
loadedBoard->GetFileFormatVersionAtLoad() < LEGACY_BOARD_FILE_VERSION )
|
++PCBNew
* Removed Pcb_Frame argument from BOARD() constructor, since it precludes
having a BOARD being edited by more than one editor, it was a bad design.
And this meant removing m_PcbFrame from BOARD.
* removed BOARD::SetWindowFrame(), and BOARD::m_PcbFrame
* Removed the global BOARD_DESIGN_SETTINGS which was in class_board.cpp
* added BOARD_DESIGN_SETTINGS to the BOARD class, a full instance
* a couple dialogs now only change BOARD_DESIGN_SETTINGS when OK is pressed,
such as dialog_mask_clearance, dialog_drc, etc.
* Removed common/pcbcommon.cpp's int g_CurrentVersionPCB = 1 and replaced it
with build_version.h's #define BOARD_FILE_VERSION, although there may be a
better place for this constant.
* Made the public functions in PARAM_CFG_ARRAY be type const.
void SaveParam(..) const and void ReadParam(..) const
* PARAM_CFG_BASE now has virtual destructor since we have various way of
destroying the derived class and boost::ptr_vector must be told about this.
* Pass const PARAM_CFG_ARRAY& instead of PARAM_CFG_ARRAY so that we can use
an automatic PARAM_CFG_ARRAY which is on the stack.\
* PCB_EDIT_FRAME::GetProjectFileParameters() may no longer cache the array,
since it has to access the current BOARD and the BOARD can change.
Remember BOARD_DESIGN_SETTINGS are now in the BOARD.
* Made the m_BoundingBox member private, this was a brutally hard task,
and indicative of the lack of commitment to accessors and object oriented
design on the part of KiCad developers. We must do better.
Added BOARD::GetBoundingBox, SetBoundingBox(), ComputeBoundingBox().
* Added PCB_BASE_FRAME::GetBoardBoundingBox() which calls BOARD::ComputeBoundingBox()
2011-12-05 06:15:33 +00:00
|
|
|
{
|
2012-12-20 20:20:56 +00:00
|
|
|
DisplayInfoMessage( this,
|
2013-07-01 01:05:40 +00:00
|
|
|
_( "This file was created by an older version of Pcbnew.\n"
|
|
|
|
"It will be stored in the new file format when you save this file again." ) );
|
++PCBNew
* Removed Pcb_Frame argument from BOARD() constructor, since it precludes
having a BOARD being edited by more than one editor, it was a bad design.
And this meant removing m_PcbFrame from BOARD.
* removed BOARD::SetWindowFrame(), and BOARD::m_PcbFrame
* Removed the global BOARD_DESIGN_SETTINGS which was in class_board.cpp
* added BOARD_DESIGN_SETTINGS to the BOARD class, a full instance
* a couple dialogs now only change BOARD_DESIGN_SETTINGS when OK is pressed,
such as dialog_mask_clearance, dialog_drc, etc.
* Removed common/pcbcommon.cpp's int g_CurrentVersionPCB = 1 and replaced it
with build_version.h's #define BOARD_FILE_VERSION, although there may be a
better place for this constant.
* Made the public functions in PARAM_CFG_ARRAY be type const.
void SaveParam(..) const and void ReadParam(..) const
* PARAM_CFG_BASE now has virtual destructor since we have various way of
destroying the derived class and boost::ptr_vector must be told about this.
* Pass const PARAM_CFG_ARRAY& instead of PARAM_CFG_ARRAY so that we can use
an automatic PARAM_CFG_ARRAY which is on the stack.\
* PCB_EDIT_FRAME::GetProjectFileParameters() may no longer cache the array,
since it has to access the current BOARD and the BOARD can change.
Remember BOARD_DESIGN_SETTINGS are now in the BOARD.
* Made the m_BoundingBox member private, this was a brutally hard task,
and indicative of the lack of commitment to accessors and object oriented
design on the part of KiCad developers. We must do better.
Added BOARD::GetBoundingBox, SetBoundingBox(), ComputeBoundingBox().
* Added PCB_BASE_FRAME::GetBoardBoundingBox() which calls BOARD::ComputeBoundingBox()
2011-12-05 06:15:33 +00:00
|
|
|
}
|
|
|
|
|
2011-12-15 02:24:52 +00:00
|
|
|
SetBoard( loadedBoard );
|
++PCBNew
* Removed Pcb_Frame argument from BOARD() constructor, since it precludes
having a BOARD being edited by more than one editor, it was a bad design.
And this meant removing m_PcbFrame from BOARD.
* removed BOARD::SetWindowFrame(), and BOARD::m_PcbFrame
* Removed the global BOARD_DESIGN_SETTINGS which was in class_board.cpp
* added BOARD_DESIGN_SETTINGS to the BOARD class, a full instance
* a couple dialogs now only change BOARD_DESIGN_SETTINGS when OK is pressed,
such as dialog_mask_clearance, dialog_drc, etc.
* Removed common/pcbcommon.cpp's int g_CurrentVersionPCB = 1 and replaced it
with build_version.h's #define BOARD_FILE_VERSION, although there may be a
better place for this constant.
* Made the public functions in PARAM_CFG_ARRAY be type const.
void SaveParam(..) const and void ReadParam(..) const
* PARAM_CFG_BASE now has virtual destructor since we have various way of
destroying the derived class and boost::ptr_vector must be told about this.
* Pass const PARAM_CFG_ARRAY& instead of PARAM_CFG_ARRAY so that we can use
an automatic PARAM_CFG_ARRAY which is on the stack.\
* PCB_EDIT_FRAME::GetProjectFileParameters() may no longer cache the array,
since it has to access the current BOARD and the BOARD can change.
Remember BOARD_DESIGN_SETTINGS are now in the BOARD.
* Made the m_BoundingBox member private, this was a brutally hard task,
and indicative of the lack of commitment to accessors and object oriented
design on the part of KiCad developers. We must do better.
Added BOARD::GetBoundingBox, SetBoundingBox(), ComputeBoundingBox().
* Added PCB_BASE_FRAME::GetBoardBoundingBox() which calls BOARD::ComputeBoundingBox()
2011-12-05 06:15:33 +00:00
|
|
|
}
|
2011-11-29 03:08:14 +00:00
|
|
|
}
|
2011-12-02 21:56:47 +00:00
|
|
|
catch( IO_ERROR ioe )
|
2011-12-28 14:15:00 +00:00
|
|
|
{
|
|
|
|
wxString msg = wxString::Format( _( "Error loading board.\n%s" ),
|
|
|
|
ioe.errorText.GetData() );
|
2011-12-22 08:07:50 +00:00
|
|
|
wxMessageBox( msg, _( "Open Board File" ), wxOK | wxICON_ERROR );
|
2011-11-29 03:08:14 +00:00
|
|
|
}
|
|
|
|
|
2011-12-15 02:24:52 +00:00
|
|
|
if( loadedBoard )
|
|
|
|
{
|
|
|
|
// we should not ask PLUGINs to do these items:
|
|
|
|
loadedBoard->BuildListOfNets();
|
|
|
|
loadedBoard->SynchronizeNetsAndNetClasses();
|
|
|
|
|
|
|
|
SetStatusText( wxEmptyString );
|
|
|
|
BestZoom();
|
|
|
|
}
|
|
|
|
|
2007-08-06 02:02:39 +00:00
|
|
|
GetScreen()->ClrModify();
|
|
|
|
|
2012-02-06 05:44:19 +00:00
|
|
|
// If append option: change the initial board name to <oldname>-append.brd
|
2010-12-29 17:47:32 +00:00
|
|
|
if( aAppend )
|
2007-08-06 02:02:39 +00:00
|
|
|
{
|
2012-08-29 16:59:50 +00:00
|
|
|
wxString new_filename = GetBoard()->GetFileName().BeforeLast( '.' );
|
2011-01-20 16:34:57 +00:00
|
|
|
|
2010-04-23 14:46:00 +00:00
|
|
|
if ( ! new_filename.EndsWith( wxT( "-append" ) ) )
|
|
|
|
new_filename += wxT( "-append" );
|
2008-07-22 05:29:16 +00:00
|
|
|
|
2010-05-17 20:35:46 +00:00
|
|
|
new_filename += wxT( "." ) + PcbFileExtension;
|
2008-07-22 05:29:16 +00:00
|
|
|
|
2010-02-19 13:23:58 +00:00
|
|
|
OnModify();
|
2012-08-29 16:59:50 +00:00
|
|
|
GetBoard()->SetFileName( new_filename );
|
2007-08-06 02:02:39 +00:00
|
|
|
}
|
|
|
|
|
2012-12-29 09:54:25 +00:00
|
|
|
// Fix the directory separator on Windows and
|
|
|
|
// force the new file format for not Kicad boards,
|
|
|
|
// to ensure the right format when saving the board
|
|
|
|
bool converted = pluginType != IO_MGR::LEGACY && pluginType != IO_MGR::KICAD;
|
|
|
|
wxString fn;
|
|
|
|
|
|
|
|
if( converted )
|
|
|
|
fn = GetBoard()->GetFileName().BeforeLast( '.' );
|
|
|
|
else
|
|
|
|
fn = GetBoard()->GetFileName();
|
|
|
|
|
2012-08-29 16:59:50 +00:00
|
|
|
fn.Replace( WIN_STRING_DIR_SEP, UNIX_STRING_DIR_SEP );
|
2012-12-29 09:54:25 +00:00
|
|
|
|
|
|
|
if( converted )
|
|
|
|
fn += wxT( "." ) + PcbFileExtension;
|
|
|
|
|
2012-08-29 16:59:50 +00:00
|
|
|
GetBoard()->SetFileName( fn );
|
2008-07-22 05:29:16 +00:00
|
|
|
|
2011-08-26 17:01:17 +00:00
|
|
|
UpdateTitle();
|
2012-12-29 09:54:25 +00:00
|
|
|
|
|
|
|
if( !converted )
|
|
|
|
UpdateFileHistory( GetBoard()->GetFileName() );
|
2008-07-22 05:29:16 +00:00
|
|
|
|
2012-02-06 05:44:19 +00:00
|
|
|
// Rebuild the new pad list (for drc and ratsnet control ...)
|
2009-05-24 18:28:36 +00:00
|
|
|
GetBoard()->m_Status_Pcb = 0;
|
2009-06-19 20:13:22 +00:00
|
|
|
|
2012-02-06 05:44:19 +00:00
|
|
|
// Dick 5-Feb-2012: I do not agree with this. The layer widget will show what
|
2012-02-06 07:14:51 +00:00
|
|
|
// is visible or not, and it would be nice for the board to look like it
|
|
|
|
// did when I saved it, immediately after loading.
|
2012-02-06 05:44:19 +00:00
|
|
|
#if 0
|
2010-01-30 20:17:56 +00:00
|
|
|
/* Reset the items visibility flag when loading a new config
|
2012-02-06 05:44:19 +00:00
|
|
|
* Because it could creates SERIOUS mistakes for the user,
|
2010-01-30 20:17:56 +00:00
|
|
|
* if board items are not visible after loading a board...
|
|
|
|
* Grid and ratsnest can be left to their previous state
|
2009-11-12 12:54:56 +00:00
|
|
|
*/
|
2010-04-23 14:46:00 +00:00
|
|
|
bool showGrid = IsElementVisible( GRID_VISIBLE );
|
|
|
|
bool showRats = IsElementVisible( RATSNEST_VISIBLE );
|
2012-02-06 05:44:19 +00:00
|
|
|
|
2010-04-23 14:46:00 +00:00
|
|
|
SetVisibleAlls();
|
2012-02-06 05:44:19 +00:00
|
|
|
|
2010-04-23 14:46:00 +00:00
|
|
|
SetElementVisibility( GRID_VISIBLE, showGrid );
|
|
|
|
SetElementVisibility( RATSNEST_VISIBLE, showRats );
|
2012-02-06 05:44:19 +00:00
|
|
|
#endif
|
2009-11-12 12:54:56 +00:00
|
|
|
|
2009-12-03 09:33:48 +00:00
|
|
|
// Update info shown by the horizontal toolbars
|
|
|
|
GetBoard()->SetCurrentNetClass( NETCLASS::Default );
|
2010-01-21 07:41:30 +00:00
|
|
|
ReFillLayerWidget();
|
|
|
|
|
2009-12-03 09:33:48 +00:00
|
|
|
ReCreateLayerBox( NULL );
|
2012-02-06 05:44:19 +00:00
|
|
|
|
2012-03-12 00:40:48 +00:00
|
|
|
// upate the layer widget to match board visibility states, both layers and render columns.
|
|
|
|
syncLayerVisibilities();
|
|
|
|
syncLayerWidgetLayer();
|
2012-02-06 05:44:19 +00:00
|
|
|
syncRenderStates();
|
2009-12-03 09:33:48 +00:00
|
|
|
|
2012-03-12 00:40:48 +00:00
|
|
|
// Update the RATSNEST items, which were not loaded at the time
|
|
|
|
// BOARD::SetVisibleElements() was called from within any PLUGIN.
|
|
|
|
// See case RATSNEST_VISIBLE: in BOARD::SetElementVisibility()
|
|
|
|
GetBoard()->SetVisibleElements( GetBoard()->GetVisibleElements() );
|
|
|
|
|
2011-03-01 19:26:17 +00:00
|
|
|
updateTraceWidthSelectBox();
|
|
|
|
updateViaSizeSelectBox();
|
|
|
|
|
2009-06-20 19:09:43 +00:00
|
|
|
// Display the loaded board:
|
2009-12-19 19:24:49 +00:00
|
|
|
Zoom_Automatique( false );
|
2009-07-30 11:04:07 +00:00
|
|
|
|
2010-04-28 14:06:14 +00:00
|
|
|
// Compile ratsnest and displays net info
|
2011-04-09 10:52:14 +00:00
|
|
|
wxBusyCursor dummy; // Displays an Hourglass while building connectivity
|
2009-05-28 08:42:24 +00:00
|
|
|
Compile_Ratsnest( NULL, true );
|
2013-01-12 17:32:24 +00:00
|
|
|
SetMsgPanel( GetBoard() );
|
2007-08-06 02:02:39 +00:00
|
|
|
|
2010-05-01 13:32:25 +00:00
|
|
|
// Refresh the 3D view, if any
|
|
|
|
if( m_Draw3DFrame )
|
|
|
|
m_Draw3DFrame->NewDisplay();
|
2008-04-18 13:28:56 +00:00
|
|
|
|
|
|
|
#if 0 && defined(DEBUG)
|
2011-09-30 18:15:37 +00:00
|
|
|
// note this freezes up Pcbnew when run under the KiCad project
|
|
|
|
// manager. runs fine from command prompt. This is because the KiCad
|
|
|
|
// project manager redirects stdout of the child Pcbnew process to itself,
|
2008-04-18 13:28:56 +00:00
|
|
|
// but never reads from that pipe, and that in turn eventually blocks
|
2011-09-30 18:15:37 +00:00
|
|
|
// the Pcbnew program when the pipe it is writing to gets full.
|
2008-04-18 13:28:56 +00:00
|
|
|
|
2007-10-31 06:40:15 +00:00
|
|
|
// Output the board object tree to stdout, but please run from command prompt:
|
2009-01-05 05:21:35 +00:00
|
|
|
GetBoard()->Show( 0, std::cout );
|
2007-08-06 02:02:39 +00:00
|
|
|
#endif
|
2008-04-18 13:28:56 +00:00
|
|
|
|
2009-09-22 12:27:57 +00:00
|
|
|
return true;
|
2007-06-05 12:10:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-10-13 19:56:32 +00:00
|
|
|
bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupFile )
|
2007-06-05 12:10:51 +00:00
|
|
|
{
|
2009-04-05 20:49:15 +00:00
|
|
|
wxFileName backupFileName;
|
|
|
|
wxFileName pcbFileName;
|
2007-10-22 20:40:18 +00:00
|
|
|
wxString upperTxt;
|
|
|
|
wxString lowerTxt;
|
|
|
|
wxString msg;
|
2009-09-27 11:00:21 +00:00
|
|
|
bool saveok = true;
|
2007-08-06 02:02:39 +00:00
|
|
|
|
2012-12-14 16:54:54 +00:00
|
|
|
IO_MGR::PCB_FILE_T pluginType;
|
2012-04-07 18:05:56 +00:00
|
|
|
|
2011-08-26 17:01:17 +00:00
|
|
|
if( aFileName == wxEmptyString )
|
2007-08-06 02:02:39 +00:00
|
|
|
{
|
2012-12-14 16:54:54 +00:00
|
|
|
wxString wildcard;
|
|
|
|
wildcard << wxGetTranslation( PcbFileWildcard ) << wxChar( '|' ) <<
|
|
|
|
wxGetTranslation( LegacyPcbFileWildcard );
|
|
|
|
|
2012-12-14 19:42:38 +00:00
|
|
|
pcbFileName = GetBoard()->GetFileName();
|
|
|
|
|
2013-04-29 16:50:10 +00:00
|
|
|
if( pcbFileName.GetName() == wxEmptyString )
|
|
|
|
{
|
|
|
|
pcbFileName.SetName( _( "Unnamed file" ) );
|
|
|
|
}
|
|
|
|
|
2012-12-14 19:42:38 +00:00
|
|
|
// Match the default wildcard filter choice, with the inital file extension shown.
|
|
|
|
// That'll be the extension unless user changes filter dropdown listbox.
|
|
|
|
pcbFileName.SetExt( KiCadPcbFileExtension );
|
|
|
|
|
2013-04-29 16:50:10 +00:00
|
|
|
wxFileDialog dlg( this, _( "Save Board File As" ), pcbFileName.GetPath(),
|
|
|
|
pcbFileName.GetFullName(),
|
2012-12-14 19:42:38 +00:00
|
|
|
wildcard, wxFD_SAVE
|
|
|
|
/* wxFileDialog is not equipped to handle multiple wildcards and
|
2012-12-14 18:14:28 +00:00
|
|
|
wxFD_OVERWRITE_PROMPT both together.
|
2012-12-14 19:42:38 +00:00
|
|
|
| wxFD_OVERWRITE_PROMPT
|
|
|
|
*/
|
|
|
|
);
|
2008-04-18 13:28:56 +00:00
|
|
|
|
2011-05-16 19:32:57 +00:00
|
|
|
if( dlg.ShowModal() != wxID_OK )
|
2009-04-05 20:49:15 +00:00
|
|
|
return false;
|
2008-04-18 13:28:56 +00:00
|
|
|
|
2012-12-14 18:14:28 +00:00
|
|
|
int filterNdx = dlg.GetFilterIndex();
|
|
|
|
|
|
|
|
pluginType = ( filterNdx == 1 ) ? IO_MGR::LEGACY : IO_MGR::KICAD;
|
|
|
|
|
|
|
|
// Note: on Linux wxFileDialog is not reliable for noticing a changed filename.
|
2012-12-14 19:42:38 +00:00
|
|
|
// We probably need to file a bug report or implement our own derivation.
|
2012-12-14 16:54:54 +00:00
|
|
|
|
|
|
|
pcbFileName = dlg.GetPath();
|
|
|
|
|
|
|
|
// enforce file extension, must match plugin's policy.
|
|
|
|
pcbFileName.SetExt( IO_MGR::GetFileExtension( pluginType ) );
|
2007-08-06 02:02:39 +00:00
|
|
|
}
|
|
|
|
else
|
2011-08-26 17:01:17 +00:00
|
|
|
{
|
2012-12-14 16:54:54 +00:00
|
|
|
pcbFileName = aFileName;
|
2007-08-06 02:02:39 +00:00
|
|
|
|
2012-12-14 16:54:54 +00:00
|
|
|
if( pcbFileName.GetExt() == LegacyPcbFileExtension )
|
|
|
|
pluginType = IO_MGR::LEGACY;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pluginType = IO_MGR::KICAD;
|
|
|
|
pcbFileName.SetExt( KiCadPcbFileExtension );
|
|
|
|
}
|
|
|
|
}
|
2012-11-19 16:19:38 +00:00
|
|
|
|
2011-08-26 17:01:17 +00:00
|
|
|
if( !IsWritable( pcbFileName ) )
|
|
|
|
return false;
|
|
|
|
|
2011-10-13 19:56:32 +00:00
|
|
|
if( aCreateBackupFile )
|
2007-08-06 02:02:39 +00:00
|
|
|
{
|
2012-02-06 05:44:19 +00:00
|
|
|
// Get the backup file name
|
2011-10-13 19:56:32 +00:00
|
|
|
backupFileName = pcbFileName;
|
2012-12-20 20:20:56 +00:00
|
|
|
backupFileName.SetExt( pcbFileName.GetExt() + backupFileExtensionSuffix );
|
2011-10-13 19:56:32 +00:00
|
|
|
|
2012-04-08 19:01:54 +00:00
|
|
|
// If an old backup file exists, delete it. If an old board file exists, rename
|
|
|
|
// it to the backup file name.
|
2011-10-13 19:56:32 +00:00
|
|
|
if( pcbFileName.FileExists() )
|
|
|
|
{
|
|
|
|
// Remove the old file xxx.000 if it exists.
|
|
|
|
if( backupFileName.FileExists() )
|
|
|
|
wxRemoveFile( backupFileName.GetFullPath() );
|
|
|
|
|
2012-12-14 16:54:54 +00:00
|
|
|
// Rename the "old" file" from xxx.kicad_pcb to xxx.000
|
2011-10-13 19:56:32 +00:00
|
|
|
if( !wxRenameFile( pcbFileName.GetFullPath(), backupFileName.GetFullPath() ) )
|
|
|
|
{
|
|
|
|
msg = _( "Warning: unable to create backup file " ) + backupFileName.GetFullPath();
|
|
|
|
DisplayError( this, msg );
|
|
|
|
saveok = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
2007-08-06 02:02:39 +00:00
|
|
|
{
|
2011-10-13 19:56:32 +00:00
|
|
|
backupFileName.Clear();
|
2007-08-06 02:02:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-12-15 02:24:52 +00:00
|
|
|
GetBoard()->m_Status_Pcb &= ~CONNEXION_OK;
|
|
|
|
|
|
|
|
GetBoard()->SynchronizeNetsAndNetClasses();
|
|
|
|
|
|
|
|
// Select default Netclass before writing file.
|
|
|
|
// Useful to save default values in headers
|
|
|
|
GetBoard()->SetCurrentNetClass( GetBoard()->m_NetClasses.GetDefault()->GetName() );
|
|
|
|
|
2011-12-14 17:25:42 +00:00
|
|
|
try
|
|
|
|
{
|
2012-12-14 18:14:28 +00:00
|
|
|
PLUGIN::RELEASER pi( IO_MGR::PluginFind( pluginType ) );
|
2012-04-07 18:05:56 +00:00
|
|
|
|
2012-12-14 18:14:28 +00:00
|
|
|
/*
|
|
|
|
if( (PLUGIN*)pi == NULL )
|
2012-04-07 18:05:56 +00:00
|
|
|
THROW_IO_ERROR( wxString::Format( _( "cannot find file plug in for file format '%s'" ),
|
|
|
|
GetChars( pcbFileName.GetExt() ) ) );
|
2012-12-14 18:14:28 +00:00
|
|
|
*/
|
2011-12-15 02:24:52 +00:00
|
|
|
|
2012-12-14 18:14:28 +00:00
|
|
|
pi->Save( pcbFileName.GetFullPath(), GetBoard(), NULL );
|
2011-12-14 17:25:42 +00:00
|
|
|
}
|
|
|
|
catch( IO_ERROR ioe )
|
|
|
|
{
|
2012-04-07 18:05:56 +00:00
|
|
|
wxString msg = wxString::Format( _( "Error saving board.\n%s" ),
|
|
|
|
ioe.errorText.GetData() );
|
2011-12-22 08:07:50 +00:00
|
|
|
wxMessageBox( msg, _( "Save Board File" ), wxICON_ERROR | wxOK );
|
2011-12-14 17:25:42 +00:00
|
|
|
saveok = false;
|
|
|
|
}
|
|
|
|
|
2011-12-15 02:24:52 +00:00
|
|
|
if( saveok )
|
|
|
|
{
|
2012-08-29 16:59:50 +00:00
|
|
|
GetBoard()->SetFileName( pcbFileName.GetFullPath() );
|
2011-12-15 02:24:52 +00:00
|
|
|
UpdateTitle();
|
2012-12-27 16:42:41 +00:00
|
|
|
|
|
|
|
// Put the saved file in File History, unless aCreateBackupFile
|
|
|
|
// is false.
|
|
|
|
// aCreateBackupFile == false is mainly used to write autosave files
|
|
|
|
// and not need to have an autosave file in file history
|
|
|
|
if( aCreateBackupFile )
|
|
|
|
UpdateFileHistory( GetBoard()->GetFileName() );
|
2011-12-15 02:24:52 +00:00
|
|
|
}
|
|
|
|
|
2012-02-06 05:44:19 +00:00
|
|
|
// Display the file names:
|
2011-12-12 14:02:37 +00:00
|
|
|
m_messagePanel->EraseMsgBox();
|
2007-08-06 02:02:39 +00:00
|
|
|
|
|
|
|
if( saveok )
|
|
|
|
{
|
2011-10-13 19:56:32 +00:00
|
|
|
// Delete auto save file on successful save.
|
|
|
|
wxFileName autoSaveFileName = pcbFileName;
|
2012-12-27 16:42:41 +00:00
|
|
|
autoSaveFileName.SetName( autosaveFilePrefix + pcbFileName.GetName() );
|
2011-10-13 19:56:32 +00:00
|
|
|
|
|
|
|
if( autoSaveFileName.FileExists() )
|
|
|
|
wxRemoveFile( autoSaveFileName.GetFullPath() );
|
|
|
|
|
2009-04-05 20:49:15 +00:00
|
|
|
upperTxt = _( "Backup file: " ) + backupFileName.GetFullPath();
|
2007-08-06 02:02:39 +00:00
|
|
|
}
|
|
|
|
|
2011-12-14 07:03:55 +00:00
|
|
|
if( saveok )
|
2007-10-22 20:40:18 +00:00
|
|
|
lowerTxt = _( "Wrote board file: " );
|
2007-08-06 02:02:39 +00:00
|
|
|
else
|
2007-10-22 20:40:18 +00:00
|
|
|
lowerTxt = _( "Failed to create " );
|
2011-08-26 17:01:17 +00:00
|
|
|
|
2009-04-05 20:49:15 +00:00
|
|
|
lowerTxt += pcbFileName.GetFullPath();
|
2007-08-06 02:02:39 +00:00
|
|
|
|
2010-04-28 14:06:14 +00:00
|
|
|
ClearMsgPanel();
|
|
|
|
AppendMsgPanel( upperTxt, lowerTxt, CYAN );
|
2008-04-18 13:28:56 +00:00
|
|
|
|
2011-10-15 13:25:57 +00:00
|
|
|
GetScreen()->ClrSave();
|
2007-08-06 02:02:39 +00:00
|
|
|
GetScreen()->ClrModify();
|
2009-09-22 12:27:57 +00:00
|
|
|
return true;
|
2007-06-05 12:10:51 +00:00
|
|
|
}
|
2011-10-13 19:56:32 +00:00
|
|
|
|
|
|
|
|
|
|
|
bool PCB_EDIT_FRAME::doAutoSave()
|
|
|
|
{
|
2012-08-29 16:59:50 +00:00
|
|
|
wxFileName tmpFileName = GetBoard()->GetFileName();
|
2011-10-13 19:56:32 +00:00
|
|
|
wxFileName fn = tmpFileName;
|
|
|
|
|
2012-12-27 16:42:41 +00:00
|
|
|
// Auto save file name is the normal file name prepended with
|
|
|
|
// autosaveFilePrefix string.
|
|
|
|
fn.SetName( autosaveFilePrefix + fn.GetName() );
|
2011-10-13 19:56:32 +00:00
|
|
|
|
2011-10-15 13:25:57 +00:00
|
|
|
wxLogTrace( traceAutoSave,
|
|
|
|
wxT( "Creating auto save file <" + fn.GetFullPath() ) + wxT( ">" ) );
|
|
|
|
|
2011-10-13 19:56:32 +00:00
|
|
|
if( SavePcbFile( fn.GetFullPath(), NO_BACKUP_FILE ) )
|
|
|
|
{
|
2011-10-15 13:25:57 +00:00
|
|
|
GetScreen()->SetModify();
|
2012-08-29 16:59:50 +00:00
|
|
|
GetBoard()->SetFileName( tmpFileName.GetFullPath() );
|
2011-10-13 19:56:32 +00:00
|
|
|
UpdateTitle();
|
2011-10-15 13:25:57 +00:00
|
|
|
m_autoSaveState = false;
|
2011-10-13 19:56:32 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2012-08-29 16:59:50 +00:00
|
|
|
GetBoard()->SetFileName( tmpFileName.GetFullPath() );
|
2011-10-13 19:56:32 +00:00
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|