KiCad PCB EDA Suite
CLIPBOARD_IO Class Reference

#include <kicad_clipboard.h>

Inheritance diagram for CLIPBOARD_IO:
PCB_IO PLUGIN

Public Member Functions

void Save (const wxString &aFileName, BOARD *aBoard, const PROPERTIES *aProperties=NULL) override
 Function Save will write aBoard to a storage file in a format that this PLUGIN implementation knows about, or it can be used to write a portion of aBoard to a special kind of export file. More...
 
void SaveSelection (const PCBNEW_SELECTION &selected)
 
BOARD_ITEMParse ()
 
BOARDLoad (const wxString &aFileName, BOARD *aAppendToMe, const PROPERTIES *aProperties=NULL) override
 Function Load loads information from some input file format that this PLUGIN implementation knows about, into either a new BOARD or an existing one. More...
 
 CLIPBOARD_IO ()
 
 ~CLIPBOARD_IO ()
 
void SetBoard (BOARD *aBoard)
 
STRING_FORMATTERGetFormatter ()
 
const wxString PluginName () const override
 Function PluginName returns a brief hard coded name for this PLUGIN. More...
 
const wxString GetFileExtension () const override
 Function GetFileExtension returns the file extension for the PLUGIN. More...
 
void FootprintEnumerate (wxArrayString &aFootprintNames, const wxString &aLibraryPath, bool aBestEfforts, const PROPERTIES *aProperties=NULL) override
 Return a list of footprint names contained within the library at aLibraryPath. More...
 
const MODULEGetEnumeratedFootprint (const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties=NULL) override
 Function GetEnumeratedFootprint a version of FootprintLoad() for use after FootprintEnumerate() for more efficient cache management. More...
 
bool FootprintExists (const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties=NULL) override
 Function FootprintExists check for the existence of a footprint. More...
 
MODULEFootprintLoad (const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties=NULL) override
 Function FootprintLoad loads a footprint having aFootprintName from the aLibraryPath containing a library format that this PLUGIN knows about. More...
 
void FootprintSave (const wxString &aLibraryPath, const MODULE *aFootprint, const PROPERTIES *aProperties=NULL) override
 Function FootprintSave will write aModule to an existing library located at aLibraryPath. More...
 
void FootprintDelete (const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties=NULL) override
 Function FootprintDelete deletes aFootprintName from the library at aLibraryPath. More...
 
long long GetLibraryTimestamp (const wxString &aLibraryPath) const override
 Generate a timestamp representing all the files in the library (including the library directory). More...
 
