KiCad PCB EDA Suite
PCB_IO Class Reference

Class PCB_IO is a PLUGIN derivation for saving and loading Pcbnew s-expression formatted files. More...

#include <kicad_plugin.h>

Inheritance diagram for PCB_IO:
PLUGIN CLIPBOARD_IO GITHUB_PLUGIN

Public Member Functions

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...
 
virtual 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...
 
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...
 
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...
 
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...
 
 PCB_IO (int aControlFlags=CTL_FOR_BOARD)
 
 ~PCB_IO ()
 
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
 
PCB_PARSERm_parser
 
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 format (BOARD *aBoard, int aNestLevel=0) const
 
void format (DIMENSION *aDimension, int aNestLevel=0) const
 
void format (EDGE_MODULE *aModuleDrawing, int aNestLevel=0) const
 
void format (DRAWSEGMENT *aSegment, int aNestLevel=0) const
 
void format (PCB_TARGET *aTarget, int aNestLevel=0) const
 
void format (MODULE *aModule, int aNestLevel=0) const
 
void format (D_PAD *aPad, int aNestLevel=0) const
 
void format (TEXTE_PCB *aText, int aNestLevel=0) const
 
void format (TEXTE_MODULE *aText, int aNestLevel=0) const
 
void format (TRACK *aTrack, int aNestLevel=0) const
 
void format (ZONE_CONTAINER *aZone, int aNestLevel=0) const
 
void formatLayer (const BOARD_ITEM *aItem) const
 
void formatLayers (LSET aLayerMask, int aNestLevel=0) const
 

Friends

class FP_CACHE
 

Detailed Description

Class PCB_IO is a PLUGIN derivation for saving and loading Pcbnew s-expression formatted files.

Note
This class is not thread safe, but it is re-entrant multiple times in sequence.

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

Constructor & Destructor Documentation

◆ PCB_IO()

PCB_IO::PCB_IO ( int  aControlFlags = CTL_FOR_BOARD)

Definition at line 1947 of file kicad_plugin.cpp.

1947  :
1948  m_cache( 0 ),
1949  m_ctl( aControlFlags ),
1950  m_parser( new PCB_PARSER() ),
1951  m_mapping( new NETINFO_MAPPING() )
1952 {
1953  init( 0 );
1954  m_out = &m_sf;
1955 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
FP_CACHE * m_cache
Footprint library cache.
Class PCB_PARSER reads a Pcbnew s-expression formatted LINE_READER object and returns the appropriate...
Definition: pcb_parser.h:66
void init(const PROPERTIES *aProperties)
PCB_PARSER * m_parser
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes
STRING_FORMATTER m_sf

References init(), m_out, and m_sf.

◆ ~PCB_IO()

PCB_IO::~PCB_IO ( )

Definition at line 1958 of file kicad_plugin.cpp.

1959 {
1960  delete m_cache;
1961  delete m_parser;
1962  delete m_mapping;
1963 }
FP_CACHE * m_cache
Footprint library cache.
PCB_PARSER * m_parser
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes

References m_cache, m_mapping, and m_parser.

Member Function Documentation

◆ FootprintDelete()

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

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

2233 {
2234  LOCALE_IO toggle; // toggles on, then off, the C locale.
2235 
2236  init( aProperties );
2237 
2238  validateCache( aLibraryPath );
2239 
2240  if( !m_cache->IsWritable() )
2241  {
2242  THROW_IO_ERROR( wxString::Format( _( "Library \"%s\" is read only" ),
2243  aLibraryPath.GetData() ) );
2244  }
2245 
2246  m_cache->Remove( aFootprintName );
2247 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:175
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)
#define _(s)
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(), init(), FP_CACHE::IsWritable(), m_cache, FP_CACHE::Remove(), THROW_IO_ERROR, and validateCache().

Referenced by GITHUB_PLUGIN::FootprintDelete().

◆ FootprintEnumerate()

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

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

2034 {
2035  LOCALE_IO toggle; // toggles on, then off, the C locale.
2036  wxDir dir( aLibraryPath );
2037 
2038  init( aProperties );
2039 
2040  wxString errorMsg;
2041 
2042  try
2043  {
2044  validateCache( aLibraryPath );
2045  }
2046  catch( const IO_ERROR& ioe )
2047  {
2048  errorMsg = ioe.What();
2049  }
2050 
2051  // Some of the files may have been parsed correctly so we want to add the valid files to
2052  // the library.
2053 
2054  const MODULE_MAP& mods = m_cache->GetModules();
2055 
2056  for( MODULE_CITER it = mods.begin(); it != mods.end(); ++it )
2057  {
2058  aFootprintNames.Add( it->first );
2059  }
2060 
2061  if( !errorMsg.IsEmpty() )
2062  THROW_IO_ERROR( errorMsg );
2063 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:175
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(), init(), m_cache, THROW_IO_ERROR, 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 
)
overridevirtual

Function FootprintExists check for the existence of a footprint.

Reimplemented from PLUGIN.

Definition at line 2103 of file kicad_plugin.cpp.

2105 {
2106  // Note: checking the cache sounds like a good idea, but won't catch files which differ
2107  // only in case.
2108  //
2109  // Since this goes out to the native filesystem, we get platform differences (ie: MSW's
2110  // case-insensitive filesystem) handled "for free".
2111  // Warning: footprint names frequently contain a point. So be careful when initializing
2112  // wxFileName, and use a CTOR with extension specified
2113  wxFileName footprintFile( aLibraryPath, aFootprintName, KiCadFootprintFileExtension );
2114 
2115  return footprintFile.Exists();
2116 }
const std::string KiCadFootprintFileExtension

References KiCadFootprintFileExtension.

◆ FootprintLibCreate()

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

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

2258 {
2259  if( wxDir::Exists( aLibraryPath ) )
2260  {
2261  THROW_IO_ERROR( wxString::Format( _( "cannot overwrite library path \"%s\"" ),
2262  aLibraryPath.GetData() ) );
2263  }
2264 
2265  LOCALE_IO toggle;
2266 
2267  init( aProperties );
2268 
2269  delete m_cache;
2270  m_cache = new FP_CACHE( this, aLibraryPath );
2271  m_cache->Save();
2272 }
friend class FP_CACHE
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:175
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
#define THROW_IO_ERROR(msg)
#define _(s)
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(), FP_CACHE, init(), 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 
)
overridevirtual

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

2276 {
2277  wxFileName fn;
2278  fn.SetPath( aLibraryPath );
2279 
2280  // Return if there is no library path to delete.
2281  if( !fn.DirExists() )
2282  return false;
2283 
2284  if( !fn.IsDirWritable() )
2285  {
2286  THROW_IO_ERROR( wxString::Format( _( "user does not have permission to delete directory \"%s\"" ),
2287  aLibraryPath.GetData() ) );
2288  }
2289 
2290  wxDir dir( aLibraryPath );
2291 
2292  if( dir.HasSubDirs() )
2293  {
2294  THROW_IO_ERROR( wxString::Format( _( "library directory \"%s\" has unexpected sub-directories" ),
2295  aLibraryPath.GetData() ) );
2296  }
2297 
2298  // All the footprint files must be deleted before the directory can be deleted.
2299  if( dir.HasFiles() )
2300  {
2301  unsigned i;
2302  wxFileName tmp;
2303  wxArrayString files;
2304 
2305  wxDir::GetAllFiles( aLibraryPath, &files );
2306 
2307  for( i = 0; i < files.GetCount(); i++ )
2308  {
2309  tmp = files[i];
2310 
2311  if( tmp.GetExt() != KiCadFootprintFileExtension )
2312  {
2313  THROW_IO_ERROR( wxString::Format( _( "unexpected file \"%s\" was found in library path \"%s\"" ),
2314  files[i].GetData(), aLibraryPath.GetData() ) );
2315  }
2316  }
2317 
2318  for( i = 0; i < files.GetCount(); i++ )
2319  {
2320  wxRemoveFile( files[i] );
2321  }
2322  }
2323 
2324  wxLogTrace( traceKicadPcbPlugin, wxT( "Removing footprint library \"%s\"" ),
2325  aLibraryPath.GetData() );
2326 
2327  // Some of the more elaborate wxRemoveFile() crap puts up its own wxLog dialog
2328  // we don't want that. we want bare metal portability with no UI here.
2329  if( !wxRmdir( aLibraryPath ) )
2330  {
2331  THROW_IO_ERROR( wxString::Format( _( "footprint library \"%s\" cannot be deleted" ),
2332  aLibraryPath.GetData() ) );
2333  }
2334 
2335  // For some reason removing a directory in Windows is not immediately updated. This delay
2336  // prevents an error when attempting to immediately recreate the same directory when over
2337  // writing an existing library.
2338 #ifdef __WINDOWS__
2339  wxMilliSleep( 250L );
2340 #endif
2341 
2342  if( m_cache && !m_cache->IsPath( aLibraryPath ) )
2343  {
2344  delete m_cache;
2345  m_cache = NULL;
2346  }
2347 
2348  return true;
2349 }
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)
#define _(s)
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, 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 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 }
Class UTF8 is an 8 bit string that is assuredly encoded in UTF8, and supplies special conversion supp...
Definition: utf8.h:73
#define _(s)

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 
)
overridevirtual

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

2121 {
2122  const MODULE* footprint = getFootprint( aLibraryPath, aFootprintName, aProperties, true );
2123  return footprint ? new MODULE( *footprint ) : nullptr;
2124 }
const MODULE * getFootprint(const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties, bool checkModified)

References getFootprint().

Referenced by GITHUB_PLUGIN::FootprintLoad().

◆ FootprintSave()

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

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

2129 {
2130  LOCALE_IO toggle; // toggles on, then off, the C locale.
2131 
2132  init( aProperties );
2133 
2134  // In this public PLUGIN API function, we can safely assume it was
2135  // called for saving into a library path.
2137 
2138  validateCache( aLibraryPath );
2139 
2140  if( !m_cache->IsWritable() )
2141  {
2142  if( !m_cache->Exists() )
2143  {
2144  const wxString msg = wxString::Format( _( "Library \"%s\" does not exist.\n"
2145  "Would you like to create it?"),
2146  GetChars( aLibraryPath ) );
2147 
2148  if( wxMessageBox( msg, _( "Library Not Found"), wxYES_NO | wxICON_QUESTION ) != wxYES )
2149  return;
2150 
2151  // Save throws its own IO_ERROR on failure, so no need to recreate here
2152  m_cache->Save( NULL );
2153  }
2154  else
2155  {
2156  wxString msg = wxString::Format( _( "Library \"%s\" is read only" ), aLibraryPath );
2157  THROW_IO_ERROR( msg );
2158  }
2159  }
2160 
2161  wxString footprintName = aFootprint->GetFPID().GetLibItemName();
2162 
2163  MODULE_MAP& mods = m_cache->GetModules();
2164 
2165  // Quietly overwrite module and delete module file from path for any by same name.
2166  wxFileName fn( aLibraryPath, aFootprint->GetFPID().GetLibItemName(),
2168 
2169 #ifndef __WINDOWS__
2170  // Write through symlinks, don't replace them
2171  if( fn.Exists( wxFILE_EXISTS_SYMLINK ) )
2172  {
2173  char buffer[ PATH_MAX + 1 ];
2174  ssize_t pathLen = readlink( TO_UTF8( fn.GetFullPath() ), buffer, PATH_MAX );
2175 
2176  if( pathLen > 0 )
2177  {
2178  buffer[ pathLen ] = '\0';
2179  fn.Assign( fn.GetPath() + wxT( "/" ) + wxString::FromUTF8( buffer ) );
2180  fn.Normalize();
2181  }
2182  }
2183 #endif
2184 
2185  if( !fn.IsOk() )
2186  {
2187  THROW_IO_ERROR( wxString::Format( _( "Footprint file name \"%s\" is not valid." ),
2188  fn.GetFullPath() ) );
2189  }
2190 
2191  if( fn.FileExists() && !fn.IsFileWritable() )
2192  {
2193  THROW_IO_ERROR( wxString::Format( _( "No write permissions to delete file \"%s\"" ),
2194  fn.GetFullPath() ) );
2195  }
2196 
2197  wxString fullPath = fn.GetFullPath();
2198  wxString fullName = fn.GetFullName();
2199  MODULE_CITER it = mods.find( footprintName );
2200 
2201  if( it != mods.end() )
2202  {
2203  wxLogTrace( traceKicadPcbPlugin, wxT( "Removing footprint file '%s'." ), fullPath );
2204  mods.erase( footprintName );
2205  wxRemoveFile( fullPath );
2206  }
2207 
2208  // I need my own copy for the cache
2209  MODULE* module = new MODULE( *aFootprint );
2210 
2211  // and it's time stamp must be 0, it should have no parent, orientation should
2212  // be zero, and it should be on the front layer.
2213  module->SetTimeStamp( 0 );
2214  module->SetParent( nullptr );
2215  module->SetOrientation( 0 );
2216 
2217  if( module->GetLayer() != F_Cu )
2218  {
2219  if( m_board != nullptr )
2220  module->Flip( module->GetPosition(), m_board->GeneralSettings().m_FlipLeftRight );
2221  else
2222  module->Flip( module->GetPosition(), false );
2223  }
2224 
2225  wxLogTrace( traceKicadPcbPlugin, wxT( "Creating s-expr footprint file '%s'." ), fullPath );
2226  mods.insert( footprintName, new FP_CACHE_ITEM( module, WX_FILENAME( fn.GetPath(), fullName ) ) );
2227  m_cache->Save( module );
2228 }
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:175
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:197
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:48
void SetParent(EDA_ITEM *aParent)
Definition: base_struct.h:225
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
void Flip(const wxPoint &aCentre, bool aFlipLeftRight) override
Function Flip Flip this object, i.e.
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.
#define _(s)
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:101
A wrapper around a wxFileName which is much more performant with a subset of the API.
Definition: common.h:411
const PCB_GENERAL_SETTINGS & GeneralSettings() const
Definition: class_board.h:575
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)
BOARD * m_board
which BOARD, no ownership here
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:188
MODULE_MAP & GetModules()
void SetTimeStamp(timestamp_t aNewTimeStamp)
Definition: base_struct.h:215

References _, CTL_FOR_LIBRARY, FP_CACHE::Exists(), F_Cu, MODULE::Flip(), Format(), BOARD::GeneralSettings(), GetChars(), MODULE::GetFPID(), BOARD_ITEM::GetLayer(), LIB_ID::GetLibItemName(), FP_CACHE::GetModules(), MODULE::GetPosition(), init(), FP_CACHE::IsWritable(), KiCadFootprintFileExtension, m_board, m_cache, m_ctl, PCB_GENERAL_SETTINGS::m_FlipLeftRight, FP_CACHE::Save(), MODULE::SetOrientation(), EDA_ITEM::SetParent(), EDA_ITEM::SetTimeStamp(), THROW_IO_ERROR, TO_UTF8, traceKicadPcbPlugin, and validateCache().

Referenced by GITHUB_PLUGIN::FootprintSave().

◆ Format()

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

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

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

References 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(), format(), CLIPBOARD_IO::Save(), Save(), FP_CACHE::Save(), and CLIPBOARD_IO::SaveSelection().

◆ format() [1/11]

void PCB_IO::format ( BOARD aBoard,
int  aNestLevel = 0 
) const
private

Definition at line 751 of file kicad_plugin.cpp.

