KiCad PCB EDA Suite
PCB_IO Class Reference

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

#include <kicad_plugin.h>

Inheritance diagram for PCB_IO:
PLUGIN CLIPBOARD_IO GITHUB_PLUGIN

Public Member Functions

const wxString PluginName () const override
 Function PluginName returns a brief hard coded name for this PLUGIN. More...
 
const wxString GetFileExtension () const override
 Function GetFileExtension returns the file extension for the PLUGIN. More...
 
virtual void Save (const wxString &aFileName, BOARD *aBoard, const PROPERTIES *aProperties=NULL) override
 Function Save will write aBoard to a storage file in a format that this PLUGIN implementation knows about, or it can be used to write a portion of aBoard to a special kind of export file. More...
 
BOARDLoad (const wxString &aFileName, BOARD *aAppendToMe, const PROPERTIES *aProperties=NULL) override
 Function Load loads information from some input file format that this PLUGIN implementation knows about, into either a new BOARD or an existing one. More...
 
void FootprintEnumerate (wxArrayString &aFootprintNames, const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 Return a list of footprint names contained within the library at aLibraryPath. More...
 
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...
 
wxDateTime GetLibModificationTime (const wxString &aLibraryPath) const override
 Return the footprint lib last-mod-time, if available. 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)
 
void formatSetup (BOARD *aBoard, int aNestLevel=0) const
 formats the board setup information More...
 
void formatGeneral (BOARD *aBoard, int aNestLevel=0) const
 formats the General section of the file More...
 
void formatBoardLayers (BOARD *aBoard, int aNestLevel=0) const
 formats the board layer information More...
 
void formatNetInformation (BOARD *aBoard, int aNestLevel=0) const
 formats the Nets and Netclasses More...
 
void formatHeader (BOARD *aBoard, int aNestLevel=0) const
 writes everything that comes before the board_items, like settings and layers etc More...
 

Protected Attributes

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

Private Member Functions

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

Friends

class FP_CACHE
 

Detailed Description

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

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

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

Constructor & Destructor Documentation

PCB_IO::PCB_IO ( int  aControlFlags = CTL_FOR_BOARD)

Definition at line 1886 of file kicad_plugin.cpp.

References init(), m_out, and m_sf.

Referenced by GetFileExtension().

1886  :
1887  m_cache( 0 ),
1888  m_ctl( aControlFlags ),
1889  m_parser( new PCB_PARSER() ),
1890  m_mapping( new NETINFO_MAPPING() )
1891 {
1892  init( 0 );
1893  m_out = &m_sf;
1894 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
FP_CACHE * m_cache
Footprint library cache.
Class PCB_PARSER reads a Pcbnew s-expression formatted LINE_READER object and returns the appropriate...
Definition: pcb_parser.h:65
void init(const PROPERTIES *aProperties)
PCB_PARSER * m_parser
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes ...
STRING_FORMATTER m_sf
PCB_IO::~PCB_IO ( )

Definition at line 1897 of file kicad_plugin.cpp.

References m_cache, m_mapping, and m_parser.

Referenced by GetFileExtension().

1898 {
1899  delete m_cache;
1900  delete m_parser;
1901  delete m_mapping;
1902 }
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 1958 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().

1959 {
1960  if( !m_cache || m_cache->IsModified( aLibraryPath, aFootprintName ) )
1961  {
1962  // a spectacular episode in memory management:
1963  delete m_cache;
1964  m_cache = new FP_CACHE( this, aLibraryPath );
1965  m_cache->Load();
1966  }
1967 }
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 2100 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(), and GetFileExtension().

2101 {
2102  LOCALE_IO toggle; // toggles on, then off, the C locale.
2103 
2104  init( aProperties );
2105 
2106  cacheLib( aLibraryPath );
2107 
2108  if( !m_cache->IsWritable() )
2109  {
2110  THROW_IO_ERROR( wxString::Format( _( "Library \"%s\" is read only" ),
2111  aLibraryPath.GetData() ) );
2112  }
2113 
2114  m_cache->Remove( aFootprintName );
2115 }
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)
bool IsWritable() const
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
void 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 1970 of file kicad_plugin.cpp.

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

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