void FootprintLibCreate (const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 Function FootprintLibCreate creates a new empty footprint library at aLibraryPath empty. More...
 
bool FootprintLibDelete (const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 Function FootprintLibDelete deletes an existing footprint library and returns true, or if library does not exist returns false, or throws an exception if library exists but is read only or cannot be deleted for some other reason. More...
 
bool IsFootprintLibWritable (const wxString &aLibraryPath) override
 Function IsFootprintLibWritable returns true iff the library at aLibraryPath is writable. More...
 
void Format (BOARD_ITEM *aItem, int aNestLevel=0) const
 Function Format outputs aItem to aFormatter in s-expression format. More...
 
std::string GetStringOutput (bool doClear)
 
void SetOutputFormatter (OUTPUTFORMATTER *aFormatter)
 
BOARD_ITEMParse (const wxString &aClipboardSourceInput)
 
virtual void PrefetchLib (const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL)
 Function PrefetchLib If possible, prefetches the specified library (e.g. More...
 
virtual void FootprintLibOptions (PROPERTIES *aListToAppendTo) const
 Function FootprintLibOptions appends supported PLUGIN options to aListToAppenTo along with internationalized descriptions. More...
 

Protected Member Functions

void validateCache (const wxString &aLibraryPath, bool checkModified=true)
 
const MODULEgetFootprint (const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties, bool checkModified)
 
void init (const PROPERTIES *aProperties)
 
void formatSetup (BOARD *aBoard, int aNestLevel=0) const
 formats the board setup information More...
 
void formatDefaults (const BOARD_DESIGN_SETTINGS &aSettings, int aNestLevel) const
 formats the defaults subsection of the board setup More...
 
void formatGeneral (BOARD *aBoard, int aNestLevel=0) const
 formats the General section of the file More...
 
void formatBoardLayers (BOARD *aBoard, int aNestLevel=0) const
 formats the board layer information More...
 
void formatNetInformation (BOARD *aBoard, int aNestLevel=0) const
 formats the Nets and Netclasses More...
 
void formatHeader (BOARD *aBoard, int aNestLevel=0) const
 writes everything that comes before the board_items, like settings and layers etc More...
 

Protected Attributes

wxString m_error
 for throwing exceptions More...
 
BOARDm_board
 which BOARD, no ownership here More...
 
const PROPERTIESm_props
 passed via Save() or Load(), no ownership, may be NULL. More...
 
FP_CACHEm_cache
 Footprint library cache. More...
 
LINE_READERm_reader
 no ownership here. More...
 
wxString m_filename
 for saves only, name is in m_reader for loads More...
 
int m_loading_format_version
 which SEXPR_BOARD_FILE_VERSION should be Load()ed? More...
 
STRING_FORMATTER m_sf
 
OUTPUTFORMATTERm_out
 output any Format()s to this, no ownership More...
 
int m_ctl
 
NETINFO_MAPPINGm_mapping
 mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes More...
 

Private Member Functions

void writeHeader (BOARD *aBoard)
 

Private Attributes

STRING_FORMATTER m_formatter
 
CLIPBOARD_PARSERm_parser
 

Detailed Description

Definition at line 51 of file kicad_clipboard.h.

Constructor & Destructor Documentation

◆ CLIPBOARD_IO()

CLIPBOARD_IO::CLIPBOARD_IO ( )

Definition at line 37 of file kicad_clipboard.cpp.

37  :
39  m_formatter(),
40  m_parser( new CLIPBOARD_PARSER() )
41 {
42  m_out = &m_formatter;
43 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
STRING_FORMATTER m_formatter
PCB_IO(int aControlFlags=CTL_FOR_BOARD)
CLIPBOARD_PARSER * m_parser
#define CTL_STD_LAYER_NAMES
Use English Standard layer names.

References m_formatter, and PCB_IO::m_out.

◆ ~CLIPBOARD_IO()

CLIPBOARD_IO::~CLIPBOARD_IO ( )

Definition at line 46 of file kicad_clipboard.cpp.

47 {
48  delete m_parser;
49 }
CLIPBOARD_PARSER * m_parser

References m_parser.

Member Function Documentation

◆ FootprintDelete()

void PCB_IO::FootprintDelete ( const wxString &  aLibraryPath,
const wxString &  aFootprintName,
const PROPERTIES aProperties = NULL 
)
overridevirtualinherited

Function FootprintDelete deletes aFootprintName from the library at aLibraryPath.

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several footprints.
aFootprintNameis the name of a footprint to delete from the specified library.
aPropertiesis an associative array that can be used to tell the library delete function anything special, because it can take any number of additional named tuning arguments that the plugin is known to support. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Exceptions
IO_ERRORif there is a problem finding the footprint or the library, or deleting it.

Reimplemented from PLUGIN.

Definition at line 2322 of file kicad_plugin.cpp.

2324 {
2325  LOCALE_IO toggle; // toggles on, then off, the C locale.
2326 
2327  init( aProperties );
2328 
2329  validateCache( aLibraryPath );
2330 
2331  if( !m_cache->IsWritable() )
2332  {
2333  THROW_IO_ERROR( wxString::Format( _( "Library \"%s\" is read only." ),
2334  aLibraryPath.GetData() ) );
2335  }
2336 
2337  m_cache->Remove( aFootprintName );
2338 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:214
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
void Remove(const wxString &aFootprintName)
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
#define THROW_IO_ERROR(msg)
bool IsWritable() const
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
#define _(s)
Definition: 3d_actions.cpp:33

References _, Format(), PCB_IO::init(), FP_CACHE::IsWritable(), PCB_IO::m_cache, FP_CACHE::Remove(), THROW_IO_ERROR, and PCB_IO::validateCache().

Referenced by GITHUB_PLUGIN::FootprintDelete().

◆ FootprintEnumerate()

void PCB_IO::FootprintEnumerate ( wxArrayString &  aFootprintNames,
const wxString &  aLibraryPath,
bool  aBestEfforts,
const PROPERTIES aProperties = NULL 
)
overridevirtualinherited

Return a list of footprint names contained within the library at aLibraryPath.

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several footprints.
aPropertiesis an associative array that can be used to tell the plugin anything needed about how to perform with respect to aLibraryPath. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
aFootprintNamesis the array of available footprint names inside a library.
aBestEffortsif true, don't throw on errors, just return an empty list.
Exceptions
IO_ERRORif the library cannot be found, or footprint cannot be loaded.

Reimplemented from PLUGIN.

Definition at line 2128 of file kicad_plugin.cpp.

2130 {
2131  LOCALE_IO toggle; // toggles on, then off, the C locale.
2132  wxDir dir( aLibPath );
2133  wxString errorMsg;
2134 
2135  init( aProperties );
2136 
2137  try
2138  {
2139  validateCache( aLibPath );
2140  }
2141  catch( const IO_ERROR& ioe )
2142  {
2143  errorMsg = ioe.What();
2144  }
2145 
2146  // Some of the files may have been parsed correctly so we want to add the valid files to
2147  // the library.
2148 
2149  for( MODULE_CITER it = m_cache->GetModules().begin(); it != m_cache->GetModules().end(); ++it )
2150  aFootprintNames.Add( it->first );
2151 
2152  if( !errorMsg.IsEmpty() && !aBestEfforts )
2153  THROW_IO_ERROR( errorMsg );
2154 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:214
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:33
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
#define THROW_IO_ERROR(msg)
MODULE_MAP::const_iterator MODULE_CITER
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:76
MODULE_MAP & GetModules()

References FP_CACHE::GetModules(), PCB_IO::init(), PCB_IO::m_cache, THROW_IO_ERROR, PCB_IO::validateCache(), and IO_ERROR::What().

Referenced by GITHUB_PLUGIN::FootprintDelete(), and GITHUB_PLUGIN::FootprintEnumerate().

◆ FootprintExists()

bool PCB_IO::FootprintExists ( const wxString &  aLibraryPath,
const wxString &  aFootprintName,
const PROPERTIES aProperties = NULL 
)
overridevirtualinherited

Function FootprintExists check for the existence of a footprint.

Reimplemented from PLUGIN.

Definition at line 2194 of file kicad_plugin.cpp.

2196 {
2197  // Note: checking the cache sounds like a good idea, but won't catch files which differ
2198  // only in case.
2199  //
2200  // Since this goes out to the native filesystem, we get platform differences (ie: MSW's
2201  // case-insensitive filesystem) handled "for free".
2202  // Warning: footprint names frequently contain a point. So be careful when initializing
2203  // wxFileName, and use a CTOR with extension specified
2204  wxFileName footprintFile( aLibraryPath, aFootprintName, KiCadFootprintFileExtension );
2205 
2206  return footprintFile.Exists();
2207 }
const std::string KiCadFootprintFileExtension

References KiCadFootprintFileExtension.

◆ FootprintLibCreate()

void PCB_IO::FootprintLibCreate ( const wxString &  aLibraryPath,
const PROPERTIES aProperties = NULL 
)
overridevirtualinherited

Function FootprintLibCreate creates a new empty footprint library at aLibraryPath empty.

It is an error to attempt to create an existing library or to attempt to create on a "read only" location.

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several footprints.
aPropertiesis an associative array that can be used to tell the library create function anything special, because it can take any number of additional named tuning arguments that the plugin is known to support. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Exceptions
IO_ERRORif there is a problem finding the library, or creating it.

Reimplemented from PLUGIN.

Definition at line 2348 of file kicad_plugin.cpp.

2349 {
2350  if( wxDir::Exists( aLibraryPath ) )
2351  {
2352  THROW_IO_ERROR( wxString::Format( _( "Cannot overwrite library path \"%s\"." ),
2353  aLibraryPath.GetData() ) );
2354  }
2355 
2356  LOCALE_IO toggle;
2357 
2358  init( aProperties );
2359 
2360  delete m_cache;
2361  m_cache = new FP_CACHE( this, aLibraryPath );
2362  m_cache->Save();
2363 }
friend class FP_CACHE
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:214
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
#define THROW_IO_ERROR(msg)
void Save(MODULE *aModule=NULL)
Function Save Save the footprint cache or a single module from it to disk.
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
#define _(s)
Definition: 3d_actions.cpp:33

References _, Format(), PCB_IO::FP_CACHE, PCB_IO::init(), PCB_IO::m_cache, FP_CACHE::Save(), and THROW_IO_ERROR.

Referenced by GITHUB_PLUGIN::FootprintLibCreate().

◆ FootprintLibDelete()

bool PCB_IO::FootprintLibDelete ( const wxString &  aLibraryPath,
const PROPERTIES aProperties = NULL 
)
overridevirtualinherited

Function FootprintLibDelete deletes an existing footprint library and returns true, or if library does not exist returns false, or throws an exception if library exists but is read only or cannot be deleted for some other reason.

Parameters
aLibraryPathis a locator for the "library", usually a directory or file which will contain footprints.
aPropertiesis an associative array that can be used to tell the library delete implementation function anything special, because it can take any number of additional named tuning arguments that the plugin is known to support. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Returns
bool - true if library deleted, false if library did not exist.
Exceptions
IO_ERRORif there is a problem deleting an existing library.

Reimplemented from PLUGIN.

Definition at line 2366 of file kicad_plugin.cpp.

2367 {
2368  wxFileName fn;
2369  fn.SetPath( aLibraryPath );
2370 
2371  // Return if there is no library path to delete.
2372  if( !fn.DirExists() )
2373  return false;
2374 
2375  if( !fn.IsDirWritable() )
2376  {
2377  THROW_IO_ERROR( wxString::Format( _( "User does not have permission to delete directory \"%s\"." ),
2378  aLibraryPath.GetData() ) );
2379  }
2380 
2381  wxDir dir( aLibraryPath );
2382 
2383  if( dir.HasSubDirs() )
2384  {
2385  THROW_IO_ERROR( wxString::Format( _( "Library directory \"%s\" has unexpected sub-directories." ),
2386  aLibraryPath.GetData() ) );
2387  }
2388 
2389  // All the footprint files must be deleted before the directory can be deleted.
2390  if( dir.HasFiles() )
2391  {
2392  unsigned i;
2393  wxFileName tmp;
2394  wxArrayString files;
2395 
2396  wxDir::GetAllFiles( aLibraryPath, &files );
2397 
2398  for( i = 0; i < files.GetCount(); i++ )
2399  {
2400  tmp = files[i];
2401 
2402  if( tmp.GetExt() != KiCadFootprintFileExtension )
2403  {
2404  THROW_IO_ERROR( wxString::Format( _( "Unexpected file \"%s\" was found in library path \"%s\"." ),
2405  files[i].GetData(), aLibraryPath.GetData() ) );
2406  }
2407  }
2408 
2409  for( i = 0; i < files.GetCount(); i++ )
2410  wxRemoveFile( files[i] );
2411  }
2412 
2413  wxLogTrace( traceKicadPcbPlugin, wxT( "Removing footprint library \"%s\"." ),
2414  aLibraryPath.GetData() );
2415 
2416  // Some of the more elaborate wxRemoveFile() crap puts up its own wxLog dialog
2417  // we don't want that. we want bare metal portability with no UI here.
2418  if( !wxRmdir( aLibraryPath ) )
2419  {
2420  THROW_IO_ERROR( wxString::Format( _( "Footprint library \"%s\" cannot be deleted." ),
2421  aLibraryPath.GetData() ) );
2422  }
2423 
2424  // For some reason removing a directory in Windows is not immediately updated. This delay
2425  // prevents an error when attempting to immediately recreate the same directory when over
2426  // writing an existing library.
2427 #ifdef __WINDOWS__
2428  wxMilliSleep( 250L );
2429 #endif
2430 
2431  if( m_cache && !m_cache->IsPath( aLibraryPath ) )
2432  {
2433  delete m_cache;
2434  m_cache = NULL;
2435  }
2436 
2437  return true;
2438 }
const std::string KiCadFootprintFileExtension
FP_CACHE * m_cache
Footprint library cache.
#define NULL
bool IsPath(const wxString &aPath) const
Function IsPath checks if aPath is the same as the current cache path.
const wxChar *const traceKicadPcbPlugin
Flag to enable GEDA PCB plugin debug output.
#define THROW_IO_ERROR(msg)
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
#define _(s)
Definition: 3d_actions.cpp:33

References _, Format(), FP_CACHE::IsPath(), KiCadFootprintFileExtension, PCB_IO::m_cache, NULL, THROW_IO_ERROR, and traceKicadPcbPlugin.

Referenced by GITHUB_PLUGIN::FootprintLibDelete().

◆ FootprintLibOptions()

void PLUGIN::FootprintLibOptions ( PROPERTIES aListToAppendTo) const
virtualinherited

Function FootprintLibOptions appends supported PLUGIN options to aListToAppenTo along with internationalized descriptions.

Options are typically appended so that a derived PLUGIN can call its base class function by the same name first, thus inheriting options declared there. (Some base class options could pertain to all Footprint*() functions in all derived PLUGINs.) Note that since aListToAppendTo is a PROPERTIES object, all options will be unique and last guy wins.

Parameters
aListToAppendToholds a tuple of
option
This eventually is what shows up into the fp-lib-table "options" field, possibly combined with others.
internationalized description
The internationalized description is displayed in DIALOG_FP_PLUGIN_OPTIONS. It may be multi-line and be quite explanatory of the option.

In the future perhaps aListToAppendTo evolves to something capable of also holding a wxValidator for the cells in said dialog: http://forums.wxwidgets.org/viewtopic.php?t=23277&p=104180. This would require a 3 column list, and introducing wx GUI knowledge to PLUGIN, which has been avoided to date.

Reimplemented in GITHUB_PLUGIN, and EAGLE_PLUGIN.

Definition at line 140 of file plugin.cpp.

141 {
142  // disable all these in another couple of months, after everyone has seen them:
143 #if 1
144  (*aListToAppendTo)["debug_level"] = UTF8( _(
145  "Enable <b>debug</b> logging for Footprint*() functions in this PLUGIN."
146  ));
147 
148  (*aListToAppendTo)["read_filter_regex"] = UTF8( _(
149  "Regular expression <b>footprint name</b> filter."
150  ));
151 
152  (*aListToAppendTo)["enable_transaction_logging"] = UTF8( _(
153  "Enable transaction logging. The mere presence of this option turns on the "
154  "logging, no need to set a Value."
155  ));
156 
157  (*aListToAppendTo)["username"] = UTF8( _(
158  "User name for <b>login</b> to some special library server."
159  ));
160 
161  (*aListToAppendTo)["password"] = UTF8( _(
162  "Password for <b>login</b> to some special library server."
163  ));
164 #endif
165 
166 #if 1
167  // Suitable for a C++ to python PLUGIN::Footprint*() adapter, move it to the adapter
168  // if and when implemented.
169  (*aListToAppendTo)["python_footprint_plugin"] = UTF8( _(
170  "Enter the python module which implements the PLUGIN::Footprint*() functions."
171  ));
172 #endif
173 }
UTF8 is an 8 bit string that is assuredly encoded in UTF8, and supplies special conversion support to...
Definition: utf8.h:73
#define _(s)
Definition: 3d_actions.cpp:33

References _.

Referenced by EAGLE_PLUGIN::FootprintLibOptions(), and GITHUB_PLUGIN::FootprintLibOptions().

◆ FootprintLoad()

MODULE * PCB_IO::FootprintLoad ( const wxString &  aLibraryPath,
const wxString &  aFootprintName,
const PROPERTIES aProperties = NULL 
)
overridevirtualinherited

Function FootprintLoad loads a footprint having aFootprintName from the aLibraryPath containing a library format that this PLUGIN knows about.

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several footprints.
aFootprintNameis the name of the footprint to load.
aPropertiesis an associative array that can be used to tell the loader implementation to do something special, because it can take any number of additional named tuning arguments that the plugin is known to support. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Returns
MODULE* - if found caller owns it, else NULL if not found.
Exceptions
IO_ERRORif the library cannot be found or read. No exception is thrown in the case where aFootprintName cannot be found.

Reimplemented from PLUGIN.

Definition at line 2210 of file kicad_plugin.cpp.

2212 {
2213  const MODULE* footprint = getFootprint( aLibraryPath, aFootprintName, aProperties, true );
2214  return footprint ? (MODULE*) footprint->Duplicate() : nullptr;
2215 }
const MODULE * getFootprint(const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties, bool checkModified)
BOARD_ITEM * Duplicate() const
Function Duplicate creates a copy of a BOARD_ITEM.

References BOARD_ITEM::Duplicate(), and PCB_IO::getFootprint().

Referenced by GITHUB_PLUGIN::FootprintLoad().

◆ FootprintSave()

void PCB_IO::FootprintSave ( const wxString &  aLibraryPath,
const MODULE aFootprint,
const PROPERTIES aProperties = NULL 
)
overridevirtualinherited

Function FootprintSave will write aModule to an existing library located at aLibraryPath.

If a footprint by the same name already exists, it is replaced.

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several footprints.
aFootprintis what to store in the library. The caller continues to own the footprint after this call.
aPropertiesis an associative array that can be used to tell the saver how to save the footprint, because it can take any number of additional named tuning arguments that the plugin is known to support. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Exceptions
IO_ERRORif there is a problem saving.

Reimplemented from PLUGIN.

Definition at line 2218 of file kicad_plugin.cpp.

2220 {
2221  LOCALE_IO toggle; // toggles on, then off, the C locale.
2222 
2223  init( aProperties );
2224 
2225  // In this public PLUGIN API function, we can safely assume it was
2226  // called for saving into a library path.
2228 
2229  validateCache( aLibraryPath );
2230 
2231  if( !m_cache->IsWritable() )
2232  {
2233  if( !m_cache->Exists() )
2234  {
2235  const wxString msg = wxString::Format( _( "Library \"%s\" does not exist.\n"
2236  "Would you like to create it?"),
2237  GetChars( aLibraryPath ) );
2238 
2239  if( wxMessageBox( msg, _( "Library Not Found"), wxYES_NO | wxICON_QUESTION ) != wxYES )
2240  return;
2241 
2242  // Save throws its own IO_ERROR on failure, so no need to recreate here
2243  m_cache->Save( NULL );
2244  }
2245  else
2246  {
2247  wxString msg = wxString::Format( _( "Library \"%s\" is read only" ), aLibraryPath );
2248  THROW_IO_ERROR( msg );
2249  }
2250  }
2251 
2252  wxString footprintName = aFootprint->GetFPID().GetLibItemName();
2253 
2254  MODULE_MAP& mods = m_cache->GetModules();
2255 
2256  // Quietly overwrite module and delete module file from path for any by same name.
2257  wxFileName fn( aLibraryPath, aFootprint->GetFPID().GetLibItemName(),
2259 
2260 #ifndef __WINDOWS__
2261  // Write through symlinks, don't replace them
2262  if( fn.Exists( wxFILE_EXISTS_SYMLINK ) )
2263  {
2264  char buffer[ PATH_MAX + 1 ];
2265  ssize_t pathLen = readlink( TO_UTF8( fn.GetFullPath() ), buffer, PATH_MAX );
2266 
2267  if( pathLen > 0 )
2268  {
2269  buffer[ pathLen ] = '\0';
2270  fn.Assign( fn.GetPath() + wxT( "/" ) + wxString::FromUTF8( buffer ) );
2271  fn.Normalize();
2272  }
2273  }
2274 #endif
2275 
2276  if( !fn.IsOk() )
2277  {
2278  THROW_IO_ERROR( wxString::Format( _( "Footprint file name \"%s\" is not valid." ),
2279  fn.GetFullPath() ) );
2280  }
2281 
2282  if( fn.FileExists() && !fn.IsFileWritable() )
2283  {
2284  THROW_IO_ERROR( wxString::Format( _( "No write permissions to delete file \"%s\"" ),
2285  fn.GetFullPath() ) );
2286  }
2287 
2288  wxString fullPath = fn.GetFullPath();
2289  wxString fullName = fn.GetFullName();
2290  MODULE_CITER it = mods.find( footprintName );
2291 
2292  if( it != mods.end() )
2293  {
2294  wxLogTrace( traceKicadPcbPlugin, wxT( "Removing footprint file '%s'." ), fullPath );
2295  mods.erase( footprintName );
2296  wxRemoveFile( fullPath );
2297  }
2298 
2299  // I need my own copy for the cache
2300  MODULE* module = static_cast<MODULE*>( aFootprint->Duplicate() );
2301 
2302  // It should have no parent, orientation should be zero, and it should be on the front layer.
2303  module->SetParent( nullptr );
2304  module->SetOrientation( 0 );
2305 
2306  if( module->GetLayer() != F_Cu )
2307  {
2308  auto cfg = dynamic_cast<PCBNEW_SETTINGS*>( Kiface().KifaceSettings() );
2309 
2310  if( cfg )
2311  module->Flip( module->GetPosition(), cfg->m_FlipLeftRight );
2312  else
2313  module->Flip( module->GetPosition(), false );
2314  }
2315 
2316  wxLogTrace( traceKicadPcbPlugin, wxT( "Creating s-expr footprint file '%s'." ), fullPath );
2317  mods.insert( footprintName, new FP_CACHE_ITEM( module, WX_FILENAME( fn.GetPath(), fullName ) ) );
2318  m_cache->Save( module );
2319 }
const UTF8 & GetLibItemName() const
Definition: lib_id.h:114
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:214
const std::string KiCadFootprintFileExtension
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
const LIB_ID & GetFPID() const
Definition: class_module.h:215
std::map< wxString, MODULE * > MODULE_MAP
Definition: eagle_parser.h:51
virtual void SetParent(EDA_ITEM *aParent)
Definition: base_struct.h:200
#define NULL
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
void Flip(const wxPoint &aCentre, bool aFlipLeftRight) override
Function Flip Flip this object, i.e.
KIFACE_I & Kiface()
Global KIFACE_I "get" accessor.
const wxChar *const traceKicadPcbPlugin
Flag to enable GEDA PCB plugin debug output.
#define THROW_IO_ERROR(msg)
FP_CACHE_ITEM is helper class for creating a footprint library cache.
void Save(MODULE *aModule=NULL)
Function Save Save the footprint cache or a single module from it to disk.
bool IsWritable() const
MODULE_MAP::const_iterator MODULE_CITER
#define CTL_FOR_LIBRARY
Format output for a footprint library instead of clipboard or BOARD.
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:153
A wrapper around a wxFileName which is much more performant with a subset of the API.
Definition: common.h:412
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
#define _(s)
Definition: 3d_actions.cpp:33
void SetOrientation(double newangle)
#define TO_UTF8(wxstring)
bool Exists() const
virtual PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
const wxPoint GetPosition() const override
Definition: class_module.h:206
MODULE_MAP & GetModules()
BOARD_ITEM * Duplicate() const
Function Duplicate creates a copy of a BOARD_ITEM.

References _, CTL_FOR_LIBRARY, BOARD_ITEM::Duplicate(), FP_CACHE::Exists(), F_Cu, MODULE::Flip(), Format(), GetChars(), MODULE::GetFPID(), BOARD_ITEM::GetLayer(), LIB_ID::GetLibItemName(), FP_CACHE::GetModules(), MODULE::GetPosition(), PCB_IO::init(), FP_CACHE::IsWritable(), KiCadFootprintFileExtension, Kiface(), PCB_IO::m_cache, PCB_IO::m_ctl, NULL, FP_CACHE::Save(), MODULE::SetOrientation(), EDA_ITEM::SetParent(), THROW_IO_ERROR, TO_UTF8, traceKicadPcbPlugin, and PCB_IO::validateCache().

Referenced by GITHUB_PLUGIN::FootprintSave().

◆ Format()

void PCB_IO::Format ( BOARD_ITEM aItem,
int  aNestLevel = 0 
) const
inherited

Function Format outputs aItem to aFormatter in s-expression format.

Parameters
aItemA pointer the an BOARD_ITEM object to format.
aNestLevelThe indentation nest level.
Exceptions
IO_ERRORon write error.

Definition at line 402 of file kicad_plugin.cpp.

403 {
404  LOCALE_IO toggle; // public API function, perform anything convenient for caller
405 
406  switch( aItem->Type() )
407  {
408  case PCB_T:
409  format( static_cast<BOARD*>( aItem ), aNestLevel );
410  break;
411 
412  case PCB_DIMENSION_T:
413  format( static_cast<DIMENSION*>( aItem ), aNestLevel );
414  break;
415 
416  case PCB_LINE_T:
417  format( static_cast<DRAWSEGMENT*>( aItem ), aNestLevel );
418  break;
419 
420  case PCB_MODULE_EDGE_T:
421  format( static_cast<EDGE_MODULE*>( aItem ), aNestLevel );
422  break;
423 
424  case PCB_TARGET_T:
425  format( static_cast<PCB_TARGET*>( aItem ), aNestLevel );
426  break;
427 
428  case PCB_MODULE_T:
429  format( static_cast<MODULE*>( aItem ), aNestLevel );
430  break;
431 
432  case PCB_PAD_T:
433  format( static_cast<D_PAD*>( aItem ), aNestLevel );
434  break;
435 
436  case PCB_TEXT_T:
437  format( static_cast<TEXTE_PCB*>( aItem ), aNestLevel );
438  break;
439 
440  case PCB_MODULE_TEXT_T:
441  format( static_cast<TEXTE_MODULE*>( aItem ), aNestLevel );
442  break;
443 
444  case PCB_TRACE_T:
445  case PCB_ARC_T:
446  case PCB_VIA_T:
447  format( static_cast<TRACK*>( aItem ), aNestLevel );
448  break;
449 
451  case PCB_ZONE_AREA_T:
452  format( static_cast<ZONE_CONTAINER*>( aItem ), aNestLevel );
453  break;
454 
455  default:
456  wxFAIL_MSG( wxT( "Cannot format item " ) + aItem->GetClass() );
457  }
458 }
Definition: typeinfo.h:85
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:214
class ZONE_CONTAINER, a zone area
Definition: typeinfo.h:102
class TEXTE_PCB, text on a layer
Definition: typeinfo.h:92
class ARC, an arc track segment on a copper layer
Definition: typeinfo.h:98
class D_PAD, a pad in a footprint
Definition: typeinfo.h:90
class EDGE_MODULE, a footprint edge
Definition: typeinfo.h:94
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:96
class MODULE, a footprint
Definition: typeinfo.h:89
class DIMENSION, a dimension (graphic item)
Definition: typeinfo.h:100
class PCB_TARGET, a target (graphic item)
Definition: typeinfo.h:101
class TEXTE_MODULE, text in a footprint
Definition: typeinfo.h:93
virtual wxString GetClass() const =0
Function GetClass returns the class name.
void format(BOARD *aBoard, int aNestLevel=0) const
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:97
class ZONE_CONTAINER, managed by a footprint
Definition: typeinfo.h:95
class DRAWSEGMENT, a segment not on copper layers
Definition: typeinfo.h:91
KICAD_T Type() const
Function Type()
Definition: base_struct.h:197

References PCB_IO::format(), EDA_ITEM::GetClass(), PCB_ARC_T, PCB_DIMENSION_T, PCB_LINE_T, PCB_MODULE_EDGE_T, PCB_MODULE_T, PCB_MODULE_TEXT_T, PCB_MODULE_ZONE_AREA_T, PCB_PAD_T, PCB_T, PCB_TARGET_T, PCB_TEXT_T, PCB_TRACE_T, PCB_VIA_T, PCB_ZONE_AREA_T, and EDA_ITEM::Type().

Referenced by FOOTPRINT_EDIT_FRAME::Export_Module(), PCB_IO::format(), Save(), PCB_IO::Save(), FP_CACHE::Save(), and SaveSelection().

◆ formatBoardLayers()

void PCB_IO::formatBoardLayers ( BOARD aBoard,
int  aNestLevel = 0 
) const
protectedinherited

formats the board layer information

Definition at line 682 of file kicad_plugin.cpp.

683 {
684  m_out->Print( aNestLevel, "(layers\n" );
685 
686  // Save only the used copper layers from front to back.
687  LSET visible_layers = aBoard->GetVisibleLayers();
688 
689  for( LSEQ cu = aBoard->GetEnabledLayers().CuStack(); cu; ++cu )
690  {
691  PCB_LAYER_ID layer = *cu;
692 
693  m_out->Print( aNestLevel+1, "(%d %s %s", layer,
694  m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str(),
695  LAYER::ShowType( aBoard->GetLayerType( layer ) ) );
696 
697  if( !visible_layers[layer] )
698  m_out->Print( 0, " hide" );
699 
700  m_out->Print( 0, ")\n" );
701  }
702 
703  // Save used non-copper layers in the order they are defined.
704  // desired sequence for non Cu BOARD layers.
705  static const PCB_LAYER_ID non_cu[] =
706  {
707  B_Adhes, // 32
708  F_Adhes,
709  B_Paste,
710  F_Paste,
711  B_SilkS,
712  F_SilkS,
713  B_Mask,
714  F_Mask,
715  Dwgs_User,
716  Cmts_User,
717  Eco1_User,
718  Eco2_User,
719  Edge_Cuts,
720  Margin,
721  B_CrtYd,
722  F_CrtYd,
723  B_Fab,
724  F_Fab
725  };
726 
727  for( LSEQ seq = aBoard->GetEnabledLayers().Seq( non_cu, arrayDim( non_cu ) ); seq; ++seq )
728  {
729  PCB_LAYER_ID layer = *seq;
730 
731  m_out->Print( aNestLevel+1, "(%d %s user", layer,
732  m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str() );
733 
734  if( !visible_layers[layer] )
735  m_out->Print( 0, " hide" );
736 
737  m_out->Print( 0, ")\n" );
738  }
739 
740  m_out->Print( aNestLevel, ")\n\n" );
741 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
LSEQ CuStack() const
Function CuStack returns a sequence of copper layers in starting from the front/top and extending to ...
Definition: lset.cpp:155
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Function GetLayerName returns the name of a layer.
LSET GetVisibleLayers() const
Function GetVisibleLayers is a proxy function that calls the correspondent function in m_BoardSetting...
LSET GetEnabledLayers() const
Function GetEnabledLayers is a proxy function that calls the corresponding function in m_BoardSetting...
LSEQ Seq(const PCB_LAYER_ID *aWishListSequence, unsigned aCount) const
Function Seq returns an LSEQ from the union of this LSET and a desired sequence.
Definition: lset.cpp:377
static const char * ShowType(LAYER_T aType)
Function ShowType converts a LAYER_T enum to a const char*.
PCB_LAYER_ID
A quick note on layer IDs:
LSET is a set of PCB_LAYER_IDs.
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:472
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Definition: macros.h:160
LAYER_T GetLayerType(PCB_LAYER_ID aLayer) const
Function GetLayerType returns the type of the copper layer given by aLayer.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404

References arrayDim(), B_Adhes, B_CrtYd, B_Fab, B_Mask, B_Paste, B_SilkS, Cmts_User, LSET::CuStack(), Dwgs_User, Eco1_User, Eco2_User, Edge_Cuts, F_Adhes, F_CrtYd, F_Fab, F_Mask, F_Paste, F_SilkS, BOARD::GetEnabledLayers(), BOARD::GetLayerName(), BOARD::GetLayerType(), BOARD::GetVisibleLayers(), PCB_IO::m_out, Margin, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), LSET::Seq(), and LAYER::ShowType().

Referenced by PCB_IO::formatHeader(), and SaveSelection().

◆ formatDefaults()

void PCB_IO::formatDefaults ( const BOARD_DESIGN_SETTINGS aSettings,
int  aNestLevel 
) const
protectedinherited

formats the defaults subsection of the board setup

Definition at line 605 of file kicad_plugin.cpp.

606 {
607  m_out->Print( aNestLevel, "(defaults\n" );
608 
609  m_out->Print( aNestLevel+1, "(edge_clearance %s)\n",
610  FormatInternalUnits( aSettings.m_CopperEdgeClearance ).c_str() );
611 
612  m_out->Print( aNestLevel+1, "(edge_cuts_line_width %s)\n",
613  FormatInternalUnits( aSettings.m_LineThickness[ LAYER_CLASS_EDGES ] ).c_str() );
614 
615  m_out->Print( aNestLevel+1, "(courtyard_line_width %s)\n",
617 
618  m_out->Print( aNestLevel+1, "(copper_line_width %s)\n",
619  FormatInternalUnits( aSettings.m_LineThickness[ LAYER_CLASS_COPPER ] ).c_str() );
620  m_out->Print( aNestLevel+1, "(copper_text_dims (size %s %s) (thickness %s)%s%s)\n",
621  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_COPPER ].x ).c_str(),
622  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_COPPER ].y ).c_str(),
624  aSettings.m_TextItalic[ LAYER_CLASS_COPPER ] ? " italic" : "",
625  aSettings.m_TextUpright[ LAYER_CLASS_COPPER ] ? " keep_upright" : "" );
626 
627  m_out->Print( aNestLevel+1, "(silk_line_width %s)\n",
628  FormatInternalUnits( aSettings.m_LineThickness[ LAYER_CLASS_SILK ] ).c_str() );
629  m_out->Print( aNestLevel+1, "(silk_text_dims (size %s %s) (thickness %s)%s%s)\n",
630  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_SILK ].x ).c_str(),
631  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_SILK ].y ).c_str(),
632  FormatInternalUnits( aSettings.m_TextThickness[ LAYER_CLASS_SILK ] ).c_str(),
633  aSettings.m_TextItalic[ LAYER_CLASS_SILK ] ? " italic" : "",
634  aSettings.m_TextUpright[ LAYER_CLASS_SILK ] ? " keep_upright" : "" );
635 
636  m_out->Print( aNestLevel+1, "(fab_layers_line_width %s)\n",
637  FormatInternalUnits( aSettings.m_LineThickness[ LAYER_CLASS_FAB ] ).c_str() );
638  m_out->Print( aNestLevel+1, "(fab_layers_text_dims (size %s %s) (thickness %s)%s%s)\n",
639  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_FAB ].x ).c_str(),
640  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_FAB ].y ).c_str(),
641  FormatInternalUnits( aSettings.m_TextThickness[ LAYER_CLASS_FAB ] ).c_str(),
642  aSettings.m_TextItalic[ LAYER_CLASS_OTHERS ] ? " italic" : "",
643  aSettings.m_TextUpright[ LAYER_CLASS_OTHERS ] ? " keep_upright" : "" );
644 
645  m_out->Print( aNestLevel+1, "(other_layers_line_width %s)\n",
646  FormatInternalUnits( aSettings.m_LineThickness[ LAYER_CLASS_OTHERS ] ).c_str() );
647  m_out->Print( aNestLevel+1, "(other_layers_text_dims (size %s %s) (thickness %s)%s%s)\n",
648  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_OTHERS ].x ).c_str(),
649  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_OTHERS ].y ).c_str(),
651  aSettings.m_TextItalic[ LAYER_CLASS_OTHERS ] ? " italic" : "",
652  aSettings.m_TextUpright[ LAYER_CLASS_OTHERS ] ? " keep_upright" : "" );
653 
654  m_out->Print( aNestLevel+1, "(dimension_units %d)\n", aSettings.m_DimensionUnits );
655  m_out->Print( aNestLevel+1, "(dimension_precision %d)\n", aSettings.m_DimensionPrecision );
656 
657  m_out->Print( aNestLevel, ")\n" );
658 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
wxSize m_TextSize[LAYER_CLASS_COUNT]
int m_TextThickness[LAYER_CLASS_COUNT]
bool m_TextItalic[LAYER_CLASS_COUNT]
int m_LineThickness[LAYER_CLASS_COUNT]
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
bool m_TextUpright[LAYER_CLASS_COUNT]
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:531

