KiCad PCB EDA Suite
PCB_IO Class Reference

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

#include <kicad_plugin.h>

Inheritance diagram for PCB_IO:
PLUGIN CLIPBOARD_IO GITHUB_PLUGIN

Public Member Functions

const wxString PluginName () const override
 Function PluginName returns a brief hard coded name for this PLUGIN. More...
 
const wxString GetFileExtension () const override
 Function GetFileExtension returns the file extension for the PLUGIN. More...
 
virtual void Save (const wxString &aFileName, BOARD *aBoard, const PROPERTIES *aProperties=NULL) override
 Function Save will write aBoard to a storage file in a format that this PLUGIN implementation knows about, or it can be used to write a portion of aBoard to a special kind of export file. More...
 
BOARDLoad (const wxString &aFileName, BOARD *aAppendToMe, const PROPERTIES *aProperties=NULL) override
 Function Load loads information from some input file format that this PLUGIN implementation knows about, into either a new BOARD or an existing one. More...
 
void FootprintEnumerate (wxArrayString &aFootprintNames, const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 Return a list of footprint names contained within the library at aLibraryPath. More...
 
MODULELoadEnumeratedFootprint (const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties=NULL) override
 Function LoadEnumeratedFootprint a version of FootprintLoad() for use after FootprintEnumerate() for more efficient cache management. More...
 
MODULEFootprintLoad (const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties=NULL) override
 Function FootprintLoad loads a footprint having aFootprintName from the aLibraryPath containing a library format that this PLUGIN knows about. More...
 
void FootprintSave (const wxString &aLibraryPath, const MODULE *aFootprint, const PROPERTIES *aProperties=NULL) override
 Function FootprintSave will write aModule to an existing library located at aLibraryPath. More...
 
void FootprintDelete (const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties=NULL) override
 Function FootprintDelete deletes aFootprintName from the library at aLibraryPath. More...
 
long long GetLibraryTimestamp (const wxString &aLibraryPath) const override
 Generate a timestamp representing all the files in the library (including the library directory). More...
 
void FootprintLibCreate (const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 Function FootprintLibCreate creates a new empty footprint library at aLibraryPath empty. More...
 
bool FootprintLibDelete (const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 Function FootprintLibDelete deletes an existing footprint library and returns true, or if library does not exist returns false, or throws an exception if library exists but is read only or cannot be deleted for some other reason. More...
 
bool IsFootprintLibWritable (const wxString &aLibraryPath) override
 Function IsFootprintLibWritable returns true iff the library at aLibraryPath is writable. More...
 
 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)
 
MODULEdoLoadFootprint (const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties, bool checkModified)
 
void init (const PROPERTIES *aProperties)
 
void formatSetup (BOARD *aBoard, int aNestLevel=0) const
 formats the board setup information More...
 
void formatGeneral (BOARD *aBoard, int aNestLevel=0) const
 formats the General section of the file More...
 
void formatBoardLayers (BOARD *aBoard, int aNestLevel=0) const
 formats the board layer information More...
 
void formatNetInformation (BOARD *aBoard, int aNestLevel=0) const
 formats the Nets and Netclasses More...
 
void formatHeader (BOARD *aBoard, int aNestLevel=0) const
 writes everything that comes before the board_items, like settings and layers etc More...
 

Protected Attributes

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

Private Member Functions

void format (BOARD *aBoard, int aNestLevel=0) const
 
void format (DIMENSION *aDimension, int aNestLevel=0) const
 
void format (EDGE_MODULE *aModuleDrawing, int aNestLevel=0) const
 
void format (DRAWSEGMENT *aSegment, int aNestLevel=0) const
 
void format (PCB_TARGET *aTarget, int aNestLevel=0) const
 
void format (MODULE *aModule, int aNestLevel=0) const
 
void format (D_PAD *aPad, int aNestLevel=0) const
 
void format (TEXTE_PCB *aText, int aNestLevel=0) const
 
void format (TEXTE_MODULE *aText, int aNestLevel=0) const
 
void format (TRACK *aTrack, int aNestLevel=0) const
 
void format (ZONE_CONTAINER *aZone, int aNestLevel=0) const
 
void formatLayer (const BOARD_ITEM *aItem) const
 
void formatLayers (LSET aLayerMask, int aNestLevel=0) const
 

Friends

class FP_CACHE
 

Detailed Description

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

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

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

Constructor & Destructor Documentation

PCB_IO::PCB_IO ( int  aControlFlags = CTL_FOR_BOARD)

Definition at line 1888 of file kicad_plugin.cpp.

References init(), m_out, and m_sf.

Referenced by GetFileExtension().

1888  :
1889  m_cache( 0 ),
1890  m_ctl( aControlFlags ),
1891  m_parser( new PCB_PARSER() ),
1892  m_mapping( new NETINFO_MAPPING() )
1893 {
1894  init( 0 );
1895  m_out = &m_sf;
1896 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
FP_CACHE * m_cache
Footprint library cache.
Class PCB_PARSER reads a Pcbnew s-expression formatted LINE_READER object and returns the appropriate...
Definition: pcb_parser.h:65
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
PCB_IO::~PCB_IO ( )

Definition at line 1899 of file kicad_plugin.cpp.

References m_cache, m_mapping, and m_parser.

Referenced by GetFileExtension().

1900 {
1901  delete m_cache;
1902  delete m_parser;
1903  delete m_mapping;
1904 }
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 ...

Member Function Documentation

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

Definition at line 2007 of file kicad_plugin.cpp.

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

Referenced by FootprintLoad(), and LoadEnumeratedFootprint().

2011 {
2012  LOCALE_IO toggle; // toggles on, then off, the C locale.
2013 
2014  init( aProperties );
2015 
2016  try
2017  {
2018  validateCache( aLibraryPath, checkModified );
2019  }
2020  catch( const IO_ERROR& )
2021  {
2022  // do nothing with the error
2023  }
2024 
2025  const MODULE_MAP& mods = m_cache->GetModules();
2026 
2027  MODULE_CITER it = mods.find( aFootprintName );
2028 
2029  if( it == mods.end() )
2030  {
2031  return NULL;
2032  }
2033 
2034  // copy constructor to clone the already loaded MODULE
2035  return new MODULE( *it->second->GetModule() );
2036 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
std::map< wxString, MODULE * > MODULE_MAP
Definition: eagle_plugin.h:35
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:47
MODULE_MAP & GetModules()
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 2126 of file kicad_plugin.cpp.

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

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

2127 {
2128  LOCALE_IO toggle; // toggles on, then off, the C locale.
2129 
2130  init( aProperties );
2131 
2132  validateCache( aLibraryPath );
2133 
2134  if( !m_cache->IsWritable() )
2135  {
2136  THROW_IO_ERROR( wxString::Format( _( "Library \"%s\" is read only" ),
2137  aLibraryPath.GetData() ) );
2138  }
2139 
2140  m_cache->Remove( aFootprintName );
2141 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
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)
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 THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
void PCB_IO::FootprintEnumerate ( wxArrayString &  aFootprintNames,
const wxString &  aLibraryPath,
const PROPERTIES aProperties = NULL 
)
overridevirtual

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

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

Reimplemented from PLUGIN.

Definition at line 1972 of file kicad_plugin.cpp.

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

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

1975 {
1976  LOCALE_IO toggle; // toggles on, then off, the C locale.
1977  wxDir dir( aLibraryPath );
1978 
1979  init( aProperties );
1980 
1981  wxString errorMsg;
1982 
1983  try
1984  {
1985  validateCache( aLibraryPath );
1986  }
1987  catch( const IO_ERROR& ioe )
1988  {
1989  errorMsg = ioe.What();
1990  }
1991 
1992  // Some of the files may have been parsed correctly so we want to add the valid files to
1993  // the library.
1994 
1995  const MODULE_MAP& mods = m_cache->GetModules();
1996 
1997  for( MODULE_CITER it = mods.begin(); it != mods.end(); ++it )
1998  {
1999  aFootprintNames.Add( it->first );
2000  }
2001 
2002  if( !errorMsg.IsEmpty() )
2003  THROW_IO_ERROR( errorMsg );
2004 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
std::map< wxString, MODULE * > MODULE_MAP
Definition: eagle_plugin.h:35
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:33
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:47
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
MODULE_MAP & GetModules()
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 2155 of file kicad_plugin.cpp.

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

Referenced by GITHUB_PLUGIN::FootprintLibCreate(), and GetFileExtension().

2156 {
2157  if( wxDir::Exists( aLibraryPath ) )
2158  {
2159  THROW_IO_ERROR( wxString::Format( _( "cannot overwrite library path \"%s\"" ),
2160  aLibraryPath.GetData() ) );
2161  }
2162 
2163  LOCALE_IO toggle;
2164 
2165  init( aProperties );
2166 
2167  delete m_cache;
2168  m_cache = new FP_CACHE( this, aLibraryPath );
2169  m_cache->Save();
2170 }
friend class FP_CACHE
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
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 THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
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 2173 of file kicad_plugin.cpp.

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

Referenced by GITHUB_PLUGIN::FootprintLibDelete(), and GetFileExtension().

2174 {
2175  wxFileName fn;
2176  fn.SetPath( aLibraryPath );
2177 
2178  // Return if there is no library path to delete.
2179  if( !fn.DirExists() )
2180  return false;
2181 
2182  if( !fn.IsDirWritable() )
2183  {
2184  THROW_IO_ERROR( wxString::Format( _( "user does not have permission to delete directory \"%s\"" ),
2185  aLibraryPath.GetData() ) );
2186  }
2187 
2188  wxDir dir( aLibraryPath );
2189 
2190  if( dir.HasSubDirs() )
2191  {
2192  THROW_IO_ERROR( wxString::Format( _( "library directory \"%s\" has unexpected sub-directories" ),
2193  aLibraryPath.GetData() ) );
2194  }
2195 
2196  // All the footprint files must be deleted before the directory can be deleted.
2197  if( dir.HasFiles() )
2198  {
2199  unsigned i;
2200  wxFileName tmp;
2201  wxArrayString files;
2202 
2203  wxDir::GetAllFiles( aLibraryPath, &files );
2204 
2205  for( i = 0; i < files.GetCount(); i++ )
2206  {
2207  tmp = files[i];
2208 
2209  if( tmp.GetExt() != KiCadFootprintFileExtension )
2210  {
2211  THROW_IO_ERROR( wxString::Format( _( "unexpected file \"%s\" was found in library path \"%s\"" ),
2212  files[i].GetData(), aLibraryPath.GetData() ) );
2213  }
2214  }
2215 
2216  for( i = 0; i < files.GetCount(); i++ )
2217  {
2218  wxRemoveFile( files[i] );
2219  }
2220  }
2221 
2222  wxLogTrace( traceKicadPcbPlugin, wxT( "Removing footprint library \"%s\"" ),
2223  aLibraryPath.GetData() );
2224 
2225  // Some of the more elaborate wxRemoveFile() crap puts up its own wxLog dialog
2226  // we don't want that. we want bare metal portability with no UI here.
2227  if( !wxRmdir( aLibraryPath ) )
2228  {
2229  THROW_IO_ERROR( wxString::Format( _( "footprint library \"%s\" cannot be deleted" ),
2230  aLibraryPath.GetData() ) );
2231  }
2232 
2233  // For some reason removing a directory in Windows is not immediately updated. This delay
2234  // prevents an error when attempting to immediately recreate the same directory when over
2235  // writing an existing library.
2236 #ifdef __WINDOWS__
2237  wxMilliSleep( 250L );
2238 #endif
2239 
2240  if( m_cache && !m_cache->IsPath( aLibraryPath ) )
2241  {
2242  delete m_cache;
2243  m_cache = NULL;
2244  }
2245 
2246  return true;
2247 }
FP_CACHE * m_cache
Footprint library cache.
const wxString KiCadFootprintFileExtension
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.
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
size_t i
Definition: json11.cpp:597
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
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 131 of file plugin.cpp.

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

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

References doLoadFootprint().

Referenced by GITHUB_PLUGIN::FootprintLoad(), and GetFileExtension().

2049 {
2050  return doLoadFootprint( aLibraryPath, aFootprintName, aProperties, true );
2051 }
MODULE * doLoadFootprint(const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties, bool checkModified)
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 2054 of file kicad_plugin.cpp.

References CTL_FOR_LIBRARY, F_Cu, Format(), GetChars(), MODULE::GetFPID(), LIB_ID::GetLibItemName(), FP_CACHE::GetModules(), init(), FP_CACHE::IsWritable(), KiCadFootprintFileExtension, m_cache, m_ctl, FP_CACHE::Save(), THROW_IO_ERROR, traceKicadPcbPlugin, and validateCache().

Referenced by GITHUB_PLUGIN::FootprintSave(), and GetFileExtension().

2056 {
2057  LOCALE_IO toggle; // toggles on, then off, the C locale.
2058 
2059  init( aProperties );
2060 
2061  // In this public PLUGIN API function, we can safely assume it was
2062  // called for saving into a library path.
2064 
2065  validateCache( aLibraryPath );
2066 
2067  if( !m_cache->IsWritable() )
2068  {
2069  wxString msg = wxString::Format(
2070  _( "Library \"%s\" is read only" ),
2071  GetChars( aLibraryPath )
2072  );
2073 
2074  THROW_IO_ERROR( msg );
2075  }
2076 
2077  wxString footprintName = aFootprint->GetFPID().GetLibItemName();
2078 
2079  MODULE_MAP& mods = m_cache->GetModules();
2080 
2081  // Quietly overwrite module and delete module file from path for any by same name.
2082  wxFileName fn( aLibraryPath, aFootprint->GetFPID().GetLibItemName(),
2084 
2085  if( !fn.IsOk() )
2086  {
2087  THROW_IO_ERROR( wxString::Format( _( "Footprint file name \"%s\" is not valid." ),
2088  GetChars( fn.GetFullPath() ) ) );
2089  }
2090 
2091  if( fn.FileExists() && !fn.IsFileWritable() )
2092  {
2093  THROW_IO_ERROR( wxString::Format( _( "user does not have write permission to delete file \"%s\" " ),
2094  GetChars( fn.GetFullPath() ) ) );
2095  }
2096 
2097  MODULE_CITER it = mods.find( footprintName );
2098 
2099  if( it != mods.end() )
2100  {
2101  wxLogTrace( traceKicadPcbPlugin, wxT( "Removing footprint library file '%s'." ),
2102  fn.GetFullPath().GetData() );
2103  mods.erase( footprintName );
2104  wxRemoveFile( fn.GetFullPath() );
2105  }
2106 
2107  // I need my own copy for the cache
2108  MODULE* module = new MODULE( *aFootprint );
2109 
2110  // and it's time stamp must be 0, it should have no parent, orientation should
2111  // be zero, and it should be on the front layer.
2112  module->SetTimeStamp( 0 );
2113  module->SetParent( 0 );
2114  module->SetOrientation( 0 );
2115 
2116  if( module->GetLayer() != F_Cu )
2117  module->Flip( module->GetPosition() );
2118 
2119  wxLogTrace( traceKicadPcbPlugin, wxT( "Creating s-expression footprint file: %s." ),
2120  fn.GetFullPath().GetData() );
2121  mods.insert( footprintName, new FP_CACHE_ITEM( module, fn ) );
2122  m_cache->Save( module );
2123 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
const wxString KiCadFootprintFileExtension
const LIB_ID & GetFPID() const
Definition: class_module.h:191
const UTF8 & GetLibItemName() const
Definition: lib_id.h:118
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
const wxChar *const traceKicadPcbPlugin
Flag to enable GEDA PCB plugin debug output.
std::map< wxString, MODULE * > MODULE_MAP
Definition: eagle_plugin.h:35
Class FP_CACHE_ITEM is helper class for creating a footprint library cache.
void Save(MODULE *aModule=NULL)
Function Save Save the footprint cache or a single module from it to disk.
bool IsWritable() const
MODULE_MAP::const_iterator MODULE_CITER
#define CTL_FOR_LIBRARY
Format output for a footprint library instead of clipboard or BOARD.
static const wxChar * GetChars(const wxString &s)
Function GetChars returns a wxChar* to the actual wxChar* data within a wxString, and is helpful for ...
Definition: macros.h:92
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 THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
MODULE_MAP & GetModules()
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 436 of file kicad_plugin.cpp.

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

Referenced by FOOTPRINT_EDIT_FRAME::Export_Module(), GetFileExtension(), CLIPBOARD_IO::Save(), and CLIPBOARD_IO::SaveSelection().

437 {
438  LOCALE_IO toggle; // public API function, perform anything convenient for caller
439 
440  switch( aItem->Type() )
441  {
442  case PCB_T:
443  format( static_cast<BOARD*>( aItem ), aNestLevel );
444  break;
445 
446  case PCB_DIMENSION_T:
447  format( static_cast<DIMENSION*>( aItem ), aNestLevel );
448  break;
449 
450  case PCB_LINE_T:
451  format( static_cast<DRAWSEGMENT*>( aItem ), aNestLevel );
452  break;
453 
454  case PCB_MODULE_EDGE_T:
455  format( static_cast<EDGE_MODULE*>( aItem ), aNestLevel );
456  break;
457 
458  case PCB_TARGET_T:
459  format( static_cast<PCB_TARGET*>( aItem ), aNestLevel );
460  break;
461 
462  case PCB_MODULE_T:
463  format( static_cast<MODULE*>( aItem ), aNestLevel );
464  break;
465 
466  case PCB_PAD_T:
467  format( static_cast<D_PAD*>( aItem ), aNestLevel );
468  break;
469 
470  case PCB_TEXT_T:
471  format( static_cast<TEXTE_PCB*>( aItem ), aNestLevel );
472  break;
473 
474  case PCB_MODULE_TEXT_T:
475  format( static_cast<TEXTE_MODULE*>( aItem ), aNestLevel );
476  break;
477 
478  case PCB_TRACE_T:
479  case PCB_VIA_T:
480  format( static_cast<TRACK*>( aItem ), aNestLevel );
481  break;
482 
483  case PCB_ZONE_AREA_T:
484  format( static_cast<ZONE_CONTAINER*>( aItem ), aNestLevel );
485  break;
486 
487  default:
488  wxFAIL_MSG( wxT( "Cannot format item " ) + aItem->GetClass() );
489  }
490 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:209
Definition: typeinfo.h:85
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
class ZONE_CONTAINER, a zone area
Definition: typeinfo.h:102
class TEXTE_PCB, text on a layer
Definition: typeinfo.h:92
class D_PAD, a pad in a footprint
Definition: typeinfo.h:90
class EDGE_MODULE, a footprint edge
Definition: typeinfo.h:94
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:95
class MODULE, a footprint
Definition: typeinfo.h:89
class DIMENSION, a dimension (graphic item)
Definition: typeinfo.h:100
class PCB_TARGET, a target (graphic item)
Definition: typeinfo.h:101
class TEXTE_MODULE, text in a footprint
Definition: typeinfo.h:93
virtual wxString GetClass() const =0
Function GetClass returns the class name.
void format(BOARD *aBoard, int aNestLevel=0) const
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:96
class DRAWSEGMENT, a segment not on copper layers
Definition: typeinfo.h:91
void PCB_IO::format ( BOARD aBoard,
int  aNestLevel = 0 
) const
private
Todo:
Add warning here that the old segment filed zones are no longer supported and will not be saved.

Definition at line 749 of file kicad_plugin.cpp.

References BOARD::Drawings(), Format(), BOARD::GetArea(), BOARD::GetAreaCount(), DHEAD::GetCount(), i, BOARD::m_Modules, BOARD::m_Track, TRACK::Next(), and MODULE::Next().

750 {
751  formatHeader( aBoard, aNestLevel );
752 
753  // Save the modules.
754  for( MODULE* module = aBoard->m_Modules; module; module = module->Next() )
755  {
756  Format( module, aNestLevel );
757  m_out->Print( 0, "\n" );
758  }
759 
760  // Save the graphical items on the board (not owned by a module)
761  for( auto item : aBoard->Drawings() )
762  Format( item, aNestLevel );
763 
764  if( aBoard->Drawings().Size() )
765  m_out->Print( 0, "\n" );
766 
767  // Do not save MARKER_PCBs, they can be regenerated easily.
768 
769  // Save the tracks and vias.
770  for( TRACK* track = aBoard->m_Track; track; track = track->Next() )
771  Format( track, aNestLevel );
772 
773  if( aBoard->m_Track.GetCount() )
774  m_out->Print( 0, "\n" );
775 
778 
779  // Save the polygon (which are the newer technology) zones.
780  for( int i = 0; i < aBoard->GetAreaCount(); ++i )
781  Format( aBoard->GetArea( i ), aNestLevel );
782 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
MODULE * Next() const
Definition: class_module.h:121
int GetAreaCount() const
Function GetAreaCount.
Definition: class_board.h:1011
void Format(BOARD_ITEM *aItem, int aNestLevel=0) const
Function Format outputs aItem to aFormatter in s-expression format.
void formatHeader(BOARD *aBoard, int aNestLevel=0) const
writes everything that comes before the board_items, like settings and layers etc ...
TRACK * Next() const
Definition: class_track.h:99
ZONE_CONTAINER * GetArea(int index) const
Function GetArea returns the Area (Zone Container) at a given index.
Definition: class_board.h:982
DLIST< MODULE > m_Modules
Definition: class_board.h:245
size_t i
Definition: json11.cpp:597
unsigned GetCount() const
Function GetCount returns the number of elements in the list.
Definition: dlist.h:126
DLIST< TRACK > m_Track
Definition: class_board.h:246
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
DLIST_ITERATOR_WRAPPER< BOARD_ITEM > Drawings()
Definition: class_board.h:251
void PCB_IO::format ( DIMENSION aDimension,
int  aNestLevel = 0 
) const
private

Definition at line 785 of file kicad_plugin.cpp.

References FMT_IU, Format(), EDA_ITEM::GetTimeStamp(), DIMENSION::GetValue(), DIMENSION::GetWidth(), DIMENSION::m_arrowD1F, DIMENSION::m_arrowD2F, DIMENSION::m_arrowG1F, DIMENSION::m_arrowG2F, DIMENSION::m_crossBarF, DIMENSION::m_crossBarO, DIMENSION::m_featureLineDF, DIMENSION::m_featureLineDO, DIMENSION::m_featureLineGF, DIMENSION::m_featureLineGO, DIMENSION::Text(), wxPoint::x, and wxPoint::y.

786 {
787  m_out->Print( aNestLevel, "(dimension %s (width %s)",
788  FMT_IU( aDimension->GetValue() ).c_str(),
789  FMT_IU( aDimension->GetWidth() ).c_str() );
790 
791  formatLayer( aDimension );
792 
793  if( aDimension->GetTimeStamp() )
794  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aDimension->GetTimeStamp() );
795 
796  m_out->Print( 0, "\n" );
797 
798  Format( &aDimension->Text(), aNestLevel+1 );
799 
800  m_out->Print( aNestLevel+1, "(feature1 (pts (xy %s %s) (xy %s %s)))\n",
801  FMT_IU( aDimension->m_featureLineDO.x ).c_str(),
802  FMT_IU( aDimension->m_featureLineDO.y ).c_str(),
803  FMT_IU( aDimension->m_featureLineDF.x ).c_str(),
804  FMT_IU( aDimension->m_featureLineDF.y ).c_str() );
805 
806  m_out->Print( aNestLevel+1, "(feature2 (pts (xy %s %s) (xy %s %s)))\n",
807  FMT_IU( aDimension->m_featureLineGO.x ).c_str(),
808  FMT_IU( aDimension->m_featureLineGO.y ).c_str(),
809  FMT_IU( aDimension->m_featureLineGF.x ).c_str(),
810  FMT_IU( aDimension->m_featureLineGF.y ).c_str() );
811 
812  m_out->Print( aNestLevel+1, "(crossbar (pts (xy %s %s) (xy %s %s)))\n",
813  FMT_IU( aDimension->m_crossBarO.x ).c_str(),
814  FMT_IU( aDimension->m_crossBarO.y ).c_str(),
815  FMT_IU( aDimension->m_crossBarF.x ).c_str(),
816  FMT_IU( aDimension->m_crossBarF.y ).c_str() );
817 
818  m_out->Print( aNestLevel+1, "(arrow1a (pts (xy %s %s) (xy %s %s)))\n",
819  FMT_IU( aDimension->m_crossBarF.x ).c_str(),
820  FMT_IU( aDimension->m_crossBarF.y ).c_str(),
821  FMT_IU( aDimension->m_arrowD1F.x ).c_str(),
822  FMT_IU( aDimension->m_arrowD1F.y ).c_str() );
823 
824  m_out->Print( aNestLevel+1, "(arrow1b (pts (xy %s %s) (xy %s %s)))\n",
825  FMT_IU( aDimension->m_crossBarF.x ).c_str(),
826  FMT_IU( aDimension->m_crossBarF.y ).c_str(),
827  FMT_IU( aDimension->m_arrowD2F.x ).c_str(),
828  FMT_IU( aDimension->m_arrowD2F.y ).c_str() );
829 
830  m_out->Print( aNestLevel+1, "(arrow2a (pts (xy %s %s) (xy %s %s)))\n",
831  FMT_IU( aDimension->m_crossBarO.x ).c_str(),
832  FMT_IU( aDimension->m_crossBarO.y ).c_str(),
833  FMT_IU( aDimension->m_arrowG1F.x ).c_str(),
834  FMT_IU( aDimension->m_arrowG1F.y ).c_str() );
835 
836  m_out->Print( aNestLevel+1, "(arrow2b (pts (xy %s %s) (xy %s %s)))\n",
837  FMT_IU( aDimension->m_crossBarO.x ).c_str(),
838  FMT_IU( aDimension->m_crossBarO.y ).c_str(),
839  FMT_IU( aDimension->m_arrowG2F.x ).c_str(),
840  FMT_IU( aDimension->m_arrowG2F.y ).c_str() );
841 
842  m_out->Print( aNestLevel, ")\n" );
843 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
wxPoint m_crossBarF
wxPoint m_arrowD1F
int GetWidth() const
void formatLayer(const BOARD_ITEM *aItem) const
wxPoint m_featureLineDF
wxPoint m_featureLineGO
#define FMT_IU
wxPoint m_arrowG1F
wxPoint m_arrowD2F
wxPoint m_arrowG2F
void Format(BOARD_ITEM *aItem, int aNestLevel=0) const
Function Format outputs aItem to aFormatter in s-expression format.
TEXTE_PCB & Text()
wxPoint m_crossBarO
int GetValue() const
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
wxPoint m_featureLineDO
timestamp_t GetTimeStamp() const
Definition: base_struct.h:215
wxPoint m_featureLineGF
void PCB_IO::format ( EDGE_MODULE aModuleDrawing,
int  aNestLevel = 0 
) const
private

Definition at line 924 of file kicad_plugin.cpp.

References SHAPE_LINE_CHAIN::CPoint(), FMT_ANGLE, FMT_IU, DRAWSEGMENT::GetAngle(), DRAWSEGMENT::GetBezControl1(), DRAWSEGMENT::GetBezControl2(), EDGE_MODULE::GetEnd0(), DRAWSEGMENT::GetPolyShape(), DRAWSEGMENT::GetShape(), EDGE_MODULE::GetStart0(), DRAWSEGMENT::GetWidth(), DRAWSEGMENT::IsPolyShapeValid(), SHAPE_POLY_SET::Outline(), SHAPE_LINE_CHAIN::PointCount(), S_ARC, S_CIRCLE, S_CURVE, S_POLYGON, and S_SEGMENT.

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

Definition at line 846 of file kicad_plugin.cpp.

References SHAPE_LINE_CHAIN::CPoint(), FMT_ANGLE, FMT_IU, DRAWSEGMENT::GetAngle(), DRAWSEGMENT::GetBezControl1(), DRAWSEGMENT::GetBezControl2(), DRAWSEGMENT::GetEnd(), DRAWSEGMENT::GetPolyShape(), DRAWSEGMENT::GetShape(), DRAWSEGMENT::GetStart(), EDA_ITEM::GetStatus(), EDA_ITEM::GetTimeStamp(), DRAWSEGMENT::GetWidth(), DRAWSEGMENT::IsPolyShapeValid(), SHAPE_POLY_SET::Outline(), SHAPE_LINE_CHAIN::PointCount(), S_ARC, S_CIRCLE, S_CURVE, S_POLYGON, and S_SEGMENT.

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

Definition at line 1000 of file kicad_plugin.cpp.

References FMT_IU, PCB_TARGET::GetPosition(), PCB_TARGET::GetShape(), PCB_TARGET::GetSize(), EDA_ITEM::GetTimeStamp(), and PCB_TARGET::GetWidth().

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

Definition at line 1019 of file kicad_plugin.cpp.

References CTL_OMIT_AT, CTL_OMIT_INITIAL_COMMENTS, CTL_OMIT_PATH, CTL_OMIT_TSTAMPS, Double2Str(), FMT_ANGLE, FMT_IU, LIB_ID::Format(), Format(), MODULE::GetAttributes(), MODULE::GetDescription(), MODULE::GetFPID(), MODULE::GetInitialComments(), MODULE::GetKeywords(), MODULE::GetLastEditTime(), MODULE::GetLocalClearance(), MODULE::GetLocalSolderMaskMargin(), MODULE::GetLocalSolderPasteMargin(), MODULE::GetLocalSolderPasteMarginRatio(), MODULE::GetOrientation(), MODULE::GetPath(), MODULE::GetPlacementCost180(), MODULE::GetPlacementCost90(), MODULE::GetPosition(), MODULE::GetThermalGap(), MODULE::GetThermalWidth(), EDA_ITEM::GetTimeStamp(), MODULE::GetZoneConnection(), MODULE::GraphicalItemsList(), i, MODULE::IsLocked(), MODULE::IsPlaced(), MOD_CMS, MOD_DEFAULT, MOD_VIRTUAL, MODULE::Models(), BOARD_ITEM::Next(), D_PAD::Next(), PAD_ZONE_CONN_INHERITED, MODULE::PadsList(), MODULE::Reference(), TO_UTF8, and MODULE::Value().

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

Definition at line 1279 of file kicad_plugin.cpp.

References CTL_OMIT_NETS, CUST_PAD_SHAPE_IN_ZONE_CONVEXHULL, Double2Str(), FMT_ANGLE, FMT_IU, Format(), D_PAD::GetAnchorPadShape(), D_PAD::GetAttribute(), D_PAD::GetCustomShapeInZoneOpt(), D_PAD::GetDelta(), D_PAD::GetDrillShape(), D_PAD::GetDrillSize(), D_PAD::GetLayerSet(), D_PAD::GetLocalClearance(), D_PAD::GetLocalSolderMaskMargin(), D_PAD::GetLocalSolderPasteMargin(), D_PAD::GetLocalSolderPasteMarginRatio(), D_PAD::GetName(), BOARD_CONNECTED_ITEM::GetNetCode(), BOARD_CONNECTED_ITEM::GetNetname(), D_PAD::GetOffset(), D_PAD::GetOrientation(), D_PAD::GetPadToDieLength(), D_PAD::GetPos0(), D_PAD::GetPrimitives(), D_PAD::GetRoundRectRadiusRatio(), D_PAD::GetShape(), D_PAD::GetSize(), D_PAD::GetThermalGap(), D_PAD::GetThermalWidth(), D_PAD::GetZoneConnection(), PAD_CS_PRIMITIVE::m_ArcAngle, PAD_CS_PRIMITIVE::m_End, PAD_CS_PRIMITIVE::m_Poly, PAD_CS_PRIMITIVE::m_Radius, PAD_CS_PRIMITIVE::m_Shape, PAD_CS_PRIMITIVE::m_Start, PAD_CS_PRIMITIVE::m_Thickness, PAD_ATTRIB_CONN, PAD_ATTRIB_HOLE_NOT_PLATED, PAD_ATTRIB_SMD, PAD_ATTRIB_STANDARD, PAD_DRILL_SHAPE_OBLONG, PAD_SHAPE_CIRCLE, PAD_SHAPE_CUSTOM, PAD_SHAPE_OVAL, PAD_SHAPE_RECT, PAD_SHAPE_ROUNDRECT, PAD_SHAPE_TRAPEZOID, PAD_ZONE_CONN_INHERITED, S_ARC, S_CIRCLE, S_POLYGON, S_SEGMENT, StrPrintf(), THROW_IO_ERROR, NETINFO_LIST::UNCONNECTED, wxPoint::x, and wxPoint::y.

1280 {
1281  const char* shape;
1282 
1283  switch( aPad->GetShape() )
1284  {
1285  case PAD_SHAPE_CIRCLE: shape = "circle"; break;
1286  case PAD_SHAPE_RECT: shape = "rect"; break;
1287  case PAD_SHAPE_OVAL: shape = "oval"; break;
1288  case PAD_SHAPE_TRAPEZOID: shape = "trapezoid"; break;
1289  case PAD_SHAPE_ROUNDRECT: shape = "roundrect"; break;
1290  case PAD_SHAPE_CUSTOM: shape = "custom"; break;
1291 
1292  default:
1293  THROW_IO_ERROR( wxString::Format( _( "unknown pad type: %d"), aPad->GetShape() ) );
1294  }
1295 
1296  const char* type;
1297 
1298  switch( aPad->GetAttribute() )
1299  {
1300  case PAD_ATTRIB_STANDARD: type = "thru_hole"; break;
1301  case PAD_ATTRIB_SMD: type = "smd"; break;
1302  case PAD_ATTRIB_CONN: type = "connect"; break;
1303  case PAD_ATTRIB_HOLE_NOT_PLATED: type = "np_thru_hole"; break;
1304 
1305  default:
1306  THROW_IO_ERROR( wxString::Format( _( "unknown pad attribute: %d" ),
1307  aPad->GetAttribute() ) );
1308  }
1309 
1310  m_out->Print( aNestLevel, "(pad %s %s %s",
1311  m_out->Quotew( aPad->GetName() ).c_str(),
1312  type, shape );
1313  m_out->Print( 0, " (at %s", FMT_IU( aPad->GetPos0() ).c_str() );
1314 
1315  if( aPad->GetOrientation() != 0.0 )
1316  m_out->Print( 0, " %s", FMT_ANGLE( aPad->GetOrientation() ).c_str() );
1317 
1318  m_out->Print( 0, ")" );
1319  m_out->Print( 0, " (size %s)", FMT_IU( aPad->GetSize() ).c_str() );
1320 
1321  if( (aPad->GetDelta().GetWidth()) != 0 || (aPad->GetDelta().GetHeight() != 0 ) )
1322  m_out->Print( 0, " (rect_delta %s )", FMT_IU( aPad->GetDelta() ).c_str() );
1323 
1324  wxSize sz = aPad->GetDrillSize();
1325  wxPoint shapeoffset = aPad->GetOffset();
1326 
1327  if( (sz.GetWidth() > 0) || (sz.GetHeight() > 0) ||
1328  (shapeoffset.x != 0) || (shapeoffset.y != 0) )
1329  {
1330  m_out->Print( 0, " (drill" );
1331 
1332  if( aPad->GetDrillShape() == PAD_DRILL_SHAPE_OBLONG )
1333  m_out->Print( 0, " oval" );
1334 
1335  if( sz.GetWidth() > 0 )
1336  m_out->Print( 0, " %s", FMT_IU( sz.GetWidth() ).c_str() );
1337 
1338  if( sz.GetHeight() > 0 && sz.GetWidth() != sz.GetHeight() )
1339  m_out->Print( 0, " %s", FMT_IU( sz.GetHeight() ).c_str() );
1340 
1341  if( (shapeoffset.x != 0) || (shapeoffset.y != 0) )
1342  m_out->Print( 0, " (offset %s)", FMT_IU( aPad->GetOffset() ).c_str() );
1343 
1344  m_out->Print( 0, ")" );
1345  }
1346 
1347  formatLayers( aPad->GetLayerSet() );
1348 
1349  // Output the radius ratio for rounded rect pads
1350  if( aPad->GetShape() == PAD_SHAPE_ROUNDRECT )
1351  {
1352  m_out->Print( 0, "(roundrect_rratio %s)",
1353  Double2Str( aPad->GetRoundRectRadiusRatio() ).c_str() );
1354  }
1355 
1356  std::string output;
1357 
1358  // Unconnected pad is default net so don't save it.
1359  if( !( m_ctl & CTL_OMIT_NETS ) && aPad->GetNetCode() != NETINFO_LIST::UNCONNECTED )
1360  StrPrintf( &output, " (net %d %s)", m_mapping->Translate( aPad->GetNetCode() ),
1361  m_out->Quotew( aPad->GetNetname() ).c_str() );
1362 
1363  if( aPad->GetPadToDieLength() != 0 )
1364  StrPrintf( &output, " (die_length %s)", FMT_IU( aPad->GetPadToDieLength() ).c_str() );
1365 
1366  if( aPad->GetLocalSolderMaskMargin() != 0 )
1367  StrPrintf( &output, " (solder_mask_margin %s)", FMT_IU( aPad->GetLocalSolderMaskMargin() ).c_str() );
1368 
1369  if( aPad->GetLocalSolderPasteMargin() != 0 )
1370  StrPrintf( &output, " (solder_paste_margin %s)", FMT_IU( aPad->GetLocalSolderPasteMargin() ).c_str() );
1371 
1372  if( aPad->GetLocalSolderPasteMarginRatio() != 0 )
1373  StrPrintf( &output, " (solder_paste_margin_ratio %s)",
1374  Double2Str( aPad->GetLocalSolderPasteMarginRatio() ).c_str() );
1375 
1376  if( aPad->GetLocalClearance() != 0 )
1377  StrPrintf( &output, " (clearance %s)", FMT_IU( aPad->GetLocalClearance() ).c_str() );
1378 
1380  StrPrintf( &output, " (zone_connect %d)", aPad->GetZoneConnection() );
1381 
1382  if( aPad->GetThermalWidth() != 0 )
1383  StrPrintf( &output, " (thermal_width %s)", FMT_IU( aPad->GetThermalWidth() ).c_str() );
1384 
1385  if( aPad->GetThermalGap() != 0 )
1386  StrPrintf( &output, " (thermal_gap %s)", FMT_IU( aPad->GetThermalGap() ).c_str() );
1387 
1388  if( output.size() )
1389  {
1390  m_out->Print( 0, "\n" );
1391  m_out->Print( aNestLevel+1, "%s", output.c_str()+1 ); // +1 skips 1st space on 1st element
1392  }
1393 
1394  if( aPad->GetShape() == PAD_SHAPE_CUSTOM )
1395  {
1396  m_out->Print( 0, "\n");
1397  m_out->Print( aNestLevel+1, "(options" );
1398 
1400  m_out->Print( 0, " (clearance convexhull)" );
1401  #if 1 // Set to 1 to output the default option
1402  else
1403  m_out->Print( 0, " (clearance outline)" );
1404  #endif
1405 
1406  // Output the anchor pad shape (circle/rect)
1407  if( aPad->GetAnchorPadShape() == PAD_SHAPE_RECT )
1408  shape = "rect";
1409  else
1410  shape = "circle";
1411 
1412  m_out->Print( 0, " (anchor %s)", shape );
1413 
1414  m_out->Print( 0, ")"); // end of (options ...
1415 
1416  // Output graphic primitive of the pad shape
1417  m_out->Print( 0, "\n");
1418  m_out->Print( aNestLevel+1, "(primitives" );
1419 
1420  int nested_level = aNestLevel+2;
1421 
1422  // Output all basic shapes
1423  for( unsigned icnt = 0; icnt < aPad->GetPrimitives().size(); ++icnt )
1424  {
1425  m_out->Print( 0, "\n");
1426 
1427  const PAD_CS_PRIMITIVE& primitive = aPad->GetPrimitives()[icnt];
1428 
1429  switch( primitive.m_Shape )
1430  {
1431  case S_SEGMENT: // usual segment : line with rounded ends
1432  m_out->Print( nested_level, "(gr_line (start %s) (end %s) (width %s))",
1433  FMT_IU( primitive.m_Start ).c_str(),
1434  FMT_IU( primitive.m_End ).c_str(),
1435  FMT_IU( primitive.m_Thickness ).c_str() );
1436  break;
1437 
1438  case S_ARC: // Arc with rounded ends
1439  m_out->Print( nested_level, "(gr_arc (start %s) (end %s) (angle %s) (width %s))",
1440  FMT_IU( primitive.m_Start ).c_str(),
1441  FMT_IU( primitive.m_End ).c_str(),
1442  FMT_ANGLE( primitive.m_ArcAngle ).c_str(),
1443  FMT_IU( primitive.m_Thickness ).c_str() );
1444  break;
1445 
1446  case S_CIRCLE: // ring or circle (circle if width == 0
1447  m_out->Print( nested_level, "(gr_circle (center %s) (end %s %s) (width %s))",
1448  FMT_IU( primitive.m_Start ).c_str(),
1449  FMT_IU( primitive.m_Start.x + primitive.m_Radius ).c_str(),
1450  FMT_IU( primitive.m_Start.y ).c_str(),
1451  FMT_IU( primitive.m_Thickness ).c_str() );
1452  break;
1453 
1454  case S_POLYGON: // polygon
1455  if( primitive.m_Poly.size() < 2 )
1456  break; // Malformed polygon.
1457 
1458  {
1459  m_out->Print( nested_level, "(gr_poly (pts\n");
1460 
1461  // Write the polygon corners coordinates:
1462  const std::vector< wxPoint>& poly = primitive.m_Poly;
1463  int newLine = 0;
1464 
1465  for( unsigned ii = 0; ii < poly.size(); ii++ )
1466  {
1467  if( newLine == 0 )
1468  m_out->Print( nested_level+1, " (xy %s)", FMT_IU( wxPoint( poly[ii].x, poly[ii].y ) ).c_str() );
1469  else
1470  m_out->Print( 0, " (xy %s)", FMT_IU( wxPoint( poly[ii].x, poly[ii].y ) ).c_str() );
1471 
1472  if( ++newLine > 4 )
1473  {
1474  newLine = 0;
1475  m_out->Print( 0, "\n" );
1476  }
1477  }
1478 
1479  m_out->Print( 0, ") (width %s))", FMT_IU( primitive.m_Thickness ).c_str() );
1480  }
1481  break;
1482 
1483  default:
1484  break;
1485  }
1486  }
1487 
1488  m_out->Print( 0, "\n");
1489  m_out->Print( aNestLevel+1, ")" ); // end of (basic_shapes
1490  }
1491 
1492  m_out->Print( 0, ")\n" );
1493 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
PAD_SHAPE_T GetAnchorPadShape() const
Function GetAnchorPadShape.
Definition: class_pad.h:226
const std::vector< PAD_CS_PRIMITIVE > & GetPrimitives() const
Accessor to the basic shape list.
Definition: class_pad.h:336
PAD_ATTR_T GetAttribute() const
Definition: class_pad.h:405
like PAD_STANDARD, but not plated mechanical use only, no connection allowed
Definition: pad_shapes.h:65
int GetPadToDieLength() const
Definition: class_pad.h:408
wxPoint m_Start
angle of an arc, from its starting point, in 0.1 deg
Definition: class_pad.h:100
polygon (not yet used for tracks, but could be in microwave apps)
int GetLocalSolderMaskMargin() const
Definition: class_pad.h:410
Smd pad, appears on the solder paste layer (default)
Definition: pad_shapes.h:61
const wxPoint & GetPos0() const
Definition: class_pad.h:263
PAD_DRILL_SHAPE_T GetDrillShape() const
Definition: class_pad.h:388
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:61
const wxSize & GetDrillSize() const
Definition: class_pad.h:275
PAD_SHAPE_T GetShape() const
Function GetShape.
Definition: class_pad.h:216
int StrPrintf(std::string *result, const char *format,...)
Function StrPrintf is like sprintf() but the output is appended to a std::string instead of to a char...
Definition: richio.cpp:74
#define FMT_IU
int m_Radius
thickness of segment or outline For filled S_CIRCLE shape, thickness = 0.
Definition: class_pad.h:98
std::vector< wxPoint > m_Poly
is also the start point of the arc
Definition: class_pad.h:102
int Translate(int aNetCode) const
Function Translate Translates net number according to the map prepared by Update() function...
Arcs (with rounded ends)
Helper class to handle a primitive (basic shape: polygon, segment, circle or arc) to build a custom p...
Definition: class_pad.h:91
ZoneConnection GetZoneConnection() const
Definition: class_pad.cpp:650
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:402
int GetThermalWidth() const
Definition: class_pad.cpp:661
int GetThermalGap() const
Definition: class_pad.cpp:672
const wxSize & GetSize() const
Definition: class_pad.h:269
const wxString & GetName() const
Definition: class_pad.h:190
int GetLocalSolderPasteMargin() const
Definition: class_pad.h:416
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
wxPoint m_End
is also the center of the circle and arc
Definition: class_pad.h:101
#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:62
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:94
int GetLocalClearance() const
Definition: class_pad.h:413
double GetLocalSolderPasteMarginRatio() const
Definition: class_pad.h:419
int GetNetCode() const
Function GetNetCode.
int m_Thickness
S_SEGMENT, S_ARC, S_CIRCLE, S_POLYGON only (same as DRAWSEGMENT)
Definition: class_pad.h:95
const wxString & GetNetname() const
Function GetNetname.
double GetRoundRectRadiusRatio() const
has meaning only for rounded rect pads
Definition: class_pad.h:615
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
CUST_PAD_SHAPE_IN_ZONE GetCustomShapeInZoneOpt() const
Definition: class_pad.h:232
double GetOrientation() const
Function GetOrientation returns the rotation angle of the pad in tenths of degrees, but soon degrees.
Definition: class_pad.h:382
const wxSize & GetDelta() const
Definition: class_pad.h:272
Usual pad.
Definition: pad_shapes.h:60
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
static const int UNCONNECTED
Constant that holds the "unconnected net" number (typically 0) all items "connected" to this net are ...
Definition: netinfo.h:461
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
#define FMT_ANGLE
const wxPoint & GetOffset() const
Definition: class_pad.h:278
double m_ArcAngle
radius of a circle
Definition: class_pad.h:99
void PCB_IO::format ( TEXTE_PCB aText,
int  aNestLevel = 0 
) const
private

Definition at line 1496 of file kicad_plugin.cpp.

References FMT_ANGLE, FMT_IU, EDA_TEXT::GetText(), EDA_TEXT::GetTextAngle(), EDA_TEXT::GetTextPos(), and EDA_ITEM::GetTimeStamp().

1497 {
1498  m_out->Print( aNestLevel, "(gr_text %s (at %s",
1499  m_out->Quotew( aText->GetText() ).c_str(),
1500  FMT_IU( aText->GetTextPos() ).c_str() );
1501 
1502  if( aText->GetTextAngle() != 0.0 )
1503  m_out->Print( 0, " %s", FMT_ANGLE( aText->GetTextAngle() ).c_str() );
1504 
1505  m_out->Print( 0, ")" );
1506 
1507  formatLayer( aText );
1508 
1509  if( aText->GetTimeStamp() )
1510  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aText->GetTimeStamp() );
1511 
1512  m_out->Print( 0, "\n" );
1513 
1514  aText->EDA_TEXT::Format( m_out, aNestLevel, m_ctl );
1515 
1516  m_out->Print( aNestLevel, ")\n" );
1517 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const wxPoint & GetTextPos() const
Definition: eda_text.h:222
void formatLayer(const BOARD_ITEM *aItem) const
double GetTextAngle() const
Definition: eda_text.h:162
#define FMT_IU
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:128
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
#define FMT_ANGLE
timestamp_t GetTimeStamp() const
Definition: base_struct.h:215
void PCB_IO::format ( TEXTE_MODULE aText,
int  aNestLevel = 0 
) const
private

Definition at line 1520 of file kicad_plugin.cpp.

References CTL_OMIT_HIDE, FMT_ANGLE, FMT_IU, MODULE::GetOrientation(), BOARD_ITEM::GetParent(), TEXTE_MODULE::GetPos0(), EDA_TEXT::GetText(), EDA_TEXT::GetTextAngle(), TEXTE_MODULE::GetType(), TEXTE_MODULE::IsUnlocked(), EDA_TEXT::IsVisible(), NormalizeAngle360Min(), NormalizeAnglePos(), TEXTE_MODULE::TEXT_is_DIVERS, TEXTE_MODULE::TEXT_is_REFERENCE, and TEXTE_MODULE::TEXT_is_VALUE.

1521 {
1522  wxString type;
1523 
1524  switch( aText->GetType() )
1525  {
1526  case TEXTE_MODULE::TEXT_is_REFERENCE: type = "reference"; break;
1527  case TEXTE_MODULE::TEXT_is_VALUE: type = "value"; break;
1528  case TEXTE_MODULE::TEXT_is_DIVERS: type = "user";
1529  }
1530 
1531  m_out->Print( aNestLevel, "(fp_text %s %s (at %s",
1532  m_out->Quotew( type ).c_str(),
1533  m_out->Quotew( aText->GetText() ).c_str(),
1534  FMT_IU( aText->GetPos0() ).c_str() );
1535 
1536  // Due to Pcbnew history, fp_text angle is saved as an absolute on screen angle,
1537  // but internally the angle is held relative to its parent footprint. parent
1538  // may be NULL when saving a footprint outside a BOARD.
1539  double orient = aText->GetTextAngle();
1540  MODULE* parent = (MODULE*) aText->GetParent();
1541 
1542  if( parent )
1543  {
1544  // GetTextAngle() is always in -360..+360 range because of
1545  // TEXTE_MODULE::SetTextAngle(), but summing that angle with an
1546  // additional board angle could kick sum up >= 360 or <= -360, so to have
1547  // consistent results, normalize again for the BOARD save. A footprint
1548  // save does not use this code path since parent is NULL.
1549 #if 0
1550  // This one could be considered reasonable if you like positive angles
1551  // in your board text.
1552  orient = NormalizeAnglePos( orient + parent->GetOrientation() );
1553 #else
1554  // Choose compatibility for now, even though this is only a 720 degree clamp
1555  // with two possible values for every angle.
1556  orient = NormalizeAngle360Min( orient + parent->GetOrientation() );
1557 #endif
1558  }
1559 
1560  if( orient != 0.0 )
1561  m_out->Print( 0, " %s", FMT_ANGLE( orient ).c_str() );
1562 
1563  if( aText->IsUnlocked() )
1564  m_out->Print( 0, " unlocked" );
1565 
1566  m_out->Print( 0, ")" );
1567  formatLayer( aText );
1568 
1569  if( !aText->IsVisible() )
1570  m_out->Print( 0, " hide" );
1571 
1572  m_out->Print( 0, "\n" );
1573 
1574  aText->EDA_TEXT::Format( m_out, aNestLevel, m_ctl | CTL_OMIT_HIDE );
1575 
1576  m_out->Print( aNestLevel, ")\n" );
1577 }
BOARD_ITEM_CONTAINER * GetParent() const
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
TEXT_TYPE GetType() const
const wxPoint & GetPos0() const
void formatLayer(const BOARD_ITEM *aItem) const
double GetTextAngle() const
Definition: eda_text.h:162
#define FMT_IU
bool IsUnlocked()
double GetOrientation() const
Definition: class_module.h:187
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:128
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
bool IsVisible() const
Definition: eda_text.h:174
T NormalizeAnglePos(T Angle)
Normalize angle to be in the 0.0 .
Definition: trigo.h:233
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:222
#define CTL_OMIT_HIDE
Definition: eda_text.h:42
#define FMT_ANGLE
void PCB_IO::format ( TRACK aTrack,
int  aNestLevel = 0 
) const
private

Definition at line 1580 of file kicad_plugin.cpp.

References FMT_IU, Format(), VIA::GetDrill(), TRACK::GetEnd(), BOARD_ITEM::GetLayerName(), BOARD_CONNECTED_ITEM::GetNetCode(), BOARD_ITEM::GetParent(), VIA::GetSelectMenuText(), TRACK::GetStart(), EDA_ITEM::GetStatus(), EDA_ITEM::GetTimeStamp(), VIA::GetViaType(), TRACK::GetWidth(), VIA::LayerPair(), PCB_VIA_T, THROW_IO_ERROR, EDA_ITEM::Type(), UNDEFINED_DRILL_DIAMETER, VIA_BLIND_BURIED, VIA_MICROVIA, and VIA_THROUGH.

1581 {
1582  if( aTrack->Type() == PCB_VIA_T )
1583  {
1584  PCB_LAYER_ID layer1, layer2;
1585 
1586  const VIA* via = static_cast<const VIA*>( aTrack );
1587  BOARD* board = (BOARD*) via->GetParent();
1588 
1589  wxCHECK_RET( board != 0, wxT( "Via " ) + via->GetSelectMenuText() +
1590  wxT( " has no parent." ) );
1591 
1592  m_out->Print( aNestLevel, "(via" );
1593 
1594  via->LayerPair( &layer1, &layer2 );
1595 
1596  switch( via->GetViaType() )
1597  {
1598  case VIA_THROUGH: // Default shape not saved.
1599  break;
1600 
1601  case VIA_BLIND_BURIED:
1602  m_out->Print( 0, " blind" );
1603  break;
1604 
1605  case VIA_MICROVIA:
1606  m_out->Print( 0, " micro" );
1607  break;
1608 
1609  default:
1610  THROW_IO_ERROR( wxString::Format( _( "unknown via type %d" ), via->GetViaType() ) );
1611  }
1612 
1613  m_out->Print( 0, " (at %s) (size %s)",
1614  FMT_IU( aTrack->GetStart() ).c_str(),
1615  FMT_IU( aTrack->GetWidth() ).c_str() );
1616 
1617  if( via->GetDrill() != UNDEFINED_DRILL_DIAMETER )
1618  m_out->Print( 0, " (drill %s)", FMT_IU( via->GetDrill() ).c_str() );
1619 
1620  m_out->Print( 0, " (layers %s %s)",
1621  m_out->Quotew( m_board->GetLayerName( layer1 ) ).c_str(),
1622  m_out->Quotew( m_board->GetLayerName( layer2 ) ).c_str() );
1623  }
1624  else
1625  {
1626  m_out->Print( aNestLevel, "(segment (start %s) (end %s) (width %s)",
1627  FMT_IU( aTrack->GetStart() ).c_str(), FMT_IU( aTrack->GetEnd() ).c_str(),
1628  FMT_IU( aTrack->GetWidth() ).c_str() );
1629 
1630  m_out->Print( 0, " (layer %s)", m_out->Quotew( aTrack->GetLayerName() ).c_str() );
1631  }
1632 
1633  m_out->Print( 0, " (net %d)", m_mapping->Translate( aTrack->GetNetCode() ) );
1634 
1635  if( aTrack->GetTimeStamp() != 0 )
1636  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aTrack->GetTimeStamp() );
1637 
1638  if( aTrack->GetStatus() != 0 )
1639  m_out->Print( 0, " (status %X)", aTrack->GetStatus() );
1640 
1641  m_out->Print( 0, ")\n" );
1642 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:209
BOARD_ITEM_CONTAINER * GetParent() const
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
STATUS_FLAGS GetStatus() const
Definition: base_struct.h:261
int GetDrill() const
Function GetDrill returns the local drill setting for this VIA.
Definition: class_track.h:470
wxString GetLayerName() const
Function GetLayerName returns the name of the PCB layer on which the item resides.
const wxPoint & GetEnd() const
Definition: class_track.h:119
#define FMT_IU
PCB_LAYER_ID
A quick note on layer IDs:
VIATYPE_T GetViaType() const
Definition: class_track.h:455
int Translate(int aNetCode) const
Function Translate Translates net number according to the map prepared by Update() function...
const wxPoint & GetStart() const
Definition: class_track.h:122
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Function GetLayerName returns the name of a layer given by aLayer.
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
#define UNDEFINED_DRILL_DIAMETER
Definition: class_track.h:59
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes ...
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...
int GetNetCode() const
Function GetNetCode.
wxString GetSelectMenuText() const override
Function GetSelectMenuText returns the text to display to be used in the selection clarification cont...
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
Class BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:169
int GetWidth() const
Definition: class_track.h:116
BOARD * m_board
which BOARD, no ownership here
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:96
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
timestamp_t GetTimeStamp() const
Definition: base_struct.h:215
void PCB_IO::format ( ZONE_CONTAINER aZone,
int  aNestLevel = 0 
) const
private

Definition at line 1645 of file kicad_plugin.cpp.

References SHAPE_POLY_SET::CIterate(), ZONE_CONTAINER::DIAGONAL_EDGE, ZONE_CONTAINER::DIAGONAL_FULL, ZONE_CONTAINER::FillSegments(), FMT_IU, Format(), ZONE_CONTAINER::GetArcSegmentCount(), ZONE_CONTAINER::GetCornerRadius(), ZONE_CONTAINER::GetCornerSmoothingType(), ZONE_CONTAINER::GetDoNotAllowCopperPour(), ZONE_CONTAINER::GetDoNotAllowTracks(), ZONE_CONTAINER::GetDoNotAllowVias(), ZONE_CONTAINER::GetFilledPolysList(), ZONE_CONTAINER::GetFillMode(), ZONE_CONTAINER::GetHatchPitch(), ZONE_CONTAINER::GetHatchStyle(), ZONE_CONTAINER::GetIsKeepout(), ZONE_CONTAINER::GetLayerSet(), ZONE_CONTAINER::GetMinThickness(), BOARD_CONNECTED_ITEM::GetNetCode(), BOARD_CONNECTED_ITEM::GetNetname(), ZONE_CONTAINER::GetNumCorners(), ZONE_CONTAINER::GetPadConnection(), ZONE_CONTAINER::GetPriority(), ZONE_CONTAINER::GetThermalReliefCopperBridge(), ZONE_CONTAINER::GetThermalReliefGap(), EDA_ITEM::GetTimeStamp(), ZONE_CONTAINER::GetZoneClearance(), SHAPE_POLY_SET::IsEmpty(), ZONE_CONTAINER::IsFilled(), ZONE_CONTAINER::IterateWithHoles(), ZONE_CONTAINER::NO_HATCH, PAD_ZONE_CONN_FULL, PAD_ZONE_CONN_NONE, PAD_ZONE_CONN_THERMAL, PAD_ZONE_CONN_THT_THERMAL, ZONE_SETTINGS::SMOOTHING_CHAMFER, ZONE_SETTINGS::SMOOTHING_FILLET, ZONE_SETTINGS::SMOOTHING_NONE, and THROW_IO_ERROR.

1646 {
1647  // Save the NET info; For keepout zones, net code and net name are irrelevant
1648  // so be sure a dummy value is stored, just for ZONE_CONTAINER compatibility
1649  // (perhaps netcode and netname should be not stored)
1650  m_out->Print( aNestLevel, "(zone (net %d) (net_name %s)",
1651  aZone->GetIsKeepout() ? 0 : m_mapping->Translate( aZone->GetNetCode() ),
1652  m_out->Quotew( aZone->GetIsKeepout() ? wxT("") : aZone->GetNetname() ).c_str() );
1653 
1654  // If a zone exists on multiple layers, format accordingly
1655  if( aZone->GetLayerSet().count() > 1 )
1656  {
1657  formatLayers( aZone->GetLayerSet() );
1658  }
1659  else
1660  {
1661  formatLayer( aZone );
1662  }
1663 
1664  m_out->Print( 0, " (tstamp %lX)", (unsigned long) aZone->GetTimeStamp() );
1665 
1666  // Save the outline aux info
1667  std::string hatch;
1668 
1669  switch( aZone->GetHatchStyle() )
1670  {
1671  default:
1672  case ZONE_CONTAINER::NO_HATCH: hatch = "none"; break;
1673  case ZONE_CONTAINER::DIAGONAL_EDGE: hatch = "edge"; break;
1674  case ZONE_CONTAINER::DIAGONAL_FULL: hatch = "full"; break;
1675  }
1676 
1677  m_out->Print( 0, " (hatch %s %s)\n", hatch.c_str(),
1678  FMT_IU( aZone->GetHatchPitch() ).c_str() );
1679 
1680  if( aZone->GetPriority() > 0 )
1681  m_out->Print( aNestLevel+1, "(priority %d)\n", aZone->GetPriority() );
1682 
1683  m_out->Print( aNestLevel+1, "(connect_pads" );
1684 
1685  switch( aZone->GetPadConnection() )
1686  {
1687  default:
1688  case PAD_ZONE_CONN_THERMAL: // Default option not saved or loaded.
1689  break;
1690 
1692  m_out->Print( 0, " thru_hole_only" );
1693  break;
1694 
1695  case PAD_ZONE_CONN_FULL:
1696  m_out->Print( 0, " yes" );
1697  break;
1698 
1699  case PAD_ZONE_CONN_NONE:
1700  m_out->Print( 0, " no" );
1701  break;
1702  }
1703 
1704  m_out->Print( 0, " (clearance %s))\n",
1705  FMT_IU( aZone->GetZoneClearance() ).c_str() );
1706 
1707  m_out->Print( aNestLevel+1, "(min_thickness %s)\n",
1708  FMT_IU( aZone->GetMinThickness() ).c_str() );
1709 
1710  if( aZone->GetIsKeepout() )
1711  {
1712  m_out->Print( aNestLevel+1, "(keepout (tracks %s) (vias %s) (copperpour %s))\n",
1713  aZone->GetDoNotAllowTracks() ? "not_allowed" : "allowed",
1714  aZone->GetDoNotAllowVias() ? "not_allowed" : "allowed",
1715  aZone->GetDoNotAllowCopperPour() ? "not_allowed" : "allowed" );
1716  }
1717 
1718  m_out->Print( aNestLevel+1, "(fill" );
1719 
1720  // Default is not filled.
1721  if( aZone->IsFilled() )
1722  m_out->Print( 0, " yes" );
1723 
1724  // Default is polygon filled.
1725  if( aZone->GetFillMode() )
1726  m_out->Print( 0, " (mode segment)" );
1727 
1728  m_out->Print( 0, " (arc_segments %d) (thermal_gap %s) (thermal_bridge_width %s)",
1729  aZone->GetArcSegmentCount(),
1730  FMT_IU( aZone->GetThermalReliefGap() ).c_str(),
1731  FMT_IU( aZone->GetThermalReliefCopperBridge() ).c_str() );
1732 
1734  {
1735  m_out->Print( 0, " (smoothing" );
1736 
1737  switch( aZone->GetCornerSmoothingType() )
1738  {
1740  m_out->Print( 0, " chamfer" );
1741  break;
1742 
1744  m_out->Print( 0, " fillet" );
1745  break;
1746 
1747  default:
1748  THROW_IO_ERROR( wxString::Format( _( "unknown zone corner smoothing type %d" ),
1749  aZone->GetCornerSmoothingType() ) );
1750  }
1751  m_out->Print( 0, ")" );
1752 
1753  if( aZone->GetCornerRadius() != 0 )
1754  m_out->Print( 0, " (radius %s)",
1755  FMT_IU( aZone->GetCornerRadius() ).c_str() );
1756  }
1757 
1758  m_out->Print( 0, ")\n" );
1759 
1760  int newLine = 0;
1761 
1762  if( aZone->GetNumCorners() )
1763  {
1764  bool new_polygon = true;
1765  bool is_closed = false;
1766 
1767  for( auto iterator = aZone->IterateWithHoles(); iterator; iterator++ )
1768  {
1769  if( new_polygon )
1770  {
1771  newLine = 0;
1772  m_out->Print( aNestLevel+1, "(polygon\n" );
1773  m_out->Print( aNestLevel+2, "(pts\n" );
1774  new_polygon = false;
1775  is_closed = false;
1776  }
1777 
1778  if( newLine == 0 )
1779  m_out->Print( aNestLevel+3, "(xy %s %s)",
1780  FMT_IU( iterator->x ).c_str(), FMT_IU( iterator->y ).c_str() );
1781  else
1782  m_out->Print( 0, " (xy %s %s)",
1783  FMT_IU( iterator->x ).c_str(), FMT_IU( iterator->y ).c_str() );
1784 
1785  if( newLine < 4 )
1786  {
1787  newLine += 1;
1788  }
1789  else
1790  {
1791  newLine = 0;
1792  m_out->Print( 0, "\n" );
1793  }
1794 
1795  if( iterator.IsEndContour() )
1796  {
1797  is_closed = true;
1798 
1799  if( newLine != 0 )
1800  m_out->Print( 0, "\n" );
1801 
1802  m_out->Print( aNestLevel+2, ")\n" );
1803  m_out->Print( aNestLevel+1, ")\n" );
1804  new_polygon = true;
1805  }
1806  }
1807 
1808  if( !is_closed ) // Should not happen, but...
1809  m_out->Print( aNestLevel+1, ")\n" );
1810 
1811  }
1812 
1813  // Save the PolysList (filled areas)
1814  const SHAPE_POLY_SET& fv = aZone->GetFilledPolysList();
1815  newLine = 0;
1816 
1817  if( !fv.IsEmpty() )
1818  {
1819  bool new_polygon = true;
1820  bool is_closed = false;
1821 
1822  for( auto it = fv.CIterate(); it; ++it )
1823  {
1824  if( new_polygon )
1825  {
1826  newLine = 0;
1827  m_out->Print( aNestLevel+1, "(filled_polygon\n" );
1828  m_out->Print( aNestLevel+2, "(pts\n" );
1829  new_polygon = false;
1830  is_closed = false;
1831  }
1832 
1833  if( newLine == 0 )
1834  m_out->Print( aNestLevel+3, "(xy %s %s)",
1835  FMT_IU( it->x ).c_str(), FMT_IU( it->y ).c_str() );
1836  else
1837  m_out->Print( 0, " (xy %s %s)",
1838  FMT_IU( it->x ) .c_str(), FMT_IU( it->y ).c_str() );
1839 
1840  if( newLine < 4 )
1841  {
1842  newLine += 1;
1843  }
1844  else
1845  {
1846  newLine = 0;
1847  m_out->Print( 0, "\n" );
1848  }
1849 
1850  if( it.IsEndContour() )
1851  {
1852  is_closed = true;
1853 
1854  if( newLine != 0 )
1855  m_out->Print( 0, "\n" );
1856 
1857  m_out->Print( aNestLevel+2, ")\n" );
1858  m_out->Print( aNestLevel+1, ")\n" );
1859  new_polygon = true;
1860  }
1861  }
1862 
1863  if( !is_closed ) // Should not happen, but...
1864  m_out->Print( aNestLevel+1, ")\n" );
1865  }
1866 
1867  // Save the filling segments list
1868  const auto& segs = aZone->FillSegments();
1869 
1870  if( segs.size() )
1871  {
1872  m_out->Print( aNestLevel+1, "(fill_segments\n" );
1873 
1874  for( ZONE_SEGMENT_FILL::const_iterator it = segs.begin(); it != segs.end(); ++it )
1875  {
1876  m_out->Print( aNestLevel+2, "(pts (xy %s) (xy %s))\n",
1877  FMT_IU( wxPoint( it->A ) ).c_str(),
1878  FMT_IU( wxPoint( it->B ) ).c_str() );
1879  }
1880 
1881  m_out->Print( aNestLevel+1, ")\n" );
1882  }
1883 
1884  m_out->Print( aNestLevel, ")\n" );
1885 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
int GetNumCorners(void) const
Access to m_Poly parameters.
Definition: class_zone.h:414
int GetMinThickness() const
Definition: class_zone.h:198
bool GetDoNotAllowCopperPour() const
Definition: class_zone.h:603
int GetArcSegmentCount() const
Definition: class_zone.h:187
bool IsFilled() const
Definition: class_zone.h:189
CONST_ITERATOR CIterate(int aFirst, int aLast, bool aIterateHoles=false) const
ZONE_SEGMENT_FILL & FillSegments()
Definition: class_zone.h:233
void formatLayer(const BOARD_ITEM *aItem) const
int GetCornerSmoothingType() const
Definition: class_zone.h:570
int GetThermalReliefCopperBridge(D_PAD *aPad=NULL) const
Definition: class_zone.cpp:637
unsigned int GetCornerRadius() const
Definition: class_zone.h:574
Pads are not covered.
Definition: zones.h:57
bool GetIsKeepout() const
Accessors to parameters used in Keepout zones:
Definition: class_zone.h:602
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:230
#define FMT_IU
ZoneConnection GetPadConnection(D_PAD *aPad=NULL) const
Definition: class_zone.cpp:997
int Translate(int aNetCode) const
Function Translate Translates net number according to the map prepared by Update() function...
Class SHAPE_POLY_SET.
int GetThermalReliefGap(D_PAD *aPad=NULL) const
Definition: class_zone.cpp:628
ZONE_FILL_MODE GetFillMode() const
Definition: class_zone.h:175
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes ...
const SHAPE_POLY_SET & GetFilledPolysList() const
Function GetFilledPolysList returns a reference to the list of filled polygons.
Definition: class_zone.h:534
Thermal relief only for THT pads.
Definition: zones.h:60
int GetNetCode() const
Function GetNetCode.
bool GetDoNotAllowTracks() const
Definition: class_zone.h:605
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
bool GetDoNotAllowVias() const
Definition: class_zone.h:604
SHAPE_POLY_SET::ITERATOR IterateWithHoles()
Function IterateWithHoles returns an iterator to visit all points of the zone&#39;s main outline with hol...
Definition: class_zone.h:434
HATCH_STYLE GetHatchStyle() const
Definition: class_zone.h:498
void formatLayers(LSET aLayerMask, int aNestLevel=0) const
int GetHatchPitch() const
Hatch related methods.
bool IsEmpty() const
Returns true if the set is empty (no polygons at all)
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
unsigned GetPriority() const
Function GetPriority.
Definition: class_zone.h:101
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
Use thermal relief for pads.
Definition: zones.h:58
int GetZoneClearance() const
Definition: class_zone.h:192
timestamp_t GetTimeStamp() const
Definition: base_struct.h:215
pads are covered by copper
Definition: zones.h:59
void PCB_IO::formatBoardLayers ( BOARD aBoard,
int  aNestLevel = 0 
) const
protected

formats the board layer information

Definition at line 646 of file kicad_plugin.cpp.

References B_Adhes, B_CrtYd, B_Fab, B_Mask, B_Paste, B_SilkS, Cmts_User, cu, LSET::CuStack(), DIM, 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(), Margin, LSET::Seq(), and LAYER::ShowType().

Referenced by CLIPBOARD_IO::SaveSelection().

647 {
648  m_out->Print( aNestLevel, "(layers\n" );
649 
650  // Save only the used copper layers from front to back.
651  LSET visible_layers = aBoard->GetVisibleLayers();
652 
653  for( LSEQ cu = aBoard->GetEnabledLayers().CuStack(); cu; ++cu )
654  {
655  PCB_LAYER_ID layer = *cu;
656 
657  m_out->Print( aNestLevel+1, "(%d %s %s", layer,
658  m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str(),
659  LAYER::ShowType( aBoard->GetLayerType( layer ) ) );
660 
661  if( !visible_layers[layer] )
662  m_out->Print( 0, " hide" );
663 
664  m_out->Print( 0, ")\n" );
665  }
666 
667  // Save used non-copper layers in the order they are defined.
668  // desired sequence for non Cu BOARD layers.
669  static const PCB_LAYER_ID non_cu[] =
670  {
671  B_Adhes, // 32
672  F_Adhes,
673  B_Paste,
674  F_Paste,
675  B_SilkS,
676  F_SilkS,
677  B_Mask,
678  F_Mask,
679  Dwgs_User,
680  Cmts_User,
681  Eco1_User,
682  Eco2_User,
683  Edge_Cuts,
684  Margin,
685  B_CrtYd,
686  F_CrtYd,
687  B_Fab,
688  F_Fab
689  };
690 
691  for( LSEQ seq = aBoard->GetEnabledLayers().Seq( non_cu, DIM( non_cu ) ); seq; ++seq )
692  {
693  PCB_LAYER_ID layer = *seq;
694 
695  m_out->Print( aNestLevel+1, "(%d %s user", layer,
696  m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str() );
697 
698  if( !visible_layers[layer] )
699  m_out->Print( 0, " hide" );
700 
701  m_out->Print( 0, ")\n" );
702  }
703 
704  m_out->Print( aNestLevel, ")\n\n" );
705 }
#define DIM(x)
of elements in an array
Definition: macros.h:98
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:147
#define cu(a)
Definition: auxiliary.h:88
LSET GetEnabledLayers() const
Function GetEnabledLayers is a proxy function that calls the corresponding function in m_BoardSetting...
static const char * ShowType(LAYER_T aType)
Function ShowType converts a LAYER_T enum to a const char*.
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:364
PCB_LAYER_ID
A quick note on layer IDs:
Class LSET is a set of PCB_LAYER_IDs.
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Function GetLayerName returns the name of a layer given by aLayer.
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
Class LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
LSET GetVisibleLayers() const
Function GetVisibleLayers is a proxy function that calls the correspondent function in m_BoardSetting...
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
LAYER_T GetLayerType(PCB_LAYER_ID aLayer) const
Function GetLayerType returns the type of the copper layer given by aLayer.
void PCB_IO::formatGeneral ( BOARD aBoard,
int  aNestLevel = 0 
) const
protected

formats the General section of the file

Definition at line 624 of file kicad_plugin.cpp.

References BOARD::Drawings(), FMT_IU, TITLE_BLOCK::Format(), PAGE_INFO::Format(), BOARD_DESIGN_SETTINGS::GetBoardThickness(), DHEAD::GetCount(), BOARD::GetDesignSettings(), BOARD::GetNumSegmTrack(), BOARD::GetNumSegmZone(), BOARD::GetPageSettings(), BOARD::GetTitleBlock(), and BOARD::m_Modules.

625 {
626  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
627 
628  m_out->Print( 0, "\n" );
629  m_out->Print( aNestLevel, "(general\n" );
630  // Write Bounding box info
631  m_out->Print( aNestLevel+1, "(thickness %s)\n",
632  FMT_IU( dsnSettings.GetBoardThickness() ).c_str() );
633 
634  m_out->Print( aNestLevel+1, "(drawings %d)\n", aBoard->Drawings().Size() );
635  m_out->Print( aNestLevel+1, "(tracks %d)\n", aBoard->GetNumSegmTrack() );
636  m_out->Print( aNestLevel+1, "(zones %d)\n", aBoard->GetNumSegmZone() );
637  m_out->Print( aNestLevel+1, "(modules %d)\n", aBoard->m_Modules.GetCount() );
638  m_out->Print( aNestLevel+1, "(nets %d)\n", m_mapping->GetSize() );
639  m_out->Print( aNestLevel, ")\n\n" );
640 
641  aBoard->GetPageSettings().Format( m_out, aNestLevel, m_ctl );
642  aBoard->GetTitleBlock().Format( m_out, aNestLevel, m_ctl );
643 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
#define FMT_IU
int GetSize() const
Function GetSize.
Definition: netinfo.h:375
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:532
virtual void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Function Format outputs the object to aFormatter in s-expression form.
Definition: worksheet.cpp:246
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes ...
int GetNumSegmTrack() const
Functions to get some items count.
const PAGE_INFO & GetPageSettings() const
Definition: class_board.h:547
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
TITLE_BLOCK & GetTitleBlock()
Definition: class_board.h:553
DLIST< MODULE > m_Modules
Definition: class_board.h:245
int GetNumSegmZone() const
Calculate the zone segment count.
unsigned GetCount() const
Function GetCount returns the number of elements in the list.
Definition: dlist.h:126
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
DLIST_ITERATOR_WRAPPER< BOARD_ITEM > Drawings()
Definition: class_board.h:251
Class BOARD_DESIGN_SETTINGS contains design settings for a BOARD object.
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 738 of file kicad_plugin.cpp.

739 {
740  formatGeneral( aBoard, aNestLevel );
741  // Layers.
742  formatBoardLayers( aBoard, aNestLevel );
743  // Setup
744  formatSetup( aBoard, aNestLevel );
745  // Save net codes and names
746  formatNetInformation( aBoard, aNestLevel );
747 }
void formatGeneral(BOARD *aBoard, int aNestLevel=0) const
formats the General section of the file
void formatBoardLayers(BOARD *aBoard, int aNestLevel=0) const
formats the board layer information
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 PCB_IO::formatLayer ( const BOARD_ITEM aItem) const
private

Definition at line 493 of file kicad_plugin.cpp.

References CTL_STD_LAYER_NAMES, BOARD_ITEM::GetLayer(), BOARD_ITEM::GetLayerName(), BOARD::GetStandardLayerName(), and TO_UTF8.

494 {
495  if( m_ctl & CTL_STD_LAYER_NAMES )
496  {
497  PCB_LAYER_ID layer = aItem->GetLayer();
498 
499  // English layer names should never need quoting.
500  m_out->Print( 0, " (layer %s)", TO_UTF8( BOARD::GetStandardLayerName( layer ) ) );
501  }
502  else
503  m_out->Print( 0, " (layer %s)", m_out->Quotew( aItem->GetLayerName() ).c_str() );
504 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
virtual PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
wxString GetLayerName() const
Function GetLayerName returns the name of the PCB layer on which the item resides.
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes...
Definition: macros.h:47
PCB_LAYER_ID
A quick note on layer IDs:
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
#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
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:647
void PCB_IO::formatLayers ( LSET  aLayerMask,
int  aNestLevel = 0 
) const
private

Definition at line 1187 of file kicad_plugin.cpp.

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::GetStandardLayerName(), and PCB_LAYER_ID_COUNT.

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

formats the Nets and Netclasses

Definition at line 708 of file kicad_plugin.cpp.

References NETCLASSES::begin(), NETCLASSES::end(), filterNetClass(), NETCLASS::Format(), BOARD_DESIGN_SETTINGS::GetDefault(), BOARD::GetDesignSettings(), and BOARD_DESIGN_SETTINGS::m_NetClasses.

Referenced by CLIPBOARD_IO::SaveSelection().

709 {
710  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
711  for( NETINFO_MAPPING::iterator net = m_mapping->begin(), netEnd = m_mapping->end();
712  net != netEnd; ++net )
713  {
714  m_out->Print( aNestLevel, "(net %d %s)\n",
715  m_mapping->Translate( net->GetNet() ),
716  m_out->Quotew( net->GetNetname() ).c_str() );
717  }
718 
719  m_out->Print( 0, "\n" );
720 
721  // Save the default net class first.
722  NETCLASS defaultNC = *dsnSettings.GetDefault();
723  filterNetClass( *aBoard, defaultNC ); // Remove empty nets (from a copy of a netclass)
724  defaultNC.Format( m_out, aNestLevel, m_ctl );
725 
726  // Save the rest of the net classes alphabetically.
727  for( NETCLASSES::const_iterator it = dsnSettings.m_NetClasses.begin();
728  it != dsnSettings.m_NetClasses.end();
729  ++it )
730  {
731  NETCLASS netclass = *it->second;
732  filterNetClass( *aBoard, netclass ); // Remove empty nets (from a copy of a netclass)
733  netclass.Format( m_out, aNestLevel, m_ctl );
734  }
735 }
iterator begin() const
Function begin() Returns iterator to the first entry in the mapping.
Definition: netinfo.h:355
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
NETCLASSPTR GetDefault() const
Function GetDefault.
iterator end()
Definition: netclass.h:256
NETCLASS_MAP::const_iterator const_iterator
Definition: netclass.h:258
iterator end() const
Function end() Returns iterator to the last entry in the mapping.
Definition: netinfo.h:366
void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Function Format outputs the net class to aFormatter in s-expression form.
Definition: netclass.cpp:253
iterator begin()
Definition: netclass.h:255
int Translate(int aNetCode) const
Function Translate Translates net number according to the map prepared by Update() function...
Class NETCLASS handles a collection of nets and the parameters used to route or test these nets...
Definition: netclass.h:55
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:532
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
Wrapper class, so you can iterate through NETINFO_ITEM*s, not std::pair<int/wxString, NETINFO_ITEM*>
Definition: netinfo.h:305
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes ...
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
NETCLASSES m_NetClasses
List of current netclasses. There is always the default netclass.
Class BOARD_DESIGN_SETTINGS contains design settings for a BOARD object.
void PCB_IO::formatSetup ( BOARD aBoard,
int  aNestLevel = 0 
) const
protected

formats the board setup information

Definition at line 506 of file kicad_plugin.cpp.

References Double2Str(), FMT_IU, PCB_PLOT_PARAMS::Format(), BOARD::GetAuxOrigin(), BOARD_DESIGN_SETTINGS::GetCurrentTrackWidth(), BOARD_DESIGN_SETTINGS::GetDefault(), BOARD::GetDesignSettings(), D_PAD::GetDrillSize(), BOARD::GetGridOrigin(), BOARD::GetPlotOptions(), D_PAD::GetSize(), BOARD_DESIGN_SETTINGS::GetVisibleElements(), BOARD::GetZoneSettings(), BOARD_DESIGN_SETTINGS::m_BlindBuriedViaAllowed, BOARD_DESIGN_SETTINGS::m_DrawSegmentWidth, BOARD_DESIGN_SETTINGS::m_EdgeSegmentWidth, BOARD_DESIGN_SETTINGS::m_MicroViasAllowed, BOARD_DESIGN_SETTINGS::m_MicroViasMinDrill, BOARD_DESIGN_SETTINGS::m_MicroViasMinSize, BOARD_DESIGN_SETTINGS::m_ModuleSegmentWidth, BOARD_DESIGN_SETTINGS::m_ModuleTextSize, BOARD_DESIGN_SETTINGS::m_ModuleTextWidth, BOARD_DESIGN_SETTINGS::m_Pad_Master, BOARD_DESIGN_SETTINGS::m_PcbTextSize, BOARD_DESIGN_SETTINGS::m_PcbTextWidth, 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, wxPoint::x, and wxPoint::y.

507 {
508  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
509 
510  // Setup
511  m_out->Print( aNestLevel, "(setup\n" );
512 
513  // Save current default track width, for compatibility with older Pcbnew version;
514  m_out->Print( aNestLevel+1, "(last_trace_width %s)\n",
515  FMT_IU( dsnSettings.GetCurrentTrackWidth() ).c_str() );
516 
517  // Save custom tracks width list (the first is not saved here: this is the netclass value
518  for( unsigned ii = 1; ii < dsnSettings.m_TrackWidthList.size(); ii++ )
519  m_out->Print( aNestLevel+1, "(user_trace_width %s)\n",
520  FMT_IU( dsnSettings.m_TrackWidthList[ii] ).c_str() );
521 
522  m_out->Print( aNestLevel+1, "(trace_clearance %s)\n",
523  FMT_IU( dsnSettings.GetDefault()->GetClearance() ).c_str() );
524 
525  // ZONE_SETTINGS
526  m_out->Print( aNestLevel+1, "(zone_clearance %s)\n",
527  FMT_IU( aBoard->GetZoneSettings().m_ZoneClearance ).c_str() );
528  m_out->Print( aNestLevel+1, "(zone_45_only %s)\n",
529  aBoard->GetZoneSettings().m_Zone_45_Only ? "yes" : "no" );
530 
531  m_out->Print( aNestLevel+1, "(trace_min %s)\n",
532  FMT_IU( dsnSettings.m_TrackMinWidth ).c_str() );
533 
534  m_out->Print( aNestLevel+1, "(segment_width %s)\n",
535  FMT_IU( dsnSettings.m_DrawSegmentWidth ).c_str() );
536  m_out->Print( aNestLevel+1, "(edge_width %s)\n",
537  FMT_IU( dsnSettings.m_EdgeSegmentWidth ).c_str() );
538 
539  // Save current default via size, for compatibility with older Pcbnew version;
540  m_out->Print( aNestLevel+1, "(via_size %s)\n",
541  FMT_IU( dsnSettings.GetDefault()->GetViaDiameter() ).c_str() );
542  m_out->Print( aNestLevel+1, "(via_drill %s)\n",
543  FMT_IU( dsnSettings.GetDefault()->GetViaDrill() ).c_str() );
544  m_out->Print( aNestLevel+1, "(via_min_size %s)\n",
545  FMT_IU( dsnSettings.m_ViasMinSize ).c_str() );
546  m_out->Print( aNestLevel+1, "(via_min_drill %s)\n",
547  FMT_IU( dsnSettings.m_ViasMinDrill ).c_str() );
548 
549  // Save custom vias diameters list (the first is not saved here: this is
550  // the netclass value
551  for( unsigned ii = 1; ii < dsnSettings.m_ViasDimensionsList.size(); ii++ )
552  m_out->Print( aNestLevel+1, "(user_via %s %s)\n",
553  FMT_IU( dsnSettings.m_ViasDimensionsList[ii].m_Diameter ).c_str(),
554  FMT_IU( dsnSettings.m_ViasDimensionsList[ii].m_Drill ).c_str() );
555 
556  // for old versions compatibility:
557  if( dsnSettings.m_BlindBuriedViaAllowed )
558  m_out->Print( aNestLevel+1, "(blind_buried_vias_allowed yes)\n" );
559 
560  m_out->Print( aNestLevel+1, "(uvia_size %s)\n",
561  FMT_IU( dsnSettings.GetDefault()->GetuViaDiameter() ).c_str() );
562  m_out->Print( aNestLevel+1, "(uvia_drill %s)\n",
563  FMT_IU( dsnSettings.GetDefault()->GetuViaDrill() ).c_str() );
564  m_out->Print( aNestLevel+1, "(uvias_allowed %s)\n",
565  ( dsnSettings.m_MicroViasAllowed ) ? "yes" : "no" );
566  m_out->Print( aNestLevel+1, "(uvia_min_size %s)\n",
567  FMT_IU( dsnSettings.m_MicroViasMinSize ).c_str() );
568  m_out->Print( aNestLevel+1, "(uvia_min_drill %s)\n",
569  FMT_IU( dsnSettings.m_MicroViasMinDrill ).c_str() );
570 
571  m_out->Print( aNestLevel+1, "(pcb_text_width %s)\n",
572  FMT_IU( dsnSettings.m_PcbTextWidth ).c_str() );
573  m_out->Print( aNestLevel+1, "(pcb_text_size %s %s)\n",
574  FMT_IU( dsnSettings.m_PcbTextSize.x ).c_str(),
575  FMT_IU( dsnSettings.m_PcbTextSize.y ).c_str() );
576 
577  m_out->Print( aNestLevel+1, "(mod_edge_width %s)\n",
578  FMT_IU( dsnSettings.m_ModuleSegmentWidth ).c_str() );
579  m_out->Print( aNestLevel+1, "(mod_text_size %s %s)\n",
580  FMT_IU( dsnSettings.m_ModuleTextSize.x ).c_str(),
581  FMT_IU( dsnSettings.m_ModuleTextSize.y ).c_str() );
582  m_out->Print( aNestLevel+1, "(mod_text_width %s)\n",
583  FMT_IU( dsnSettings.m_ModuleTextWidth ).c_str() );
584 
585  m_out->Print( aNestLevel+1, "(pad_size %s %s)\n",
586  FMT_IU( dsnSettings.m_Pad_Master.GetSize().x ).c_str(),
587  FMT_IU( dsnSettings.m_Pad_Master.GetSize().y ).c_str() );
588  m_out->Print( aNestLevel+1, "(pad_drill %s)\n",
589  FMT_IU( dsnSettings.m_Pad_Master.GetDrillSize().x ).c_str() );
590 
591  m_out->Print( aNestLevel+1, "(pad_to_mask_clearance %s)\n",
592  FMT_IU( dsnSettings.m_SolderMaskMargin ).c_str() );
593 
594  if( dsnSettings.m_SolderMaskMinWidth )
595  m_out->Print( aNestLevel+1, "(solder_mask_min_width %s)\n",
596  FMT_IU( dsnSettings.m_SolderMaskMinWidth ).c_str() );
597 
598  if( dsnSettings.m_SolderPasteMargin != 0 )
599  m_out->Print( aNestLevel+1, "(pad_to_paste_clearance %s)\n",
600  FMT_IU( dsnSettings.m_SolderPasteMargin ).c_str() );
601 
602  if( dsnSettings.m_SolderPasteMarginRatio != 0 )
603  m_out->Print( aNestLevel+1, "(pad_to_paste_clearance_ratio %s)\n",
604  Double2Str( dsnSettings.m_SolderPasteMarginRatio ).c_str() );
605 
606  m_out->Print( aNestLevel+1, "(aux_axis_origin %s %s)\n",
607  FMT_IU( aBoard->GetAuxOrigin().x ).c_str(),
608  FMT_IU( aBoard->GetAuxOrigin().y ).c_str() );
609 
610  if( aBoard->GetGridOrigin().x || aBoard->GetGridOrigin().y )
611  m_out->Print( aNestLevel+1, "(grid_origin %s %s)\n",
612  FMT_IU( aBoard->GetGridOrigin().x ).c_str(),
613  FMT_IU( aBoard->GetGridOrigin().y ).c_str() );
614 
615  m_out->Print( aNestLevel+1, "(visible_elements %X)\n",
616  dsnSettings.GetVisibleElements() );
617 
618  aBoard->GetPlotOptions().Format( m_out, aNestLevel+1 );
619 
620  m_out->Print( aNestLevel, ")\n\n" );
621 }
int m_SolderMaskMargin
Solder mask margin.
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const ZONE_SETTINGS & GetZoneSettings() const
Definition: class_board.h:556
int GetVisibleElements() const
Function GetVisibleElements returns a bit-mask of all the element categories that are visible...
NETCLASSPTR GetDefault() const
Function GetDefault.
const wxPoint & GetGridOrigin() const
Definition: class_board.h:350
int m_SolderPasteMargin
Solder paste margin absolute value.
int m_ModuleTextWidth
Default footprint texts thickness.
std::vector< int > m_TrackWidthList
Track width list.
int m_ModuleSegmentWidth
Default width for all graphic lines.
int m_PcbTextWidth
current Pcb (not module) Text width
std::string Double2Str(double aValue)
Helper function Double2Str to print a float number without using scientific notation and no trailing ...
Definition: base_units.cpp:61
const wxSize & GetDrillSize() const
Definition: class_pad.h:275
wxSize m_ModuleTextSize
Default footprint texts size.
#define FMT_IU
wxSize m_PcbTextSize
current Pcb (not module) Text size
int m_TrackMinWidth
track min value for width ((min copper size value
int m_ViasMinSize
vias (not micro vias) min diameter
int m_DrawSegmentWidth
current graphic line width (not EDGE layer)
int m_ViasMinDrill
vias (not micro vias) min drill diameter
const PCB_PLOT_PARAMS & GetPlotOptions() const
Definition: class_board.h:550
const wxSize & GetSize() const
Definition: class_pad.h:269
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:532
int m_ZoneClearance
Clearance value.
Definition: zone_settings.h:63
bool m_BlindBuriedViaAllowed
true to allow blind/buried vias
int m_MicroViasMinSize
micro vias (not vias) min diameter
const wxPoint & GetAuxOrigin() const
Definition: class_board.h:343
D_PAD m_Pad_Master
A dummy pad to store all default parameters.
std::vector< VIA_DIMENSION > m_ViasDimensionsList
Vias size and drill list.
bool m_MicroViasAllowed
true to allow micro vias
int m_MicroViasMinDrill
micro vias (not vias) min drill diameter
void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControl=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
int m_EdgeSegmentWidth
current graphic line width (EDGE layer only)
double m_SolderPasteMarginRatio
Solder pask margin ratio value of pad size The final margin is the sum of these 2 values...
int GetCurrentTrackWidth() const
Function GetCurrentTrackWidth.
int m_SolderMaskMinWidth
Solder mask min width.
Class BOARD_DESIGN_SETTINGS contains design settings for a BOARD object.
const wxString PCB_IO::GetFileExtension ( ) const
inlineoverridevirtual

Function GetFileExtension returns the file extension for the PLUGIN.

Implements PLUGIN.

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

References CTL_FOR_BOARD, FootprintDelete(), FootprintEnumerate(), FootprintLibCreate(), FootprintLibDelete(), FootprintLoad(), FootprintSave(), Format(), GetLibraryTimestamp(), IsFootprintLibWritable(), Load(), LoadEnumeratedFootprint(), PCB_IO(), Save(), and ~PCB_IO().

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

References FP_CACHE::GetTimestamp(), FP_CACHE::IsPath(), and m_cache.

Referenced by GetFileExtension(), and GITHUB_PLUGIN::GetLibraryTimestamp().

2146 {
2147  // If we have no cache, return a number which won't match any stored timestamps
2148  if( !m_cache || !m_cache->IsPath( aLibraryPath ) )
2149  return wxDateTime::Now().GetValue().GetValue();
2150 
2151  return m_cache->GetTimestamp();
2152 }
FP_CACHE * m_cache
Footprint library cache.
long long GetTimestamp()
Function GetTimestamp Generate a timestamp representing all source files in the cache (including the ...
bool IsPath(const wxString &aPath) const
Function IsPath checks if aPath is the same as the current cache path.
std::string PCB_IO::GetStringOutput ( bool  doClear)
inline

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

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

Referenced by FOOTPRINT_EDIT_FRAME::Export_Module().

161  {
162  std::string ret = m_sf.GetString();
163  if( doClear )
164  m_sf.Clear();
165 
166  return ret;
167  }
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
void PCB_IO::init ( const PROPERTIES aProperties)
protected

Definition at line 1951 of file kicad_plugin.cpp.

References m_board, m_loading_format_version, m_props, m_reader, and SEXPR_BOARD_FILE_VERSION.

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

1952 {
1953  m_board = NULL;
1954  m_reader = NULL;
1956  m_props = aProperties;
1957 }
LINE_READER * m_reader
no ownership here.
const PROPERTIES * m_props
passed via Save() or Load(), no ownership, may be NULL.
#define SEXPR_BOARD_FILE_VERSION
Current s-expression file format version. 2 was the last legacy format version.
int m_loading_format_version
which SEXPR_BOARD_FILE_VERSION should be Load()ed?
BOARD * m_board
which BOARD, no ownership here
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 2250 of file kicad_plugin.cpp.

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

Referenced by GetFileExtension(), and GITHUB_PLUGIN::IsFootprintLibWritable().

2251 {
2252  LOCALE_IO toggle;
2253 
2254  init( NULL );
2255 
2256  validateCache( aLibraryPath );
2257 
2258  return m_cache->IsWritable();
2259 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
bool IsWritable() const
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 1907 of file kicad_plugin.cpp.

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.

Referenced by GetFileExtension().

1908 {
1909  FILE_LINE_READER reader( aFileName );
1910 
1911  init( aProperties );
1912 
1913  m_parser->SetLineReader( &reader );
1914  m_parser->SetBoard( aAppendToMe );
1915 
1916  BOARD* board;
1917 
1918  try
1919  {
1920  board = dynamic_cast<BOARD*>( m_parser->Parse() );
1921  }
1922  catch( const FUTURE_FORMAT_ERROR& )
1923  {
1924  // Don't wrap a FUTURE_FORMAT_ERROR in another
1925  throw;
1926  }
1927  catch( const PARSE_ERROR& parse_error )
1928  {
1929  if( m_parser->IsTooRecent() )
1930  throw FUTURE_FORMAT_ERROR( parse_error, m_parser->GetRequiredVersion() );
1931  else
1932  throw;
1933  }
1934 
1935  if( !board )
1936  {
1937  // The parser loaded something that was valid, but wasn't a board.
1938  THROW_PARSE_ERROR( _( "this file does not contain a PCB" ),
1939  m_parser->CurSource(), m_parser->CurLine(),
1940  m_parser->CurLineNumber(), m_parser->CurOffset() );
1941  }
1942 
1943  // Give the filename to the board if it's new
1944  if( !aAppendToMe )
1945  board->SetFileName( aFileName );
1946 
1947  return board;
1948 }
void init(const PROPERTIES *aProperties)
Class FILE_LINE_READER is a LINE_READER that reads from an open file.
Definition: richio.h:180
wxString GetRequiredVersion()
Return a string representing the version of kicad required to open this file.
Definition: pcb_parser.cpp:182
#define THROW_PARSE_ERROR(aProblem, aSource, aInputLine, aLineNumber, aByteIndex)
Definition: ki_exception.h:133
void SetBoard(BOARD *aBoard)
Definition: pcb_parser.h:296
void SetFileName(const wxString &aFileName)
Definition: class_board.h:232
PCB_PARSER * m_parser
BOARD_ITEM * Parse()
Definition: pcb_parser.cpp:442
LINE_READER * SetLineReader(LINE_READER *aReader)
Function SetLineReader sets aLineReader into the parser, and returns the previous one...
Definition: pcb_parser.h:289
bool IsTooRecent()
Return whether a version number, if any was parsed, was too recent.
Definition: pcb_parser.h:314
Struct PARSE_ERROR contains a filename or source description, a problem input line, a line number, a byte offset, and an error message which contains the the caller&#39;s report and his call site information: CPP source file, function, and line number.
Definition: ki_exception.h:94
Class BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:169
Struct FUTURE_FORMAT_ERROR variant of PARSE_ERROR indicating that a syntax or related error was likel...
Definition: ki_exception.h:143
MODULE * PCB_IO::LoadEnumeratedFootprint ( const wxString &  aLibraryPath,
const wxString &  aFootprintName,
const PROPERTIES aProperties = NULL 
)
overridevirtual

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

Reimplemented from PLUGIN.

Definition at line 2039 of file kicad_plugin.cpp.

References doLoadFootprint().

Referenced by GetFileExtension().

2042 {
2043  return doLoadFootprint( aLibraryPath, aFootprintName, aProperties, false );
2044 }
MODULE * doLoadFootprint(const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties, bool checkModified)
BOARD_ITEM * PCB_IO::Parse ( const wxString &  aClipboardSourceInput)

Definition at line 414 of file kicad_plugin.cpp.

References TO_UTF8.

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

415 {
416  std::string input = TO_UTF8( aClipboardSourceInput );
417 
418  STRING_LINE_READER reader( input, wxT( "clipboard" ) );
419 
420  m_parser->SetLineReader( &reader );
421 
422  try
423  {
424  return m_parser->Parse();
425  }
426  catch( const PARSE_ERROR& parse_error )
427  {
428  if( m_parser->IsTooRecent() )
429  throw FUTURE_FORMAT_ERROR( parse_error, m_parser->GetRequiredVersion() );
430  else
431  throw;
432  }
433 }
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes...
Definition: macros.h:47
wxString GetRequiredVersion()
Return a string representing the version of kicad required to open this file.
Definition: pcb_parser.cpp:182
PCB_PARSER * m_parser
BOARD_ITEM * Parse()
Definition: pcb_parser.cpp:442
LINE_READER * SetLineReader(LINE_READER *aReader)
Function SetLineReader sets aLineReader into the parser, and returns the previous one...
Definition: pcb_parser.h:289
bool IsTooRecent()
Return whether a version number, if any was parsed, was too recent.
Definition: pcb_parser.h:314
Struct PARSE_ERROR contains a filename or source description, a problem input line, a line number, a byte offset, and an error message which contains the the caller&#39;s report and his call site information: CPP source file, function, and line number.
Definition: ki_exception.h:94
Struct FUTURE_FORMAT_ERROR variant of PARSE_ERROR indicating that a syntax or related error was likel...
Definition: ki_exception.h:143
Class STRING_LINE_READER is a LINE_READER that reads from a multiline 8 bit wide std::string.
Definition: richio.h:254
const wxString PCB_IO::PluginName ( ) const
inlineoverridevirtual

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

Implements PLUGIN.

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

102  {
103  return wxT( "KiCad" );
104  }
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 69 of file plugin.cpp.

Referenced by FP_LIB_TABLE::PrefetchLib().

70 {
71  (void) aLibraryPath;
72  (void) aProperties;
73 }
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 390 of file kicad_plugin.cpp.

References Format(), GetBuildVersion(), OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), and SEXPR_BOARD_FILE_VERSION.

Referenced by GetFileExtension().

391 {
392  LOCALE_IO toggle; // toggles on, then off, the C locale.
393 
394  init( aProperties );
395 
396  m_board = aBoard; // after init()
397 
398  // Prepare net mapping that assures that net codes saved in a file are consecutive integers
399  m_mapping->SetBoard( aBoard );
400 
401  FILE_OUTPUTFORMATTER formatter( aFileName );
402 
403  m_out = &formatter; // no ownership
404 
405  m_out->Print( 0, "(kicad_pcb (version %d) (host pcbnew %s)\n", SEXPR_BOARD_FILE_VERSION,
406  formatter.Quotew( GetBuildVersion() ).c_str() );
407 
408  Format( aBoard, 1 );
409 
410  m_out->Print( 0, ")\n" );
411 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
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:281
wxString GetBuildVersion()
Function GetBuildVersion Return the build version string.
void Format(BOARD_ITEM *aItem, int aNestLevel=0) const
Function Format outputs aItem to aFormatter in s-expression format.
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes ...
BOARD * m_board
which BOARD, no ownership here
Class FILE_OUTPUTFORMATTER may be used for text file output.
Definition: richio.h:492
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
void PCB_IO::SetOutputFormatter ( OUTPUTFORMATTER aFormatter)
inline

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

References m_out, and Parse().

169 { m_out = aFormatter; }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
void PCB_IO::validateCache ( const wxString &  aLibraryPath,
bool  checkModified = true 
)
protected

Definition at line 1960 of file kicad_plugin.cpp.

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

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

1961 {
1962  if( !m_cache || !m_cache->IsPath( aLibraryPath ) || ( checkModified && m_cache->IsModified() ) )
1963  {
1964  // a spectacular episode in memory management:
1965  delete m_cache;
1966  m_cache = new FP_CACHE( this, aLibraryPath );
1967  m_cache->Load();
1968  }
1969 }
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()

Friends And Related Function Documentation

friend class FP_CACHE
friend

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

Referenced by FootprintLibCreate(), and validateCache().

Member Data Documentation

BOARD* PCB_IO::m_board
protected

which BOARD, no ownership here

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

Referenced by init(), CLIPBOARD_IO::Save(), CLIPBOARD_IO::SaveSelection(), and CLIPBOARD_IO::SetBoard().

int PCB_IO::m_ctl
protected

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

Referenced by FootprintSave().

wxString PCB_IO::m_error
protected

for throwing exceptions

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

wxString PCB_IO::m_filename
protected

for saves only, name is in m_reader for loads

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

int PCB_IO::m_loading_format_version
protected

which SEXPR_BOARD_FILE_VERSION should be Load()ed?

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

Referenced by init().

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

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

OUTPUTFORMATTER* PCB_IO::m_out
protected

output any Format()s to this, no ownership

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

Referenced by CLIPBOARD_IO::CLIPBOARD_IO(), PCB_IO(), CLIPBOARD_IO::Save(), and SetOutputFormatter().

PCB_PARSER* PCB_IO::m_parser
protected

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

Referenced by GITHUB_PLUGIN::FootprintLoad(), Load(), and ~PCB_IO().

const PROPERTIES* PCB_IO::m_props
protected

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

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

Referenced by init().

LINE_READER* PCB_IO::m_reader
protected

no ownership here.

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

Referenced by init().

STRING_FORMATTER PCB_IO::m_sf
protected

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

Referenced by GetStringOutput(), and PCB_IO().


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