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, bool aBestEfforts, const PROPERTIES *aProperties=NULL) override
 Return a list of footprint names contained within the library at aLibraryPath. More...
 
const MODULEGetEnumeratedFootprint (const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties=NULL) override
 Function GetEnumeratedFootprint a version of FootprintLoad() for use after FootprintEnumerate() for more efficient cache management. More...
 
bool FootprintExists (const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties=NULL) override
 Function FootprintExists check for the existence of a footprint. More...
 
MODULEFootprintLoad (const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties=NULL) override
 Function FootprintLoad loads a footprint having aFootprintName from the aLibraryPath containing a library format that this PLUGIN knows about. More...
 
void FootprintSave (const wxString &aLibraryPath, const MODULE *aFootprint, const PROPERTIES *aProperties=NULL) override
 Function FootprintSave will write aModule to an existing library located at aLibraryPath. More...
 
void FootprintDelete (const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties=NULL) override
 Function FootprintDelete deletes aFootprintName from the library at aLibraryPath. More...
 
long long GetLibraryTimestamp (const wxString &aLibraryPath) const override
 Generate a timestamp representing all the files in the library (including the library directory). More...
 
void FootprintLibCreate (const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 Function FootprintLibCreate creates a new empty footprint library at aLibraryPath empty. More...
 
bool FootprintLibDelete (const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 Function FootprintLibDelete deletes an existing footprint library and returns true, or if library does not exist returns false, or throws an exception if library exists but is read only or cannot be deleted for some other reason. More...
 
bool IsFootprintLibWritable (const wxString &aLibraryPath) override
 Function IsFootprintLibWritable returns true iff the library at aLibraryPath is writable. More...
 
 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 96 of file pcbnew/kicad_plugin.h.

Constructor & Destructor Documentation

◆ PCB_IO()

PCB_IO::PCB_IO ( int  aControlFlags = CTL_FOR_BOARD)

Definition at line 1962 of file kicad_plugin.cpp.

1962  :
1963  m_cache( 0 ),
1964  m_ctl( aControlFlags ),
1965  m_parser( new PCB_PARSER() ),
1966  m_mapping( new NETINFO_MAPPING() )
1967 {
1968  init( 0 );
1969  m_out = &m_sf;
1970 }
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 1973 of file kicad_plugin.cpp.

1974 {
1975  delete m_cache;
1976  delete m_parser;
1977  delete m_mapping;
1978 }
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 2240 of file kicad_plugin.cpp.

2242 {
2243  LOCALE_IO toggle; // toggles on, then off, the C locale.
2244 
2245  init( aProperties );
2246 
2247  validateCache( aLibraryPath );
2248 
2249  if( !m_cache->IsWritable() )
2250  {
2251  THROW_IO_ERROR( wxString::Format( _( "Library \"%s\" is read only" ),
2252  aLibraryPath.GetData() ) );
2253  }
2254 
2255  m_cache->Remove( aFootprintName );
2256 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:154
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,
bool  aBestEfforts,
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.
aBestEffortsif true, don't throw on errors, just return an empty list.
Exceptions
IO_ERRORif the library cannot be found, or footprint cannot be loaded.

Reimplemented from PLUGIN.

Definition at line 2046 of file kicad_plugin.cpp.

2048 {
2049  LOCALE_IO toggle; // toggles on, then off, the C locale.
2050  wxDir dir( aLibPath );
2051  wxString errorMsg;
2052 
2053  init( aProperties );
2054 
2055  try
2056  {
2057  validateCache( aLibPath );
2058  }
2059  catch( const IO_ERROR& ioe )
2060  {
2061  errorMsg = ioe.What();
2062  }
2063 
2064  // Some of the files may have been parsed correctly so we want to add the valid files to
2065  // the library.
2066 
2067  for( MODULE_CITER it = m_cache->GetModules().begin(); it != m_cache->GetModules().end(); ++it )
2068  aFootprintNames.Add( it->first );
2069 
2070  if( !errorMsg.IsEmpty() && !aBestEfforts )
2071  THROW_IO_ERROR( errorMsg );
2072 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:154
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:33
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
#define THROW_IO_ERROR(msg)
MODULE_MAP::const_iterator MODULE_CITER
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:76
MODULE_MAP & GetModules()

References FP_CACHE::GetModules(), 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 2112 of file kicad_plugin.cpp.

2114 {
2115  // Note: checking the cache sounds like a good idea, but won't catch files which differ
2116  // only in case.
2117  //
2118  // Since this goes out to the native filesystem, we get platform differences (ie: MSW's
2119  // case-insensitive filesystem) handled "for free".
2120  // Warning: footprint names frequently contain a point. So be careful when initializing
2121  // wxFileName, and use a CTOR with extension specified
2122  wxFileName footprintFile( aLibraryPath, aFootprintName, KiCadFootprintFileExtension );
2123 
2124  return footprintFile.Exists();
2125 }
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 2266 of file kicad_plugin.cpp.

2267 {
2268  if( wxDir::Exists( aLibraryPath ) )
2269  {
2270  THROW_IO_ERROR( wxString::Format( _( "cannot overwrite library path \"%s\"" ),
2271  aLibraryPath.GetData() ) );
2272  }
2273 
2274  LOCALE_IO toggle;
2275 
2276  init( aProperties );
2277 
2278  delete m_cache;
2279  m_cache = new FP_CACHE( this, aLibraryPath );
2280  m_cache->Save();
2281 }
friend class FP_CACHE
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:154
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 2284 of file kicad_plugin.cpp.

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

2130 {
2131  const MODULE* footprint = getFootprint( aLibraryPath, aFootprintName, aProperties, true );
2132  return footprint ? new MODULE( *footprint ) : nullptr;
2133 }
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 2136 of file kicad_plugin.cpp.

2138 {
2139  LOCALE_IO toggle; // toggles on, then off, the C locale.
2140 
2141  init( aProperties );
2142 
2143  // In this public PLUGIN API function, we can safely assume it was
2144  // called for saving into a library path.
2146 
2147  validateCache( aLibraryPath );
2148 
2149  if( !m_cache->IsWritable() )
2150  {
2151  if( !m_cache->Exists() )
2152  {
2153  const wxString msg = wxString::Format( _( "Library \"%s\" does not exist.\n"
2154  "Would you like to create it?"),
2155  GetChars( aLibraryPath ) );
2156 
2157  if( wxMessageBox( msg, _( "Library Not Found"), wxYES_NO | wxICON_QUESTION ) != wxYES )
2158  return;
2159 
2160  // Save throws its own IO_ERROR on failure, so no need to recreate here
2161  m_cache->Save( NULL );
2162  }
2163  else
2164  {
2165  wxString msg = wxString::Format( _( "Library \"%s\" is read only" ), aLibraryPath );
2166  THROW_IO_ERROR( msg );
2167  }
2168  }
2169 
2170  wxString footprintName = aFootprint->GetFPID().GetLibItemName();
2171 
2172  MODULE_MAP& mods = m_cache->GetModules();
2173 
2174  // Quietly overwrite module and delete module file from path for any by same name.
2175  wxFileName fn( aLibraryPath, aFootprint->GetFPID().GetLibItemName(),
2177 
2178 #ifndef __WINDOWS__
2179  // Write through symlinks, don't replace them
2180  if( fn.Exists( wxFILE_EXISTS_SYMLINK ) )
2181  {
2182  char buffer[ PATH_MAX + 1 ];
2183  ssize_t pathLen = readlink( TO_UTF8( fn.GetFullPath() ), buffer, PATH_MAX );
2184 
2185  if( pathLen > 0 )
2186  {
2187  buffer[ pathLen ] = '\0';
2188  fn.Assign( fn.GetPath() + wxT( "/" ) + wxString::FromUTF8( buffer ) );
2189  fn.Normalize();
2190  }
2191  }
2192 #endif
2193 
2194  if( !fn.IsOk() )
2195  {
2196  THROW_IO_ERROR( wxString::Format( _( "Footprint file name \"%s\" is not valid." ),
2197  fn.GetFullPath() ) );
2198  }
2199 
2200  if( fn.FileExists() && !fn.IsFileWritable() )
2201  {
2202  THROW_IO_ERROR( wxString::Format( _( "No write permissions to delete file \"%s\"" ),
2203  fn.GetFullPath() ) );
2204  }
2205 
2206  wxString fullPath = fn.GetFullPath();
2207  wxString fullName = fn.GetFullName();
2208  MODULE_CITER it = mods.find( footprintName );
2209 
2210  if( it != mods.end() )
2211  {
2212  wxLogTrace( traceKicadPcbPlugin, wxT( "Removing footprint file '%s'." ), fullPath );
2213  mods.erase( footprintName );
2214  wxRemoveFile( fullPath );
2215  }
2216 
2217  // I need my own copy for the cache
2218  MODULE* module = new MODULE( *aFootprint );
2219 
2220  // and it's time stamp must be 0, it should have no parent, orientation should
2221  // be zero, and it should be on the front layer.
2222  module->SetTimeStamp( 0 );
2223  module->SetParent( nullptr );
2224  module->SetOrientation( 0 );
2225 
2226  if( module->GetLayer() != F_Cu )
2227  {
2228  if( m_board != nullptr )
2229  module->Flip( module->GetPosition(), m_board->GeneralSettings().m_FlipLeftRight );
2230  else
2231  module->Flip( module->GetPosition(), false );
2232  }
2233 
2234  wxLogTrace( traceKicadPcbPlugin, wxT( "Creating s-expr footprint file '%s'." ), fullPath );
2235  mods.insert( footprintName, new FP_CACHE_ITEM( module, WX_FILENAME( fn.GetPath(), fullName ) ) );
2236  m_cache->Save( module );
2237 }
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:154
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:206
#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:390
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:197
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 399 of file kicad_plugin.cpp.

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

762 {
763  formatHeader( aBoard, aNestLevel );
764 
765  // Save the modules.
766  for( auto module : aBoard->Modules() )
767  {
768  Format( module, aNestLevel );
769  m_out->Print( 0, "\n" );
770  }
771 
772  // Save the graphical items on the board (not owned by a module)
773  for( auto item : aBoard->Drawings() )
774  Format( item, aNestLevel );
775 
776  if( aBoard->Drawings().size() )
777  m_out->Print( 0, "\n" );
778 
779  // Do not save MARKER_PCBs, they can be regenerated easily.
780 
781  // Save the tracks and vias.
782  for( auto track : aBoard->Tracks() )
783  Format( track, aNestLevel );
784 
785  if( aBoard->Tracks().size() )
786  m_out->Print( 0, "\n" );
787 
788  // Save the polygon (which are the newer technology) zones.
789  for( int i = 0; i < aBoard->GetAreaCount(); ++i )
790  Format( aBoard->GetArea( i ), aNestLevel );
791 }
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 794 of file kicad_plugin.cpp.

795 {
796  m_out->Print( aNestLevel, "(dimension %s (width %s)",
797  FormatInternalUnits( aDimension->GetValue() ).c_str(),
798  FormatInternalUnits( aDimension->GetWidth() ).c_str() );
799 
800  formatLayer( aDimension );
801 
802  if( aDimension->GetTimeStamp() )
803  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aDimension->GetTimeStamp() );
804 
805  m_out->Print( 0, "\n" );
806 
807  Format( &aDimension->Text(), aNestLevel+1 );
808 
809  m_out->Print( aNestLevel+1, "(feature1 (pts (xy %s %s) (xy %s %s)))\n",
810  FormatInternalUnits( aDimension->m_featureLineDO.x ).c_str(),
811  FormatInternalUnits( aDimension->m_featureLineDO.y ).c_str(),
812  FormatInternalUnits( aDimension->m_featureLineDF.x ).c_str(),
813  FormatInternalUnits( aDimension->m_featureLineDF.y ).c_str() );
814 
815  m_out->Print( aNestLevel+1, "(feature2 (pts (xy %s %s) (xy %s %s)))\n",
816  FormatInternalUnits( aDimension->m_featureLineGO.x ).c_str(),
817  FormatInternalUnits( aDimension->m_featureLineGO.y ).c_str(),
818  FormatInternalUnits( aDimension->m_featureLineGF.x ).c_str(),
819  FormatInternalUnits( aDimension->m_featureLineGF.y ).c_str() );
820 
821  m_out->Print( aNestLevel+1, "(crossbar (pts (xy %s %s) (xy %s %s)))\n",
822  FormatInternalUnits( aDimension->m_crossBarO.x ).c_str(),
823  FormatInternalUnits( aDimension->m_crossBarO.y ).c_str(),
824  FormatInternalUnits( aDimension->m_crossBarF.x ).c_str(),
825  FormatInternalUnits( aDimension->m_crossBarF.y ).c_str() );
826 
827  m_out->Print( aNestLevel+1, "(arrow1a (pts (xy %s %s) (xy %s %s)))\n",
828  FormatInternalUnits( aDimension->m_crossBarF.x ).c_str(),
829  FormatInternalUnits( aDimension->m_crossBarF.y ).c_str(),
830  FormatInternalUnits( aDimension->m_arrowD1F.x ).c_str(),
831  FormatInternalUnits( aDimension->m_arrowD1F.y ).c_str() );
832 
833  m_out->Print( aNestLevel+1, "(arrow1b (pts (xy %s %s) (xy %s %s)))\n",
834  FormatInternalUnits( aDimension->m_crossBarF.x ).c_str(),
835  FormatInternalUnits( aDimension->m_crossBarF.y ).c_str(),
836  FormatInternalUnits( aDimension->m_arrowD2F.x ).c_str(),
837  FormatInternalUnits( aDimension->m_arrowD2F.y ).c_str() );
838 
839  m_out->Print( aNestLevel+1, "(arrow2a (pts (xy %s %s) (xy %s %s)))\n",
840  FormatInternalUnits( aDimension->m_crossBarO.x ).c_str(),
841  FormatInternalUnits( aDimension->m_crossBarO.y ).c_str(),
842  FormatInternalUnits( aDimension->m_arrowG1F.x ).c_str(),
843  FormatInternalUnits( aDimension->m_arrowG1F.y ).c_str() );
844 
845  m_out->Print( aNestLevel+1, "(arrow2b (pts (xy %s %s) (xy %s %s)))\n",
846  FormatInternalUnits( aDimension->m_crossBarO.x ).c_str(),
847  FormatInternalUnits( aDimension->m_crossBarO.y ).c_str(),
848  FormatInternalUnits( aDimension->m_arrowG2F.x ).c_str(),
849  FormatInternalUnits( aDimension->m_arrowG2F.y ).c_str() );
850 
851  m_out->Print( aNestLevel, ")\n" );
852 }
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:478
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 933 of file kicad_plugin.cpp.

934 {
935  switch( aModuleDrawing->GetShape() )
936  {
937  case S_SEGMENT: // Line
938  m_out->Print( aNestLevel, "(fp_line (start %s) (end %s)",
939  FormatInternalUnits( aModuleDrawing->GetStart0() ).c_str(),
940  FormatInternalUnits( aModuleDrawing->GetEnd0() ).c_str() );
941  break;
942 
943  case S_CIRCLE: // Circle
944  m_out->Print( aNestLevel, "(fp_circle (center %s) (end %s)",
945  FormatInternalUnits( aModuleDrawing->GetStart0() ).c_str(),
946  FormatInternalUnits( aModuleDrawing->GetEnd0() ).c_str() );
947  break;
948 
949  case S_ARC: // Arc
950  m_out->Print( aNestLevel, "(fp_arc (start %s) (end %s) (angle %s)",
951  FormatInternalUnits( aModuleDrawing->GetStart0() ).c_str(),
952  FormatInternalUnits( aModuleDrawing->GetEnd0() ).c_str(),
953  FormatAngle( aModuleDrawing->GetAngle() ).c_str() );
954  break;
955 
956  case S_POLYGON: // Polygonal segment
957  if( aModuleDrawing->IsPolyShapeValid() )
958  {
959  SHAPE_POLY_SET& poly = aModuleDrawing->GetPolyShape();
960  SHAPE_LINE_CHAIN& outline = poly.Outline( 0 );
961  int pointsCount = outline.PointCount();
962 
963  m_out->Print( aNestLevel, "(fp_poly (pts" );
964 
965  for( int ii = 0; ii < pointsCount; ++ii )
966  {
967  int nestLevel = 0;
968 
969  if( ii && !( ii%4 ) ) // newline every 4 pts
970  {
971  nestLevel = aNestLevel + 1;
972  m_out->Print( 0, "\n" );
973  }
974 
975  m_out->Print( nestLevel, "%s(xy %s)",
976  nestLevel ? "" : " ", FormatInternalUnits( outline.CPoint( ii ) ).c_str() );
977  }
978 
979  m_out->Print( 0, ")" );
980  }
981  else
982  {
983  wxFAIL_MSG( wxT( "Cannot format invalid polygon." ) );
984  return;
985  }
986  break;
987 
988  case S_CURVE: // Bezier curve
989  m_out->Print( aNestLevel, "(fp_curve (pts (xy %s) (xy %s) (xy %s) (xy %s))",
990  FormatInternalUnits( aModuleDrawing->GetStart0() ).c_str(),
991  FormatInternalUnits( aModuleDrawing->GetBezier0_C1() ).c_str(),
992  FormatInternalUnits( aModuleDrawing->GetBezier0_C2() ).c_str(),
993  FormatInternalUnits( aModuleDrawing->GetEnd0() ).c_str() );
994  break;
995 
996  default:
997  wxFAIL_MSG( wxT( "Cannot format invalid DRAWSEGMENT type." ) );
998  return;
999  };
1000 
1001  formatLayer( aModuleDrawing );
1002 
1003  m_out->Print( 0, " (width %s)", FormatInternalUnits( aModuleDrawing->GetWidth() ).c_str() );
1004 
1005  m_out->Print( 0, ")\n" );
1006 }
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:511
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:478

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

856 {
857  switch( aSegment->GetShape() )
858  {
859  case S_SEGMENT: // Line
860  m_out->Print( aNestLevel, "(gr_line (start %s) (end %s)",
861  FormatInternalUnits( aSegment->GetStart() ).c_str(),
862  FormatInternalUnits( aSegment->GetEnd() ).c_str() );
863 
864  if( aSegment->GetAngle() != 0.0 )
865  m_out->Print( 0, " (angle %s)", FormatAngle( aSegment->GetAngle() ).c_str() );
866 
867  break;
868 
869  case S_CIRCLE: // Circle
870  m_out->Print( aNestLevel, "(gr_circle (center %s) (end %s)",
871  FormatInternalUnits( aSegment->GetStart() ).c_str(),
872  FormatInternalUnits( aSegment->GetEnd() ).c_str() );
873  break;
874 
875  case S_ARC: // Arc
876  m_out->Print( aNestLevel, "(gr_arc (start %s) (end %s) (angle %s)",
877  FormatInternalUnits( aSegment->GetStart() ).c_str(),
878  FormatInternalUnits( aSegment->GetEnd() ).c_str(),
879  FormatAngle( aSegment->GetAngle() ).c_str() );
880  break;
881 
882  case S_POLYGON: // Polygon
883  if( aSegment->IsPolyShapeValid() )
884  {
885  SHAPE_POLY_SET& poly = aSegment->GetPolyShape();
886  SHAPE_LINE_CHAIN& outline = poly.Outline( 0 );
887  int pointsCount = outline.PointCount();
888 
889  m_out->Print( aNestLevel, "(gr_poly (pts" );
890 
891  for( int ii = 0; ii < pointsCount; ++ii )
892  {
893  m_out->Print( 0, " (xy %s)", FormatInternalUnits( outline.CPoint( ii ) ).c_str() );
894  }
895 
896  m_out->Print( 0, ")" );
897  }
898  else
899  {
900  wxFAIL_MSG( wxT( "Cannot format invalid polygon." ) );
901  return;
902  }
903 
904  break;
905 
906  case S_CURVE: // Bezier curve
907  m_out->Print( aNestLevel, "(gr_curve (pts (xy %s) (xy %s) (xy %s) (xy %s))",
908  FormatInternalUnits( aSegment->GetStart() ).c_str(),
909  FormatInternalUnits( aSegment->GetBezControl1() ).c_str(),
910  FormatInternalUnits( aSegment->GetBezControl2() ).c_str(),
911  FormatInternalUnits( aSegment->GetEnd() ).c_str() );
912  break;
913 
914  default:
915  wxFAIL_MSG( wxT( "Cannot format invalid DRAWSEGMENT type." ) );
916  return;
917  };
918 
919  formatLayer( aSegment );
920 
921  m_out->Print( 0, " (width %s)", FormatInternalUnits( aSegment->GetWidth() ).c_str() );
922 
923  if( aSegment->GetTimeStamp() )
924  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aSegment->GetTimeStamp() );
925 
926  if( aSegment->GetStatus() )
927  m_out->Print( 0, " (status %X)", aSegment->GetStatus() );
928 
929  m_out->Print( 0, ")\n" );
930 }
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:511
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:478

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

1010 {
1011  m_out->Print( aNestLevel, "(target %s (at %s) (size %s)",
1012  ( aTarget->GetShape() ) ? "x" : "plus",
1013  FormatInternalUnits( aTarget->GetPosition() ).c_str(),
1014  FormatInternalUnits( aTarget->GetSize() ).c_str() );
1015 
1016  if( aTarget->GetWidth() != 0 )
1017  m_out->Print( 0, " (width %s)", FormatInternalUnits( aTarget->GetWidth() ).c_str() );
1018 
1019  formatLayer( aTarget );
1020 
1021  if( aTarget->GetTimeStamp() )
1022  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aTarget->GetTimeStamp() );
1023 
1024  m_out->Print( 0, ")\n" );
1025 }
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:478
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 1028 of file kicad_plugin.cpp.

1029 {
1030  if( !( m_ctl & CTL_OMIT_INITIAL_COMMENTS ) )
1031  {
1032  const wxArrayString* initial_comments = aModule->GetInitialComments();
1033 
1034  if( initial_comments )
1035  {
1036  for( unsigned i=0; i<initial_comments->GetCount(); ++i )
1037  m_out->Print( aNestLevel, "%s\n", TO_UTF8( (*initial_comments)[i] ) );
1038 
1039  m_out->Print( 0, "\n" ); // improve readability?
1040  }
1041  }
1042 
1043  m_out->Print( aNestLevel, "(module %s",
1044  m_out->Quotes( aModule->GetFPID().Format() ).c_str() );
1045 
1046  if( aModule->IsLocked() )
1047  m_out->Print( 0, " locked" );
1048 
1049  if( aModule->IsPlaced() )
1050  m_out->Print( 0, " placed" );
1051 
1052  formatLayer( aModule );
1053 
1054  m_out->Print( 0, " (tedit %lX)", (unsigned long)aModule->GetLastEditTime() );
1055 
1056  if( !( m_ctl & CTL_OMIT_TSTAMPS ) )
1057  {
1058  m_out->Print( 0, " (tstamp %lX)\n", (unsigned long)aModule->GetTimeStamp() );
1059  }
1060  else
1061  m_out->Print( 0, "\n" );
1062 
1063  if( !( m_ctl & CTL_OMIT_AT ) )
1064  {
1065  m_out->Print( aNestLevel+1, "(at %s", FormatInternalUnits( aModule->GetPosition() ).c_str() );
1066 
1067  if( aModule->GetOrientation() != 0.0 )
1068  m_out->Print( 0, " %s", FormatAngle( aModule->GetOrientation() ).c_str() );
1069 
1070  m_out->Print( 0, ")\n" );
1071  }
1072 
1073  if( !aModule->GetDescription().IsEmpty() )
1074  m_out->Print( aNestLevel+1, "(descr %s)\n",
1075  m_out->Quotew( aModule->GetDescription() ).c_str() );
1076 
1077  if( !aModule->GetKeywords().IsEmpty() )
1078  m_out->Print( aNestLevel+1, "(tags %s)\n",
1079  m_out->Quotew( aModule->GetKeywords() ).c_str() );
1080 
1081  if( !( m_ctl & CTL_OMIT_PATH ) && !!aModule->GetPath() )
1082  m_out->Print( aNestLevel+1, "(path %s)\n",
1083  m_out->Quotew( aModule->GetPath() ).c_str() );
1084 
1085  if( aModule->GetPlacementCost90() != 0 )
1086  m_out->Print( aNestLevel+1, "(autoplace_cost90 %d)\n", aModule->GetPlacementCost90() );
1087 
1088  if( aModule->GetPlacementCost180() != 0 )
1089  m_out->Print( aNestLevel+1, "(autoplace_cost180 %d)\n", aModule->GetPlacementCost180() );
1090 
1091  if( aModule->GetLocalSolderMaskMargin() != 0 )
1092  m_out->Print( aNestLevel+1, "(solder_mask_margin %s)\n",
1093  FormatInternalUnits( aModule->GetLocalSolderMaskMargin() ).c_str() );
1094 
1095  if( aModule->GetLocalSolderPasteMargin() != 0 )
1096  m_out->Print( aNestLevel+1, "(solder_paste_margin %s)\n",
1097  FormatInternalUnits( aModule->GetLocalSolderPasteMargin() ).c_str() );
1098 
1099  if( aModule->GetLocalSolderPasteMarginRatio() != 0 )
1100  m_out->Print( aNestLevel+1, "(solder_paste_ratio %s)\n",
1101  Double2Str( aModule->GetLocalSolderPasteMarginRatio() ).c_str() );
1102 
1103  if( aModule->GetLocalClearance() != 0 )
1104  m_out->Print( aNestLevel+1, "(clearance %s)\n",
1105  FormatInternalUnits( aModule->GetLocalClearance() ).c_str() );
1106 
1107  if( aModule->GetZoneConnection() != PAD_ZONE_CONN_INHERITED )
1108  m_out->Print( aNestLevel+1, "(zone_connect %d)\n", aModule->GetZoneConnection() );
1109 
1110  if( aModule->GetThermalWidth() != 0 )
1111  m_out->Print( aNestLevel+1, "(thermal_width %s)\n",
1112  FormatInternalUnits( aModule->GetThermalWidth() ).c_str() );
1113 
1114  if( aModule->GetThermalGap() != 0 )
1115  m_out->Print( aNestLevel+1, "(thermal_gap %s)\n",
1116  FormatInternalUnits( aModule->GetThermalGap() ).c_str() );
1117 
1118  // Attributes
1119  if( aModule->GetAttributes() != MOD_DEFAULT )
1120  {
1121  m_out->Print( aNestLevel+1, "(attr" );
1122 
1123  if( aModule->GetAttributes() & MOD_CMS )
1124  m_out->Print( 0, " smd" );
1125 
1126  if( aModule->GetAttributes() & MOD_VIRTUAL )
1127  m_out->Print( 0, " virtual" );
1128 
1129  m_out->Print( 0, ")\n" );
1130  }
1131 
1132  Format( (BOARD_ITEM*) &aModule->Reference(), aNestLevel+1 );
1133  Format( (BOARD_ITEM*) &aModule->Value(), aNestLevel+1 );
1134 
1135  // Save drawing elements.
1136  for( auto gr : aModule->GraphicalItems() )
1137  Format( gr, aNestLevel+1 );
1138 
1139  // Save pads.
1140  for( auto pad : aModule->Pads() )
1141  format( pad, aNestLevel+1 );
1142 
1143  // Save 3D info.
1144  auto bs3D = aModule->Models().begin();
1145  auto es3D = aModule->Models().end();
1146 
1147  while( bs3D != es3D )
1148  {
1149  if( !bs3D->m_Filename.IsEmpty() )
1150  {
1151  m_out->Print( aNestLevel+1, "(model %s\n",
1152  m_out->Quotew( bs3D->m_Filename ).c_str() );
1153 
1154  /* Write 3D model offset in mm
1155  * 4.0.x wrote "at" which was actually in inches
1156  * 5.0.x onwards, 3D model offset is written using "offset"
1157  *
1158  * If the offset is all zero, write "at" (fewer file changes)
1159  * Otherwise, write "offset"
1160  */
1161 
1162  wxString offsetTag = "offset";
1163 
1164  if( bs3D->m_Offset.x == 0 &&
1165  bs3D->m_Offset.y == 0 &&
1166  bs3D->m_Offset.z == 0 )
1167  {
1168  offsetTag = "at";
1169  }
1170 
1171  m_out->Print( aNestLevel+2, "(%s (xyz %s %s %s))\n",
1172  offsetTag.ToStdString().c_str(),
1173  Double2Str( bs3D->m_Offset.x ).c_str(),
1174  Double2Str( bs3D->m_Offset.y ).c_str(),
1175  Double2Str( bs3D->m_Offset.z ).c_str() );
1176 
1177  m_out->Print( aNestLevel+2, "(scale (xyz %s %s %s))\n",
1178  Double2Str( bs3D->m_Scale.x ).c_str(),
1179  Double2Str( bs3D->m_Scale.y ).c_str(),
1180  Double2Str( bs3D->m_Scale.z ).c_str() );
1181 
1182  m_out->Print( aNestLevel+2, "(rotate (xyz %s %s %s))\n",
1183  Double2Str( bs3D->m_Rotation.x ).c_str(),
1184  Double2Str( bs3D->m_Rotation.y ).c_str(),
1185  Double2Str( bs3D->m_Rotation.z ).c_str() );
1186 
1187  m_out->Print( aNestLevel+1, ")\n" );
1188  }
1189  ++bs3D;
1190  }
1191 
1192  m_out->Print( aNestLevel, ")\n" );
1193 }
timestamp_t GetLastEditTime() const
Definition: class_module.h:329
int GetAttributes() const
Definition: class_module.h:239
double GetOrientation() const
Definition: class_module.h:202
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
int GetPlacementCost90() const
Definition: class_module.h:535
TEXTE_MODULE & Reference()
Definition: class_module.h:457
#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:299
const wxString & GetPath() const
Definition: class_module.h:215
PADS & Pads()
Definition: class_module.h:165
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:206
DRAWINGS & GraphicalItems()
Definition: class_module.h:175
int GetLocalSolderMaskMargin() const
Definition: class_module.h:218
#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:511
int GetLocalClearance() const
Definition: class_module.h:221
TEXTE_MODULE & Value()
read/write accessors:
Definition: class_module.h:456
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:641
bool IsLocked() const override
Function IsLocked.
Definition: class_module.h:281
const wxString & GetKeywords() const
Definition: class_module.h:212
UTF8 Format() const
Definition: lib_id.cpp:237
int GetLocalSolderPasteMargin() const
Definition: class_module.h:224
default
Definition: class_module.h:75
int GetPlacementCost180() const
Definition: class_module.h:532
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:209
double GetLocalSolderPasteMarginRatio() const
Definition: class_module.h:227
std::list< MODULE_3D_SETTINGS > & Models()
Definition: class_module.h:192
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:234
const wxPoint GetPosition() const override
Definition: class_module.h:197
int GetThermalGap() const
Definition: class_module.h:237
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:478
ZoneConnection GetZoneConnection() const
Definition: class_module.h:231

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

1289 {
1290  const char* shape;
1291 
1292  switch( aPad->GetShape() )
1293  {
1294  case PAD_SHAPE_CIRCLE: shape = "circle"; break;
1295  case PAD_SHAPE_RECT: shape = "rect"; break;
1296  case PAD_SHAPE_OVAL: shape = "oval"; break;
1297  case PAD_SHAPE_TRAPEZOID: shape = "trapezoid"; break;
1299  case PAD_SHAPE_ROUNDRECT: shape = "roundrect"; break;
1300  case PAD_SHAPE_CUSTOM: shape = "custom"; break;
1301 
1302  default:
1303  THROW_IO_ERROR( wxString::Format( _( "unknown pad type: %d"), aPad->GetShape() ) );
1304  }
1305 
1306  const char* type;
1307 
1308  switch( aPad->GetAttribute() )
1309  {
1310  case PAD_ATTRIB_STANDARD: type = "thru_hole"; break;
1311  case PAD_ATTRIB_SMD: type = "smd"; break;
1312  case PAD_ATTRIB_CONN: type = "connect"; break;
1313  case PAD_ATTRIB_HOLE_NOT_PLATED: type = "np_thru_hole"; break;
1314 
1315  default:
1316  THROW_IO_ERROR( wxString::Format( "unknown pad attribute: %d", aPad->GetAttribute() ) );
1317  }
1318 
1319  m_out->Print( aNestLevel, "(pad %s %s %s",
1320  m_out->Quotew( aPad->GetName() ).c_str(),
1321  type, shape );
1322  m_out->Print( 0, " (at %s", FormatInternalUnits( aPad->GetPos0() ).c_str() );
1323 
1324  if( aPad->GetOrientation() != 0.0 )
1325  m_out->Print( 0, " %s", FormatAngle( aPad->GetOrientation() ).c_str() );
1326 
1327  m_out->Print( 0, ")" );
1328  m_out->Print( 0, " (size %s)", FormatInternalUnits( aPad->GetSize() ).c_str() );
1329 
1330  if( (aPad->GetDelta().GetWidth()) != 0 || (aPad->GetDelta().GetHeight() != 0 ) )
1331  m_out->Print( 0, " (rect_delta %s )", FormatInternalUnits( aPad->GetDelta() ).c_str() );
1332 
1333  wxSize sz = aPad->GetDrillSize();
1334  wxPoint shapeoffset = aPad->GetOffset();
1335 
1336  if( (sz.GetWidth() > 0) || (sz.GetHeight() > 0) ||
1337  (shapeoffset.x != 0) || (shapeoffset.y != 0) )
1338  {
1339  m_out->Print( 0, " (drill" );
1340 
1341  if( aPad->GetDrillShape() == PAD_DRILL_SHAPE_OBLONG )
1342  m_out->Print( 0, " oval" );
1343 
1344  if( sz.GetWidth() > 0 )
1345  m_out->Print( 0, " %s", FormatInternalUnits( sz.GetWidth() ).c_str() );
1346 
1347  if( sz.GetHeight() > 0 && sz.GetWidth() != sz.GetHeight() )
1348  m_out->Print( 0, " %s", FormatInternalUnits( sz.GetHeight() ).c_str() );
1349 
1350  if( (shapeoffset.x != 0) || (shapeoffset.y != 0) )
1351  m_out->Print( 0, " (offset %s)", FormatInternalUnits( aPad->GetOffset() ).c_str() );
1352 
1353  m_out->Print( 0, ")" );
1354  }
1355 
1356  formatLayers( aPad->GetLayerSet() );
1357 
1358  // Output the radius ratio for rounded and chamfered rect pads
1359  if( aPad->GetShape() == PAD_SHAPE_ROUNDRECT || aPad->GetShape() == PAD_SHAPE_CHAMFERED_RECT)
1360  {
1361  m_out->Print( 0, " (roundrect_rratio %s)",
1362  Double2Str( aPad->GetRoundRectRadiusRatio() ).c_str() );
1363  }
1364 
1365  // Output the chamfer corners for chamfered rect pads
1366  if( aPad->GetShape() == PAD_SHAPE_CHAMFERED_RECT)
1367  {
1368  m_out->Print( 0, "\n" );
1369 
1370  m_out->Print( aNestLevel+1, "(chamfer_ratio %s)",
1371  Double2Str( aPad->GetChamferRectRatio() ).c_str() );
1372 
1373  m_out->Print( 0, " (chamfer" );
1374 
1375  if( ( aPad->GetChamferPositions() & RECT_CHAMFER_TOP_LEFT ) )
1376  m_out->Print( 0, " top_left" );
1377 
1378  if( ( aPad->GetChamferPositions() & RECT_CHAMFER_TOP_RIGHT ) )
1379  m_out->Print( 0, " top_right" );
1380 
1381  if( ( aPad->GetChamferPositions() & RECT_CHAMFER_BOTTOM_LEFT ) )
1382  m_out->Print( 0, " bottom_left" );
1383 
1385  m_out->Print( 0, " bottom_right" );
1386 
1387  m_out->Print( 0, ")" );
1388  }
1389 
1390  std::string output;
1391 
1392  // Unconnected pad is default net so don't save it.
1393  if( !( m_ctl & CTL_OMIT_NETS ) && aPad->GetNetCode() != NETINFO_LIST::UNCONNECTED )
1394  StrPrintf( &output, " (net %d %s)", m_mapping->Translate( aPad->GetNetCode() ),
1395  m_out->Quotew( aPad->GetNetname() ).c_str() );
1396 
1397  if( aPad->GetPadToDieLength() != 0 )
1398  StrPrintf( &output, " (die_length %s)", FormatInternalUnits( aPad->GetPadToDieLength() ).c_str() );
1399 
1400  if( aPad->GetLocalSolderMaskMargin() != 0 )
1401  StrPrintf( &output, " (solder_mask_margin %s)",
1402  FormatInternalUnits( aPad->GetLocalSolderMaskMargin() ).c_str() );
1403 
1404  if( aPad->GetLocalSolderPasteMargin() != 0 )
1405  StrPrintf( &output, " (solder_paste_margin %s)",
1406  FormatInternalUnits( aPad->GetLocalSolderPasteMargin() ).c_str() );
1407 
1408  if( aPad->GetLocalSolderPasteMarginRatio() != 0 )
1409  StrPrintf( &output, " (solder_paste_margin_ratio %s)",
1410  Double2Str( aPad->GetLocalSolderPasteMarginRatio() ).c_str() );
1411 
1412  if( aPad->GetLocalClearance() != 0 )
1413  StrPrintf( &output, " (clearance %s)", FormatInternalUnits( aPad->GetLocalClearance() ).c_str() );
1414 
1416  StrPrintf( &output, " (zone_connect %d)", aPad->GetZoneConnection() );
1417 
1418  if( aPad->GetThermalWidth() != 0 )
1419  StrPrintf( &output, " (thermal_width %s)", FormatInternalUnits( aPad->GetThermalWidth() ).c_str() );
1420 
1421  if( aPad->GetThermalGap() != 0 )
1422  StrPrintf( &output, " (thermal_gap %s)", FormatInternalUnits( aPad->GetThermalGap() ).c_str() );
1423 
1424  if( output.size() )
1425  {
1426  m_out->Print( 0, "\n" );
1427  m_out->Print( aNestLevel+1, "%s", output.c_str()+1 ); // +1 skips 1st space on 1st element
1428  }
1429 
1430  if( aPad->GetShape() == PAD_SHAPE_CUSTOM )
1431  {
1432  m_out->Print( 0, "\n");
1433  m_out->Print( aNestLevel+1, "(options" );
1434 
1436  m_out->Print( 0, " (clearance convexhull)" );
1437  #if 1 // Set to 1 to output the default option
1438  else
1439  m_out->Print( 0, " (clearance outline)" );
1440  #endif
1441 
1442  // Output the anchor pad shape (circle/rect)
1443  if( aPad->GetAnchorPadShape() == PAD_SHAPE_RECT )
1444  shape = "rect";
1445  else
1446  shape = "circle";
1447 
1448  m_out->Print( 0, " (anchor %s)", shape );
1449 
1450  m_out->Print( 0, ")"); // end of (options ...
1451 
1452  // Output graphic primitive of the pad shape
1453  m_out->Print( 0, "\n");
1454  m_out->Print( aNestLevel+1, "(primitives" );
1455 
1456  int nested_level = aNestLevel+2;
1457 
1458  // Output all basic shapes
1459  for( unsigned icnt = 0; icnt < aPad->GetPrimitives().size(); ++icnt )
1460  {
1461  m_out->Print( 0, "\n");
1462 
1463  const PAD_CS_PRIMITIVE& primitive = aPad->GetPrimitives()[icnt];
1464 
1465  switch( primitive.m_Shape )
1466  {
1467  case S_SEGMENT: // usual segment : line with rounded ends
1468  m_out->Print( nested_level, "(gr_line (start %s) (end %s) (width %s))",
1469  FormatInternalUnits( primitive.m_Start ).c_str(),
1470  FormatInternalUnits( primitive.m_End ).c_str(),
1471  FormatInternalUnits( primitive.m_Thickness ).c_str() );
1472  break;
1473 
1474  case S_ARC: // Arc with rounded ends
1475  m_out->Print( nested_level, "(gr_arc (start %s) (end %s) (angle %s) (width %s))",
1476  FormatInternalUnits( primitive.m_Start ).c_str(),
1477  FormatInternalUnits( primitive.m_End ).c_str(),
1478  FormatAngle( primitive.m_ArcAngle ).c_str(),
1479  FormatInternalUnits( primitive.m_Thickness ).c_str() );
1480  break;
1481 
1482  case S_CIRCLE: // ring or circle (circle if width == 0
1483  m_out->Print( nested_level, "(gr_circle (center %s) (end %s %s) (width %s))",
1484  FormatInternalUnits( primitive.m_Start ).c_str(),
1485  FormatInternalUnits( primitive.m_Start.x + primitive.m_Radius ).c_str(),
1486  FormatInternalUnits( primitive.m_Start.y ).c_str(),
1487  FormatInternalUnits( primitive.m_Thickness ).c_str() );
1488  break;
1489 
1490  case S_CURVE: // Bezier Curve
1491  m_out->Print( aNestLevel, "(gr_curve (pts (xy %s) (xy %s) (xy %s) (xy %s)) (width %s))",
1492  FormatInternalUnits( primitive.m_Start ).c_str(),
1493  FormatInternalUnits( primitive.m_Ctrl1 ).c_str(),
1494  FormatInternalUnits( primitive.m_Ctrl2 ).c_str(),
1495  FormatInternalUnits( primitive.m_End ).c_str(),
1496  FormatInternalUnits( primitive.m_Thickness ).c_str() );
1497  break;
1498 
1499  case S_POLYGON: // polygon
1500  if( primitive.m_Poly.size() < 2 )
1501  break; // Malformed polygon.
1502 
1503  {
1504  m_out->Print( nested_level, "(gr_poly (pts\n");
1505 
1506  // Write the polygon corners coordinates:
1507  const std::vector< wxPoint>& poly = primitive.m_Poly;
1508  int newLine = 0;
1509 
1510  for( unsigned ii = 0; ii < poly.size(); ii++ )
1511  {
1512  if( newLine == 0 )
1513  m_out->Print( nested_level+1, " (xy %s)",
1514  FormatInternalUnits( wxPoint( poly[ii].x, poly[ii].y ) ).c_str() );
1515  else
1516  m_out->Print( 0, " (xy %s)",
1517  FormatInternalUnits( wxPoint( poly[ii].x, poly[ii].y ) ).c_str() );
1518 
1519  if( ++newLine > 4 )
1520  {
1521  newLine = 0;
1522  m_out->Print( 0, "\n" );
1523  }
1524  }
1525 
1526  m_out->Print( 0, ") (width %s))", FormatInternalUnits( primitive.m_Thickness ).c_str() );
1527  }
1528  break;
1529 
1530  default:
1531  break;
1532  }
1533  }
1534 
1535  m_out->Print( 0, "\n");
1536  m_out->Print( aNestLevel+1, ")" ); // end of (basic_shapes
1537  }
1538 
1539  m_out->Print( 0, ")\n" );
1540 }
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:511
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:478
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 1543 of file kicad_plugin.cpp.

1544 {
1545  m_out->Print( aNestLevel, "(gr_text %s (at %s",
1546  m_out->Quotew( aText->GetText() ).c_str(),
1547  FormatInternalUnits( aText->GetTextPos() ).c_str() );
1548 
1549  if( aText->GetTextAngle() != 0.0 )
1550  m_out->Print( 0, " %s", FormatAngle( aText->GetTextAngle() ).c_str() );
1551 
1552  m_out->Print( 0, ")" );
1553 
1554  formatLayer( aText );
1555 
1556  if( aText->GetTimeStamp() )
1557  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aText->GetTimeStamp() );
1558 
1559  m_out->Print( 0, "\n" );
1560 
1561  aText->EDA_TEXT::Format( m_out, aNestLevel, m_ctl );
1562 
1563  m_out->Print( aNestLevel, ")\n" );
1564 }
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:511
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:232
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:478

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

1568 {
1569  std::string type;
1570 
1571  switch( aText->GetType() )
1572  {
1573  case TEXTE_MODULE::TEXT_is_REFERENCE: type = "reference"; break;
1574  case TEXTE_MODULE::TEXT_is_VALUE: type = "value"; break;
1575  case TEXTE_MODULE::TEXT_is_DIVERS: type = "user";
1576  }
1577 
1578  m_out->Print( aNestLevel, "(fp_text %s %s (at %s", type.c_str(),
1579  m_out->Quotew( aText->GetText() ).c_str(),
1580  FormatInternalUnits( aText->GetPos0() ).c_str() );
1581 
1582  // Due to Pcbnew history, fp_text angle is saved as an absolute on screen angle,
1583  // but internally the angle is held relative to its parent footprint. parent
1584  // may be NULL when saving a footprint outside a BOARD.
1585  double orient = aText->GetTextAngle();
1586  MODULE* parent = (MODULE*) aText->GetParent();
1587 
1588  if( parent )
1589  {
1590  // GetTextAngle() is always in -360..+360 range because of
1591  // TEXTE_MODULE::SetTextAngle(), but summing that angle with an
1592  // additional board angle could kick sum up >= 360 or <= -360, so to have
1593  // consistent results, normalize again for the BOARD save. A footprint
1594  // save does not use this code path since parent is NULL.
1595 #if 0
1596  // This one could be considered reasonable if you like positive angles
1597  // in your board text.
1598  orient = NormalizeAnglePos( orient + parent->GetOrientation() );
1599 #else
1600  // Choose compatibility for now, even though this is only a 720 degree clamp
1601  // with two possible values for every angle.
1602  orient = NormalizeAngle360Min( orient + parent->GetOrientation() );
1603 #endif
1604  }
1605 
1606  if( orient != 0.0 )
1607  m_out->Print( 0, " %s", FormatAngle( orient ).c_str() );
1608 
1609  if( !aText->IsKeepUpright() )
1610  m_out->Print( 0, " unlocked" );
1611 
1612  m_out->Print( 0, ")" );
1613  formatLayer( aText );
1614 
1615  if( !aText->IsVisible() )
1616  m_out->Print( 0, " hide" );
1617 
1618  m_out->Print( 0, "\n" );
1619 
1620  aText->EDA_TEXT::Format( m_out, aNestLevel, m_ctl | CTL_OMIT_HIDE );
1621 
1622  m_out->Print( aNestLevel, ")\n" );
1623 }
double GetOrientation() const
Definition: class_module.h:202
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:511
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:478

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

1627 {
1628  if( aTrack->Type() == PCB_VIA_T )
1629  {
1630  PCB_LAYER_ID layer1, layer2;
1631 
1632  const VIA* via = static_cast<const VIA*>( aTrack );
1633  BOARD* board = (BOARD*) via->GetParent();
1634 
1635  wxCHECK_RET( board != 0, wxT( "Via " ) + via->GetSelectMenuText( MILLIMETRES ) +
1636  wxT( " has no parent." ) );
1637 
1638  m_out->Print( aNestLevel, "(via" );
1639 
1640  via->LayerPair( &layer1, &layer2 );
1641 
1642  switch( via->GetViaType() )
1643  {
1644  case VIA_THROUGH: // Default shape not saved.
1645  break;
1646 
1647  case VIA_BLIND_BURIED:
1648  m_out->Print( 0, " blind" );
1649  break;
1650 
1651  case VIA_MICROVIA:
1652  m_out->Print( 0, " micro" );
1653  break;
1654 
1655  default:
1656  THROW_IO_ERROR( wxString::Format( _( "unknown via type %d" ), via->GetViaType() ) );
1657  }
1658 
1659  m_out->Print( 0, " (at %s) (size %s)",
1660  FormatInternalUnits( aTrack->GetStart() ).c_str(),
1661  FormatInternalUnits( aTrack->GetWidth() ).c_str() );
1662 
1663  if( via->GetDrill() != UNDEFINED_DRILL_DIAMETER )
1664  m_out->Print( 0, " (drill %s)", FormatInternalUnits( via->GetDrill() ).c_str() );
1665 
1666  m_out->Print( 0, " (layers %s %s)",
1667  m_out->Quotew( m_board->GetLayerName( layer1 ) ).c_str(),
1668  m_out->Quotew( m_board->GetLayerName( layer2 ) ).c_str() );
1669  }
1670  else
1671  {
1672  m_out->Print( aNestLevel, "(segment (start %s) (end %s) (width %s)",
1673  FormatInternalUnits( aTrack->GetStart() ).c_str(), FormatInternalUnits( aTrack->GetEnd() ).c_str(),
1674  FormatInternalUnits( aTrack->GetWidth() ).c_str() );
1675 
1676  m_out->Print( 0, " (layer %s)", m_out->Quotew( aTrack->GetLayerName() ).c_str() );
1677  }
1678 
1679  m_out->Print( 0, " (net %d)", m_mapping->Translate( aTrack->GetNetCode() ) );
1680 
1681  if( aTrack->GetTimeStamp() != 0 )
1682  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aTrack->GetTimeStamp() );
1683 
1684  if( aTrack->GetStatus() != 0 )
1685  m_out->Print( 0, " (status %X)", aTrack->GetStatus() );
1686 
1687  m_out->Print( 0, ")\n" );
1688 }
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:478
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 1691 of file kicad_plugin.cpp.

1692 {
1693  // Save the NET info; For keepout zones, net code and net name are irrelevant
1694  // so be sure a dummy value is stored, just for ZONE_CONTAINER compatibility
1695  // (perhaps netcode and netname should be not stored)
1696  m_out->Print( aNestLevel, "(zone (net %d) (net_name %s)",
1697  aZone->GetIsKeepout() ? 0 : m_mapping->Translate( aZone->GetNetCode() ),
1698  m_out->Quotew( aZone->GetIsKeepout() ? wxT("") : aZone->GetNetname() ).c_str() );
1699 
1700  // If a zone exists on multiple layers, format accordingly
1701  if( aZone->GetLayerSet().count() > 1 )
1702  {
1703  formatLayers( aZone->GetLayerSet() );
1704  }
1705  else
1706  {
1707  formatLayer( aZone );
1708  }
1709 
1710  m_out->Print( 0, " (tstamp %lX)", (unsigned long) aZone->GetTimeStamp() );
1711 
1712  // Save the outline aux info
1713  std::string hatch;
1714 
1715  switch( aZone->GetHatchStyle() )
1716  {
1717  default:
1718  case ZONE_CONTAINER::NO_HATCH: hatch = "none"; break;
1719  case ZONE_CONTAINER::DIAGONAL_EDGE: hatch = "edge"; break;
1720  case ZONE_CONTAINER::DIAGONAL_FULL: hatch = "full"; break;
1721  }
1722 
1723  m_out->Print( 0, " (hatch %s %s)\n", hatch.c_str(),
1724  FormatInternalUnits( aZone->GetHatchPitch() ).c_str() );
1725 
1726  if( aZone->GetPriority() > 0 )
1727  m_out->Print( aNestLevel+1, "(priority %d)\n", aZone->GetPriority() );
1728 
1729  m_out->Print( aNestLevel+1, "(connect_pads" );
1730 
1731  switch( aZone->GetPadConnection() )
1732  {
1733  default:
1734  case PAD_ZONE_CONN_THERMAL: // Default option not saved or loaded.
1735  break;
1736 
1738  m_out->Print( 0, " thru_hole_only" );
1739  break;
1740 
1741  case PAD_ZONE_CONN_FULL:
1742  m_out->Print( 0, " yes" );
1743  break;
1744 
1745  case PAD_ZONE_CONN_NONE:
1746  m_out->Print( 0, " no" );
1747  break;
1748  }
1749 
1750  m_out->Print( 0, " (clearance %s))\n",
1751  FormatInternalUnits( aZone->GetZoneClearance() ).c_str() );
1752 
1753  m_out->Print( aNestLevel+1, "(min_thickness %s)",
1754  FormatInternalUnits( aZone->GetMinThickness() ).c_str() );
1755 
1756  // write it only if V 6.O version option is not used (i.e. do not write if the
1757  // "legacy" algorithm is used)
1758  if( !aZone->GetFilledPolysUseThickness() )
1759  m_out->Print( 0, " (filled_areas_thickness no)" );
1760 
1761  m_out->Print( 0, "\n" );
1762 
1763  if( aZone->GetIsKeepout() )
1764  {
1765  m_out->Print( aNestLevel+1, "(keepout (tracks %s) (vias %s) (copperpour %s))\n",
1766  aZone->GetDoNotAllowTracks() ? "not_allowed" : "allowed",
1767  aZone->GetDoNotAllowVias() ? "not_allowed" : "allowed",
1768  aZone->GetDoNotAllowCopperPour() ? "not_allowed" : "allowed" );
1769  }
1770 
1771  m_out->Print( aNestLevel+1, "(fill" );
1772 
1773  // Default is not filled.
1774  if( aZone->IsFilled() )
1775  m_out->Print( 0, " yes" );
1776 
1777  // Default is polygon filled.
1778  if( aZone->GetFillMode() == ZFM_HATCH_PATTERN )
1779  m_out->Print( 0, " (mode hatch)" );
1780 
1781  m_out->Print( 0, " (thermal_gap %s) (thermal_bridge_width %s)",
1782  FormatInternalUnits( aZone->GetThermalReliefGap() ).c_str(),
1783  FormatInternalUnits( aZone->GetThermalReliefCopperBridge() ).c_str() );
1784 
1786  {
1787  m_out->Print( 0, " (smoothing" );
1788 
1789  switch( aZone->GetCornerSmoothingType() )
1790  {
1792  m_out->Print( 0, " chamfer" );
1793  break;
1794 
1796  m_out->Print( 0, " fillet" );
1797  break;
1798 
1799  default:
1800  THROW_IO_ERROR( wxString::Format( _( "unknown zone corner smoothing type %d" ),
1801  aZone->GetCornerSmoothingType() ) );
1802  }
1803  m_out->Print( 0, ")" );
1804 
1805  if( aZone->GetCornerRadius() != 0 )
1806  m_out->Print( 0, " (radius %s)",
1807  FormatInternalUnits( aZone->GetCornerRadius() ).c_str() );
1808  }
1809 
1810  if( aZone->GetFillMode() == ZFM_HATCH_PATTERN )
1811  {
1812  m_out->Print( 0, "\n" );
1813  m_out->Print( aNestLevel+2, "(hatch_thickness %s) (hatch_gap %s) (hatch_orientation %s)",
1814  FormatInternalUnits( aZone->GetHatchFillTypeThickness() ).c_str(),
1815  FormatInternalUnits( aZone->GetHatchFillTypeGap() ).c_str(),
1816  Double2Str( aZone->GetHatchFillTypeOrientation() ).c_str() );
1817 
1818  if( aZone->GetHatchFillTypeSmoothingLevel() > 0 )
1819  {
1820  m_out->Print( 0, "\n" );
1821  m_out->Print( aNestLevel+2, "(hatch_smoothing_level %d) (hatch_smoothing_value %s)",
1823  Double2Str( aZone->GetHatchFillTypeSmoothingValue() ).c_str() );
1824  }
1825  }
1826 
1827  m_out->Print( 0, ")\n" );
1828 
1829  int newLine = 0;
1830 
1831  if( aZone->GetNumCorners() )
1832  {
1833  bool new_polygon = true;
1834  bool is_closed = false;
1835 
1836  for( auto iterator = aZone->IterateWithHoles(); iterator; iterator++ )
1837  {
1838  if( new_polygon )
1839  {
1840  newLine = 0;
1841  m_out->Print( aNestLevel+1, "(polygon\n" );
1842  m_out->Print( aNestLevel+2, "(pts\n" );
1843  new_polygon = false;
1844  is_closed = false;
1845  }
1846 
1847  if( newLine == 0 )
1848  m_out->Print( aNestLevel+3, "(xy %s %s)",
1849  FormatInternalUnits( iterator->x ).c_str(), FormatInternalUnits( iterator->y ).c_str() );
1850  else
1851  m_out->Print( 0, " (xy %s %s)",
1852  FormatInternalUnits( iterator->x ).c_str(), FormatInternalUnits( iterator->y ).c_str() );
1853 
1854  if( newLine < 4 )
1855  {
1856  newLine += 1;
1857  }
1858  else
1859  {
1860  newLine = 0;
1861  m_out->Print( 0, "\n" );
1862  }
1863 
1864  if( iterator.IsEndContour() )
1865  {
1866  is_closed = true;
1867 
1868  if( newLine != 0 )
1869  m_out->Print( 0, "\n" );
1870 
1871  m_out->Print( aNestLevel+2, ")\n" );
1872  m_out->Print( aNestLevel+1, ")\n" );
1873  new_polygon = true;
1874  }
1875  }
1876 
1877  if( !is_closed ) // Should not happen, but...
1878  {
1879  if( newLine != 0 )
1880  m_out->Print( 0, "\n" );
1881 
1882  m_out->Print( aNestLevel+2, ")\n" );
1883  m_out->Print( aNestLevel+1, ")\n" );
1884  }
1885  }
1886 
1887  // Save the PolysList (filled areas)
1888  const SHAPE_POLY_SET& fv = aZone->GetFilledPolysList();
1889  newLine = 0;
1890 
1891  if( !fv.IsEmpty() )
1892  {
1893  bool new_polygon = true;
1894  bool is_closed = false;
1895 
1896  for( auto it = fv.CIterate(); it; ++it )
1897  {
1898  if( new_polygon )
1899  {
1900  newLine = 0;
1901  m_out->Print( aNestLevel+1, "(filled_polygon\n" );
1902  m_out->Print( aNestLevel+2, "(pts\n" );
1903  new_polygon = false;
1904  is_closed = false;
1905  }
1906 
1907  if( newLine == 0 )
1908  m_out->Print( aNestLevel+3, "(xy %s %s)",
1909  FormatInternalUnits( it->x ).c_str(), FormatInternalUnits( it->y ).c_str() );
1910  else
1911  m_out->Print( 0, " (xy %s %s)",
1912  FormatInternalUnits( it->x ) .c_str(), FormatInternalUnits( it->y ).c_str() );
1913 
1914  if( newLine < 4 )
1915  {
1916  newLine += 1;
1917  }
1918  else
1919  {
1920  newLine = 0;
1921  m_out->Print( 0, "\n" );
1922  }
1923 
1924  if( it.IsEndContour() )
1925  {
1926  is_closed = true;
1927 
1928  if( newLine != 0 )
1929  m_out->Print( 0, "\n" );
1930 
1931  m_out->Print( aNestLevel+2, ")\n" );
1932  m_out->Print( aNestLevel+1, ")\n" );
1933  new_polygon = true;
1934  }
1935  }
1936 
1937  if( !is_closed ) // Should not happen, but...
1938  m_out->Print( aNestLevel+1, ")\n" );
1939  }
1940 
1941  // Save the filling segments list
1942  const auto& segs = aZone->FillSegments();
1943 
1944  if( segs.size() )
1945  {
1946  m_out->Print( aNestLevel+1, "(fill_segments\n" );
1947 
1948  for( ZONE_SEGMENT_FILL::const_iterator it = segs.begin(); it != segs.end(); ++it )
1949  {
1950  m_out->Print( aNestLevel+2, "(pts (xy %s) (xy %s))\n",
1951  FormatInternalUnits( wxPoint( it->A ) ).c_str(),
1952  FormatInternalUnits( wxPoint( it->B ) ).c_str() );
1953  }
1954 
1955  m_out->Print( aNestLevel+1, ")\n" );
1956  }
1957 
1958  m_out->Print( aNestLevel, ")\n" );
1959 }
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:511
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:502
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:246
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:864
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:949
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:478
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 659 of file kicad_plugin.cpp.

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

595 {
596  m_out->Print( aNestLevel, "(defaults\n" );
597 
598  m_out->Print( aNestLevel+1, "(edge_clearance %s)\n",
599  FormatInternalUnits( aSettings.m_CopperEdgeClearance ).c_str() );
600 
601  m_out->Print( aNestLevel+1, "(edge_cuts_line_width %s)\n",
602  FormatInternalUnits( aSettings.m_LineThickness[ LAYER_CLASS_EDGES ] ).c_str() );
603 
604  m_out->Print( aNestLevel+1, "(courtyard_line_width %s)\n",
606 
607  m_out->Print( aNestLevel+1, "(copper_line_width %s)\n",
608  FormatInternalUnits( aSettings.m_LineThickness[ LAYER_CLASS_COPPER ] ).c_str() );
609  m_out->Print( aNestLevel+1, "(copper_text_dims (size %s %s) (thickness %s)%s%s)\n",
610  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_COPPER ].x ).c_str(),
611  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_COPPER ].y ).c_str(),
613  aSettings.m_TextItalic[ LAYER_CLASS_COPPER ] ? " italic" : "",
614  aSettings.m_TextUpright[ LAYER_CLASS_COPPER ] ? " keep_upright" : "" );
615 
616  m_out->Print( aNestLevel+1, "(silk_line_width %s)\n",
617  FormatInternalUnits( aSettings.m_LineThickness[ LAYER_CLASS_SILK ] ).c_str() );
618  m_out->Print( aNestLevel+1, "(silk_text_dims (size %s %s) (thickness %s)%s%s)\n",
619  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_SILK ].x ).c_str(),
620  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_SILK ].y ).c_str(),
621  FormatInternalUnits( aSettings.m_TextThickness[ LAYER_CLASS_SILK ] ).c_str(),
622  aSettings.m_TextItalic[ LAYER_CLASS_SILK ] ? " italic" : "",
623  aSettings.m_TextUpright[ LAYER_CLASS_SILK ] ? " keep_upright" : "" );
624 
625  m_out->Print( aNestLevel+1, "(other_layers_line_width %s)\n",
626  FormatInternalUnits( aSettings.m_LineThickness[ LAYER_CLASS_OTHERS ] ).c_str() );
627  m_out->Print( aNestLevel+1, "(other_layers_text_dims (size %s %s) (thickness %s)%s%s)\n",
628  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_OTHERS ].x ).c_str(),
629  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_OTHERS ].y ).c_str(),
631  aSettings.m_TextItalic[ LAYER_CLASS_OTHERS ] ? " italic" : "",
632  aSettings.m_TextUpright[ LAYER_CLASS_OTHERS ] ? " keep_upright" : "" );
633 
634  m_out->Print( aNestLevel, ")\n" );
635 }
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:478

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

639 {
640  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
641 
642  m_out->Print( 0, "\n" );
643  m_out->Print( aNestLevel, "(general\n" );
644  // Write Bounding box info
645  m_out->Print( aNestLevel+1, "(thickness %s)\n",
646  FormatInternalUnits( dsnSettings.GetBoardThickness() ).c_str() );
647 
648  m_out->Print( aNestLevel+1, "(drawings %u)\n", (unsigned)aBoard->Drawings().size() );
649  m_out->Print( aNestLevel + 1, "(tracks %u)\n", (unsigned)aBoard->Tracks().size() );
650  m_out->Print( aNestLevel + 1, "(modules %u)\n", (unsigned)aBoard->Modules().size() );
651  m_out->Print( aNestLevel+1, "(nets %d)\n", m_mapping->GetSize() );
652  m_out->Print( aNestLevel, ")\n\n" );
653 
654  aBoard->GetPageSettings().Format( m_out, aNestLevel, m_ctl );
655  aBoard->GetTitleBlock().Format( m_out, aNestLevel, m_ctl );
656 }
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:478
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 748 of file kicad_plugin.cpp.

749 {
750  formatGeneral( aBoard, aNestLevel );
751  // Layers list.
752  formatBoardLayers( aBoard, aNestLevel );
753 
754  // Setup
755  formatSetup( aBoard, aNestLevel );
756 
757  // Save net codes and names
758  formatNetInformation( aBoard, aNestLevel );
759 }
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 456 of file kicad_plugin.cpp.

457 {
458  if( m_ctl & CTL_STD_LAYER_NAMES )
459  {
460  PCB_LAYER_ID layer = aItem->GetLayer();
461 
462  // English layer names should never need quoting.
463  m_out->Print( 0, " (layer %s)", TO_UTF8( BOARD::GetStandardLayerName( layer ) ) );
464  }
465  else
466  m_out->Print( 0, " (layer %s)", m_out->Quotew( aItem->GetLayerName() ).c_str() );
467 }
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 1196 of file kicad_plugin.cpp.

1197 {
1198  std::string output;
1199 
1200  if( aNestLevel == 0 )
1201  output += ' ';
1202 
1203  output += "(layers";
1204 
1205  static const LSET cu_all( LSET::AllCuMask() );
1206  static const LSET fr_bk( 2, B_Cu, F_Cu );
1207  static const LSET adhes( 2, B_Adhes, F_Adhes );
1208  static const LSET paste( 2, B_Paste, F_Paste );
1209  static const LSET silks( 2, B_SilkS, F_SilkS );
1210  static const LSET mask( 2, B_Mask, F_Mask );
1211  static const LSET crt_yd(2, B_CrtYd, F_CrtYd );
1212  static const LSET fab( 2, B_Fab, F_Fab );
1213 
1214  LSET cu_mask = cu_all;
1215 
1216  // output copper layers first, then non copper
1217 
1218  if( ( aLayerMask & cu_mask ) == cu_mask )
1219  {
1220  output += " *.Cu";
1221  aLayerMask &= ~cu_all; // clear bits, so they are not output again below
1222  }
1223  else if( ( aLayerMask & cu_mask ) == fr_bk )
1224  {
1225  output += " F&B.Cu";
1226  aLayerMask &= ~fr_bk;
1227  }
1228 
1229  if( ( aLayerMask & adhes ) == adhes )
1230  {
1231  output += " *.Adhes";
1232  aLayerMask &= ~adhes;
1233  }
1234 
1235  if( ( aLayerMask & paste ) == paste )
1236  {
1237  output += " *.Paste";
1238  aLayerMask &= ~paste;
1239  }
1240 
1241  if( ( aLayerMask & silks ) == silks )
1242  {
1243  output += " *.SilkS";
1244  aLayerMask &= ~silks;
1245  }
1246 
1247  if( ( aLayerMask & mask ) == mask )
1248  {
1249  output += " *.Mask";
1250  aLayerMask &= ~mask;
1251  }
1252 
1253  if( ( aLayerMask & crt_yd ) == crt_yd )
1254  {
1255  output += " *.CrtYd";
1256  aLayerMask &= ~crt_yd;
1257  }
1258 
1259  if( ( aLayerMask & fab ) == fab )
1260  {
1261  output += " *.Fab";
1262  aLayerMask &= ~fab;
1263  }
1264 
1265  // output any individual layers not handled in wildcard combos above
1266 
1267  wxString layerName;
1268 
1269  for( LAYER_NUM layer = 0; layer < PCB_LAYER_ID_COUNT; ++layer )
1270  {
1271  if( aLayerMask[layer] )
1272  {
1273  if( m_board && !( m_ctl & CTL_STD_LAYER_NAMES ) )
1274  layerName = m_board->GetLayerName( PCB_LAYER_ID( layer ) );
1275 
1276  else // I am being called from FootprintSave()
1277  layerName = BOARD::GetStandardLayerName( PCB_LAYER_ID( layer ) );
1278 
1279  output += ' ';
1280  output += m_out->Quotew( layerName );
1281  }
1282  }
1283 
1284  m_out->Print( aNestLevel, "%s)", output.c_str() );
1285 }
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 721 of file kicad_plugin.cpp.

