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 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...
 
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...
 
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...
 
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 cacheLib (const wxString &aLibraryPath, const wxString &aFootprintName=wxEmptyString)
 we only cache one footprint library, this determines which one. More...
 
void init (const PROPERTIES *aProperties)
 

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

Constructor & Destructor Documentation

PCB_IO::PCB_IO ( int  aControlFlags = CTL_FOR_BOARD)

Definition at line 1735 of file kicad_plugin.cpp.

References init(), m_out, and m_sf.

1735  :
1736  m_cache( 0 ),
1737  m_ctl( aControlFlags ),
1738  m_parser( new PCB_PARSER() ),
1739  m_mapping( new NETINFO_MAPPING() )
1740 {
1741  init( 0 );
1742  m_out = &m_sf;
1743 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
FP_CACHE * m_cache
Footprint library cache.
Class PCB_PARSER reads a Pcbnew s-expression formatted LINE_READER object and returns the appropriate...
Definition: pcb_parser.h:66
void init(const PROPERTIES *aProperties)
PCB_PARSER * m_parser
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes ...
STRING_FORMATTER m_sf
PCB_IO::~PCB_IO ( )

Definition at line 1746 of file kicad_plugin.cpp.

References m_cache, m_mapping, and m_parser.

1747 {
1748  delete m_cache;
1749  delete m_parser;
1750  delete m_mapping;
1751 }
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

void PCB_IO::cacheLib ( const wxString &  aLibraryPath,
const wxString &  aFootprintName = wxEmptyString 
)
protected

we only cache one footprint library, this determines which one.

Definition at line 1807 of file kicad_plugin.cpp.

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

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

1808 {
1809  if( !m_cache || m_cache->IsModified( aLibraryPath, aFootprintName ) )
1810  {
1811  // a spectacular episode in memory management:
1812  delete m_cache;
1813  m_cache = new FP_CACHE( this, aLibraryPath );
1814  m_cache->Load();
1815  }
1816 }
friend class FP_CACHE
FP_CACHE * m_cache
Footprint library cache.
bool IsModified(const wxString &aLibPath, const wxString &aFootprintName=wxEmptyString) const
Function IsModified check if the footprint cache has been modified relative to aLibPath and aFootprin...
void Load()
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 1954 of file kicad_plugin.cpp.

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

Referenced by GITHUB_PLUGIN::FootprintDelete().

1955 {
1956  LOCALE_IO toggle; // toggles on, then off, the C locale.
1957 
1958  init( aProperties );
1959 
1960  cacheLib( aLibraryPath );
1961 
1962  if( !m_cache->IsWritable() )
1963  {
1964  THROW_IO_ERROR( wxString::Format( _( "Library '%s' is read only" ),
1965  aLibraryPath.GetData() ) );
1966  }
1967 
1968  m_cache->Remove( aFootprintName );
1969 }
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)
#define THROW_IO_ERROR(x)
Definition: utf8.cpp:60
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
void cacheLib(const wxString &aLibraryPath, const wxString &aFootprintName=wxEmptyString)
we only cache one footprint library, this determines which one.
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 1819 of file kicad_plugin.cpp.

References cacheLib(), Format(), FROM_UTF8(), GetChars(), FP_CACHE::GetModules(), init(), m_cache, THROW_IO_ERROR, and IO_ERROR::What().

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

1822 {
1823  LOCALE_IO toggle; // toggles on, then off, the C locale.
1824  wxDir dir( aLibraryPath );
1825 
1826  if( !dir.IsOpened() )
1827  {
1828  THROW_IO_ERROR( wxString::Format( _( "footprint library path '%s' does not exist" ),
1829  GetChars( aLibraryPath ) ) );
1830  }
1831 
1832  init( aProperties );
1833 
1834  wxString errorMsg;
1835 
1836  // Some of the files may have been parsed correctly so we want to add the valid files to
1837  // the library.
1838  try
1839  {
1840  cacheLib( aLibraryPath );
1841  }
1842  catch( const IO_ERROR& ioe )
1843  {
1844  errorMsg = ioe.What();
1845  }
1846 
1847  const MODULE_MAP& mods = m_cache->GetModules();
1848 
1849  for( MODULE_CITER it = mods.begin(); it != mods.end(); ++it )
1850  {
1851  aFootprintNames.Add( FROM_UTF8( it->first.c_str() ) );
1852  }
1853 
1854  if( !errorMsg.IsEmpty() )
1855  THROW_IO_ERROR( errorMsg );
1856 }
static wxString FROM_UTF8(const char *cstring)
function FROM_UTF8 converts a UTF8 encoded C string to a wxString for all wxWidgets build modes...
Definition: macros.h:53
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)
std::map< std::string, MODULE * > MODULE_MAP
Definition: eagle_plugin.h:36
#define THROW_IO_ERROR(x)
Definition: utf8.cpp:60
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:33
MODULE_MAP::const_iterator MODULE_CITER
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
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
void cacheLib(const wxString &aLibraryPath, const wxString &aFootprintName=wxEmptyString)
we only cache one footprint library, this determines which one.
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 1972 of file kicad_plugin.cpp.

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

Referenced by GITHUB_PLUGIN::FootprintLibCreate().

1973 {
1974  if( wxDir::Exists( aLibraryPath ) )
1975  {
1976  THROW_IO_ERROR( wxString::Format( _( "cannot overwrite library path '%s'" ),
1977  aLibraryPath.GetData() ) );
1978  }
1979 
1980  LOCALE_IO toggle;
1981 
1982  init( aProperties );
1983 
1984  delete m_cache;
1985  m_cache = new FP_CACHE( this, aLibraryPath );
1986  m_cache->Save();
1987 }
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)
#define THROW_IO_ERROR(x)
Definition: utf8.cpp:60
void Save()
save the entire legacy library to m_lib_name;
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 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 1990 of file kicad_plugin.cpp.

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

Referenced by GITHUB_PLUGIN::FootprintLibDelete().

1991 {
1992  wxFileName fn;
1993  fn.SetPath( aLibraryPath );
1994 
1995  // Return if there is no library path to delete.
1996  if( !fn.DirExists() )
1997  return false;
1998 
1999  if( !fn.IsDirWritable() )
2000  {
2001  THROW_IO_ERROR( wxString::Format( _( "user does not have permission to delete directory '%s'" ),
2002  aLibraryPath.GetData() ) );
2003  }
2004 
2005  wxDir dir( aLibraryPath );
2006 
2007  if( dir.HasSubDirs() )
2008  {
2009  THROW_IO_ERROR( wxString::Format( _( "library directory '%s' has unexpected sub-directories" ),
2010  aLibraryPath.GetData() ) );
2011  }
2012 
2013  // All the footprint files must be deleted before the directory can be deleted.
2014  if( dir.HasFiles() )
2015  {
2016  unsigned i;
2017  wxFileName tmp;
2018  wxArrayString files;
2019 
2020  wxDir::GetAllFiles( aLibraryPath, &files );
2021 
2022  for( i = 0; i < files.GetCount(); i++ )
2023  {
2024  tmp = files[i];
2025 
2026  if( tmp.GetExt() != KiCadFootprintFileExtension )
2027  {
2028  THROW_IO_ERROR( wxString::Format( _( "unexpected file '%s' was found in library path '%s'" ),
2029  files[i].GetData(), aLibraryPath.GetData() ) );
2030  }
2031  }
2032 
2033  for( i = 0; i < files.GetCount(); i++ )
2034  {
2035  wxRemoveFile( files[i] );
2036  }
2037  }
2038 
2039  wxLogTrace( traceFootprintLibrary, wxT( "Removing footprint library '%s'" ),
2040  aLibraryPath.GetData() );
2041 
2042  // Some of the more elaborate wxRemoveFile() crap puts up its own wxLog dialog
2043  // we don't want that. we want bare metal portability with no UI here.
2044  if( !wxRmdir( aLibraryPath ) )
2045  {
2046  THROW_IO_ERROR( wxString::Format( _( "footprint library '%s' cannot be deleted" ),
2047  aLibraryPath.GetData() ) );
2048  }
2049 
2050  // For some reason removing a directory in Windows is not immediately updated. This delay
2051  // prevents an error when attempting to immediately recreate the same directory when over
2052  // writing an existing library.
2053 #ifdef __WINDOWS__
2054  wxMilliSleep( 250L );
2055 #endif
2056 
2057  if( m_cache && !m_cache->IsPath( aLibraryPath ) )
2058  {
2059  delete m_cache;
2060  m_cache = NULL;
2061  }
2062 
2063  return true;
2064 }
const wxString KiCadFootprintFileExtension
FP_CACHE * m_cache
Footprint library cache.
bool IsPath(const wxString &aPath) const
Function IsPath checks if aPath is the same as the current cache path.
static const wxString traceFootprintLibrary(wxT("KicadFootprintLib"))
Definition for enabling and disabling footprint library trace output.
#define THROW_IO_ERROR(x)
Definition: utf8.cpp:60
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
void 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 122 of file plugin.cpp.

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

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

References cacheLib(), FP_CACHE::GetModules(), init(), m_cache, and TO_UTF8.

Referenced by GITHUB_PLUGIN::FootprintLoad().

1861 {
1862  LOCALE_IO toggle; // toggles on, then off, the C locale.
1863 
1864  init( aProperties );
1865 
1866  cacheLib( aLibraryPath, aFootprintName );
1867 
1868  const MODULE_MAP& mods = m_cache->GetModules();
1869 
1870  MODULE_CITER it = mods.find( TO_UTF8( aFootprintName ) );
1871 
1872  if( it == mods.end() )
1873  {
1874  return NULL;
1875  }
1876 
1877  // copy constructor to clone the already loaded MODULE
1878  return new MODULE( *it->second->GetModule() );
1879 }
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)
#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
std::map< std::string, MODULE * > MODULE_MAP
Definition: eagle_plugin.h:36
MODULE_MAP::const_iterator MODULE_CITER
void cacheLib(const wxString &aLibraryPath, const wxString &aFootprintName=wxEmptyString)
we only cache one footprint library, this determines which one.
MODULE_MAP & GetModules()
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 1882 of file kicad_plugin.cpp.

References cacheLib(), CTL_FOR_LIBRARY, F_Cu, MODULE::Flip(), Format(), FROM_UTF8(), GetChars(), MODULE::GetFPID(), BOARD_ITEM::GetLayer(), LIB_ID::GetLibItemName(), FP_CACHE::GetModules(), MODULE::GetPosition(), init(), FP_CACHE::IsWritable(), KiCadFootprintFileExtension, m_cache, m_ctl, FP_CACHE::Save(), MODULE::SetOrientation(), EDA_ITEM::SetParent(), EDA_ITEM::SetTimeStamp(), THROW_IO_ERROR, and traceFootprintLibrary().

Referenced by GITHUB_PLUGIN::FootprintSave().

