KiCad PCB EDA Suite
pcbnew/files.cpp File Reference

Read and write board files. More...

#include <fctsys.h>
#include <class_drawpanel.h>
#include <confirm.h>
#include <kicad_string.h>
#include <gestfich.h>
#include <wxPcbStruct.h>
#include <macros.h>
#include <3d_viewer/eda_3d_viewer.h>
#include <richio.h>
#include <filter_reader.h>
#include <pgm_base.h>
#include <msgpanel.h>
#include <fp_lib_table.h>
#include <ratsnest_data.h>
#include <kiway.h>
#include <kiway_player.h>
#include <pcbnew.h>
#include <pcbnew_id.h>
#include <io_mgr.h>
#include <wildcards_and_files_ext.h>
#include <class_board.h>
#include <build_version.h>
#include <module_editor_frame.h>
#include <modview_frame.h>
#include <wx/stdpaths.h>

Go to the source code of this file.

Macros

#define USE_INSTRUMENTATION   0
 

Functions

bool AskLoadBoardFileName (wxWindow *aParent, int *aCtl, wxString *aFileName, bool aKicadFilesOnly)
 Function AskLoadBoardFileName puts up a wxFileDialog asking for a BOARD filename to open. More...
 
bool AskSaveBoardFileName (wxWindow *aParent, wxString *aFileName)
 Function AskSaveBoardFileName puts up a wxFileDialog asking for a BOARD filename to save. More...
 
IO_MGR::PCB_FILE_T plugin_type (const wxString &aFileName, int aCtl)
 
static wxString create_backup_file (const wxString &aFileName)
 

Variables

static const wxChar backupSuffix [] = wxT( "-bak" )
 
static const wxChar autosavePrefix [] = wxT( "_autosave-" )
 

Detailed Description

Read and write board files.

Definition in file pcbnew/files.cpp.

Macro Definition Documentation

#define USE_INSTRUMENTATION   0

Definition at line 62 of file pcbnew/files.cpp.

Function Documentation

bool AskLoadBoardFileName ( wxWindow *  aParent,
int *  aCtl,
wxString *  aFileName,
bool  aKicadFilesOnly 
)

Function AskLoadBoardFileName puts up a wxFileDialog asking for a BOARD filename to open.

Parameters
aParentis a wxFrame passed to wxFileDialog.
aCtlis where to put the OpenProjectFiles() control bits.
aFileNameon entry is a probable choice, on return is the chosen filename.
aKicadFilesOnlytrue to list kiacad pcb files plugins only, false to list import plugins.
Returns
bool - true if chosen, else false if user aborted.

Definition at line 87 of file pcbnew/files.cpp.

References DIM, IO_MGR::EAGLE, EaglePcbFileWildcard(), fileFilters, IO_MGR::KICAD_SEXP, KICTL_EAGLE_BRD, IO_MGR::LEGACY, LegacyPcbFileWildcard(), name, IO_MGR::PCAD, PCadPcbFileWildcard(), and PcbFileWildcard().

Referenced by PCBNEW_CONTROL::AppendBoardFromFile(), PCB_EDIT_FRAME::Files_io_from_id(), and PCB_EDIT_FRAME::OnFileHistory().