References FormatInternalUnits(), LAYER_CLASS_COPPER, LAYER_CLASS_COURTYARD, LAYER_CLASS_EDGES, LAYER_CLASS_FAB, LAYER_CLASS_OTHERS, LAYER_CLASS_SILK, BOARD_DESIGN_SETTINGS::m_CopperEdgeClearance, BOARD_DESIGN_SETTINGS::m_DimensionPrecision, BOARD_DESIGN_SETTINGS::m_DimensionUnits, BOARD_DESIGN_SETTINGS::m_LineThickness, PCB_IO::m_out, BOARD_DESIGN_SETTINGS::m_TextItalic, BOARD_DESIGN_SETTINGS::m_TextSize, BOARD_DESIGN_SETTINGS::m_TextThickness, BOARD_DESIGN_SETTINGS::m_TextUpright, and OUTPUTFORMATTER::Print().

Referenced by PCB_IO::formatSetup().

◆ formatGeneral()

void PCB_IO::formatGeneral ( BOARD aBoard,
int  aNestLevel = 0 
) const
protectedinherited

formats the General section of the file

Definition at line 661 of file kicad_plugin.cpp.

662 {
663  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
664 
665  m_out->Print( 0, "\n" );
666  m_out->Print( aNestLevel, "(general\n" );
667  // Write Bounding box info
668  m_out->Print( aNestLevel+1, "(thickness %s)\n",
669  FormatInternalUnits( dsnSettings.GetBoardThickness() ).c_str() );
670 
671  m_out->Print( aNestLevel+1, "(drawings %u)\n", (unsigned)aBoard->Drawings().size() );
672  m_out->Print( aNestLevel + 1, "(tracks %u)\n", (unsigned)aBoard->Tracks().size() );
673  m_out->Print( aNestLevel + 1, "(modules %u)\n", (unsigned)aBoard->Modules().size() );
674  m_out->Print( aNestLevel+1, "(nets %d)\n", m_mapping->GetSize() );
675  m_out->Print( aNestLevel, ")\n\n" );
676 
677  aBoard->GetPageSettings().Format( m_out, aNestLevel, m_ctl );
678  aBoard->GetTitleBlock().Format( m_out, aNestLevel, m_ctl );
679 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const PAGE_INFO & GetPageSettings() const
Definition: class_board.h:557
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:542
void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Function GetStandardSizes returns the standard page types, such as "A4", "A3", etc.
Definition: page_info.cpp:267
int GetSize() const
Function GetSize.
Definition: netinfo.h:375
MODULES & Modules()
Definition: class_board.h:256
virtual void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Function Format outputs the object to aFormatter in s-expression form.
Definition: ws_painter.cpp:217
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes
TITLE_BLOCK & GetTitleBlock()
Definition: class_board.h:563
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
DRAWINGS & Drawings()
Definition: class_board.h:265
TRACKS & Tracks()
Definition: class_board.h:247
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:531
BOARD_DESIGN_SETTINGS contains design settings for a BOARD object.

References BOARD::Drawings(), TITLE_BLOCK::Format(), PAGE_INFO::Format(), FormatInternalUnits(), BOARD_DESIGN_SETTINGS::GetBoardThickness(), BOARD::GetDesignSettings(), BOARD::GetPageSettings(), NETINFO_MAPPING::GetSize(), BOARD::GetTitleBlock(), PCB_IO::m_ctl, PCB_IO::m_mapping, PCB_IO::m_out, BOARD::Modules(), OUTPUTFORMATTER::Print(), and BOARD::Tracks().

Referenced by PCB_IO::formatHeader().

◆ formatHeader()

void PCB_IO::formatHeader ( BOARD aBoard,
int  aNestLevel = 0 
) const
protectedinherited

writes everything that comes before the board_items, like settings and layers etc

Definition at line 771 of file kicad_plugin.cpp.

772 {
773  formatGeneral( aBoard, aNestLevel );
774  // Layers list.
775  formatBoardLayers( aBoard, aNestLevel );
776 
777  // Setup
778  formatSetup( aBoard, aNestLevel );
779 
780  // Save net codes and names
781  formatNetInformation( aBoard, aNestLevel );
782 }
void formatGeneral(BOARD *aBoard, int aNestLevel=0) const
formats the General section of the file
void formatNetInformation(BOARD *aBoard, int aNestLevel=0) const
formats the Nets and Netclasses
void formatSetup(BOARD *aBoard, int aNestLevel=0) const
formats the board setup information
void formatBoardLayers(BOARD *aBoard, int aNestLevel=0) const
formats the board layer information

References PCB_IO::formatBoardLayers(), PCB_IO::formatGeneral(), PCB_IO::formatNetInformation(), and PCB_IO::formatSetup().

Referenced by PCB_IO::format().

◆ formatNetInformation()

void PCB_IO::formatNetInformation ( BOARD aBoard,
int  aNestLevel = 0 
) const
protectedinherited

formats the Nets and Netclasses

Definition at line 744 of file kicad_plugin.cpp.

745 {
746  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
747  for( NETINFO_ITEM* net : *m_mapping )
748  {
749  m_out->Print( aNestLevel, "(net %d %s)\n",
750  m_mapping->Translate( net->GetNet() ),
751  m_out->Quotew( net->GetNetname() ).c_str() );
752  }
753 
754  m_out->Print( 0, "\n" );
755 
756  // Save the default net class first.
757  NETCLASS defaultNC = *dsnSettings.GetDefault();
758  filterNetClass( *aBoard, defaultNC ); // Remove empty nets (from a copy of a netclass)
759  defaultNC.Format( m_out, aNestLevel, m_ctl );
760 
761  // Save the rest of the net classes alphabetically.
762  for( const auto& it : dsnSettings.m_NetClasses )
763  {
764  NETCLASS netclass = *it.second;
765  filterNetClass( *aBoard, netclass ); // Remove empty nets (from a copy of a netclass)
766  netclass.Format( m_out, aNestLevel, m_ctl );
767  }
768 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:542
NETCLASS handles a collection of nets and the parameters used to route or test these nets.
Definition: netclass.h:55
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:472
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes
NETINFO_ITEM handles the data for a net.
Definition: netinfo.h:65
NETCLASS * GetDefault() const
Function GetDefault.
void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Function Format outputs the net class to aFormatter in s-expression form.
Definition: netclass.cpp:255
void filterNetClass(const BOARD &aBoard, NETCLASS &aNetClass)
Removes empty nets (i.e. with node count equal zero) from net classes
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
int Translate(int aNetCode) const
Function Translate Translates net number according to the map prepared by Update() function.
BOARD_DESIGN_SETTINGS contains design settings for a BOARD object.

References filterNetClass(), NETCLASS::Format(), BOARD_DESIGN_SETTINGS::GetDefault(), BOARD::GetDesignSettings(), PCB_IO::m_ctl, PCB_IO::m_mapping, BOARD_DESIGN_SETTINGS::m_NetClasses, PCB_IO::m_out, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), and NETINFO_MAPPING::Translate().

Referenced by PCB_IO::formatHeader(), and SaveSelection().

◆ formatSetup()

void PCB_IO::formatSetup ( BOARD aBoard,
int  aNestLevel = 0 
) const
protectedinherited

formats the board setup information

Definition at line 475 of file kicad_plugin.cpp.

476 {
477  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
478 
479  // Setup
480  m_out->Print( aNestLevel, "(setup\n" );
481 
482  // Save the board physical stackup structure
484 
485  if( aBoard->GetDesignSettings().m_HasStackup )
486  stackup.FormatBoardStackup( m_out,aBoard, aNestLevel+1 );
487 
488  // Save current default track width, for compatibility with older Pcbnew version;
489  m_out->Print( aNestLevel+1, "(last_trace_width %s)\n",
490  FormatInternalUnits( dsnSettings.GetCurrentTrackWidth() ).c_str() );
491 
492  // Save custom track widths list (the first is not saved here: it's the netclass value)
493  for( unsigned ii = 1; ii < dsnSettings.m_TrackWidthList.size(); ii++ )
494  {
495  m_out->Print( aNestLevel+1, "(user_trace_width %s)\n",
496  FormatInternalUnits( dsnSettings.m_TrackWidthList[ii] ).c_str() );
497  }
498 
499  m_out->Print( aNestLevel+1, "(trace_clearance %s)\n",
500  FormatInternalUnits( dsnSettings.GetDefault()->GetClearance() ).c_str() );
501 
502  // ZONE_SETTINGS
503  m_out->Print( aNestLevel+1, "(zone_clearance %s)\n",
504  FormatInternalUnits( aBoard->GetZoneSettings().m_ZoneClearance ).c_str() );
505  m_out->Print( aNestLevel+1, "(zone_45_only %s)\n",
506  aBoard->GetZoneSettings().m_Zone_45_Only ? "yes" : "no" );
507 
508  m_out->Print( aNestLevel+1, "(trace_min %s)\n",
509  FormatInternalUnits( dsnSettings.m_TrackMinWidth ).c_str() );
510  m_out->Print( aNestLevel+1, "(clearance_min %s)\n",
511  FormatInternalUnits( dsnSettings.m_MinClearance ).c_str() );
512  m_out->Print( aNestLevel+1, "(via_min_annulus %s)\n",
513  FormatInternalUnits( dsnSettings.m_ViasMinAnnulus ).c_str() );
514  m_out->Print( aNestLevel+1, "(via_min_size %s)\n",
515  FormatInternalUnits( dsnSettings.m_ViasMinSize ).c_str() );
516  m_out->Print( aNestLevel+1, "(through_hole_min %s)\n",
517  FormatInternalUnits( dsnSettings.m_MinThroughDrill ).c_str() );
518  m_out->Print( aNestLevel+1, "(hole_to_hole_min %s)\n",
519  FormatInternalUnits( dsnSettings.m_HoleToHoleMin ).c_str() );
520 
521  // Save current default via size, for compatibility with older Pcbnew version;
522  m_out->Print( aNestLevel+1, "(via_size %s)\n",
523  FormatInternalUnits( dsnSettings.GetDefault()->GetViaDiameter() ).c_str() );
524  m_out->Print( aNestLevel+1, "(via_drill %s)\n",
525  FormatInternalUnits( dsnSettings.GetDefault()->GetViaDrill() ).c_str() );
526 
527  // Save custom via dimensions list (the first is not saved here: it's the netclass value)
528  for( unsigned ii = 1; ii < dsnSettings.m_ViasDimensionsList.size(); ii++ )
529  m_out->Print( aNestLevel+1, "(user_via %s %s)\n",
530  FormatInternalUnits( dsnSettings.m_ViasDimensionsList[ii].m_Diameter ).c_str(),
531  FormatInternalUnits( dsnSettings.m_ViasDimensionsList[ii].m_Drill ).c_str() );
532 
533  // Save custom diff-pair dimensions (the first is not saved here: it's the netclass value)
534  for( unsigned ii = 1; ii < dsnSettings.m_DiffPairDimensionsList.size(); ii++ )
535  {
536  m_out->Print( aNestLevel+1, "(user_diff_pair %s %s %s)\n",
537  FormatInternalUnits( dsnSettings.m_DiffPairDimensionsList[ii].m_Width ).c_str(),
538  FormatInternalUnits( dsnSettings.m_DiffPairDimensionsList[ii].m_Gap ).c_str(),
539  FormatInternalUnits( dsnSettings.m_DiffPairDimensionsList[ii].m_ViaGap ).c_str() );
540  }
541 
542  // for old versions compatibility:
543  if( dsnSettings.m_BlindBuriedViaAllowed )
544  m_out->Print( aNestLevel+1, "(blind_buried_vias_allowed yes)\n" );
545 
546  m_out->Print( aNestLevel+1, "(uvia_size %s)\n",
547  FormatInternalUnits( dsnSettings.GetDefault()->GetuViaDiameter() ).c_str() );
548  m_out->Print( aNestLevel+1, "(uvia_drill %s)\n",
549  FormatInternalUnits( dsnSettings.GetDefault()->GetuViaDrill() ).c_str() );
550  m_out->Print( aNestLevel+1, "(uvias_allowed %s)\n",
551  ( dsnSettings.m_MicroViasAllowed ) ? "yes" : "no" );
552  m_out->Print( aNestLevel+1, "(uvia_min_size %s)\n",
553  FormatInternalUnits( dsnSettings.m_MicroViasMinSize ).c_str() );
554  m_out->Print( aNestLevel+1, "(uvia_min_drill %s)\n",
555  FormatInternalUnits( dsnSettings.m_MicroViasMinDrill ).c_str() );
556 
557  m_out->Print( aNestLevel+1, "(max_error %s)\n",
558  FormatInternalUnits( dsnSettings.m_MaxError ).c_str() );
559 
560  // Store this option only if it is not the legacy option:
561  if( dsnSettings.m_ZoneUseNoOutlineInFill )
562  m_out->Print( aNestLevel+1, "(filled_areas_thickness no)\n" );
563 
564  formatDefaults( dsnSettings, aNestLevel+1 );
565 
566  m_out->Print( aNestLevel+1, "(pad_size %s %s)\n",
567  FormatInternalUnits( dsnSettings.m_Pad_Master.GetSize().x ).c_str(),
568  FormatInternalUnits( dsnSettings.m_Pad_Master.GetSize().y ).c_str() );
569  m_out->Print( aNestLevel+1, "(pad_drill %s)\n",
570  FormatInternalUnits( dsnSettings.m_Pad_Master.GetDrillSize().x ).c_str() );
571 
572  m_out->Print( aNestLevel+1, "(pad_to_mask_clearance %s)\n",
573  FormatInternalUnits( dsnSettings.m_SolderMaskMargin ).c_str() );
574 
575  if( dsnSettings.m_SolderMaskMinWidth )
576  m_out->Print( aNestLevel+1, "(solder_mask_min_width %s)\n",
577  FormatInternalUnits( dsnSettings.m_SolderMaskMinWidth ).c_str() );
578 
579  if( dsnSettings.m_SolderPasteMargin != 0 )
580  m_out->Print( aNestLevel+1, "(pad_to_paste_clearance %s)\n",
581  FormatInternalUnits( dsnSettings.m_SolderPasteMargin ).c_str() );
582 
583  if( dsnSettings.m_SolderPasteMarginRatio != 0 )
584  m_out->Print( aNestLevel+1, "(pad_to_paste_clearance_ratio %s)\n",
585  Double2Str( dsnSettings.m_SolderPasteMarginRatio ).c_str() );
586 
587  m_out->Print( aNestLevel+1, "(aux_axis_origin %s %s)\n",
588  FormatInternalUnits( aBoard->GetAuxOrigin().x ).c_str(),
589  FormatInternalUnits( aBoard->GetAuxOrigin().y ).c_str() );
590 
591  if( aBoard->GetGridOrigin().x || aBoard->GetGridOrigin().y )
592  m_out->Print( aNestLevel+1, "(grid_origin %s %s)\n",
593  FormatInternalUnits( aBoard->GetGridOrigin().x ).c_str(),
594  FormatInternalUnits( aBoard->GetGridOrigin().y ).c_str() );
595 
596  m_out->Print( aNestLevel+1, "(visible_elements %X)\n",
597  dsnSettings.GetVisibleElements() );
598 
599  aBoard->GetPlotOptions().Format( m_out, aNestLevel+1 );
600 
601  m_out->Print( aNestLevel, ")\n\n" );
602 }
void FormatBoardStackup(OUTPUTFORMATTER *aFormatter, BOARD *aBoard, int aNestLevel) const
Writes the stackup info on board file.
int m_SolderMaskMargin
Solder mask margin.
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const PCB_PLOT_PARAMS & GetPlotOptions() const
Definition: class_board.h:560
int m_SolderPasteMargin
Solder paste margin absolute value.
int GetCurrentTrackWidth() const
Function GetCurrentTrackWidth.
this class manage the layers needed to make a physical board they are solder mask,...
std::vector< int > m_TrackWidthList
std::vector< DIFF_PAIR_DIMENSION > m_DiffPairDimensionsList
void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControl=0) const
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:542
std::string Double2Str(double aValue)
Helper function Double2Str to print a float number without using scientific notation and no trailing ...
Definition: base_units.cpp:62
int GetClearance(wxString *aSource=nullptr) const
Definition: netclass.h:162
BOARD_STACKUP & GetStackupDescriptor()
int GetViaDrill() const
Definition: netclass.h:178
int m_ZoneClearance
Minimal clearance value.
Definition: zone_settings.h:74
bool m_BlindBuriedViaAllowed
true to allow blind/buried vias
int GetuViaDiameter() const
Definition: netclass.h:181
const wxPoint & GetAuxOrigin() const
Definition: class_board.h:364
const wxPoint & GetGridOrigin() const
Definition: class_board.h:371
const ZONE_SETTINGS & GetZoneSettings() const
Fetch the zone settings for this container.
int GetVisibleElements() const
Function GetVisibleElements returns a bit-mask of all the element categories that are visible.
bool m_ZoneUseNoOutlineInFill
Option to handle filled polygons in zones: the "legacy" option is using thick outlines around filled ...
const wxSize & GetDrillSize() const
Definition: class_pad.h:291
D_PAD m_Pad_Master
A dummy pad to store all default parameters.
NETCLASS * GetDefault() const
Function GetDefault.
int GetViaDiameter() const
Definition: netclass.h:175
std::vector< VIA_DIMENSION > m_ViasDimensionsList
int GetuViaDrill() const
Definition: netclass.h:184
void formatDefaults(const BOARD_DESIGN_SETTINGS &aSettings, int aNestLevel) const
formats the defaults subsection of the board setup
bool m_MicroViasAllowed
true to allow micro vias
bool m_HasStackup
Set to true if the board has a stackup management.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
double m_SolderPasteMarginRatio
Solder pask margin ratio value of pad size The final margin is the sum of these 2 values.
const wxSize & GetSize() const
Definition: class_pad.h:285
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:531
int m_SolderMaskMinWidth
Solder mask min width.
BOARD_DESIGN_SETTINGS contains design settings for a BOARD object.