1884 {
1885  LOCALE_IO toggle; // toggles on, then off, the C locale.
1886 
1887  init( aProperties );
1888 
1889  // In this public PLUGIN API function, we can safely assume it was
1890  // called for saving into a library path.
1892 
1893  cacheLib( aLibraryPath );
1894 
1895  if( !m_cache->IsWritable() )
1896  {
1897  wxString msg = wxString::Format(
1898  _( "Library '%s' is read only" ),
1899  GetChars( aLibraryPath )
1900  );
1901 
1902  THROW_IO_ERROR( msg );
1903  }
1904 
1905  std::string footprintName = aFootprint->GetFPID().GetLibItemName();
1906 
1907  MODULE_MAP& mods = m_cache->GetModules();
1908 
1909  // Quietly overwrite module and delete module file from path for any by same name.
1910  wxFileName fn( aLibraryPath, FROM_UTF8( aFootprint->GetFPID().GetLibItemName() ),
1912 
1913  if( !fn.IsOk() )
1914  {
1915  THROW_IO_ERROR( wxString::Format( _( "Footprint file name '%s' is not valid." ),
1916  GetChars( fn.GetFullPath() ) ) );
1917  }
1918 
1919  if( fn.FileExists() && !fn.IsFileWritable() )
1920  {
1921  THROW_IO_ERROR( wxString::Format( _( "user does not have write permission to delete file '%s' " ),
1922  GetChars( fn.GetFullPath() ) ) );
1923  }
1924 
1925  MODULE_CITER it = mods.find( footprintName );
1926 
1927  if( it != mods.end() )
1928  {
1929  wxLogTrace( traceFootprintLibrary, wxT( "Removing footprint library file '%s'." ),
1930  fn.GetFullPath().GetData() );
1931  mods.erase( footprintName );
1932  wxRemoveFile( fn.GetFullPath() );
1933  }
1934 
1935  // I need my own copy for the cache
1936  MODULE* module = new MODULE( *aFootprint );
1937 
1938  // and it's time stamp must be 0, it should have no parent, orientation should
1939  // be zero, and it should be on the front layer.
1940  module->SetTimeStamp( 0 );
1941  module->SetParent( 0 );
1942  module->SetOrientation( 0 );
1943 
1944  if( module->GetLayer() != F_Cu )
1945  module->Flip( module->GetPosition() );
1946 
1947  wxLogTrace( traceFootprintLibrary, wxT( "Creating s-expression footprint file: %s." ),
1948  fn.GetFullPath().GetData() );
1949  mods.insert( footprintName, new FP_CACHE_ITEM( module, fn ) );
1950  m_cache->Save();
1951 }
const wxString KiCadFootprintFileExtension
static wxString FROM_UTF8(const char *cstring)
function FROM_UTF8 converts a UTF8 encoded C string to a wxString for all wxWidgets build modes...
Definition: macros.h:53
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 Flip(const wxPoint &aCentre) override
Function Flip Flip this object, i.e.
void init(const PROPERTIES *aProperties)
const wxPoint & GetPosition() const override
Definition: class_module.h:155
void SetTimeStamp(time_t aNewTimeStamp)
Definition: base_struct.h:203
const LIB_ID & GetFPID() const
Definition: class_module.h:164
void SetParent(EDA_ITEM *aParent)
Definition: base_struct.h:213
const UTF8 & GetLibItemName() const
Function GetLibItemName.
Definition: lib_id.h:129
static const wxString traceFootprintLibrary(wxT("KicadFootprintLib"))
Definition for enabling and disabling footprint library trace output.
std::map< std::string, MODULE * > MODULE_MAP
Definition: eagle_plugin.h:36
#define THROW_IO_ERROR(x)
Definition: utf8.cpp:60
Class FP_CACHE_ITEM is helper class for creating a footprint library cache.
bool IsWritable() const
PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
MODULE_MAP::const_iterator MODULE_CITER
#define CTL_FOR_LIBRARY
Format output for a footprint library instead of clipboard or BOARD.
void Save()
save the entire legacy library to m_lib_name;
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
void SetOrientation(double newangle)
void cacheLib(const wxString &aLibraryPath, const wxString &aFootprintName=wxEmptyString)
we only cache one footprint library, this determines which one.
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 459 of file kicad_plugin.cpp.

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

Referenced by MODULE_EDITOR_TOOLS::CopyItems(), FOOTPRINT_EDIT_FRAME::Export_Module(), format(), FOOTPRINT_EDIT_FRAME::retainLastFootprint(), Save(), and FP_CACHE::Save().

460 {
461  LOCALE_IO toggle; // public API function, perform anything convenient for caller
462 
463  switch( aItem->Type() )
464  {
465  case PCB_T:
466  format( static_cast<BOARD*>( aItem ), aNestLevel );
467  break;
468 
469  case PCB_DIMENSION_T:
470  format( static_cast<DIMENSION*>( aItem ), aNestLevel );
471  break;
472 
473  case PCB_LINE_T:
474  format( static_cast<DRAWSEGMENT*>( aItem ), aNestLevel );
475  break;
476 
477  case PCB_MODULE_EDGE_T:
478  format( static_cast<EDGE_MODULE*>( aItem ), aNestLevel );
479  break;
480 
481  case PCB_TARGET_T:
482  format( static_cast<PCB_TARGET*>( aItem ), aNestLevel );
483  break;
484 
485  case PCB_MODULE_T:
486  format( static_cast<MODULE*>( aItem ), aNestLevel );
487  break;
488 
489  case PCB_PAD_T:
490  format( static_cast<D_PAD*>( aItem ), aNestLevel );
491  break;
492 
493  case PCB_TEXT_T:
494  format( static_cast<TEXTE_PCB*>( aItem ), aNestLevel );
495  break;
496 
497  case PCB_MODULE_TEXT_T:
498  format( static_cast<TEXTE_MODULE*>( aItem ), aNestLevel );
499  break;
500 
501  case PCB_TRACE_T:
502  case PCB_VIA_T:
503  format( static_cast<TRACK*>( aItem ), aNestLevel );
504  break;
505 
506  case PCB_ZONE_AREA_T:
507  format( static_cast<ZONE_CONTAINER*>( aItem ), aNestLevel );
508  break;
509 
510  default:
511  wxFAIL_MSG( wxT( "Cannot format item " ) + aItem->GetClass() );
512  }
513 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:198
Definition: typeinfo.h:97
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:114
class TEXTE_PCB, text on a layer
Definition: typeinfo.h:104
class D_PAD, a pad in a footprint
Definition: typeinfo.h:102
class EDGE_MODULE, a footprint edge
Definition: typeinfo.h:106
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:107
class MODULE, a footprint
Definition: typeinfo.h:101
class DIMENSION, a dimension (graphic item)
Definition: typeinfo.h:112
class PCB_TARGET, a target (graphic item)
Definition: typeinfo.h:113
class TEXTE_MODULE, text in a footprint
Definition: typeinfo.h:105
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:108
class DRAWSEGMENT, a segment not on copper layers
Definition: typeinfo.h:103
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 530 of file kicad_plugin.cpp.

References B_Adhes, B_CrtYd, B_Fab, B_Mask, B_Paste, B_SilkS, NETCLASSES::begin(), NETINFO_MAPPING::begin(), Cmts_User, cu, LSET::CuStack(), DIM, Double2Str(), BOARD::Drawings(), Dwgs_User, Eco1_User, Eco2_User, Edge_Cuts, NETCLASSES::end(), NETINFO_MAPPING::end(), F_Adhes, F_CrtYd, F_Fab, F_Mask, F_Paste, F_SilkS, filterNetClass(), FMTIU, TITLE_BLOCK::Format(), Format(), PCB_PLOT_PARAMS::Format(), PAGE_INFO::Format(), NETCLASS::Format(), BOARD::GetArea(), BOARD::GetAreaCount(), BOARD::GetAuxOrigin(), BOARD_DESIGN_SETTINGS::GetBoardThickness(), DHEAD::GetCount(), BOARD_DESIGN_SETTINGS::GetCurrentTrackWidth(), BOARD_DESIGN_SETTINGS::GetDefault(), BOARD::GetDesignSettings(), D_PAD::GetDrillSize(), BOARD::GetEnabledLayers(), BOARD::GetGridOrigin(), BOARD::GetLayerName(), BOARD::GetLayerType(), BOARD::GetNumSegmTrack(), BOARD::GetNumSegmZone(), BOARD::GetPageSettings(), BOARD::GetPlotOptions(), D_PAD::GetSize(), NETINFO_MAPPING::GetSize(), BOARD::GetTitleBlock(), BOARD_DESIGN_SETTINGS::GetVisibleElements(), BOARD::GetVisibleLayers(), BOARD::GetZoneSettings(), BOARD_DESIGN_SETTINGS::m_BlindBuriedViaAllowed, m_ctl, BOARD_DESIGN_SETTINGS::m_DrawSegmentWidth, BOARD_DESIGN_SETTINGS::m_EdgeSegmentWidth, m_mapping, BOARD_DESIGN_SETTINGS::m_MicroViasAllowed, BOARD_DESIGN_SETTINGS::m_MicroViasMinDrill, BOARD_DESIGN_SETTINGS::m_MicroViasMinSize, BOARD::m_Modules, BOARD_DESIGN_SETTINGS::m_ModuleSegmentWidth, BOARD_DESIGN_SETTINGS::m_ModuleTextSize, BOARD_DESIGN_SETTINGS::m_ModuleTextWidth, BOARD_DESIGN_SETTINGS::m_NetClasses, m_out, 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::m_Track, 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, Margin, TRACK::Next(), MODULE::Next(), OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), LSET::Seq(), LAYER::ShowType(), NETINFO_MAPPING::Translate(), wxPoint::x, and wxPoint::y.

Referenced by Format(), and format().

531 {
532  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
533 
534  m_out->Print( 0, "\n" );
535 
536  m_out->Print( aNestLevel, "(general\n" );
537 
538  // Write Bounding box info
539  m_out->Print( aNestLevel+1, "(thickness %s)\n",
540  FMTIU( dsnSettings.GetBoardThickness() ).c_str() );
541 
542  m_out->Print( aNestLevel+1, "(drawings %d)\n", aBoard->Drawings().Size() );
543  m_out->Print( aNestLevel+1, "(tracks %d)\n", aBoard->GetNumSegmTrack() );
544  m_out->Print( aNestLevel+1, "(zones %d)\n", aBoard->GetNumSegmZone() );
545  m_out->Print( aNestLevel+1, "(modules %d)\n", aBoard->m_Modules.GetCount() );
546  m_out->Print( aNestLevel+1, "(nets %d)\n", m_mapping->GetSize() );
547  m_out->Print( aNestLevel, ")\n\n" );
548 
549  aBoard->GetPageSettings().Format( m_out, aNestLevel, m_ctl );
550  aBoard->GetTitleBlock().Format( m_out, aNestLevel, m_ctl );
551 
552  // Layers.
553  m_out->Print( aNestLevel, "(layers\n" );
554 
555  // Save only the used copper layers from front to back.
556  LSET visible_layers = aBoard->GetVisibleLayers();
557 
558  for( LSEQ cu = aBoard->GetEnabledLayers().CuStack(); cu; ++cu )
559  {
560  PCB_LAYER_ID layer = *cu;
561 
562  m_out->Print( aNestLevel+1, "(%d %s %s", layer,
563  m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str(),
564  LAYER::ShowType( aBoard->GetLayerType( layer ) ) );
565 
566  if( !visible_layers[layer] )
567  m_out->Print( 0, " hide" );
568 
569  m_out->Print( 0, ")\n" );
570  }
571 
572  // Save used non-copper layers in the order they are defined.
573  // desired sequence for non Cu BOARD layers.
574  static const PCB_LAYER_ID non_cu[] = {
575  B_Adhes, // 32
576  F_Adhes,
577  B_Paste,
578  F_Paste,
579  B_SilkS,
580  F_SilkS,
581  B_Mask,
582  F_Mask,
583  Dwgs_User,
584  Cmts_User,
585  Eco1_User,
586  Eco2_User,
587  Edge_Cuts,
588  Margin,
589  B_CrtYd,
590  F_CrtYd,
591  B_Fab,
592  F_Fab
593  };
594 
595  for( LSEQ seq = aBoard->GetEnabledLayers().Seq( non_cu, DIM( non_cu ) ); seq; ++seq )
596  {
597  PCB_LAYER_ID layer = *seq;
598 
599  m_out->Print( aNestLevel+1, "(%d %s user", layer,
600  m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str() );
601 
602  if( !visible_layers[layer] )
603  m_out->Print( 0, " hide" );
604 
605  m_out->Print( 0, ")\n" );
606  }
607 
608  m_out->Print( aNestLevel, ")\n\n" );
609 
610  // Setup
611  m_out->Print( aNestLevel, "(setup\n" );
612 
613  // Save current default track width, for compatibility with older Pcbnew version;
614  m_out->Print( aNestLevel+1, "(last_trace_width %s)\n",
615  FMTIU( dsnSettings.GetCurrentTrackWidth() ).c_str() );
616 
617  // Save custom tracks width list (the first is not saved here: this is the netclass value
618  for( unsigned ii = 1; ii < dsnSettings.m_TrackWidthList.size(); ii++ )
619  m_out->Print( aNestLevel+1, "(user_trace_width %s)\n",
620  FMTIU( dsnSettings.m_TrackWidthList[ii] ).c_str() );
621 
622  m_out->Print( aNestLevel+1, "(trace_clearance %s)\n",
623  FMTIU( dsnSettings.GetDefault()->GetClearance() ).c_str() );
624 
625  // ZONE_SETTINGS
626  m_out->Print( aNestLevel+1, "(zone_clearance %s)\n",
627  FMTIU( aBoard->GetZoneSettings().m_ZoneClearance ).c_str() );
628  m_out->Print( aNestLevel+1, "(zone_45_only %s)\n",
629  aBoard->GetZoneSettings().m_Zone_45_Only ? "yes" : "no" );
630 
631  m_out->Print( aNestLevel+1, "(trace_min %s)\n",
632  FMTIU( dsnSettings.m_TrackMinWidth ).c_str() );
633 
634  m_out->Print( aNestLevel+1, "(segment_width %s)\n",
635  FMTIU( dsnSettings.m_DrawSegmentWidth ).c_str() );
636  m_out->Print( aNestLevel+1, "(edge_width %s)\n",
637  FMTIU( dsnSettings.m_EdgeSegmentWidth ).c_str() );
638 
639  // Save current default via size, for compatibility with older Pcbnew version;
640  m_out->Print( aNestLevel+1, "(via_size %s)\n",
641  FMTIU( dsnSettings.GetDefault()->GetViaDiameter() ).c_str() );
642  m_out->Print( aNestLevel+1, "(via_drill %s)\n",
643  FMTIU( dsnSettings.GetDefault()->GetViaDrill() ).c_str() );
644  m_out->Print( aNestLevel+1, "(via_min_size %s)\n",
645  FMTIU( dsnSettings.m_ViasMinSize ).c_str() );
646  m_out->Print( aNestLevel+1, "(via_min_drill %s)\n",
647  FMTIU( dsnSettings.m_ViasMinDrill ).c_str() );
648 
649  // Save custom vias diameters list (the first is not saved here: this is
650  // the netclass value
651  for( unsigned ii = 1; ii < dsnSettings.m_ViasDimensionsList.size(); ii++ )
652  m_out->Print( aNestLevel+1, "(user_via %s %s)\n",
653  FMTIU( dsnSettings.m_ViasDimensionsList[ii].m_Diameter ).c_str(),
654  FMTIU( dsnSettings.m_ViasDimensionsList[ii].m_Drill ).c_str() );
655 
656  // for old versions compatibility:
657  if( dsnSettings.m_BlindBuriedViaAllowed )
658  m_out->Print( aNestLevel+1, "(blind_buried_vias_allowed yes)\n" );
659 
660  m_out->Print( aNestLevel+1, "(uvia_size %s)\n",
661  FMTIU( dsnSettings.GetDefault()->GetuViaDiameter() ).c_str() );
662  m_out->Print( aNestLevel+1, "(uvia_drill %s)\n",
663  FMTIU( dsnSettings.GetDefault()->GetuViaDrill() ).c_str() );
664  m_out->Print( aNestLevel+1, "(uvias_allowed %s)\n",
665  ( dsnSettings.m_MicroViasAllowed ) ? "yes" : "no" );
666  m_out->Print( aNestLevel+1, "(uvia_min_size %s)\n",
667  FMTIU( dsnSettings.m_MicroViasMinSize ).c_str() );
668  m_out->Print( aNestLevel+1, "(uvia_min_drill %s)\n",
669  FMTIU( dsnSettings.m_MicroViasMinDrill ).c_str() );
670 
671  m_out->Print( aNestLevel+1, "(pcb_text_width %s)\n",
672  FMTIU( dsnSettings.m_PcbTextWidth ).c_str() );
673  m_out->Print( aNestLevel+1, "(pcb_text_size %s %s)\n",
674  FMTIU( dsnSettings.m_PcbTextSize.x ).c_str(),
675  FMTIU( dsnSettings.m_PcbTextSize.y ).c_str() );
676 
677  m_out->Print( aNestLevel+1, "(mod_edge_width %s)\n",
678  FMTIU( dsnSettings.m_ModuleSegmentWidth ).c_str() );
679  m_out->Print( aNestLevel+1, "(mod_text_size %s %s)\n",
680  FMTIU( dsnSettings.m_ModuleTextSize.x ).c_str(),
681  FMTIU( dsnSettings.m_ModuleTextSize.y ).c_str() );
682  m_out->Print( aNestLevel+1, "(mod_text_width %s)\n",
683  FMTIU( dsnSettings.m_ModuleTextWidth ).c_str() );
684 
685  m_out->Print( aNestLevel+1, "(pad_size %s %s)\n",
686  FMTIU( dsnSettings.m_Pad_Master.GetSize().x ).c_str(),
687  FMTIU( dsnSettings.m_Pad_Master.GetSize().y ).c_str() );
688  m_out->Print( aNestLevel+1, "(pad_drill %s)\n",
689  FMTIU( dsnSettings.m_Pad_Master.GetDrillSize().x ).c_str() );
690 
691  m_out->Print( aNestLevel+1, "(pad_to_mask_clearance %s)\n",
692  FMTIU( dsnSettings.m_SolderMaskMargin ).c_str() );
693 
694  if( dsnSettings.m_SolderMaskMinWidth )
695  m_out->Print( aNestLevel+1, "(solder_mask_min_width %s)\n",
696  FMTIU( dsnSettings.m_SolderMaskMinWidth ).c_str() );
697 
698  if( dsnSettings.m_SolderPasteMargin != 0 )
699  m_out->Print( aNestLevel+1, "(pad_to_paste_clearance %s)\n",
700  FMTIU( dsnSettings.m_SolderPasteMargin ).c_str() );
701 
702  if( dsnSettings.m_SolderPasteMarginRatio != 0 )
703  m_out->Print( aNestLevel+1, "(pad_to_paste_clearance_ratio %s)\n",
704  Double2Str( dsnSettings.m_SolderPasteMarginRatio ).c_str() );
705 
706  m_out->Print( aNestLevel+1, "(aux_axis_origin %s %s)\n",
707  FMTIU( aBoard->GetAuxOrigin().x ).c_str(),
708  FMTIU( aBoard->GetAuxOrigin().y ).c_str() );
709 
710  if( aBoard->GetGridOrigin().x || aBoard->GetGridOrigin().y )
711  m_out->Print( aNestLevel+1, "(grid_origin %s %s)\n",
712  FMTIU( aBoard->GetGridOrigin().x ).c_str(),
713  FMTIU( aBoard->GetGridOrigin().y ).c_str() );
714 
715  m_out->Print( aNestLevel+1, "(visible_elements %X)\n",
716  dsnSettings.GetVisibleElements() );
717 
718  aBoard->GetPlotOptions().Format( m_out, aNestLevel+1 );
719 
720  m_out->Print( aNestLevel, ")\n\n" );
721 
722  // Save net codes and names
723  for( NETINFO_MAPPING::iterator net = m_mapping->begin(), netEnd = m_mapping->end();
724  net != netEnd; ++net )
725  {
726  m_out->Print( aNestLevel, "(net %d %s)\n",
727  m_mapping->Translate( net->GetNet() ),
728  m_out->Quotew( net->GetNetname() ).c_str() );
729  }
730 
731  m_out->Print( 0, "\n" );
732 
733  // Save the default net class first.
734  NETCLASS defaultNC = *dsnSettings.GetDefault();
735  filterNetClass( *aBoard, defaultNC ); // Remove empty nets (from a copy of a netclass)
736  defaultNC.Format( m_out, aNestLevel, m_ctl );
737 
738  // Save the rest of the net classes alphabetically.
739  for( NETCLASSES::const_iterator it = dsnSettings.m_NetClasses.begin();
740  it != dsnSettings.m_NetClasses.end();
741  ++it )
742  {
743  NETCLASS netclass = *it->second;
744  filterNetClass( *aBoard, netclass ); // Remove empty nets (from a copy of a netclass)
745  netclass.Format( m_out, aNestLevel, m_ctl );
746  }
747 
748  // Save the modules.
749  for( MODULE* module = aBoard->m_Modules; module; module = module->Next() )
750  {
751  Format( module, aNestLevel );
752  m_out->Print( 0, "\n" );
753  }
754 
755  // Save the graphical items on the board (not owned by a module)
756  for( auto item : aBoard->Drawings() )
757  Format( item, aNestLevel );
758 
759  if( aBoard->Drawings().Size() )
760  m_out->Print( 0, "\n" );
761 
762  // Do not save MARKER_PCBs, they can be regenerated easily.
763 
764  // Save the tracks and vias.
765  for( TRACK* track = aBoard->m_Track; track; track = track->Next() )
766  Format( track, aNestLevel );
767 
768  if( aBoard->m_Track.GetCount() )
769  m_out->Print( 0, "\n" );
770 
773 
774  // Save the polygon (which are the newer technology) zones.
775  for( int i = 0; i < aBoard->GetAreaCount(); ++i )
776  Format( aBoard->GetArea( i ), aNestLevel );
777 }
#define DIM(x)
of elements in an array
Definition: macros.h:98
int m_SolderMaskMargin
Solder mask margin.
iterator begin() const
Function begin() Returns iterator to the first entry in the mapping.
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const ZONE_SETTINGS & GetZoneSettings() const
Definition: class_board.h:557
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:342
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
LSEQ CuStack() const
Function CuStack returns a sequence of copper layers in starting from the front/top and extending to ...
Definition: lset.cpp:147
MODULE * Next() const
Definition: class_module.h:100
iterator end()
std::string Double2Str(double aValue)
Helper function Double2Str to print a float number without using scientific notation and no trailing ...
Definition: base_units.cpp:60
const wxSize & GetDrillSize() const
Definition: class_pad.h:188
wxSize m_ModuleTextSize
Default footprint texts size.
#define cu(a)
Definition: auxiliary.h:88
LSET GetEnabledLayers() const
Function GetEnabledLayers is a proxy function that calls the corresponding function in m_BoardSetting...
NETCLASS_MAP::const_iterator const_iterator
iterator end() const
Function end() Returns iterator to the last entry in the mapping.
void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Function Format outputs the net class to aFormatter in s-expression form.
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:337
PCB_LAYER_ID
A quick note on layer IDs:
Class LSET is a set of PCB_LAYER_IDs.
iterator begin()
int GetSize() const
Function GetSize.
int Translate(int aNetCode) const
Function Translate Translates net number according to the map prepared by Update() function...
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
Class NETCLASS handles a collection of nets and the parameters used to route or test these nets...
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Function GetLayerName returns the name of a layer given by aLayer.
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:551
const wxSize & GetSize() const
Definition: class_pad.h:182
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:533
int m_ZoneClearance
Clearance value.
virtual void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Function Format outputs the object to aFormatter in s-expression form.
Definition: worksheet.cpp:245
bool m_BlindBuriedViaAllowed
true to allow blind/buried vias
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:486
int GetAreaCount() const
Function GetAreaCount.
Definition: class_board.h:1025
Wrapper class, so you can iterate through NETINFO_ITEM*s, not std::pair
int m_MicroViasMinSize
micro vias (not vias) min diameter
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 ...
int GetNumSegmTrack() const
Functions to get some items count.
Class LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
const PAGE_INFO & GetPageSettings() const
Definition: class_board.h:548
const wxPoint & GetAuxOrigin() const
Definition: class_board.h:335
void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Function GetStandardSizes returns the standard page types, such as "A4", "A3", etc.
TRACK * Next() const
Definition: class_track.h:98
TITLE_BLOCK & GetTitleBlock()
Definition: class_board.h:554
ZONE_CONTAINER * GetArea(int index) const
Function GetArea returns the Area (Zone Container) at a given index.
Definition: class_board.h:996
DLIST< MODULE > m_Modules
Definition: class_board.h:245
LSET GetVisibleLayers() const
Function GetVisibleLayers is a proxy function that calls the correspondent function in m_BoardSetting...
D_PAD m_Pad_Master
A dummy pad to store all default parameters.
int GetNumSegmZone() const
Calculate the zone segment count.
std::vector< VIA_DIMENSION > m_ViasDimensionsList
Vias size and drill list.
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
void filterNetClass(const BOARD &aBoard, NETCLASS &aNetClass)
Removes empty nets (i.e. with node count equal zero) from net classes
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:408
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.
#define FMTIU
LAYER_T GetLayerType(PCB_LAYER_ID aLayer) const
Function GetLayerType returns the type of the copper layer given by aLayer.
DLIST_ITERATOR_WRAPPER< BOARD_ITEM > Drawings()
Definition: class_board.h:251
NETCLASSES m_NetClasses
List of current netclasses. There is always the default netclass.
int m_SolderMaskMinWidth
Solder mask min width.
Class BOARD_DESIGN_SETTINGS contains design settings for a BOARD object.
void PCB_IO::format ( DIMENSION aDimension,
int  aNestLevel = 0 
) const
private

Definition at line 780 of file kicad_plugin.cpp.

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

781 {
782  m_out->Print( aNestLevel, "(dimension %s (width %s)",
783  FMT_IU( aDimension->GetValue() ).c_str(),
784  FMT_IU( aDimension->GetWidth() ).c_str() );
785 
786  formatLayer( aDimension );
787 
788  if( aDimension->GetTimeStamp() )
789  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aDimension->GetTimeStamp() );
790 
791  m_out->Print( 0, "\n" );
792 
793  Format( &aDimension->Text(), aNestLevel+1 );
794 
795  m_out->Print( aNestLevel+1, "(feature1 (pts (xy %s %s) (xy %s %s)))\n",
796  FMT_IU( aDimension->m_featureLineDO.x ).c_str(),
797  FMT_IU( aDimension->m_featureLineDO.y ).c_str(),
798  FMT_IU( aDimension->m_featureLineDF.x ).c_str(),
799  FMT_IU( aDimension->m_featureLineDF.y ).c_str() );
800 
801  m_out->Print( aNestLevel+1, "(feature2 (pts (xy %s %s) (xy %s %s)))\n",
802  FMT_IU( aDimension->m_featureLineGO.x ).c_str(),
803  FMT_IU( aDimension->m_featureLineGO.y ).c_str(),
804  FMT_IU( aDimension->m_featureLineGF.x ).c_str(),
805  FMT_IU( aDimension->m_featureLineGF.y ).c_str() );
806 
807  m_out->Print( aNestLevel+1, "(crossbar (pts (xy %s %s) (xy %s %s)))\n",
808  FMT_IU( aDimension->m_crossBarO.x ).c_str(),
809  FMT_IU( aDimension->m_crossBarO.y ).c_str(),
810  FMT_IU( aDimension->m_crossBarF.x ).c_str(),
811  FMT_IU( aDimension->m_crossBarF.y ).c_str() );
812 
813  m_out->Print( aNestLevel+1, "(arrow1a (pts (xy %s %s) (xy %s %s)))\n",
814  FMT_IU( aDimension->m_crossBarF.x ).c_str(),
815  FMT_IU( aDimension->m_crossBarF.y ).c_str(),
816  FMT_IU( aDimension->m_arrowD1F.x ).c_str(),
817  FMT_IU( aDimension->m_arrowD1F.y ).c_str() );
818 
819  m_out->Print( aNestLevel+1, "(arrow1b (pts (xy %s %s) (xy %s %s)))\n",
820  FMT_IU( aDimension->m_crossBarF.x ).c_str(),
821  FMT_IU( aDimension->m_crossBarF.y ).c_str(),
822  FMT_IU( aDimension->m_arrowD2F.x ).c_str(),
823  FMT_IU( aDimension->m_arrowD2F.y ).c_str() );
824 
825  m_out->Print( aNestLevel+1, "(arrow2a (pts (xy %s %s) (xy %s %s)))\n",
826  FMT_IU( aDimension->m_crossBarO.x ).c_str(),
827  FMT_IU( aDimension->m_crossBarO.y ).c_str(),
828  FMT_IU( aDimension->m_arrowG1F.x ).c_str(),
829  FMT_IU( aDimension->m_arrowG1F.y ).c_str() );
830 
831  m_out->Print( aNestLevel+1, "(arrow2b (pts (xy %s %s) (xy %s %s)))\n",
832  FMT_IU( aDimension->m_crossBarO.x ).c_str(),
833  FMT_IU( aDimension->m_crossBarO.y ).c_str(),
834  FMT_IU( aDimension->m_arrowG2F.x ).c_str(),
835  FMT_IU( aDimension->m_arrowG2F.y ).c_str() );
836 
837  m_out->Print( aNestLevel, ")\n" );
838 }
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
wxPoint m_arrowG1F
wxPoint m_arrowD2F
wxPoint m_arrowG2F
#define FMT_IU
void Format(BOARD_ITEM *aItem, int aNestLevel=0) const
Function Format outputs aItem to aFormatter in s-expression format.
time_t GetTimeStamp() const
Definition: base_struct.h:204
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:408
wxPoint m_featureLineDO
wxPoint m_featureLineGF
void PCB_IO::format ( EDGE_MODULE aModuleDrawing,
int  aNestLevel = 0 
) const
private

