KiCad PCB EDA Suite
footprint_libraries_utils.cpp File Reference
#include <wx/ffile.h>
#include <fctsys.h>
#include <pgm_base.h>
#include <kiface_i.h>
#include <confirm.h>
#include <kicad_string.h>
#include <pcb_edit_frame.h>
#include <dialog_helpers.h>
#include <filter_reader.h>
#include <macros.h>
#include <fp_lib_table.h>
#include <validators.h>
#include <dialog_text_entry.h>
#include <tool/tool_manager.h>
#include <tools/pcb_actions.h>
#include <class_board.h>
#include <class_module.h>
#include <board_commit.h>
#include <footprint_edit_frame.h>
#include <wildcards_and_files_ext.h>
#include <kicad_plugin.h>
#include <legacy_plugin.h>
#include <env_paths.h>
#include "footprint_viewer_frame.h"

Go to the source code of this file.

Macros

#define FMT_OK_DELETE   _( "OK to delete footprint \"%s\" in library \"%s\"" )
 
#define FMT_IMPORT_MODULE   _( "Import Footprint" )
 
#define FMT_FILE_NOT_FOUND   _( "File \"%s\" not found" )
 
#define FMT_NOT_MODULE   _( "Not a footprint file" )
 
#define FMT_MOD_NOT_FOUND   _( "Unable to find or load footprint \"%s\" from lib path \"%s\"" )
 
#define FMT_LIB_READ_ONLY   _( "Library \"%s\" is read only, not writable" )
 
#define FMT_EXPORT_MODULE   _( "Export Footprint" )
 
#define FMT_SAVE_MODULE   _( "Save Footprint" )
 
#define FMT_MOD_REF   _( "Enter footprint name:" )
 
#define FMT_EXPORTED   _( "Footprint exported to file \"%s\"" )
 
#define FMT_MOD_DELETED   _( "Footprint \"%s\" deleted from library \"%s\"" )
 
#define FMT_MOD_CREATE   _( "New Footprint" )
 
#define FMT_NO_REF_ABORTED   _( "No footprint name defined." )
 
#define FMT_SELECT_LIB   _( "Select Library" )
 
#define EXPORT_IMPORT_LASTPATH_KEY   wxT( "import_last_path" )
 

Functions

static const wxString INFO_LEGACY_LIB_WARN_EDIT (_("Writing/modifying legacy libraries (.mod files) is not allowed\n" "Please save the current library to the new .pretty format\n" "and update your footprint lib table\n" "to save your footprint (a .kicad_mod file) in the .pretty library folder"))
 
static const wxString INFO_LEGACY_LIB_WARN_DELETE (_("Modifying legacy libraries (.mod files) is not allowed\n" "Please save the current library under the new .pretty format\n" "and update your footprint lib table\n" "before deleting a footprint"))
 
static wxFileName getFootprintFilenameFromUser (wxWindow *aParent, const wxString &aLastPath)
 Prompt the user for a module file to open. More...
 
static IO_MGR::PCB_FILE_T detect_file_type (FILE *aFile, const wxFileName &aFileName, wxString *aName)
 Read a file to detect the type. More...
 
static MODULEparse_module_with_plugin (const wxFileName &aFileName, IO_MGR::PCB_FILE_T aFileType, const wxString &aName)
 Parse a footprint using a PLUGIN. More...
 
static MODULEparse_module_kicad (const wxFileName &aFileName)
 Parse a KICAD footprint. More...
 
MODULEtry_load_footprint (const wxFileName &aFileName, IO_MGR::PCB_FILE_T aFileType, const wxString &aName)
 Try to load a footprint, returning NULL if the file couldn't be accessed. More...
 

Macro Definition Documentation

◆ EXPORT_IMPORT_LASTPATH_KEY

#define EXPORT_IMPORT_LASTPATH_KEY   wxT( "import_last_path" )

Definition at line 82 of file footprint_libraries_utils.cpp.

◆ FMT_EXPORT_MODULE

#define FMT_EXPORT_MODULE   _( "Export Footprint" )

Definition at line 59 of file footprint_libraries_utils.cpp.

◆ FMT_EXPORTED