1973 {
1974  LOCALE_IO toggle; // toggles on, then off, the C locale.
1975  wxDir dir( aLibraryPath );
1976 
1977  init( aProperties );
1978 
1979  wxString errorMsg;
1980 
1981  try
1982  {
1983  cacheLib( aLibraryPath );
1984  }
1985  catch( const IO_ERROR& ioe )
1986  {
1987  errorMsg = ioe.What();
1988  }
1989 
1990  // Some of the files may have been parsed correctly so we want to add the valid files to
1991  // the library.
1992 
1993  const MODULE_MAP& mods = m_cache->GetModules();
1994 
1995  for( MODULE_CITER it = mods.begin(); it != mods.end(); ++it )
1996  {
1997  aFootprintNames.Add( it->first );
1998  }
1999 
2000  if( !errorMsg.IsEmpty() )
2001  THROW_IO_ERROR( errorMsg );
2002 }
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< wxString, MODULE * > MODULE_MAP
Definition: eagle_plugin.h:36
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:33
MODULE_MAP::const_iterator MODULE_CITER
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:47
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
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 2128 of file kicad_plugin.cpp.

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

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

2129 {
2130  if( wxDir::Exists( aLibraryPath ) )
2131  {
2132  THROW_IO_ERROR( wxString::Format( _( "cannot overwrite library path \"%s\"" ),
2133  aLibraryPath.GetData() ) );
2134  }
2135 
2136  LOCALE_IO toggle;
2137 
2138  init( aProperties );
2139 
2140  delete m_cache;
2141  m_cache = new FP_CACHE( this, aLibraryPath );
2142  m_cache->Save();
2143 }
friend class FP_CACHE
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
void Save()
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
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
bool PCB_IO::FootprintLibDelete ( const wxString &  aLibraryPath,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Function FootprintLibDelete deletes an existing footprint library and returns true, or if library does not exist returns false, or throws an exception if library exists but is read only or cannot be deleted for some other reason.

Parameters
aLibraryPathis a locator for the "library", usually a directory or file which will contain footprints.
aPropertiesis an associative array that can be used to tell the library delete implementation function anything special, because it can take any number of additional named tuning arguments that the plugin is known to support. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Returns
bool - true if library deleted, false if library did not exist.
Exceptions
IO_ERRORif there is a problem deleting an existing library.

Reimplemented from PLUGIN.

Definition at line 2146 of file kicad_plugin.cpp.

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

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

2147 {
2148  wxFileName fn;
2149  fn.SetPath( aLibraryPath );
2150 
2151  // Return if there is no library path to delete.
2152  if( !fn.DirExists() )
2153  return false;
2154 
2155  if( !fn.IsDirWritable() )
2156  {
2157  THROW_IO_ERROR( wxString::Format( _( "user does not have permission to delete directory \"%s\"" ),
2158  aLibraryPath.GetData() ) );
2159  }
2160 
2161  wxDir dir( aLibraryPath );
2162 
2163  if( dir.HasSubDirs() )
2164  {
2165  THROW_IO_ERROR( wxString::Format( _( "library directory \"%s\" has unexpected sub-directories" ),
2166  aLibraryPath.GetData() ) );
2167  }
2168 
2169  // All the footprint files must be deleted before the directory can be deleted.
2170  if( dir.HasFiles() )
2171  {
2172  unsigned i;
2173  wxFileName tmp;
2174  wxArrayString files;
2175 
2176  wxDir::GetAllFiles( aLibraryPath, &files );
2177 
2178  for( i = 0; i < files.GetCount(); i++ )
2179  {
2180  tmp = files[i];
2181 
2182  if( tmp.GetExt() != KiCadFootprintFileExtension )
2183  {
2184  THROW_IO_ERROR( wxString::Format( _( "unexpected file \"%s\" was found in library path \"%s\"" ),
2185  files[i].GetData(), aLibraryPath.GetData() ) );
2186  }
2187  }
2188 
2189  for( i = 0; i < files.GetCount(); i++ )
2190  {
2191  wxRemoveFile( files[i] );
2192  }
2193  }
2194 
2195  wxLogTrace( traceFootprintLibrary, wxT( "Removing footprint library \"%s\"" ),
2196  aLibraryPath.GetData() );
2197 
2198  // Some of the more elaborate wxRemoveFile() crap puts up its own wxLog dialog
2199  // we don't want that. we want bare metal portability with no UI here.
2200  if( !wxRmdir( aLibraryPath ) )
2201  {
2202  THROW_IO_ERROR( wxString::Format( _( "footprint library \"%s\" cannot be deleted" ),
2203  aLibraryPath.GetData() ) );
2204  }
2205 
2206  // For some reason removing a directory in Windows is not immediately updated. This delay
2207  // prevents an error when attempting to immediately recreate the same directory when over
2208  // writing an existing library.
2209 #ifdef __WINDOWS__
2210  wxMilliSleep( 250L );
2211 #endif
2212 
2213  if( m_cache && !m_cache->IsPath( aLibraryPath ) )
2214  {
2215  delete m_cache;
2216  m_cache = NULL;
2217  }
2218 
2219  return true;
2220 }
FP_CACHE * m_cache
Footprint library cache.
const wxString KiCadFootprintFileExtension
bool IsPath(const wxString &aPath) const
Function IsPath checks if aPath is the same as the current cache path.
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
static const wxString traceFootprintLibrary
Flag to enable KiCad PCB plugin debug output.
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
void PLUGIN::FootprintLibOptions ( PROPERTIES aListToAppendTo) const
virtualinherited

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

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

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

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

Reimplemented in GITHUB_PLUGIN, and EAGLE_PLUGIN.

Definition at line 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 string that is assuredly encoded in UTF8, and supplies special conversion supp...
Definition: utf8.h:73
MODULE * PCB_IO::FootprintLoad ( const wxString &  aLibraryPath,
const wxString &  aFootprintName,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Function FootprintLoad loads a footprint having aFootprintName from the aLibraryPath containing a library format that this PLUGIN knows about.

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several footprints.
aFootprintNameis the name of the footprint to load.
aPropertiesis an associative array that can be used to tell the loader implementation to do something special, because it can take any number of additional named tuning arguments that the plugin is known to support. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Returns
MODULE* - if found caller owns it, else NULL if not found.
Exceptions
IO_ERRORif the library cannot be found or read. No exception is thrown in the case where aFootprintName cannot be found.

Reimplemented from PLUGIN.

Definition at line 2005 of file kicad_plugin.cpp.

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

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

2007 {
2008  LOCALE_IO toggle; // toggles on, then off, the C locale.
2009 
2010  init( aProperties );
2011 
2012  cacheLib( aLibraryPath, aFootprintName );
2013 
2014  const MODULE_MAP& mods = m_cache->GetModules();
2015 
2016  MODULE_CITER it = mods.find( aFootprintName );
2017 
2018  if( it == mods.end() )
2019  {
2020  return NULL;
2021  }
2022 
2023  // copy constructor to clone the already loaded MODULE
2024  return new MODULE( *it->second->GetModule() );
2025 }
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< wxString, 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 2028 of file kicad_plugin.cpp.

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

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

2030 {
2031  LOCALE_IO toggle; // toggles on, then off, the C locale.
2032 
2033  init( aProperties );
2034 
2035  // In this public PLUGIN API function, we can safely assume it was
2036  // called for saving into a library path.
2038 
2039  cacheLib( aLibraryPath );
2040 
2041  if( !m_cache->IsWritable() )
2042  {
2043  wxString msg = wxString::Format(
2044  _( "Library \"%s\" is read only" ),
2045  GetChars( aLibraryPath )
2046  );
2047 
2048  THROW_IO_ERROR( msg );
2049  }
2050 
2051  wxString footprintName = aFootprint->GetFPID().GetLibItemName();
2052 
2053  MODULE_MAP& mods = m_cache->GetModules();
2054 
2055  // Quietly overwrite module and delete module file from path for any by same name.
2056  wxFileName fn( aLibraryPath, aFootprint->GetFPID().GetLibItemName(),
2058 
2059  if( !fn.IsOk() )
2060  {
2061  THROW_IO_ERROR( wxString::Format( _( "Footprint file name \"%s\" is not valid." ),
2062  GetChars( fn.GetFullPath() ) ) );
2063  }
2064 
2065  if( fn.FileExists() && !fn.IsFileWritable() )
2066  {
2067  THROW_IO_ERROR( wxString::Format( _( "user does not have write permission to delete file \"%s\" " ),
2068  GetChars( fn.GetFullPath() ) ) );
2069  }
2070 
2071  MODULE_CITER it = mods.find( footprintName );
2072 
2073  if( it != mods.end() )
2074  {
2075  wxLogTrace( traceFootprintLibrary, wxT( "Removing footprint library file '%s'." ),
2076  fn.GetFullPath().GetData() );
2077  mods.erase( footprintName );
2078  wxRemoveFile( fn.GetFullPath() );
2079  }
2080 
2081  // I need my own copy for the cache
2082  MODULE* module = new MODULE( *aFootprint );
2083 
2084  // and it's time stamp must be 0, it should have no parent, orientation should
2085  // be zero, and it should be on the front layer.
2086  module->SetTimeStamp( 0 );
2087  module->SetParent( 0 );
2088  module->SetOrientation( 0 );
2089 
2090  if( module->GetLayer() != F_Cu )
2091  module->Flip( module->GetPosition() );
2092 
2093  wxLogTrace( traceFootprintLibrary, wxT( "Creating s-expression footprint file: %s." ),
2094  fn.GetFullPath().GetData() );
2095  mods.insert( footprintName, new FP_CACHE_ITEM( module, fn ) );
2096  m_cache->Save();
2097 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
const wxString KiCadFootprintFileExtension
const LIB_ID & GetFPID() const
Definition: class_module.h:184
const UTF8 & GetLibItemName() const
Definition: lib_id.h:115
std::map< wxString, MODULE * > MODULE_MAP
Definition: eagle_plugin.h:36
Class FP_CACHE_ITEM is helper class for creating a footprint library cache.
bool IsWritable() const
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
static const wxString traceFootprintLibrary
Flag to enable KiCad PCB plugin debug output.
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
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 441 of file kicad_plugin.cpp.

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

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

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

Definition at line 754 of file kicad_plugin.cpp.

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

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

Definition at line 790 of file kicad_plugin.cpp.

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

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

Definition at line 922 of file kicad_plugin.cpp.

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

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

Definition at line 851 of file kicad_plugin.cpp.

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

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

Definition at line 992 of file kicad_plugin.cpp.

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

993 {
994  m_out->Print( aNestLevel, "(target %s (at %s) (size %s)",
995  ( aTarget->GetShape() ) ? "x" : "plus",
996  FMT_IU( aTarget->GetPosition() ).c_str(),
997  FMT_IU( aTarget->GetSize() ).c_str() );
998 
999  if( aTarget->GetWidth() != 0 )
1000  m_out->Print( 0, " (width %s)", FMT_IU( aTarget->GetWidth() ).c_str() );
1001 
1002  formatLayer( aTarget );
1003 
1004  if( aTarget->GetTimeStamp() )
1005  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aTarget->GetTimeStamp() );
1006 
1007  m_out->Print( 0, ")\n" );
1008 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
int GetWidth() const
void formatLayer(const BOARD_ITEM *aItem) const
#define FMT_IU
int GetShape() const
int GetSize() const
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
const wxPoint GetPosition() const override
timestamp_t GetTimeStamp() const
Definition: base_struct.h:233
void PCB_IO::format ( MODULE aModule,
int  aNestLevel = 0 
) const
private

Definition at line 1011 of file kicad_plugin.cpp.

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

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

Definition at line 1277 of file kicad_plugin.cpp.

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

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

Definition at line 1494 of file kicad_plugin.cpp.

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

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

Definition at line 1518 of file kicad_plugin.cpp.

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

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

Definition at line 1578 of file kicad_plugin.cpp.

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

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

Definition at line 1643 of file kicad_plugin.cpp.

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

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

formats the board layer information

Definition at line 651 of file kicad_plugin.cpp.

References B_Adhes, B_CrtYd, B_Fab, B_Mask, B_Paste, B_SilkS, Cmts_User, cu, LSET::CuStack(), DIM, Dwgs_User, Eco1_User, Eco2_User, Edge_Cuts, F_Adhes, F_CrtYd, F_Fab, F_Mask, F_Paste, F_SilkS, BOARD::GetEnabledLayers(), BOARD::GetLayerName(), BOARD::GetLayerType(), BOARD::GetVisibleLayers(), Margin, LSET::Seq(), and LAYER::ShowType().

Referenced by CLIPBOARD_IO::SaveSelection().

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

formats the General section of the file

Definition at line 629 of file kicad_plugin.cpp.

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

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

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

Definition at line 743 of file kicad_plugin.cpp.

744 {
745  formatGeneral( aBoard, aNestLevel );
746  // Layers.
747  formatBoardLayers( aBoard, aNestLevel );
748  // Setup
749  formatSetup( aBoard, aNestLevel );
750  // Save net codes and names
751  formatNetInformation( aBoard, aNestLevel );
752 }
void formatGeneral(BOARD *aBoard, int aNestLevel=0) const
formats the General section of the file
void formatBoardLayers(BOARD *aBoard, int aNestLevel=0) const
formats the board layer information
void formatNetInformation(BOARD *aBoard, int aNestLevel=0) const
formats the Nets and Netclasses
void formatSetup(BOARD *aBoard, int aNestLevel=0) const
formats the board setup information
void PCB_IO::formatLayer ( const BOARD_ITEM aItem) const
private

Definition at line 498 of file kicad_plugin.cpp.

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

499 {
500  if( m_ctl & CTL_STD_LAYER_NAMES )
501  {
502  PCB_LAYER_ID layer = aItem->GetLayer();
503 
504  // English layer names should never need quoting.
505  m_out->Print( 0, " (layer %s)", TO_UTF8( BOARD::GetStandardLayerName( layer ) ) );
506  }
507  else
508  m_out->Print( 0, " (layer %s)", m_out->Quotew( aItem->GetLayerName() ).c_str() );
509 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
virtual PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
wxString GetLayerName() const
Function GetLayerName returns the name of the PCB layer on which the item resides.
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes...
Definition: macros.h:47
PCB_LAYER_ID
A quick note on layer IDs:
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
#define CTL_STD_LAYER_NAMES
Use English Standard layer names.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
static wxString GetStandardLayerName(PCB_LAYER_ID aLayerId)
Function GetStandardLayerName returns an "English Standard" name of a PCB layer when given aLayerNumb...
Definition: class_board.h:647
void PCB_IO::formatLayers ( LSET  aLayerMask,
int  aNestLevel = 0 
) const
private

Definition at line 1179 of file kicad_plugin.cpp.

References LSET::AllCuMask(), B_Adhes, B_CrtYd, B_Cu, B_Fab, B_Mask, B_Paste, B_SilkS, CTL_STD_LAYER_NAMES, F_Adhes, F_CrtYd, F_Cu, F_Fab, F_Mask, F_Paste, F_SilkS, BOARD::GetStandardLayerName(), and PCB_LAYER_ID_COUNT.

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

formats the Nets and Netclasses

Definition at line 713 of file kicad_plugin.cpp.

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

Referenced by CLIPBOARD_IO::SaveSelection().

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

formats the board setup information

Definition at line 511 of file kicad_plugin.cpp.

References Double2Str(), FMT_IU, PCB_PLOT_PARAMS::Format(), BOARD::GetAuxOrigin(), BOARD_DESIGN_SETTINGS::GetCurrentTrackWidth(), BOARD_DESIGN_SETTINGS::GetDefault(), BOARD::GetDesignSettings(), D_PAD::GetDrillSize(), BOARD::GetGridOrigin(), BOARD::GetPlotOptions(), D_PAD::GetSize(), BOARD_DESIGN_SETTINGS::GetVisibleElements(), BOARD::GetZoneSettings(), BOARD_DESIGN_SETTINGS::m_BlindBuriedViaAllowed, BOARD_DESIGN_SETTINGS::m_DrawSegmentWidth, BOARD_DESIGN_SETTINGS::m_EdgeSegmentWidth, BOARD_DESIGN_SETTINGS::m_MicroViasAllowed, BOARD_DESIGN_SETTINGS::m_MicroViasMinDrill, BOARD_DESIGN_SETTINGS::m_MicroViasMinSize, BOARD_DESIGN_SETTINGS::m_ModuleSegmentWidth, BOARD_DESIGN_SETTINGS::m_ModuleTextSize, BOARD_DESIGN_SETTINGS::m_ModuleTextWidth, BOARD_DESIGN_SETTINGS::m_Pad_Master, BOARD_DESIGN_SETTINGS::m_PcbTextSize, BOARD_DESIGN_SETTINGS::m_PcbTextWidth, BOARD_DESIGN_SETTINGS::m_SolderMaskMargin, BOARD_DESIGN_SETTINGS::m_SolderMaskMinWidth, BOARD_DESIGN_SETTINGS::m_SolderPasteMargin, BOARD_DESIGN_SETTINGS::m_SolderPasteMarginRatio, BOARD_DESIGN_SETTINGS::m_TrackMinWidth, BOARD_DESIGN_SETTINGS::m_TrackWidthList, BOARD_DESIGN_SETTINGS::m_ViasDimensionsList, BOARD_DESIGN_SETTINGS::m_ViasMinDrill, BOARD_DESIGN_SETTINGS::m_ViasMinSize, ZONE_SETTINGS::m_Zone_45_Only, ZONE_SETTINGS::m_ZoneClearance, wxPoint::x, and wxPoint::y.

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

Function GetFileExtension returns the file extension for the PLUGIN.

Implements PLUGIN.

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

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

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

Return the footprint lib last-mod-time, if available.

Reimplemented from PLUGIN.

Definition at line 2119 of file kicad_plugin.cpp.

References FP_CACHE::GetLibModificationTime(), and m_cache.

Referenced by GetFileExtension().

2120 {
2121  if( !m_cache )
2122  return wxDateTime::Now(); // force a load
2123 
2124  return m_cache->GetLibModificationTime();
2125 }
FP_CACHE * m_cache
Footprint library cache.
wxDateTime GetLibModificationTime() const
std::string PCB_IO::GetStringOutput ( bool  doClear)
inline

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

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

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

158  {
159  std::string ret = m_sf.GetString();
160  if( doClear )
161  m_sf.Clear();
162 
163  return ret;
164  }
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 1949 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(), CLIPBOARD_IO::Load(), Load(), PCB_IO(), and CLIPBOARD_IO::Save().

1950 {
1951  m_board = NULL;
1952  m_reader = NULL;
1954  m_props = aProperties;
1955 }
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 2223 of file kicad_plugin.cpp.

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

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

2224 {
2225  LOCALE_IO toggle;
2226 
2227  init( NULL );
2228 
2229  cacheLib( aLibraryPath );
2230 
2231  return m_cache->IsWritable();
2232 }
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 1905 of file kicad_plugin.cpp.

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

Referenced by GetFileExtension().

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

Definition at line 419 of file kicad_plugin.cpp.

References TO_UTF8.

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

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

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

Implements PLUGIN.

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

102  {
103  return wxT( "KiCad" );
104  }
void PLUGIN::PrefetchLib ( const wxString &  aLibraryPath,
const PROPERTIES aProperties = NULL 
)
virtualinherited

Function PrefetchLib If possible, prefetches the specified library (e.g.

performing downloads). Does not parse. Threadsafe.

This is a no-op for libraries that cannot be prefetched.

Plugins that cannot prefetch need not override this; a default no-op is provided.

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

Reimplemented in GITHUB_PLUGIN.

Definition at line 69 of file plugin.cpp.

Referenced by FP_LIB_TABLE::PrefetchLib().

70 {
71  (void) aLibraryPath;
72  (void) aProperties;
73 }
void PCB_IO::Save ( const wxString &  aFileName,
BOARD aBoard,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Function Save will write aBoard to a storage file in a format that this PLUGIN implementation knows about, or it can be used to write a portion of aBoard to a special kind of export file.

Parameters
aFileNameis the name of a file to save to on disk.
aBoardis the class BOARD in memory document tree from which to extract information when writing to aFileName. The caller continues to own the BOARD, and the plugin should refrain from modifying the BOARD if possible.
aPropertiesis an associative array that can be used to tell the saver how to save the file, because it can take any number of additional named tuning arguments that the plugin is known to support. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Exceptions
IO_ERRORif there is a problem saving or exporting.

Reimplemented from PLUGIN.

Reimplemented in CLIPBOARD_IO.

Definition at line 395 of file kicad_plugin.cpp.

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

Referenced by GetFileExtension().

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

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

References m_out, and Parse().

Referenced by FP_CACHE::Save().

166 { 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 95 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 173 of file pcbnew/kicad_plugin.h.

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

int PCB_IO::m_ctl
protected

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

Referenced by FootprintSave().

wxString PCB_IO::m_error
protected

for throwing exceptions

Definition at line 172 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 180 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 182 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 188 of file pcbnew/kicad_plugin.h.

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

OUTPUTFORMATTER* PCB_IO::m_out
protected

output any Format()s to this, no ownership

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

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

PCB_PARSER* PCB_IO::m_parser
protected

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

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

const PROPERTIES* PCB_IO::m_props
protected

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

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

Referenced by init().

LINE_READER* PCB_IO::m_reader
protected

no ownership here.

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

Referenced by init().

STRING_FORMATTER PCB_IO::m_sf
protected

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

Referenced by GetStringOutput(), and PCB_IO().


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