Definition at line 906 of file kicad_plugin.cpp.

References FMT_ANGLE, FMT_IU, formatLayer(), DRAWSEGMENT::GetAngle(), DRAWSEGMENT::GetBezControl1(), DRAWSEGMENT::GetBezControl2(), EDGE_MODULE::GetEnd0(), DRAWSEGMENT::GetPolyPoints(), DRAWSEGMENT::GetShape(), EDGE_MODULE::GetStart0(), DRAWSEGMENT::GetWidth(), m_out, OUTPUTFORMATTER::Print(), S_ARC, S_CIRCLE, S_CURVE, S_POLYGON, and S_SEGMENT.

907 {
908  switch( aModuleDrawing->GetShape() )
909  {
910  case S_SEGMENT: // Line
911  m_out->Print( aNestLevel, "(fp_line (start %s) (end %s)",
912  FMT_IU( aModuleDrawing->GetStart0() ).c_str(),
913  FMT_IU( aModuleDrawing->GetEnd0() ).c_str() );
914  break;
915 
916  case S_CIRCLE: // Circle
917  m_out->Print( aNestLevel, "(fp_circle (center %s) (end %s)",
918  FMT_IU( aModuleDrawing->GetStart0() ).c_str(),
919  FMT_IU( aModuleDrawing->GetEnd0() ).c_str() );
920  break;
921 
922  case S_ARC: // Arc
923  m_out->Print( aNestLevel, "(fp_arc (start %s) (end %s) (angle %s)",
924  FMT_IU( aModuleDrawing->GetStart0() ).c_str(),
925  FMT_IU( aModuleDrawing->GetEnd0() ).c_str(),
926  FMT_ANGLE( aModuleDrawing->GetAngle() ).c_str() );
927  break;
928 
929  case S_POLYGON: // Polygon
930  m_out->Print( aNestLevel, "(fp_poly (pts" );
931 
932  for( unsigned i = 0; i < aModuleDrawing->GetPolyPoints().size(); ++i )
933  {
934  int nestLevel = 0;
935 
936  if( i && !(i%4) ) // newline every 4(pts)
937  {
938  nestLevel = aNestLevel + 1;
939  m_out->Print( 0, "\n" );
940  }
941 
942  m_out->Print( nestLevel, "%s(xy %s)",
943  nestLevel ? "" : " ",
944  FMT_IU( aModuleDrawing->GetPolyPoints()[i] ).c_str() );
945  }
946  m_out->Print( 0, ")" );
947  break;
948 
949  case S_CURVE: // Bezier curve
950  m_out->Print( aNestLevel, "(fp_curve (pts (xy %s) (xy %s) (xy %s) (xy %s))",
951  FMT_IU( aModuleDrawing->GetStart0() ).c_str(),
952  FMT_IU( aModuleDrawing->GetBezControl1() ).c_str(),
953  FMT_IU( aModuleDrawing->GetBezControl2() ).c_str(),
954  FMT_IU( aModuleDrawing->GetEnd0() ).c_str() );
955  break;
956 
957  default:
958  wxFAIL_MSG( wxT( "Cannot format invalid DRAWSEGMENT type." ) );
959  };
960 
961  formatLayer( aModuleDrawing );
962 
963  m_out->Print( 0, " (width %s)", FMT_IU( aModuleDrawing->GetWidth() ).c_str() );
964 
965  m_out->Print( 0, ")\n" );
966 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const wxPoint & GetBezControl2() const
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
const std::vector< wxPoint > & GetPolyPoints() const
STROKE_T GetShape() const
Arcs (with rounded ends)
#define FMT_IU
const wxPoint & GetBezControl1() const
Bezier Curve.
double GetAngle() const
const wxPoint & GetStart0() const
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:408
#define FMT_ANGLE
void PCB_IO::format ( DRAWSEGMENT aSegment,
int  aNestLevel = 0 
) const
private

Definition at line 841 of file kicad_plugin.cpp.

References FMT_ANGLE, FMT_IU, formatLayer(), DRAWSEGMENT::GetAngle(), DRAWSEGMENT::GetBezControl1(), DRAWSEGMENT::GetBezControl2(), DRAWSEGMENT::GetEnd(), DRAWSEGMENT::GetPolyPoints(), DRAWSEGMENT::GetShape(), DRAWSEGMENT::GetStart(), EDA_ITEM::GetStatus(), EDA_ITEM::GetTimeStamp(), DRAWSEGMENT::GetWidth(), m_out, OUTPUTFORMATTER::Print(), S_ARC, S_CIRCLE, S_CURVE, S_POLYGON, and S_SEGMENT.

842 {
843  unsigned i;
844 
845  switch( aSegment->GetShape() )
846  {
847  case S_SEGMENT: // Line
848  m_out->Print( aNestLevel, "(gr_line (start %s) (end %s)",
849  FMT_IU( aSegment->GetStart() ).c_str(),
850  FMT_IU( aSegment->GetEnd() ).c_str() );
851 
852  if( aSegment->GetAngle() != 0.0 )
853  m_out->Print( 0, " (angle %s)", FMT_ANGLE( aSegment->GetAngle() ).c_str() );
854 
855  break;
856 
857  case S_CIRCLE: // Circle
858  m_out->Print( aNestLevel, "(gr_circle (center %s) (end %s)",
859  FMT_IU( aSegment->GetStart() ).c_str(),
860  FMT_IU( aSegment->GetEnd() ).c_str() );
861  break;
862 
863  case S_ARC: // Arc
864  m_out->Print( aNestLevel, "(gr_arc (start %s) (end %s) (angle %s)",
865  FMT_IU( aSegment->GetStart() ).c_str(),
866  FMT_IU( aSegment->GetEnd() ).c_str(),
867  FMT_ANGLE( aSegment->GetAngle() ).c_str() );
868  break;
869 
870  case S_POLYGON: // Polygon
871  m_out->Print( aNestLevel, "(gr_poly (pts" );
872 
873  for( i = 0; i < aSegment->GetPolyPoints().size(); ++i )
874  m_out->Print( 0, " (xy %s)", FMT_IU( aSegment->GetPolyPoints()[i] ).c_str() );
875 
876  m_out->Print( 0, ")" );
877  break;
878 
879  case S_CURVE: // Bezier curve
880  m_out->Print( aNestLevel, "(gr_curve (pts (xy %s) (xy %s) (xy %s) (xy %s))",
881  FMT_IU( aSegment->GetStart() ).c_str(),
882  FMT_IU( aSegment->GetBezControl1() ).c_str(),
883  FMT_IU( aSegment->GetBezControl2() ).c_str(),
884  FMT_IU( aSegment->GetEnd() ).c_str() );
885  break;
886 
887  default:
888  wxFAIL_MSG( wxT( "Cannot format invalid DRAWSEGMENT type." ) );
889  };
890 
891  formatLayer( aSegment );
892 
893  if( aSegment->GetWidth() != 0 )
894  m_out->Print( 0, " (width %s)", FMT_IU( aSegment->GetWidth() ).c_str() );
895 
896  if( aSegment->GetTimeStamp() )
897  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aSegment->GetTimeStamp() );
898 
899  if( aSegment->GetStatus() )
900  m_out->Print( 0, " (status %X)", aSegment->GetStatus() );
901 
902  m_out->Print( 0, ")\n" );
903 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const wxPoint & GetBezControl2() const
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
const std::vector< wxPoint > & GetPolyPoints() const
STATUS_FLAGS GetStatus() const
Definition: base_struct.h:250
STROKE_T GetShape() const
const wxPoint & GetEnd() const
Function GetEnd returns the ending point of the graphic.
Arcs (with rounded ends)
#define FMT_IU
const wxPoint & GetBezControl1() const
Bezier Curve.
time_t GetTimeStamp() const
Definition: base_struct.h:204
double GetAngle() const
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:408
const wxPoint & GetStart() const
Function GetStart returns the starting point of the graphic.
#define FMT_ANGLE
void PCB_IO::format ( PCB_TARGET aTarget,
int  aNestLevel = 0 
) const
private

Definition at line 969 of file kicad_plugin.cpp.

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

970 {
971  m_out->Print( aNestLevel, "(target %s (at %s) (size %s)",
972  ( aTarget->GetShape() ) ? "x" : "plus",
973  FMT_IU( aTarget->GetPosition() ).c_str(),
974  FMT_IU( aTarget->GetSize() ).c_str() );
975 
976  if( aTarget->GetWidth() != 0 )
977  m_out->Print( 0, " (width %s)", FMT_IU( aTarget->GetWidth() ).c_str() );
978 
979  formatLayer( aTarget );
980 
981  if( aTarget->GetTimeStamp() )
982  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aTarget->GetTimeStamp() );
983 
984  m_out->Print( 0, ")\n" );
985 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
int GetWidth() const
Definition: class_mire.h:72
void formatLayer(const BOARD_ITEM *aItem) const
int GetShape() const
Definition: class_mire.h:66
#define FMT_IU
time_t GetTimeStamp() const
Definition: base_struct.h:204
const wxPoint & GetPosition() const override
Definition: class_mire.h:63
int GetSize() const
Definition: class_mire.h:69
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:408
void PCB_IO::format ( MODULE aModule,
int  aNestLevel = 0 
) const
private

Definition at line 988 of file kicad_plugin.cpp.

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

989 {
990  if( !( m_ctl & CTL_OMIT_INITIAL_COMMENTS ) )
991  {
992  const wxArrayString* initial_comments = aModule->GetInitialComments();
993 
994  if( initial_comments )
995  {
996  for( unsigned i=0; i<initial_comments->GetCount(); ++i )
997  m_out->Print( aNestLevel, "%s\n", TO_UTF8( (*initial_comments)[i] ) );
998 
999  m_out->Print( 0, "\n" ); // improve readability?
1000  }
1001  }
1002 
1003  m_out->Print( aNestLevel, "(module %s",
1004  m_out->Quotes( aModule->GetFPID().Format() ).c_str() );
1005 
1006  if( aModule->IsLocked() )
1007  m_out->Print( 0, " locked" );
1008 
1009  if( aModule->IsPlaced() )
1010  m_out->Print( 0, " placed" );
1011 
1012  formatLayer( aModule );
1013 
1014  m_out->Print( 0, " (tedit %lX)", (unsigned long)aModule->GetLastEditTime() );
1015 
1016  if( !( m_ctl & CTL_OMIT_TSTAMPS ) )
1017  {
1018  m_out->Print( 0, " (tstamp %lX)\n", (unsigned long)aModule->GetTimeStamp() );
1019  }
1020  else
1021  m_out->Print( 0, "\n" );
1022 
1023  if( !( m_ctl & CTL_OMIT_AT ) )
1024  {
1025  m_out->Print( aNestLevel+1, "(at %s", FMT_IU( aModule->GetPosition() ).c_str() );
1026 
1027  if( aModule->GetOrientation() != 0.0 )
1028  m_out->Print( 0, " %s", FMT_ANGLE( aModule->GetOrientation() ).c_str() );
1029 
1030  m_out->Print( 0, ")\n" );
1031  }
1032 
1033  if( !aModule->GetDescription().IsEmpty() )
1034  m_out->Print( aNestLevel+1, "(descr %s)\n",
1035  m_out->Quotew( aModule->GetDescription() ).c_str() );
1036 
1037  if( !aModule->GetKeywords().IsEmpty() )
1038  m_out->Print( aNestLevel+1, "(tags %s)\n",
1039  m_out->Quotew( aModule->GetKeywords() ).c_str() );
1040 
1041  if( !( m_ctl & CTL_OMIT_PATH ) && !!aModule->GetPath() )
1042  m_out->Print( aNestLevel+1, "(path %s)\n",
1043  m_out->Quotew( aModule->GetPath() ).c_str() );
1044 
1045  if( aModule->GetPlacementCost90() != 0 )
1046  m_out->Print( aNestLevel+1, "(autoplace_cost90 %d)\n", aModule->GetPlacementCost90() );
1047 
1048  if( aModule->GetPlacementCost180() != 0 )
1049  m_out->Print( aNestLevel+1, "(autoplace_cost180 %d)\n", aModule->GetPlacementCost180() );
1050 
1051  if( aModule->GetLocalSolderMaskMargin() != 0 )
1052  m_out->Print( aNestLevel+1, "(solder_mask_margin %s)\n",
1053  FMT_IU( aModule->GetLocalSolderMaskMargin() ).c_str() );
1054 
1055  if( aModule->GetLocalSolderPasteMargin() != 0 )
1056  m_out->Print( aNestLevel+1, "(solder_paste_margin %s)\n",
1057  FMT_IU( aModule->GetLocalSolderPasteMargin() ).c_str() );
1058 
1059  if( aModule->GetLocalSolderPasteMarginRatio() != 0 )
1060  m_out->Print( aNestLevel+1, "(solder_paste_ratio %s)\n",
1061  Double2Str( aModule->GetLocalSolderPasteMarginRatio() ).c_str() );
1062 
1063  if( aModule->GetLocalClearance() != 0 )
1064  m_out->Print( aNestLevel+1, "(clearance %s)\n",
1065  FMT_IU( aModule->GetLocalClearance() ).c_str() );
1066 
1067  if( aModule->GetZoneConnection() != PAD_ZONE_CONN_INHERITED )
1068  m_out->Print( aNestLevel+1, "(zone_connect %d)\n", aModule->GetZoneConnection() );
1069 
1070  if( aModule->GetThermalWidth() != 0 )
1071  m_out->Print( aNestLevel+1, "(thermal_width %s)\n",
1072  FMT_IU( aModule->GetThermalWidth() ).c_str() );
1073 
1074  if( aModule->GetThermalGap() != 0 )
1075  m_out->Print( aNestLevel+1, "(thermal_gap %s)\n",
1076  FMT_IU( aModule->GetThermalGap() ).c_str() );
1077 
1078  // Attributes
1079  if( aModule->GetAttributes() != MOD_DEFAULT )
1080  {
1081  m_out->Print( aNestLevel+1, "(attr" );
1082 
1083  if( aModule->GetAttributes() & MOD_CMS )
1084  m_out->Print( 0, " smd" );
1085 
1086  if( aModule->GetAttributes() & MOD_VIRTUAL )
1087  m_out->Print( 0, " virtual" );
1088 
1089  m_out->Print( 0, ")\n" );
1090  }
1091 
1092  Format( (BOARD_ITEM*) &aModule->Reference(), aNestLevel+1 );
1093  Format( (BOARD_ITEM*) &aModule->Value(), aNestLevel+1 );
1094 
1095  // Save drawing elements.
1096  for( BOARD_ITEM* gr = aModule->GraphicalItemsList(); gr; gr = gr->Next() )
1097  Format( gr, aNestLevel+1 );
1098 
1099  // Save pads.
1100  for( D_PAD* pad = aModule->PadsList(); pad; pad = pad->Next() )
1101  format( pad, aNestLevel+1 );
1102 
1103  // Save 3D info.
1104  std::list<S3D_INFO>::const_iterator bs3D = aModule->Models().begin();
1105  std::list<S3D_INFO>::const_iterator es3D = aModule->Models().end();
1106 
1107  while( bs3D != es3D )
1108  {
1109  if( !bs3D->m_Filename.IsEmpty() )
1110  {
1111  m_out->Print( aNestLevel+1, "(model %s\n",
1112  m_out->Quotew( bs3D->m_Filename ).c_str() );
1113 
1114  m_out->Print( aNestLevel+2, "(at (xyz %s %s %s))\n",
1115  Double2Str( bs3D->m_Offset.x ).c_str(),
1116  Double2Str( bs3D->m_Offset.y ).c_str(),
1117  Double2Str( bs3D->m_Offset.z ).c_str() );
1118 
1119  m_out->Print( aNestLevel+2, "(scale (xyz %s %s %s))\n",
1120  Double2Str( bs3D->m_Scale.x ).c_str(),
1121  Double2Str( bs3D->m_Scale.y ).c_str(),
1122  Double2Str( bs3D->m_Scale.z ).c_str() );
1123 
1124  m_out->Print( aNestLevel+2, "(rotate (xyz %s %s %s))\n",
1125  Double2Str( bs3D->m_Rotation.x ).c_str(),
1126  Double2Str( bs3D->m_Rotation.y ).c_str(),
1127  Double2Str( bs3D->m_Rotation.z ).c_str() );
1128 
1129  m_out->Print( aNestLevel+1, ")\n" );
1130  }
1131  ++bs3D;
1132  }
1133 
1134  m_out->Print( aNestLevel, ")\n" );
1135 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
TEXTE_MODULE & Reference()
Definition: class_module.h:463
#define CTL_OMIT_AT
Omit position and rotation.
int GetThermalGap() const
Definition: class_module.h:195
time_t GetLastEditTime() const
Definition: class_module.h:284
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:179
const wxPoint & GetPosition() const override
Definition: class_module.h:155
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:60
ZoneConnection GetZoneConnection() const
Definition: class_module.h:189
std::list< S3D_INFO > & Models()
Definition: class_module.h:150
int GetPlacementCost90() const
Definition: class_module.h:533
double GetLocalSolderPasteMarginRatio() const
Definition: class_module.h:185
BOARD_ITEM * Next() const
const LIB_ID & GetFPID() const
Definition: class_module.h:164
#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
double GetOrientation() const
Definition: class_module.h:160
TEXTE_MODULE & Value()
read/write accessors:
Definition: class_module.h:462
D_PAD * Next() const
Definition: class_pad.h:106
#define FMT_IU
int GetAttributes() const
Definition: class_module.h:197
const wxString & GetKeywords() const
Definition: class_module.h:170
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:486
int GetLocalSolderMaskMargin() const
Definition: class_module.h:176
#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:236
int GetLocalSolderPasteMargin() const
Definition: class_module.h:182
time_t GetTimeStamp() const
Definition: base_struct.h:204
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:437
const wxString & GetDescription() const
Definition: class_module.h:167
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)
void format(BOARD *aBoard, int aNestLevel=0) const
UTF8 Format() const
Function Format.
Definition: lib_id.cpp:263
DLIST< BOARD_ITEM > & GraphicalItemsList()
Definition: class_module.h:137
DLIST< D_PAD > & PadsList()
Definition: class_module.h:134
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:408
#define CTL_OMIT_INITIAL_COMMENTS
omit MODULE initial comments
const wxString & GetPath() const
Definition: class_module.h:173
const wxArrayString * GetInitialComments() const
Return the initial comments block or NULL if none, without transfer of ownership. ...
Definition: class_module.h:648
#define FMT_ANGLE
bool IsPlaced() const
Definition: class_module.h:254
int GetPlacementCost180() const
Definition: class_module.h:530
int GetThermalWidth() const
Definition: class_module.h:192
void PCB_IO::format ( D_PAD aPad,
int  aNestLevel = 0 
) const
private

Definition at line 1236 of file kicad_plugin.cpp.

References CTL_OMIT_NETS, Double2Str(), FMT_ANGLE, FMT_IU, Format(), formatLayers(), D_PAD::GetAttribute(), D_PAD::GetDelta(), D_PAD::GetDrillShape(), D_PAD::GetDrillSize(), D_PAD::GetLayerSet(), D_PAD::GetLocalClearance(), D_PAD::GetLocalSolderMaskMargin(), D_PAD::GetLocalSolderPasteMargin(), D_PAD::GetLocalSolderPasteMarginRatio(), BOARD_CONNECTED_ITEM::GetNetCode(), BOARD_CONNECTED_ITEM::GetNetname(), D_PAD::GetOffset(), D_PAD::GetOrientation(), D_PAD::GetPadName(), D_PAD::GetPadToDieLength(), D_PAD::GetPos0(), D_PAD::GetRoundRectRadiusRatio(), D_PAD::GetShape(), D_PAD::GetSize(), D_PAD::GetThermalGap(), D_PAD::GetThermalWidth(), D_PAD::GetZoneConnection(), m_ctl, m_mapping, m_out, PAD_ATTRIB_CONN, PAD_ATTRIB_HOLE_NOT_PLATED, PAD_ATTRIB_SMD, PAD_ATTRIB_STANDARD, PAD_DRILL_SHAPE_OBLONG, PAD_SHAPE_CIRCLE, PAD_SHAPE_OVAL, PAD_SHAPE_RECT, PAD_SHAPE_ROUNDRECT, PAD_SHAPE_TRAPEZOID, PAD_ZONE_CONN_INHERITED, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), StrPrintf(), THROW_IO_ERROR, NETINFO_MAPPING::Translate(), NETINFO_LIST::UNCONNECTED, wxPoint::x, and wxPoint::y.