752 {
753  formatHeader( aBoard, aNestLevel );
754 
755  // Save the modules.
756  for( auto module : aBoard->Modules() )
757  {
758  Format( module, aNestLevel );
759  m_out->Print( 0, "\n" );
760  }
761 
762  // Save the graphical items on the board (not owned by a module)
763  for( auto item : aBoard->Drawings() )
764  Format( item, aNestLevel );
765 
766  if( aBoard->Drawings().size() )
767  m_out->Print( 0, "\n" );
768 
769  // Do not save MARKER_PCBs, they can be regenerated easily.
770 
771  // Save the tracks and vias.
772  for( auto track : aBoard->Tracks() )
773  Format( track, aNestLevel );
774 
775  if( aBoard->Tracks().size() )
776  m_out->Print( 0, "\n" );
777 
778  // Save the polygon (which are the newer technology) zones.
779  for( int i = 0; i < aBoard->GetAreaCount(); ++i )
780  Format( aBoard->GetArea( i ), aNestLevel );
781 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
int GetAreaCount() const
Function GetAreaCount.
Definition: class_board.h:955
MODULES & Modules()
Definition: class_board.h:236
size_t i
Definition: json11.cpp:597
void formatHeader(BOARD *aBoard, int aNestLevel=0) const
writes everything that comes before the board_items, like settings and layers etc
ZONE_CONTAINER * GetArea(int index) const
Function GetArea returns the Area (Zone Container) at a given index.
Definition: class_board.h:926
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.
DRAWINGS & Drawings()
Definition: class_board.h:245
TRACKS & Tracks()
Definition: class_board.h:227

References BOARD::Drawings(), Format(), formatHeader(), BOARD::GetArea(), BOARD::GetAreaCount(), i, m_out, BOARD::Modules(), OUTPUTFORMATTER::Print(), and BOARD::Tracks().

Referenced by Format(), and format().

◆ format() [2/11]

void PCB_IO::format ( DIMENSION aDimension,
int  aNestLevel = 0 
) const
private

Definition at line 784 of file kicad_plugin.cpp.

785 {
786  m_out->Print( aNestLevel, "(dimension %s (width %s)",
787  FormatInternalUnits( aDimension->GetValue() ).c_str(),
788  FormatInternalUnits( aDimension->GetWidth() ).c_str() );
789 
790  formatLayer( aDimension );
791 
792  if( aDimension->GetTimeStamp() )
793  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aDimension->GetTimeStamp() );
794 
795  m_out->Print( 0, "\n" );
796 
797  Format( &aDimension->Text(), aNestLevel+1 );
798 
799  m_out->Print( aNestLevel+1, "(feature1 (pts (xy %s %s) (xy %s %s)))\n",
800  FormatInternalUnits( aDimension->m_featureLineDO.x ).c_str(),
801  FormatInternalUnits( aDimension->m_featureLineDO.y ).c_str(),
802  FormatInternalUnits( aDimension->m_featureLineDF.x ).c_str(),
803  FormatInternalUnits( aDimension->m_featureLineDF.y ).c_str() );
804 
805  m_out->Print( aNestLevel+1, "(feature2 (pts (xy %s %s) (xy %s %s)))\n",
806  FormatInternalUnits( aDimension->m_featureLineGO.x ).c_str(),
807  FormatInternalUnits( aDimension->m_featureLineGO.y ).c_str(),
808  FormatInternalUnits( aDimension->m_featureLineGF.x ).c_str(),
809  FormatInternalUnits( aDimension->m_featureLineGF.y ).c_str() );
810 
811  m_out->Print( aNestLevel+1, "(crossbar (pts (xy %s %s) (xy %s %s)))\n",
812  FormatInternalUnits( aDimension->m_crossBarO.x ).c_str(),
813  FormatInternalUnits( aDimension->m_crossBarO.y ).c_str(),
814  FormatInternalUnits( aDimension->m_crossBarF.x ).c_str(),
815  FormatInternalUnits( aDimension->m_crossBarF.y ).c_str() );
816 
817  m_out->Print( aNestLevel+1, "(arrow1a (pts (xy %s %s) (xy %s %s)))\n",
818  FormatInternalUnits( aDimension->m_crossBarF.x ).c_str(),
819  FormatInternalUnits( aDimension->m_crossBarF.y ).c_str(),
820  FormatInternalUnits( aDimension->m_arrowD1F.x ).c_str(),
821  FormatInternalUnits( aDimension->m_arrowD1F.y ).c_str() );
822 
823  m_out->Print( aNestLevel+1, "(arrow1b (pts (xy %s %s) (xy %s %s)))\n",
824  FormatInternalUnits( aDimension->m_crossBarF.x ).c_str(),
825  FormatInternalUnits( aDimension->m_crossBarF.y ).c_str(),
826  FormatInternalUnits( aDimension->m_arrowD2F.x ).c_str(),
827  FormatInternalUnits( aDimension->m_arrowD2F.y ).c_str() );
828 
829  m_out->Print( aNestLevel+1, "(arrow2a (pts (xy %s %s) (xy %s %s)))\n",
830  FormatInternalUnits( aDimension->m_crossBarO.x ).c_str(),
831  FormatInternalUnits( aDimension->m_crossBarO.y ).c_str(),
832  FormatInternalUnits( aDimension->m_arrowG1F.x ).c_str(),
833  FormatInternalUnits( aDimension->m_arrowG1F.y ).c_str() );
834 
835  m_out->Print( aNestLevel+1, "(arrow2b (pts (xy %s %s) (xy %s %s)))\n",
836  FormatInternalUnits( aDimension->m_crossBarO.x ).c_str(),
837  FormatInternalUnits( aDimension->m_crossBarO.y ).c_str(),
838  FormatInternalUnits( aDimension->m_arrowG2F.x ).c_str(),
839  FormatInternalUnits( aDimension->m_arrowG2F.y ).c_str() );
840 
841  m_out->Print( aNestLevel, ")\n" );
842 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
int GetWidth() const
void formatLayer(const BOARD_ITEM *aItem) const
wxPoint m_crossBarF
wxPoint m_arrowD1F
wxPoint m_featureLineDF
wxPoint m_featureLineGO
int GetValue() const
wxPoint m_arrowG1F
wxPoint m_arrowD2F
wxPoint m_arrowG2F
timestamp_t GetTimeStamp() const
Definition: base_struct.h:216
TEXTE_PCB & Text()
wxPoint m_crossBarO
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.
wxPoint m_featureLineDO
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:465
wxPoint m_featureLineGF

References Format(), FormatInternalUnits(), formatLayer(), EDA_ITEM::GetTimeStamp(), DIMENSION::GetValue(), DIMENSION::GetWidth(), DIMENSION::m_arrowD1F, DIMENSION::m_arrowD2F, DIMENSION::m_arrowG1F, DIMENSION::m_arrowG2F, DIMENSION::m_crossBarF, DIMENSION::m_crossBarO, DIMENSION::m_featureLineDF, DIMENSION::m_featureLineDO, DIMENSION::m_featureLineGF, DIMENSION::m_featureLineGO, m_out, OUTPUTFORMATTER::Print(), and DIMENSION::Text().

◆ format() [3/11]

void PCB_IO::format ( EDGE_MODULE aModuleDrawing,
int  aNestLevel = 0 
) const
private

Definition at line 923 of file kicad_plugin.cpp.

924 {
925  switch( aModuleDrawing->GetShape() )
926  {
927  case S_SEGMENT: // Line
928  m_out->Print( aNestLevel, "(fp_line (start %s) (end %s)",
929  FormatInternalUnits( aModuleDrawing->GetStart0() ).c_str(),
930  FormatInternalUnits( aModuleDrawing->GetEnd0() ).c_str() );
931  break;
932 
933  case S_CIRCLE: // Circle
934  m_out->Print( aNestLevel, "(fp_circle (center %s) (end %s)",
935  FormatInternalUnits( aModuleDrawing->GetStart0() ).c_str(),
936  FormatInternalUnits( aModuleDrawing->GetEnd0() ).c_str() );
937  break;
938 
939  case S_ARC: // Arc
940  m_out->Print( aNestLevel, "(fp_arc (start %s) (end %s) (angle %s)",
941  FormatInternalUnits( aModuleDrawing->GetStart0() ).c_str(),
942  FormatInternalUnits( aModuleDrawing->GetEnd0() ).c_str(),
943  FormatAngle( aModuleDrawing->GetAngle() ).c_str() );
944  break;
945 
946  case S_POLYGON: // Polygonal segment
947  if( aModuleDrawing->IsPolyShapeValid() )
948  {
949  SHAPE_POLY_SET& poly = aModuleDrawing->GetPolyShape();
950  SHAPE_LINE_CHAIN& outline = poly.Outline( 0 );
951  int pointsCount = outline.PointCount();
952 
953  m_out->Print( aNestLevel, "(fp_poly (pts" );
954 
955  for( int ii = 0; ii < pointsCount; ++ii )
956  {
957  int nestLevel = 0;
958 
959  if( ii && !( ii%4 ) ) // newline every 4 pts
960  {
961  nestLevel = aNestLevel + 1;
962  m_out->Print( 0, "\n" );
963  }
964 
965  m_out->Print( nestLevel, "%s(xy %s)",
966  nestLevel ? "" : " ", FormatInternalUnits( outline.CPoint( ii ) ).c_str() );
967  }
968 
969  m_out->Print( 0, ")" );
970  }
971  else
972  {
973  wxFAIL_MSG( wxT( "Cannot format invalid polygon." ) );
974  return;
975  }
976  break;
977 
978  case S_CURVE: // Bezier curve
979  m_out->Print( aNestLevel, "(fp_curve (pts (xy %s) (xy %s) (xy %s) (xy %s))",
980  FormatInternalUnits( aModuleDrawing->GetStart0() ).c_str(),
981  FormatInternalUnits( aModuleDrawing->GetBezier0_C1() ).c_str(),
982  FormatInternalUnits( aModuleDrawing->GetBezier0_C2() ).c_str(),
983  FormatInternalUnits( aModuleDrawing->GetEnd0() ).c_str() );
984  break;
985 
986  default:
987  wxFAIL_MSG( wxT( "Cannot format invalid DRAWSEGMENT type." ) );
988  return;
989  };
990 
991  formatLayer( aModuleDrawing );
992 
993  m_out->Print( 0, " (width %s)", FormatInternalUnits( aModuleDrawing->GetWidth() ).c_str() );
994 
995  m_out->Print( 0, ")\n" );
996 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
void formatLayer(const BOARD_ITEM *aItem) const
STROKE_T GetShape() const
polygon (not yet used for tracks, but could be in microwave apps)
usual segment : line with rounded ends
int PointCount() const
Function PointCount()
const wxPoint & GetStart0() const
const VECTOR2I & CPoint(int aIndex) const
Function CPoint()
std::string FormatAngle(double aAngle)
Function FormatAngle converts aAngle from board units to a string appropriate for writing to file.
Definition: base_units.cpp:498
Class SHAPE_POLY_SET.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Returns the reference to aIndex-th outline in the set
Arcs (with rounded ends)
const wxPoint & GetBezier0_C2() const
SHAPE_POLY_SET & GetPolyShape()
Bezier Curve.
int GetWidth() const
double GetAngle() const
Class SHAPE_LINE_CHAIN.
bool IsPolyShapeValid() const
const wxPoint & GetBezier0_C1() const
const wxPoint & GetEnd0() const
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:465

References SHAPE_LINE_CHAIN::CPoint(), FormatAngle(), FormatInternalUnits(), formatLayer(), DRAWSEGMENT::GetAngle(), EDGE_MODULE::GetBezier0_C1(), EDGE_MODULE::GetBezier0_C2(), EDGE_MODULE::GetEnd0(), DRAWSEGMENT::GetPolyShape(), DRAWSEGMENT::GetShape(), EDGE_MODULE::GetStart0(), DRAWSEGMENT::GetWidth(), DRAWSEGMENT::IsPolyShapeValid(), m_out, SHAPE_POLY_SET::Outline(), SHAPE_LINE_CHAIN::PointCount(), OUTPUTFORMATTER::Print(), S_ARC, S_CIRCLE, S_CURVE, S_POLYGON, and S_SEGMENT.

◆ format() [4/11]

void PCB_IO::format ( DRAWSEGMENT aSegment,
int  aNestLevel = 0 
) const
private

Definition at line 845 of file kicad_plugin.cpp.

846 {
847  switch( aSegment->GetShape() )
848  {
849  case S_SEGMENT: // Line
850  m_out->Print( aNestLevel, "(gr_line (start %s) (end %s)",
851  FormatInternalUnits( aSegment->GetStart() ).c_str(),
852  FormatInternalUnits( aSegment->GetEnd() ).c_str() );
853 
854  if( aSegment->GetAngle() != 0.0 )
855  m_out->Print( 0, " (angle %s)", FormatAngle( aSegment->GetAngle() ).c_str() );
856 
857  break;
858 
859  case S_CIRCLE: // Circle
860  m_out->Print( aNestLevel, "(gr_circle (center %s) (end %s)",
861  FormatInternalUnits( aSegment->GetStart() ).c_str(),
862  FormatInternalUnits( aSegment->GetEnd() ).c_str() );
863  break;
864 
865  case S_ARC: // Arc
866  m_out->Print( aNestLevel, "(gr_arc (start %s) (end %s) (angle %s)",
867  FormatInternalUnits( aSegment->GetStart() ).c_str(),
868  FormatInternalUnits( aSegment->GetEnd() ).c_str(),
869  FormatAngle( aSegment->GetAngle() ).c_str() );
870  break;
871 
872  case S_POLYGON: // Polygon
873  if( aSegment->IsPolyShapeValid() )
874  {
875  SHAPE_POLY_SET& poly = aSegment->GetPolyShape();
876  SHAPE_LINE_CHAIN& outline = poly.Outline( 0 );
877  int pointsCount = outline.PointCount();
878 
879  m_out->Print( aNestLevel, "(gr_poly (pts" );
880 
881  for( int ii = 0; ii < pointsCount; ++ii )
882  {
883  m_out->Print( 0, " (xy %s)", FormatInternalUnits( outline.CPoint( ii ) ).c_str() );
884  }
885 
886  m_out->Print( 0, ")" );
887  }
888  else
889  {
890  wxFAIL_MSG( wxT( "Cannot format invalid polygon." ) );
891  return;
892  }
893 
894  break;
895 
896  case S_CURVE: // Bezier curve
897  m_out->Print( aNestLevel, "(gr_curve (pts (xy %s) (xy %s) (xy %s) (xy %s))",
898  FormatInternalUnits( aSegment->GetStart() ).c_str(),
899  FormatInternalUnits( aSegment->GetBezControl1() ).c_str(),
900  FormatInternalUnits( aSegment->GetBezControl2() ).c_str(),
901  FormatInternalUnits( aSegment->GetEnd() ).c_str() );
902  break;
903 
904  default:
905  wxFAIL_MSG( wxT( "Cannot format invalid DRAWSEGMENT type." ) );
906  return;
907  };
908 
909  formatLayer( aSegment );
910 
911  m_out->Print( 0, " (width %s)", FormatInternalUnits( aSegment->GetWidth() ).c_str() );
912 
913  if( aSegment->GetTimeStamp() )
914  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aSegment->GetTimeStamp() );
915 
916  if( aSegment->GetStatus() )
917  m_out->Print( 0, " (status %X)", aSegment->GetStatus() );
918 
919  m_out->Print( 0, ")\n" );
920 }
STATUS_FLAGS GetStatus() const
Definition: base_struct.h:262
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
void formatLayer(const BOARD_ITEM *aItem) const
STROKE_T GetShape() const
polygon (not yet used for tracks, but could be in microwave apps)
usual segment : line with rounded ends
const wxPoint & GetEnd() const
Function GetEnd returns the ending point of the graphic.
int PointCount() const
Function PointCount()
const VECTOR2I & CPoint(int aIndex) const
Function CPoint()
std::string FormatAngle(double aAngle)
Function FormatAngle converts aAngle from board units to a string appropriate for writing to file.
Definition: base_units.cpp:498
Class SHAPE_POLY_SET.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Returns the reference to aIndex-th outline in the set
Arcs (with rounded ends)
timestamp_t GetTimeStamp() const
Definition: base_struct.h:216
SHAPE_POLY_SET & GetPolyShape()
Bezier Curve.
int GetWidth() const
double GetAngle() const
Class SHAPE_LINE_CHAIN.
const wxPoint & GetBezControl2() const
bool IsPolyShapeValid() const
const wxPoint & GetBezControl1() const
const wxPoint & GetStart() const
Function GetStart returns the starting point of the graphic.
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:465

References SHAPE_LINE_CHAIN::CPoint(), FormatAngle(), FormatInternalUnits(), formatLayer(), DRAWSEGMENT::GetAngle(), DRAWSEGMENT::GetBezControl1(), DRAWSEGMENT::GetBezControl2(), DRAWSEGMENT::GetEnd(), DRAWSEGMENT::GetPolyShape(), DRAWSEGMENT::GetShape(), DRAWSEGMENT::GetStart(), EDA_ITEM::GetStatus(), EDA_ITEM::GetTimeStamp(), DRAWSEGMENT::GetWidth(), DRAWSEGMENT::IsPolyShapeValid(), m_out, SHAPE_POLY_SET::Outline(), SHAPE_LINE_CHAIN::PointCount(), OUTPUTFORMATTER::Print(), S_ARC, S_CIRCLE, S_CURVE, S_POLYGON, and S_SEGMENT.

◆ format() [5/11]

void PCB_IO::format ( PCB_TARGET aTarget,
int  aNestLevel = 0 
) const
private

Definition at line 999 of file kicad_plugin.cpp.

1000 {
1001  m_out->Print( aNestLevel, "(target %s (at %s) (size %s)",
1002  ( aTarget->GetShape() ) ? "x" : "plus",
1003  FormatInternalUnits( aTarget->GetPosition() ).c_str(),
1004  FormatInternalUnits( aTarget->GetSize() ).c_str() );
1005 
1006  if( aTarget->GetWidth() != 0 )
1007  m_out->Print( 0, " (width %s)", FormatInternalUnits( aTarget->GetWidth() ).c_str() );
1008 
1009  formatLayer( aTarget );
1010 
1011  if( aTarget->GetTimeStamp() )
1012  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aTarget->GetTimeStamp() );
1013 
1014  m_out->Print( 0, ")\n" );
1015 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
void formatLayer(const BOARD_ITEM *aItem) const
int GetSize() const
int GetWidth() const
timestamp_t GetTimeStamp() const
Definition: base_struct.h:216
int GetShape() const
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:465
const wxPoint GetPosition() const override

References FormatInternalUnits(), formatLayer(), PCB_TARGET::GetPosition(), PCB_TARGET::GetShape(), PCB_TARGET::GetSize(), EDA_ITEM::GetTimeStamp(), PCB_TARGET::GetWidth(), m_out, and OUTPUTFORMATTER::Print().

◆ format() [6/11]

void PCB_IO::format ( MODULE aModule,
int  aNestLevel = 0 
) const
private

Definition at line 1018 of file kicad_plugin.cpp.

1019 {
1020  if( !( m_ctl & CTL_OMIT_INITIAL_COMMENTS ) )
1021  {
1022  const wxArrayString* initial_comments = aModule->GetInitialComments();
1023 
1024  if( initial_comments )
1025  {
1026  for( unsigned i=0; i<initial_comments->GetCount(); ++i )
1027  m_out->Print( aNestLevel, "%s\n", TO_UTF8( (*initial_comments)[i] ) );
1028 
1029  m_out->Print( 0, "\n" ); // improve readability?
1030  }
1031  }
1032 
1033  m_out->Print( aNestLevel, "(module %s",
1034  m_out->Quotes( aModule->GetFPID().Format() ).c_str() );
1035 
1036  if( aModule->IsLocked() )
1037  m_out->Print( 0, " locked" );
1038 
1039  if( aModule->IsPlaced() )
1040  m_out->Print( 0, " placed" );
1041 
1042  formatLayer( aModule );
1043 
1044  m_out->Print( 0, " (tedit %lX)", (unsigned long)aModule->GetLastEditTime() );
1045 
1046  if( !( m_ctl & CTL_OMIT_TSTAMPS ) )
1047  {
1048  m_out->Print( 0, " (tstamp %lX)\n", (unsigned long)aModule->GetTimeStamp() );
1049  }
1050  else
1051  m_out->Print( 0, "\n" );
1052 
1053  if( !( m_ctl & CTL_OMIT_AT ) )
1054  {
1055  m_out->Print( aNestLevel+1, "(at %s", FormatInternalUnits( aModule->GetPosition() ).c_str() );
1056 
1057  if( aModule->GetOrientation() != 0.0 )
1058  m_out->Print( 0, " %s", FormatAngle( aModule->GetOrientation() ).c_str() );
1059 
1060  m_out->Print( 0, ")\n" );
1061  }
1062 
1063  if( !aModule->GetDescription().IsEmpty() )
1064  m_out->Print( aNestLevel+1, "(descr %s)\n",
1065  m_out->Quotew( aModule->GetDescription() ).c_str() );
1066 
1067  if( !aModule->GetKeywords().IsEmpty() )
1068  m_out->Print( aNestLevel+1, "(tags %s)\n",
1069  m_out->Quotew( aModule->GetKeywords() ).c_str() );
1070 
1071  if( !( m_ctl & CTL_OMIT_PATH ) && !!aModule->GetPath() )
1072  m_out->Print( aNestLevel+1, "(path %s)\n",
1073  m_out->Quotew( aModule->GetPath() ).c_str() );
1074 
1075  if( aModule->GetPlacementCost90() != 0 )
1076  m_out->Print( aNestLevel+1, "(autoplace_cost90 %d)\n", aModule->GetPlacementCost90() );
1077 
1078  if( aModule->GetPlacementCost180() != 0 )
1079  m_out->Print( aNestLevel+1, "(autoplace_cost180 %d)\n", aModule->GetPlacementCost180() );
1080 
1081  if( aModule->GetLocalSolderMaskMargin() != 0 )
1082  m_out->Print( aNestLevel+1, "(solder_mask_margin %s)\n",
1083  FormatInternalUnits( aModule->GetLocalSolderMaskMargin() ).c_str() );
1084 
1085  if( aModule->GetLocalSolderPasteMargin() != 0 )
1086  m_out->Print( aNestLevel+1, "(solder_paste_margin %s)\n",
1087  FormatInternalUnits( aModule->GetLocalSolderPasteMargin() ).c_str() );
1088 
1089  if( aModule->GetLocalSolderPasteMarginRatio() != 0 )
1090  m_out->Print( aNestLevel+1, "(solder_paste_ratio %s)\n",
1091  Double2Str( aModule->GetLocalSolderPasteMarginRatio() ).c_str() );
1092 
1093  if( aModule->GetLocalClearance() != 0 )
1094  m_out->Print( aNestLevel+1, "(clearance %s)\n",
1095  FormatInternalUnits( aModule->GetLocalClearance() ).c_str() );
1096 
1097  if( aModule->GetZoneConnection() != PAD_ZONE_CONN_INHERITED )
1098  m_out->Print( aNestLevel+1, "(zone_connect %d)\n", aModule->GetZoneConnection() );
1099 
1100  if( aModule->GetThermalWidth() != 0 )
1101  m_out->Print( aNestLevel+1, "(thermal_width %s)\n",
1102  FormatInternalUnits( aModule->GetThermalWidth() ).c_str() );
1103 
1104  if( aModule->GetThermalGap() != 0 )
1105  m_out->Print( aNestLevel+1, "(thermal_gap %s)\n",
1106  FormatInternalUnits( aModule->GetThermalGap() ).c_str() );
1107 
1108  // Attributes
1109  if( aModule->GetAttributes() != MOD_DEFAULT )
1110  {
1111  m_out->Print( aNestLevel+1, "(attr" );
1112 
1113  if( aModule->GetAttributes() & MOD_CMS )
1114  m_out->Print( 0, " smd" );
1115 
1116  if( aModule->GetAttributes() & MOD_VIRTUAL )
1117  m_out->Print( 0, " virtual" );
1118 
1119  m_out->Print( 0, ")\n" );
1120  }
1121 
1122  Format( (BOARD_ITEM*) &aModule->Reference(), aNestLevel+1 );
1123  Format( (BOARD_ITEM*) &aModule->Value(), aNestLevel+1 );
1124 
1125  // Save drawing elements.
1126  for( auto gr : aModule->GraphicalItems() )
1127  Format( gr, aNestLevel+1 );
1128 
1129  // Save pads.
1130  for( auto pad : aModule->Pads() )
1131  format( pad, aNestLevel+1 );
1132 
1133  // Save 3D info.
1134  auto bs3D = aModule->Models().begin();
1135  auto es3D = aModule->Models().end();
1136 
1137  while( bs3D != es3D )
1138  {
1139  if( !bs3D->m_Filename.IsEmpty() )
1140  {
1141  m_out->Print( aNestLevel+1, "(model %s\n",
1142  m_out->Quotew( bs3D->m_Filename ).c_str() );
1143 
1144  /* Write 3D model offset in mm
1145  * 4.0.x wrote "at" which was actually in inches
1146  * 5.0.x onwards, 3D model offset is written using "offset"
1147  *
1148  * If the offset is all zero, write "at" (fewer file changes)
1149  * Otherwise, write "offset"
1150  */
1151 
1152  wxString offsetTag = "offset";
1153 
1154  if( bs3D->m_Offset.x == 0 &&
1155  bs3D->m_Offset.y == 0 &&
1156  bs3D->m_Offset.z == 0 )
1157  {
1158  offsetTag = "at";
1159  }
1160 
1161  m_out->Print( aNestLevel+2, "(%s (xyz %s %s %s))\n",
1162  offsetTag.ToStdString().c_str(),
1163  Double2Str( bs3D->m_Offset.x ).c_str(),
1164  Double2Str( bs3D->m_Offset.y ).c_str(),
1165  Double2Str( bs3D->m_Offset.z ).c_str() );
1166 
1167  m_out->Print( aNestLevel+2, "(scale (xyz %s %s %s))\n",
1168  Double2Str( bs3D->m_Scale.x ).c_str(),
1169  Double2Str( bs3D->m_Scale.y ).c_str(),
1170  Double2Str( bs3D->m_Scale.z ).c_str() );
1171 
1172  m_out->Print( aNestLevel+2, "(rotate (xyz %s %s %s))\n",
1173  Double2Str( bs3D->m_Rotation.x ).c_str(),
1174  Double2Str( bs3D->m_Rotation.y ).c_str(),
1175  Double2Str( bs3D->m_Rotation.z ).c_str() );
1176 
1177  m_out->Print( aNestLevel+1, ")\n" );
1178  }
1179  ++bs3D;
1180  }
1181 
1182  m_out->Print( aNestLevel, ")\n" );
1183 }
timestamp_t GetLastEditTime() const
Definition: class_module.h:320
int GetAttributes() const
Definition: class_module.h:230
double GetOrientation() const
Definition: class_module.h:193
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
int GetPlacementCost90() const
Definition: class_module.h:526
TEXTE_MODULE & Reference()
Definition: class_module.h:448
#define CTL_OMIT_AT
Omit position and rotation.
void formatLayer(const BOARD_ITEM *aItem) const
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class,...
bool IsPlaced() const
Definition: class_module.h:290
const wxString & GetPath() const
Definition: class_module.h:206
PADS & Pads()
Definition: class_module.h:163
Set for modules listed in the automatic insertion list (usually SMD footprints)
Definition: class_module.h:76
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
const LIB_ID & GetFPID() const
Definition: class_module.h:197
DRAWINGS & GraphicalItems()
Definition: class_module.h:173
int GetLocalSolderMaskMargin() const
Definition: class_module.h:209
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:48
std::string FormatAngle(double aAngle)
Function FormatAngle converts aAngle from board units to a string appropriate for writing to file.
Definition: base_units.cpp:498
int GetLocalClearance() const
Definition: class_module.h:212
TEXTE_MODULE & Value()
read/write accessors:
Definition: class_module.h:447
timestamp_t GetTimeStamp() const
Definition: base_struct.h:216
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:472
#define CTL_OMIT_PATH
Omit component sheet time stamp (useless in library)
const wxArrayString * GetInitialComments() const
Return the initial comments block or NULL if none, without transfer of ownership.
Definition: class_module.h:632
bool IsLocked() const override
Function IsLocked.
Definition: class_module.h:272
const wxString & GetKeywords() const
Definition: class_module.h:203
UTF8 Format() const
Definition: lib_id.cpp:237
int GetLocalSolderPasteMargin() const
Definition: class_module.h:215
default
Definition: class_module.h:75
int GetPlacementCost180() const
Definition: class_module.h:523
virtual std::string Quotes(const std::string &aWrapee)
Function Quotes checks aWrapee input string for a need to be quoted (e.g.
Definition: richio.cpp:433
const wxString & GetDescription() const
Definition: class_module.h:200
double GetLocalSolderPasteMarginRatio() const
Definition: class_module.h:218
std::list< MODULE_3D_SETTINGS > & Models()
Definition: class_module.h:183
Virtual component: when created by copper shapes on board (Like edge card connectors,...
Definition: class_module.h:78
#define CTL_OMIT_TSTAMPS
Omit component time stamp (useless in library)
size_t i
Definition: json11.cpp:597
void format(BOARD *aBoard, int aNestLevel=0) const
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
#define CTL_OMIT_INITIAL_COMMENTS
omit MODULE initial comments
void Format(BOARD_ITEM *aItem, int aNestLevel=0) const
Function Format outputs aItem to aFormatter in s-expression format.
int GetThermalWidth() const
Definition: class_module.h:225
const wxPoint GetPosition() const override
Definition: class_module.h:188
int GetThermalGap() const
Definition: class_module.h:228
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:465
ZoneConnection GetZoneConnection() const
Definition: class_module.h:222

References CTL_OMIT_AT, CTL_OMIT_INITIAL_COMMENTS, CTL_OMIT_PATH, CTL_OMIT_TSTAMPS, Double2Str(), LIB_ID::Format(), Format(), format(), FormatAngle(), FormatInternalUnits(), formatLayer(), MODULE::GetAttributes(), MODULE::GetDescription(), MODULE::GetFPID(), MODULE::GetInitialComments(), MODULE::GetKeywords(), MODULE::GetLastEditTime(), MODULE::GetLocalClearance(), MODULE::GetLocalSolderMaskMargin(), MODULE::GetLocalSolderPasteMargin(), MODULE::GetLocalSolderPasteMarginRatio(), MODULE::GetOrientation(), MODULE::GetPath(), MODULE::GetPlacementCost180(), MODULE::GetPlacementCost90(), MODULE::GetPosition(), MODULE::GetThermalGap(), MODULE::GetThermalWidth(), EDA_ITEM::GetTimeStamp(), MODULE::GetZoneConnection(), MODULE::GraphicalItems(), i, MODULE::IsLocked(), MODULE::IsPlaced(), m_ctl, m_out, MOD_CMS, MOD_DEFAULT, MOD_VIRTUAL, MODULE::Models(), PAD_ZONE_CONN_INHERITED, MODULE::Pads(), OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotes(), OUTPUTFORMATTER::Quotew(), MODULE::Reference(), TO_UTF8, and MODULE::Value().

◆ format() [7/11]

void PCB_IO::format ( D_PAD aPad,
int  aNestLevel = 0 
) const
private

Definition at line 1278 of file kicad_plugin.cpp.

1279 {
1280  const char* shape;
1281 
1282  switch( aPad->GetShape() )
1283  {
1284  case PAD_SHAPE_CIRCLE: shape = "circle"; break;
1285  case PAD_SHAPE_RECT: shape = "rect"; break;
1286  case PAD_SHAPE_OVAL: shape = "oval"; break;
1287  case PAD_SHAPE_TRAPEZOID: shape = "trapezoid"; break;
1289  case PAD_SHAPE_ROUNDRECT: shape = "roundrect"; break;
1290  case PAD_SHAPE_CUSTOM: shape = "custom"; break;
1291 
1292  default:
1293  THROW_IO_ERROR( wxString::Format( _( "unknown pad type: %d"), aPad->GetShape() ) );
1294  }
1295 
1296  const char* type;
1297 
1298  switch( aPad->GetAttribute() )
1299  {
1300  case PAD_ATTRIB_STANDARD: type = "thru_hole"; break;
1301  case PAD_ATTRIB_SMD: type = "smd"; break;
1302  case PAD_ATTRIB_CONN: type = "connect"; break;
1303  case PAD_ATTRIB_HOLE_NOT_PLATED: type = "np_thru_hole"; break;
1304 
1305  default:
1306  THROW_IO_ERROR( wxString::Format( "unknown pad attribute: %d", aPad->GetAttribute() ) );
1307  }
1308 
1309  m_out->Print( aNestLevel, "(pad %s %s %s",
1310  m_out->Quotew( aPad->GetName() ).c_str(),
1311  type, shape );
1312  m_out->Print( 0, " (at %s", FormatInternalUnits( aPad->GetPos0() ).c_str() );
1313 
1314  if( aPad->GetOrientation() != 0.0 )
1315  m_out->Print( 0, " %s", FormatAngle( aPad->GetOrientation() ).c_str() );
1316 
1317  m_out->Print( 0, ")" );
1318  m_out->Print( 0, " (size %s)", FormatInternalUnits( aPad->GetSize() ).c_str() );
1319 
1320  if( (aPad->GetDelta().GetWidth()) != 0 || (aPad->GetDelta().GetHeight() != 0 ) )
1321  m_out->Print( 0, " (rect_delta %s )", FormatInternalUnits( aPad->GetDelta() ).c_str() );
1322 
1323  wxSize sz = aPad->GetDrillSize();
1324  wxPoint shapeoffset = aPad->GetOffset();
1325 
1326  if( (sz.GetWidth() > 0) || (sz.GetHeight() > 0) ||
1327  (shapeoffset.x != 0) || (shapeoffset.y != 0) )
1328  {
1329  m_out->Print( 0, " (drill" );
1330 
1331  if( aPad->GetDrillShape() == PAD_DRILL_SHAPE_OBLONG )
1332  m_out->Print( 0, " oval" );
1333 
1334  if( sz.GetWidth() > 0 )
1335  m_out->Print( 0, " %s", FormatInternalUnits( sz.GetWidth() ).c_str() );
1336 
1337  if( sz.GetHeight() > 0 && sz.GetWidth() != sz.GetHeight() )
1338  m_out->Print( 0, " %s", FormatInternalUnits( sz.GetHeight() ).c_str() );
1339 
1340  if( (shapeoffset.x != 0) || (shapeoffset.y != 0) )
1341  m_out->Print( 0, " (offset %s)", FormatInternalUnits( aPad->GetOffset() ).c_str() );
1342 
1343  m_out->Print( 0, ")" );
1344  }
1345 
1346  formatLayers( aPad->GetLayerSet() );
1347 
1348  // Output the radius ratio for rounded and chamfered rect pads
1349  if( aPad->GetShape() == PAD_SHAPE_ROUNDRECT || aPad->GetShape() == PAD_SHAPE_CHAMFERED_RECT)
1350  {
1351  m_out->Print( 0, " (roundrect_rratio %s)",
1352  Double2Str( aPad->GetRoundRectRadiusRatio() ).c_str() );
1353  }
1354 
1355  // Output the chamfer corners for chamfered rect pads
1356  if( aPad->GetShape() == PAD_SHAPE_CHAMFERED_RECT)
1357  {
1358  m_out->Print( 0, "\n" );
1359 
1360  m_out->Print( aNestLevel+1, "(chamfer_ratio %s)",
1361  Double2Str( aPad->GetChamferRectRatio() ).c_str() );
1362 
1363  m_out->Print( 0, " (chamfer" );
1364 
1365  if( ( aPad->GetChamferPositions() & RECT_CHAMFER_TOP_LEFT ) )
1366  m_out->Print( 0, " top_left" );
1367 
1368  if( ( aPad->GetChamferPositions() & RECT_CHAMFER_TOP_RIGHT ) )
1369  m_out->Print( 0, " top_right" );
1370 
1371  if( ( aPad->GetChamferPositions() & RECT_CHAMFER_BOTTOM_LEFT ) )
1372  m_out->Print( 0, " bottom_left" );
1373 
1375  m_out->Print( 0, " bottom_right" );
1376 
1377  m_out->Print( 0, ")" );
1378  }
1379 
1380  std::string output;
1381 
1382  // Unconnected pad is default net so don't save it.
1383  if( !( m_ctl & CTL_OMIT_NETS ) && aPad->GetNetCode() != NETINFO_LIST::UNCONNECTED )
1384  StrPrintf( &output, " (net %d %s)", m_mapping->Translate( aPad->GetNetCode() ),
1385  m_out->Quotew( aPad->GetNetname() ).c_str() );
1386 
1387  if( aPad->GetPadToDieLength() != 0 )
1388  StrPrintf( &output, " (die_length %s)", FormatInternalUnits( aPad->GetPadToDieLength() ).c_str() );
1389 
1390  if( aPad->GetLocalSolderMaskMargin() != 0 )
1391  StrPrintf( &output, " (solder_mask_margin %s)",
1392  FormatInternalUnits( aPad->GetLocalSolderMaskMargin() ).c_str() );
1393 
1394  if( aPad->GetLocalSolderPasteMargin() != 0 )
1395  StrPrintf( &output, " (solder_paste_margin %s)",
1396  FormatInternalUnits( aPad->GetLocalSolderPasteMargin() ).c_str() );
1397 
1398  if( aPad->GetLocalSolderPasteMarginRatio() != 0 )
1399  StrPrintf( &output, " (solder_paste_margin_ratio %s)",
1400  Double2Str( aPad->GetLocalSolderPasteMarginRatio() ).c_str() );
1401 
1402  if( aPad->GetLocalClearance() != 0 )
1403  StrPrintf( &output, " (clearance %s)", FormatInternalUnits( aPad->GetLocalClearance() ).c_str() );
1404 
1406  StrPrintf( &output, " (zone_connect %d)", aPad->GetZoneConnection() );
1407 
1408  if( aPad->GetThermalWidth() != 0 )
1409  StrPrintf( &output, " (thermal_width %s)", FormatInternalUnits( aPad->GetThermalWidth() ).c_str() );
1410 
1411  if( aPad->GetThermalGap() != 0 )
1412  StrPrintf( &output, " (thermal_gap %s)", FormatInternalUnits( aPad->GetThermalGap() ).c_str() );
1413 
1414  if( output.size() )
1415  {
1416  m_out->Print( 0, "\n" );
1417  m_out->Print( aNestLevel+1, "%s", output.c_str()+1 ); // +1 skips 1st space on 1st element
1418  }
1419 
1420  if( aPad->GetShape() == PAD_SHAPE_CUSTOM )
1421  {
1422  m_out->Print( 0, "\n");
1423  m_out->Print( aNestLevel+1, "(options" );
1424 
1426  m_out->Print( 0, " (clearance convexhull)" );
1427  #if 1 // Set to 1 to output the default option
1428  else
1429  m_out->Print( 0, " (clearance outline)" );
1430  #endif
1431 
1432  // Output the anchor pad shape (circle/rect)
1433  if( aPad->GetAnchorPadShape() == PAD_SHAPE_RECT )
1434  shape = "rect";
1435  else
1436  shape = "circle";
1437 
1438  m_out->Print( 0, " (anchor %s)", shape );
1439 
1440  m_out->Print( 0, ")"); // end of (options ...
1441 
1442  // Output graphic primitive of the pad shape
1443  m_out->Print( 0, "\n");
1444  m_out->Print( aNestLevel+1, "(primitives" );
1445 
1446  int nested_level = aNestLevel+2;
1447 
1448  // Output all basic shapes
1449  for( unsigned icnt = 0; icnt < aPad->GetPrimitives().size(); ++icnt )
1450  {
1451  m_out->Print( 0, "\n");
1452 
1453  const PAD_CS_PRIMITIVE& primitive = aPad->GetPrimitives()[icnt];
1454 
1455  switch( primitive.m_Shape )
1456  {
1457  case S_SEGMENT: // usual segment : line with rounded ends
1458  m_out->Print( nested_level, "(gr_line (start %s) (end %s) (width %s))",
1459  FormatInternalUnits( primitive.m_Start ).c_str(),
1460  FormatInternalUnits( primitive.m_End ).c_str(),
1461  FormatInternalUnits( primitive.m_Thickness ).c_str() );
1462  break;
1463 
1464  case S_ARC: // Arc with rounded ends
1465  m_out->Print( nested_level, "(gr_arc (start %s) (end %s) (angle %s) (width %s))",
1466  FormatInternalUnits( primitive.m_Start ).c_str(),
1467  FormatInternalUnits( primitive.m_End ).c_str(),
1468  FormatAngle( primitive.m_ArcAngle ).c_str(),
1469  FormatInternalUnits( primitive.m_Thickness ).c_str() );
1470  break;
1471 
1472  case S_CIRCLE: // ring or circle (circle if width == 0
1473  m_out->Print( nested_level, "(gr_circle (center %s) (end %s %s) (width %s))",
1474  FormatInternalUnits( primitive.m_Start ).c_str(),
1475  FormatInternalUnits( primitive.m_Start.x + primitive.m_Radius ).c_str(),
1476  FormatInternalUnits( primitive.m_Start.y ).c_str(),
1477  FormatInternalUnits( primitive.m_Thickness ).c_str() );
1478  break;
1479 
1480  case S_CURVE: // Bezier Curve
1481  m_out->Print( aNestLevel, "(gr_curve (pts (xy %s) (xy %s) (xy %s) (xy %s)) (width %s))",
1482  FormatInternalUnits( primitive.m_Start ).c_str(),
1483  FormatInternalUnits( primitive.m_Ctrl1 ).c_str(),
1484  FormatInternalUnits( primitive.m_Ctrl2 ).c_str(),
1485  FormatInternalUnits( primitive.m_End ).c_str(),
1486  FormatInternalUnits( primitive.m_Thickness ).c_str() );
1487  break;
1488 
1489  case S_POLYGON: // polygon
1490  if( primitive.m_Poly.size() < 2 )
1491  break; // Malformed polygon.
1492 
1493  {
1494  m_out->Print( nested_level, "(gr_poly (pts\n");
1495 
1496  // Write the polygon corners coordinates:
1497  const std::vector< wxPoint>& poly = primitive.m_Poly;
1498  int newLine = 0;
1499 
1500  for( unsigned ii = 0; ii < poly.size(); ii++ )
1501  {
1502  if( newLine == 0 )
1503  m_out->Print( nested_level+1, " (xy %s)",
1504  FormatInternalUnits( wxPoint( poly[ii].x, poly[ii].y ) ).c_str() );
1505  else
1506  m_out->Print( 0, " (xy %s)",
1507  FormatInternalUnits( wxPoint( poly[ii].x, poly[ii].y ) ).c_str() );
1508 
1509  if( ++newLine > 4 )
1510  {
1511  newLine = 0;
1512  m_out->Print( 0, "\n" );
1513  }
1514  }
1515 
1516  m_out->Print( 0, ") (width %s))", FormatInternalUnits( primitive.m_Thickness ).c_str() );
1517  }
1518  break;
1519 
1520  default:
1521  break;
1522  }
1523  }
1524 
1525  m_out->Print( 0, "\n");
1526  m_out->Print( aNestLevel+1, ")" ); // end of (basic_shapes
1527  }
1528 
1529  m_out->Print( 0, ")\n" );
1530 }
int GetLocalSolderMaskMargin() const
Definition: class_pad.h:438
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
int GetNetCode() const
Function GetNetCode.
const wxPoint & GetPos0() const
Definition: class_pad.h:278
int StrPrintf(std::string *aResult, const char *aFormat,...)
Function StrPrintf is like sprintf() but the output is appended to a std::string instead of to a char...
Definition: richio.cpp:74
like PAD_STANDARD, but not plated mechanical use only, no connection allowed
Definition: pad_shapes.h:66
PAD_SHAPE_T GetAnchorPadShape() const
Function GetAnchorPadShape.
Definition: class_pad.h:231
wxPoint m_Start
angle of an arc, from its starting point, in 0.1 deg
Definition: class_pad.h:98
polygon (not yet used for tracks, but could be in microwave apps)
int GetPadToDieLength() const
Definition: class_pad.h:436
Smd pad, appears on the solder paste layer (default)
Definition: pad_shapes.h:62
usual segment : line with rounded ends
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
int GetThermalGap() const
Definition: class_pad.cpp:747
int GetLocalClearance() const
Definition: class_pad.h:441
wxPoint m_Ctrl1
is also the start point of the arc
Definition: class_pad.h:100
PAD_ATTR_T GetAttribute() const
Definition: class_pad.h:429
int GetChamferPositions() const
has meaning only for chamfered rect pads
Definition: class_pad.h:693
std::string FormatAngle(double aAngle)
Function FormatAngle converts aAngle from board units to a string appropriate for writing to file.
Definition: base_units.cpp:498
int m_Radius
thickness of segment or outline For filled S_CIRCLE shape, thickness = 0.
Definition: class_pad.h:96
const std::vector< PAD_CS_PRIMITIVE > & GetPrimitives() const
Accessor to the basic shape list.
Definition: class_pad.h:353
std::vector< wxPoint > m_Poly
Bezier Control point 2.
Definition: class_pad.h:102
Arcs (with rounded ends)
const wxPoint & GetOffset() const
Definition: class_pad.h:293
PAD_DRILL_SHAPE_T GetDrillShape() const
Definition: class_pad.h:412
double GetChamferRectRatio() const
has meaning only for chamfered rect pads
Definition: class_pad.h:670
int GetThermalWidth() const
Definition: class_pad.cpp:736
Helper class to handle a primitive (basic shape: polygon, segment, circle or arc) to build a custom p...
Definition: class_pad.h:89
LSET GetLayerSet() const override
Function GetLayerSet returns a "layer mask", which is a bitmap of all layers on which the TRACK segme...
Definition: class_pad.h:426
const wxString & GetName() const
Definition: class_pad.h:195
#define THROW_IO_ERROR(msg)
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:472
Bezier Curve.
const wxSize & GetDelta() const
Definition: class_pad.h:287
const wxString & GetNetname() const
Function GetNetname.
wxPoint m_End
is also the center of the circle and arc
Definition: class_pad.h:99
#define CTL_OMIT_NETS
Omit pads net names (useless in library)
Like smd, does not appear on the solder paste layer (default) note also has a special attribute in Ge...
Definition: pad_shapes.h:63
#define _(s)
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes
STROKE_T m_Shape
Definition: class_pad.h:92
wxPoint m_Ctrl2
Bezier Control point 1.
Definition: class_pad.h:101
CUST_PAD_SHAPE_IN_ZONE GetCustomShapeInZoneOpt() const
Definition: class_pad.h:237
int m_Thickness
S_SEGMENT, S_ARC, S_CIRCLE, S_POLYGON only (same as DRAWSEGMENT)
Definition: class_pad.h:93
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
double GetOrientation() const
Function GetOrientation returns the rotation angle of the pad in tenths of degrees,...
Definition: class_pad.h:406
const wxSize & GetDrillSize() const
Definition: class_pad.h:290
double GetRoundRectRadiusRatio() const
has meaning only for rounded rect pads
Definition: class_pad.h:644
PAD_SHAPE_T GetShape() const
Function GetShape.
Definition: class_pad.h:221
void formatLayers(LSET aLayerMask, int aNestLevel=0) const
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
ZoneConnection GetZoneConnection() const
Definition: class_pad.cpp:725
const wxSize & GetSize() const
Definition: class_pad.h:284
int GetLocalSolderPasteMargin() const
Definition: class_pad.h:444
static const int UNCONNECTED
Constant that holds the "unconnected net" number (typically 0) all items "connected" to this net are ...
Definition: netinfo.h:463
double m_ArcAngle
radius of a circle
Definition: class_pad.h:97
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:465
double GetLocalSolderPasteMarginRatio() const
Definition: class_pad.h:447
int Translate(int aNetCode) const
Function Translate Translates net number according to the map prepared by Update() function.

References _, CTL_OMIT_NETS, CUST_PAD_SHAPE_IN_ZONE_CONVEXHULL, Double2Str(), Format(), FormatAngle(), FormatInternalUnits(), formatLayers(), D_PAD::GetAnchorPadShape(), D_PAD::GetAttribute(), D_PAD::GetChamferPositions(), D_PAD::GetChamferRectRatio(), D_PAD::GetCustomShapeInZoneOpt(), D_PAD::GetDelta(), D_PAD::GetDrillShape(), D_PAD::GetDrillSize(), D_PAD::GetLayerSet(), D_PAD::GetLocalClearance(), D_PAD::GetLocalSolderMaskMargin(), D_PAD::GetLocalSolderPasteMargin(), D_PAD::GetLocalSolderPasteMarginRatio(), D_PAD::GetName(), BOARD_CONNECTED_ITEM::GetNetCode(), BOARD_CONNECTED_ITEM::GetNetname(), D_PAD::GetOffset(), D_PAD::GetOrientation(), D_PAD::GetPadToDieLength(), D_PAD::GetPos0(), D_PAD::GetPrimitives(), D_PAD::GetRoundRectRadiusRatio(), D_PAD::GetShape(), D_PAD::GetSize(), D_PAD::GetThermalGap(), D_PAD::GetThermalWidth(), D_PAD::GetZoneConnection(), PAD_CS_PRIMITIVE::m_ArcAngle, m_ctl, PAD_CS_PRIMITIVE::m_Ctrl1, PAD_CS_PRIMITIVE::m_Ctrl2, PAD_CS_PRIMITIVE::m_End, m_mapping, m_out, PAD_CS_PRIMITIVE::m_Poly, PAD_CS_PRIMITIVE::m_Radius, PAD_CS_PRIMITIVE::m_Shape, PAD_CS_PRIMITIVE::m_Start, PAD_CS_PRIMITIVE::m_Thickness, PAD_ATTRIB_CONN, PAD_ATTRIB_HOLE_NOT_PLATED, PAD_ATTRIB_SMD, PAD_ATTRIB_STANDARD, PAD_DRILL_SHAPE_OBLONG, PAD_SHAPE_CHAMFERED_RECT, PAD_SHAPE_CIRCLE, PAD_SHAPE_CUSTOM, PAD_SHAPE_OVAL, PAD_SHAPE_RECT, PAD_SHAPE_ROUNDRECT, PAD_SHAPE_TRAPEZOID, PAD_ZONE_CONN_INHERITED, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), RECT_CHAMFER_BOTTOM_LEFT, RECT_CHAMFER_BOTTOM_RIGHT, RECT_CHAMFER_TOP_LEFT, RECT_CHAMFER_TOP_RIGHT, S_ARC, S_CIRCLE, S_CURVE, S_POLYGON, S_SEGMENT, numEval::StrPrintf(), THROW_IO_ERROR, NETINFO_MAPPING::Translate(), and NETINFO_LIST::UNCONNECTED.

◆ format() [8/11]

void PCB_IO::format ( TEXTE_PCB aText,
int  aNestLevel = 0 
) const
private

Definition at line 1533 of file kicad_plugin.cpp.

1534 {
1535  m_out->Print( aNestLevel, "(gr_text %s (at %s",
1536  m_out->Quotew( aText->GetText() ).c_str(),
1537  FormatInternalUnits( aText->GetTextPos() ).c_str() );
1538 
1539  if( aText->GetTextAngle() != 0.0 )
1540  m_out->Print( 0, " %s", FormatAngle( aText->GetTextAngle() ).c_str() );
1541 
1542  m_out->Print( 0, ")" );
1543 
1544  formatLayer( aText );
1545 
1546  if( aText->GetTimeStamp() )
1547  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aText->GetTimeStamp() );
1548 
1549  m_out->Print( 0, "\n" );
1550 
1551  aText->EDA_TEXT::Format( m_out, aNestLevel, m_ctl );
1552 
1553  m_out->Print( aNestLevel, ")\n" );
1554 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
void formatLayer(const BOARD_ITEM *aItem) const
double GetTextAngle() const
Definition: eda_text.h:158
std::string FormatAngle(double aAngle)
Function FormatAngle converts aAngle from board units to a string appropriate for writing to file.
Definition: base_units.cpp:498
timestamp_t GetTimeStamp() const
Definition: base_struct.h:216
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:472
const wxPoint & GetTextPos() const
Definition: eda_text.h:230
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
virtual const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:124
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:465

References FormatAngle(), FormatInternalUnits(), formatLayer(), EDA_TEXT::GetText(), EDA_TEXT::GetTextAngle(), EDA_TEXT::GetTextPos(), EDA_ITEM::GetTimeStamp(), m_ctl, m_out, OUTPUTFORMATTER::Print(), and OUTPUTFORMATTER::Quotew().

◆ format() [9/11]

void PCB_IO::format ( TEXTE_MODULE aText,
int  aNestLevel = 0 
) const
private

Definition at line 1557 of file kicad_plugin.cpp.

1558 {
1559  std::string type;
1560 
1561  switch( aText->GetType() )
1562  {
1563  case TEXTE_MODULE::TEXT_is_REFERENCE: type = "reference"; break;
1564  case TEXTE_MODULE::TEXT_is_VALUE: type = "value"; break;
1565  case TEXTE_MODULE::TEXT_is_DIVERS: type = "user";
1566  }
1567 
1568  m_out->Print( aNestLevel, "(fp_text %s %s (at %s", type.c_str(),
1569  m_out->Quotew( aText->GetText() ).c_str(),
1570  FormatInternalUnits( aText->GetPos0() ).c_str() );
1571 
1572  // Due to Pcbnew history, fp_text angle is saved as an absolute on screen angle,
1573  // but internally the angle is held relative to its parent footprint. parent
1574  // may be NULL when saving a footprint outside a BOARD.
1575  double orient = aText->GetTextAngle();
1576  MODULE* parent = (MODULE*) aText->GetParent();
1577 
1578  if( parent )
1579  {
1580  // GetTextAngle() is always in -360..+360 range because of
1581  // TEXTE_MODULE::SetTextAngle(), but summing that angle with an
1582  // additional board angle could kick sum up >= 360 or <= -360, so to have
1583  // consistent results, normalize again for the BOARD save. A footprint
1584  // save does not use this code path since parent is NULL.
1585 #if 0
1586  // This one could be considered reasonable if you like positive angles
1587  // in your board text.
1588  orient = NormalizeAnglePos( orient + parent->GetOrientation() );
1589 #else
1590  // Choose compatibility for now, even though this is only a 720 degree clamp
1591  // with two possible values for every angle.
1592  orient = NormalizeAngle360Min( orient + parent->GetOrientation() );
1593 #endif
1594  }
1595 
1596  if( orient != 0.0 )
1597  m_out->Print( 0, " %s", FormatAngle( orient ).c_str() );
1598 
1599  if( !aText->IsKeepUpright() )
1600  m_out->Print( 0, " unlocked" );
1601 
1602  m_out->Print( 0, ")" );
1603  formatLayer( aText );
1604 
1605  if( !aText->IsVisible() )
1606  m_out->Print( 0, " hide" );
1607 
1608  m_out->Print( 0, "\n" );
1609 
1610  aText->EDA_TEXT::Format( m_out, aNestLevel, m_ctl | CTL_OMIT_HIDE );
1611 
1612  m_out->Print( aNestLevel, ")\n" );
1613 }
double GetOrientation() const
Definition: class_module.h:193
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
void formatLayer(const BOARD_ITEM *aItem) const
bool IsVisible() const
Definition: eda_text.h:170
double GetTextAngle() const
Definition: eda_text.h:158
bool IsKeepUpright()
std::string FormatAngle(double aAngle)
Function FormatAngle converts aAngle from board units to a string appropriate for writing to file.
Definition: base_units.cpp:498
TEXT_TYPE GetType() const
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:472
const wxPoint & GetPos0() const
T NormalizeAnglePos(T Angle)
Normalize angle to be in the 0.0 .
Definition: trigo.h:244
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
T NormalizeAngle360Min(T Angle)
Normalize angle to be > -360.0 and < 360.0 Angle equal to -360 or +360 are set to 0.
Definition: trigo.h:233
BOARD_ITEM_CONTAINER * GetParent() const
#define CTL_OMIT_HIDE
Definition: eda_text.h:39
virtual const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:124
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:465

References CTL_OMIT_HIDE, FormatAngle(), FormatInternalUnits(), formatLayer(), MODULE::GetOrientation(), BOARD_ITEM::GetParent(), TEXTE_MODULE::GetPos0(), EDA_TEXT::GetText(), EDA_TEXT::GetTextAngle(), TEXTE_MODULE::GetType(), TEXTE_MODULE::IsKeepUpright(), EDA_TEXT::IsVisible(), m_ctl, m_out, NormalizeAngle360Min(), NormalizeAnglePos(), OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), TEXTE_MODULE::TEXT_is_DIVERS, TEXTE_MODULE::TEXT_is_REFERENCE, and TEXTE_MODULE::TEXT_is_VALUE.

◆ format() [10/11]

void PCB_IO::format ( TRACK aTrack,
int  aNestLevel = 0 
) const
private

Definition at line 1616 of file kicad_plugin.cpp.

1617 {
1618  if( aTrack->Type() == PCB_VIA_T )
1619  {
1620  PCB_LAYER_ID layer1, layer2;
1621 
1622  const VIA* via = static_cast<const VIA*>( aTrack );
1623  BOARD* board = (BOARD*) via->GetParent();
1624 
1625  wxCHECK_RET( board != 0, wxT( "Via " ) + via->GetSelectMenuText( MILLIMETRES ) +
1626  wxT( " has no parent." ) );
1627 
1628  m_out->Print( aNestLevel, "(via" );
1629 
1630  via->LayerPair( &layer1, &layer2 );
1631 
1632  switch( via->GetViaType() )
1633  {
1634  case VIA_THROUGH: // Default shape not saved.
1635  break;
1636 
1637  case VIA_BLIND_BURIED:
1638  m_out->Print( 0, " blind" );
1639  break;
1640 
1641  case VIA_MICROVIA:
1642  m_out->Print( 0, " micro" );
1643  break;
1644 
1645  default:
1646  THROW_IO_ERROR( wxString::Format( _( "unknown via type %d" ), via->GetViaType() ) );
1647  }
1648 
1649  m_out->Print( 0, " (at %s) (size %s)",
1650  FormatInternalUnits( aTrack->GetStart() ).c_str(),
1651  FormatInternalUnits( aTrack->GetWidth() ).c_str() );
1652 
1653  if( via->GetDrill() != UNDEFINED_DRILL_DIAMETER )
1654  m_out->Print( 0, " (drill %s)", FormatInternalUnits( via->GetDrill() ).c_str() );
1655 
1656  m_out->Print( 0, " (layers %s %s)",
1657  m_out->Quotew( m_board->GetLayerName( layer1 ) ).c_str(),
1658  m_out->Quotew( m_board->GetLayerName( layer2 ) ).c_str() );
1659  }
1660  else
1661  {
1662  m_out->Print( aNestLevel, "(segment (start %s) (end %s) (width %s)",
1663  FormatInternalUnits( aTrack->GetStart() ).c_str(), FormatInternalUnits( aTrack->GetEnd() ).c_str(),
1664  FormatInternalUnits( aTrack->GetWidth() ).c_str() );
1665 
1666  m_out->Print( 0, " (layer %s)", m_out->Quotew( aTrack->GetLayerName() ).c_str() );
1667  }
1668 
1669  m_out->Print( 0, " (net %d)", m_mapping->Translate( aTrack->GetNetCode() ) );
1670 
1671  if( aTrack->GetTimeStamp() != 0 )
1672  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aTrack->GetTimeStamp() );
1673 
1674  if( aTrack->GetStatus() != 0 )
1675  m_out->Print( 0, " (status %X)", aTrack->GetStatus() );
1676 
1677  m_out->Print( 0, ")\n" );
1678 }
void LayerPair(PCB_LAYER_ID *top_layer, PCB_LAYER_ID *bottom_layer) const
Function LayerPair Return the 2 layers used by the via (the via actually uses all layers between thes...
STATUS_FLAGS GetStatus() const
Definition: base_struct.h:262
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
int GetNetCode() const
Function GetNetCode.
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Function GetLayerName returns the name of a layer given by aLayer.
const wxPoint & GetStart() const
Definition: class_track.h:109
PCB_LAYER_ID
A quick note on layer IDs:
int GetDrill() const
Function GetDrill returns the local drill setting for this VIA.
Definition: class_track.h:361
timestamp_t GetTimeStamp() const
Definition: base_struct.h:216
VIATYPE_T GetViaType() const
Definition: class_track.h:346
#define THROW_IO_ERROR(msg)
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:472
#define UNDEFINED_DRILL_DIAMETER
Definition: class_track.h:69
wxString GetSelectMenuText(EDA_UNITS_T aUnits) const override
Function GetSelectMenuText returns the text to display to be used in the selection clarification cont...
Definition: class_track.cpp:89
#define _(s)
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes
int GetWidth() const
Definition: class_track.h:103
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
Class BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:161
BOARD * m_board
which BOARD, no ownership here
const wxPoint & GetEnd() const
Definition: class_track.h:106
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:96
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
BOARD_ITEM_CONTAINER * GetParent() const
wxString GetLayerName() const
Function GetLayerName returns the name of the PCB layer on which the item resides.
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:465
int Translate(int aNetCode) const
Function Translate Translates net number according to the map prepared by Update() function.
KICAD_T Type() const
Function Type()
Definition: base_struct.h:210

References _, Format(), FormatInternalUnits(), VIA::GetDrill(), TRACK::GetEnd(), BOARD_ITEM::GetLayerName(), BOARD::GetLayerName(), BOARD_CONNECTED_ITEM::GetNetCode(), BOARD_ITEM::GetParent(), VIA::GetSelectMenuText(), TRACK::GetStart(), EDA_ITEM::GetStatus(), EDA_ITEM::GetTimeStamp(), VIA::GetViaType(), TRACK::GetWidth(), VIA::LayerPair(), m_board, m_mapping, m_out, MILLIMETRES, PCB_VIA_T, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), THROW_IO_ERROR, NETINFO_MAPPING::Translate(), EDA_ITEM::Type(), UNDEFINED_DRILL_DIAMETER, VIA_BLIND_BURIED, VIA_MICROVIA, and VIA_THROUGH.

◆ format() [11/11]

void PCB_IO::format ( ZONE_CONTAINER aZone,
int  aNestLevel = 0 
) const
private

Definition at line 1681 of file kicad_plugin.cpp.

1682 {
1683  // Save the NET info; For keepout zones, net code and net name are irrelevant
1684  // so be sure a dummy value is stored, just for ZONE_CONTAINER compatibility
1685  // (perhaps netcode and netname should be not stored)
1686  m_out->Print( aNestLevel, "(zone (net %d) (net_name %s)",
1687  aZone->GetIsKeepout() ? 0 : m_mapping->Translate( aZone->GetNetCode() ),
1688  m_out->Quotew( aZone->GetIsKeepout() ? wxT("") : aZone->GetNetname() ).c_str() );
1689 
1690  // If a zone exists on multiple layers, format accordingly
1691  if( aZone->GetLayerSet().count() > 1 )
1692  {
1693  formatLayers( aZone->GetLayerSet() );
1694  }
1695  else
1696  {
1697  formatLayer( aZone );
1698  }
1699 
1700  m_out->Print( 0, " (tstamp %lX)", (unsigned long) aZone->GetTimeStamp() );
1701 
1702  // Save the outline aux info
1703  std::string hatch;
1704 
1705  switch( aZone->GetHatchStyle() )
1706  {
1707  default:
1708  case ZONE_CONTAINER::NO_HATCH: hatch = "none"; break;
1709  case ZONE_CONTAINER::DIAGONAL_EDGE: hatch = "edge"; break;
1710  case ZONE_CONTAINER::DIAGONAL_FULL: hatch = "full"; break;
1711  }
1712 
1713  m_out->Print( 0, " (hatch %s %s)\n", hatch.c_str(),
1714  FormatInternalUnits( aZone->GetHatchPitch() ).c_str() );
1715 
1716  if( aZone->GetPriority() > 0 )
1717  m_out->Print( aNestLevel+1, "(priority %d)\n", aZone->GetPriority() );
1718 
1719  m_out->Print( aNestLevel+1, "(connect_pads" );
1720 
1721  switch( aZone->GetPadConnection() )
1722  {
1723  default:
1724  case PAD_ZONE_CONN_THERMAL: // Default option not saved or loaded.
1725  break;
1726 
1728  m_out->Print( 0, " thru_hole_only" );
1729  break;
1730 
1731  case PAD_ZONE_CONN_FULL:
1732  m_out->Print( 0, " yes" );
1733  break;
1734 
1735  case PAD_ZONE_CONN_NONE:
1736  m_out->Print( 0, " no" );
1737  break;
1738  }
1739 
1740  m_out->Print( 0, " (clearance %s))\n",
1741  FormatInternalUnits( aZone->GetZoneClearance() ).c_str() );
1742 
1743  m_out->Print( aNestLevel+1, "(min_thickness %s)",
1744  FormatInternalUnits( aZone->GetMinThickness() ).c_str() );
1745 
1746  // write it only if V 6.O version option is not used (i.e. do not write if the
1747  // "legacy" algorithm is used)
1748  if( !aZone->GetFilledPolysUseThickness() )
1749  m_out->Print( 0, " (filled_areas_thickness no)" );
1750 
1751  m_out->Print( 0, "\n" );
1752 
1753  if( aZone->GetIsKeepout() )
1754  {
1755  m_out->Print( aNestLevel+1, "(keepout (tracks %s) (vias %s) (copperpour %s))\n",
1756  aZone->GetDoNotAllowTracks() ? "not_allowed" : "allowed",
1757  aZone->GetDoNotAllowVias() ? "not_allowed" : "allowed",
1758  aZone->GetDoNotAllowCopperPour() ? "not_allowed" : "allowed" );
1759  }
1760 
1761  m_out->Print( aNestLevel+1, "(fill" );
1762 
1763  // Default is not filled.
1764  if( aZone->IsFilled() )
1765  m_out->Print( 0, " yes" );
1766 
1767  // Default is polygon filled.
1768  if( aZone->GetFillMode() == ZFM_HATCH_PATTERN )
1769  m_out->Print( 0, " (mode hatch)" );
1770 
1771  m_out->Print( 0, " (thermal_gap %s) (thermal_bridge_width %s)",
1772  FormatInternalUnits( aZone->GetThermalReliefGap() ).c_str(),
1773  FormatInternalUnits( aZone->GetThermalReliefCopperBridge() ).c_str() );
1774 
1776  {
1777  m_out->Print( 0, " (smoothing" );
1778 
1779  switch( aZone->GetCornerSmoothingType() )
1780  {
1782  m_out->Print( 0, " chamfer" );
1783  break;
1784 
1786  m_out->Print( 0, " fillet" );
1787  break;
1788 
1789  default:
1790  THROW_IO_ERROR( wxString::Format( _( "unknown zone corner smoothing type %d" ),
1791  aZone->GetCornerSmoothingType() ) );
1792  }
1793  m_out->Print( 0, ")" );
1794 
1795  if( aZone->GetCornerRadius() != 0 )
1796  m_out->Print( 0, " (radius %s)",
1797  FormatInternalUnits( aZone->GetCornerRadius() ).c_str() );
1798  }
1799 
1800  if( aZone->GetFillMode() == ZFM_HATCH_PATTERN )
1801  {
1802  m_out->Print( 0, "\n" );
1803  m_out->Print( aNestLevel+2, "(hatch_thickness %s) (hatch_gap %s) (hatch_orientation %s)",
1804  FormatInternalUnits( aZone->GetHatchFillTypeThickness() ).c_str(),
1805  FormatInternalUnits( aZone->GetHatchFillTypeGap() ).c_str(),
1806  Double2Str( aZone->GetHatchFillTypeOrientation() ).c_str() );
1807 
1808  if( aZone->GetHatchFillTypeSmoothingLevel() > 0 )
1809  {
1810  m_out->Print( 0, "\n" );
1811  m_out->Print( aNestLevel+2, "(hatch_smoothing_level %d) (hatch_smoothing_value %s)",
1813  Double2Str( aZone->GetHatchFillTypeSmoothingValue() ).c_str() );
1814  }
1815  }
1816 
1817  m_out->Print( 0, ")\n" );
1818 
1819  int newLine = 0;
1820 
1821  if( aZone->GetNumCorners() )
1822  {
1823  bool new_polygon = true;
1824  bool is_closed = false;
1825 
1826  for( auto iterator = aZone->IterateWithHoles(); iterator; iterator++ )
1827  {
1828  if( new_polygon )
1829  {
1830  newLine = 0;
1831  m_out->Print( aNestLevel+1, "(polygon\n" );
1832  m_out->Print( aNestLevel+2, "(pts\n" );
1833  new_polygon = false;
1834  is_closed = false;
1835  }
1836 
1837  if( newLine == 0 )
1838  m_out->Print( aNestLevel+3, "(xy %s %s)",
1839  FormatInternalUnits( iterator->x ).c_str(), FormatInternalUnits( iterator->y ).c_str() );
1840  else
1841  m_out->Print( 0, " (xy %s %s)",
1842  FormatInternalUnits( iterator->x ).c_str(), FormatInternalUnits( iterator->y ).c_str() );
1843 
1844  if( newLine < 4 )
1845  {
1846  newLine += 1;
1847  }
1848  else
1849  {
1850  newLine = 0;
1851  m_out->Print( 0, "\n" );
1852  }
1853 
1854  if( iterator.IsEndContour() )
1855  {
1856  is_closed = true;
1857 
1858  if( newLine != 0 )
1859  m_out->Print( 0, "\n" );
1860 
1861  m_out->Print( aNestLevel+2, ")\n" );
1862  m_out->Print( aNestLevel+1, ")\n" );
1863  new_polygon = true;
1864  }
1865  }
1866 
1867  if( !is_closed ) // Should not happen, but...
1868  m_out->Print( aNestLevel+1, ")\n" );
1869 
1870  }
1871 
1872  // Save the PolysList (filled areas)
1873  const SHAPE_POLY_SET& fv = aZone->GetFilledPolysList();
1874  newLine = 0;
1875 
1876  if( !fv.IsEmpty() )
1877  {
1878  bool new_polygon = true;
1879  bool is_closed = false;
1880 
1881  for( auto it = fv.CIterate(); it; ++it )
1882  {
1883  if( new_polygon )
1884  {
1885  newLine = 0;
1886  m_out->Print( aNestLevel+1, "(filled_polygon\n" );
1887  m_out->Print( aNestLevel+2, "(pts\n" );
1888  new_polygon = false;
1889  is_closed = false;
1890  }
1891 
1892  if( newLine == 0 )
1893  m_out->Print( aNestLevel+3, "(xy %s %s)",
1894  FormatInternalUnits( it->x ).c_str(), FormatInternalUnits( it->y ).c_str() );
1895  else
1896  m_out->Print( 0, " (xy %s %s)",
1897  FormatInternalUnits( it->x ) .c_str(), FormatInternalUnits( it->y ).c_str() );
1898 
1899  if( newLine < 4 )
1900  {
1901  newLine += 1;
1902  }
1903  else
1904  {
1905  newLine = 0;
1906  m_out->Print( 0, "\n" );
1907  }
1908 
1909  if( it.IsEndContour() )
1910  {
1911  is_closed = true;
1912 
1913  if( newLine != 0 )
1914  m_out->Print( 0, "\n" );
1915 
1916  m_out->Print( aNestLevel+2, ")\n" );
1917  m_out->Print( aNestLevel+1, ")\n" );
1918  new_polygon = true;
1919  }
1920  }
1921 
1922  if( !is_closed ) // Should not happen, but...
1923  m_out->Print( aNestLevel+1, ")\n" );
1924  }
1925 
1926  // Save the filling segments list
1927  const auto& segs = aZone->FillSegments();
1928 
1929  if( segs.size() )
1930  {
1931  m_out->Print( aNestLevel+1, "(fill_segments\n" );
1932 
1933  for( ZONE_SEGMENT_FILL::const_iterator it = segs.begin(); it != segs.end(); ++it )
1934  {
1935  m_out->Print( aNestLevel+2, "(pts (xy %s) (xy %s))\n",
1936  FormatInternalUnits( wxPoint( it->A ) ).c_str(),
1937  FormatInternalUnits( wxPoint( it->B ) ).c_str() );
1938  }
1939 
1940  m_out->Print( aNestLevel+1, ")\n" );
1941  }
1942 
1943  m_out->Print( aNestLevel, ")\n" );
1944 }
bool IsFilled() const
Definition: class_zone.h:164
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
int GetNetCode() const
Function GetNetCode.
void formatLayer(const BOARD_ITEM *aItem) const
int GetThermalReliefCopperBridge(D_PAD *aPad=NULL) const
Definition: class_zone.cpp:499
int GetHatchFillTypeThickness() const
Definition: class_zone.h:185
bool IsEmpty() const
Returns true if the set is empty (no polygons at all)
ZONE_SEGMENT_FILL & FillSegments()
Definition: class_zone.h:234
bool GetFilledPolysUseThickness() const
Definition: class_zone.h:589
double GetHatchFillTypeOrientation() const
Definition: class_zone.h:191
double GetHatchFillTypeSmoothingValue() const
Definition: class_zone.h:197
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
int GetThermalReliefGap(D_PAD *aPad=NULL) const
Definition: class_zone.cpp:490
bool GetDoNotAllowVias() const
Definition: class_zone.h:623
Pads are not covered.
Definition: zones.h:52
virtual LSET GetLayerSet() const override
Function GetLayerSet returns a "layer mask", which is a bitmap of all layers on which the TRACK segme...
Definition: class_zone.cpp:234
HATCH_STYLE GetHatchStyle() const
Definition: class_zone.h:510
unsigned int GetCornerRadius() const
Definition: class_zone.h:587
Class SHAPE_POLY_SET.
ZONE_FILL_MODE GetFillMode() const
Definition: class_zone.h:150
bool GetDoNotAllowCopperPour() const
Definition: class_zone.h:622
timestamp_t GetTimeStamp() const
Definition: base_struct.h:216
int GetNumCorners(void) const
Access to m_Poly parameters.
Definition: class_zone.h:422
#define THROW_IO_ERROR(msg)
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:472
#define _(s)
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes
CONST_ITERATOR CIterate(int aFirst, int aLast, bool aIterateHoles=false) const
int GetCornerSmoothingType() const
Definition: class_zone.h:583
Thermal relief only for THT pads.
Definition: zones.h:55
bool GetIsKeepout() const
Accessors to parameters used in Keepout zones:
Definition: class_zone.h:621
unsigned GetPriority() const
Function GetPriority.
Definition: class_zone.h:94
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
ZoneConnection GetPadConnection(D_PAD *aPad=NULL) const
Definition: class_zone.cpp:852
SHAPE_POLY_SET::ITERATOR IterateWithHoles()
Function IterateWithHoles returns an iterator to visit all points of the zone's main outline with hol...
Definition: class_zone.h:442
int GetHatchPitch() const
Hatch related methods.
Definition: class_zone.cpp:937
int GetMinThickness() const
Definition: class_zone.h:176
bool GetDoNotAllowTracks() const
Definition: class_zone.h:624
int GetHatchFillTypeSmoothingLevel() const
Definition: class_zone.h:194
void formatLayers(LSET aLayerMask, int aNestLevel=0) const
int GetZoneClearance() const
Definition: class_zone.h:170
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
int GetHatchFillTypeGap() const
Definition: class_zone.h:188
Use thermal relief for pads.
Definition: zones.h:53
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:465
int Translate(int aNetCode) const
Function Translate Translates net number according to the map prepared by Update() function.
pads are covered by copper
Definition: zones.h:54
const SHAPE_POLY_SET & GetFilledPolysList() const
Function GetFilledPolysList returns a reference to the list of filled polygons.
Definition: class_zone.h:543

References _, SHAPE_POLY_SET::CIterate(), ZONE_CONTAINER::DIAGONAL_EDGE, ZONE_CONTAINER::DIAGONAL_FULL, Double2Str(), ZONE_CONTAINER::FillSegments(), Format(), FormatInternalUnits(), formatLayer(), formatLayers(), ZONE_CONTAINER::GetCornerRadius(), ZONE_CONTAINER::GetCornerSmoothingType(), ZONE_CONTAINER::GetDoNotAllowCopperPour(), ZONE_CONTAINER::GetDoNotAllowTracks(), ZONE_CONTAINER::GetDoNotAllowVias(), ZONE_CONTAINER::GetFilledPolysList(), ZONE_CONTAINER::GetFilledPolysUseThickness(), ZONE_CONTAINER::GetFillMode(), ZONE_CONTAINER::GetHatchFillTypeGap(), ZONE_CONTAINER::GetHatchFillTypeOrientation(), ZONE_CONTAINER::GetHatchFillTypeSmoothingLevel(), ZONE_CONTAINER::GetHatchFillTypeSmoothingValue(), ZONE_CONTAINER::GetHatchFillTypeThickness(), ZONE_CONTAINER::GetHatchPitch(), ZONE_CONTAINER::GetHatchStyle(), ZONE_CONTAINER::GetIsKeepout(), ZONE_CONTAINER::GetLayerSet(), ZONE_CONTAINER::GetMinThickness(), BOARD_CONNECTED_ITEM::GetNetCode(), BOARD_CONNECTED_ITEM::GetNetname(), ZONE_CONTAINER::GetNumCorners(), ZONE_CONTAINER::GetPadConnection(), ZONE_CONTAINER::GetPriority(), ZONE_CONTAINER::GetThermalReliefCopperBridge(), ZONE_CONTAINER::GetThermalReliefGap(), EDA_ITEM::GetTimeStamp(), ZONE_CONTAINER::GetZoneClearance(), SHAPE_POLY_SET::IsEmpty(), ZONE_CONTAINER::IsFilled(), ZONE_CONTAINER::IterateWithHoles(), m_mapping, m_out, ZONE_CONTAINER::NO_HATCH, PAD_ZONE_CONN_FULL, PAD_ZONE_CONN_NONE, PAD_ZONE_CONN_THERMAL, PAD_ZONE_CONN_THT_THERMAL, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), ZONE_SETTINGS::SMOOTHING_CHAMFER, ZONE_SETTINGS::SMOOTHING_FILLET, ZONE_SETTINGS::SMOOTHING_NONE, THROW_IO_ERROR, NETINFO_MAPPING::Translate(), and ZFM_HATCH_PATTERN.