#define FMT_EXPORTED   _( "Footprint exported to file \"%s\"" )

Definition at line 62 of file footprint_libraries_utils.cpp.

◆ FMT_FILE_NOT_FOUND

#define FMT_FILE_NOT_FOUND   _( "File \"%s\" not found" )

Definition at line 54 of file footprint_libraries_utils.cpp.

◆ FMT_IMPORT_MODULE

#define FMT_IMPORT_MODULE   _( "Import Footprint" )

Definition at line 53 of file footprint_libraries_utils.cpp.

◆ FMT_LIB_READ_ONLY

#define FMT_LIB_READ_ONLY   _( "Library \"%s\" is read only, not writable" )

Definition at line 57 of file footprint_libraries_utils.cpp.

◆ FMT_MOD_CREATE

#define FMT_MOD_CREATE   _( "New Footprint" )

Definition at line 64 of file footprint_libraries_utils.cpp.

◆ FMT_MOD_DELETED

#define FMT_MOD_DELETED   _( "Footprint \"%s\" deleted from library \"%s\"" )

Definition at line 63 of file footprint_libraries_utils.cpp.

◆ FMT_MOD_NOT_FOUND

#define FMT_MOD_NOT_FOUND   _( "Unable to find or load footprint \"%s\" from lib path \"%s\"" )

Definition at line 56 of file footprint_libraries_utils.cpp.

◆ FMT_MOD_REF

#define FMT_MOD_REF   _( "Enter footprint name:" )

Definition at line 61 of file footprint_libraries_utils.cpp.

◆ FMT_NO_REF_ABORTED

#define FMT_NO_REF_ABORTED   _( "No footprint name defined." )

Definition at line 66 of file footprint_libraries_utils.cpp.

◆ FMT_NOT_MODULE

#define FMT_NOT_MODULE   _( "Not a footprint file" )

Definition at line 55 of file footprint_libraries_utils.cpp.

◆ FMT_OK_DELETE

#define FMT_OK_DELETE   _( "OK to delete footprint \"%s\" in library \"%s\"" )

Definition at line 52 of file footprint_libraries_utils.cpp.

◆ FMT_SAVE_MODULE

#define FMT_SAVE_MODULE   _( "Save Footprint" )

Definition at line 60 of file footprint_libraries_utils.cpp.

◆ FMT_SELECT_LIB

#define FMT_SELECT_LIB   _( "Select Library" )

Definition at line 67 of file footprint_libraries_utils.cpp.

Function Documentation

◆ detect_file_type()

static IO_MGR::PCB_FILE_T detect_file_type ( FILE *  aFile,
const wxFileName &  aFileName,
wxString *  aName 
)
static

Read a file to detect the type.

Parameters
aFile- open file to be read. File pointer will be closed.
aFileName- file name to be read
aName- wxString to receive the module name iff type is LEGACY

Definition at line 120 of file footprint_libraries_utils.cpp.

122 {
123  FILE_LINE_READER freader( aFile, aFileName.GetFullPath() );
124  WHITESPACE_FILTER_READER reader( freader );
125  IO_MGR::PCB_FILE_T file_type;
126 
127  wxASSERT( aName );
128 
129  reader.ReadLine();
130  char* line = reader.Line();
131 
132  if( !strncasecmp( line, "(module", strlen( "(module" ) ) )
133  {
134  file_type = IO_MGR::KICAD_SEXP;
135  *aName = aFileName.GetName();
136  }
137  else if( !strncasecmp( line, FOOTPRINT_LIBRARY_HEADER, FOOTPRINT_LIBRARY_HEADER_CNT ) )
138  {
139  file_type = IO_MGR::LEGACY;
140 
141  while( reader.ReadLine() )
142  {
143  if( !strncasecmp( line, "$MODULE", strlen( "$MODULE" ) ) )
144  {
145  *aName = FROM_UTF8( StrPurge( line + strlen( "$MODULE" ) ) );
146  break;
147  }
148  }
149  }
150  else if( !strncasecmp( line, "Element", strlen( "Element" ) ) )
151  {
152  file_type = IO_MGR::GEDA_PCB;
153  *aName = aFileName.GetName();
154  }
155  else
156  {
157  file_type = IO_MGR::FILE_TYPE_NONE;
158  }
159 
160  return file_type;
161 }
static wxString FROM_UTF8(const char *cstring)
function FROM_UTF8 converts a UTF8 encoded C string to a wxString for all wxWidgets build modes.
Definition: macros.h:62
char * StrPurge(char *text)
Remove leading and training spaces, tabs and end of line chars in text.
Definition: string.cpp:310
WHITESPACE_FILTER_READER reads lines of text from another LINE_READER, but only returns non-comment l...
Definition: filter_reader.h:71
Geda PCB file formats.
Definition: io_mgr.h:60
#define FOOTPRINT_LIBRARY_HEADER
Definition: legacy_plugin.h:38
FILE_LINE_READER is a LINE_READER that reads from an open file.
Definition: richio.h:180
#define FOOTPRINT_LIBRARY_HEADER_CNT
Definition: legacy_plugin.h:39
Legacy Pcbnew file formats prior to s-expression.
Definition: io_mgr.h:56
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:54
S-expression Pcbnew file format.
Definition: io_mgr.h:57