1237 {
1238  const char* shape;
1239 
1240  switch( aPad->GetShape() )
1241  {
1242  case PAD_SHAPE_CIRCLE: shape = "circle"; break;
1243  case PAD_SHAPE_RECT: shape = "rect"; break;
1244  case PAD_SHAPE_OVAL: shape = "oval"; break;
1245  case PAD_SHAPE_TRAPEZOID: shape = "trapezoid"; break;
1246  case PAD_SHAPE_ROUNDRECT: shape = "roundrect"; break;
1247 
1248  default:
1249  THROW_IO_ERROR( wxString::Format( _( "unknown pad type: %d"), aPad->GetShape() ) );
1250  }
1251 
1252  const char* type;
1253 
1254  switch( aPad->GetAttribute() )
1255  {
1256  case PAD_ATTRIB_STANDARD: type = "thru_hole"; break;
1257  case PAD_ATTRIB_SMD: type = "smd"; break;
1258  case PAD_ATTRIB_CONN: type = "connect"; break;
1259  case PAD_ATTRIB_HOLE_NOT_PLATED: type = "np_thru_hole"; break;
1260 
1261  default:
1262  THROW_IO_ERROR( wxString::Format( _( "unknown pad attribute: %d" ),
1263  aPad->GetAttribute() ) );
1264  }
1265 
1266  m_out->Print( aNestLevel, "(pad %s %s %s",
1267  m_out->Quotew( aPad->GetPadName() ).c_str(),
1268  type, shape );
1269  m_out->Print( 0, " (at %s", FMT_IU( aPad->GetPos0() ).c_str() );
1270 
1271  if( aPad->GetOrientation() != 0.0 )
1272  m_out->Print( 0, " %s", FMT_ANGLE( aPad->GetOrientation() ).c_str() );
1273 
1274  m_out->Print( 0, ")" );
1275  m_out->Print( 0, " (size %s)", FMT_IU( aPad->GetSize() ).c_str() );
1276 
1277  if( (aPad->GetDelta().GetWidth()) != 0 || (aPad->GetDelta().GetHeight() != 0 ) )
1278  m_out->Print( 0, " (rect_delta %s )", FMT_IU( aPad->GetDelta() ).c_str() );
1279 
1280  wxSize sz = aPad->GetDrillSize();
1281  wxPoint shapeoffset = aPad->GetOffset();
1282 
1283  if( (sz.GetWidth() > 0) || (sz.GetHeight() > 0) ||
1284  (shapeoffset.x != 0) || (shapeoffset.y != 0) )
1285  {
1286  m_out->Print( 0, " (drill" );
1287 
1288  if( aPad->GetDrillShape() == PAD_DRILL_SHAPE_OBLONG )
1289  m_out->Print( 0, " oval" );
1290 
1291  if( sz.GetWidth() > 0 )
1292  m_out->Print( 0, " %s", FMT_IU( sz.GetWidth() ).c_str() );
1293 
1294  if( sz.GetHeight() > 0 && sz.GetWidth() != sz.GetHeight() )
1295  m_out->Print( 0, " %s", FMT_IU( sz.GetHeight() ).c_str() );
1296 
1297  if( (shapeoffset.x != 0) || (shapeoffset.y != 0) )
1298  m_out->Print( 0, " (offset %s)", FMT_IU( aPad->GetOffset() ).c_str() );
1299 
1300  m_out->Print( 0, ")" );
1301  }
1302 
1303  formatLayers( aPad->GetLayerSet(), 0 );
1304 
1305  // Output the radius ratio for rounded rect pads
1306  if( aPad->GetShape() == PAD_SHAPE_ROUNDRECT )
1307  {
1308  m_out->Print( 0, "(roundrect_rratio %s)",
1309  Double2Str( aPad->GetRoundRectRadiusRatio() ).c_str() );
1310  }
1311 
1312  std::string output;
1313 
1314  // Unconnected pad is default net so don't save it.
1315  if( !( m_ctl & CTL_OMIT_NETS ) && aPad->GetNetCode() != NETINFO_LIST::UNCONNECTED )
1316  StrPrintf( &output, " (net %d %s)", m_mapping->Translate( aPad->GetNetCode() ),
1317  m_out->Quotew( aPad->GetNetname() ).c_str() );
1318 
1319  if( aPad->GetPadToDieLength() != 0 )
1320  StrPrintf( &output, " (die_length %s)", FMT_IU( aPad->GetPadToDieLength() ).c_str() );
1321 
1322  if( aPad->GetLocalSolderMaskMargin() != 0 )
1323  StrPrintf( &output, " (solder_mask_margin %s)", FMT_IU( aPad->GetLocalSolderMaskMargin() ).c_str() );
1324 
1325  if( aPad->GetLocalSolderPasteMargin() != 0 )
1326  StrPrintf( &output, " (solder_paste_margin %s)", FMT_IU( aPad->GetLocalSolderPasteMargin() ).c_str() );
1327 
1328  if( aPad->GetLocalSolderPasteMarginRatio() != 0 )
1329  StrPrintf( &output, " (solder_paste_margin_ratio %s)",
1330  Double2Str( aPad->GetLocalSolderPasteMarginRatio() ).c_str() );
1331 
1332  if( aPad->GetLocalClearance() != 0 )
1333  StrPrintf( &output, " (clearance %s)", FMT_IU( aPad->GetLocalClearance() ).c_str() );
1334 
1336  StrPrintf( &output, " (zone_connect %d)", aPad->GetZoneConnection() );
1337 
1338  if( aPad->GetThermalWidth() != 0 )
1339  StrPrintf( &output, " (thermal_width %s)", FMT_IU( aPad->GetThermalWidth() ).c_str() );
1340 
1341  if( aPad->GetThermalGap() != 0 )
1342  StrPrintf( &output, " (thermal_gap %s)", FMT_IU( aPad->GetThermalGap() ).c_str() );
1343 
1344  if( output.size() )
1345  {
1346  m_out->Print( 0, "\n" );
1347  m_out->Print( aNestLevel+1, "%s", output.c_str()+1 ); // +1 skips 1st space on 1st element
1348  }
1349 
1350  m_out->Print( 0, ")\n" );
1351 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
PAD_ATTR_T GetAttribute() const
Definition: class_pad.h:238
like PAD_STANDARD, but not plated mechanical use only, no connection allowed
Definition: pad_shapes.h:63
int GetPadToDieLength() const
Definition: class_pad.h:241
int GetLocalSolderMaskMargin() const
Definition: class_pad.h:243
Smd pad, appears on the solder paste layer (default)
Definition: pad_shapes.h:59
const wxPoint & GetPos0() const
Definition: class_pad.h:176
PAD_DRILL_SHAPE_T GetDrillShape() const
Definition: class_pad.h:221
std::string Double2Str(double aValue)
Helper function Double2Str to print a float number without using scientific notation and no trailing ...
Definition: base_units.cpp:60
const wxSize & GetDrillSize() const
Definition: class_pad.h:188
PAD_SHAPE_T GetShape() const
Function GetShape.
Definition: class_pad.h:166
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:75
int Translate(int aNetCode) const
Function Translate Translates net number according to the map prepared by Update() function...
ZoneConnection GetZoneConnection() const
Definition: class_pad.cpp:610
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:235
int GetThermalWidth() const
Definition: class_pad.cpp:621
int GetThermalGap() const
Definition: class_pad.cpp:632
const wxSize & GetSize() const
Definition: class_pad.h:182
#define FMT_IU
int GetLocalSolderPasteMargin() const
Definition: class_pad.h:249
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:486
#define THROW_IO_ERROR(x)
Definition: utf8.cpp:60
#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:60
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes ...
int GetLocalClearance() const
Definition: class_pad.h:246
double GetLocalSolderPasteMarginRatio() const
Definition: class_pad.h:252
int GetNetCode() const
Function GetNetCode.
const wxString & GetNetname() const
Function GetNetname.
double GetRoundRectRadiusRatio() const
has meaning only for rounded rect pads
Definition: class_pad.h:450
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
double GetOrientation() const
Function GetOrientation returns the rotation angle of the pad in tenths of degrees, but soon degrees.
Definition: class_pad.h:214
const wxSize & GetDelta() const
Definition: class_pad.h:185
Usual pad.
Definition: pad_shapes.h:58
void formatLayers(LSET aLayerMask, int aNestLevel=0) const
wxString GetPadName() const
Definition: class_pad.cpp:433
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:408
#define FMT_ANGLE
static const int UNCONNECTED
Constant that holds the "unconnected net" number (typically 0) all items "connected" to this net are ...
const wxPoint & GetOffset() const
Definition: class_pad.h:191
void PCB_IO::format ( TEXTE_PCB aText,
int  aNestLevel = 0 
) const
private

Definition at line 1354 of file kicad_plugin.cpp.

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

1355 {
1356  m_out->Print( aNestLevel, "(gr_text %s (at %s",
1357  m_out->Quotew( aText->GetText() ).c_str(),
1358  FMT_IU( aText->GetTextPos() ).c_str() );
1359 
1360  if( aText->GetTextAngle() != 0.0 )
1361  m_out->Print( 0, " %s", FMT_ANGLE( aText->GetTextAngle() ).c_str() );
1362 
1363  m_out->Print( 0, ")" );
1364 
1365  formatLayer( aText );
1366 
1367  if( aText->GetTimeStamp() )
1368  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aText->GetTimeStamp() );
1369 
1370  m_out->Print( 0, "\n" );
1371 
1372  aText->EDA_TEXT::Format( m_out, aNestLevel, m_ctl );
1373 
1374  m_out->Print( aNestLevel, ")\n" );
1375 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const wxPoint & GetTextPos() const
Definition: eda_text.h:224
void formatLayer(const BOARD_ITEM *aItem) const
double GetTextAngle() const
Definition: eda_text.h:164
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:130
#define FMT_IU
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:486
time_t GetTimeStamp() const
Definition: base_struct.h:204
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:408
#define FMT_ANGLE
void PCB_IO::format ( TEXTE_MODULE aText,
int  aNestLevel = 0 
) const
private

Definition at line 1378 of file kicad_plugin.cpp.

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

1379 {
1380  wxString type;
1381 
1382  switch( aText->GetType() )
1383  {
1384  case TEXTE_MODULE::TEXT_is_REFERENCE: type = "reference"; break;
1385  case TEXTE_MODULE::TEXT_is_VALUE: type = "value"; break;
1386  case TEXTE_MODULE::TEXT_is_DIVERS: type = "user";
1387  }
1388 
1389  m_out->Print( aNestLevel, "(fp_text %s %s (at %s",
1390  m_out->Quotew( type ).c_str(),
1391  m_out->Quotew( aText->GetText() ).c_str(),
1392  FMT_IU( aText->GetPos0() ).c_str() );
1393 
1394  // Due to Pcbnew history, fp_text angle is saved as an absolute on screen angle,
1395  // but internally the angle is held relative to its parent footprint. parent
1396  // may be NULL when saving a footprint outside a BOARD.
1397  double orient = aText->GetTextAngle();
1398  MODULE* parent = (MODULE*) aText->GetParent();
1399 
1400  if( parent )
1401  {
1402  // GetTextAngle() is always in -360..+360 range because of
1403  // TEXTE_MODULE::SetTextAngle(), but summing that angle with an
1404  // additional board angle could kick sum up >= 360 or <= -360, so to have
1405  // consistent results, normalize again for the BOARD save. A footprint
1406  // save does not use this code path since parent is NULL.
1407 #if 0
1408  // This one could be considered reasonable if you like positive angles
1409  // in your board text.
1410  orient = NormalizeAnglePos( orient + parent->GetOrientation() );
1411 #else
1412  // Choose compatibility for now, even though this is only a 720 degree clamp
1413  // with two possible values for every angle.
1414  orient = NormalizeAngle360( orient + parent->GetOrientation() );
1415 #endif
1416  }
1417 
1418  if( orient != 0.0 )
1419  m_out->Print( 0, " %s", FMT_ANGLE( orient ).c_str() );
1420 
1421  m_out->Print( 0, ")" );
1422  formatLayer( aText );
1423 
1424  if( !aText->IsVisible() )
1425  m_out->Print( 0, " hide" );
1426 
1427  m_out->Print( 0, "\n" );
1428 
1429  aText->EDA_TEXT::Format( m_out, aNestLevel, m_ctl | CTL_OMIT_HIDE );
1430 
1431  m_out->Print( aNestLevel, ")\n" );
1432 }
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:164
double GetOrientation() const
Definition: class_module.h:160
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:130
#define FMT_IU
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:486
bool IsVisible() const
Definition: eda_text.h:176
T NormalizeAnglePos(T Angle)
Normalize angle to be in the 0.0 .
Definition: trigo.h:214
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:408
#define FMT_ANGLE
#define CTL_OMIT_HIDE
Definition: eda_text.h:42
T NormalizeAngle360(T Angle)
Normalize angle to be in the -360.0 .. 360.0:
Definition: trigo.h:202
void PCB_IO::format ( TRACK aTrack,
int  aNestLevel = 0 
) const
private

Definition at line 1435 of file kicad_plugin.cpp.

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

1436 {
1437  if( aTrack->Type() == PCB_VIA_T )
1438  {
1439  PCB_LAYER_ID layer1, layer2;
1440 
1441  const VIA* via = static_cast<const VIA*>(aTrack);
1442  BOARD* board = (BOARD*) via->GetParent();
1443 
1444  wxCHECK_RET( board != 0, wxT( "Via " ) + via->GetSelectMenuText() +
1445  wxT( " has no parent." ) );
1446 
1447  m_out->Print( aNestLevel, "(via" );
1448 
1449  via->LayerPair( &layer1, &layer2 );
1450 
1451  switch( via->GetViaType() )
1452  {
1453  case VIA_THROUGH: // Default shape not saved.
1454  break;
1455 
1456  case VIA_BLIND_BURIED:
1457  m_out->Print( 0, " blind" );
1458  break;
1459 
1460  case VIA_MICROVIA:
1461  m_out->Print( 0, " micro" );
1462  break;
1463 
1464  default:
1465  THROW_IO_ERROR( wxString::Format( _( "unknown via type %d" ), via->GetViaType() ) );
1466  }
1467 
1468  m_out->Print( 0, " (at %s) (size %s)",
1469  FMT_IU( aTrack->GetStart() ).c_str(),
1470  FMT_IU( aTrack->GetWidth() ).c_str() );
1471 
1472  if( via->GetDrill() != UNDEFINED_DRILL_DIAMETER )
1473  m_out->Print( 0, " (drill %s)", FMT_IU( via->GetDrill() ).c_str() );
1474 
1475  m_out->Print( 0, " (layers %s %s)",
1476  m_out->Quotew( m_board->GetLayerName( layer1 ) ).c_str(),
1477  m_out->Quotew( m_board->GetLayerName( layer2 ) ).c_str() );
1478  }
1479  else
1480  {
1481  m_out->Print( aNestLevel, "(segment (start %s) (end %s) (width %s)",
1482  FMT_IU( aTrack->GetStart() ).c_str(), FMT_IU( aTrack->GetEnd() ).c_str(),
1483  FMT_IU( aTrack->GetWidth() ).c_str() );
1484 
1485  m_out->Print( 0, " (layer %s)", m_out->Quotew( aTrack->GetLayerName() ).c_str() );
1486  }
1487 
1488  m_out->Print( 0, " (net %d)", m_mapping->Translate( aTrack->GetNetCode() ) );
1489 
1490  if( aTrack->GetTimeStamp() != 0 )
1491  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aTrack->GetTimeStamp() );
1492 
1493  if( aTrack->GetStatus() != 0 )
1494  m_out->Print( 0, " (status %X)", aTrack->GetStatus() );
1495 
1496  m_out->Print( 0, ")\n" );
1497 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:198
BOARD_ITEM_CONTAINER * GetParent() const
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
STATUS_FLAGS GetStatus() const
Definition: base_struct.h:250
int GetDrill() const
Function GetDrill returns the local drill setting for this VIA.
Definition: class_track.h:454
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:118
PCB_LAYER_ID
A quick note on layer IDs:
VIATYPE_T GetViaType() const
Definition: class_track.h:439
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:121
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Function GetLayerName returns the name of a layer given by aLayer.
#define FMT_IU
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:486
#define THROW_IO_ERROR(x)
Definition: utf8.cpp:60
#define UNDEFINED_DRILL_DIAMETER
Definition: class_track.h:58
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...
time_t GetTimeStamp() const
Definition: base_struct.h:204
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:115
BOARD * m_board
which BOARD, no ownership here
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:108
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:408
void PCB_IO::format ( ZONE_CONTAINER aZone,
int  aNestLevel = 0 
) const
private

Definition at line 1500 of file kicad_plugin.cpp.

References SHAPE_POLY_SET::CIterate(), ZONE_CONTAINER::DIAGONAL_EDGE, ZONE_CONTAINER::DIAGONAL_FULL, ZONE_CONTAINER::FillSegments(), FMT_IU, Format(), formatLayer(), 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::GetMinThickness(), BOARD_CONNECTED_ITEM::GetNetCode(), BOARD_CONNECTED_ITEM::GetNetname(), ZONE_CONTAINER::GetNumCorners(), ZONE_CONTAINER::GetPadConnection(), ZONE_CONTAINER::GetPriority(), ZONE_CONTAINER::GetThermalReliefCopperBridge(), ZONE_CONTAINER::GetThermalReliefGap(), EDA_ITEM::GetTimeStamp(), ZONE_CONTAINER::GetZoneClearance(), SHAPE_POLY_SET::IsEmpty(), ZONE_CONTAINER::IsFilled(), ZONE_CONTAINER::IterateWithHoles(), m_mapping, m_out, ZONE_CONTAINER::NO_HATCH, PAD_ZONE_CONN_FULL, PAD_ZONE_CONN_NONE, PAD_ZONE_CONN_THERMAL, PAD_ZONE_CONN_THT_THERMAL, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), ZONE_SETTINGS::SMOOTHING_CHAMFER, ZONE_SETTINGS::SMOOTHING_FILLET, ZONE_SETTINGS::SMOOTHING_NONE, THROW_IO_ERROR, and NETINFO_MAPPING::Translate().

1501 {
1502  // Save the NET info; For keepout zones, net code and net name are irrelevant
1503  // so be sure a dummy value is stored, just for ZONE_CONTAINER compatibility
1504  // (perhaps netcode and netname should be not stored)
1505  m_out->Print( aNestLevel, "(zone (net %d) (net_name %s)",
1506  aZone->GetIsKeepout() ? 0 : m_mapping->Translate( aZone->GetNetCode() ),
1507  m_out->Quotew( aZone->GetIsKeepout() ? wxT("") : aZone->GetNetname() ).c_str() );
1508 
1509  formatLayer( aZone );
1510 
1511  m_out->Print( 0, " (tstamp %lX)", (unsigned long) aZone->GetTimeStamp() );
1512 
1513  // Save the outline aux info
1514  std::string hatch;
1515 
1516  switch( aZone->GetHatchStyle() )
1517  {
1518  default:
1519  case ZONE_CONTAINER::NO_HATCH: hatch = "none"; break;
1520  case ZONE_CONTAINER::DIAGONAL_EDGE: hatch = "edge"; break;
1521  case ZONE_CONTAINER::DIAGONAL_FULL: hatch = "full"; break;
1522  }
1523 
1524  m_out->Print( 0, " (hatch %s %s)\n", hatch.c_str(),
1525  FMT_IU( aZone->GetHatchPitch() ).c_str() );
1526 
1527  if( aZone->GetPriority() > 0 )
1528  m_out->Print( aNestLevel+1, "(priority %d)\n", aZone->GetPriority() );
1529 
1530  m_out->Print( aNestLevel+1, "(connect_pads" );
1531 
1532  switch( aZone->GetPadConnection() )
1533  {
1534  default:
1535  case PAD_ZONE_CONN_THERMAL: // Default option not saved or loaded.
1536  break;
1537 
1539  m_out->Print( 0, " thru_hole_only" );
1540  break;
1541 
1542  case PAD_ZONE_CONN_FULL:
1543  m_out->Print( 0, " yes" );
1544  break;
1545 
1546  case PAD_ZONE_CONN_NONE:
1547  m_out->Print( 0, " no" );
1548  break;
1549  }
1550 
1551  m_out->Print( 0, " (clearance %s))\n",
1552  FMT_IU( aZone->GetZoneClearance() ).c_str() );
1553 
1554  m_out->Print( aNestLevel+1, "(min_thickness %s)\n",
1555  FMT_IU( aZone->GetMinThickness() ).c_str() );
1556 
1557  if( aZone->GetIsKeepout() )
1558  {
1559  m_out->Print( aNestLevel+1, "(keepout (tracks %s) (vias %s) (copperpour %s))\n",
1560  aZone->GetDoNotAllowTracks() ? "not_allowed" : "allowed",
1561  aZone->GetDoNotAllowVias() ? "not_allowed" : "allowed",
1562  aZone->GetDoNotAllowCopperPour() ? "not_allowed" : "allowed" );
1563  }
1564 
1565  m_out->Print( aNestLevel+1, "(fill" );
1566 
1567  // Default is not filled.
1568  if( aZone->IsFilled() )
1569  m_out->Print( 0, " yes" );
1570 
1571  // Default is polygon filled.
1572  if( aZone->GetFillMode() )
1573  m_out->Print( 0, " (mode segment)" );
1574 
1575  m_out->Print( 0, " (arc_segments %d) (thermal_gap %s) (thermal_bridge_width %s)",
1576  aZone->GetArcSegmentCount(),
1577  FMT_IU( aZone->GetThermalReliefGap() ).c_str(),
1578  FMT_IU( aZone->GetThermalReliefCopperBridge() ).c_str() );
1579 
1581  {
1582  m_out->Print( 0, " (smoothing" );
1583 
1584  switch( aZone->GetCornerSmoothingType() )
1585  {
1587  m_out->Print( 0, " chamfer" );
1588  break;
1589 
1591  m_out->Print( 0, " fillet" );
1592  break;
1593 
1594  default:
1595  THROW_IO_ERROR( wxString::Format( _( "unknown zone corner smoothing type %d" ),
1596  aZone->GetCornerSmoothingType() ) );
1597  }
1598  m_out->Print( 0, ")" );
1599 
1600  if( aZone->GetCornerRadius() != 0 )
1601  m_out->Print( 0, " (radius %s)",
1602  FMT_IU( aZone->GetCornerRadius() ).c_str() );
1603  }
1604 
1605  m_out->Print( 0, ")\n" );
1606 
1607  int newLine = 0;
1608 
1609  if( aZone->GetNumCorners() )
1610  {
1611  bool new_polygon = true;
1612  bool is_closed = false;
1613 
1614  for( auto iterator = aZone->IterateWithHoles(); iterator; iterator++ )
1615  {
1616  if( new_polygon )
1617  {
1618  newLine = 0;
1619  m_out->Print( aNestLevel+1, "(polygon\n" );
1620  m_out->Print( aNestLevel+2, "(pts\n" );
1621  new_polygon = false;
1622  is_closed = false;
1623  }
1624 
1625  if( newLine == 0 )
1626  m_out->Print( aNestLevel+3, "(xy %s %s)",
1627  FMT_IU( iterator->x ).c_str(), FMT_IU( iterator->y ).c_str() );
1628  else
1629  m_out->Print( 0, " (xy %s %s)",
1630  FMT_IU( iterator->x ).c_str(), FMT_IU( iterator->y ).c_str() );
1631 
1632  if( newLine < 4 )
1633  {
1634  newLine += 1;
1635  }
1636  else
1637  {
1638  newLine = 0;
1639  m_out->Print( 0, "\n" );
1640  }
1641 
1642  if( iterator.IsEndContour() )
1643  {
1644  is_closed = true;
1645 
1646  if( newLine != 0 )
1647  m_out->Print( 0, "\n" );
1648 
1649  m_out->Print( aNestLevel+2, ")\n" );
1650  m_out->Print( aNestLevel+1, ")\n" );
1651  new_polygon = true;
1652  }
1653  }
1654 
1655  if( !is_closed ) // Should not happen, but...
1656  m_out->Print( aNestLevel+1, ")\n" );
1657 
1658  }
1659 
1660  // Save the PolysList (filled areas)
1661  const SHAPE_POLY_SET& fv = aZone->GetFilledPolysList();
1662  newLine = 0;
1663 
1664  if( !fv.IsEmpty() )
1665  {
1666  bool new_polygon = true;
1667  bool is_closed = false;
1668 
1669  for( auto it = fv.CIterate(); it; ++it )
1670  {
1671  if( new_polygon )
1672  {
1673  newLine = 0;
1674  m_out->Print( aNestLevel+1, "(filled_polygon\n" );
1675  m_out->Print( aNestLevel+2, "(pts\n" );
1676  new_polygon = false;
1677  is_closed = false;
1678  }
1679 
1680  if( newLine == 0 )
1681  m_out->Print( aNestLevel+3, "(xy %s %s)",
1682  FMT_IU( it->x ).c_str(), FMT_IU( it->y ).c_str() );
1683  else
1684  m_out->Print( 0, " (xy %s %s)",
1685  FMT_IU( it->x ) .c_str(), FMT_IU( it->y ).c_str() );
1686 
1687  if( newLine < 4 )
1688  {
1689  newLine += 1;
1690  }
1691  else
1692  {
1693  newLine = 0;
1694  m_out->Print( 0, "\n" );
1695  }
1696 
1697  if( it.IsEndContour() )
1698  {
1699  is_closed = true;
1700 
1701  if( newLine != 0 )
1702  m_out->Print( 0, "\n" );
1703 
1704  m_out->Print( aNestLevel+2, ")\n" );
1705  m_out->Print( aNestLevel+1, ")\n" );
1706  new_polygon = true;
1707  }
1708  }
1709 
1710  if( !is_closed ) // Should not happen, but...
1711  m_out->Print( aNestLevel+1, ")\n" );
1712  }
1713 
1714  // Save the filling segments list
1715  const std::vector< SEGMENT >& segs = aZone->FillSegments();
1716 
1717  if( segs.size() )
1718  {
1719  m_out->Print( aNestLevel+1, "(fill_segments\n" );
1720 
1721  for( std::vector< SEGMENT >::const_iterator it = segs.begin(); it != segs.end(); ++it )
1722  {
1723  m_out->Print( aNestLevel+2, "(pts (xy %s) (xy %s))\n",
1724  FMT_IU( it->m_Start ).c_str(),
1725  FMT_IU( it->m_End ).c_str() );
1726  }
1727 
1728  m_out->Print( aNestLevel+1, ")\n" );
1729  }
1730 
1731  m_out->Print( aNestLevel, ")\n" );
1732 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
int GetNumCorners(void) const
Access to m_Poly parameters.
Definition: class_zone.h:465
int GetMinThickness() const
Definition: class_zone.h:209
bool GetDoNotAllowCopperPour() const
Definition: class_zone.h:655
int GetArcSegmentCount() const
Definition: class_zone.h:198
bool IsFilled() const
Definition: class_zone.h:200
CONST_ITERATOR CIterate(int aFirst, int aLast, bool aIterateHoles=false) const
void formatLayer(const BOARD_ITEM *aItem) const
int GetCornerSmoothingType() const
Definition: class_zone.h:612
int GetThermalReliefCopperBridge(D_PAD *aPad=NULL) const
Definition: class_zone.cpp:467
unsigned int GetCornerRadius() const
Definition: class_zone.h:616
Pads are not covered.
Definition: zones.h:57
bool GetIsKeepout() const
Accessors to parameters used in Keepout zones:
Definition: class_zone.h:654
std::vector< SEGMENT > & FillSegments()
Definition: class_zone.h:244
ZoneConnection GetPadConnection(D_PAD *aPad=NULL) const
Definition: class_zone.cpp:815
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:458
#define FMT_IU
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:486
#define THROW_IO_ERROR(x)
Definition: utf8.cpp:60
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:582
Thermal relief only for THT pads.
Definition: zones.h:60
time_t GetTimeStamp() const
Definition: base_struct.h:204
int GetNetCode() const
Function GetNetCode.
bool GetDoNotAllowTracks() const
Definition: class_zone.h:657
int GetFillMode() const
Definition: class_zone.h:186
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:656
SHAPE_POLY_SET::ITERATOR IterateWithHoles()
Function IterateWithHoles returns an iterator to visit all points of the zone's main outline with hol...
Definition: class_zone.h:485
HATCH_STYLE GetHatchStyle() const
Definition: class_zone.h:549
int GetHatchPitch() const
Hatch related methods.
Definition: class_zone.cpp:915
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:408
unsigned GetPriority() const
Function GetPriority.
Definition: class_zone.h:119
Use thermal relief for pads.
Definition: zones.h:58
int GetZoneClearance() const
Definition: class_zone.h:203
pads are covered by copper
Definition: zones.h:59
void PCB_IO::formatLayer ( const BOARD_ITEM aItem) const
private

Definition at line 516 of file kicad_plugin.cpp.

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

Referenced by format().

517 {
518  if( m_ctl & CTL_STD_LAYER_NAMES )
519  {
520  PCB_LAYER_ID layer = aItem->GetLayer();
521 
522  // English layer names should never need quoting.
523  m_out->Print( 0, " (layer %s)", TO_UTF8( BOARD::GetStandardLayerName( layer ) ) );
524  }
525  else
526  m_out->Print( 0, " (layer %s)", m_out->Quotew( aItem->GetLayerName() ).c_str() );
527 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
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:486
PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
#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:408
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:649
void PCB_IO::formatLayers ( LSET  aLayerMask,
int  aNestLevel = 0 
) const
private

Definition at line 1138 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::GetEnabledLayers(), BOARD::GetLayerName(), BOARD::GetStandardLayerName(), m_board, m_ctl, m_out, PCB_LAYER_ID_COUNT, OUTPUTFORMATTER::Print(), and OUTPUTFORMATTER::Quotew().

Referenced by format().

1139 {
1140  std::string output;
1141 
1142  if( aNestLevel == 0 )
1143  output += ' ';
1144 
1145  output += "(layers";
1146 
1147  static const LSET cu_all( LSET::AllCuMask() );
1148  static const LSET fr_bk( 2, B_Cu, F_Cu );
1149  static const LSET adhes( 2, B_Adhes, F_Adhes );
1150  static const LSET paste( 2, B_Paste, F_Paste );
1151  static const LSET silks( 2, B_SilkS, F_SilkS );
1152  static const LSET mask( 2, B_Mask, F_Mask );
1153  static const LSET crt_yd(2, B_CrtYd, F_CrtYd );
1154  static const LSET fab( 2, B_Fab, F_Fab );
1155 
1156  LSET cu_mask = cu_all;
1157 
1158  if( m_board )
1159  cu_mask &= m_board->GetEnabledLayers();
1160 
1161  // output copper layers first, then non copper
1162 
1163  if( ( aLayerMask & cu_mask ) == cu_mask )
1164  {
1165  output += " *.Cu";
1166  aLayerMask &= ~cu_all; // clear bits, so they are not output again below
1167  }
1168  else if( ( aLayerMask & cu_mask ) == fr_bk )
1169  {
1170  output += " F&B.Cu";
1171  aLayerMask &= ~fr_bk;
1172  }
1173 
1174  if( ( aLayerMask & adhes ) == adhes )
1175  {
1176  output += " *.Adhes";
1177  aLayerMask &= ~adhes;
1178  }
1179 
1180  if( ( aLayerMask & paste ) == paste )
1181  {
1182  output += " *.Paste";
1183  aLayerMask &= ~paste;
1184  }
1185 
1186  if( ( aLayerMask & silks ) == silks )
1187  {
1188  output += " *.SilkS";
1189  aLayerMask &= ~silks;
1190  }
1191 
1192  if( ( aLayerMask & mask ) == mask )
1193  {
1194  output += " *.Mask";
1195  aLayerMask &= ~mask;
1196  }
1197 
1198  if( ( aLayerMask & crt_yd ) == crt_yd )
1199  {
1200  output += " *.CrtYd";
1201  aLayerMask &= ~crt_yd;
1202  }
1203 
1204  if( ( aLayerMask & fab ) == fab )
1205  {
1206  output += " *.Fab";
1207  aLayerMask &= ~fab;
1208  }
1209 
1210  // output any individual layers not handled in wildcard combos above
1211 
1212  if( m_board )
1213  aLayerMask &= m_board->GetEnabledLayers();
1214 
1215  wxString layerName;
1216 
1217  for( LAYER_NUM layer = 0; layer < PCB_LAYER_ID_COUNT; ++layer )
1218  {
1219  if( aLayerMask[layer] )
1220  {
1221  if( m_board && !( m_ctl & CTL_STD_LAYER_NAMES ) )
1222  layerName = m_board->GetLayerName( PCB_LAYER_ID( layer ) );
1223 
1224  else // I am being called from FootprintSave()
1225  layerName = BOARD::GetStandardLayerName( PCB_LAYER_ID( layer ) );
1226 
1227  output += ' ';
1228  output += m_out->Quotew( layerName );
1229  }
1230  }
1231 
1232  m_out->Print( aNestLevel, "%s)", output.c_str() );
1233 }
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:639
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
LSET GetEnabledLayers() const
Function GetEnabledLayers is a proxy function that calls the corresponding function in m_BoardSetting...
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:486
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:408
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:649
const wxString PCB_IO::GetFileExtension ( ) const
inlineoverridevirtual

Function GetFileExtension returns the file extension for the PLUGIN.

Implements PLUGIN.

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

102  {
103  // Would have used wildcards_and_files_ext.cpp's KiCadPcbFileExtension,
104  // but to be pure, a plugin should not assume that it will always be linked
105  // with the core of the pcbnew code. (Might someday be a DLL/DSO.) Besides,
106  // file extension policy should be controlled by the plugin.
107  return wxT( "kicad_pcb" );
108  }
std::string PCB_IO::GetStringOutput ( bool  doClear)
inline

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

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

Referenced by MODULE_EDITOR_TOOLS::CopyItems(), FOOTPRINT_EDIT_FRAME::Export_Module(), and FOOTPRINT_EDIT_FRAME::retainLastFootprint().

151  {
152  std::string ret = m_sf.GetString();
153  if( doClear )
154  m_sf.Clear();
155 
156  return ret;
157  }
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 1798 of file kicad_plugin.cpp.

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

Referenced by FootprintDelete(), FootprintEnumerate(), FootprintLibCreate(), FootprintLoad(), FootprintSave(), IsFootprintLibWritable(), Load(), PCB_IO(), and Save().

1799 {
1800  m_board = NULL;
1801  m_reader = NULL;
1803  m_props = aProperties;
1804 }
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 2067 of file kicad_plugin.cpp.

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

Referenced by GITHUB_PLUGIN::IsFootprintLibWritable().

2068 {
2069  LOCALE_IO toggle;
2070 
2071  init( NULL );
2072 
2073  cacheLib( aLibraryPath );
2074 
2075  return m_cache->IsWritable();
2076 }
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)
bool IsWritable() const
void cacheLib(const wxString &aLibraryPath, const wxString &aFootprintName=wxEmptyString)
we only cache one footprint library, this determines which one.
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 1754 of file kicad_plugin.cpp.

References DSNLEXER::CurLine(), DSNLEXER::CurLineNumber(), DSNLEXER::CurOffset(), DSNLEXER::CurSource(), PCB_PARSER::GetRequiredVersion(), init(), PCB_PARSER::IsTooRecent(), m_parser, PCB_PARSER::Parse(), PCB_PARSER::SetBoard(), BOARD::SetFileName(), PCB_PARSER::SetLineReader(), and THROW_PARSE_ERROR.

1755 {
1756  FILE_LINE_READER reader( aFileName );
1757 
1758  init( aProperties );
1759 
1760  m_parser->SetLineReader( &reader );
1761  m_parser->SetBoard( aAppendToMe );
1762 
1763  BOARD* board;
1764 
1765  try
1766  {
1767  board = dynamic_cast<BOARD*>( m_parser->Parse() );
1768  }
1769  catch( const FUTURE_FORMAT_ERROR& )
1770  {
1771  // Don't wrap a FUTURE_FORMAT_ERROR in another
1772  throw;
1773  }
1774  catch( const PARSE_ERROR& parse_error )
1775  {
1776  if( m_parser->IsTooRecent() )
1777  throw FUTURE_FORMAT_ERROR( parse_error, m_parser->GetRequiredVersion() );
1778  else
1779  throw;
1780  }
1781 
1782  if( !board )
1783  {
1784  // The parser loaded something that was valid, but wasn't a board.
1785  THROW_PARSE_ERROR( _( "this file does not contain a PCB" ),
1788  }
1789 
1790  // Give the filename to the board if it's new
1791  if( !aAppendToMe )
1792  board->SetFileName( aFileName );
1793 
1794  return board;
1795 }
void init(const PROPERTIES *aProperties)
const wxString & CurSource()
Function CurFilename returns the current LINE_READER source.
Definition: dsnlexer.h:528
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:303
int CurOffset()
Function CurOffset returns the byte offset within the current line, using a 1 based index...
Definition: dsnlexer.h:538
void SetFileName(const wxString &aFileName)
Definition: class_board.h:232
PCB_PARSER * m_parser
BOARD_ITEM * Parse()
Definition: pcb_parser.cpp:405
LINE_READER * SetLineReader(LINE_READER *aReader)
Function SetLineReader sets aLineReader into the parser, and returns the previous one...
Definition: pcb_parser.h:296
const char * CurLine()
Function CurLine returns the current line of text, from which the CurText() would return its token...
Definition: dsnlexer.h:517
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'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
int CurLineNumber()
Function CurLineNumber returns the current line number within my LINE_READER.
Definition: dsnlexer.h:507
Struct FUTURE_FORMAT_ERROR variant of PARSE_ERROR indicating that a syntax or related error was likel...
Definition: ki_exception.h:143
BOARD_ITEM * PCB_IO::Parse ( const wxString &  aClipboardSourceInput)

Definition at line 437 of file kicad_plugin.cpp.

References PCB_PARSER::GetRequiredVersion(), PCB_PARSER::IsTooRecent(), m_parser, PCB_PARSER::Parse(), PCB_PARSER::SetLineReader(), and TO_UTF8.

Referenced by parse_module_kicad(), MODULE_EDITOR_TOOLS::PasteItems(), and FOOTPRINT_EDIT_FRAME::restoreLastFootprint().

438 {
439  std::string input = TO_UTF8( aClipboardSourceInput );
440 
441  STRING_LINE_READER reader( input, wxT( "clipboard" ) );
442 
443  m_parser->SetLineReader( &reader );
444 
445  try
446  {
447  return m_parser->Parse();
448  }
449  catch( const PARSE_ERROR& parse_error )
450  {
451  if( m_parser->IsTooRecent() )
452  throw FUTURE_FORMAT_ERROR( parse_error, m_parser->GetRequiredVersion() );
453  else
454  throw;
455  }
456 }
#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:405
LINE_READER * SetLineReader(LINE_READER *aReader)
Function SetLineReader sets aLineReader into the parser, and returns the previous one...
Definition: pcb_parser.h:296
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'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 96 of file pcbnew/kicad_plugin.h.

97  {
98  return wxT( "KiCad" );
99  }
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.

Definition at line 413 of file kicad_plugin.cpp.

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

414 {
415  LOCALE_IO toggle; // toggles on, then off, the C locale.
416 
417  init( aProperties );
418 
419  m_board = aBoard; // after init()
420 
421  // Prepare net mapping that assures that net codes saved in a file are consecutive integers
422  m_mapping->SetBoard( aBoard );
423 
424  FILE_OUTPUTFORMATTER formatter( aFileName );
425 
426  m_out = &formatter; // no ownership
427 
428  m_out->Print( 0, "(kicad_pcb (version %d) (host pcbnew %s)\n", SEXPR_BOARD_FILE_VERSION,
429  formatter.Quotew( GetBuildVersion() ).c_str() );
430 
431  Format( aBoard, 1 );
432 
433  m_out->Print( 0, ")\n" );
434 }
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.
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:408
void PCB_IO::SetOutputFormatter ( OUTPUTFORMATTER aFormatter)
inline

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

References m_out.

Referenced by FP_CACHE::Save().

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

Friends And Related Function Documentation

friend class FP_CACHE
friend

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

Referenced by cacheLib(), and FootprintLibCreate().

Member Data Documentation

BOARD* PCB_IO::m_board
protected

which BOARD, no ownership here

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

Referenced by format(), formatLayers(), init(), and Save().

int PCB_IO::m_ctl
protected

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

Referenced by FootprintSave(), format(), formatLayer(), and formatLayers().

wxString PCB_IO::m_error
protected

for throwing exceptions

Definition at line 165 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 173 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 175 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 181 of file pcbnew/kicad_plugin.h.

Referenced by format(), Save(), and ~PCB_IO().

OUTPUTFORMATTER* PCB_IO::m_out
protected

output any Format()s to this, no ownership

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

Referenced by format(), formatLayer(), formatLayers(), PCB_IO(), Save(), and SetOutputFormatter().

PCB_PARSER* PCB_IO::m_parser
protected
const PROPERTIES* PCB_IO::m_props
protected

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

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

Referenced by init().

LINE_READER* PCB_IO::m_reader
protected

no ownership here.

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

Referenced by init().

STRING_FORMATTER PCB_IO::m_sf
protected

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

Referenced by GetStringOutput(), and PCB_IO().


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