◆ formatBoardLayers()

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

formats the board layer information

Definition at line 651 of file kicad_plugin.cpp.

652 {
653  m_out->Print( aNestLevel, "(layers\n" );
654 
655  // Save only the used copper layers from front to back.
656  LSET visible_layers = aBoard->GetVisibleLayers();
657 
658  for( LSEQ cu = aBoard->GetEnabledLayers().CuStack(); cu; ++cu )
659  {
660  PCB_LAYER_ID layer = *cu;
661 
662  m_out->Print( aNestLevel+1, "(%d %s %s", layer,
663  m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str(),
664  LAYER::ShowType( aBoard->GetLayerType( layer ) ) );
665 
666  if( !visible_layers[layer] )
667  m_out->Print( 0, " hide" );
668 
669  m_out->Print( 0, ")\n" );
670  }
671 
672  // Save used non-copper layers in the order they are defined.
673  // desired sequence for non Cu BOARD layers.
674  static const PCB_LAYER_ID non_cu[] =
675  {
676  B_Adhes, // 32
677  F_Adhes,
678  B_Paste,
679  F_Paste,
680  B_SilkS,
681  F_SilkS,
682  B_Mask,
683  F_Mask,
684  Dwgs_User,
685  Cmts_User,
686  Eco1_User,
687  Eco2_User,
688  Edge_Cuts,
689  Margin,
690  B_CrtYd,
691  F_CrtYd,
692  B_Fab,
693  F_Fab
694  };
695 
696  for( LSEQ seq = aBoard->GetEnabledLayers().Seq( non_cu, arrayDim( non_cu ) ); seq; ++seq )
697  {
698  PCB_LAYER_ID layer = *seq;
699 
700  m_out->Print( aNestLevel+1, "(%d %s user", layer,
701  m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str() );
702 
703  if( !visible_layers[layer] )
704  m_out->Print( 0, " hide" );
705 
706  m_out->Print( 0, ")\n" );
707  }
708 
709  m_out->Print( aNestLevel, ")\n\n" );
710 }
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:472
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:108
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(), m_out, Margin, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), LSET::Seq(), and LAYER::ShowType().

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

◆ formatDefaults()

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

formats the defaults subsection of the board setup

Definition at line 586 of file kicad_plugin.cpp.

587 {
588  m_out->Print( aNestLevel, "(defaults\n" );
589 
590  m_out->Print( aNestLevel+1, "(edge_clearance %s)\n",
591  FormatInternalUnits( aSettings.m_CopperEdgeClearance ).c_str() );
592 
593  m_out->Print( aNestLevel+1, "(edge_cuts_line_width %s)\n",
594  FormatInternalUnits( aSettings.m_LineThickness[ LAYER_CLASS_EDGES ] ).c_str() );
595 
596  m_out->Print( aNestLevel+1, "(courtyard_line_width %s)\n",
598 
599  m_out->Print( aNestLevel+1, "(copper_line_width %s)\n",
600  FormatInternalUnits( aSettings.m_LineThickness[ LAYER_CLASS_COPPER ] ).c_str() );
601  m_out->Print( aNestLevel+1, "(copper_text_dims (size %s %s) (thickness %s)%s%s)\n",
602  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_COPPER ].x ).c_str(),
603  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_COPPER ].y ).c_str(),
605  aSettings.m_TextItalic[ LAYER_CLASS_COPPER ] ? " italic" : "",
606  aSettings.m_TextUpright[ LAYER_CLASS_COPPER ] ? " keep_upright" : "" );
607 
608  m_out->Print( aNestLevel+1, "(silk_line_width %s)\n",
609  FormatInternalUnits( aSettings.m_LineThickness[ LAYER_CLASS_SILK ] ).c_str() );
610  m_out->Print( aNestLevel+1, "(silk_text_dims (size %s %s) (thickness %s)%s%s)\n",
611  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_SILK ].x ).c_str(),
612  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_SILK ].y ).c_str(),
613  FormatInternalUnits( aSettings.m_TextThickness[ LAYER_CLASS_SILK ] ).c_str(),
614  aSettings.m_TextItalic[ LAYER_CLASS_SILK ] ? " italic" : "",
615  aSettings.m_TextUpright[ LAYER_CLASS_SILK ] ? " keep_upright" : "" );
616 
617  m_out->Print( aNestLevel+1, "(other_layers_line_width %s)\n",
618  FormatInternalUnits( aSettings.m_LineThickness[ LAYER_CLASS_OTHERS ] ).c_str() );
619  m_out->Print( aNestLevel+1, "(other_layers_text_dims (size %s %s) (thickness %s)%s%s)\n",
620  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_OTHERS ].x ).c_str(),
621  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_OTHERS ].y ).c_str(),
623  aSettings.m_TextItalic[ LAYER_CLASS_OTHERS ] ? " italic" : "",
624  aSettings.m_TextUpright[ LAYER_CLASS_OTHERS ] ? " keep_upright" : "" );
625 
626  m_out->Print( aNestLevel, ")\n" );
627 }
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:465

