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 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, 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...
 
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 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 56 of file kicad_clipboard.h.

Constructor & Destructor Documentation

◆ CLIPBOARD_IO()

CLIPBOARD_IO::CLIPBOARD_IO ( )

Definition at line 35 of file kicad_clipboard.cpp.

35  :
37  m_formatter(),
38  m_parser( new CLIPBOARD_PARSER() )
39 {
40  m_out = &m_formatter;
41 }
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 44 of file kicad_clipboard.cpp.

45 {
46  delete m_parser;
47 }
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 2149 of file kicad_plugin.cpp.

2151 {
2152  LOCALE_IO toggle; // toggles on, then off, the C locale.
2153 
2154  init( aProperties );
2155 
2156  validateCache( aLibraryPath );
2157 
2158  if( !m_cache->IsWritable() )
2159  {
2160  THROW_IO_ERROR( wxString::Format( _( "Library \"%s\" is read only" ),
2161  aLibraryPath.GetData() ) );
2162  }
2163 
2164  m_cache->Remove( aFootprintName );
2165 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:180
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

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,
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.
Exceptions
IO_ERRORif the library cannot be found, or footprint cannot be loaded.

Reimplemented from PLUGIN.

Definition at line 1968 of file kicad_plugin.cpp.

1971 {
1972  LOCALE_IO toggle; // toggles on, then off, the C locale.
1973  wxDir dir( aLibraryPath );
1974 
1975  init( aProperties );
1976 
1977  wxString errorMsg;
1978 
1979  try
1980  {
1981  validateCache( aLibraryPath );
1982  }
1983  catch( const IO_ERROR& ioe )
1984  {
1985  errorMsg = ioe.What();
1986  }
1987 
1988  // Some of the files may have been parsed correctly so we want to add the valid files to
1989  // the library.
1990 
1991  const MODULE_MAP& mods = m_cache->GetModules();
1992 
1993  for( MODULE_CITER it = mods.begin(); it != mods.end(); ++it )
1994  {
1995  aFootprintNames.Add( it->first );
1996  }
1997 
1998  if( !errorMsg.IsEmpty() )
1999  THROW_IO_ERROR( errorMsg );
2000 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:180
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)
std::map< wxString, MODULE * > MODULE_MAP
Definition: eagle_plugin.h:36
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().

◆ 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 2175 of file kicad_plugin.cpp.

2176 {
2177  if( wxDir::Exists( aLibraryPath ) )
2178  {
2179  THROW_IO_ERROR( wxString::Format( _( "cannot overwrite library path \"%s\"" ),
2180  aLibraryPath.GetData() ) );
2181  }
2182 
2183  LOCALE_IO toggle;
2184 
2185  init( aProperties );
2186 
2187  delete m_cache;
2188  m_cache = new FP_CACHE( this, aLibraryPath );
2189  m_cache->Save();
2190 }
friend class FP_CACHE
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:180
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

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 2193 of file kicad_plugin.cpp.

2194 {
2195  wxFileName fn;
2196  fn.SetPath( aLibraryPath );
2197 
2198  // Return if there is no library path to delete.
2199  if( !fn.DirExists() )
2200  return false;
2201 
2202  if( !fn.IsDirWritable() )
2203  {
2204  THROW_IO_ERROR( wxString::Format( _( "user does not have permission to delete directory \"%s\"" ),
2205  aLibraryPath.GetData() ) );
2206  }
2207 
2208  wxDir dir( aLibraryPath );
2209 
2210  if( dir.HasSubDirs() )
2211  {
2212  THROW_IO_ERROR( wxString::Format( _( "library directory \"%s\" has unexpected sub-directories" ),
2213  aLibraryPath.GetData() ) );
2214  }
2215 
2216  // All the footprint files must be deleted before the directory can be deleted.
2217  if( dir.HasFiles() )
2218  {
2219  unsigned i;
2220  wxFileName tmp;
2221  wxArrayString files;
2222 
2223  wxDir::GetAllFiles( aLibraryPath, &files );
2224 
2225  for( i = 0; i < files.GetCount(); i++ )
2226  {
2227  tmp = files[i];
2228 
2229  if( tmp.GetExt() != KiCadFootprintFileExtension )
2230  {
2231  THROW_IO_ERROR( wxString::Format( _( "unexpected file \"%s\" was found in library path \"%s\"" ),
2232  files[i].GetData(), aLibraryPath.GetData() ) );
2233  }
2234  }
2235 
2236  for( i = 0; i < files.GetCount(); i++ )
2237  {
2238  wxRemoveFile( files[i] );
2239  }
2240  }
2241 
2242  wxLogTrace( traceKicadPcbPlugin, wxT( "Removing footprint library \"%s\"" ),
2243  aLibraryPath.GetData() );
2244 
2245  // Some of the more elaborate wxRemoveFile() crap puts up its own wxLog dialog
2246  // we don't want that. we want bare metal portability with no UI here.
2247  if( !wxRmdir( aLibraryPath ) )
2248  {
2249  THROW_IO_ERROR( wxString::Format( _( "footprint library \"%s\" cannot be deleted" ),
2250  aLibraryPath.GetData() ) );
2251  }
2252 
2253  // For some reason removing a directory in Windows is not immediately updated. This delay
2254  // prevents an error when attempting to immediately recreate the same directory when over
2255  // writing an existing library.
2256 #ifdef __WINDOWS__
2257  wxMilliSleep( 250L );
2258 #endif
2259 
2260  if( m_cache && !m_cache->IsPath( aLibraryPath ) )
2261  {
2262  delete m_cache;
2263  m_cache = NULL;
2264  }
2265 
2266  return true;
2267 }
const std::string KiCadFootprintFileExtension
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.
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
size_t i
Definition: json11.cpp:597

References Format(), i, FP_CACHE::IsPath(), KiCadFootprintFileExtension, PCB_IO::m_cache, 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 132 of file plugin.cpp.

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

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 2042 of file kicad_plugin.cpp.

2044 {
2045  const MODULE* footprint = getFootprint( aLibraryPath, aFootprintName, aProperties, true );
2046  return footprint ? new MODULE( *footprint ) : nullptr;
2047 }
const MODULE * getFootprint(const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties, bool checkModified)

References 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 2050 of file kicad_plugin.cpp.

2052 {
2053  LOCALE_IO toggle; // toggles on, then off, the C locale.
2054 
2055  init( aProperties );
2056 
2057  // In this public PLUGIN API function, we can safely assume it was
2058  // called for saving into a library path.
2060 
2061  validateCache( aLibraryPath );
2062 
2063  if( !m_cache->IsWritable() )
2064  {
2065  if( !m_cache->Exists() )
2066  {
2067  const wxString msg = wxString::Format( _( "Library \"%s\" does not exist.\n"
2068  "Would you like to create it?"),
2069  GetChars( aLibraryPath ) );
2070 
2071  if( wxMessageBox( msg, _( "Library Not Found"), wxYES_NO | wxICON_QUESTION ) != wxYES )
2072  return;
2073 
2074  // Save throws its own IO_ERROR on failure, so no need to recreate here
2075  m_cache->Save( NULL );
2076  }
2077  else
2078  {
2079  wxString msg = wxString::Format( _( "Library \"%s\" is read only" ), aLibraryPath );
2080  THROW_IO_ERROR( msg );
2081  }
2082  }
2083 
2084  wxString footprintName = aFootprint->GetFPID().GetLibItemName();
2085 
2086  MODULE_MAP& mods = m_cache->GetModules();
2087 
2088  // Quietly overwrite module and delete module file from path for any by same name.
2089  wxFileName fn( aLibraryPath, aFootprint->GetFPID().GetLibItemName(),
2091 
2092 #ifndef __WINDOWS__
2093  // Write through symlinks, don't replace them
2094  if( fn.Exists( wxFILE_EXISTS_SYMLINK ) )
2095  {
2096  char buffer[ PATH_MAX + 1 ];
2097  ssize_t pathLen = readlink( TO_UTF8( fn.GetFullPath() ), buffer, PATH_MAX );
2098 
2099  if( pathLen > 0 )
2100  {
2101  buffer[ pathLen ] = '\0';
2102  fn.Assign( fn.GetPath() + wxT( "/" ) + wxString::FromUTF8( buffer ) );
2103  fn.Normalize();
2104  }
2105  }
2106 #endif
2107 
2108  if( !fn.IsOk() )
2109  {
2110  THROW_IO_ERROR( wxString::Format( _( "Footprint file name \"%s\" is not valid." ),
2111  fn.GetFullPath() ) );
2112  }
2113 
2114  if( fn.FileExists() && !fn.IsFileWritable() )
2115  {
2116  THROW_IO_ERROR( wxString::Format( _( "No write permissions to delete file \"%s\"" ),
2117  fn.GetFullPath() ) );
2118  }
2119 
2120  wxString fullPath = fn.GetFullPath();
2121  wxString fullName = fn.GetFullName();
2122  MODULE_CITER it = mods.find( footprintName );
2123 
2124  if( it != mods.end() )
2125  {
2126  wxLogTrace( traceKicadPcbPlugin, wxT( "Removing footprint file '%s'." ), fullPath );
2127  mods.erase( footprintName );
2128  wxRemoveFile( fullPath );
2129  }
2130 
2131  // I need my own copy for the cache
2132  MODULE* module = new MODULE( *aFootprint );
2133 
2134  // and it's time stamp must be 0, it should have no parent, orientation should
2135  // be zero, and it should be on the front layer.
2136  module->SetTimeStamp( 0 );
2137  module->SetParent( 0 );
2138  module->SetOrientation( 0 );
2139 
2140  if( module->GetLayer() != F_Cu )
2141  module->Flip( module->GetPosition() );
2142 
2143  wxLogTrace( traceKicadPcbPlugin, wxT( "Creating s-expr footprint file '%s'." ), fullPath );
2144  mods.insert( footprintName, new FP_CACHE_ITEM( module, WX_FILENAME( fn.GetPath(), fullName ) ) );
2145  m_cache->Save( module );
2146 }
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:180
const std::string KiCadFootprintFileExtension
FP_CACHE * m_cache
Footprint library cache.
void Flip(const wxPoint &aCentre) override
Function Flip Flip this object, i.e.
void init(const PROPERTIES *aProperties)
const LIB_ID & GetFPID() const
Definition: class_module.h:192
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:47
void SetParent(EDA_ITEM *aParent)
Definition: base_struct.h:216
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
const wxChar *const traceKicadPcbPlugin
Flag to enable GEDA PCB plugin debug output.
#define THROW_IO_ERROR(msg)
std::map< wxString, MODULE * > MODULE_MAP
Definition: eagle_plugin.h:36
Class 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:92
A wrapper around a wxFileName which is much more performant with a subset of the API.
Definition: common.h:400
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
void SetOrientation(double newangle)
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:183
MODULE_MAP & GetModules()
void SetTimeStamp(timestamp_t aNewTimeStamp)
Definition: base_struct.h:206

References CTL_FOR_LIBRARY, 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, PCB_IO::m_cache, PCB_IO::m_ctl, FP_CACHE::Save(), MODULE::SetOrientation(), EDA_ITEM::SetParent(), EDA_ITEM::SetTimeStamp(), 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 399 of file kicad_plugin.cpp.

400 {
401  LOCALE_IO toggle; // public API function, perform anything convenient for caller
402 
403  switch( aItem->Type() )
404  {
405  case PCB_T:
406  format( static_cast<BOARD*>( aItem ), aNestLevel );
407  break;
408 
409  case PCB_DIMENSION_T:
410  format( static_cast<DIMENSION*>( aItem ), aNestLevel );
411  break;
412 
413  case PCB_LINE_T:
414  format( static_cast<DRAWSEGMENT*>( aItem ), aNestLevel );
415  break;
416 
417  case PCB_MODULE_EDGE_T:
418  format( static_cast<EDGE_MODULE*>( aItem ), aNestLevel );
419  break;
420 
421  case PCB_TARGET_T:
422  format( static_cast<PCB_TARGET*>( aItem ), aNestLevel );
423  break;
424 
425  case PCB_MODULE_T:
426  format( static_cast<MODULE*>( aItem ), aNestLevel );
427  break;
428 
429  case PCB_PAD_T:
430  format( static_cast<D_PAD*>( aItem ), aNestLevel );
431  break;
432 
433  case PCB_TEXT_T:
434  format( static_cast<TEXTE_PCB*>( aItem ), aNestLevel );
435  break;
436 
437  case PCB_MODULE_TEXT_T:
438  format( static_cast<TEXTE_MODULE*>( aItem ), aNestLevel );
439  break;
440 
441  case PCB_TRACE_T:
442  case PCB_VIA_T:
443  format( static_cast<TRACK*>( aItem ), aNestLevel );
444  break;
445 
446  case PCB_ZONE_AREA_T:
447  format( static_cast<ZONE_CONTAINER*>( aItem ), aNestLevel );
448  break;
449 
450  default:
451  wxFAIL_MSG( wxT( "Cannot format item " ) + aItem->GetClass() );
452  }
453 }
Definition: typeinfo.h:85
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:180
class ZONE_CONTAINER, a zone area
Definition: typeinfo.h:102
class TEXTE_PCB, text on a layer
Definition: typeinfo.h:92
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:95
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:96
class DRAWSEGMENT, a segment not on copper layers
Definition: typeinfo.h:91
KICAD_T Type() const
Function Type()
Definition: base_struct.h:201

References PCB_IO::format(), EDA_ITEM::GetClass(), PCB_DIMENSION_T, PCB_LINE_T, PCB_MODULE_EDGE_T, PCB_MODULE_T, PCB_MODULE_TEXT_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 613 of file kicad_plugin.cpp.

614 {
615  m_out->Print( aNestLevel, "(layers\n" );
616 
617  // Save only the used copper layers from front to back.
618  LSET visible_layers = aBoard->GetVisibleLayers();
619 
620  for( LSEQ cu = aBoard->GetEnabledLayers().CuStack(); cu; ++cu )
621  {
622  PCB_LAYER_ID layer = *cu;
623 
624  m_out->Print( aNestLevel+1, "(%d %s %s", layer,
625  m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str(),
626  LAYER::ShowType( aBoard->GetLayerType( layer ) ) );
627 
628  if( !visible_layers[layer] )
629  m_out->Print( 0, " hide" );
630 
631  m_out->Print( 0, ")\n" );
632  }
633 
634  // Save used non-copper layers in the order they are defined.
635  // desired sequence for non Cu BOARD layers.
636  static const PCB_LAYER_ID non_cu[] =
637  {
638  B_Adhes, // 32
639  F_Adhes,
640  B_Paste,
641  F_Paste,
642  B_SilkS,
643  F_SilkS,
644  B_Mask,
645  F_Mask,
646  Dwgs_User,
647  Cmts_User,
648  Eco1_User,
649  Eco2_User,
650  Edge_Cuts,
651  Margin,
652  B_CrtYd,
653  F_CrtYd,
654  B_Fab,
655  F_Fab
656  };
657 
658  for( LSEQ seq = aBoard->GetEnabledLayers().Seq( non_cu, arrayDim( non_cu ) ); seq; ++seq )
659  {
660  PCB_LAYER_ID layer = *seq;
661 
662  m_out->Print( aNestLevel+1, "(%d %s user", layer,
663  m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str() );
664 
665  if( !visible_layers[layer] )
666  m_out->Print( 0, " hide" );
667 
668  m_out->Print( 0, ")\n" );
669  }
670 
671  m_out->Print( aNestLevel, ")\n\n" );
672 }
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:150
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Function GetLayerName returns the name of a layer given by aLayer.
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...
#define cu(a)
Definition: auxiliary.h:88
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:367
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:
Class LSET is a set of PCB_LAYER_IDs.
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
Class 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:99
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, cu, 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().

◆ formatGeneral()

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

formats the General section of the file

Definition at line 591 of file kicad_plugin.cpp.

592 {
593  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
594 
595  m_out->Print( 0, "\n" );
596  m_out->Print( aNestLevel, "(general\n" );
597  // Write Bounding box info
598  m_out->Print( aNestLevel+1, "(thickness %s)\n",
599  FormatInternalUnits( dsnSettings.GetBoardThickness() ).c_str() );
600 
601  m_out->Print( aNestLevel+1, "(drawings %d)\n", aBoard->Drawings().Size() );
602  m_out->Print( aNestLevel+1, "(tracks %d)\n", aBoard->GetNumSegmTrack() );
603  m_out->Print( aNestLevel+1, "(zones %d)\n", aBoard->GetNumSegmZone() );
604  m_out->Print( aNestLevel+1, "(modules %d)\n", aBoard->m_Modules.GetCount() );
605  m_out->Print( aNestLevel+1, "(nets %d)\n", m_mapping->GetSize() );
606  m_out->Print( aNestLevel, ")\n\n" );
607 
608  aBoard->GetPageSettings().Format( m_out, aNestLevel, m_ctl );
609  aBoard->GetTitleBlock().Format( m_out, aNestLevel, m_ctl );
610 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const PAGE_INFO & GetPageSettings() const
Definition: class_board.h:554
unsigned GetCount() const
Function GetCount returns the number of elements in the list.
Definition: dlist.h:126
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:539
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 GetNumSegmTrack() const
Functions to get some items count.
int GetSize() const
Function GetSize.
Definition: netinfo.h:383
int GetNumSegmZone() const
Calculate the zone segment count.
virtual void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Function Format outputs the object to aFormatter in s-expression form.
Definition: worksheet.cpp:168
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:560
DLIST< MODULE > m_Modules
Definition: class_board.h:249
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:457
DLIST_ITERATOR_WRAPPER< BOARD_ITEM > Drawings()
Definition: class_board.h:256
Class BOARD_DESIGN_SETTINGS contains design settings for a BOARD object.

References BOARD::Drawings(), TITLE_BLOCK::Format(), PAGE_INFO::Format(), FormatInternalUnits(), BOARD_DESIGN_SETTINGS::GetBoardThickness(), DHEAD::GetCount(), BOARD::GetDesignSettings(), BOARD::GetNumSegmTrack(), BOARD::GetNumSegmZone(), BOARD::GetPageSettings(), NETINFO_MAPPING::GetSize(), BOARD::GetTitleBlock(), PCB_IO::m_ctl, PCB_IO::m_mapping, BOARD::m_Modules, PCB_IO::m_out, and OUTPUTFORMATTER::Print().

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 705 of file kicad_plugin.cpp.

706 {
707  formatGeneral( aBoard, aNestLevel );
708  // Layers.
709  formatBoardLayers( aBoard, aNestLevel );
710  // Setup
711  formatSetup( aBoard, aNestLevel );
712  // Save net codes and names
713  formatNetInformation( aBoard, aNestLevel );
714 }
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 675 of file kicad_plugin.cpp.

676 {
677  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
678  for( NETINFO_MAPPING::iterator net = m_mapping->begin(), netEnd = m_mapping->end();
679  net != netEnd; ++net )
680  {
681  m_out->Print( aNestLevel, "(net %d %s)\n",
682  m_mapping->Translate( net->GetNet() ),
683  m_out->Quotew( net->GetNetname() ).c_str() );
684  }
685 
686  m_out->Print( 0, "\n" );
687 
688  // Save the default net class first.
689  NETCLASS defaultNC = *dsnSettings.GetDefault();
690  filterNetClass( *aBoard, defaultNC ); // Remove empty nets (from a copy of a netclass)
691  defaultNC.Format( m_out, aNestLevel, m_ctl );
692 
693  // Save the rest of the net classes alphabetically.
694  for( NETCLASSES::const_iterator it = dsnSettings.m_NetClasses.begin();
695  it != dsnSettings.m_NetClasses.end();
696  ++it )
697  {
698  NETCLASS netclass = *it->second;
699  filterNetClass( *aBoard, netclass ); // Remove empty nets (from a copy of a netclass)
700  netclass.Format( m_out, aNestLevel, m_ctl );
701  }
702 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:539
iterator end()
Definition: netclass.h:249
NETCLASS_MAP::const_iterator const_iterator
Definition: netclass.h:251
iterator begin()
Definition: netclass.h:248
iterator end() const
Function end() Returns iterator to the last entry in the mapping.
Definition: netinfo.h:374
Class 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:482
Wrapper class, so you can iterate through NETINFO_ITEM*s, not std::pair<int/wxString,...
Definition: netinfo.h:313
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes
NETCLASSPTR 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:253
iterator begin() const
Function begin() Returns iterator to the first entry in the mapping.
Definition: netinfo.h:363
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.
Class BOARD_DESIGN_SETTINGS contains design settings for a BOARD object.

References NETCLASSES::begin(), NETINFO_MAPPING::begin(), NETCLASSES::end(), NETINFO_MAPPING::end(), 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 469 of file kicad_plugin.cpp.

470 {
471  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
472 
473  // Setup
474  m_out->Print( aNestLevel, "(setup\n" );
475 
476  // Save current default track width, for compatibility with older Pcbnew version;
477  m_out->Print( aNestLevel+1, "(last_trace_width %s)\n",
478  FormatInternalUnits( dsnSettings.GetCurrentTrackWidth() ).c_str() );
479 
480  // Save custom tracks width list (the first is not saved here: this is the netclass value
481  for( unsigned ii = 1; ii < dsnSettings.m_TrackWidthList.size(); ii++ )
482  m_out->Print( aNestLevel+1, "(user_trace_width %s)\n",
483  FormatInternalUnits( dsnSettings.m_TrackWidthList[ii] ).c_str() );
484 
485  m_out->Print( aNestLevel+1, "(trace_clearance %s)\n",
486  FormatInternalUnits( dsnSettings.GetDefault()->GetClearance() ).c_str() );
487 
488  // ZONE_SETTINGS
489  m_out->Print( aNestLevel+1, "(zone_clearance %s)\n",
490  FormatInternalUnits( aBoard->GetZoneSettings().m_ZoneClearance ).c_str() );
491  m_out->Print( aNestLevel+1, "(zone_45_only %s)\n",
492  aBoard->GetZoneSettings().m_Zone_45_Only ? "yes" : "no" );
493 
494  m_out->Print( aNestLevel+1, "(trace_min %s)\n",
495  FormatInternalUnits( dsnSettings.m_TrackMinWidth ).c_str() );
496 
497  // Save current default via size, for compatibility with older Pcbnew version;
498  m_out->Print( aNestLevel+1, "(via_size %s)\n",
499  FormatInternalUnits( dsnSettings.GetDefault()->GetViaDiameter() ).c_str() );
500  m_out->Print( aNestLevel+1, "(via_drill %s)\n",
501  FormatInternalUnits( dsnSettings.GetDefault()->GetViaDrill() ).c_str() );
502  m_out->Print( aNestLevel+1, "(via_min_size %s)\n",
503  FormatInternalUnits( dsnSettings.m_ViasMinSize ).c_str() );
504  m_out->Print( aNestLevel+1, "(via_min_drill %s)\n",
505  FormatInternalUnits( dsnSettings.m_ViasMinDrill ).c_str() );
506 
507  // Save custom vias diameters list (the first is not saved here: this is
508  // the netclass value
509  for( unsigned ii = 1; ii < dsnSettings.m_ViasDimensionsList.size(); ii++ )
510  m_out->Print( aNestLevel+1, "(user_via %s %s)\n",
511  FormatInternalUnits( dsnSettings.m_ViasDimensionsList[ii].m_Diameter ).c_str(),
512  FormatInternalUnits( dsnSettings.m_ViasDimensionsList[ii].m_Drill ).c_str() );
513 
514  // for old versions compatibility:
515  if( dsnSettings.m_BlindBuriedViaAllowed )
516  m_out->Print( aNestLevel+1, "(blind_buried_vias_allowed yes)\n" );
517 
518  m_out->Print( aNestLevel+1, "(uvia_size %s)\n",
519  FormatInternalUnits( dsnSettings.GetDefault()->GetuViaDiameter() ).c_str() );
520  m_out->Print( aNestLevel+1, "(uvia_drill %s)\n",
521  FormatInternalUnits( dsnSettings.GetDefault()->GetuViaDrill() ).c_str() );
522  m_out->Print( aNestLevel+1, "(uvias_allowed %s)\n",
523  ( dsnSettings.m_MicroViasAllowed ) ? "yes" : "no" );
524  m_out->Print( aNestLevel+1, "(uvia_min_size %s)\n",
525  FormatInternalUnits( dsnSettings.m_MicroViasMinSize ).c_str() );
526  m_out->Print( aNestLevel+1, "(uvia_min_drill %s)\n",
527  FormatInternalUnits( dsnSettings.m_MicroViasMinDrill ).c_str() );
528 
529  // 6.0 TODO: are we going to update the tokens we save these under?
530  // 6.0 TODO: need to save the LAYER_CLASS_OTHERS stuff
531  // 6.0 TODO: need to save the TextItalic and TextUpright settings
532 
533  m_out->Print( aNestLevel+1, "(edge_width %s)\n",
534  FormatInternalUnits( dsnSettings.m_LineThickness[ LAYER_CLASS_EDGES ] ).c_str() );
535 
536  m_out->Print( aNestLevel+1, "(segment_width %s)\n",
537  FormatInternalUnits( dsnSettings.m_LineThickness[ LAYER_CLASS_COPPER ] ).c_str() );
538  m_out->Print( aNestLevel+1, "(pcb_text_width %s)\n",
539  FormatInternalUnits( dsnSettings.m_TextThickness[ LAYER_CLASS_COPPER ] ).c_str() );
540  m_out->Print( aNestLevel+1, "(pcb_text_size %s %s)\n",
541  FormatInternalUnits( dsnSettings.m_TextSize[ LAYER_CLASS_COPPER ].x ).c_str(),
542  FormatInternalUnits( dsnSettings.m_TextSize[ LAYER_CLASS_COPPER ].y ).c_str() );
543 
544  m_out->Print( aNestLevel+1, "(mod_edge_width %s)\n",
545  FormatInternalUnits( dsnSettings.m_LineThickness[ LAYER_CLASS_SILK ] ).c_str() );
546  m_out->Print( aNestLevel+1, "(mod_text_size %s %s)\n",
547  FormatInternalUnits( dsnSettings.m_TextSize[ LAYER_CLASS_SILK ].x ).c_str(),
548  FormatInternalUnits( dsnSettings.m_TextSize[ LAYER_CLASS_SILK ].y ).c_str() );
549  m_out->Print( aNestLevel+1, "(mod_text_width %s)\n",
550  FormatInternalUnits( dsnSettings.m_TextThickness[ LAYER_CLASS_SILK ] ).c_str() );
551 
552  m_out->Print( aNestLevel+1, "(pad_size %s %s)\n",
553  FormatInternalUnits( dsnSettings.m_Pad_Master.GetSize().x ).c_str(),
554  FormatInternalUnits( dsnSettings.m_Pad_Master.GetSize().y ).c_str() );
555  m_out->Print( aNestLevel+1, "(pad_drill %s)\n",
556  FormatInternalUnits( dsnSettings.m_Pad_Master.GetDrillSize().x ).c_str() );
557 
558  m_out->Print( aNestLevel+1, "(pad_to_mask_clearance %s)\n",
559  FormatInternalUnits( dsnSettings.m_SolderMaskMargin ).c_str() );
560 
561  if( dsnSettings.m_SolderMaskMinWidth )
562  m_out->Print( aNestLevel+1, "(solder_mask_min_width %s)\n",
563  FormatInternalUnits( dsnSettings.m_SolderMaskMinWidth ).c_str() );
564 
565  if( dsnSettings.m_SolderPasteMargin != 0 )
566  m_out->Print( aNestLevel+1, "(pad_to_paste_clearance %s)\n",
567  FormatInternalUnits( dsnSettings.m_SolderPasteMargin ).c_str() );
568 
569  if( dsnSettings.m_SolderPasteMarginRatio != 0 )
570  m_out->Print( aNestLevel+1, "(pad_to_paste_clearance_ratio %s)\n",
571  Double2Str( dsnSettings.m_SolderPasteMarginRatio ).c_str() );
572 
573  m_out->Print( aNestLevel+1, "(aux_axis_origin %s %s)\n",
574  FormatInternalUnits( aBoard->GetAuxOrigin().x ).c_str(),
575  FormatInternalUnits( aBoard->GetAuxOrigin().y ).c_str() );
576 
577  if( aBoard->GetGridOrigin().x || aBoard->GetGridOrigin().y )
578  m_out->Print( aNestLevel+1, "(grid_origin %s %s)\n",
579  FormatInternalUnits( aBoard->GetGridOrigin().x ).c_str(),
580  FormatInternalUnits( aBoard->GetGridOrigin().y ).c_str() );
581 
582  m_out->Print( aNestLevel+1, "(visible_elements %X)\n",
583  dsnSettings.GetVisibleElements() );
584 
585  aBoard->GetPlotOptions().Format( m_out, aNestLevel+1 );
586 
587  m_out->Print( aNestLevel, ")\n\n" );
588 }
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:557
int m_SolderPasteMargin
Solder paste margin absolute value.
int GetCurrentTrackWidth() const
Function GetCurrentTrackWidth.
std::vector< int > m_TrackWidthList
void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControl=0) const
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:539
std::string Double2Str(double aValue)
Helper function Double2Str to print a float number without using scientific notation and no trailing ...
Definition: base_units.cpp:63
wxSize m_TextSize[LAYER_CLASS_COUNT]
int m_TextThickness[LAYER_CLASS_COUNT]
int m_TrackMinWidth
track min value for width ((min copper size value
int m_ViasMinSize
vias (not micro vias) min diameter
int m_ViasMinDrill
vias (not micro vias) min drill diameter
int m_ZoneClearance
Clearance value.
Definition: zone_settings.h:63
bool m_BlindBuriedViaAllowed
true to allow blind/buried vias
const wxPoint & GetAuxOrigin() const
Definition: class_board.h:350
int m_MicroViasMinSize
micro vias (not vias) min diameter
int m_LineThickness[LAYER_CLASS_COUNT]
const wxPoint & GetGridOrigin() const
Definition: class_board.h:357
int GetVisibleElements() const
Function GetVisibleElements returns a bit-mask of all the element categories that are visible.
NETCLASSPTR GetDefault() const
Function GetDefault.
const wxSize & GetDrillSize() const
Definition: class_pad.h:275
D_PAD m_Pad_Master
A dummy pad to store all default parameters.
const ZONE_SETTINGS & GetZoneSettings() const
Definition: class_board.h:563
std::vector< VIA_DIMENSION > m_ViasDimensionsList
bool m_MicroViasAllowed
true to allow micro vias
int m_MicroViasMinDrill
micro vias (not vias) min drill diameter
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:269
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:457
int m_SolderMaskMinWidth
Solder mask min width.
Class BOARD_DESIGN_SETTINGS contains design settings for a BOARD object.

References Double2Str(), PCB_PLOT_PARAMS::Format(), FormatInternalUnits(), BOARD::GetAuxOrigin(), BOARD_DESIGN_SETTINGS::GetCurrentTrackWidth(), BOARD_DESIGN_SETTINGS::GetDefault(), BOARD::GetDesignSettings(), D_PAD::GetDrillSize(), BOARD::GetGridOrigin(), BOARD::GetPlotOptions(), D_PAD::GetSize(), BOARD_DESIGN_SETTINGS::GetVisibleElements(), BOARD::GetZoneSettings(), LAYER_CLASS_COPPER, LAYER_CLASS_EDGES, LAYER_CLASS_SILK, BOARD_DESIGN_SETTINGS::m_BlindBuriedViaAllowed, BOARD_DESIGN_SETTINGS::m_LineThickness, BOARD_DESIGN_SETTINGS::m_MicroViasAllowed, BOARD_DESIGN_SETTINGS::m_MicroViasMinDrill, BOARD_DESIGN_SETTINGS::m_MicroViasMinSize, 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_TextSize, BOARD_DESIGN_SETTINGS::m_TextThickness, BOARD_DESIGN_SETTINGS::m_TrackMinWidth, BOARD_DESIGN_SETTINGS::m_TrackWidthList, BOARD_DESIGN_SETTINGS::m_ViasDimensionsList, BOARD_DESIGN_SETTINGS::m_ViasMinDrill, BOARD_DESIGN_SETTINGS::m_ViasMinSize, ZONE_SETTINGS::m_Zone_45_Only, ZONE_SETTINGS::m_ZoneClearance, and OUTPUTFORMATTER::Print().

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 2034 of file kicad_plugin.cpp.

2037 {
2038  return getFootprint( aLibraryPath, aFootprintName, aProperties, false );
2039 }
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 106 of file pcbnew/kicad_plugin.h.

107  {
108  // Would have used wildcards_and_files_ext.cpp's KiCadPcbFileExtension,
109  // but to be pure, a plugin should not assume that it will always be linked
110  // with the core of the pcbnew code. (Might someday be a DLL/DSO.) Besides,
111  // file extension policy should be controlled by the plugin.
112  return wxT( "kicad_pcb" );
113  }

◆ getFootprint()

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

Definition at line 2003 of file kicad_plugin.cpp.

2007 {
2008  LOCALE_IO toggle; // toggles on, then off, the C locale.
2009 
2010  init( aProperties );
2011 
2012  try
2013  {
2014  validateCache( aLibraryPath, checkModified );
2015  }
2016  catch( const IO_ERROR& )
2017  {
2018  // do nothing with the error
2019  }
2020 
2021  const MODULE_MAP& mods = m_cache->GetModules();
2022 
2023  MODULE_CITER it = mods.find( aFootprintName );
2024 
2025  if( it == mods.end() )
2026  {
2027  return NULL;
2028  }
2029 
2030  return it->second->GetModule();
2031 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:180
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
std::map< wxString, MODULE * > MODULE_MAP
Definition: eagle_plugin.h:36
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 50 of file kicad_clipboard.cpp.

51 {
52  return &m_formatter;
53 }
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 2169 of file kicad_plugin.cpp.

2170 {
2171  return FP_CACHE::GetTimestamp( aLibraryPath );
2172 }
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 161 of file pcbnew/kicad_plugin.h.

162  {
163  std::string ret = m_sf.GetString();
164  if( doClear )
165  m_sf.Clear();
166 
167  return ret;
168  }
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 1947 of file kicad_plugin.cpp.

1948 {
1949  m_board = NULL;
1950  m_reader = NULL;
1952  m_props = aProperties;
1953 }
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.
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, 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 2270 of file kicad_plugin.cpp.

2271 {
2272  LOCALE_IO toggle;
2273 
2274  init( NULL );
2275 
2276  validateCache( aLibraryPath );
2277 
2278  return m_cache->IsWritable();
2279 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:180
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
bool IsWritable() const

References PCB_IO::init(), FP_CACHE::IsWritable(), PCB_IO::m_cache, 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 283 of file kicad_clipboard.cpp.

285 {
286  std::string result;
287 
288  auto clipboard = wxTheClipboard;
289  wxClipboardLocker clipboardLock( clipboard );
290 
291  if( !clipboardLock )
292  return nullptr;
293 
294  if( clipboard->IsSupported( wxDF_TEXT ) )
295  {
296  wxTextDataObject data;
297  clipboard->GetData( data );
298 
299  result = data.GetText().mb_str();
300  }
301 
302  STRING_LINE_READER reader(result, wxT( "clipboard" ) );
303 
304  init( aProperties );
305 
306  m_parser->SetLineReader( &reader );
307  m_parser->SetBoard( aAppendToMe );
308 
309  BOARD_ITEM* item;
310  BOARD* board;
311 
312  try
313  {
314  item = m_parser->Parse();
315  }
316  catch( const FUTURE_FORMAT_ERROR& )
317  {
318  // Don't wrap a FUTURE_FORMAT_ERROR in another
319  throw;
320  }
321  catch( const PARSE_ERROR& parse_error )
322  {
323  if( m_parser->IsTooRecent() )
324  throw FUTURE_FORMAT_ERROR( parse_error, m_parser->GetRequiredVersion() );
325  else
326  throw;
327  }
328 
329  if( item->Type() != PCB_T )
330  {
331  // The parser loaded something that was valid, but wasn't a board.
332  THROW_PARSE_ERROR( _( "Clipboard content is not KiCad compatible" ),
333  m_parser->CurSource(), m_parser->CurLine(),
334  m_parser->CurLineNumber(), m_parser->CurOffset() );
335  }
336  else
337  {
338  board = dynamic_cast<BOARD*>( item );
339  }
340 
341  // Give the filename to the board if it's new
342  if( board && !aAppendToMe )
343  board->SetFileName( aFileName );
344 
345  return board;
346 }
Definition: typeinfo.h:85
Class 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:183
void SetBoard(BOARD *aBoard)
Definition: pcb_parser.h:315
void SetFileName(const wxString &aFileName)
Definition: class_board.h:236
#define THROW_PARSE_ERROR(aProblem, aSource, aInputLine, aLineNumber, aByteIndex)
BOARD_ITEM * Parse()
Definition: pcb_parser.cpp:443
LINE_READER * SetLineReader(LINE_READER *aReader)
Function SetLineReader sets aLineReader into the parser, and returns the previous one,...
Definition: pcb_parser.h:308
CLIPBOARD_PARSER * m_parser
bool IsTooRecent()
Return whether a version number, if any was parsed, was too recent.
Definition: pcb_parser.h:333
Struct PARSE_ERROR contains a filename or source description, a problem input line,...
Definition: ki_exception.h:123
Class BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:171
Struct FUTURE_FORMAT_ERROR variant of PARSE_ERROR indicating that a syntax or related error was likel...
Definition: ki_exception.h:172
Class 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:201

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 208 of file kicad_clipboard.cpp.

209 {
210  BOARD_ITEM* item;
211  wxString result;
212 
213  auto clipboard = wxTheClipboard;
214  wxClipboardLocker clipboardLock( clipboard );
215 
216  if( !clipboardLock )
217  return nullptr;
218 
219 
220  if( clipboard->IsSupported( wxDF_TEXT ) )
221  {
222  wxTextDataObject data;
223  clipboard->GetData( data );
224  result = data.GetText();
225  }
226 
227  try
228  {
229  item = PCB_IO::Parse( result );
230  }
231  catch (...)
232  {
233  item = nullptr;
234  }
235 
236  return item;
237 }
BOARD_ITEM * Parse(const wxString &aClipboardSourceInput)
Class 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::PasteItemsFromClipboard().

◆ Parse() [2/2]

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

Definition at line 377 of file kicad_plugin.cpp.

378 {
379  std::string input = TO_UTF8( aClipboardSourceInput );
380 
381  STRING_LINE_READER reader( input, wxT( "clipboard" ) );
382 
383  m_parser->SetLineReader( &reader );
384 
385  try
386  {
387  return m_parser->Parse();
388  }
389  catch( const PARSE_ERROR& parse_error )
390  {
391  if( m_parser->IsTooRecent() )
392  throw FUTURE_FORMAT_ERROR( parse_error, m_parser->GetRequiredVersion() );
393  else
394  throw;
395  }
396 }
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:47
wxString GetRequiredVersion()
Return a string representing the version of kicad required to open this file.
Definition: pcb_parser.cpp:183
PCB_PARSER * m_parser
BOARD_ITEM * Parse()
Definition: pcb_parser.cpp:443
LINE_READER * SetLineReader(LINE_READER *aReader)
Function SetLineReader sets aLineReader into the parser, and returns the previous one,...
Definition: pcb_parser.h:308
bool IsTooRecent()
Return whether a version number, if any was parsed, was too recent.
Definition: pcb_parser.h:333
Struct PARSE_ERROR contains a filename or source description, a problem input line,...
Definition: ki_exception.h:123
Struct FUTURE_FORMAT_ERROR variant of PARSE_ERROR indicating that a syntax or related error was likel...
Definition: ki_exception.h:172
Class 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 101 of file pcbnew/kicad_plugin.h.

102  {
103  return wxT( "KiCad" );
104  }

◆ 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 240 of file kicad_clipboard.cpp.

242 {
243  init( aProperties );
244 
245  m_board = aBoard; // after init()
246 
247  // Prepare net mapping that assures that net codes saved in a file are consecutive integers
248  m_mapping->SetBoard( aBoard );
249 
250  STRING_FORMATTER formatter;
251 
252  m_out = &formatter;
253 
254  m_out->Print( 0, "(kicad_pcb (version %d) (host pcbnew %s)\n", SEXPR_BOARD_FILE_VERSION,
255  formatter.Quotew( GetBuildVersion() ).c_str() );
256 
257  Format( aBoard, 1 );
258 
259  m_out->Print( 0, ")\n" );
260 
261  auto clipboard = wxTheClipboard;
262  wxClipboardLocker clipboardLock( clipboard );
263 
264  if( !clipboardLock )
265  return;
266 
267  clipboard->SetData( new wxTextDataObject(
268  wxString( m_formatter.GetString().c_str(), wxConvUTF8 ) ) );
269  clipboard->Flush();
270 
271  // This section exists to return the clipboard data, ensuring it has fully
272  // been processed by the system clipboard. This appears to be needed for
273  // extremely large clipboard copies on asynchronous linux clipboard managers
274  // such as KDE's Klipper
275  {
276  wxTextDataObject data;
277  clipboard->GetData( data );
278  ( void )data.GetText(); // Keep unused variable
279  }
280 }
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:289
wxString GetBuildVersion()
Function GetBuildVersion Return the build version string.
const std::string & GetString()
Definition: richio.h:475
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
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.
Class 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 SELECTION selected)

Definition at line 62 of file kicad_clipboard.cpp.

63 {
64  VECTOR2I refPoint( 0, 0 );
65 
66  // dont even start if the selection is empty
67  if( aSelected.Empty() )
68  return;
69 
70  if( aSelected.HasReferencePoint() )
71  refPoint = aSelected.GetReferencePoint();
72 
73  // Prepare net mapping that assures that net codes saved in a file are consecutive integers
75 
76  // Differentiate how it is formatted depending on what selection contains
77  bool onlyModuleParts = true;
78  for( const auto i : aSelected )
79  {
80  // check if it not one of the module primitives
81  if( ( i->Type() != PCB_MODULE_EDGE_T ) &&
82  ( i->Type() != PCB_MODULE_TEXT_T ) &&
83  ( i->Type() != PCB_PAD_T ) )
84  {
85  onlyModuleParts = false;
86  continue;
87  }
88  }
89 
90  // if there is only parts of a module selected, format it as a new module else
91  // format it as an entire board
92  MODULE partialModule( m_board );
93 
94  // only a module selected.
95  if( aSelected.Size() == 1 && aSelected.Front()->Type() == PCB_MODULE_T )
96  {
97  // make the module safe to transfer to other pcbs
98  const MODULE* mod = static_cast<MODULE*>( aSelected.Front() );
99  // Do not modify existing board
100  MODULE newModule(*mod);
101 
102  for( D_PAD* pad = newModule.PadsList().begin(); pad; pad = pad->Next() )
103  {
104  pad->SetNetCode( 0, 0 );
105  }
106 
107  // locate the reference point at (0, 0) in the copied items
108  newModule.Move( wxPoint( -refPoint.x, -refPoint.y ) );
109 
110  Format( static_cast<BOARD_ITEM*>( &newModule ) );
111  }
112  // partial module selected.
113  else if( onlyModuleParts )
114  {
115  for( const auto item : aSelected )
116  {
117  auto clone = static_cast<BOARD_ITEM*>( item->Clone() );
118 
119  // Do not add reference/value - convert them to the common type
120  if( TEXTE_MODULE* text = dyn_cast<TEXTE_MODULE*>( clone ) )
121  text->SetType( TEXTE_MODULE::TEXT_is_DIVERS );
122 
123  // If it is only a module, clear the nets from the pads
124  if( clone->Type() == PCB_PAD_T )
125  {
126  D_PAD* pad = static_cast<D_PAD*>( clone );
127  pad->SetNetCode( 0, 0 );
128  }
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.x, -refPoint.y ) );
135  }
136 
137  // Set the new relative internal local coordinates of copied items
138  MODULE* editedModule = m_board->m_Modules;
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  // locate the reference point at (0, 0) in the copied items
176  clone->Move( wxPoint(-refPoint.x, -refPoint.y ) );
177 
178  Format( clone.get(), 1 );
179  }
180  }
181  m_formatter.Print( 0, "\n)" );
182  }
183 
184  // These are placed at the end to minimize the open time of the clipboard
185  auto clipboard = wxTheClipboard;
186  wxClipboardLocker clipboardLock( clipboard );
187 
188  if( !clipboardLock || !clipboard->IsOpened() )
189  return;
190 
191  clipboard->SetData( new wxTextDataObject(
192  wxString( m_formatter.GetString().c_str(), wxConvUTF8 ) ) );
193 
194  clipboard->Flush();
195 
196  // This section exists to return the clipboard data, ensuring it has fully
197  // been processed by the system clipboard. This appears to be needed for
198  // extremely large clipboard copies on asynchronous linux clipboard managers
199  // such as KDE's Klipper
200  {
201  wxTextDataObject data;
202  clipboard->GetData( data );
203  ( void )data.GetText(); // Keep unused variable
204  }
205 }
D_PAD * Next() const
Definition: class_pad.h:160
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:180
#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:289
class MODULE, a footprint
Definition: typeinfo.h:89
wxString GetBuildVersion()
Function GetBuildVersion Return the build version string.
bool SetNetCode(int aNetCode, bool aNoAssert=false)
Function SetNetCode sets net using a net code.
const std::string & GetString()
Definition: richio.h:475
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
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
DLIST< MODULE > m_Modules
Definition: class_board.h:249
size_t i
Definition: json11.cpp:597
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:183
#define mod(a, n)
Definition: greymap.cpp:24

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

Referenced by EDIT_TOOL::doCopyToClipboard().

◆ SetBoard()

void CLIPBOARD_IO::SetBoard ( BOARD aBoard)

Definition at line 56 of file kicad_clipboard.cpp.

57 {
58  m_board = aBoard;
59 }
BOARD * m_board
which BOARD, no ownership here

References PCB_IO::m_board.

Referenced by EDIT_TOOL::doCopyToClipboard().

◆ SetOutputFormatter()

void PCB_IO::SetOutputFormatter ( OUTPUTFORMATTER aFormatter)
inlineinherited

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

170 { 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 1956 of file kicad_plugin.cpp.

1957 {
1958  if( !m_cache || !m_cache->IsPath( aLibraryPath ) || ( checkModified && m_cache->IsModified() ) )
1959  {
1960  // a spectacular episode in memory management:
1961  delete m_cache;
1962  m_cache = new FP_CACHE( this, aLibraryPath );
1963  m_cache->Load();
1964  }
1965 }
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 177 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 176 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 184 of file pcbnew/kicad_plugin.h.

◆ m_formatter

STRING_FORMATTER CLIPBOARD_IO::m_formatter
private

Definition at line 80 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 186 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 192 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 81 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 180 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 183 of file pcbnew/kicad_plugin.h.

Referenced by PCB_IO::init().

◆ m_sf

STRING_FORMATTER PCB_IO::m_sf
protectedinherited

Definition at line 188 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: