KiCad PCB EDA Suite
PCB_IO Class Reference

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

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 100 of file pcbnew/kicad_plugin.h.

Constructor & Destructor Documentation

◆ PCB_IO()

PCB_IO::PCB_IO ( int  aControlFlags = CTL_FOR_BOARD)

Definition at line 2022 of file kicad_plugin.cpp.

2022  :
2023  m_cache( 0 ),
2024  m_ctl( aControlFlags ),
2025  m_parser( new PCB_PARSER() ),
2026  m_mapping( new NETINFO_MAPPING() )
2027 {
2028  init( 0 );
2029  m_out = &m_sf;
2030 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
FP_CACHE * m_cache
Footprint library cache.
PCB_PARSER reads a Pcbnew s-expression formatted LINE_READER object and returns the appropriate BOARD...
Definition: pcb_parser.h:69
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 2033 of file kicad_plugin.cpp.

2034 {
2035  delete m_cache;
2036  delete m_parser;
2037  delete m_mapping;
2038 }
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 2300 of file kicad_plugin.cpp.

2302 {
2303  LOCALE_IO toggle; // toggles on, then off, the C locale.
2304 
2305  init( aProperties );
2306 
2307  validateCache( aLibraryPath );
2308 
2309  if( !m_cache->IsWritable() )
2310  {
2311  THROW_IO_ERROR( wxString::Format( _( "Library \"%s\" is read only." ),
2312  aLibraryPath.GetData() ) );
2313  }
2314 
2315  m_cache->Remove( aFootprintName );
2316 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:202
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
void Remove(const wxString &aFootprintName)
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
#define THROW_IO_ERROR(msg)
bool IsWritable() const
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
#define _(s)
Definition: 3d_actions.cpp:33

References _, Format(), 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 2106 of file kicad_plugin.cpp.

2108 {
2109  LOCALE_IO toggle; // toggles on, then off, the C locale.
2110  wxDir dir( aLibPath );
2111  wxString errorMsg;
2112 
2113  init( aProperties );
2114 
2115  try
2116  {
2117  validateCache( aLibPath );
2118  }
2119  catch( const IO_ERROR& ioe )
2120  {
2121  errorMsg = ioe.What();
2122  }
2123 
2124  // Some of the files may have been parsed correctly so we want to add the valid files to
2125  // the library.
2126 
2127  for( MODULE_CITER it = m_cache->GetModules().begin(); it != m_cache->GetModules().end(); ++it )
2128  aFootprintNames.Add( it->first );
2129 
2130  if( !errorMsg.IsEmpty() && !aBestEfforts )
2131  THROW_IO_ERROR( errorMsg );
2132 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:202
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 2172 of file kicad_plugin.cpp.

2174 {
2175  // Note: checking the cache sounds like a good idea, but won't catch files which differ
2176  // only in case.
2177  //
2178  // Since this goes out to the native filesystem, we get platform differences (ie: MSW's
2179  // case-insensitive filesystem) handled "for free".
2180  // Warning: footprint names frequently contain a point. So be careful when initializing
2181  // wxFileName, and use a CTOR with extension specified
2182  wxFileName footprintFile( aLibraryPath, aFootprintName, KiCadFootprintFileExtension );
2183 
2184  return footprintFile.Exists();
2185 }
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 2326 of file kicad_plugin.cpp.

2327 {
2328  if( wxDir::Exists( aLibraryPath ) )
2329  {
2330  THROW_IO_ERROR( wxString::Format( _( "Cannot overwrite library path \"%s\"." ),
2331  aLibraryPath.GetData() ) );
2332  }
2333 
2334  LOCALE_IO toggle;
2335 
2336  init( aProperties );
2337 
2338  delete m_cache;
2339  m_cache = new FP_CACHE( this, aLibraryPath );
2340  m_cache->Save();
2341 }
friend class FP_CACHE
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:202
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
#define THROW_IO_ERROR(msg)
void Save(MODULE *aModule=NULL)
Function Save Save the footprint cache or a single module from it to disk.
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
#define _(s)
Definition: 3d_actions.cpp:33

References _, Format(), 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 2344 of file kicad_plugin.cpp.

2345 {
2346  wxFileName fn;
2347  fn.SetPath( aLibraryPath );
2348 
2349  // Return if there is no library path to delete.
2350  if( !fn.DirExists() )
2351  return false;
2352 
2353  if( !fn.IsDirWritable() )
2354  {
2355  THROW_IO_ERROR( wxString::Format( _( "User does not have permission to delete directory \"%s\"." ),
2356  aLibraryPath.GetData() ) );
2357  }
2358 
2359  wxDir dir( aLibraryPath );
2360 
2361  if( dir.HasSubDirs() )
2362  {
2363  THROW_IO_ERROR( wxString::Format( _( "Library directory \"%s\" has unexpected sub-directories." ),
2364  aLibraryPath.GetData() ) );
2365  }
2366 
2367  // All the footprint files must be deleted before the directory can be deleted.
2368  if( dir.HasFiles() )
2369  {
2370  unsigned i;
2371  wxFileName tmp;
2372  wxArrayString files;
2373 
2374  wxDir::GetAllFiles( aLibraryPath, &files );
2375 
2376  for( i = 0; i < files.GetCount(); i++ )
2377  {
2378  tmp = files[i];
2379 
2380  if( tmp.GetExt() != KiCadFootprintFileExtension )
2381  {
2382  THROW_IO_ERROR( wxString::Format( _( "Unexpected file \"%s\" was found in library path \"%s\"." ),
2383  files[i].GetData(), aLibraryPath.GetData() ) );
2384  }
2385  }
2386 
2387  for( i = 0; i < files.GetCount(); i++ )
2388  wxRemoveFile( files[i] );
2389  }
2390 
2391  wxLogTrace( traceKicadPcbPlugin, wxT( "Removing footprint library \"%s\"." ),
2392  aLibraryPath.GetData() );
2393 
2394  // Some of the more elaborate wxRemoveFile() crap puts up its own wxLog dialog
2395  // we don't want that. we want bare metal portability with no UI here.
2396  if( !wxRmdir( aLibraryPath ) )
2397  {
2398  THROW_IO_ERROR( wxString::Format( _( "Footprint library \"%s\" cannot be deleted." ),
2399  aLibraryPath.GetData() ) );
2400  }
2401 
2402  // For some reason removing a directory in Windows is not immediately updated. This delay
2403  // prevents an error when attempting to immediately recreate the same directory when over
2404  // writing an existing library.
2405 #ifdef __WINDOWS__
2406  wxMilliSleep( 250L );
2407 #endif
2408 
2409  if( m_cache && !m_cache->IsPath( aLibraryPath ) )
2410  {
2411  delete m_cache;
2412  m_cache = NULL;
2413  }
2414 
2415  return true;
2416 }
const std::string KiCadFootprintFileExtension
FP_CACHE * m_cache
Footprint library cache.
#define NULL
bool IsPath(const wxString &aPath) const
Function IsPath checks if aPath is the same as the current cache path.
const wxChar *const traceKicadPcbPlugin
Flag to enable GEDA PCB plugin debug output.
#define THROW_IO_ERROR(msg)
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
#define _(s)
Definition: 3d_actions.cpp:33

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

Referenced by GITHUB_PLUGIN::FootprintLibDelete().

◆ FootprintLibOptions()

void PLUGIN::FootprintLibOptions ( PROPERTIES aListToAppendTo) const
virtualinherited

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

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

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

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

Reimplemented in GITHUB_PLUGIN, and EAGLE_PLUGIN.

Definition at line 140 of file plugin.cpp.

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

References _.

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

◆ FootprintLoad()

MODULE * PCB_IO::FootprintLoad ( const wxString &  aLibraryPath,
const wxString &  aFootprintName,
const PROPERTIES aProperties = NULL 
)
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 2188 of file kicad_plugin.cpp.

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

References BOARD_ITEM::Duplicate(), and 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 2196 of file kicad_plugin.cpp.

2198 {
2199  LOCALE_IO toggle; // toggles on, then off, the C locale.
2200 
2201  init( aProperties );
2202 
2203  // In this public PLUGIN API function, we can safely assume it was
2204  // called for saving into a library path.
2206 
2207  validateCache( aLibraryPath );
2208 
2209  if( !m_cache->IsWritable() )
2210  {
2211  if( !m_cache->Exists() )
2212  {
2213  const wxString msg = wxString::Format( _( "Library \"%s\" does not exist.\n"
2214  "Would you like to create it?"),
2215  GetChars( aLibraryPath ) );
2216 
2217  if( wxMessageBox( msg, _( "Library Not Found"), wxYES_NO | wxICON_QUESTION ) != wxYES )
2218  return;
2219 
2220  // Save throws its own IO_ERROR on failure, so no need to recreate here
2221  m_cache->Save( NULL );
2222  }
2223  else
2224  {
2225  wxString msg = wxString::Format( _( "Library \"%s\" is read only" ), aLibraryPath );
2226  THROW_IO_ERROR( msg );
2227  }
2228  }
2229 
2230  wxString footprintName = aFootprint->GetFPID().GetLibItemName();
2231 
2232  MODULE_MAP& mods = m_cache->GetModules();
2233 
2234  // Quietly overwrite module and delete module file from path for any by same name.
2235  wxFileName fn( aLibraryPath, aFootprint->GetFPID().GetLibItemName(),
2237 
2238 #ifndef __WINDOWS__
2239  // Write through symlinks, don't replace them
2240  if( fn.Exists( wxFILE_EXISTS_SYMLINK ) )
2241  {
2242  char buffer[ PATH_MAX + 1 ];
2243  ssize_t pathLen = readlink( TO_UTF8( fn.GetFullPath() ), buffer, PATH_MAX );
2244 
2245  if( pathLen > 0 )
2246  {
2247  buffer[ pathLen ] = '\0';
2248  fn.Assign( fn.GetPath() + wxT( "/" ) + wxString::FromUTF8( buffer ) );
2249  fn.Normalize();
2250  }
2251  }
2252 #endif
2253 
2254  if( !fn.IsOk() )
2255  {
2256  THROW_IO_ERROR( wxString::Format( _( "Footprint file name \"%s\" is not valid." ),
2257  fn.GetFullPath() ) );
2258  }
2259 
2260  if( fn.FileExists() && !fn.IsFileWritable() )
2261  {
2262  THROW_IO_ERROR( wxString::Format( _( "No write permissions to delete file \"%s\"" ),
2263  fn.GetFullPath() ) );
2264  }
2265 
2266  wxString fullPath = fn.GetFullPath();
2267  wxString fullName = fn.GetFullName();
2268  MODULE_CITER it = mods.find( footprintName );
2269 
2270  if( it != mods.end() )
2271  {
2272  wxLogTrace( traceKicadPcbPlugin, wxT( "Removing footprint file '%s'." ), fullPath );
2273  mods.erase( footprintName );
2274  wxRemoveFile( fullPath );
2275  }
2276 
2277  // I need my own copy for the cache
2278  MODULE* module = static_cast<MODULE*>( aFootprint->Duplicate() );
2279 
2280  // It should have no parent, orientation should be zero, and it should be on the front layer.
2281  module->SetParent( nullptr );
2282  module->SetOrientation( 0 );
2283 
2284  if( module->GetLayer() != F_Cu )
2285  {
2286  auto cfg = dynamic_cast<PCBNEW_SETTINGS*>( Kiface().KifaceSettings() );
2287 
2288  if( cfg )
2289  module->Flip( module->GetPosition(), cfg->m_FlipLeftRight );
2290  else
2291  module->Flip( module->GetPosition(), false );
2292  }
2293 
2294  wxLogTrace( traceKicadPcbPlugin, wxT( "Creating s-expr footprint file '%s'." ), fullPath );
2295  mods.insert( footprintName, new FP_CACHE_ITEM( module, WX_FILENAME( fn.GetPath(), fullName ) ) );
2296  m_cache->Save( module );
2297 }
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:202
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:219
std::map< wxString, MODULE * > MODULE_MAP
Definition: eagle_parser.h:51
#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
#define NULL
void SetParent(EDA_ITEM *aParent)
Definition: base_struct.h:218
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
void Flip(const wxPoint &aCentre, bool aFlipLeftRight) override
Function Flip Flip this object, i.e.
KIFACE_I & Kiface()
Global KIFACE_I "get" accessor.
const wxChar *const traceKicadPcbPlugin
Flag to enable GEDA PCB plugin debug output.
#define THROW_IO_ERROR(msg)
FP_CACHE_ITEM is helper class for creating a footprint library cache.
void Save(MODULE *aModule=NULL)
Function Save Save the footprint cache or a single module from it to disk.
bool IsWritable() const
MODULE_MAP::const_iterator MODULE_CITER
#define CTL_FOR_LIBRARY
Format output for a footprint library instead of clipboard or BOARD.
static const wxChar * GetChars(const wxString &s)
Function GetChars returns a wxChar* to the actual wxChar* data within a wxString, and is helpful for ...
Definition: macros.h:101
A wrapper around a wxFileName which is much more performant with a subset of the API.
Definition: common.h:391
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
#define _(s)
Definition: 3d_actions.cpp:33
void SetOrientation(double newangle)
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:210
MODULE_MAP & GetModules()
BOARD_ITEM * Duplicate() const
Function Duplicate creates a copy of a BOARD_ITEM.

References _, CTL_FOR_LIBRARY, BOARD_ITEM::Duplicate(), FP_CACHE::Exists(), F_Cu, MODULE::Flip(), Format(), GetChars(), MODULE::GetFPID(), BOARD_ITEM::GetLayer(), LIB_ID::GetLibItemName(), FP_CACHE::GetModules(), MODULE::GetPosition(), init(), FP_CACHE::IsWritable(), KiCadFootprintFileExtension, Kiface(), m_cache, m_ctl, NULL, FP_CACHE::Save(), MODULE::SetOrientation(), EDA_ITEM::SetParent(), 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 402 of file kicad_plugin.cpp.

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

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

Referenced by FOOTPRINT_EDIT_FRAME::Export_Module(), 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 769 of file kicad_plugin.cpp.

770 {
771  formatHeader( aBoard, aNestLevel );
772 
773  // Save the modules.
774  for( auto module : aBoard->Modules() )
775  {
776  Format( module, aNestLevel );
777  m_out->Print( 0, "\n" );
778  }
779 
780  // Save the graphical items on the board (not owned by a module)
781  for( auto item : aBoard->Drawings() )
782  Format( item, aNestLevel );
783 
784  if( aBoard->Drawings().size() )
785  m_out->Print( 0, "\n" );
786 
787  // Do not save MARKER_PCBs, they can be regenerated easily.
788 
789  // Save the tracks and vias.
790  for( auto track : aBoard->Tracks() )
791  Format( track, aNestLevel );
792 
793  if( aBoard->Tracks().size() )
794  m_out->Print( 0, "\n" );
795 
796  // Save the polygon (which are the newer technology) zones.
797  for( int i = 0; i < aBoard->GetAreaCount(); ++i )
798  Format( aBoard->GetArea( i ), aNestLevel );
799 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
int GetAreaCount() const
Function GetAreaCount.
Definition: class_board.h:919
MODULES & Modules()
Definition: class_board.h:229
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:884
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:238
TRACKS & Tracks()
Definition: class_board.h:220

References BOARD::Drawings(), Format(), formatHeader(), BOARD::GetArea(), BOARD::GetAreaCount(), 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 802 of file kicad_plugin.cpp.

803 {
804  m_out->Print( aNestLevel, "(dimension %s (width %s)",
805  FormatInternalUnits( aDimension->GetValue() ).c_str(),
806  FormatInternalUnits( aDimension->GetWidth() ).c_str() );
807 
808  formatLayer( aDimension );
809 
810  m_out->Print( 0, " (tstamp %s)", TO_UTF8( aDimension->m_Uuid.AsString() ) );
811 
812  m_out->Print( 0, "\n" );
813 
814  Format( &aDimension->Text(), aNestLevel+1 );
815 
816  m_out->Print( aNestLevel+1, "(feature1 (pts (xy %s %s) (xy %s %s)))\n",
817  FormatInternalUnits( aDimension->m_featureLineDO.x ).c_str(),
818  FormatInternalUnits( aDimension->m_featureLineDO.y ).c_str(),
819  FormatInternalUnits( aDimension->m_featureLineDF.x ).c_str(),
820  FormatInternalUnits( aDimension->m_featureLineDF.y ).c_str() );
821 
822  m_out->Print( aNestLevel+1, "(feature2 (pts (xy %s %s) (xy %s %s)))\n",
823  FormatInternalUnits( aDimension->m_featureLineGO.x ).c_str(),
824  FormatInternalUnits( aDimension->m_featureLineGO.y ).c_str(),
825  FormatInternalUnits( aDimension->m_featureLineGF.x ).c_str(),
826  FormatInternalUnits( aDimension->m_featureLineGF.y ).c_str() );
827 
828  m_out->Print( aNestLevel+1, "(crossbar (pts (xy %s %s) (xy %s %s)))\n",
829  FormatInternalUnits( aDimension->m_crossBarO.x ).c_str(),
830  FormatInternalUnits( aDimension->m_crossBarO.y ).c_str(),
831  FormatInternalUnits( aDimension->m_crossBarF.x ).c_str(),
832  FormatInternalUnits( aDimension->m_crossBarF.y ).c_str() );
833 
834  m_out->Print( aNestLevel+1, "(arrow1a (pts (xy %s %s) (xy %s %s)))\n",
835  FormatInternalUnits( aDimension->m_crossBarF.x ).c_str(),
836  FormatInternalUnits( aDimension->m_crossBarF.y ).c_str(),
837  FormatInternalUnits( aDimension->m_arrowD1F.x ).c_str(),
838  FormatInternalUnits( aDimension->m_arrowD1F.y ).c_str() );
839 
840  m_out->Print( aNestLevel+1, "(arrow1b (pts (xy %s %s) (xy %s %s)))\n",
841  FormatInternalUnits( aDimension->m_crossBarF.x ).c_str(),
842  FormatInternalUnits( aDimension->m_crossBarF.y ).c_str(),
843  FormatInternalUnits( aDimension->m_arrowD2F.x ).c_str(),
844  FormatInternalUnits( aDimension->m_arrowD2F.y ).c_str() );
845 
846  m_out->Print( aNestLevel+1, "(arrow2a (pts (xy %s %s) (xy %s %s)))\n",
847  FormatInternalUnits( aDimension->m_crossBarO.x ).c_str(),
848  FormatInternalUnits( aDimension->m_crossBarO.y ).c_str(),
849  FormatInternalUnits( aDimension->m_arrowG1F.x ).c_str(),
850  FormatInternalUnits( aDimension->m_arrowG1F.y ).c_str() );
851 
852  m_out->Print( aNestLevel+1, "(arrow2b (pts (xy %s %s) (xy %s %s)))\n",
853  FormatInternalUnits( aDimension->m_crossBarO.x ).c_str(),
854  FormatInternalUnits( aDimension->m_crossBarO.y ).c_str(),
855  FormatInternalUnits( aDimension->m_arrowG2F.x ).c_str(),
856  FormatInternalUnits( aDimension->m_arrowG2F.y ).c_str() );
857 
858  m_out->Print( aNestLevel, ")\n" );
859 }
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
wxString AsString() const
Definition: common.cpp:170
wxPoint m_featureLineDF
wxPoint m_featureLineGO
#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
int GetValue() const
wxPoint m_arrowG1F
wxPoint m_arrowD2F
wxPoint m_arrowG2F
const KIID m_Uuid
Definition: base_struct.h:169
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:523
wxPoint m_featureLineGF

References KIID::AsString(), Format(), FormatInternalUnits(), formatLayer(), 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, EDA_ITEM::m_Uuid, OUTPUTFORMATTER::Print(), DIMENSION::Text(), TO_UTF8, wxPoint::x, and wxPoint::y.

◆ format() [3/11]

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

Definition at line 939 of file kicad_plugin.cpp.

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

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

863 {
864  switch( aSegment->GetShape() )
865  {
866  case S_SEGMENT: // Line
867  m_out->Print( aNestLevel, "(gr_line (start %s) (end %s)",
868  FormatInternalUnits( aSegment->GetStart() ).c_str(),
869  FormatInternalUnits( aSegment->GetEnd() ).c_str() );
870 
871  if( aSegment->GetAngle() != 0.0 )
872  m_out->Print( 0, " (angle %s)", FormatAngle( aSegment->GetAngle() ).c_str() );
873 
874  break;
875 
876  case S_CIRCLE: // Circle
877  m_out->Print( aNestLevel, "(gr_circle (center %s) (end %s)",
878  FormatInternalUnits( aSegment->GetStart() ).c_str(),
879  FormatInternalUnits( aSegment->GetEnd() ).c_str() );
880  break;
881 
882  case S_ARC: // Arc
883  m_out->Print( aNestLevel, "(gr_arc (start %s) (end %s) (angle %s)",
884  FormatInternalUnits( aSegment->GetStart() ).c_str(),
885  FormatInternalUnits( aSegment->GetEnd() ).c_str(),
886  FormatAngle( aSegment->GetAngle() ).c_str() );
887  break;
888 
889  case S_POLYGON: // Polygon
890  if( aSegment->IsPolyShapeValid() )
891  {
892  SHAPE_POLY_SET& poly = aSegment->GetPolyShape();
893  SHAPE_LINE_CHAIN& outline = poly.Outline( 0 );
894  int pointsCount = outline.PointCount();
895 
896  m_out->Print( aNestLevel, "(gr_poly (pts" );
897 
898  for( int ii = 0; ii < pointsCount; ++ii )
899  {
900  m_out->Print( 0, " (xy %s)", FormatInternalUnits( outline.CPoint( ii ) ).c_str() );
901  }
902 
903  m_out->Print( 0, ")" );
904  }
905  else
906  {
907  wxFAIL_MSG( wxT( "Cannot format invalid polygon." ) );
908  return;
909  }
910 
911  break;
912 
913  case S_CURVE: // Bezier curve
914  m_out->Print( aNestLevel, "(gr_curve (pts (xy %s) (xy %s) (xy %s) (xy %s))",
915  FormatInternalUnits( aSegment->GetStart() ).c_str(),
916  FormatInternalUnits( aSegment->GetBezControl1() ).c_str(),
917  FormatInternalUnits( aSegment->GetBezControl2() ).c_str(),
918  FormatInternalUnits( aSegment->GetEnd() ).c_str() );
919  break;
920 
921  default:
922  wxFAIL_MSG( wxT( "Cannot format invalid DRAWSEGMENT type." ) );
923  return;
924  };
925 
926  formatLayer( aSegment );
927 
928  m_out->Print( 0, " (width %s)", FormatInternalUnits( aSegment->GetWidth() ).c_str() );
929 
930  m_out->Print( 0, " (tstamp %s)", TO_UTF8( aSegment->m_Uuid.AsString() ) );
931 
932  if( aSegment->GetStatus() )
933  m_out->Print( 0, " (status %X)", aSegment->GetStatus() );
934 
935  m_out->Print( 0, ")\n" );
936 }
STATUS_FLAGS GetStatus() const
Definition: base_struct.h:254
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)
wxString AsString() const
Definition: common.cpp:170
usual segment : line with rounded ends
const wxPoint & GetEnd() const
Function GetEnd returns the ending point of the graphic.
int PointCount() const
Function PointCount()
#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
const VECTOR2I & CPoint(int aIndex) const
Function Point()
std::string FormatAngle(double aAngle)
Function FormatAngle converts aAngle from board units to a string appropriate for writing to file.
Definition: base_units.cpp:552
SHAPE_POLY_SET.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Returns the reference to aIndex-th outline in the set
Arcs (with rounded ends)
SHAPE_POLY_SET & GetPolyShape()
Bezier Curve.
int GetWidth() const
const KIID m_Uuid
Definition: base_struct.h:169
double GetAngle() const
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:523

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

◆ format() [5/11]

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

Definition at line 1015 of file kicad_plugin.cpp.

1016 {
1017  m_out->Print( aNestLevel, "(target %s (at %s) (size %s)",
1018  ( aTarget->GetShape() ) ? "x" : "plus",
1019  FormatInternalUnits( aTarget->GetPosition() ).c_str(),
1020  FormatInternalUnits( aTarget->GetSize() ).c_str() );
1021 
1022  if( aTarget->GetWidth() != 0 )
1023  m_out->Print( 0, " (width %s)", FormatInternalUnits( aTarget->GetWidth() ).c_str() );
1024 
1025  formatLayer( aTarget );
1026 
1027  m_out->Print( 0, " (tstamp %s)", TO_UTF8( aTarget->m_Uuid.AsString() ) );
1028 
1029  m_out->Print( 0, ")\n" );
1030 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
void formatLayer(const BOARD_ITEM *aItem) const
int GetSize() const
wxString AsString() const
Definition: common.cpp:170
#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
int GetWidth() const
const KIID m_Uuid
Definition: base_struct.h:169
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:523
const wxPoint GetPosition() const override

References KIID::AsString(), FormatInternalUnits(), formatLayer(), PCB_TARGET::GetPosition(), PCB_TARGET::GetShape(), PCB_TARGET::GetSize(), PCB_TARGET::GetWidth(), m_out, EDA_ITEM::m_Uuid, OUTPUTFORMATTER::Print(), and TO_UTF8.

◆ format() [6/11]

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

Definition at line 1033 of file kicad_plugin.cpp.

1034 {
1035  if( !( m_ctl & CTL_OMIT_INITIAL_COMMENTS ) )
1036  {
1037  const wxArrayString* initial_comments = aModule->GetInitialComments();
1038 
1039  if( initial_comments )
1040  {
1041  for( unsigned i=0; i<initial_comments->GetCount(); ++i )
1042  m_out->Print( aNestLevel, "%s\n", TO_UTF8( (*initial_comments)[i] ) );
1043 
1044  m_out->Print( 0, "\n" ); // improve readability?
1045  }
1046  }
1047 
1048  m_out->Print( aNestLevel, "(module %s",
1049  m_out->Quotes( aModule->GetFPID().Format() ).c_str() );
1050 
1051  if( aModule->IsLocked() )
1052  m_out->Print( 0, " locked" );
1053 
1054  if( aModule->IsPlaced() )
1055  m_out->Print( 0, " placed" );
1056 
1057  formatLayer( aModule );
1058 
1059  m_out->Print( 0, " (tedit %lX)", (unsigned long)aModule->GetLastEditTime() );
1060 
1061  if( !( m_ctl & CTL_OMIT_TSTAMPS ) )
1062  m_out->Print( 0, " (tstamp %s)", TO_UTF8( aModule->m_Uuid.AsString() ) );
1063 
1064  m_out->Print( 0, "\n" );
1065 
1066  if( !( m_ctl & CTL_OMIT_AT ) )
1067  {
1068  m_out->Print( aNestLevel+1, "(at %s", FormatInternalUnits( aModule->GetPosition() ).c_str() );
1069 
1070  if( aModule->GetOrientation() != 0.0 )
1071  m_out->Print( 0, " %s", FormatAngle( aModule->GetOrientation() ).c_str() );
1072 
1073  m_out->Print( 0, ")\n" );
1074  }
1075 
1076  if( !aModule->GetDescription().IsEmpty() )
1077  m_out->Print( aNestLevel+1, "(descr %s)\n",
1078  m_out->Quotew( aModule->GetDescription() ).c_str() );
1079 
1080  if( !aModule->GetKeywords().IsEmpty() )
1081  m_out->Print( aNestLevel+1, "(tags %s)\n",
1082  m_out->Quotew( aModule->GetKeywords() ).c_str() );
1083 
1084  if( !( m_ctl & CTL_OMIT_PATH ) && !aModule->GetPath().empty() )
1085  m_out->Print( aNestLevel+1, "(path %s)\n",
1086  m_out->Quotew( aModule->GetPath().AsString() ).c_str() );
1087 
1088  if( aModule->GetPlacementCost90() != 0 )
1089  m_out->Print( aNestLevel+1, "(autoplace_cost90 %d)\n", aModule->GetPlacementCost90() );
1090 
1091  if( aModule->GetPlacementCost180() != 0 )
1092  m_out->Print( aNestLevel+1, "(autoplace_cost180 %d)\n", aModule->GetPlacementCost180() );
1093 
1094  if( aModule->GetLocalSolderMaskMargin() != 0 )
1095  m_out->Print( aNestLevel+1, "(solder_mask_margin %s)\n",
1096  FormatInternalUnits( aModule->GetLocalSolderMaskMargin() ).c_str() );
1097 
1098  if( aModule->GetLocalSolderPasteMargin() != 0 )
1099  m_out->Print( aNestLevel+1, "(solder_paste_margin %s)\n",
1100  FormatInternalUnits( aModule->GetLocalSolderPasteMargin() ).c_str() );
1101 
1102  if( aModule->GetLocalSolderPasteMarginRatio() != 0 )
1103  m_out->Print( aNestLevel+1, "(solder_paste_ratio %s)\n",
1104  Double2Str( aModule->GetLocalSolderPasteMarginRatio() ).c_str() );
1105 
1106  if( aModule->GetLocalClearance() != 0 )
1107  m_out->Print( aNestLevel+1, "(clearance %s)\n",
1108  FormatInternalUnits( aModule->GetLocalClearance() ).c_str() );
1109 
1110  if( aModule->GetZoneConnection() != ZONE_CONNECTION::INHERITED )
1111  m_out->Print( aNestLevel+1, "(zone_connect %d)\n",
1112  static_cast<int>( aModule->GetZoneConnection() ) );
1113 
1114  if( aModule->GetThermalWidth() != 0 )
1115  m_out->Print( aNestLevel+1, "(thermal_width %s)\n",
1116  FormatInternalUnits( aModule->GetThermalWidth() ).c_str() );
1117 
1118  if( aModule->GetThermalGap() != 0 )
1119  m_out->Print( aNestLevel+1, "(thermal_gap %s)\n",
1120  FormatInternalUnits( aModule->GetThermalGap() ).c_str() );
1121 
1122  // Attributes
1123  if( aModule->GetAttributes() != MOD_DEFAULT )
1124  {
1125  m_out->Print( aNestLevel+1, "(attr" );
1126 
1127  if( aModule->GetAttributes() & MOD_CMS )
1128  m_out->Print( 0, " smd" );
1129 
1130  if( aModule->GetAttributes() & MOD_VIRTUAL )
1131  m_out->Print( 0, " virtual" );
1132 
1133  m_out->Print( 0, ")\n" );
1134  }
1135 
1136  Format( (BOARD_ITEM*) &aModule->Reference(), aNestLevel+1 );
1137  Format( (BOARD_ITEM*) &aModule->Value(), aNestLevel+1 );
1138 
1139  // Save drawing elements.
1140  for( auto gr : aModule->GraphicalItems() )
1141  Format( gr, aNestLevel+1 );
1142 
1143  // Save pads.
1144  for( auto pad : aModule->Pads() )
1145  format( pad, aNestLevel+1 );
1146 
1147  // Save zones.
1148  for( auto zone : aModule->Zones() )
1149  format( zone, aNestLevel + 1 );
1150 
1151  // Save 3D info.
1152  auto bs3D = aModule->Models().begin();
1153  auto es3D = aModule->Models().end();
1154 
1155  while( bs3D != es3D )
1156  {
1157  if( !bs3D->m_Filename.IsEmpty() )
1158  {
1159  m_out->Print( aNestLevel+1, "(model %s\n",
1160  m_out->Quotew( bs3D->m_Filename ).c_str() );
1161 
1162  /* Write 3D model offset in mm
1163  * 4.0.x wrote "at" which was actually in inches
1164  * 5.0.x onwards, 3D model offset is written using "offset"
1165  *
1166  * If the offset is all zero, write "at" (fewer file changes)
1167  * Otherwise, write "offset"
1168  */
1169 
1170  wxString offsetTag = "offset";
1171 
1172  if( bs3D->m_Offset.x == 0 &&
1173  bs3D->m_Offset.y == 0 &&
1174  bs3D->m_Offset.z == 0 )
1175  {
1176  offsetTag = "at";
1177  }
1178 
1179  m_out->Print( aNestLevel+2, "(%s (xyz %s %s %s))\n",
1180  offsetTag.ToStdString().c_str(),
1181  Double2Str( bs3D->m_Offset.x ).c_str(),
1182  Double2Str( bs3D->m_Offset.y ).c_str(),
1183  Double2Str( bs3D->m_Offset.z ).c_str() );
1184 
1185  m_out->Print( aNestLevel+2, "(scale (xyz %s %s %s))\n",
1186  Double2Str( bs3D->m_Scale.x ).c_str(),
1187  Double2Str( bs3D->m_Scale.y ).c_str(),
1188  Double2Str( bs3D->m_Scale.z ).c_str() );
1189 
1190  m_out->Print( aNestLevel+2, "(rotate (xyz %s %s %s))\n",
1191  Double2Str( bs3D->m_Rotation.x ).c_str(),
1192  Double2Str( bs3D->m_Rotation.y ).c_str(),
1193  Double2Str( bs3D->m_Rotation.z ).c_str() );
1194 
1195  m_out->Print( aNestLevel+1, ")\n" );
1196  }
1197  ++bs3D;
1198  }
1199 
1200  m_out->Print( aNestLevel, ")\n" );
1201 }
timestamp_t GetLastEditTime() const
Definition: class_module.h:349
int GetAttributes() const
Definition: class_module.h:259
double GetOrientation() const
Definition: class_module.h:215
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
int GetPlacementCost90() const
Definition: class_module.h:555
TEXTE_MODULE & Reference()
Definition: class_module.h:477
#define CTL_OMIT_AT
Omit position and rotation.
void formatLayer(const BOARD_ITEM *aItem) const
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:319
ZONE_CONNECTION GetZoneConnection() const
Definition: class_module.h:248
PADS & Pads()
Definition: class_module.h:173
Set for modules listed in the automatic insertion list (usually SMD footprints)
Definition: class_module.h:74
wxString AsString() const
Definition: common.cpp:170
std::string Double2Str(double aValue)
Helper function Double2Str to print a float number without using scientific notation and no trailing ...
Definition: base_units.cpp:65
const LIB_ID & GetFPID() const
Definition: class_module.h:219
const KIID_PATH & GetPath() const
Definition: class_module.h:228
DRAWINGS & GraphicalItems()
Definition: class_module.h:183
int GetLocalSolderMaskMargin() const
Definition: class_module.h:231
#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:552
int GetLocalClearance() const
Definition: class_module.h:234
TEXTE_MODULE & Value()
read/write accessors:
Definition: class_module.h:476
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:660
bool IsLocked() const override
Function IsLocked.
Definition: class_module.h:301
const wxString & GetKeywords() const
Definition: class_module.h:225
const MODULE_ZONE_CONTAINERS & Zones() const
Definition: class_module.h:188
UTF8 Format() const
Definition: lib_id.cpp:237
int GetLocalSolderPasteMargin() const
Definition: class_module.h:237
default
Definition: class_module.h:73
const KIID m_Uuid
Definition: base_struct.h:169
int GetPlacementCost180() const
Definition: class_module.h:552
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:222
double GetLocalSolderPasteMarginRatio() const
Definition: class_module.h:240
std::list< MODULE_3D_SETTINGS > & Models()
Definition: class_module.h:205
Virtual component: when created by copper shapes on board (Like edge card connectors,...
Definition: class_module.h:76
#define CTL_OMIT_TSTAMPS
Omit component time stamp (useless in library)
wxString AsString() const
Definition: common.h:123
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:254
const wxPoint GetPosition() const override
Definition: class_module.h:210
int GetThermalGap() const
Definition: class_module.h:257
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:523

References KIID::AsString(), KIID_PATH::AsString(), 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(), MODULE::GetZoneConnection(), MODULE::GraphicalItems(), INHERITED, MODULE::IsLocked(), MODULE::IsPlaced(), m_ctl, m_out, EDA_ITEM::m_Uuid, MOD_CMS, MOD_DEFAULT, MOD_VIRTUAL, MODULE::Models(), MODULE::Pads(), OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotes(), OUTPUTFORMATTER::Quotew(), MODULE::Reference(), TO_UTF8, MODULE::Value(), and MODULE::Zones().

◆ format() [7/11]

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

Definition at line 1296 of file kicad_plugin.cpp.

1297 {
1298  const char* shape;
1299 
1300  switch( aPad->GetShape() )
1301  {
1302  case PAD_SHAPE_CIRCLE: shape = "circle"; break;
1303  case PAD_SHAPE_RECT: shape = "rect"; break;
1304  case PAD_SHAPE_OVAL: shape = "oval"; break;
1305  case PAD_SHAPE_TRAPEZOID: shape = "trapezoid"; break;
1307  case PAD_SHAPE_ROUNDRECT: shape = "roundrect"; break;
1308  case PAD_SHAPE_CUSTOM: shape = "custom"; break;
1309 
1310  default:
1311  THROW_IO_ERROR( wxString::Format( _( "unknown pad type: %d"), aPad->GetShape() ) );
1312  }
1313 
1314  const char* type;
1315 
1316  switch( aPad->GetAttribute() )
1317  {
1318  case PAD_ATTRIB_STANDARD: type = "thru_hole"; break;
1319  case PAD_ATTRIB_SMD: type = "smd"; break;
1320  case PAD_ATTRIB_CONN: type = "connect"; break;
1321  case PAD_ATTRIB_HOLE_NOT_PLATED: type = "np_thru_hole"; break;
1322 
1323  default:
1324  THROW_IO_ERROR( wxString::Format( "unknown pad attribute: %d", aPad->GetAttribute() ) );
1325  }
1326 
1327  const char* property = nullptr;
1328 
1329  switch( aPad->GetProperty() )
1330  {
1331  case PAD_PROP_NONE: break;
1332  case PAD_PROP_BGA: property = "pad_prop_bga"; break;
1333  case PAD_PROP_FIDUCIAL_GLBL: property = "pad_prop_fiducial_glob"; break;
1334  case PAD_PROP_FIDUCIAL_LOCAL: property = "pad_prop_fiducial_loc"; break;
1335  case PAD_PROP_TESTPOINT: property = "pad_prop_testpoint"; break;
1336  case PAD_PROP_HEATSINK: property = "pad_prop_heatsink"; break;
1337  case PAD_PROP_CASTELLATED: property = "pad_prop_castellated"; break;
1338 
1339  default:
1340  THROW_IO_ERROR( wxString::Format( "unknown pad property: %d", aPad->GetProperty() ) );
1341  }
1342 
1343  m_out->Print( aNestLevel, "(pad %s %s %s",
1344  m_out->Quotew( aPad->GetName() ).c_str(),
1345  type, shape );
1346  m_out->Print( 0, " (at %s", FormatInternalUnits( aPad->GetPos0() ).c_str() );
1347 
1348  if( aPad->GetOrientation() != 0.0 )
1349  m_out->Print( 0, " %s", FormatAngle( aPad->GetOrientation() ).c_str() );
1350 
1351  m_out->Print( 0, ")" );
1352  m_out->Print( 0, " (size %s)", FormatInternalUnits( aPad->GetSize() ).c_str() );
1353 
1354  if( (aPad->GetDelta().GetWidth()) != 0 || (aPad->GetDelta().GetHeight() != 0 ) )
1355  m_out->Print( 0, " (rect_delta %s )", FormatInternalUnits( aPad->GetDelta() ).c_str() );
1356 
1357  wxSize sz = aPad->GetDrillSize();
1358  wxPoint shapeoffset = aPad->GetOffset();
1359 
1360  if( (sz.GetWidth() > 0) || (sz.GetHeight() > 0) ||
1361  (shapeoffset.x != 0) || (shapeoffset.y != 0) )
1362  {
1363  m_out->Print( 0, " (drill" );
1364 
1365  if( aPad->GetDrillShape() == PAD_DRILL_SHAPE_OBLONG )
1366  m_out->Print( 0, " oval" );
1367 
1368  if( sz.GetWidth() > 0 )
1369  m_out->Print( 0, " %s", FormatInternalUnits( sz.GetWidth() ).c_str() );
1370 
1371  if( sz.GetHeight() > 0 && sz.GetWidth() != sz.GetHeight() )
1372  m_out->Print( 0, " %s", FormatInternalUnits( sz.GetHeight() ).c_str() );
1373 
1374  if( (shapeoffset.x != 0) || (shapeoffset.y != 0) )
1375  m_out->Print( 0, " (offset %s)", FormatInternalUnits( aPad->GetOffset() ).c_str() );
1376 
1377  m_out->Print( 0, ")" );
1378  }
1379 
1380  if( property && ADVANCED_CFG::GetCfg().m_EnableUsePadProperty )
1381  {
1382  // Add pad property, if exists.
1383  m_out->Print( 0, " (property %s)", property );
1384  }
1385 
1386  formatLayers( aPad->GetLayerSet() );
1387 
1388  // Output the radius ratio for rounded and chamfered rect pads
1389  if( aPad->GetShape() == PAD_SHAPE_ROUNDRECT || aPad->GetShape() == PAD_SHAPE_CHAMFERED_RECT)
1390  {
1391  m_out->Print( 0, " (roundrect_rratio %s)",
1392  Double2Str( aPad->GetRoundRectRadiusRatio() ).c_str() );
1393  }
1394 
1395  // Output the chamfer corners for chamfered rect pads
1396  if( aPad->GetShape() == PAD_SHAPE_CHAMFERED_RECT)
1397  {
1398  m_out->Print( 0, "\n" );
1399 
1400  m_out->Print( aNestLevel+1, "(chamfer_ratio %s)",
1401  Double2Str( aPad->GetChamferRectRatio() ).c_str() );
1402 
1403  m_out->Print( 0, " (chamfer" );
1404 
1405  if( ( aPad->GetChamferPositions() & RECT_CHAMFER_TOP_LEFT ) )
1406  m_out->Print( 0, " top_left" );
1407 
1408  if( ( aPad->GetChamferPositions() & RECT_CHAMFER_TOP_RIGHT ) )
1409  m_out->Print( 0, " top_right" );
1410 
1411  if( ( aPad->GetChamferPositions() & RECT_CHAMFER_BOTTOM_LEFT ) )
1412  m_out->Print( 0, " bottom_left" );
1413 
1415  m_out->Print( 0, " bottom_right" );
1416 
1417  m_out->Print( 0, ")" );
1418  }
1419 
1420  std::string output;
1421 
1422  // Unconnected pad is default net so don't save it.
1423  if( !( m_ctl & CTL_OMIT_NETS ) && aPad->GetNetCode() != NETINFO_LIST::UNCONNECTED )
1424  StrPrintf( &output, " (net %d %s)", m_mapping->Translate( aPad->GetNetCode() ),
1425  m_out->Quotew( aPad->GetNetname() ).c_str() );
1426 
1428  {
1429  // Add pinfunction, if exists.
1430  // Pin function is closely related to nets, so if CTL_OMIT_NETS is set,
1431  // omit also pin function (for instance when saved from library editor)
1432  if( !(m_ctl & CTL_OMIT_NETS) && !aPad->GetPinFunction().IsEmpty() )
1433  StrPrintf( &output, " (pinfunction %s)",
1434  m_out->Quotew( aPad->GetPinFunction() ).c_str() );
1435  }
1436 
1437  if( aPad->GetPadToDieLength() != 0 )
1438  StrPrintf( &output, " (die_length %s)",
1439  FormatInternalUnits( aPad->GetPadToDieLength() ).c_str() );
1440 
1441  if( aPad->GetLocalSolderMaskMargin() != 0 )
1442  StrPrintf( &output, " (solder_mask_margin %s)",
1443  FormatInternalUnits( aPad->GetLocalSolderMaskMargin() ).c_str() );
1444 
1445  if( aPad->GetLocalSolderPasteMargin() != 0 )
1446  StrPrintf( &output, " (solder_paste_margin %s)",
1447  FormatInternalUnits( aPad->GetLocalSolderPasteMargin() ).c_str() );
1448 
1449  if( aPad->GetLocalSolderPasteMarginRatio() != 0 )
1450  StrPrintf( &output, " (solder_paste_margin_ratio %s)",
1451  Double2Str( aPad->GetLocalSolderPasteMarginRatio() ).c_str() );
1452 
1453  if( aPad->GetLocalClearance() != 0 )
1454  StrPrintf( &output, " (clearance %s)", FormatInternalUnits( aPad->GetLocalClearance() ).c_str() );
1455 
1457  StrPrintf( &output, " (zone_connect %d)", static_cast<int>( aPad->GetZoneConnection() ) );
1458 
1459  if( aPad->GetThermalWidth() != 0 )
1460  StrPrintf( &output, " (thermal_width %s)", FormatInternalUnits( aPad->GetThermalWidth() ).c_str() );
1461 
1462  if( aPad->GetThermalGap() != 0 )
1463  StrPrintf( &output, " (thermal_gap %s)", FormatInternalUnits( aPad->GetThermalGap() ).c_str() );
1464 
1465  if( output.size() )
1466  {
1467  m_out->Print( 0, "\n" );
1468  m_out->Print( aNestLevel+1, "%s", output.c_str()+1 ); // +1 skips 1st space on 1st element
1469  }
1470 
1471  if( aPad->GetShape() == PAD_SHAPE_CUSTOM )
1472  {
1473  m_out->Print( 0, "\n");
1474  m_out->Print( aNestLevel+1, "(options" );
1475 
1477  m_out->Print( 0, " (clearance convexhull)" );
1478  #if 1 // Set to 1 to output the default option
1479  else
1480  m_out->Print( 0, " (clearance outline)" );
1481  #endif
1482 
1483  // Output the anchor pad shape (circle/rect)
1484  if( aPad->GetAnchorPadShape() == PAD_SHAPE_RECT )
1485  shape = "rect";
1486  else
1487  shape = "circle";
1488 
1489  m_out->Print( 0, " (anchor %s)", shape );
1490 
1491  m_out->Print( 0, ")"); // end of (options ...
1492 
1493  // Output graphic primitive of the pad shape
1494  m_out->Print( 0, "\n");
1495  m_out->Print( aNestLevel+1, "(primitives" );
1496 
1497  int nested_level = aNestLevel+2;
1498 
1499  // Output all basic shapes
1500  for( unsigned icnt = 0; icnt < aPad->GetPrimitives().size(); ++icnt )
1501  {
1502  m_out->Print( 0, "\n");
1503 
1504  const PAD_CS_PRIMITIVE& primitive = aPad->GetPrimitives()[icnt];
1505 
1506  switch( primitive.m_Shape )
1507  {
1508  case S_SEGMENT: // usual segment : line with rounded ends
1509  m_out->Print( nested_level, "(gr_line (start %s) (end %s) (width %s))",
1510  FormatInternalUnits( primitive.m_Start ).c_str(),
1511  FormatInternalUnits( primitive.m_End ).c_str(),
1512  FormatInternalUnits( primitive.m_Thickness ).c_str() );
1513  break;
1514 
1515  case S_ARC: // Arc with rounded ends
1516  m_out->Print( nested_level, "(gr_arc (start %s) (end %s) (angle %s) (width %s))",
1517  FormatInternalUnits( primitive.m_Start ).c_str(),
1518  FormatInternalUnits( primitive.m_End ).c_str(),
1519  FormatAngle( primitive.m_ArcAngle ).c_str(),
1520  FormatInternalUnits( primitive.m_Thickness ).c_str() );
1521  break;
1522 
1523  case S_CIRCLE: // ring or circle (circle if width == 0
1524  m_out->Print( nested_level, "(gr_circle (center %s) (end %s %s) (width %s))",
1525  FormatInternalUnits( primitive.m_Start ).c_str(),
1526  FormatInternalUnits( primitive.m_Start.x + primitive.m_Radius ).c_str(),
1527  FormatInternalUnits( primitive.m_Start.y ).c_str(),
1528  FormatInternalUnits( primitive.m_Thickness ).c_str() );
1529  break;
1530 
1531  case S_CURVE: // Bezier Curve
1532  m_out->Print( aNestLevel, "(gr_curve (pts (xy %s) (xy %s) (xy %s) (xy %s)) (width %s))",
1533  FormatInternalUnits( primitive.m_Start ).c_str(),
1534  FormatInternalUnits( primitive.m_Ctrl1 ).c_str(),
1535  FormatInternalUnits( primitive.m_Ctrl2 ).c_str(),
1536  FormatInternalUnits( primitive.m_End ).c_str(),
1537  FormatInternalUnits( primitive.m_Thickness ).c_str() );
1538  break;
1539 
1540  case S_POLYGON: // polygon
1541  if( primitive.m_Poly.size() < 2 )
1542  break; // Malformed polygon.
1543 
1544  {
1545  m_out->Print( nested_level, "(gr_poly (pts\n");
1546 
1547  // Write the polygon corners coordinates:
1548  const std::vector< wxPoint>& poly = primitive.m_Poly;
1549  int newLine = 0;
1550 
1551  for( unsigned ii = 0; ii < poly.size(); ii++ )
1552  {
1553  if( newLine == 0 )
1554  m_out->Print( nested_level+1, " (xy %s)",
1555  FormatInternalUnits( wxPoint( poly[ii].x, poly[ii].y ) ).c_str() );
1556  else
1557  m_out->Print( 0, " (xy %s)",
1558  FormatInternalUnits( wxPoint( poly[ii].x, poly[ii].y ) ).c_str() );
1559 
1560  if( ++newLine > 4 )
1561  {
1562  newLine = 0;
1563  m_out->Print( 0, "\n" );
1564  }
1565  }
1566 
1567  m_out->Print( 0, ") (width %s))", FormatInternalUnits( primitive.m_Thickness ).c_str() );
1568  }
1569  break;
1570 
1571  default:
1572  break;
1573  }
1574  }
1575 
1576  m_out->Print( 0, "\n");
1577  m_out->Print( aNestLevel+1, ")" ); // end of (basic_shapes
1578  }
1579 
1580  m_out->Print( 0, " (tstamp %s)", TO_UTF8( aPad->m_Uuid.AsString() ) );
1581 
1582  m_out->Print( 0, ")\n" );
1583 }
int GetLocalSolderMaskMargin() const
Definition: class_pad.h:461
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
int GetNetCode() const
Function GetNetCode.
const wxPoint & GetPos0() const
Definition: class_pad.h:294
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
no special fabrication property
Definition: pad_shapes.h:78
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:247
a fiducial (usually a smd) for the full board
Definition: pad_shapes.h:80
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:459
Smd pad, appears on the solder paste layer (default)
Definition: pad_shapes.h:62
Smd pad, used in BGA footprints.
Definition: pad_shapes.h:79
wxString AsString() const
Definition: common.cpp:170
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:65
a pad used as heat sink, usually in SMD footprints
Definition: pad_shapes.h:83
const wxString & GetPinFunction() const
Definition: class_pad.h:211
int GetThermalGap() const
Definition: class_pad.cpp:747
int GetLocalClearance() const
Definition: class_pad.h:464
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:449
int GetChamferPositions() const
has meaning only for chamfered rect pads
Definition: class_pad.h:724
a pad with a castellated through hole
Definition: pad_shapes.h:84
#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:552
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:373
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:309
ZONE_CONNECTION GetZoneConnection() const
Definition: class_pad.cpp:725
PAD_DRILL_SHAPE_T GetDrillShape() const
Definition: class_pad.h:432
double GetChamferRectRatio() const
has meaning only for chamfered rect pads
Definition: class_pad.h:701
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:446
const wxString & GetName() const
Definition: class_pad.h:203
#define THROW_IO_ERROR(msg)
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:472
PAD_PROP_T GetProperty() const
Definition: class_pad.h:452
Bezier Curve.
const wxSize & GetDelta() const
Definition: class_pad.h:303
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
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
bool m_EnableUsePinFunction
Enable pad pin function handling in pcbnew.
const KIID m_Uuid
Definition: base_struct.h:169
CUST_PAD_SHAPE_IN_ZONE GetCustomShapeInZoneOpt() const
Definition: class_pad.h:253
int m_Thickness
S_SEGMENT, S_ARC, S_CIRCLE, S_POLYGON only (same as DRAWSEGMENT)
Definition: class_pad.h:93
a fiducial (usually a smd) local to the parent footprint
Definition: pad_shapes.h:81
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
#define _(s)
Definition: 3d_actions.cpp:33
double GetOrientation() const
Function GetOrientation returns the rotation angle of the pad in tenths of degrees,...
Definition: class_pad.h:426
const wxSize & GetDrillSize() const
Definition: class_pad.h:306
double GetRoundRectRadiusRatio() const
has meaning only for rounded rect pads
Definition: class_pad.h:675
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers of advanced config.
PAD_SHAPE_T GetShape() const
Function GetShape.
Definition: class_pad.h:237
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
const wxSize & GetSize() const
Definition: class_pad.h:300
int GetLocalSolderPasteMargin() const
Definition: class_pad.h:467
a test point pad
Definition: pad_shapes.h:82
static const int UNCONNECTED
Constant that holds the "unconnected net" number (typically 0) all items "connected" to this net are ...
Definition: netinfo.h:462
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:523
double GetLocalSolderPasteMarginRatio() const
Definition: class_pad.h:470
int Translate(int aNetCode) const
Function Translate Translates net number according to the map prepared by Update() function.

References _, KIID::AsString(), CTL_OMIT_NETS, CUST_PAD_SHAPE_IN_ZONE_CONVEXHULL, Double2Str(), Format(), FormatAngle(), FormatInternalUnits(), formatLayers(), D_PAD::GetAnchorPadShape(), D_PAD::GetAttribute(), ADVANCED_CFG::GetCfg(), 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::GetPinFunction(), D_PAD::GetPos0(), D_PAD::GetPrimitives(), D_PAD::GetProperty(), D_PAD::GetRoundRectRadiusRatio(), D_PAD::GetShape(), D_PAD::GetSize(), D_PAD::GetThermalGap(), D_PAD::GetThermalWidth(), D_PAD::GetZoneConnection(), INHERITED, PAD_CS_PRIMITIVE::m_ArcAngle, m_ctl, PAD_CS_PRIMITIVE::m_Ctrl1, PAD_CS_PRIMITIVE::m_Ctrl2, ADVANCED_CFG::m_EnableUsePinFunction, 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, EDA_ITEM::m_Uuid, PAD_ATTRIB_CONN, PAD_ATTRIB_HOLE_NOT_PLATED, PAD_ATTRIB_SMD, PAD_ATTRIB_STANDARD, PAD_DRILL_SHAPE_OBLONG, PAD_PROP_BGA, PAD_PROP_CASTELLATED, PAD_PROP_FIDUCIAL_GLBL, PAD_PROP_FIDUCIAL_LOCAL, PAD_PROP_HEATSINK, PAD_PROP_NONE, PAD_PROP_TESTPOINT, PAD_SHAPE_CHAMFERED_RECT, PAD_SHAPE_CIRCLE, PAD_SHAPE_CUSTOM, PAD_SHAPE_OVAL, PAD_SHAPE_RECT, PAD_SHAPE_ROUNDRECT, PAD_SHAPE_TRAPEZOID, 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, TO_UTF8, NETINFO_MAPPING::Translate(), NETINFO_LIST::UNCONNECTED, wxPoint::x, and wxPoint::y.

◆ format() [8/11]

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

Definition at line 1586 of file kicad_plugin.cpp.

1587 {
1588  m_out->Print( aNestLevel, "(gr_text %s (at %s",
1589  m_out->Quotew( aText->GetText() ).c_str(),
1590  FormatInternalUnits( aText->GetTextPos() ).c_str() );
1591 
1592  if( aText->GetTextAngle() != 0.0 )
1593  m_out->Print( 0, " %s", FormatAngle( aText->GetTextAngle() ).c_str() );
1594 
1595  m_out->Print( 0, ")" );
1596 
1597  formatLayer( aText );
1598 
1599  m_out->Print( 0, " (tstamp %s)", TO_UTF8( aText->m_Uuid.AsString() ) );
1600 
1601  m_out->Print( 0, "\n" );
1602 
1603  aText->EDA_TEXT::Format( m_out, aNestLevel, m_ctl );
1604 
1605  m_out->Print( aNestLevel, ")\n" );
1606 }
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
wxString AsString() const
Definition: common.cpp:170
#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:552
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:472
const KIID m_Uuid
Definition: base_struct.h:169
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
Return the string associated with the text object.
Definition: eda_text.h:123
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:523

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

◆ format() [9/11]

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

Definition at line 1609 of file kicad_plugin.cpp.

1610 {
1611  std::string type;
1612 
1613  switch( aText->GetType() )
1614  {
1615  case TEXTE_MODULE::TEXT_is_REFERENCE: type = "reference"; break;
1616  case TEXTE_MODULE::TEXT_is_VALUE: type = "value"; break;
1617  case TEXTE_MODULE::TEXT_is_DIVERS: type = "user";
1618  }
1619 
1620  m_out->Print( aNestLevel, "(fp_text %s %s (at %s",
1621  type.c_str(),
1622  m_out->Quotew( aText->GetText() ).c_str(),
1623  FormatInternalUnits( aText->GetPos0() ).c_str() );
1624 
1625  // Due to Pcbnew history, fp_text angle is saved as an absolute on screen angle,
1626  // but internally the angle is held relative to its parent footprint. parent
1627  // may be NULL when saving a footprint outside a BOARD.
1628  double orient = aText->GetTextAngle();
1629  MODULE* parent = (MODULE*) aText->GetParent();
1630 
1631  if( parent )
1632  {
1633  // GetTextAngle() is always in -360..+360 range because of
1634  // TEXTE_MODULE::SetTextAngle(), but summing that angle with an
1635  // additional board angle could kick sum up >= 360 or <= -360, so to have
1636  // consistent results, normalize again for the BOARD save. A footprint
1637  // save does not use this code path since parent is NULL.
1638 #if 0
1639  // This one could be considered reasonable if you like positive angles
1640  // in your board text.
1641  orient = NormalizeAnglePos( orient + parent->GetOrientation() );
1642 #else
1643  // Choose compatibility for now, even though this is only a 720 degree clamp
1644  // with two possible values for every angle.
1645  orient = NormalizeAngle360Min( orient + parent->GetOrientation() );
1646 #endif
1647  }
1648 
1649  if( orient != 0.0 )
1650  m_out->Print( 0, " %s", FormatAngle( orient ).c_str() );
1651 
1652  if( !aText->IsKeepUpright() )
1653  m_out->Print( 0, " unlocked" );
1654 
1655  m_out->Print( 0, ")" );
1656  formatLayer( aText );
1657 
1658  if( !aText->IsVisible() )
1659  m_out->Print( 0, " hide" );
1660 
1661  m_out->Print( 0, "\n" );
1662 
1663  aText->EDA_TEXT::Format( m_out, aNestLevel, m_ctl | CTL_OMIT_HIDE );
1664 
1665  m_out->Print( aNestLevel, ")\n" );
1666 }
double GetOrientation() const
Definition: class_module.h:215
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:552
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:248
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:237
BOARD_ITEM_CONTAINER * GetParent() const
#define CTL_OMIT_HIDE
Definition: eda_text.h:39
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:123
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:523

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

1670 {
1671  if( aTrack->Type() == PCB_VIA_T )
1672  {
1673  PCB_LAYER_ID layer1, layer2;
1674 
1675  const VIA* via = static_cast<const VIA*>( aTrack );
1676  BOARD* board = (BOARD*) via->GetParent();
1677 
1678  wxCHECK_RET( board != 0, wxT( "Via " ) + via->GetSelectMenuText( EDA_UNITS::MILLIMETRES )
1679  + wxT( " has no parent." ) );
1680 
1681  m_out->Print( aNestLevel, "(via" );
1682 
1683  via->LayerPair( &layer1, &layer2 );
1684 
1685  switch( via->GetViaType() )
1686  {
1687  case VIATYPE::THROUGH: // Default shape not saved.
1688  break;
1689 
1690  case VIATYPE::BLIND_BURIED:
1691  m_out->Print( 0, " blind" );
1692  break;
1693 
1694  case VIATYPE::MICROVIA:
1695  m_out->Print( 0, " micro" );
1696  break;
1697 
1698  default:
1699  THROW_IO_ERROR( wxString::Format( _( "unknown via type %d" ), via->GetViaType() ) );
1700  }
1701 
1702  m_out->Print( 0, " (at %s) (size %s)",
1703  FormatInternalUnits( aTrack->GetStart() ).c_str(),
1704  FormatInternalUnits( aTrack->GetWidth() ).c_str() );
1705 
1706  if( via->GetDrill() != UNDEFINED_DRILL_DIAMETER )
1707  m_out->Print( 0, " (drill %s)", FormatInternalUnits( via->GetDrill() ).c_str() );
1708 
1709  m_out->Print( 0, " (layers %s %s)",
1710  m_out->Quotew( m_board->GetLayerName( layer1 ) ).c_str(),
1711  m_out->Quotew( m_board->GetLayerName( layer2 ) ).c_str() );
1712  }
1713  else if( aTrack->Type() == PCB_ARC_T )
1714  {
1715  const ARC* arc = static_cast<const ARC*>( aTrack );
1716 
1717  m_out->Print( aNestLevel, "(arc (start %s) (mid %s) (end %s) (width %s)",
1718  FormatInternalUnits( arc->GetStart() ).c_str(),
1719  FormatInternalUnits( arc->GetMid() ).c_str(),
1720  FormatInternalUnits( arc->GetEnd() ).c_str(),
1721  FormatInternalUnits( arc->GetWidth() ).c_str() );
1722 
1723  m_out->Print( 0, " (layer %s)", m_out->Quotew( aTrack->GetLayerName() ).c_str() );
1724  }
1725  else
1726  {
1727  m_out->Print( aNestLevel, "(segment (start %s) (end %s) (width %s)",
1728  FormatInternalUnits( aTrack->GetStart() ).c_str(), FormatInternalUnits( aTrack->GetEnd() ).c_str(),
1729  FormatInternalUnits( aTrack->GetWidth() ).c_str() );
1730 
1731  m_out->Print( 0, " (layer %s)", m_out->Quotew( aTrack->GetLayerName() ).c_str() );
1732  }
1733 
1734  m_out->Print( 0, " (net %d)", m_mapping->Translate( aTrack->GetNetCode() ) );
1735 
1736  m_out->Print( 0, " (tstamp %s)", TO_UTF8( aTrack->m_Uuid.AsString() ) );
1737 
1738  if( aTrack->GetStatus() != 0 )
1739  m_out->Print( 0, " (status %X)", aTrack->GetStatus() );
1740 
1741  m_out->Print( 0, ")\n" );
1742 }
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:254
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:111
class ARC, an arc track segment on a copper layer
Definition: typeinfo.h:98
wxString AsString() const
Definition: common.cpp:170
#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:
const wxPoint & GetMid() const
Definition: class_track.h:292
int GetDrill() const
Function GetDrill returns the local drill setting for this VIA.
Definition: class_track.h:438
wxString GetSelectMenuText(EDA_UNITS aUnits) const override
Function GetSelectMenuText returns the text to display to be used in the selection clarification cont...
#define THROW_IO_ERROR(msg)
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:472
#define UNDEFINED_DRILL_DIAMETER
Definition: class_track.h:71
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes
const KIID m_Uuid
Definition: base_struct.h:169
int GetWidth() const
Definition: class_track.h:105
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
BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:163
#define _(s)
Definition: 3d_actions.cpp:33
BOARD * m_board
which BOARD, no ownership here
VIATYPE GetViaType() const
Definition: class_track.h:416
const wxPoint & GetEnd() const
Definition: class_track.h:108
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:97
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:523
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:212

References _, KIID::AsString(), BLIND_BURIED, Format(), FormatInternalUnits(), VIA::GetDrill(), TRACK::GetEnd(), BOARD_ITEM::GetLayerName(), BOARD::GetLayerName(), ARC::GetMid(), BOARD_CONNECTED_ITEM::GetNetCode(), BOARD_ITEM::GetParent(), VIA::GetSelectMenuText(), TRACK::GetStart(), EDA_ITEM::GetStatus(), VIA::GetViaType(), TRACK::GetWidth(), VIA::LayerPair(), m_board, m_mapping, m_out, EDA_ITEM::m_Uuid, MICROVIA, MILLIMETRES, PCB_ARC_T, PCB_VIA_T, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), THROUGH, THROW_IO_ERROR, TO_UTF8, NETINFO_MAPPING::Translate(), EDA_ITEM::Type(), and UNDEFINED_DRILL_DIAMETER.

◆ format() [11/11]

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

Definition at line 1745 of file kicad_plugin.cpp.

1746 {
1747  // Save the NET info; For keepout zones, net code and net name are irrelevant
1748  // so be sure a dummy value is stored, just for ZONE_CONTAINER compatibility
1749  // (perhaps netcode and netname should be not stored)
1750  m_out->Print( aNestLevel, "(zone (net %d) (net_name %s)",
1751  aZone->GetIsKeepout() ? 0 : m_mapping->Translate( aZone->GetNetCode() ),
1752  m_out->Quotew( aZone->GetIsKeepout() ? wxT("") : aZone->GetNetname() ).c_str() );
1753 
1754  // If a zone exists on multiple layers, format accordingly
1755  if( aZone->GetLayerSet().count() > 1 )
1756  {
1757  formatLayers( aZone->GetLayerSet() );
1758  }
1759  else
1760  {
1761  formatLayer( aZone );
1762  }
1763 
1764  m_out->Print( 0, " (tstamp %s)", TO_UTF8( aZone->m_Uuid.AsString() ) );
1765 
1766  // Save the outline aux info
1767  std::string hatch;
1768 
1769  switch( aZone->GetHatchStyle() )
1770  {
1771  default:
1773  hatch = "none";
1774  break;
1776  hatch = "edge";
1777  break;
1779  hatch = "full";
1780  break;
1781  }
1782 
1783  m_out->Print( 0, " (hatch %s %s)\n", hatch.c_str(),
1784  FormatInternalUnits( aZone->GetHatchPitch() ).c_str() );
1785 
1786  if( aZone->GetPriority() > 0 )
1787  m_out->Print( aNestLevel+1, "(priority %d)\n", aZone->GetPriority() );
1788 
1789  m_out->Print( aNestLevel+1, "(connect_pads" );
1790 
1791  switch( aZone->GetPadConnection() )
1792  {
1793  default:
1794  case ZONE_CONNECTION::THERMAL: // Default option not saved or loaded.
1795  break;
1796 
1798  m_out->Print( 0, " thru_hole_only" );
1799  break;
1800 
1801  case ZONE_CONNECTION::FULL:
1802  m_out->Print( 0, " yes" );
1803  break;
1804 
1805  case ZONE_CONNECTION::NONE:
1806  m_out->Print( 0, " no" );
1807  break;
1808  }
1809 
1810  m_out->Print( 0, " (clearance %s))\n",
1811  FormatInternalUnits( aZone->GetZoneClearance() ).c_str() );
1812 
1813  m_out->Print( aNestLevel+1, "(min_thickness %s)",
1814  FormatInternalUnits( aZone->GetMinThickness() ).c_str() );
1815 
1816  // write it only if V 6.O version option is not used (i.e. do not write if the
1817  // "legacy" algorithm is used)
1818  if( !aZone->GetFilledPolysUseThickness() )
1819  m_out->Print( 0, " (filled_areas_thickness no)" );
1820 
1821  m_out->Print( 0, "\n" );
1822 
1823  if( aZone->GetIsKeepout() )
1824  {
1825  m_out->Print( aNestLevel+1, "(keepout (tracks %s) (vias %s) (copperpour %s))\n",
1826  aZone->GetDoNotAllowTracks() ? "not_allowed" : "allowed",
1827  aZone->GetDoNotAllowVias() ? "not_allowed" : "allowed",
1828  aZone->GetDoNotAllowCopperPour() ? "not_allowed" : "allowed" );
1829  }
1830 
1831  m_out->Print( aNestLevel+1, "(fill" );
1832 
1833  // Default is not filled.
1834  if( aZone->IsFilled() )
1835  m_out->Print( 0, " yes" );
1836 
1837  // Default is polygon filled.
1838  if( aZone->GetFillMode() == ZONE_FILL_MODE::HATCH_PATTERN )
1839  m_out->Print( 0, " (mode hatch)" );
1840 
1841  m_out->Print( 0, " (thermal_gap %s) (thermal_bridge_width %s)",
1842  FormatInternalUnits( aZone->GetThermalReliefGap() ).c_str(),
1843  FormatInternalUnits( aZone->GetThermalReliefCopperBridge() ).c_str() );
1844 
1846  {
1847  m_out->Print( 0, " (smoothing" );
1848 
1849  switch( aZone->GetCornerSmoothingType() )
1850  {
1852  m_out->Print( 0, " chamfer" );
1853  break;
1854 
1856  m_out->Print( 0, " fillet" );
1857  break;
1858 
1859  default:
1860  THROW_IO_ERROR( wxString::Format( _( "unknown zone corner smoothing type %d" ),
1861  aZone->GetCornerSmoothingType() ) );
1862  }
1863  m_out->Print( 0, ")" );
1864 
1865  if( aZone->GetCornerRadius() != 0 )
1866  m_out->Print( 0, " (radius %s)",
1867  FormatInternalUnits( aZone->GetCornerRadius() ).c_str() );
1868  }
1869 
1870  if( aZone->GetFillMode() == ZONE_FILL_MODE::HATCH_PATTERN )
1871  {
1872  m_out->Print( 0, "\n" );
1873  m_out->Print( aNestLevel+2, "(hatch_thickness %s) (hatch_gap %s) (hatch_orientation %s)",
1874  FormatInternalUnits( aZone->GetHatchFillTypeThickness() ).c_str(),
1875  FormatInternalUnits( aZone->GetHatchFillTypeGap() ).c_str(),
1876  Double2Str( aZone->GetHatchFillTypeOrientation() ).c_str() );
1877 
1878  if( aZone->GetHatchFillTypeSmoothingLevel() > 0 )
1879  {
1880  m_out->Print( 0, "\n" );
1881  m_out->Print( aNestLevel+2, "(hatch_smoothing_level %d) (hatch_smoothing_value %s)",
1883  Double2Str( aZone->GetHatchFillTypeSmoothingValue() ).c_str() );
1884  }
1885  }
1886 
1887  m_out->Print( 0, ")\n" );
1888 
1889  int newLine = 0;
1890 
1891  if( aZone->GetNumCorners() )
1892  {
1893  bool new_polygon = true;
1894  bool is_closed = false;
1895 
1896  for( auto iterator = aZone->IterateWithHoles(); iterator; iterator++ )
1897  {
1898  if( new_polygon )
1899  {
1900  newLine = 0;
1901  m_out->Print( aNestLevel+1, "(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( iterator->x ).c_str(), FormatInternalUnits( iterator->y ).c_str() );
1910  else
1911  m_out->Print( 0, " (xy %s %s)",
1912  FormatInternalUnits( iterator->x ).c_str(), FormatInternalUnits( iterator->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( iterator.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  {
1939  if( newLine != 0 )
1940  m_out->Print( 0, "\n" );
1941 
1942  m_out->Print( aNestLevel+2, ")\n" );
1943  m_out->Print( aNestLevel+1, ")\n" );
1944  }
1945  }
1946 
1947  // Save the PolysList (filled areas)
1948  const SHAPE_POLY_SET& fv = aZone->GetFilledPolysList();
1949  newLine = 0;
1950 
1951  if( !fv.IsEmpty() )
1952  {
1953  bool new_polygon = true;
1954  bool is_closed = false;
1955 
1956  for( auto it = fv.CIterate(); it; ++it )
1957  {
1958  if( new_polygon )
1959  {
1960  newLine = 0;
1961  m_out->Print( aNestLevel+1, "(filled_polygon\n" );
1962  m_out->Print( aNestLevel+2, "(pts\n" );
1963  new_polygon = false;
1964  is_closed = false;
1965  }
1966 
1967  if( newLine == 0 )
1968  m_out->Print( aNestLevel+3, "(xy %s %s)",
1969  FormatInternalUnits( it->x ).c_str(), FormatInternalUnits( it->y ).c_str() );
1970  else
1971  m_out->Print( 0, " (xy %s %s)",
1972  FormatInternalUnits( it->x ) .c_str(), FormatInternalUnits( it->y ).c_str() );
1973 
1974  if( newLine < 4 )
1975  {
1976  newLine += 1;
1977  }
1978  else
1979  {
1980  newLine = 0;
1981  m_out->Print( 0, "\n" );
1982  }
1983 
1984  if( it.IsEndContour() )
1985  {
1986  is_closed = true;
1987 
1988  if( newLine != 0 )
1989  m_out->Print( 0, "\n" );
1990 
1991  m_out->Print( aNestLevel+2, ")\n" );
1992  m_out->Print( aNestLevel+1, ")\n" );
1993  new_polygon = true;
1994  }
1995  }
1996 
1997  if( !is_closed ) // Should not happen, but...
1998  m_out->Print( aNestLevel+1, ")\n" );
1999  }
2000 
2001  // Save the filling segments list
2002  const auto& segs = aZone->FillSegments();
2003 
2004  if( segs.size() )
2005  {
2006  m_out->Print( aNestLevel+1, "(fill_segments\n" );
2007 
2008  for( ZONE_SEGMENT_FILL::const_iterator it = segs.begin(); it != segs.end(); ++it )
2009  {
2010  m_out->Print( aNestLevel+2, "(pts (xy %s) (xy %s))\n",
2011  FormatInternalUnits( wxPoint( it->A ) ).c_str(),
2012  FormatInternalUnits( wxPoint( it->B ) ).c_str() );
2013  }
2014 
2015  m_out->Print( aNestLevel+1, ")\n" );
2016  }
2017 
2018  m_out->Print( aNestLevel, ")\n" );
2019 }
bool IsFilled() const
Definition: class_zone.h:188
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:542
int GetHatchFillTypeThickness() const
Definition: class_zone.h:213
bool IsEmpty() const
Returns true if the set is empty (no polygons at all)
ZONE_SEGMENT_FILL & FillSegments()
Definition: class_zone.h:262
bool GetFilledPolysUseThickness() const
Definition: class_zone.h:617
double GetHatchFillTypeOrientation() const
Definition: class_zone.h:219
wxString AsString() const
Definition: common.cpp:170
double GetHatchFillTypeSmoothingValue() const
Definition: class_zone.h:225
std::string Double2Str(double aValue)
Helper function Double2Str to print a float number without using scientific notation and no trailing ...
Definition: base_units.cpp:65
int GetThermalReliefGap(D_PAD *aPad=NULL) const
Definition: class_zone.cpp:533
bool GetDoNotAllowVias() const
Definition: class_zone.h:651
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:277
#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
pads are covered by copper
unsigned int GetCornerRadius() const
Definition: class_zone.h:615
SHAPE_POLY_SET.
ZONE_FILL_MODE GetFillMode() const
Definition: class_zone.h:156
bool GetDoNotAllowCopperPour() const
Definition: class_zone.h:650
int GetNumCorners(void) const
Access to m_Poly parameters.
Definition: class_zone.h:450
#define THROW_IO_ERROR(msg)
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:472
ZONE_CONNECTION GetPadConnection(D_PAD *aPad=NULL) const
Definition: class_zone.cpp:879
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
ZONE_HATCH_STYLE GetHatchStyle() const
Definition: class_zone.h:538
int GetCornerSmoothingType() const
Definition: class_zone.h:611
bool GetIsKeepout() const
Accessors to parameters used in Keepout zones:
Definition: class_zone.h:649
Thermal relief only for THT pads.
const KIID m_Uuid
Definition: base_struct.h:169
Use thermal relief for pads.
unsigned GetPriority() const
Function GetPriority.
Definition: class_zone.h:100
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
#define _(s)
Definition: 3d_actions.cpp:33
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:470
int GetHatchPitch() const
Hatch related methods.
Definition: class_zone.cpp:964
int GetMinThickness() const
Definition: class_zone.h:204
Pads are not covered.
bool GetDoNotAllowTracks() const
Definition: class_zone.h:652
int GetHatchFillTypeSmoothingLevel() const
Definition: class_zone.h:222
void formatLayers(LSET aLayerMask, int aNestLevel=0) const
int GetZoneClearance() const
Definition: class_zone.h:194
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:216
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:523
int Translate(int aNetCode) const
Function Translate Translates net number according to the map prepared by Update() function.
const SHAPE_POLY_SET & GetFilledPolysList() const
Function GetFilledPolysList returns a reference to the list of filled polygons.
Definition: class_zone.h:571

References _, KIID::AsString(), SHAPE_POLY_SET::CIterate(), DIAGONAL_EDGE, DIAGONAL_FULL, Double2Str(), ZONE_CONTAINER::FillSegments(), Format(), FormatInternalUnits(), formatLayer(), formatLayers(), FULL, 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(), ZONE_CONTAINER::GetZoneClearance(), HATCH_PATTERN, SHAPE_POLY_SET::IsEmpty(), ZONE_CONTAINER::IsFilled(), ZONE_CONTAINER::IterateWithHoles(), m_mapping, m_out, EDA_ITEM::m_Uuid, NO_HATCH, NONE, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), ZONE_SETTINGS::SMOOTHING_CHAMFER, ZONE_SETTINGS::SMOOTHING_FILLET, ZONE_SETTINGS::SMOOTHING_NONE, THERMAL, THROW_IO_ERROR, THT_THERMAL, TO_UTF8, and NETINFO_MAPPING::Translate().

◆ formatBoardLayers()

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

formats the board layer information

Definition at line 667 of file kicad_plugin.cpp.

668 {
669  m_out->Print( aNestLevel, "(layers\n" );
670 
671  // Save only the used copper layers from front to back.
672  LSET visible_layers = aBoard->GetVisibleLayers();
673 
674  for( LSEQ cu = aBoard->GetEnabledLayers().CuStack(); cu; ++cu )
675  {
676  PCB_LAYER_ID layer = *cu;
677 
678  m_out->Print( aNestLevel+1, "(%d %s %s", layer,
679  m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str(),
680  LAYER::ShowType( aBoard->GetLayerType( layer ) ) );
681 
682  if( !visible_layers[layer] )
683  m_out->Print( 0, " hide" );
684 
685  m_out->Print( 0, ")\n" );
686  }
687 
688  // Save used non-copper layers in the order they are defined.
689  // desired sequence for non Cu BOARD layers.
690  static const PCB_LAYER_ID non_cu[] =
691  {
692  B_Adhes, // 32
693  F_Adhes,
694  B_Paste,
695  F_Paste,
696  B_SilkS,
697  F_SilkS,
698  B_Mask,
699  F_Mask,
700  Dwgs_User,
701  Cmts_User,
702  Eco1_User,
703  Eco2_User,
704  Edge_Cuts,
705  Margin,
706  B_CrtYd,
707  F_CrtYd,
708  B_Fab,
709  F_Fab
710  };
711 
712  for( LSEQ seq = aBoard->GetEnabledLayers().Seq( non_cu, arrayDim( non_cu ) ); seq; ++seq )
713  {
714  PCB_LAYER_ID layer = *seq;
715 
716  m_out->Print( aNestLevel+1, "(%d %s user", layer,
717  m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str() );
718 
719  if( !visible_layers[layer] )
720  m_out->Print( 0, " hide" );
721 
722  m_out->Print( 0, ")\n" );
723  }
724 
725  m_out->Print( aNestLevel, ")\n\n" );
726 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
LSEQ CuStack() const
Function CuStack returns a sequence of copper layers in starting from the front/top and extending to ...
Definition: lset.cpp:155
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Function GetLayerName returns the name of a layer 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...
LSEQ Seq(const PCB_LAYER_ID *aWishListSequence, unsigned aCount) const
Function Seq returns an LSEQ from the union of this LSET and a desired sequence.
Definition: lset.cpp:377
static const char * ShowType(LAYER_T aType)
Function ShowType converts a LAYER_T enum to a const char*.
PCB_LAYER_ID
A quick note on layer IDs:
LSET is a set of PCB_LAYER_IDs.
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:472
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Definition: macros.h: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, 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 599 of file kicad_plugin.cpp.

600 {
601  m_out->Print( aNestLevel, "(defaults\n" );
602 
603  m_out->Print( aNestLevel+1, "(edge_clearance %s)\n",
604  FormatInternalUnits( aSettings.m_CopperEdgeClearance ).c_str() );
605 
606  m_out->Print( aNestLevel+1, "(edge_cuts_line_width %s)\n",
607  FormatInternalUnits( aSettings.m_LineThickness[ LAYER_CLASS_EDGES ] ).c_str() );
608 
609  m_out->Print( aNestLevel+1, "(courtyard_line_width %s)\n",
611 
612  m_out->Print( aNestLevel+1, "(copper_line_width %s)\n",
613  FormatInternalUnits( aSettings.m_LineThickness[ LAYER_CLASS_COPPER ] ).c_str() );
614  m_out->Print( aNestLevel+1, "(copper_text_dims (size %s %s) (thickness %s)%s%s)\n",
615  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_COPPER ].x ).c_str(),
616  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_COPPER ].y ).c_str(),
618  aSettings.m_TextItalic[ LAYER_CLASS_COPPER ] ? " italic" : "",
619  aSettings.m_TextUpright[ LAYER_CLASS_COPPER ] ? " keep_upright" : "" );
620 
621  m_out->Print( aNestLevel+1, "(silk_line_width %s)\n",
622  FormatInternalUnits( aSettings.m_LineThickness[ LAYER_CLASS_SILK ] ).c_str() );
623  m_out->Print( aNestLevel+1, "(silk_text_dims (size %s %s) (thickness %s)%s%s)\n",
624  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_SILK ].x ).c_str(),
625  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_SILK ].y ).c_str(),
626  FormatInternalUnits( aSettings.m_TextThickness[ LAYER_CLASS_SILK ] ).c_str(),
627  aSettings.m_TextItalic[ LAYER_CLASS_SILK ] ? " italic" : "",
628  aSettings.m_TextUpright[ LAYER_CLASS_SILK ] ? " keep_upright" : "" );
629 
630  m_out->Print( aNestLevel+1, "(other_layers_line_width %s)\n",
631  FormatInternalUnits( aSettings.m_LineThickness[ LAYER_CLASS_OTHERS ] ).c_str() );
632  m_out->Print( aNestLevel+1, "(other_layers_text_dims (size %s %s) (thickness %s)%s%s)\n",
633  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_OTHERS ].x ).c_str(),
634  FormatInternalUnits( aSettings.m_TextSize[ LAYER_CLASS_OTHERS ].y ).c_str(),
636  aSettings.m_TextItalic[ LAYER_CLASS_OTHERS ] ? " italic" : "",
637  aSettings.m_TextUpright[ LAYER_CLASS_OTHERS ] ? " keep_upright" : "" );
638 
639  m_out->Print( aNestLevel+1, "(dimension_units %d)\n", aSettings.m_DimensionUnits );
640  m_out->Print( aNestLevel+1, "(dimension_precision %d)\n", aSettings.m_DimensionPrecision );
641 
642  m_out->Print( aNestLevel, ")\n" );
643 }
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:523

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_DimensionPrecision, BOARD_DESIGN_SETTINGS::m_DimensionUnits, 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 646 of file kicad_plugin.cpp.

647 {
648  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
649 
650  m_out->Print( 0, "\n" );
651  m_out->Print( aNestLevel, "(general\n" );
652  // Write Bounding box info
653  m_out->Print( aNestLevel+1, "(thickness %s)\n",
654  FormatInternalUnits( dsnSettings.GetBoardThickness() ).c_str() );
655 
656  m_out->Print( aNestLevel+1, "(drawings %u)\n", (unsigned)aBoard->Drawings().size() );
657  m_out->Print( aNestLevel + 1, "(tracks %u)\n", (unsigned)aBoard->Tracks().size() );
658  m_out->Print( aNestLevel + 1, "(modules %u)\n", (unsigned)aBoard->Modules().size() );
659  m_out->Print( aNestLevel+1, "(nets %d)\n", m_mapping->GetSize() );
660  m_out->Print( aNestLevel, ")\n\n" );
661 
662  aBoard->GetPageSettings().Format( m_out, aNestLevel, m_ctl );
663  aBoard->GetTitleBlock().Format( m_out, aNestLevel, m_ctl );
664 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const PAGE_INFO & GetPageSettings() const
Definition: class_board.h:527
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:512
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:376
MODULES & Modules()
Definition: class_board.h:229
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:213
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:533
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:238
TRACKS & Tracks()
Definition: class_board.h:220
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:523
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 756 of file kicad_plugin.cpp.

757 {
758  formatGeneral( aBoard, aNestLevel );
759  // Layers list.
760  formatBoardLayers( aBoard, aNestLevel );
761 
762  // Setup
763  formatSetup( aBoard, aNestLevel );
764 
765  // Save net codes and names
766  formatNetInformation( aBoard, aNestLevel );
767 }
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 461 of file kicad_plugin.cpp.

462 {
463  if( m_ctl & CTL_STD_LAYER_NAMES )
464  {
465  PCB_LAYER_ID layer = aItem->GetLayer();
466 
467  // English layer names should never need quoting.
468  m_out->Print( 0, " (layer %s)", TO_UTF8( BOARD::GetStandardLayerName( layer ) ) );
469  }
470  else
471  m_out->Print( 0, " (layer %s)", m_out->Quotew( aItem->GetLayerName() ).c_str() );
472 }
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:622

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

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

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

730 {
731  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
732  for( NETINFO_ITEM* net : *m_mapping )
733  {
734  m_out->Print( aNestLevel, "(net %d %s)\n",
735  m_mapping->Translate( net->GetNet() ),
736  m_out->Quotew( net->GetNetname() ).c_str() );
737  }
738 
739  m_out->Print( 0, "\n" );
740 
741  // Save the default net class first.
742  NETCLASS defaultNC = *dsnSettings.GetDefault();
743  filterNetClass( *aBoard, defaultNC ); // Remove empty nets (from a copy of a netclass)
744  defaultNC.Format( m_out, aNestLevel, m_ctl );
745 
746  // Save the rest of the net classes alphabetically.
747  for( const auto& it : dsnSettings.m_NetClasses )
748  {
749  NETCLASS netclass = *it.second;
750  filterNetClass( *aBoard, netclass ); // Remove empty nets (from a copy of a netclass)
751  netclass.Format( m_out, aNestLevel, m_ctl );
752  }
753 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:512
NETCLASS handles a collection of nets and the parameters used to route or test these nets.
Definition: netclass.h:55
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:472
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes
NETINFO_ITEM handles the data for a net.
Definition: netinfo.h:65
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.
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 475 of file kicad_plugin.cpp.

476 {
477  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
478 
479  // Setup
480  m_out->Print( aNestLevel, "(setup\n" );
481 
482  // Save the board physical stackup structure
484 
485  if( aBoard->GetDesignSettings().m_HasStackup )
486  stackup.FormatBoardStackup( m_out,aBoard, aNestLevel+1 );
487 
488  // Save current default track width, for compatibility with older Pcbnew version;
489  m_out->Print( aNestLevel+1, "(last_trace_width %s)\n",
490  FormatInternalUnits( dsnSettings.GetCurrentTrackWidth() ).c_str() );
491 
492  // Save custom track widths list (the first is not saved here: it's the netclass value)
493  for( unsigned ii = 1; ii < dsnSettings.m_TrackWidthList.size(); ii++ )
494  {
495  m_out->Print( aNestLevel+1, "(user_trace_width %s)\n",
496  FormatInternalUnits( dsnSettings.m_TrackWidthList[ii] ).c_str() );
497  }
498 
499  m_out->Print( aNestLevel+1, "(trace_clearance %s)\n",
500  FormatInternalUnits( dsnSettings.GetDefault()->GetClearance() ).c_str() );
501 
502  // ZONE_SETTINGS
503  m_out->Print( aNestLevel+1, "(zone_clearance %s)\n",
504  FormatInternalUnits( aBoard->GetZoneSettings().m_ZoneClearance ).c_str() );
505  m_out->Print( aNestLevel+1, "(zone_45_only %s)\n",
506  aBoard->GetZoneSettings().m_Zone_45_Only ? "yes" : "no" );
507 
508  m_out->Print( aNestLevel+1, "(trace_min %s)\n",
509  FormatInternalUnits( dsnSettings.m_TrackMinWidth ).c_str() );
510 
511  // Save current default via size, for compatibility with older Pcbnew version;
512  m_out->Print( aNestLevel+1, "(via_size %s)\n",
513  FormatInternalUnits( dsnSettings.GetDefault()->GetViaDiameter() ).c_str() );
514  m_out->Print( aNestLevel+1, "(via_drill %s)\n",
515  FormatInternalUnits( dsnSettings.GetDefault()->GetViaDrill() ).c_str() );
516  m_out->Print( aNestLevel+1, "(via_min_size %s)\n",
517  FormatInternalUnits( dsnSettings.m_ViasMinSize ).c_str() );
518  m_out->Print( aNestLevel+1, "(via_min_drill %s)\n",
519  FormatInternalUnits( dsnSettings.m_ViasMinDrill ).c_str() );
520 
521  // Save custom via dimensions list (the first is not saved here: it's the netclass value)
522  for( unsigned ii = 1; ii < dsnSettings.m_ViasDimensionsList.size(); ii++ )
523  m_out->Print( aNestLevel+1, "(user_via %s %s)\n",
524  FormatInternalUnits( dsnSettings.m_ViasDimensionsList[ii].m_Diameter ).c_str(),
525  FormatInternalUnits( dsnSettings.m_ViasDimensionsList[ii].m_Drill ).c_str() );
526 
527  // Save custom diff-pair dimensions (the first is not saved here: it's the netclass value)
528  for( unsigned ii = 1; ii < dsnSettings.m_DiffPairDimensionsList.size(); ii++ )
529  {
530  m_out->Print( aNestLevel+1, "(user_diff_pair %s %s %s)\n",
531  FormatInternalUnits( dsnSettings.m_DiffPairDimensionsList[ii].m_Width ).c_str(),
532  FormatInternalUnits( dsnSettings.m_DiffPairDimensionsList[ii].m_Gap ).c_str(),
533  FormatInternalUnits( dsnSettings.m_DiffPairDimensionsList[ii].m_ViaGap ).c_str() );
534  }
535 
536  // for old versions compatibility:
537  if( dsnSettings.m_BlindBuriedViaAllowed )
538  m_out->Print( aNestLevel+1, "(blind_buried_vias_allowed yes)\n" );
539 
540  m_out->Print( aNestLevel+1, "(uvia_size %s)\n",
541  FormatInternalUnits( dsnSettings.GetDefault()->GetuViaDiameter() ).c_str() );
542  m_out->Print( aNestLevel+1, "(uvia_drill %s)\n",
543  FormatInternalUnits( dsnSettings.GetDefault()->GetuViaDrill() ).c_str() );
544  m_out->Print( aNestLevel+1, "(uvias_allowed %s)\n",
545  ( dsnSettings.m_MicroViasAllowed ) ? "yes" : "no" );
546  m_out->Print( aNestLevel+1, "(uvia_min_size %s)\n",
547  FormatInternalUnits( dsnSettings.m_MicroViasMinSize ).c_str() );
548  m_out->Print( aNestLevel+1, "(uvia_min_drill %s)\n",
549  FormatInternalUnits( dsnSettings.m_MicroViasMinDrill ).c_str() );
550 
551  m_out->Print( aNestLevel+1, "(max_error %s)\n",
552  FormatInternalUnits( dsnSettings.m_MaxError ).c_str() );
553 
554  // Store this option only if it is not the legacy option:
555  if( dsnSettings.m_ZoneUseNoOutlineInFill )
556  m_out->Print( aNestLevel+1, "(filled_areas_thickness no)\n" );
557 
558  formatDefaults( dsnSettings, aNestLevel+1 );
559 
560  m_out->Print( aNestLevel+1, "(pad_size %s %s)\n",
561  FormatInternalUnits( dsnSettings.m_Pad_Master.GetSize().x ).c_str(),
562  FormatInternalUnits( dsnSettings.m_Pad_Master.GetSize().y ).c_str() );
563  m_out->Print( aNestLevel+1, "(pad_drill %s)\n",
564  FormatInternalUnits( dsnSettings.m_Pad_Master.GetDrillSize().x ).c_str() );
565 
566  m_out->Print( aNestLevel+1, "(pad_to_mask_clearance %s)\n",
567  FormatInternalUnits( dsnSettings.m_SolderMaskMargin ).c_str() );
568 
569  if( dsnSettings.m_SolderMaskMinWidth )
570  m_out->Print( aNestLevel+1, "(solder_mask_min_width %s)\n",
571  FormatInternalUnits( dsnSettings.m_SolderMaskMinWidth ).c_str() );
572 
573  if( dsnSettings.m_SolderPasteMargin != 0 )
574  m_out->Print( aNestLevel+1, "(pad_to_paste_clearance %s)\n",
575  FormatInternalUnits( dsnSettings.m_SolderPasteMargin ).c_str() );
576 
577  if( dsnSettings.m_SolderPasteMarginRatio != 0 )
578  m_out->Print( aNestLevel+1, "(pad_to_paste_clearance_ratio %s)\n",
579  Double2Str( dsnSettings.m_SolderPasteMarginRatio ).c_str() );
580 
581  m_out->Print( aNestLevel+1, "(aux_axis_origin %s %s)\n",
582  FormatInternalUnits( aBoard->GetAuxOrigin().x ).c_str(),
583  FormatInternalUnits( aBoard->GetAuxOrigin().y ).c_str() );
584 
585  if( aBoard->GetGridOrigin().x || aBoard->GetGridOrigin().y )
586  m_out->Print( aNestLevel+1, "(grid_origin %s %s)\n",
587  FormatInternalUnits( aBoard->GetGridOrigin().x ).c_str(),
588  FormatInternalUnits( aBoard->GetGridOrigin().y ).c_str() );
589 
590  m_out->Print( aNestLevel+1, "(visible_elements %X)\n",
591  dsnSettings.GetVisibleElements() );
592 
593  aBoard->GetPlotOptions().Format( m_out, aNestLevel+1 );
594 
595  m_out->Print( aNestLevel, ")\n\n" );
596 }
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:530
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:512
std::string Double2Str(double aValue)
Helper function Double2Str to print a float number without using scientific notation and no trailing ...
Definition: base_units.cpp:65
BOARD_STACKUP & GetStackupDescriptor()
int m_ZoneClearance
Minimal clearance value.
Definition: zone_settings.h:74
bool m_BlindBuriedViaAllowed
true to allow blind/buried vias
const wxPoint & GetAuxOrigin() const
Definition: class_board.h:335
const wxPoint & GetGridOrigin() const
Definition: class_board.h:342
const ZONE_SETTINGS & GetZoneSettings() const
Fetch the zone settings for this container.
int GetVisibleElements() const
Function GetVisibleElements returns a bit-mask of all the element categories that are visible.
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:306
D_PAD m_Pad_Master
A dummy pad to store all default parameters.
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 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:300
std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from internal units to a string appropriate for writing ...
Definition: base_units.cpp:523
int m_SolderMaskMinWidth
Solder mask min width.
BOARD_DESIGN_SETTINGS contains design settings for a BOARD object.

References Double2Str(), PCB_PLOT_PARAMS::Format(), BOARD_STACKUP::FormatBoardStackup(), 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_ITEM_CONTAINER::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, OUTPUTFORMATTER::Print(), wxPoint::x, and wxPoint::y.

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

2167 {
2168  return getFootprint( aLibraryPath, aFootprintName, aProperties, false );
2169 }
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 113 of file pcbnew/kicad_plugin.h.

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

◆ getFootprint()

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

Definition at line 2135 of file kicad_plugin.cpp.

2139 {
2140  LOCALE_IO toggle; // toggles on, then off, the C locale.
2141 
2142  init( aProperties );
2143 
2144  try
2145  {
2146  validateCache( aLibraryPath, checkModified );
2147  }
2148  catch( const IO_ERROR& )
2149  {
2150  // do nothing with the error
2151  }
2152 
2153  const MODULE_MAP& mods = m_cache->GetModules();
2154 
2155  MODULE_CITER it = mods.find( aFootprintName );
2156 
2157  if( it == mods.end() )
2158  return nullptr;
2159 
2160  return it->second->GetModule();
2161 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:202
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
std::map< wxString, MODULE * > MODULE_MAP
Definition: eagle_parser.h:51
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
MODULE_MAP::const_iterator MODULE_CITER
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:76
MODULE_MAP & GetModules()

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

2321 {
2322  return FP_CACHE::GetTimestamp( aLibraryPath );
2323 }
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 171 of file pcbnew/kicad_plugin.h.

172  {
173  std::string ret = m_sf.GetString();
174  if( doClear )
175  m_sf.Clear();
176 
177  return ret;
178  }
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 2085 of file kicad_plugin.cpp.

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

References m_board, m_loading_format_version, m_props, m_reader, NULL, 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 2419 of file kicad_plugin.cpp.

2420 {
2421  LOCALE_IO toggle;
2422 
2423  init( NULL );
2424 
2425  validateCache( aLibraryPath );
2426 
2427  return m_cache->IsWritable();
2428 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:202
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
#define NULL
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
bool IsWritable() const

References init(), FP_CACHE::IsWritable(), m_cache, NULL, 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 2041 of file kicad_plugin.cpp.

2042 {
2043  FILE_LINE_READER reader( aFileName );
2044 
2045  init( aProperties );
2046 
2047  m_parser->SetLineReader( &reader );
2048  m_parser->SetBoard( aAppendToMe );
2049 
2050  BOARD* board;
2051 
2052  try
2053  {
2054  board = dynamic_cast<BOARD*>( m_parser->Parse() );
2055  }
2056  catch( const FUTURE_FORMAT_ERROR& )
2057  {
2058  // Don't wrap a FUTURE_FORMAT_ERROR in another
2059  throw;
2060  }
2061  catch( const PARSE_ERROR& parse_error )
2062  {
2063  if( m_parser->IsTooRecent() )
2064  throw FUTURE_FORMAT_ERROR( parse_error, m_parser->GetRequiredVersion() );
2065  else
2066  throw;
2067  }
2068 
2069  if( !board )
2070  {
2071  // The parser loaded something that was valid, but wasn't a board.
2072  THROW_PARSE_ERROR( _( "this file does not contain a PCB" ),
2073  m_parser->CurSource(), m_parser->CurLine(),
2074  m_parser->CurLineNumber(), m_parser->CurOffset() );
2075  }
2076 
2077  // Give the filename to the board if it's new
2078  if( !aAppendToMe )
2079  board->SetFileName( aFileName );
2080 
2081  return board;
2082 }
void init(const PROPERTIES *aProperties)
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:207
void SetBoard(BOARD *aBoard)
Definition: pcb_parser.h:342
void SetFileName(const wxString &aFileName)
Definition: class_board.h:216
PCB_PARSER * m_parser
#define THROW_PARSE_ERROR(aProblem, aSource, aInputLine, aLineNumber, aByteIndex)
BOARD_ITEM * Parse()
Definition: pcb_parser.cpp:467
LINE_READER * SetLineReader(LINE_READER *aReader)
Function SetLineReader sets aLineReader into the parser, and returns the previous one,...
Definition: pcb_parser.h:335
bool IsTooRecent()
Return whether a version number, if any was parsed, was too recent.
Definition: pcb_parser.h:360
Struct PARSE_ERROR contains a filename or source description, a problem input line,...
Definition: ki_exception.h:123
BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:163
#define _(s)
Definition: 3d_actions.cpp:33
Struct FUTURE_FORMAT_ERROR variant of PARSE_ERROR indicating that a syntax or related error was likel...
Definition: ki_exception.h:172

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

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

References PCB_PARSER::GetRequiredVersion(), PCB_PARSER::IsTooRecent(), 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 108 of file pcbnew/kicad_plugin.h.

109  {
110  return wxT( "KiCad" );
111  }

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

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

Referenced by KI_TEST::DumpBoardToFile().

◆ SetOutputFormatter()

void PCB_IO::SetOutputFormatter ( OUTPUTFORMATTER aFormatter)
inline

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

180 { 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 2094 of file kicad_plugin.cpp.

2095 {
2096  if( !m_cache || !m_cache->IsPath( aLibraryPath ) || ( checkModified && m_cache->IsModified() ) )
2097  {
2098  // a spectacular episode in memory management:
2099  delete m_cache;
2100  m_cache = new FP_CACHE( this, aLibraryPath );
2101  m_cache->Load();
2102  }
2103 }
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 102 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 186 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 194 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 196 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 202 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 190 of file pcbnew/kicad_plugin.h.

Referenced by init().

◆ m_reader

LINE_READER* PCB_IO::m_reader
protected

no ownership here.

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

Referenced by init().

◆ m_sf

STRING_FORMATTER PCB_IO::m_sf
protected

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

Referenced by GetStringOutput(), and PCB_IO().


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