References FormatInternalUnits(), LAYER_CLASS_COPPER, LAYER_CLASS_COURTYARD, LAYER_CLASS_EDGES, LAYER_CLASS_OTHERS, LAYER_CLASS_SILK, BOARD_DESIGN_SETTINGS::m_CopperEdgeClearance, BOARD_DESIGN_SETTINGS::m_LineThickness, 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 formatSetup().

◆ formatGeneral()

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

formats the General section of the file

Definition at line 630 of file kicad_plugin.cpp.

631 {
632  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
633 
634  m_out->Print( 0, "\n" );
635  m_out->Print( aNestLevel, "(general\n" );
636  // Write Bounding box info
637  m_out->Print( aNestLevel+1, "(thickness %s)\n",
638  FormatInternalUnits( dsnSettings.GetBoardThickness() ).c_str() );
639 
640  m_out->Print( aNestLevel+1, "(drawings %u)\n", (unsigned)aBoard->Drawings().size() );
641  m_out->Print( aNestLevel + 1, "(tracks %u)\n", (unsigned)aBoard->Tracks().size() );
642  m_out->Print( aNestLevel + 1, "(modules %u)\n", (unsigned)aBoard->Modules().size() );
643  m_out->Print( aNestLevel+1, "(nets %d)\n", m_mapping->GetSize() );
644  m_out->Print( aNestLevel, ")\n\n" );
645 
646  aBoard->GetPageSettings().Format( m_out, aNestLevel, m_ctl );
647  aBoard->GetTitleBlock().Format( m_out, aNestLevel, m_ctl );
648 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const PAGE_INFO & GetPageSettings() const
Definition: class_board.h:555
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:540
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:377
MODULES & Modules()
Definition: class_board.h:236
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:198
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:561
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:245
TRACKS & Tracks()
Definition: class_board.h:227
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:465
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(), BOARD::GetDesignSettings(), BOARD::GetPageSettings(), NETINFO_MAPPING::GetSize(), BOARD::GetTitleBlock(), m_ctl, m_mapping, m_out, BOARD::Modules(), OUTPUTFORMATTER::Print(), and BOARD::Tracks().

Referenced by formatHeader().

◆ formatHeader()

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

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

Definition at line 740 of file kicad_plugin.cpp.

741 {
742  formatGeneral( aBoard, aNestLevel );
743  // Layers.
744  formatBoardLayers( aBoard, aNestLevel );
745  // Setup
746  formatSetup( aBoard, aNestLevel );
747  // Save net codes and names
748  formatNetInformation( aBoard, aNestLevel );
749 }
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 formatBoardLayers(), formatGeneral(), formatNetInformation(), and formatSetup().

Referenced by format().

◆ formatLayer()

void PCB_IO::formatLayer ( const BOARD_ITEM aItem) const
private

Definition at line 455 of file kicad_plugin.cpp.

456 {
457  if( m_ctl & CTL_STD_LAYER_NAMES )
458  {
459  PCB_LAYER_ID layer = aItem->GetLayer();
460 
461  // English layer names should never need quoting.
462  m_out->Print( 0, " (layer %s)", TO_UTF8( BOARD::GetStandardLayerName( layer ) ) );
463  }
464  else
465  m_out->Print( 0, " (layer %s)", m_out->Quotew( aItem->GetLayerName() ).c_str() );
466 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:48
PCB_LAYER_ID
A quick note on layer IDs:
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:472
#define CTL_STD_LAYER_NAMES
Use English Standard layer names.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
wxString GetLayerName() const
Function GetLayerName returns the name of the PCB layer on which the item resides.
virtual PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
static wxString GetStandardLayerName(PCB_LAYER_ID aLayerId)
Function GetStandardLayerName returns an "English Standard" name of a PCB layer when given aLayerNumb...
Definition: class_board.h:659

References CTL_STD_LAYER_NAMES, BOARD_ITEM::GetLayer(), BOARD_ITEM::GetLayerName(), BOARD::GetStandardLayerName(), m_ctl, m_out, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), and TO_UTF8.

Referenced by format().

◆ formatLayers()

void PCB_IO::formatLayers ( LSET  aLayerMask,
int  aNestLevel = 0 
) const
private

Definition at line 1186 of file kicad_plugin.cpp.

1187 {
1188  std::string output;
1189 
1190  if( aNestLevel == 0 )
1191  output += ' ';
1192 
1193  output += "(layers";
1194 
1195  static const LSET cu_all( LSET::AllCuMask() );
1196  static const LSET fr_bk( 2, B_Cu, F_Cu );
1197  static const LSET adhes( 2, B_Adhes, F_Adhes );
1198  static const LSET paste( 2, B_Paste, F_Paste );
1199  static const LSET silks( 2, B_SilkS, F_SilkS );
1200  static const LSET mask( 2, B_Mask, F_Mask );
1201  static const LSET crt_yd(2, B_CrtYd, F_CrtYd );
1202  static const LSET fab( 2, B_Fab, F_Fab );
1203 
1204  LSET cu_mask = cu_all;
1205 
1206  // output copper layers first, then non copper
1207 
1208  if( ( aLayerMask & cu_mask ) == cu_mask )
1209  {
1210  output += " *.Cu";
1211  aLayerMask &= ~cu_all; // clear bits, so they are not output again below
1212  }
1213  else if( ( aLayerMask & cu_mask ) == fr_bk )
1214  {
1215  output += " F&B.Cu";
1216  aLayerMask &= ~fr_bk;
1217  }
1218 
1219  if( ( aLayerMask & adhes ) == adhes )
1220  {
1221  output += " *.Adhes";
1222  aLayerMask &= ~adhes;
1223  }
1224 
1225  if( ( aLayerMask & paste ) == paste )
1226  {
1227  output += " *.Paste";
1228  aLayerMask &= ~paste;
1229  }
1230 
1231  if( ( aLayerMask & silks ) == silks )
1232  {
1233  output += " *.SilkS";
1234  aLayerMask &= ~silks;
1235  }
1236 
1237  if( ( aLayerMask & mask ) == mask )
1238  {
1239  output += " *.Mask";
1240  aLayerMask &= ~mask;
1241  }
1242 
1243  if( ( aLayerMask & crt_yd ) == crt_yd )
1244  {
1245  output += " *.CrtYd";
1246  aLayerMask &= ~crt_yd;
1247  }
1248 
1249  if( ( aLayerMask & fab ) == fab )
1250  {
1251  output += " *.Fab";
1252  aLayerMask &= ~fab;
1253  }
1254 
1255  // output any individual layers not handled in wildcard combos above
1256 
1257  wxString layerName;
1258 
1259  for( LAYER_NUM layer = 0; layer < PCB_LAYER_ID_COUNT; ++layer )
1260  {
1261  if( aLayerMask[layer] )
1262  {
1263  if( m_board && !( m_ctl & CTL_STD_LAYER_NAMES ) )
1264  layerName = m_board->GetLayerName( PCB_LAYER_ID( layer ) );
1265 
1266  else // I am being called from FootprintSave()
1267  layerName = BOARD::GetStandardLayerName( PCB_LAYER_ID( layer ) );
1268 
1269  output += ' ';
1270  output += m_out->Quotew( layerName );
1271  }
1272  }
1273 
1274  m_out->Print( aNestLevel, "%s)", output.c_str() );
1275 }
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Function AllCuMask returns a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:676
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Function GetLayerName returns the name of a layer given by aLayer.
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:472
int LAYER_NUM
Type LAYER_NUM can be replaced with int and removed.
#define CTL_STD_LAYER_NAMES
Use English Standard layer names.
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
static wxString GetStandardLayerName(PCB_LAYER_ID aLayerId)
Function GetStandardLayerName returns an "English Standard" name of a PCB layer when given aLayerNumb...
Definition: class_board.h:659

References LSET::AllCuMask(), B_Adhes, B_CrtYd, B_Cu, B_Fab, B_Mask, B_Paste, B_SilkS, CTL_STD_LAYER_NAMES, F_Adhes, F_CrtYd, F_Cu, F_Fab, F_Mask, F_Paste, F_SilkS, BOARD::GetLayerName(), BOARD::GetStandardLayerName(), m_board, m_ctl, m_out, PCB_LAYER_ID_COUNT, OUTPUTFORMATTER::Print(), and OUTPUTFORMATTER::Quotew().

Referenced by format().

◆ formatNetInformation()

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

formats the Nets and Netclasses

Definition at line 713 of file kicad_plugin.cpp.

714 {
715  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
716  for( NETINFO_ITEM* net : *m_mapping )
717  {
718  m_out->Print( aNestLevel, "(net %d %s)\n",
719  m_mapping->Translate( net->GetNet() ),
720  m_out->Quotew( net->GetNetname() ).c_str() );
721  }
722 
723  m_out->Print( 0, "\n" );
724 
725  // Save the default net class first.
726  NETCLASS defaultNC = *dsnSettings.GetDefault();
727  filterNetClass( *aBoard, defaultNC ); // Remove empty nets (from a copy of a netclass)
728  defaultNC.Format( m_out, aNestLevel, m_ctl );
729 
730  // Save the rest of the net classes alphabetically.
731  for( const auto& it : dsnSettings.m_NetClasses )
732  {
733  NETCLASS netclass = *it.second;
734  filterNetClass( *aBoard, netclass ); // Remove empty nets (from a copy of a netclass)
735  netclass.Format( m_out, aNestLevel, m_ctl );
736  }
737 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:540
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:472
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes
Class NETINFO_ITEM handles the data for a net.
Definition: netinfo.h:65
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
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 filterNetClass(), NETCLASS::Format(), BOARD_DESIGN_SETTINGS::GetDefault(), BOARD::GetDesignSettings(), m_ctl, m_mapping, BOARD_DESIGN_SETTINGS::m_NetClasses, m_out, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), and NETINFO_MAPPING::Translate().

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

◆ formatSetup()

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

formats the board setup information

Definition at line 468 of file kicad_plugin.cpp.

469 {
470  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
471 
472  // Setup
473  m_out->Print( aNestLevel, "(setup\n" );
474 
475  // Save current default track width, for compatibility with older Pcbnew version;
476  m_out->Print( aNestLevel+1, "(last_trace_width %s)\n",
477  FormatInternalUnits( dsnSettings.GetCurrentTrackWidth() ).c_str() );
478 
479  // Save custom track widths list (the first is not saved here: it's the netclass value)
480  for( unsigned ii = 1; ii < dsnSettings.m_TrackWidthList.size(); ii++ )
481  {
482  m_out->Print( aNestLevel+1, "(user_trace_width %s)\n",
483  FormatInternalUnits( dsnSettings.m_TrackWidthList[ii] ).c_str() );
484  }
485 
486  m_out->Print( aNestLevel+1, "(trace_clearance %s)\n",
487  FormatInternalUnits( dsnSettings.GetDefault()->GetClearance() ).c_str() );
488 
489  // ZONE_SETTINGS
490  m_out->Print( aNestLevel+1, "(zone_clearance %s)\n",
491  FormatInternalUnits( aBoard->GetZoneSettings().m_ZoneClearance ).c_str() );
492  m_out->Print( aNestLevel+1, "(zone_45_only %s)\n",
493  aBoard->GetZoneSettings().m_Zone_45_Only ? "yes" : "no" );
494 
495  m_out->Print( aNestLevel+1, "(trace_min %s)\n",
496  FormatInternalUnits( dsnSettings.m_TrackMinWidth ).c_str() );
497 
498  // Save current default via size, for compatibility with older Pcbnew version;
499  m_out->Print( aNestLevel+1, "(via_size %s)\n",
500  FormatInternalUnits( dsnSettings.GetDefault()->GetViaDiameter() ).c_str() );
501  m_out->Print( aNestLevel+1, "(via_drill %s)\n",
502  FormatInternalUnits( dsnSettings.GetDefault()->GetViaDrill() ).c_str() );
503  m_out->Print( aNestLevel+1, "(via_min_size %s)\n",
504  FormatInternalUnits( dsnSettings.m_ViasMinSize ).c_str() );
505  m_out->Print( aNestLevel+1, "(via_min_drill %s)\n",
506  FormatInternalUnits( dsnSettings.m_ViasMinDrill ).c_str() );
507 
508  // Save custom via dimensions list (the first is not saved here: it's 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  // Save custom diff-pair dimensions (the first is not saved here: it's the netclass value)
515  for( unsigned ii = 1; ii < dsnSettings.m_DiffPairDimensionsList.size(); ii++ )
516  {
517  m_out->Print( aNestLevel+1, "(user_diff_pair %s %s %s)\n",
518  FormatInternalUnits( dsnSettings.m_DiffPairDimensionsList[ii].m_Width ).c_str(),
519  FormatInternalUnits( dsnSettings.m_DiffPairDimensionsList[ii].m_Gap ).c_str(),
520  FormatInternalUnits( dsnSettings.m_DiffPairDimensionsList[ii].m_ViaGap ).c_str() );
521  }
522 
523  // for old versions compatibility:
524  if( dsnSettings.m_BlindBuriedViaAllowed )
525  m_out->Print( aNestLevel+1, "(blind_buried_vias_allowed yes)\n" );
526 
527  m_out->Print( aNestLevel+1, "(uvia_size %s)\n",
528  FormatInternalUnits( dsnSettings.GetDefault()->GetuViaDiameter() ).c_str() );
529  m_out->Print( aNestLevel+1, "(uvia_drill %s)\n",
530  FormatInternalUnits( dsnSettings.GetDefault()->GetuViaDrill() ).c_str() );
531  m_out->Print( aNestLevel+1, "(uvias_allowed %s)\n",
532  ( dsnSettings.m_MicroViasAllowed ) ? "yes" : "no" );
533  m_out->Print( aNestLevel+1, "(uvia_min_size %s)\n",
534  FormatInternalUnits( dsnSettings.m_MicroViasMinSize ).c_str() );
535  m_out->Print( aNestLevel+1, "(uvia_min_drill %s)\n",
536  FormatInternalUnits( dsnSettings.m_MicroViasMinDrill ).c_str() );
537 
538  m_out->Print( aNestLevel+1, "(max_error %s)\n",
539  FormatInternalUnits( dsnSettings.m_MaxError ).c_str() );
540 
541  // Store this option only if it is not the legacy option:
542  if( dsnSettings.m_ZoneUseNoOutlineInFill )
543  m_out->Print( aNestLevel+1, "(filled_areas_thickness no)\n" );
544 
545  formatDefaults( dsnSettings, aNestLevel+1 );
546 
547  m_out->Print( aNestLevel+1, "(pad_size %s %s)\n",
548  FormatInternalUnits( dsnSettings.m_Pad_Master.GetSize().x ).c_str(),
549  FormatInternalUnits( dsnSettings.m_Pad_Master.GetSize().y ).c_str() );
550  m_out->Print( aNestLevel+1, "(pad_drill %s)\n",
551  FormatInternalUnits( dsnSettings.m_Pad_Master.GetDrillSize().x ).c_str() );
552 
553  m_out->Print( aNestLevel+1, "(pad_to_mask_clearance %s)\n",
554  FormatInternalUnits( dsnSettings.m_SolderMaskMargin ).c_str() );
555 
556  if( dsnSettings.m_SolderMaskMinWidth )
557  m_out->Print( aNestLevel+1, "(solder_mask_min_width %s)\n",
558  FormatInternalUnits( dsnSettings.m_SolderMaskMinWidth ).c_str() );
559 
560  if( dsnSettings.m_SolderPasteMargin != 0 )
561  m_out->Print( aNestLevel+1, "(pad_to_paste_clearance %s)\n",
562  FormatInternalUnits( dsnSettings.m_SolderPasteMargin ).c_str() );
563 
564  if( dsnSettings.m_SolderPasteMarginRatio != 0 )
565  m_out->Print( aNestLevel+1, "(pad_to_paste_clearance_ratio %s)\n",
566  Double2Str( dsnSettings.m_SolderPasteMarginRatio ).c_str() );
567 
568  m_out->Print( aNestLevel+1, "(aux_axis_origin %s %s)\n",
569  FormatInternalUnits( aBoard->GetAuxOrigin().x ).c_str(),
570  FormatInternalUnits( aBoard->GetAuxOrigin().y ).c_str() );
571 
572  if( aBoard->GetGridOrigin().x || aBoard->GetGridOrigin().y )
573  m_out->Print( aNestLevel+1, "(grid_origin %s %s)\n",
574  FormatInternalUnits( aBoard->GetGridOrigin().x ).c_str(),
575  FormatInternalUnits( aBoard->GetGridOrigin().y ).c_str() );
576 
577  m_out->Print( aNestLevel+1, "(visible_elements %X)\n",
578  dsnSettings.GetVisibleElements() );
579 
580  aBoard->GetPlotOptions().Format( m_out, aNestLevel+1 );
581 
582  m_out->Print( aNestLevel, ")\n\n" );
583 }
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:558
int m_SolderPasteMargin
Solder paste margin absolute value.
int GetCurrentTrackWidth() const
Function GetCurrentTrackWidth.
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:540
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
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:64
bool m_BlindBuriedViaAllowed
true to allow blind/buried vias
const wxPoint & GetAuxOrigin() const
Definition: class_board.h:363
int m_MicroViasMinSize
micro vias (not vias) min diameter
const wxPoint & GetGridOrigin() const
Definition: class_board.h:370
int GetVisibleElements() const
Function GetVisibleElements returns a bit-mask of all the element categories that are visible.
NETCLASSPTR GetDefault() const
Function GetDefault.
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:290
D_PAD m_Pad_Master
A dummy pad to store all default parameters.
const ZONE_SETTINGS & GetZoneSettings() const
Definition: class_board.h:564
std::vector< VIA_DIMENSION > m_ViasDimensionsList
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
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:284
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:465
int m_SolderMaskMinWidth
Solder mask min width.
Class BOARD_DESIGN_SETTINGS contains design settings for a BOARD object.

References Double2Str(), PCB_PLOT_PARAMS::Format(), formatDefaults(), 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(), BOARD_DESIGN_SETTINGS::m_BlindBuriedViaAllowed, BOARD_DESIGN_SETTINGS::m_DiffPairDimensionsList, BOARD_DESIGN_SETTINGS::m_MaxError, BOARD_DESIGN_SETTINGS::m_MicroViasAllowed, BOARD_DESIGN_SETTINGS::m_MicroViasMinDrill, BOARD_DESIGN_SETTINGS::m_MicroViasMinSize, 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_ViasMinDrill, BOARD_DESIGN_SETTINGS::m_ViasMinSize, ZONE_SETTINGS::m_Zone_45_Only, ZONE_SETTINGS::m_ZoneClearance, BOARD_DESIGN_SETTINGS::m_ZoneUseNoOutlineInFill, and OUTPUTFORMATTER::Print().

Referenced by formatHeader().

◆ GetEnumeratedFootprint()

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

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

Reimplemented from PLUGIN.

Definition at line 2095 of file kicad_plugin.cpp.

2098 {
2099  return getFootprint( aLibraryPath, aFootprintName, aProperties, false );
2100 }
const MODULE * getFootprint(const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties, bool checkModified)

References getFootprint().

◆ GetFileExtension()

const wxString PCB_IO::GetFileExtension ( ) const
inlineoverridevirtual

Function GetFileExtension returns the file extension for the PLUGIN.

Implements PLUGIN.

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

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

◆ getFootprint()

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

Definition at line 2066 of file kicad_plugin.cpp.

2070 {
2071  LOCALE_IO toggle; // toggles on, then off, the C locale.
2072 
2073  init( aProperties );
2074 
2075  try
2076  {
2077  validateCache( aLibraryPath, checkModified );
2078  }
2079  catch( const IO_ERROR& )
2080  {
2081  // do nothing with the error
2082  }
2083 
2084  const MODULE_MAP& mods = m_cache->GetModules();
2085 
2086  MODULE_CITER it = mods.find( aFootprintName );
2087 
2088  if( it == mods.end() )
2089  return nullptr;
2090 
2091  return it->second->GetModule();
2092 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:175
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(), init(), m_cache, and validateCache().

Referenced by FootprintLoad(), and GetEnumeratedFootprint().

◆ GetLibraryTimestamp()

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

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

2252 {
2253  return FP_CACHE::GetTimestamp( aLibraryPath );
2254 }
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)
inline

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

167  {
168  std::string ret = m_sf.GetString();
169  if( doClear )
170  m_sf.Clear();
171 
172  return ret;
173  }
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 m_sf.

Referenced by FOOTPRINT_EDIT_FRAME::Export_Module().

◆ init()

void PCB_IO::init ( const PROPERTIES aProperties)
protected

Definition at line 2010 of file kicad_plugin.cpp.

2011 {
2012  m_board = NULL;
2013  m_reader = NULL;
2015  m_props = aProperties;
2016 }
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 m_board, m_loading_format_version, m_props, m_reader, and SEXPR_BOARD_FILE_VERSION.

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

◆ IsFootprintLibWritable()

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

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

2353 {
2354  LOCALE_IO toggle;
2355 
2356  init( NULL );
2357 
2358  validateCache( aLibraryPath );
2359 
2360  return m_cache->IsWritable();
2361 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:175
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
bool IsWritable() const

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

Referenced by GITHUB_PLUGIN::IsFootprintLibWritable().

◆ Load()

BOARD * PCB_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 1966 of file kicad_plugin.cpp.

1967 {
1968  FILE_LINE_READER reader( aFileName );
1969 
1970  init( aProperties );
1971 
1972  m_parser->SetLineReader( &reader );
1973  m_parser->SetBoard( aAppendToMe );
1974 
1975  BOARD* board;
1976 
1977  try
1978  {
1979  board = dynamic_cast<BOARD*>( m_parser->Parse() );
1980  }
1981  catch( const FUTURE_FORMAT_ERROR& )
1982  {
1983  // Don't wrap a FUTURE_FORMAT_ERROR in another
1984  throw;
1985  }
1986  catch( const PARSE_ERROR& parse_error )
1987  {
1988  if( m_parser->IsTooRecent() )
1989  throw FUTURE_FORMAT_ERROR( parse_error, m_parser->GetRequiredVersion() );
1990  else
1991  throw;
1992  }
1993 
1994  if( !board )
1995  {
1996  // The parser loaded something that was valid, but wasn't a board.
1997  THROW_PARSE_ERROR( _( "this file does not contain a PCB" ),
1998  m_parser->CurSource(), m_parser->CurLine(),
1999  m_parser->CurLineNumber(), m_parser->CurOffset() );
2000  }
2001 
2002  // Give the filename to the board if it's new
2003  if( !aAppendToMe )
2004  board->SetFileName( aFileName );
2005 
2006  return board;
2007 }
void init(const PROPERTIES *aProperties)
Class FILE_LINE_READER is a LINE_READER that reads from an open file.
Definition: richio.h:180
wxString GetRequiredVersion()
Return a string representing the version of kicad required to open this file.
Definition: pcb_parser.cpp:184
void SetBoard(BOARD *aBoard)
Definition: pcb_parser.h:328
void SetFileName(const wxString &aFileName)
Definition: class_board.h:223
PCB_PARSER * m_parser
#define THROW_PARSE_ERROR(aProblem, aSource, aInputLine, aLineNumber, aByteIndex)
BOARD_ITEM * Parse()
Definition: pcb_parser.cpp:444
#define _(s)
LINE_READER * SetLineReader(LINE_READER *aReader)
Function SetLineReader sets aLineReader into the parser, and returns the previous one,...
Definition: pcb_parser.h:321
bool IsTooRecent()
Return whether a version number, if any was parsed, was too recent.
Definition: pcb_parser.h:346
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:161
Struct FUTURE_FORMAT_ERROR variant of PARSE_ERROR indicating that a syntax or related error was likel...
Definition: ki_exception.h:172

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

◆ Parse()

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

Definition at line 376 of file kicad_plugin.cpp.

377 {
378  std::string input = TO_UTF8( aClipboardSourceInput );
379 
380  STRING_LINE_READER reader( input, wxT( "clipboard" ) );
381 
382  m_parser->SetLineReader( &reader );
383 
384  try
385  {
386  return m_parser->Parse();
387  }
388  catch( const PARSE_ERROR& parse_error )
389  {
390  if( m_parser->IsTooRecent() )
391  throw FUTURE_FORMAT_ERROR( parse_error, m_parser->GetRequiredVersion() );
392  else
393  throw;
394  }
395 }
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:48
wxString GetRequiredVersion()
Return a string representing the version of kicad required to open this file.
Definition: pcb_parser.cpp:184
PCB_PARSER * m_parser
BOARD_ITEM * Parse()
Definition: pcb_parser.cpp:444
LINE_READER * SetLineReader(LINE_READER *aReader)
Function SetLineReader sets aLineReader into the parser, and returns the previous one,...
Definition: pcb_parser.h:321
bool IsTooRecent()
Return whether a version number, if any was parsed, was too recent.
Definition: pcb_parser.h:346
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(), m_parser, PCB_PARSER::Parse(), PCB_PARSER::SetLineReader(), and TO_UTF8.

Referenced by CLIPBOARD_IO::Parse(), and parse_module_kicad().

◆ PluginName()

const wxString PCB_IO::PluginName ( ) const
inlineoverridevirtual

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

Implements PLUGIN.

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

104  {
105  return wxT( "KiCad" );
106  }

◆ 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 PCB_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 PLUGIN.

Reimplemented in CLIPBOARD_IO.

Definition at line 352 of file kicad_plugin.cpp.

353 {
354  LOCALE_IO toggle; // toggles on, then off, the C locale.
355 
356  init( aProperties );
357 
358  m_board = aBoard; // after init()
359 
360  // Prepare net mapping that assures that net codes saved in a file are consecutive integers
361  m_mapping->SetBoard( aBoard );
362 
363  FILE_OUTPUTFORMATTER formatter( aFileName );
364 
365  m_out = &formatter; // no ownership
366 
367  m_out->Print( 0, "(kicad_pcb (version %d) (host pcbnew %s)\n", SEXPR_BOARD_FILE_VERSION,
368  formatter.Quotew( GetBuildVersion() ).c_str() );
369 
370  Format( aBoard, 1 );
371 
372  m_out->Print( 0, ")\n" );
373 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:175
void init(const PROPERTIES *aProperties)
#define SEXPR_BOARD_FILE_VERSION
Current s-expression file format version. 2 was the last legacy format version.
void SetBoard(const BOARD *aBoard)
Function SetBoard Sets a BOARD object that is used to prepare the net code map.
Definition: netinfo.h:283
wxString GetBuildVersion()
Function GetBuildVersion Return the build version string.
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
Class FILE_OUTPUTFORMATTER may be used for text file output.
Definition: richio.h:492
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.

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

◆ SetOutputFormatter()

void PCB_IO::SetOutputFormatter ( OUTPUTFORMATTER aFormatter)
inline

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

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

References m_out.

Referenced by FP_CACHE::Save().

◆ validateCache()

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

Definition at line 2019 of file kicad_plugin.cpp.

2020 {
2021  if( !m_cache || !m_cache->IsPath( aLibraryPath ) || ( checkModified && m_cache->IsModified() ) )
2022  {
2023  // a spectacular episode in memory management:
2024  delete m_cache;
2025  m_cache = new FP_CACHE( this, aLibraryPath );
2026  m_cache->Load();
2027  }
2028 }
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 FP_CACHE, FP_CACHE::IsModified(), FP_CACHE::IsPath(), FP_CACHE::Load(), and m_cache.

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

Friends And Related Function Documentation

◆ FP_CACHE

friend class FP_CACHE
friend

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

Referenced by FootprintLibCreate(), and validateCache().

Member Data Documentation

◆ m_board

BOARD* PCB_IO::m_board
protected

◆ m_cache

◆ m_ctl

int PCB_IO::m_ctl
protected

◆ m_error

wxString PCB_IO::m_error
protected

for throwing exceptions

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

◆ m_filename

wxString PCB_IO::m_filename
protected

for saves only, name is in m_reader for loads

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

◆ m_loading_format_version

int PCB_IO::m_loading_format_version
protected

which SEXPR_BOARD_FILE_VERSION should be Load()ed?

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

Referenced by init().

◆ m_mapping

NETINFO_MAPPING* PCB_IO::m_mapping
protected

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

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

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

◆ m_out

◆ m_parser

PCB_PARSER* PCB_IO::m_parser
protected

◆ m_props

const PROPERTIES* PCB_IO::m_props
protected

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

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

Referenced by init().

◆ m_reader

LINE_READER* PCB_IO::m_reader
protected

no ownership here.

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

Referenced by init().

◆ m_sf

STRING_FORMATTER PCB_IO::m_sf
protected

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

Referenced by GetStringOutput(), and PCB_IO().


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