722 {
723  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
724  for( NETINFO_ITEM* net : *m_mapping )
725  {
726  m_out->Print( aNestLevel, "(net %d %s)\n",
727  m_mapping->Translate( net->GetNet() ),
728  m_out->Quotew( net->GetNetname() ).c_str() );
729  }
730 
731  m_out->Print( 0, "\n" );
732 
733  // Save the default net class first.
734  NETCLASS defaultNC = *dsnSettings.GetDefault();
735  filterNetClass( *aBoard, defaultNC ); // Remove empty nets (from a copy of a netclass)
736  defaultNC.Format( m_out, aNestLevel, m_ctl );
737 
738  // Save the rest of the net classes alphabetically.
739  for( const auto& it : dsnSettings.m_NetClasses )
740  {
741  NETCLASS netclass = *it.second;
742  filterNetClass( *aBoard, netclass ); // Remove empty nets (from a copy of a netclass)
743  netclass.Format( m_out, aNestLevel, m_ctl );
744  }
745 }
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 470 of file kicad_plugin.cpp.

471 {
472  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
473 
474  // Setup
475  m_out->Print( aNestLevel, "(setup\n" );
476 
477  // Save the board physical stackup structure
479 
480  if( aBoard->GetDesignSettings().m_HasStackup )
481  stackup.FormatBoardStackup( m_out,aBoard, aNestLevel+1 );
482 
483  // Save current default track width, for compatibility with older Pcbnew version;
484  m_out->Print( aNestLevel+1, "(last_trace_width %s)\n",
485  FormatInternalUnits( dsnSettings.GetCurrentTrackWidth() ).c_str() );
486 
487  // Save custom track widths list (the first is not saved here: it's the netclass value)
488  for( unsigned ii = 1; ii < dsnSettings.m_TrackWidthList.size(); ii++ )
489  {
490  m_out->Print( aNestLevel+1, "(user_trace_width %s)\n",
491  FormatInternalUnits( dsnSettings.m_TrackWidthList[ii] ).c_str() );
492  }
493 
494  m_out->Print( aNestLevel+1, "(trace_clearance %s)\n",
495  FormatInternalUnits( dsnSettings.GetDefault()->GetClearance() ).c_str() );
496 
497  // ZONE_SETTINGS
498  m_out->Print( aNestLevel+1, "(zone_clearance %s)\n",
499  FormatInternalUnits( aBoard->GetZoneSettings().m_ZoneClearance ).c_str() );
500  m_out->Print( aNestLevel+1, "(zone_45_only %s)\n",
501  aBoard->GetZoneSettings().m_Zone_45_Only ? "yes" : "no" );
502 
503  m_out->Print( aNestLevel+1, "(trace_min %s)\n",
504  FormatInternalUnits( dsnSettings.m_TrackMinWidth ).c_str() );
505 
506  // Save current default via size, for compatibility with older Pcbnew version;
507  m_out->Print( aNestLevel+1, "(via_size %s)\n",
508  FormatInternalUnits( dsnSettings.GetDefault()->GetViaDiameter() ).c_str() );
509  m_out->Print( aNestLevel+1, "(via_drill %s)\n",
510  FormatInternalUnits( dsnSettings.GetDefault()->GetViaDrill() ).c_str() );
511  m_out->Print( aNestLevel+1, "(via_min_size %s)\n",
512  FormatInternalUnits( dsnSettings.m_ViasMinSize ).c_str() );
513  m_out->Print( aNestLevel+1, "(via_min_drill %s)\n",
514  FormatInternalUnits( dsnSettings.m_ViasMinDrill ).c_str() );
515 
516  // Save custom via dimensions list (the first is not saved here: it's the netclass value)
517  for( unsigned ii = 1; ii < dsnSettings.m_ViasDimensionsList.size(); ii++ )
518  m_out->Print( aNestLevel+1, "(user_via %s %s)\n",
519  FormatInternalUnits( dsnSettings.m_ViasDimensionsList[ii].m_Diameter ).c_str(),
520  FormatInternalUnits( dsnSettings.m_ViasDimensionsList[ii].m_Drill ).c_str() );
521 
522  // Save custom diff-pair dimensions (the first is not saved here: it's the netclass value)
523  for( unsigned ii = 1; ii < dsnSettings.m_DiffPairDimensionsList.size(); ii++ )
524  {
525  m_out->Print( aNestLevel+1, "(user_diff_pair %s %s %s)\n",
526  FormatInternalUnits( dsnSettings.m_DiffPairDimensionsList[ii].m_Width ).c_str(),
527  FormatInternalUnits( dsnSettings.m_DiffPairDimensionsList[ii].m_Gap ).c_str(),
528  FormatInternalUnits( dsnSettings.m_DiffPairDimensionsList[ii].m_ViaGap ).c_str() );
529  }
530 
531  // for old versions compatibility:
532  if( dsnSettings.m_BlindBuriedViaAllowed )
533  m_out->Print( aNestLevel+1, "(blind_buried_vias_allowed yes)\n" );
534 
535  m_out->Print( aNestLevel+1, "(uvia_size %s)\n",
536  FormatInternalUnits( dsnSettings.GetDefault()->GetuViaDiameter() ).c_str() );
537  m_out->Print( aNestLevel+1, "(uvia_drill %s)\n",
538  FormatInternalUnits( dsnSettings.GetDefault()->GetuViaDrill() ).c_str() );
539  m_out->Print( aNestLevel+1, "(uvias_allowed %s)\n",
540  ( dsnSettings.m_MicroViasAllowed ) ? "yes" : "no" );
541  m_out->Print( aNestLevel+1, "(uvia_min_size %s)\n",
542  FormatInternalUnits( dsnSettings.m_MicroViasMinSize ).c_str() );
543  m_out->Print( aNestLevel+1, "(uvia_min_drill %s)\n",
544  FormatInternalUnits( dsnSettings.m_MicroViasMinDrill ).c_str() );
545 
546  m_out->Print( aNestLevel+1, "(max_error %s)\n",
547  FormatInternalUnits( dsnSettings.m_MaxError ).c_str() );
548 
549  // Store this option only if it is not the legacy option:
550  if( dsnSettings.m_ZoneUseNoOutlineInFill )
551  m_out->Print( aNestLevel+1, "(filled_areas_thickness no)\n" );
552 
553  formatDefaults( dsnSettings, aNestLevel+1 );
554 
555  m_out->Print( aNestLevel+1, "(pad_size %s %s)\n",
556  FormatInternalUnits( dsnSettings.m_Pad_Master.GetSize().x ).c_str(),
557  FormatInternalUnits( dsnSettings.m_Pad_Master.GetSize().y ).c_str() );
558  m_out->Print( aNestLevel+1, "(pad_drill %s)\n",
559  FormatInternalUnits( dsnSettings.m_Pad_Master.GetDrillSize().x ).c_str() );
560 
561  m_out->Print( aNestLevel+1, "(pad_to_mask_clearance %s)\n",
562  FormatInternalUnits( dsnSettings.m_SolderMaskMargin ).c_str() );
563 
564  if( dsnSettings.m_SolderMaskMinWidth )
565  m_out->Print( aNestLevel+1, "(solder_mask_min_width %s)\n",
566  FormatInternalUnits( dsnSettings.m_SolderMaskMinWidth ).c_str() );
567 
568  if( dsnSettings.m_SolderPasteMargin != 0 )
569  m_out->Print( aNestLevel+1, "(pad_to_paste_clearance %s)\n",
570  FormatInternalUnits( dsnSettings.m_SolderPasteMargin ).c_str() );
571 
572  if( dsnSettings.m_SolderPasteMarginRatio != 0 )
573  m_out->Print( aNestLevel+1, "(pad_to_paste_clearance_ratio %s)\n",
574  Double2Str( dsnSettings.m_SolderPasteMarginRatio ).c_str() );
575 
576  m_out->Print( aNestLevel+1, "(aux_axis_origin %s %s)\n",
577  FormatInternalUnits( aBoard->GetAuxOrigin().x ).c_str(),
578  FormatInternalUnits( aBoard->GetAuxOrigin().y ).c_str() );
579 
580  if( aBoard->GetGridOrigin().x || aBoard->GetGridOrigin().y )
581  m_out->Print( aNestLevel+1, "(grid_origin %s %s)\n",
582  FormatInternalUnits( aBoard->GetGridOrigin().x ).c_str(),
583  FormatInternalUnits( aBoard->GetGridOrigin().y ).c_str() );
584 
585  m_out->Print( aNestLevel+1, "(visible_elements %X)\n",
586  dsnSettings.GetVisibleElements() );
587 
588  aBoard->GetPlotOptions().Format( m_out, aNestLevel+1 );
589 
590  m_out->Print( aNestLevel, ")\n\n" );
591 }
void FormatBoardStackup(OUTPUTFORMATTER *aFormatter, BOARD *aBoard, int aNestLevel) const
Writes the stackup info on board file.
int m_SolderMaskMargin
Solder mask margin.
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const PCB_PLOT_PARAMS & GetPlotOptions() const
Definition: class_board.h:558
int m_SolderPasteMargin
Solder paste margin absolute value.
int GetCurrentTrackWidth() const
Function GetCurrentTrackWidth.
this class manage the layers needed to make a physical board they are solder mask,...
std::vector< int > m_TrackWidthList
std::vector< DIFF_PAIR_DIMENSION > m_DiffPairDimensionsList
void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControl=0) const
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h: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
BOARD_STACKUP & GetStackupDescriptor()
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
bool m_HasStackup
Set to true if the board has a stackup management.
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:478
int m_SolderMaskMinWidth
Solder mask min width.
Class BOARD_DESIGN_SETTINGS contains design settings for a BOARD object.

References Double2Str(), PCB_PLOT_PARAMS::Format(), BOARD_STACKUP::FormatBoardStackup(), 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::GetStackupDescriptor(), BOARD_DESIGN_SETTINGS::GetVisibleElements(), BOARD::GetZoneSettings(), BOARD_DESIGN_SETTINGS::m_BlindBuriedViaAllowed, BOARD_DESIGN_SETTINGS::m_DiffPairDimensionsList, BOARD_DESIGN_SETTINGS::m_HasStackup, 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 2104 of file kicad_plugin.cpp.

2107 {
2108  return getFootprint( aLibraryPath, aFootprintName, aProperties, false );
2109 }
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 109 of file pcbnew/kicad_plugin.h.

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

◆ getFootprint()

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

Definition at line 2075 of file kicad_plugin.cpp.

2079 {
2080  LOCALE_IO toggle; // toggles on, then off, the C locale.
2081 
2082  init( aProperties );
2083 
2084  try
2085  {
2086  validateCache( aLibraryPath, checkModified );
2087  }
2088  catch( const IO_ERROR& )
2089  {
2090  // do nothing with the error
2091  }
2092 
2093  const MODULE_MAP& mods = m_cache->GetModules();
2094 
2095  MODULE_CITER it = mods.find( aFootprintName );
2096 
2097  if( it == mods.end() )
2098  return nullptr;
2099 
2100  return it->second->GetModule();
2101 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:154
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 2260 of file kicad_plugin.cpp.

2261 {
2262  return FP_CACHE::GetTimestamp( aLibraryPath );
2263 }
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 167 of file pcbnew/kicad_plugin.h.

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

2026 {
2027  m_board = NULL;
2028  m_reader = NULL;
2030  m_props = aProperties;
2031 }
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 2361 of file kicad_plugin.cpp.

2362 {
2363  LOCALE_IO toggle;
2364 
2365  init( NULL );
2366 
2367  validateCache( aLibraryPath );
2368 
2369  return m_cache->IsWritable();
2370 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:154
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 1981 of file kicad_plugin.cpp.

1982 {
1983  FILE_LINE_READER reader( aFileName );
1984 
1985  init( aProperties );
1986 
1987  m_parser->SetLineReader( &reader );
1988  m_parser->SetBoard( aAppendToMe );
1989 
1990  BOARD* board;
1991 
1992  try
1993  {
1994  board = dynamic_cast<BOARD*>( m_parser->Parse() );
1995  }
1996  catch( const FUTURE_FORMAT_ERROR& )
1997  {
1998  // Don't wrap a FUTURE_FORMAT_ERROR in another
1999  throw;
2000  }
2001  catch( const PARSE_ERROR& parse_error )
2002  {
2003  if( m_parser->IsTooRecent() )
2004  throw FUTURE_FORMAT_ERROR( parse_error, m_parser->GetRequiredVersion() );
2005  else
2006  throw;
2007  }
2008 
2009  if( !board )
2010  {
2011  // The parser loaded something that was valid, but wasn't a board.
2012  THROW_PARSE_ERROR( _( "this file does not contain a PCB" ),
2013  m_parser->CurSource(), m_parser->CurLine(),
2014  m_parser->CurLineNumber(), m_parser->CurOffset() );
2015  }
2016 
2017  // Give the filename to the board if it's new
2018  if( !aAppendToMe )
2019  board->SetFileName( aFileName );
2020 
2021  return board;
2022 }
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:206
void SetBoard(BOARD *aBoard)
Definition: pcb_parser.h:337
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:466
#define _(s)
LINE_READER * SetLineReader(LINE_READER *aReader)
Function SetLineReader sets aLineReader into the parser, and returns the previous one,...
Definition: pcb_parser.h:330
bool IsTooRecent()
Return whether a version number, if any was parsed, was too recent.
Definition: pcb_parser.h:355
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 377 of file kicad_plugin.cpp.

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

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

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

354 {
355  LOCALE_IO toggle; // toggles on, then off, the C locale.
356 
357  init( aProperties );
358 
359  m_board = aBoard; // after init()
360 
361  // Prepare net mapping that assures that net codes saved in a file are consecutive integers
362  m_mapping->SetBoard( aBoard );
363 
364  FILE_OUTPUTFORMATTER formatter( aFileName );
365 
366  m_out = &formatter; // no ownership
367 
368  m_out->Print( 0, "(kicad_pcb (version %d) (host pcbnew %s)\n", SEXPR_BOARD_FILE_VERSION,
369  formatter.Quotew( GetBuildVersion() ).c_str() );
370 
371  Format( aBoard, 1 );
372 
373  m_out->Print( 0, ")\n" );
374 }
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:154
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 176 of file pcbnew/kicad_plugin.h.

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

2035 {
2036  if( !m_cache || !m_cache->IsPath( aLibraryPath ) || ( checkModified && m_cache->IsModified() ) )
2037  {
2038  // a spectacular episode in memory management:
2039  delete m_cache;
2040  m_cache = new FP_CACHE( this, aLibraryPath );
2041  m_cache->Load();
2042  }
2043 }
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 98 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 182 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 190 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 192 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 198 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 186 of file pcbnew/kicad_plugin.h.

Referenced by init().

◆ m_reader

LINE_READER* PCB_IO::m_reader
protected

no ownership here.

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

Referenced by init().

◆ m_sf

STRING_FORMATTER PCB_IO::m_sf
protected

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

Referenced by GetStringOutput(), and PCB_IO().


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