References Double2Str(), PCB_PLOT_PARAMS::Format(), BOARD_STACKUP::FormatBoardStackup(), PCB_IO::formatDefaults(), FormatInternalUnits(), BOARD::GetAuxOrigin(), NETCLASS::GetClearance(), BOARD_DESIGN_SETTINGS::GetCurrentTrackWidth(), BOARD_DESIGN_SETTINGS::GetDefault(), BOARD::GetDesignSettings(), D_PAD::GetDrillSize(), BOARD::GetGridOrigin(), BOARD::GetPlotOptions(), D_PAD::GetSize(), BOARD_DESIGN_SETTINGS::GetStackupDescriptor(), NETCLASS::GetuViaDiameter(), NETCLASS::GetuViaDrill(), NETCLASS::GetViaDiameter(), NETCLASS::GetViaDrill(), BOARD_DESIGN_SETTINGS::GetVisibleElements(), BOARD_ITEM_CONTAINER::GetZoneSettings(), BOARD_DESIGN_SETTINGS::m_BlindBuriedViaAllowed, BOARD_DESIGN_SETTINGS::m_DiffPairDimensionsList, BOARD_DESIGN_SETTINGS::m_HasStackup, BOARD_DESIGN_SETTINGS::m_HoleToHoleMin, BOARD_DESIGN_SETTINGS::m_MaxError, BOARD_DESIGN_SETTINGS::m_MicroViasAllowed, BOARD_DESIGN_SETTINGS::m_MicroViasMinDrill, BOARD_DESIGN_SETTINGS::m_MicroViasMinSize, BOARD_DESIGN_SETTINGS::m_MinClearance, BOARD_DESIGN_SETTINGS::m_MinThroughDrill, PCB_IO::m_out, BOARD_DESIGN_SETTINGS::m_Pad_Master, BOARD_DESIGN_SETTINGS::m_SolderMaskMargin, BOARD_DESIGN_SETTINGS::m_SolderMaskMinWidth, BOARD_DESIGN_SETTINGS::m_SolderPasteMargin, BOARD_DESIGN_SETTINGS::m_SolderPasteMarginRatio, BOARD_DESIGN_SETTINGS::m_TrackMinWidth, BOARD_DESIGN_SETTINGS::m_TrackWidthList, BOARD_DESIGN_SETTINGS::m_ViasDimensionsList, BOARD_DESIGN_SETTINGS::m_ViasMinAnnulus, BOARD_DESIGN_SETTINGS::m_ViasMinSize, ZONE_SETTINGS::m_Zone_45_Only, ZONE_SETTINGS::m_ZoneClearance, BOARD_DESIGN_SETTINGS::m_ZoneUseNoOutlineInFill, OUTPUTFORMATTER::Print(), wxPoint::x, and wxPoint::y.