88 {
89  // This is a subset of all PLUGINs which are trusted to be able to
90  // load a BOARD. User may occasionally use the wrong plugin to load a
91  // *.brd file (since both legacy and eagle use *.brd extension),
92  // but eventually *.kicad_pcb will be more common than legacy *.brd files.
93  static const struct
94  {
95  const wxString& filter;
96  IO_MGR::PCB_FILE_T pluginType;
97  } loaders[] =
98  {
99  { PcbFileWildcard(), IO_MGR::KICAD_SEXP }, // Current Kicad board files
100  { LegacyPcbFileWildcard(), IO_MGR::LEGACY }, // Old Kicad board files
101  { EaglePcbFileWildcard(), IO_MGR::EAGLE }, // Import board files
102  { PCadPcbFileWildcard(), IO_MGR::PCAD }, // Import board files
103  };
104 
105  wxFileName fileName( *aFileName );
106  wxString fileFilters;
107 
108  if( aKicadFilesOnly )
109  {
110  for( unsigned ii = 0; ii < 2; ++ii )
111  {
112  if( !fileFilters.IsEmpty() )
113  fileFilters += wxChar( '|' );
114 
115  fileFilters += wxGetTranslation( loaders[ii].filter );
116  }
117  }
118  else
119  {
120  for( unsigned ii = 2; ii < DIM( loaders ); ++ii )
121  {
122  if( !fileFilters.IsEmpty() )
123  fileFilters += wxChar( '|' );
124 
125  fileFilters += wxGetTranslation( loaders[ii].filter );
126  }
127  }
128 
129  wxString path;
130  wxString name;
131 
132  if( fileName.FileExists() )
133  {
134  path = fileName.GetPath();
135  name = fileName.GetFullName();
136  }
137  else
138  {
139  path = wxStandardPaths::Get().GetDocumentsDir();
140  // leave name empty
141  }
142 
143  wxFileDialog dlg( aParent,
144  aKicadFilesOnly ? _( "Open Board File" ) : _( "Import Non KiCad Board File" ),
145  path, name, fileFilters,
146  wxFD_OPEN | wxFD_FILE_MUST_EXIST );
147 
148  if( dlg.ShowModal() == wxID_OK )
149  {
150  // For import option, if Eagle (*.brd files), tell OpenProjectFiles() to use Eagle plugin.
151  // It's the only special case because of the duplicate use of the *.brd file extension.
152  // Other cases are clear because of unique file extensions.
153  *aCtl = aKicadFilesOnly ? 0 : KICTL_EAGLE_BRD;
154  *aFileName = dlg.GetPath();
155  return true;
156  }
157  else
158  return false;
159 }
#define DIM(x)
of elements in an array
Definition: macros.h:98
wxString EaglePcbFileWildcard()
#define KICTL_EAGLE_BRD
chosen *.brd file is Eagle according to user.
Definition: kiway_player.h:130
static const struct @14 fileFilters[FILTER_COUNT]
wxString LegacyPcbFileWildcard()
Legacy Pcbnew file formats prior to s-expression.
Definition: io_mgr.h:53
wxString PcbFileWildcard()
const char * name
PCB_FILE_T
Enum PCB_FILE_T is a set of file types that the IO_MGR knows about, and for which there has been a pl...
Definition: io_mgr.h:51
wxString PCadPcbFileWildcard()
S-expression Pcbnew file format.
Definition: io_mgr.h:54
bool AskSaveBoardFileName ( wxWindow *  aParent,
wxString *  aFileName 
)

Function AskSaveBoardFileName puts up a wxFileDialog asking for a BOARD filename to save.

Parameters
aParentis a wxFrame passed to wxFileDialog.
aFileNameon entry is a probable choice, on return is the chosen full filename (includes path).
Returns
bool - true if chosen, else false if user aborted.

Definition at line 172 of file pcbnew/files.cpp.

References KiCadPcbFileExtension, and PcbFileWildcard().

Referenced by PCB_EDIT_FRAME::Files_io_from_id().

173 {
174  wxString wildcard = PcbFileWildcard();
175  wxFileName fn = *aFileName;
176 
177  fn.SetExt( KiCadPcbFileExtension );
178 
179  wxFileDialog dlg( aParent,
180  _( "Save Board File As" ),
181  fn.GetPath(),
182  fn.GetFullName(),
183  wildcard,
184  wxFD_SAVE | wxFD_OVERWRITE_PROMPT
185  );
186 
187  if( dlg.ShowModal() != wxID_OK )
188  return false;
189 
190  fn = dlg.GetPath();
191 
192  // always enforce filename extension, user may not have entered it.
193  fn.SetExt( KiCadPcbFileExtension );
194 
195  *aFileName = fn.GetFullPath();
196 
197  return true;
198 }
wxString PcbFileWildcard()
const wxString KiCadPcbFileExtension
static wxString create_backup_file ( const wxString &  aFileName)
static

Definition at line 638 of file pcbnew/files.cpp.

References backupSuffix, DisplayError(), Format(), and GetChars().

Referenced by PCB_EDIT_FRAME::SavePcbFile().

639 {
640  wxFileName fn = aFileName;
641  wxFileName backupFileName = aFileName;
642 
643  backupFileName.SetExt( fn.GetExt() + backupSuffix );
644 
645  // If an old backup file exists, delete it. If an old board file exists,
646  // rename it to the backup file name.
647  if( fn.FileExists() )
648  {
649  // Remove the old file xxx.000 if it exists.
650  if( backupFileName.FileExists() )
651  wxRemoveFile( backupFileName.GetFullPath() );
652 
653  // Rename the current file from <xxx>.kicad_pcb to <xxx>.kicad_pcb-bak
654  if( !wxRenameFile( fn.GetFullPath(), backupFileName.GetFullPath() ) )
655  {
656  wxString msg = wxString::Format( _(
657  "Warning: unable to create backup file '%s'" ),
658  GetChars( backupFileName.GetFullPath() )
659  );
660  DisplayError( NULL, msg );
661  }
662  }
663  else
664  {
665  backupFileName.Clear();
666  }
667 
668  return backupFileName.GetFullPath();
669 }
static const wxChar backupSuffix[]
static const wxChar * GetChars(const wxString &s)
Function GetChars returns a wxChar* to the actual wxChar* data within a wxString, and is helpful for ...
Definition: macros.h:92
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
void DisplayError(wxWindow *parent, const wxString &text, int displaytime)
Function DisplayError displays an error or warning message box with aMessage.
Definition: confirm.cpp:73
IO_MGR::PCB_FILE_T plugin_type ( const wxString &  aFileName,
int  aCtl 
)

Definition at line 374 of file pcbnew/files.cpp.

References backupSuffix, IO_MGR::EAGLE, IO_MGR::GetFileExtension(), IO_MGR::KICAD_SEXP, KICTL_EAGLE_BRD, IO_MGR::LEGACY, and IO_MGR::PCAD.

Referenced by PCB_EDIT_FRAME::AppendBoardFile(), PCBNEW_CONTROL::AppendBoardFromFile(), and PCB_EDIT_FRAME::OpenProjectFiles().

375 {
376  IO_MGR::PCB_FILE_T pluginType;
377 
378  wxFileName fn = aFileName;
379 
380  // Note: file extensions are expected to be in ower case.
381  // This is not always true, especially when importing files, so the string
382  // comparisons are case insensitive to try to find the suitable plugin.
383 
384  if( fn.GetExt().CmpNoCase( IO_MGR::GetFileExtension( IO_MGR::LEGACY ) ) == 0 )
385  {
386  // both legacy and eagle share a common file extension.
387  pluginType = ( aCtl & KICTL_EAGLE_BRD ) ? IO_MGR::EAGLE : IO_MGR::LEGACY;
388  }
389  else if( fn.GetExt().CmpNoCase( IO_MGR::GetFileExtension( IO_MGR::LEGACY ) + backupSuffix ) == 0 )
390  {
391  pluginType = IO_MGR::LEGACY;
392  }
393  else if( fn.GetExt().CmpNoCase( IO_MGR::GetFileExtension( IO_MGR::PCAD ) ) == 0 )
394  {
395  pluginType = IO_MGR::PCAD;
396  }
397  else
398  {
399  pluginType = IO_MGR::KICAD_SEXP;
400  }
401 
402  return pluginType;
403 }
#define KICTL_EAGLE_BRD
chosen *.brd file is Eagle according to user.
Definition: kiway_player.h:130
static const wxChar backupSuffix[]
Legacy Pcbnew file formats prior to s-expression.
Definition: io_mgr.h:53
PCB_FILE_T
Enum PCB_FILE_T is a set of file types that the IO_MGR knows about, and for which there has been a pl...
Definition: io_mgr.h:51
S-expression Pcbnew file format.
Definition: io_mgr.h:54
static const wxString GetFileExtension(PCB_FILE_T aFileType)
Function GetFileExtension returns the file extension for aFileType.
Definition: io_mgr.cpp:117

Variable Documentation

const wxChar autosavePrefix[] = wxT( "_autosave-" )
static
const wxChar backupSuffix[] = wxT( "-bak" )
static