References IO_MGR::FILE_TYPE_NONE, FOOTPRINT_LIBRARY_HEADER, FOOTPRINT_LIBRARY_HEADER_CNT, FROM_UTF8(), IO_MGR::GEDA_PCB, IO_MGR::KICAD_SEXP, IO_MGR::LEGACY, and StrPurge().

Referenced by FOOTPRINT_EDIT_FRAME::Import_Module().

◆ getFootprintFilenameFromUser()

static wxFileName getFootprintFilenameFromUser ( wxWindow *  aParent,
const wxString &  aLastPath 
)
static

Prompt the user for a module file to open.

Parameters
aParent- parent window for the dialog
aLastPath- last opened path

Definition at line 90 of file footprint_libraries_utils.cpp.

91 {
92  static int lastFilterIndex = 0; // To store the last choice during a session.
93  wxString wildCard;
94 
95  wildCard << KiCadFootprintLibFileWildcard() << wxChar( '|' )
96  << ModLegacyExportFileWildcard() << wxChar( '|' )
97  << GedaPcbFootprintLibFileWildcard() << wxChar( '|' )
98  << AllFilesWildcard();
99 
100  wxFileDialog dlg( aParent, FMT_IMPORT_MODULE, aLastPath, wxEmptyString, wildCard,
101  wxFD_OPEN | wxFD_FILE_MUST_EXIST );
102 
103  dlg.SetFilterIndex( lastFilterIndex );
104 
105  if( dlg.ShowModal() == wxID_CANCEL )
106  return wxFileName();
107 
108  lastFilterIndex = dlg.GetFilterIndex();
109 
110  return wxFileName( dlg.GetPath() );
111 }
wxString AllFilesWildcard()
wxString ModLegacyExportFileWildcard()
#define FMT_IMPORT_MODULE
wxString KiCadFootprintLibFileWildcard()
wxString GedaPcbFootprintLibFileWildcard()

References AllFilesWildcard(), FMT_IMPORT_MODULE, GedaPcbFootprintLibFileWildcard(), KiCadFootprintLibFileWildcard(), and ModLegacyExportFileWildcard().

Referenced by FOOTPRINT_EDIT_FRAME::Import_Module().

◆ INFO_LEGACY_LIB_WARN_DELETE()

static const wxString INFO_LEGACY_LIB_WARN_DELETE ( _("Modifying legacy libraries (.mod files) is not allowed\n" "Please save the current library under the new .pretty format\n" "and update your footprint lib table\n" "before deleting a footprint")  )
static

◆ INFO_LEGACY_LIB_WARN_EDIT()

static const wxString INFO_LEGACY_LIB_WARN_EDIT ( _("Writing/modifying legacy libraries (.mod files) is not allowed\n" "Please save the current library to the new .pretty format\n" "and update your footprint lib table\n" "to save your footprint (a .kicad_mod file) in the .pretty library folder")  )
static

◆ parse_module_kicad()

static MODULE* parse_module_kicad ( const wxFileName &  aFileName)
static

Parse a KICAD footprint.

Parameters
aFileName- file name to parse

Definition at line 198 of file footprint_libraries_utils.cpp.

199 {
200  wxString fcontents;
201  PCB_IO pcb_io;
202  wxFFile f( aFileName.GetFullPath() );
203 
204  if( !f.IsOpened() )
205  return NULL;
206 
207  f.ReadAll( &fcontents );
208 
209  return dynamic_cast<MODULE*>( pcb_io.Parse( fcontents ) );
210 }
BOARD_ITEM * Parse(const wxString &aClipboardSourceInput)
PCB_IO is a PLUGIN derivation for saving and loading Pcbnew s-expression formatted files.
#define NULL

References NULL, and PCB_IO::Parse().

Referenced by try_load_footprint().

◆ parse_module_with_plugin()

static MODULE* parse_module_with_plugin ( const wxFileName &  aFileName,
IO_MGR::PCB_FILE_T  aFileType,
const wxString &  aName 
)
static

Parse a footprint using a PLUGIN.

Parameters
aFileName- file name to parse
aFileType- type of the file
aName- name of the footprint

Definition at line 170 of file footprint_libraries_utils.cpp.

173 {
174  wxString path;
175 
176  switch( aFileType )
177  {
178  case IO_MGR::GEDA_PCB:
179  path = aFileName.GetPath();
180  break;
181  case IO_MGR::LEGACY:
182  path = aFileName.GetFullPath();
183  break;
184  default:
185  wxFAIL_MSG( wxT( "unexpected IO_MGR::PCB_FILE_T" ) );
186  }
187 
188  PLUGIN::RELEASER pi( IO_MGR::PluginFind( aFileType ) );
189 
190  return pi->FootprintLoad( path, aName );
191 }
Geda PCB file formats.
Definition: io_mgr.h:60
RELEASER releases a PLUGIN in the context of a potential thrown exception, through its destructor.
Definition: io_mgr.h:577
Legacy Pcbnew file formats prior to s-expression.
Definition: io_mgr.h:56
static PLUGIN * PluginFind(PCB_FILE_T aFileType)
Function PluginFind returns a PLUGIN which the caller can use to import, export, save,...
Definition: io_mgr.cpp:58

References IO_MGR::GEDA_PCB, IO_MGR::LEGACY, and IO_MGR::PluginFind().

Referenced by try_load_footprint().

◆ try_load_footprint()

MODULE* try_load_footprint ( const wxFileName &  aFileName,
IO_MGR::PCB_FILE_T  aFileType,
const wxString &  aName 
)

Try to load a footprint, returning NULL if the file couldn't be accessed.

Parameters
aFileName- file name to load
aFileType- type of the file to load
aName- footprint name

Definition at line 219 of file footprint_libraries_utils.cpp.

221 {
222  MODULE* module;
223 
224  switch( aFileType )
225  {
226  case IO_MGR::GEDA_PCB:
227  case IO_MGR::LEGACY:
228  module = parse_module_with_plugin( aFileName, aFileType, aName );
229  break;
230 
231  case IO_MGR::KICAD_SEXP:
232  module = parse_module_kicad( aFileName );
233  break;
234 
235  default:
236  wxFAIL_MSG( wxT( "unexpected IO_MGR::PCB_FILE_T" ) );
237  module = NULL;
238  }
239 
240  return module;
241 }
Geda PCB file formats.
Definition: io_mgr.h:60
#define NULL
static MODULE * parse_module_kicad(const wxFileName &aFileName)
Parse a KICAD footprint.
static MODULE * parse_module_with_plugin(const wxFileName &aFileName, IO_MGR::PCB_FILE_T aFileType, const wxString &aName)
Parse a footprint using a PLUGIN.
Legacy Pcbnew file formats prior to s-expression.
Definition: io_mgr.h:56
S-expression Pcbnew file format.
Definition: io_mgr.h:57

References IO_MGR::GEDA_PCB, IO_MGR::KICAD_SEXP, IO_MGR::LEGACY, NULL, parse_module_kicad(), and parse_module_with_plugin().

Referenced by FOOTPRINT_EDIT_FRAME::Import_Module().