Referenced by PCB_IO::formatHeader().

◆ GetEnumeratedFootprint()

const MODULE * PCB_IO::GetEnumeratedFootprint ( const wxString &  aLibraryPath,
const wxString &  aFootprintName,
const PROPERTIES aProperties = NULL 
)
overridevirtualinherited

Function GetEnumeratedFootprint a version of FootprintLoad() for use after FootprintEnumerate() for more efficient cache management.

Reimplemented from PLUGIN.

Definition at line 2186 of file kicad_plugin.cpp.

2189 {
2190  return getFootprint( aLibraryPath, aFootprintName, aProperties, false );
2191 }
const MODULE * getFootprint(const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties, bool checkModified)

References PCB_IO::getFootprint().

◆ GetFileExtension()

const wxString PCB_IO::GetFileExtension ( ) const
inlineoverridevirtualinherited

Function GetFileExtension returns the file extension for the PLUGIN.

Implements PLUGIN.

Definition at line 115 of file pcbnew/kicad_plugin.h.

116  {
117  // Would have used wildcards_and_files_ext.cpp's KiCadPcbFileExtension,
118  // but to be pure, a plugin should not assume that it will always be linked
119  // with the core of the pcbnew code. (Might someday be a DLL/DSO.) Besides,
120  // file extension policy should be controlled by the plugin.
121  return wxT( "kicad_pcb" );
122  }

◆ getFootprint()

const MODULE * PCB_IO::getFootprint ( const wxString &  aLibraryPath,
const wxString &  aFootprintName,
const PROPERTIES aProperties,
bool  checkModified 
)
protectedinherited

Definition at line 2157 of file kicad_plugin.cpp.

2161 {
2162  LOCALE_IO toggle; // toggles on, then off, the C locale.
2163 
2164  init( aProperties );
2165 
2166  try
2167  {
2168  validateCache( aLibraryPath, checkModified );
2169  }
2170  catch( const IO_ERROR& )
2171  {
2172  // do nothing with the error
2173  }
2174 
2175  const MODULE_MAP& mods = m_cache->GetModules();
2176 
2177  MODULE_CITER it = mods.find( aFootprintName );
2178 
2179  if( it == mods.end() )
2180  return nullptr;
2181 
2182  return it->second->GetModule();
2183 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:214
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
std::map< wxString, MODULE * > MODULE_MAP
Definition: eagle_parser.h:51
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
MODULE_MAP::const_iterator MODULE_CITER
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:76
MODULE_MAP & GetModules()

References FP_CACHE::GetModules(), PCB_IO::init(), PCB_IO::m_cache, and PCB_IO::validateCache().

Referenced by PCB_IO::FootprintLoad(), and PCB_IO::GetEnumeratedFootprint().

◆ GetFormatter()

STRING_FORMATTER * CLIPBOARD_IO::GetFormatter ( )

Definition at line 52 of file kicad_clipboard.cpp.

53 {
54  return &m_formatter;
55 }
STRING_FORMATTER m_formatter

References m_formatter.

◆ GetLibraryTimestamp()

long long PCB_IO::GetLibraryTimestamp ( const wxString &  aLibraryPath) const
overridevirtualinherited

Generate a timestamp representing all the files in the library (including the library directory).

Timestamps should not be considered ordered; they either match or they don't.

Implements PLUGIN.

Definition at line 2342 of file kicad_plugin.cpp.

2343 {
2344  return FP_CACHE::GetTimestamp( aLibraryPath );
2345 }
static long long GetTimestamp(const wxString &aLibPath)
Function GetTimestamp Generate a timestamp representing all source files in the cache (including the ...

References FP_CACHE::GetTimestamp().

Referenced by GITHUB_PLUGIN::GetLibraryTimestamp().

◆ GetStringOutput()

std::string PCB_IO::GetStringOutput ( bool  doClear)
inlineinherited

Definition at line 173 of file pcbnew/kicad_plugin.h.

174  {
175  std::string ret = m_sf.GetString();
176  if( doClear )
177  m_sf.Clear();
178 
179  return ret;
180  }
const std::string & GetString()
Definition: richio.h:475
STRING_FORMATTER m_sf
void Clear()
Function Clear clears the buffer and empties the internal string.
Definition: richio.h:464

References STRING_FORMATTER::Clear(), STRING_FORMATTER::GetString(), and PCB_IO::m_sf.

Referenced by FOOTPRINT_EDIT_FRAME::Export_Module().

◆ init()

void PCB_IO::init ( const PROPERTIES aProperties)
protectedinherited

Definition at line 2107 of file kicad_plugin.cpp.

2108 {
2109  m_board = NULL;
2110  m_reader = NULL;
2112  m_props = aProperties;
2113 }
LINE_READER * m_reader
no ownership here.
const PROPERTIES * m_props
passed via Save() or Load(), no ownership, may be NULL.
#define SEXPR_BOARD_FILE_VERSION
Current s-expression file format version. 2 was the last legacy format version.
#define NULL
int m_loading_format_version
which SEXPR_BOARD_FILE_VERSION should be Load()ed?
BOARD * m_board
which BOARD, no ownership here

References PCB_IO::m_board, PCB_IO::m_loading_format_version, PCB_IO::m_props, PCB_IO::m_reader, NULL, and SEXPR_BOARD_FILE_VERSION.

Referenced by PCB_IO::FootprintDelete(), PCB_IO::FootprintEnumerate(), PCB_IO::FootprintLibCreate(), PCB_IO::FootprintSave(), PCB_IO::getFootprint(), PCB_IO::IsFootprintLibWritable(), Load(), PCB_IO::Load(), PCB_IO::PCB_IO(), Save(), and PCB_IO::Save().

◆ IsFootprintLibWritable()

bool PCB_IO::IsFootprintLibWritable ( const wxString &  aLibraryPath)
overridevirtualinherited

Function IsFootprintLibWritable returns true iff the library at aLibraryPath is writable.

(Often system libraries are read only because of where they are installed.)

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several footprints.
Exceptions
IO_ERRORif no library at aLibraryPath exists.

Reimplemented from PLUGIN.

Definition at line 2441 of file kicad_plugin.cpp.

2442 {
2443  LOCALE_IO toggle;
2444 
2445  init( NULL );
2446 
2447  validateCache( aLibraryPath );
2448 
2449  return m_cache->IsWritable();
2450 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:214
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
#define NULL
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
bool IsWritable() const

References PCB_IO::init(), FP_CACHE::IsWritable(), PCB_IO::m_cache, NULL, and PCB_IO::validateCache().

Referenced by GITHUB_PLUGIN::IsFootprintLibWritable().

◆ Load()

BOARD * CLIPBOARD_IO::Load ( const wxString &  aFileName,
BOARD aAppendToMe,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Function Load loads information from some input file format that this PLUGIN implementation knows about, into either a new BOARD or an existing one.

This may be used to load an entire new BOARD, or to augment an existing one if aAppendToMe is not NULL.

Parameters
aFileNameis the name of the file to use as input and may be foreign in nature or native in nature.
aAppendToMeis an existing BOARD to append to, but if NULL then this means "do not append, rather load anew".
aPropertiesis an associative array that can be used to tell the loader how to load the file, because it can take any number of additional named arguments that the plugin is known to support. These are tuning parameters for the import or load. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Returns
BOARD* - the successfully loaded board, or the same one as aAppendToMe if aAppendToMe was not NULL, and caller owns it.
Exceptions
IO_ERRORif there is a problem loading, and its contents should say what went wrong, using line number and character offsets of the input file if possible.

Reimplemented from PLUGIN.

Definition at line 294 of file kicad_clipboard.cpp.

296 {
297  std::string result;
298 
299  auto clipboard = wxTheClipboard;
300  wxClipboardLocker clipboardLock( clipboard );
301 
302  if( !clipboardLock )
303  return nullptr;
304 
305  if( clipboard->IsSupported( wxDF_TEXT ) )
306  {
307  wxTextDataObject data;
308  clipboard->GetData( data );
309 
310  result = data.GetText().mb_str();
311  }
312 
313  STRING_LINE_READER reader(result, wxT( "clipboard" ) );
314 
315  init( aProperties );
316 
317  m_parser->SetLineReader( &reader );
318  m_parser->SetBoard( aAppendToMe );
319 
320  BOARD_ITEM* item;
321  BOARD* board;
322 
323  try
324  {
325  item = m_parser->Parse();
326  }
327  catch( const FUTURE_FORMAT_ERROR& )
328  {
329  // Don't wrap a FUTURE_FORMAT_ERROR in another
330  throw;
331  }
332  catch( const PARSE_ERROR& parse_error )
333  {
334  if( m_parser->IsTooRecent() )
335  throw FUTURE_FORMAT_ERROR( parse_error, m_parser->GetRequiredVersion() );
336  else
337  throw;
338  }
339 
340  if( item->Type() != PCB_T )
341  {
342  // The parser loaded something that was valid, but wasn't a board.
343  THROW_PARSE_ERROR( _( "Clipboard content is not KiCad compatible" ),
344  m_parser->CurSource(), m_parser->CurLine(),
345  m_parser->CurLineNumber(), m_parser->CurOffset() );
346  }
347  else
348  {
349  board = dynamic_cast<BOARD*>( item );
350  }
351 
352  // Give the filename to the board if it's new
353  if( board && !aAppendToMe )
354  board->SetFileName( aFileName );
355 
356  return board;
357 }
Definition: typeinfo.h:85
BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class,...
void init(const PROPERTIES *aProperties)
wxString GetRequiredVersion()
Return a string representing the version of kicad required to open this file.
Definition: pcb_parser.cpp:208
void SetBoard(BOARD *aBoard)
Definition: pcb_parser.h:342
void SetFileName(const wxString &aFileName)
Definition: class_board.h:243
#define THROW_PARSE_ERROR(aProblem, aSource, aInputLine, aLineNumber, aByteIndex)
BOARD_ITEM * Parse()
Definition: pcb_parser.cpp:481
LINE_READER * SetLineReader(LINE_READER *aReader)
Function SetLineReader sets aLineReader into the parser, and returns the previous one,...
Definition: pcb_parser.h:335
CLIPBOARD_PARSER * m_parser
bool IsTooRecent()
Return whether a version number, if any was parsed, was too recent.
Definition: pcb_parser.h:360
Struct PARSE_ERROR contains a filename or source description, a problem input line,...
Definition: ki_exception.h:123
BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:181
#define _(s)
Definition: 3d_actions.cpp:33
Struct FUTURE_FORMAT_ERROR variant of PARSE_ERROR indicating that a syntax or related error was likel...
Definition: ki_exception.h:172
STRING_LINE_READER is a LINE_READER that reads from a multiline 8 bit wide std::string.
Definition: richio.h:254
KICAD_T Type() const
Function Type()
Definition: base_struct.h:197

References _, PCB_PARSER::GetRequiredVersion(), PCB_IO::init(), PCB_PARSER::IsTooRecent(), m_parser, PCB_PARSER::Parse(), PCB_T, PCB_PARSER::SetBoard(), BOARD::SetFileName(), PCB_PARSER::SetLineReader(), THROW_PARSE_ERROR, and EDA_ITEM::Type().

◆ Parse() [1/2]

BOARD_ITEM * CLIPBOARD_IO::Parse ( )

Definition at line 219 of file kicad_clipboard.cpp.

220 {
221  BOARD_ITEM* item;
222  wxString result;
223 
224  auto clipboard = wxTheClipboard;
225  wxClipboardLocker clipboardLock( clipboard );
226 
227  if( !clipboardLock )
228  return nullptr;
229 
230 
231  if( clipboard->IsSupported( wxDF_TEXT ) )
232  {
233  wxTextDataObject data;
234  clipboard->GetData( data );
235  result = data.GetText();
236  }
237 
238  try
239  {
240  item = PCB_IO::Parse( result );
241  }
242  catch (...)
243  {
244  item = nullptr;
245  }
246 
247  return item;
248 }
BOARD_ITEM * Parse(const wxString &aClipboardSourceInput)
BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class,...

References PCB_IO::Parse().

Referenced by PCBNEW_CONTROL::Paste().

◆ Parse() [2/2]

BOARD_ITEM * PCB_IO::Parse ( const wxString &  aClipboardSourceInput)
inherited

Definition at line 380 of file kicad_plugin.cpp.

381 {
382  std::string input = TO_UTF8( aClipboardSourceInput );
383 
384  STRING_LINE_READER reader( input, wxT( "clipboard" ) );
385 
386  m_parser->SetLineReader( &reader );
387 
388  try
389  {
390  return m_parser->Parse();
391  }
392  catch( const PARSE_ERROR& parse_error )
393  {
394  if( m_parser->IsTooRecent() )
395  throw FUTURE_FORMAT_ERROR( parse_error, m_parser->GetRequiredVersion() );
396  else
397  throw;
398  }
399 }
wxString GetRequiredVersion()
Return a string representing the version of kicad required to open this file.
Definition: pcb_parser.cpp:208
PCB_PARSER * m_parser
BOARD_ITEM * Parse()
Definition: pcb_parser.cpp:481
LINE_READER * SetLineReader(LINE_READER *aReader)
Function SetLineReader sets aLineReader into the parser, and returns the previous one,...
Definition: pcb_parser.h:335
bool IsTooRecent()
Return whether a version number, if any was parsed, was too recent.
Definition: pcb_parser.h:360
Struct PARSE_ERROR contains a filename or source description, a problem input line,...
Definition: ki_exception.h:123
#define TO_UTF8(wxstring)
Struct FUTURE_FORMAT_ERROR variant of PARSE_ERROR indicating that a syntax or related error was likel...
Definition: ki_exception.h:172
STRING_LINE_READER is a LINE_READER that reads from a multiline 8 bit wide std::string.
Definition: richio.h:254

References PCB_PARSER::GetRequiredVersion(), PCB_PARSER::IsTooRecent(), PCB_IO::m_parser, PCB_PARSER::Parse(), PCB_PARSER::SetLineReader(), and TO_UTF8.

Referenced by Parse(), and parse_module_kicad().

◆ PluginName()

const wxString PCB_IO::PluginName ( ) const
inlineoverridevirtualinherited

Function PluginName returns a brief hard coded name for this PLUGIN.

Implements PLUGIN.

Definition at line 110 of file pcbnew/kicad_plugin.h.

111  {
112  return wxT( "KiCad" );
113  }

◆ PrefetchLib()

void PLUGIN::PrefetchLib ( const wxString &  aLibraryPath,
const PROPERTIES aProperties = NULL 
)
virtualinherited

Function PrefetchLib If possible, prefetches the specified library (e.g.

performing downloads). Does not parse. Threadsafe.

This is a no-op for libraries that cannot be prefetched.

Plugins that cannot prefetch need not override this; a default no-op is provided.

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several footprints.
aPropertiesis an associative array that can be used to tell the plugin anything needed about how to perform with respect to aLibraryPath. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Exceptions
IO_ERRORif there is an error prefetching the library.

Reimplemented in GITHUB_PLUGIN.

Definition at line 68 of file plugin.cpp.

69 {
70  (void) aLibraryPath;
71  (void) aProperties;
72 }

◆ Save()

void CLIPBOARD_IO::Save ( const wxString &  aFileName,
BOARD aBoard,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Function Save will write aBoard to a storage file in a format that this PLUGIN implementation knows about, or it can be used to write a portion of aBoard to a special kind of export file.

Parameters
aFileNameis the name of a file to save to on disk.
aBoardis the class BOARD in memory document tree from which to extract information when writing to aFileName. The caller continues to own the BOARD, and the plugin should refrain from modifying the BOARD if possible.
aPropertiesis an associative array that can be used to tell the saver how to save the file, because it can take any number of additional named tuning arguments that the plugin is known to support. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Exceptions
IO_ERRORif there is a problem saving or exporting.

Reimplemented from PCB_IO.

Definition at line 251 of file kicad_clipboard.cpp.

253 {
254  init( aProperties );
255 
256  m_board = aBoard; // after init()
257 
258  // Prepare net mapping that assures that net codes saved in a file are consecutive integers
259  m_mapping->SetBoard( aBoard );
260 
261  STRING_FORMATTER formatter;
262 
263  m_out = &formatter;
264 
265  m_out->Print( 0, "(kicad_pcb (version %d) (host pcbnew %s)\n", SEXPR_BOARD_FILE_VERSION,
266  formatter.Quotew( GetBuildVersion() ).c_str() );
267 
268  Format( aBoard, 1 );
269 
270  m_out->Print( 0, ")\n" );
271 
272  auto clipboard = wxTheClipboard;
273  wxClipboardLocker clipboardLock( clipboard );
274 
275  if( !clipboardLock )
276  return;
277 
278  clipboard->SetData( new wxTextDataObject(
279  wxString( m_formatter.GetString().c_str(), wxConvUTF8 ) ) );
280  clipboard->Flush();
281 
282  // This section exists to return the clipboard data, ensuring it has fully
283  // been processed by the system clipboard. This appears to be needed for
284  // extremely large clipboard copies on asynchronous linux clipboard managers
285  // such as KDE's Klipper
286  {
287  wxTextDataObject data;
288  clipboard->GetData( data );
289  ( void )data.GetText(); // Keep unused variable
290  }
291 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
void init(const PROPERTIES *aProperties)
#define SEXPR_BOARD_FILE_VERSION
Current s-expression file format version. 2 was the last legacy format version.
STRING_FORMATTER m_formatter
void SetBoard(const BOARD *aBoard)
Function SetBoard Sets a BOARD object that is used to prepare the net code map.
Definition: netinfo.h:281
wxString GetBuildVersion()
Get the full KiCad version string.
const std::string & GetString()
Definition: richio.h:475
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:472
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes
BOARD * m_board
which BOARD, no ownership here
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
void Format(BOARD_ITEM *aItem, int aNestLevel=0) const
Function Format outputs aItem to aFormatter in s-expression format.
STRING_FORMATTER implements OUTPUTFORMATTER to a memory buffer.
Definition: richio.h:445

References PCB_IO::Format(), GetBuildVersion(), STRING_FORMATTER::GetString(), PCB_IO::init(), PCB_IO::m_board, m_formatter, PCB_IO::m_mapping, PCB_IO::m_out, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), NETINFO_MAPPING::SetBoard(), and SEXPR_BOARD_FILE_VERSION.

◆ SaveSelection()

void CLIPBOARD_IO::SaveSelection ( const PCBNEW_SELECTION selected)

Definition at line 64 of file kicad_clipboard.cpp.

65 {
66  VECTOR2I refPoint( 0, 0 );
67 
68  // dont even start if the selection is empty
69  if( aSelected.Empty() )
70  return;
71 
72  if( aSelected.HasReferencePoint() )
73  refPoint = aSelected.GetReferencePoint();
74 
75  // Prepare net mapping that assures that net codes saved in a file are consecutive integers
77 
78  // Differentiate how it is formatted depending on what selection contains
79  bool onlyModuleParts = true;
80  for( const auto i : aSelected )
81  {
82  // check if it not one of the module primitives
83  if( ( i->Type() != PCB_MODULE_EDGE_T ) &&
84  ( i->Type() != PCB_MODULE_TEXT_T ) &&
85  ( i->Type() != PCB_PAD_T ) )
86  {
87  onlyModuleParts = false;
88  break;
89  }
90  }
91 
92  // if there is only parts of a module selected, format it as a new module else
93  // format it as an entire board
94  MODULE partialModule( m_board );
95 
96  // only a module selected.
97  if( aSelected.Size() == 1 && aSelected.Front()->Type() == PCB_MODULE_T )
98  {
99  // make the module safe to transfer to other pcbs
100  const MODULE* mod = static_cast<MODULE*>( aSelected.Front() );
101  // Do not modify existing board
102  MODULE newModule( *mod );
103 
104  for( D_PAD* pad : newModule.Pads() )
105  pad->SetNetCode( 0 );
106 
107  // locked means "locked in place"; copied items therefore can't be locked
108  newModule.SetLocked( false );
109 
110  // locate the reference point at (0, 0) in the copied items
111  newModule.Move( wxPoint( -refPoint.x, -refPoint.y ) );
112 
113  Format( static_cast<BOARD_ITEM*>( &newModule ) );
114  }
115  // partial module selected.
116  else if( onlyModuleParts )
117  {
118  for( const auto item : aSelected )
119  {
120  BOARD_ITEM* clone = static_cast<BOARD_ITEM*>( item->Clone() );
121 
122  // Do not add reference/value - convert them to the common type
123  if( TEXTE_MODULE* text = dyn_cast<TEXTE_MODULE*>( clone ) )
124  text->SetType( TEXTE_MODULE::TEXT_is_DIVERS );
125 
126  // If it is only a module, clear the nets from the pads
127  if( D_PAD* pad = dyn_cast<D_PAD*>( clone ) )
128  pad->SetNetCode( 0 );
129 
130  // Add the pad to the new module before moving to ensure the local coords are correct
131  partialModule.Add( clone );
132 
133  // locate the reference point at (0, 0) in the copied items
134  clone->Move( (wxPoint) -refPoint );
135  }
136 
137  // Set the new relative internal local coordinates of copied items
138  MODULE* editedModule = m_board->Modules().front();
139  wxPoint moveVector = partialModule.GetPosition() + editedModule->GetPosition();
140 
141  partialModule.MoveAnchorPosition( moveVector );
142 
143  Format( &partialModule, 0 );
144 
145  }
146  // lots of stuff selected
147  else
148  {
149  // we will fake being a .kicad_pcb to get the full parser kicking
150  // This means we also need layers and nets
151  LOCALE_IO io;
152 
153  m_formatter.Print( 0, "(kicad_pcb (version %d) (host pcbnew %s)\n",
155 
156 
157  m_formatter.Print( 0, "\n" );
158 
161 
162  m_formatter.Print( 0, "\n" );
163 
164 
165  for( const auto i : aSelected )
166  {
167  // Dont format stuff that cannot exist standalone!
168  if( ( i->Type() != PCB_MODULE_EDGE_T ) &&
169  ( i->Type() != PCB_MODULE_TEXT_T ) &&
170  ( i->Type() != PCB_PAD_T ) )
171  {
172  auto item = static_cast<BOARD_ITEM*>( i );
173  std::unique_ptr<BOARD_ITEM> clone( static_cast<BOARD_ITEM*> ( item->Clone() ) );
174 
175  // locked means "locked in place"; copied items therefore can't be locked
176  if( MODULE* module = dyn_cast<MODULE*>( clone.get() ) )
177  module->SetLocked( false );
178  else if( TRACK* track = dyn_cast<TRACK*>( clone.get() ) )
179  track->SetLocked( false );
180 
181  // locate the reference point at (0, 0) in the copied items
182  clone->Move( (wxPoint) -refPoint );
183 
184  Format( clone.get(), 1 );
185  }
186  }
187  m_formatter.Print( 0, "\n)" );
188  }
189 
190  // These are placed at the end to minimize the open time of the clipboard
191  auto clipboard = wxTheClipboard;
192  wxClipboardLocker clipboardLock( clipboard );
193 
194  if( !clipboardLock || !clipboard->IsOpened() )
195  return;
196 
197  clipboard->SetData( new wxTextDataObject(
198  wxString( m_formatter.GetString().c_str(), wxConvUTF8 ) ) );
199 
200  clipboard->Flush();
201 
202  #ifndef __WXOSX__
203  // This section exists to return the clipboard data, ensuring it has fully
204  // been processed by the system clipboard. This appears to be needed for
205  // extremely large clipboard copies on asynchronous linux clipboard managers
206  // such as KDE's Klipper. However, a read back of the data on OSX before the
207  // clipboard is closed seems to cause an ASAN error (heap-buffer-overflow)
208  // since it uses the cached version of the clipboard data and not the system
209  // clipboard data.
210  {
211  wxTextDataObject data;
212  clipboard->GetData( data );
213  ( void )data.GetText(); // Keep unused variable
214  }
215  #endif
216 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:214
BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class,...
#define SEXPR_BOARD_FILE_VERSION
Current s-expression file format version. 2 was the last legacy format version.
void formatNetInformation(BOARD *aBoard, int aNestLevel=0) const
formats the Nets and Netclasses
class D_PAD, a pad in a footprint
Definition: typeinfo.h:90
STRING_FORMATTER m_formatter
class EDGE_MODULE, a footprint edge
Definition: typeinfo.h:94
void SetBoard(const BOARD *aBoard)
Function SetBoard Sets a BOARD object that is used to prepare the net code map.
Definition: netinfo.h:281
class MODULE, a footprint
Definition: typeinfo.h:89
MODULES & Modules()
Definition: class_board.h:256
wxString GetBuildVersion()
Get the full KiCad version string.
virtual void Move(const wxPoint &aMoveVector)
Function Move move this object.
const std::string & GetString()
Definition: richio.h:475
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:472
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes
class TEXTE_MODULE, text in a footprint
Definition: typeinfo.h:93
void formatBoardLayers(BOARD *aBoard, int aNestLevel=0) const
formats the board layer information
BOARD * m_board
which BOARD, no ownership here
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
void Format(BOARD_ITEM *aItem, int aNestLevel=0) const
Function Format outputs aItem to aFormatter in s-expression format.
const wxPoint GetPosition() const override
Definition: class_module.h:206

References MODULE::Add(), SELECTION::Empty(), PCB_IO::Format(), PCB_IO::formatBoardLayers(), PCB_IO::formatNetInformation(), GetBuildVersion(), MODULE::GetPosition(), SELECTION::GetReferencePoint(), STRING_FORMATTER::GetString(), SELECTION::HasReferencePoint(), PCB_IO::m_board, m_formatter, PCB_IO::m_mapping, BOARD::Modules(), BOARD_ITEM::Move(), MODULE::MoveAnchorPosition(), PCB_MODULE_EDGE_T, PCB_MODULE_T, PCB_MODULE_TEXT_T, PCB_PAD_T, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), NETINFO_MAPPING::SetBoard(), SEXPR_BOARD_FILE_VERSION, TEXTE_MODULE::TEXT_is_DIVERS, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by EDIT_TOOL::copyToClipboard().

◆ SetBoard()

void CLIPBOARD_IO::SetBoard ( BOARD aBoard)

Definition at line 58 of file kicad_clipboard.cpp.

59 {
60  m_board = aBoard;
61 }
BOARD * m_board
which BOARD, no ownership here

References PCB_IO::m_board.

Referenced by EDIT_TOOL::copyToClipboard().

◆ SetOutputFormatter()

void PCB_IO::SetOutputFormatter ( OUTPUTFORMATTER aFormatter)
inlineinherited

Definition at line 182 of file pcbnew/kicad_plugin.h.

182 { m_out = aFormatter; }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership

References PCB_IO::m_out.

Referenced by FP_CACHE::Save().

◆ validateCache()

void PCB_IO::validateCache ( const wxString &  aLibraryPath,
bool  checkModified = true 
)
protectedinherited

Definition at line 2116 of file kicad_plugin.cpp.

2117 {
2118  if( !m_cache || !m_cache->IsPath( aLibraryPath ) || ( checkModified && m_cache->IsModified() ) )
2119  {
2120  // a spectacular episode in memory management:
2121  delete m_cache;
2122  m_cache = new FP_CACHE( this, aLibraryPath );
2123  m_cache->Load();
2124  }
2125 }
friend class FP_CACHE
bool IsModified()
Function IsModified Return true if the cache is not up-to-date.
FP_CACHE * m_cache
Footprint library cache.
bool IsPath(const wxString &aPath) const
Function IsPath checks if aPath is the same as the current cache path.
void Load()

References PCB_IO::FP_CACHE, FP_CACHE::IsModified(), FP_CACHE::IsPath(), FP_CACHE::Load(), and PCB_IO::m_cache.

Referenced by PCB_IO::FootprintDelete(), PCB_IO::FootprintEnumerate(), PCB_IO::FootprintSave(), PCB_IO::getFootprint(), and PCB_IO::IsFootprintLibWritable().

◆ writeHeader()

void CLIPBOARD_IO::writeHeader ( BOARD aBoard)
private

Member Data Documentation

◆ m_board

BOARD* PCB_IO::m_board
protectedinherited

which BOARD, no ownership here

Definition at line 189 of file pcbnew/kicad_plugin.h.

Referenced by PCB_IO::format(), PCB_IO::formatLayers(), PCB_IO::init(), Save(), PCB_IO::Save(), SaveSelection(), and SetBoard().

◆ m_cache

◆ m_ctl

◆ m_error

wxString PCB_IO::m_error
protectedinherited

for throwing exceptions

Definition at line 188 of file pcbnew/kicad_plugin.h.

◆ m_filename

wxString PCB_IO::m_filename
protectedinherited

for saves only, name is in m_reader for loads

Definition at line 196 of file pcbnew/kicad_plugin.h.

◆ m_formatter

STRING_FORMATTER CLIPBOARD_IO::m_formatter
private

Definition at line 75 of file kicad_clipboard.h.

Referenced by CLIPBOARD_IO(), GetFormatter(), Save(), and SaveSelection().

◆ m_loading_format_version

int PCB_IO::m_loading_format_version
protectedinherited

which SEXPR_BOARD_FILE_VERSION should be Load()ed?

Definition at line 198 of file pcbnew/kicad_plugin.h.

Referenced by PCB_IO::init().

◆ m_mapping

NETINFO_MAPPING* PCB_IO::m_mapping
protectedinherited

mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes

Definition at line 204 of file pcbnew/kicad_plugin.h.

Referenced by PCB_IO::format(), PCB_IO::formatGeneral(), PCB_IO::formatNetInformation(), Save(), PCB_IO::Save(), SaveSelection(), and PCB_IO::~PCB_IO().

◆ m_out

◆ m_parser

CLIPBOARD_PARSER* CLIPBOARD_IO::m_parser
private

Definition at line 76 of file kicad_clipboard.h.

Referenced by Load(), and ~CLIPBOARD_IO().

◆ m_props

const PROPERTIES* PCB_IO::m_props
protectedinherited

passed via Save() or Load(), no ownership, may be NULL.

Definition at line 192 of file pcbnew/kicad_plugin.h.

Referenced by PCB_IO::init().

◆ m_reader

LINE_READER* PCB_IO::m_reader
protectedinherited

no ownership here.

Definition at line 195 of file pcbnew/kicad_plugin.h.

Referenced by PCB_IO::init().

◆ m_sf

STRING_FORMATTER PCB_IO::m_sf
protectedinherited

Definition at line 200 of file pcbnew/kicad_plugin.h.

Referenced by PCB_IO::GetStringOutput(), and PCB_IO::PCB_IO().


The documentation for this class was generated from the following files: