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

Constructor & Destructor Documentation

PCB_IO::PCB_IO ( int  aControlFlags = CTL_FOR_BOARD)

Definition at line 1872 of file kicad_plugin.cpp.

References init(), m_out, and m_sf.

1872  :
1873  m_cache( 0 ),
1874  m_ctl( aControlFlags ),
1875  m_parser( new PCB_PARSER() ),
1876  m_mapping( new NETINFO_MAPPING() )
1877 {
1878  init( 0 );
1879  m_out = &m_sf;
1880 }
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 1883 of file kicad_plugin.cpp.

References m_cache, m_mapping, and m_parser.

1884 {
1885  delete m_cache;
1886  delete m_parser;
1887  delete m_mapping;
1888 }
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 1944 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().

1945 {
1946  if( !m_cache || m_cache->IsModified( aLibraryPath, aFootprintName ) )
1947  {
1948  // a spectacular episode in memory management:
1949  delete m_cache;
1950  m_cache = new FP_CACHE( this, aLibraryPath );
1951  m_cache->Load();
1952  }
1953 }
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 2091 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().

2092 {
2093  LOCALE_IO toggle; // toggles on, then off, the C locale.
2094 
2095  init( aProperties );
2096 
2097  cacheLib( aLibraryPath );
2098 
2099  if( !m_cache->IsWritable() )
2100  {
2101  THROW_IO_ERROR( wxString::Format( _( "Library '%s' is read only" ),
2102  aLibraryPath.GetData() ) );
2103  }
2104 
2105  m_cache->Remove( aFootprintName );
2106 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:165
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 1956 of file kicad_plugin.cpp.

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

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

1959 {
1960  LOCALE_IO toggle; // toggles on, then off, the C locale.
1961  wxDir dir( aLibraryPath );
1962 
1963  if( !dir.IsOpened() )
1964  {
1965  THROW_IO_ERROR( wxString::Format( _( "footprint library path '%s' does not exist" ),
1966  GetChars( aLibraryPath ) ) );
1967  }
1968 
1969  init( aProperties );
1970 
1971  wxString errorMsg;
1972 
1973  // Some of the files may have been parsed correctly so we want to add the valid files to
1974  // the library.
1975  try
1976  {
1977  cacheLib( aLibraryPath );
1978  }
1979  catch( const IO_ERROR& ioe )
1980  {
1981  errorMsg = ioe.What();
1982  }
1983 
1984  const MODULE_MAP& mods = m_cache->GetModules();
1985 
1986  for( MODULE_CITER it = mods.begin(); it != mods.end(); ++it )
1987  {
1988  aFootprintNames.Add( it->first );
1989  }
1990 
1991  if( !errorMsg.IsEmpty() )
1992  THROW_IO_ERROR( errorMsg );
1993 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:165
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
std::map< std::string, 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
static const wxChar * GetChars(const wxString &s)
Function GetChars returns a wxChar* to the actual wxChar* data within a wxString, and is helpful for ...
Definition: macros.h:92
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:47
#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 2109 of file kicad_plugin.cpp.

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

Referenced by GITHUB_PLUGIN::FootprintLibCreate().

2110 {
2111  if( wxDir::Exists( aLibraryPath ) )
2112  {
2113  THROW_IO_ERROR( wxString::Format( _( "cannot overwrite library path '%s'" ),
2114  aLibraryPath.GetData() ) );
2115  }
2116 
2117  LOCALE_IO toggle;
2118 
2119  init( aProperties );
2120 
2121  delete m_cache;
2122  m_cache = new FP_CACHE( this, aLibraryPath );
2123  m_cache->Save();
2124 }
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:165
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 2127 of file kicad_plugin.cpp.

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

Referenced by GITHUB_PLUGIN::FootprintLibDelete().

2128 {
2129  wxFileName fn;
2130  fn.SetPath( aLibraryPath );
2131 
2132  // Return if there is no library path to delete.
2133  if( !fn.DirExists() )
2134  return false;
2135 
2136  if( !fn.IsDirWritable() )
2137  {
2138  THROW_IO_ERROR( wxString::Format( _( "user does not have permission to delete directory '%s'" ),
2139  aLibraryPath.GetData() ) );
2140  }
2141 
2142  wxDir dir( aLibraryPath );
2143 
2144  if( dir.HasSubDirs() )
2145  {
2146  THROW_IO_ERROR( wxString::Format( _( "library directory '%s' has unexpected sub-directories" ),
2147  aLibraryPath.GetData() ) );
2148  }
2149 
2150  // All the footprint files must be deleted before the directory can be deleted.
2151  if( dir.HasFiles() )
2152  {
2153  unsigned i;
2154  wxFileName tmp;
2155  wxArrayString files;
2156 
2157  wxDir::GetAllFiles( aLibraryPath, &files );
2158 
2159  for( i = 0; i < files.GetCount(); i++ )
2160  {
2161  tmp = files[i];
2162 
2163  if( tmp.GetExt() != KiCadFootprintFileExtension )
2164  {
2165  THROW_IO_ERROR( wxString::Format( _( "unexpected file '%s' was found in library path '%s'" ),
2166  files[i].GetData(), aLibraryPath.GetData() ) );
2167  }
2168  }
2169 
2170  for( i = 0; i < files.GetCount(); i++ )
2171  {
2172  wxRemoveFile( files[i] );
2173  }
2174  }
2175 
2176  wxLogTrace( traceFootprintLibrary, wxT( "Removing footprint library '%s'" ),
2177  aLibraryPath.GetData() );
2178 
2179  // Some of the more elaborate wxRemoveFile() crap puts up its own wxLog dialog
2180  // we don't want that. we want bare metal portability with no UI here.
2181  if( !wxRmdir( aLibraryPath ) )
2182  {
2183  THROW_IO_ERROR( wxString::Format( _( "footprint library '%s' cannot be deleted" ),
2184  aLibraryPath.GetData() ) );
2185  }
2186 
2187  // For some reason removing a directory in Windows is not immediately updated. This delay
2188  // prevents an error when attempting to immediately recreate the same directory when over
2189  // writing an existing library.
2190 #ifdef __WINDOWS__
2191  wxMilliSleep( 250L );
2192 #endif
2193 
2194  if( m_cache && !m_cache->IsPath( aLibraryPath ) )
2195  {
2196  delete m_cache;
2197  m_cache = NULL;
2198  }
2199 
2200  return true;
2201 }
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 1996 of file kicad_plugin.cpp.

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

Referenced by GITHUB_PLUGIN::FootprintLoad().

1998 {
1999  LOCALE_IO toggle; // toggles on, then off, the C locale.
2000 
2001  init( aProperties );
2002 
2003  cacheLib( aLibraryPath, aFootprintName );
2004 
2005  const MODULE_MAP& mods = m_cache->GetModules();
2006 
2007  MODULE_CITER it = mods.find( aFootprintName );
2008 
2009  if( it == mods.end() )
2010  {
2011  return NULL;
2012  }
2013 
2014  // copy constructor to clone the already loaded MODULE
2015  return new MODULE( *it->second->GetModule() );
2016 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:165
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
std::map< std::string, MODULE * > MODULE_MAP
Definition: eagle_plugin.h:36
MODULE_MAP::const_iterator MODULE_CITER
void cacheLib(const wxString &aLibraryPath, const wxString &aFootprintName=wxEmptyString)
we only cache one footprint library, this determines which one.
MODULE_MAP & GetModules()
void PCB_IO::FootprintSave ( const wxString &  aLibraryPath,
const MODULE aFootprint,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Function FootprintSave will write aModule to an existing library located at aLibraryPath.

If a footprint by the same name already exists, it is replaced.

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several footprints.
aFootprintis what to store in the library. The caller continues to own the footprint after this call.
aPropertiesis an associative array that can be used to tell the saver how to save the footprint, because it can take any number of additional named tuning arguments that the plugin is known to support. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Exceptions
IO_ERRORif there is a problem saving.

Reimplemented from PLUGIN.

Definition at line 2019 of file kicad_plugin.cpp.

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

Referenced by GITHUB_PLUGIN::FootprintSave().

2021 {
2022  LOCALE_IO toggle; // toggles on, then off, the C locale.
2023 
2024  init( aProperties );
2025 
2026  // In this public PLUGIN API function, we can safely assume it was
2027  // called for saving into a library path.
2029 
2030  cacheLib( aLibraryPath );
2031 
2032  if( !m_cache->IsWritable() )
2033  {
2034  wxString msg = wxString::Format(
2035  _( "Library '%s' is read only" ),
2036  GetChars( aLibraryPath )
2037  );
2038 
2039  THROW_IO_ERROR( msg );
2040  }
2041 
2042  wxString footprintName = aFootprint->GetFPID().GetLibItemName();
2043 
2044  MODULE_MAP& mods = m_cache->GetModules();
2045 
2046  // Quietly overwrite module and delete module file from path for any by same name.
2047  wxFileName fn( aLibraryPath, aFootprint->GetFPID().GetLibItemName(),
2049 
2050  if( !fn.IsOk() )
2051  {
2052  THROW_IO_ERROR( wxString::Format( _( "Footprint file name '%s' is not valid." ),
2053  GetChars( fn.GetFullPath() ) ) );
2054  }
2055 
2056  if( fn.FileExists() && !fn.IsFileWritable() )
2057  {
2058  THROW_IO_ERROR( wxString::Format( _( "user does not have write permission to delete file '%s' " ),
2059  GetChars( fn.GetFullPath() ) ) );
2060  }
2061 
2062  MODULE_CITER it = mods.find( footprintName );
2063 
2064  if( it != mods.end() )
2065  {
2066  wxLogTrace( traceFootprintLibrary, wxT( "Removing footprint library file '%s'." ),
2067  fn.GetFullPath().GetData() );
2068  mods.erase( footprintName );
2069  wxRemoveFile( fn.GetFullPath() );
2070  }
2071 
2072  // I need my own copy for the cache
2073  MODULE* module = new MODULE( *aFootprint );
2074 
2075  // and it's time stamp must be 0, it should have no parent, orientation should
2076  // be zero, and it should be on the front layer.
2077  module->SetTimeStamp( 0 );
2078  module->SetParent( 0 );
2079  module->SetOrientation( 0 );
2080 
2081  if( module->GetLayer() != F_Cu )
2082  module->Flip( module->GetPosition() );
2083 
2084  wxLogTrace( traceFootprintLibrary, wxT( "Creating s-expression footprint file: %s." ),
2085  fn.GetFullPath().GetData() );
2086  mods.insert( footprintName, new FP_CACHE_ITEM( module, fn ) );
2087  m_cache->Save();
2088 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:165
FP_CACHE * m_cache
Footprint library cache.
virtual PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
void Flip(const wxPoint &aCentre) override
Function Flip Flip this object, i.e.
void init(const PROPERTIES *aProperties)
const wxPoint & GetPosition() const override
Definition: class_module.h:175
const wxString KiCadFootprintFileExtension
void SetTimeStamp(time_t aNewTimeStamp)
Definition: base_struct.h:217
const LIB_ID & GetFPID() const
Definition: class_module.h:184
void SetParent(EDA_ITEM *aParent)
Definition: base_struct.h:227
const UTF8 & GetLibItemName() const
Definition: lib_id.h:115
std::map< std::string, 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.
void SetOrientation(double newangle)
#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 461 of file kicad_plugin.cpp.

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

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

462 {
463  LOCALE_IO toggle; // public API function, perform anything convenient for caller
464 
465  switch( aItem->Type() )
466  {
467  case PCB_T:
468  format( static_cast<BOARD*>( aItem ), aNestLevel );
469  break;
470 
471  case PCB_DIMENSION_T:
472  format( static_cast<DIMENSION*>( aItem ), aNestLevel );
473  break;
474 
475  case PCB_LINE_T:
476  format( static_cast<DRAWSEGMENT*>( aItem ), aNestLevel );
477  break;
478 
479  case PCB_MODULE_EDGE_T:
480  format( static_cast<EDGE_MODULE*>( aItem ), aNestLevel );
481  break;
482 
483  case PCB_TARGET_T:
484  format( static_cast<PCB_TARGET*>( aItem ), aNestLevel );
485  break;
486 
487  case PCB_MODULE_T:
488  format( static_cast<MODULE*>( aItem ), aNestLevel );
489  break;
490 
491  case PCB_PAD_T:
492  format( static_cast<D_PAD*>( aItem ), aNestLevel );
493  break;
494 
495  case PCB_TEXT_T:
496  format( static_cast<TEXTE_PCB*>( aItem ), aNestLevel );
497  break;
498 
499  case PCB_MODULE_TEXT_T:
500  format( static_cast<TEXTE_MODULE*>( aItem ), aNestLevel );
501  break;
502 
503  case PCB_TRACE_T:
504  case PCB_VIA_T:
505  format( static_cast<TRACK*>( aItem ), aNestLevel );
506  break;
507 
508  case PCB_ZONE_AREA_T:
509  format( static_cast<ZONE_CONTAINER*>( aItem ), aNestLevel );
510  break;
511 
512  default:
513  wxFAIL_MSG( wxT( "Cannot format item " ) + aItem->GetClass() );
514  }
515 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:212
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:165
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 774 of file kicad_plugin.cpp.

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

Referenced by Format(), and format().

775 {
776  formatHeader( aBoard, aNestLevel );
777 
778  // Save the modules.
779  for( MODULE* module = aBoard->m_Modules; module; module = module->Next() )
780  {
781  Format( module, aNestLevel );
782  m_out->Print( 0, "\n" );
783  }
784 
785  // Save the graphical items on the board (not owned by a module)
786  for( auto item : aBoard->Drawings() )
787  Format( item, aNestLevel );
788 
789  if( aBoard->Drawings().Size() )
790  m_out->Print( 0, "\n" );
791 
792  // Do not save MARKER_PCBs, they can be regenerated easily.
793 
794  // Save the tracks and vias.
795  for( TRACK* track = aBoard->m_Track; track; track = track->Next() )
796  Format( track, aNestLevel );
797 
798  if( aBoard->m_Track.GetCount() )
799  m_out->Print( 0, "\n" );
800 
803 
804  // Save the polygon (which are the newer technology) zones.
805  for( int i = 0; i < aBoard->GetAreaCount(); ++i )
806  Format( aBoard->GetArea( i ), aNestLevel );
807 }
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:100
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 810 of file kicad_plugin.cpp.

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

811 {
812  m_out->Print( aNestLevel, "(dimension %s (width %s)",
813  FMT_IU( aDimension->GetValue() ).c_str(),
814  FMT_IU( aDimension->GetWidth() ).c_str() );
815 
816  formatLayer( aDimension );
817 
818  if( aDimension->GetTimeStamp() )
819  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aDimension->GetTimeStamp() );
820 
821  m_out->Print( 0, "\n" );
822 
823  Format( &aDimension->Text(), aNestLevel+1 );
824 
825  m_out->Print( aNestLevel+1, "(feature1 (pts (xy %s %s) (xy %s %s)))\n",
826  FMT_IU( aDimension->m_featureLineDO.x ).c_str(),
827  FMT_IU( aDimension->m_featureLineDO.y ).c_str(),
828  FMT_IU( aDimension->m_featureLineDF.x ).c_str(),
829  FMT_IU( aDimension->m_featureLineDF.y ).c_str() );
830 
831  m_out->Print( aNestLevel+1, "(feature2 (pts (xy %s %s) (xy %s %s)))\n",
832  FMT_IU( aDimension->m_featureLineGO.x ).c_str(),
833  FMT_IU( aDimension->m_featureLineGO.y ).c_str(),
834  FMT_IU( aDimension->m_featureLineGF.x ).c_str(),
835  FMT_IU( aDimension->m_featureLineGF.y ).c_str() );
836 
837  m_out->Print( aNestLevel+1, "(crossbar (pts (xy %s %s) (xy %s %s)))\n",
838  FMT_IU( aDimension->m_crossBarO.x ).c_str(),
839  FMT_IU( aDimension->m_crossBarO.y ).c_str(),
840  FMT_IU( aDimension->m_crossBarF.x ).c_str(),
841  FMT_IU( aDimension->m_crossBarF.y ).c_str() );
842 
843  m_out->Print( aNestLevel+1, "(arrow1a (pts (xy %s %s) (xy %s %s)))\n",
844  FMT_IU( aDimension->m_crossBarF.x ).c_str(),
845  FMT_IU( aDimension->m_crossBarF.y ).c_str(),
846  FMT_IU( aDimension->m_arrowD1F.x ).c_str(),
847  FMT_IU( aDimension->m_arrowD1F.y ).c_str() );
848 
849  m_out->Print( aNestLevel+1, "(arrow1b (pts (xy %s %s) (xy %s %s)))\n",
850  FMT_IU( aDimension->m_crossBarF.x ).c_str(),
851  FMT_IU( aDimension->m_crossBarF.y ).c_str(),
852  FMT_IU( aDimension->m_arrowD2F.x ).c_str(),
853  FMT_IU( aDimension->m_arrowD2F.y ).c_str() );
854 
855  m_out->Print( aNestLevel+1, "(arrow2a (pts (xy %s %s) (xy %s %s)))\n",
856  FMT_IU( aDimension->m_crossBarO.x ).c_str(),
857  FMT_IU( aDimension->m_crossBarO.y ).c_str(),
858  FMT_IU( aDimension->m_arrowG1F.x ).c_str(),
859  FMT_IU( aDimension->m_arrowG1F.y ).c_str() );
860 
861  m_out->Print( aNestLevel+1, "(arrow2b (pts (xy %s %s) (xy %s %s)))\n",
862  FMT_IU( aDimension->m_crossBarO.x ).c_str(),
863  FMT_IU( aDimension->m_crossBarO.y ).c_str(),
864  FMT_IU( aDimension->m_arrowG2F.x ).c_str(),
865  FMT_IU( aDimension->m_arrowG2F.y ).c_str() );
866 
867  m_out->Print( aNestLevel, ")\n" );
868 }
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.
time_t GetTimeStamp() const
Definition: base_struct.h:218
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
wxPoint m_featureLineGF
void PCB_IO::format ( EDGE_MODULE aModuleDrawing,
int  aNestLevel = 0 
) const
private

Definition at line 935 of file kicad_plugin.cpp.

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

936 {
937  switch( aModuleDrawing->GetShape() )
938  {
939  case S_SEGMENT: // Line
940  m_out->Print( aNestLevel, "(fp_line (start %s) (end %s)",
941  FMT_IU( aModuleDrawing->GetStart0() ).c_str(),
942  FMT_IU( aModuleDrawing->GetEnd0() ).c_str() );
943  break;
944 
945  case S_CIRCLE: // Circle
946  m_out->Print( aNestLevel, "(fp_circle (center %s) (end %s)",
947  FMT_IU( aModuleDrawing->GetStart0() ).c_str(),
948  FMT_IU( aModuleDrawing->GetEnd0() ).c_str() );
949  break;
950 
951  case S_ARC: // Arc
952  m_out->Print( aNestLevel, "(fp_arc (start %s) (end %s) (angle %s)",
953  FMT_IU( aModuleDrawing->GetStart0() ).c_str(),
954  FMT_IU( aModuleDrawing->GetEnd0() ).c_str(),
955  FMT_ANGLE( aModuleDrawing->GetAngle() ).c_str() );
956  break;
957 
958  case S_POLYGON: // Polygon
959  m_out->Print( aNestLevel, "(fp_poly (pts" );
960 
961  for( unsigned i = 0; i < aModuleDrawing->GetPolyPoints().size(); ++i )
962  {
963  int nestLevel = 0;
964 
965  if( i && !(i%4) ) // newline every 4(pts)
966  {
967  nestLevel = aNestLevel + 1;
968  m_out->Print( 0, "\n" );
969  }
970 
971  m_out->Print( nestLevel, "%s(xy %s)",
972  nestLevel ? "" : " ",
973  FMT_IU( aModuleDrawing->GetPolyPoints()[i] ).c_str() );
974  }
975  m_out->Print( 0, ")" );
976  break;
977 
978  case S_CURVE: // Bezier curve
979  m_out->Print( aNestLevel, "(fp_curve (pts (xy %s) (xy %s) (xy %s) (xy %s))",
980  FMT_IU( aModuleDrawing->GetStart0() ).c_str(),
981  FMT_IU( aModuleDrawing->GetBezControl1() ).c_str(),
982  FMT_IU( aModuleDrawing->GetBezControl2() ).c_str(),
983  FMT_IU( aModuleDrawing->GetEnd0() ).c_str() );
984  break;
985 
986  default:
987  wxFAIL_MSG( wxT( "Cannot format invalid DRAWSEGMENT type." ) );
988  };
989 
990  formatLayer( aModuleDrawing );
991 
992  m_out->Print( 0, " (width %s)", FMT_IU( aModuleDrawing->GetWidth() ).c_str() );
993 
994  m_out->Print( 0, ")\n" );
995 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const wxPoint & GetBezControl2() const
polygon (not yet used for tracks, but could be in microwave apps)
const wxPoint & GetEnd0() const
void formatLayer(const BOARD_ITEM *aItem) const
usual segment : line with rounded ends
const std::vector< wxPoint > GetPolyPoints() const
#define FMT_IU
STROKE_T GetShape() const
Arcs (with rounded ends)
const wxPoint & GetBezControl1() const
Bezier Curve.
double GetAngle() const
const wxPoint & GetStart0() const
int GetWidth() const
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
#define FMT_ANGLE
void PCB_IO::format ( DRAWSEGMENT aSegment,
int  aNestLevel = 0 
) const
private

Definition at line 871 of file kicad_plugin.cpp.

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

872 {
873  unsigned i;
874 
875  switch( aSegment->GetShape() )
876  {
877  case S_SEGMENT: // Line
878  m_out->Print( aNestLevel, "(gr_line (start %s) (end %s)",
879  FMT_IU( aSegment->GetStart() ).c_str(),
880  FMT_IU( aSegment->GetEnd() ).c_str() );
881 
882  if( aSegment->GetAngle() != 0.0 )
883  m_out->Print( 0, " (angle %s)", FMT_ANGLE( aSegment->GetAngle() ).c_str() );
884 
885  break;
886 
887  case S_CIRCLE: // Circle
888  m_out->Print( aNestLevel, "(gr_circle (center %s) (end %s)",
889  FMT_IU( aSegment->GetStart() ).c_str(),
890  FMT_IU( aSegment->GetEnd() ).c_str() );
891  break;
892 
893  case S_ARC: // Arc
894  m_out->Print( aNestLevel, "(gr_arc (start %s) (end %s) (angle %s)",
895  FMT_IU( aSegment->GetStart() ).c_str(),
896  FMT_IU( aSegment->GetEnd() ).c_str(),
897  FMT_ANGLE( aSegment->GetAngle() ).c_str() );
898  break;
899 
900  case S_POLYGON: // Polygon
901  m_out->Print( aNestLevel, "(gr_poly (pts" );
902 
903  for( i = 0; i < aSegment->GetPolyPoints().size(); ++i )
904  m_out->Print( 0, " (xy %s)", FMT_IU( aSegment->GetPolyPoints()[i] ).c_str() );
905 
906  m_out->Print( 0, ")" );
907  break;
908 
909  case S_CURVE: // Bezier curve
910  m_out->Print( aNestLevel, "(gr_curve (pts (xy %s) (xy %s) (xy %s) (xy %s))",
911  FMT_IU( aSegment->GetStart() ).c_str(),
912  FMT_IU( aSegment->GetBezControl1() ).c_str(),
913  FMT_IU( aSegment->GetBezControl2() ).c_str(),
914  FMT_IU( aSegment->GetEnd() ).c_str() );
915  break;
916 
917  default:
918  wxFAIL_MSG( wxT( "Cannot format invalid DRAWSEGMENT type." ) );
919  };
920 
921  formatLayer( aSegment );
922 
923  m_out->Print( 0, " (width %s)", FMT_IU( aSegment->GetWidth() ).c_str() );
924 
925  if( aSegment->GetTimeStamp() )
926  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aSegment->GetTimeStamp() );
927 
928  if( aSegment->GetStatus() )
929  m_out->Print( 0, " (status %X)", aSegment->GetStatus() );
930 
931  m_out->Print( 0, ")\n" );
932 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const wxPoint & GetBezControl2() const
polygon (not yet used for tracks, but could be in microwave apps)
void formatLayer(const BOARD_ITEM *aItem) const
usual segment : line with rounded ends
STATUS_FLAGS GetStatus() const
Definition: base_struct.h:264
const std::vector< wxPoint > GetPolyPoints() const
#define FMT_IU
STROKE_T GetShape() const
const wxPoint & GetEnd() const
Function GetEnd returns the ending point of the graphic.
Arcs (with rounded ends)
const wxPoint & GetBezControl1() const
Bezier Curve.
time_t GetTimeStamp() const
Definition: base_struct.h:218
double GetAngle() const
int GetWidth() const
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
const wxPoint & GetStart() const
Function GetStart returns the starting point of the graphic.
#define FMT_ANGLE
void PCB_IO::format ( PCB_TARGET aTarget,
int  aNestLevel = 0 
) const
private

Definition at line 998 of file kicad_plugin.cpp.

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

999 {
1000  m_out->Print( aNestLevel, "(target %s (at %s) (size %s)",
1001  ( aTarget->GetShape() ) ? "x" : "plus",
1002  FMT_IU( aTarget->GetPosition() ).c_str(),
1003  FMT_IU( aTarget->GetSize() ).c_str() );
1004 
1005  if( aTarget->GetWidth() != 0 )
1006  m_out->Print( 0, " (width %s)", FMT_IU( aTarget->GetWidth() ).c_str() );
1007 
1008  formatLayer( aTarget );
1009 
1010  if( aTarget->GetTimeStamp() )
1011  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aTarget->GetTimeStamp() );
1012 
1013  m_out->Print( 0, ")\n" );
1014 }
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
time_t GetTimeStamp() const
Definition: base_struct.h:218
const wxPoint & GetPosition() const override
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
void PCB_IO::format ( MODULE aModule,
int  aNestLevel = 0 
) const
private

Definition at line 1017 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(), format(), formatLayer(), MODULE::GetAttributes(), MODULE::GetDescription(), MODULE::GetFPID(), MODULE::GetInitialComments(), MODULE::GetKeywords(), MODULE::GetLastEditTime(), MODULE::GetLocalClearance(), MODULE::GetLocalSolderMaskMargin(), MODULE::GetLocalSolderPasteMargin(), MODULE::GetLocalSolderPasteMarginRatio(), MODULE::GetOrientation(), MODULE::GetPath(), MODULE::GetPlacementCost180(), MODULE::GetPlacementCost90(), MODULE::GetPosition(), MODULE::GetThermalGap(), MODULE::GetThermalWidth(), EDA_ITEM::GetTimeStamp(), MODULE::GetZoneConnection(), MODULE::GraphicalItemsList(), MODULE::IsLocked(), MODULE::IsPlaced(), m_ctl, m_out, MOD_CMS, MOD_DEFAULT, MOD_VIRTUAL, MODULE::Models(), BOARD_ITEM::Next(), D_PAD::Next(), PAD_ZONE_CONN_INHERITED, MODULE::PadsList(), OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotes(), OUTPUTFORMATTER::Quotew(), MODULE::Reference(), TO_UTF8, and MODULE::Value().

1018 {
1019  if( !( m_ctl & CTL_OMIT_INITIAL_COMMENTS ) )
1020  {
1021  const wxArrayString* initial_comments = aModule->GetInitialComments();
1022 
1023  if( initial_comments )
1024  {
1025  for( unsigned i=0; i<initial_comments->GetCount(); ++i )
1026  m_out->Print( aNestLevel, "%s\n", TO_UTF8( (*initial_comments)[i] ) );
1027 
1028  m_out->Print( 0, "\n" ); // improve readability?
1029  }
1030  }
1031 
1032  m_out->Print( aNestLevel, "(module %s",
1033  m_out->Quotes( aModule->GetFPID().Format() ).c_str() );
1034 
1035  if( aModule->IsLocked() )
1036  m_out->Print( 0, " locked" );
1037 
1038  if( aModule->IsPlaced() )
1039  m_out->Print( 0, " placed" );
1040 
1041  formatLayer( aModule );
1042 
1043  m_out->Print( 0, " (tedit %lX)", (unsigned long)aModule->GetLastEditTime() );
1044 
1045  if( !( m_ctl & CTL_OMIT_TSTAMPS ) )
1046  {
1047  m_out->Print( 0, " (tstamp %lX)\n", (unsigned long)aModule->GetTimeStamp() );
1048  }
1049  else
1050  m_out->Print( 0, "\n" );
1051 
1052  if( !( m_ctl & CTL_OMIT_AT ) )
1053  {
1054  m_out->Print( aNestLevel+1, "(at %s", FMT_IU( aModule->GetPosition() ).c_str() );
1055 
1056  if( aModule->GetOrientation() != 0.0 )
1057  m_out->Print( 0, " %s", FMT_ANGLE( aModule->GetOrientation() ).c_str() );
1058 
1059  m_out->Print( 0, ")\n" );
1060  }
1061 
1062  if( !aModule->GetDescription().IsEmpty() )
1063  m_out->Print( aNestLevel+1, "(descr %s)\n",
1064  m_out->Quotew( aModule->GetDescription() ).c_str() );
1065 
1066  if( !aModule->GetKeywords().IsEmpty() )
1067  m_out->Print( aNestLevel+1, "(tags %s)\n",
1068  m_out->Quotew( aModule->GetKeywords() ).c_str() );
1069 
1070  if( !( m_ctl & CTL_OMIT_PATH ) && !!aModule->GetPath() )
1071  m_out->Print( aNestLevel+1, "(path %s)\n",
1072  m_out->Quotew( aModule->GetPath() ).c_str() );
1073 
1074  if( aModule->GetPlacementCost90() != 0 )
1075  m_out->Print( aNestLevel+1, "(autoplace_cost90 %d)\n", aModule->GetPlacementCost90() );
1076 
1077  if( aModule->GetPlacementCost180() != 0 )
1078  m_out->Print( aNestLevel+1, "(autoplace_cost180 %d)\n", aModule->GetPlacementCost180() );
1079 
1080  if( aModule->GetLocalSolderMaskMargin() != 0 )
1081  m_out->Print( aNestLevel+1, "(solder_mask_margin %s)\n",
1082  FMT_IU( aModule->GetLocalSolderMaskMargin() ).c_str() );
1083 
1084  if( aModule->GetLocalSolderPasteMargin() != 0 )
1085  m_out->Print( aNestLevel+1, "(solder_paste_margin %s)\n",
1086  FMT_IU( aModule->GetLocalSolderPasteMargin() ).c_str() );
1087 
1088  if( aModule->GetLocalSolderPasteMarginRatio() != 0 )
1089  m_out->Print( aNestLevel+1, "(solder_paste_ratio %s)\n",
1090  Double2Str( aModule->GetLocalSolderPasteMarginRatio() ).c_str() );
1091 
1092  if( aModule->GetLocalClearance() != 0 )
1093  m_out->Print( aNestLevel+1, "(clearance %s)\n",
1094  FMT_IU( aModule->GetLocalClearance() ).c_str() );
1095 
1096  if( aModule->GetZoneConnection() != PAD_ZONE_CONN_INHERITED )
1097  m_out->Print( aNestLevel+1, "(zone_connect %d)\n", aModule->GetZoneConnection() );
1098 
1099  if( aModule->GetThermalWidth() != 0 )
1100  m_out->Print( aNestLevel+1, "(thermal_width %s)\n",
1101  FMT_IU( aModule->GetThermalWidth() ).c_str() );
1102 
1103  if( aModule->GetThermalGap() != 0 )
1104  m_out->Print( aNestLevel+1, "(thermal_gap %s)\n",
1105  FMT_IU( aModule->GetThermalGap() ).c_str() );
1106 
1107  // Attributes
1108  if( aModule->GetAttributes() != MOD_DEFAULT )
1109  {
1110  m_out->Print( aNestLevel+1, "(attr" );
1111 
1112  if( aModule->GetAttributes() & MOD_CMS )
1113  m_out->Print( 0, " smd" );
1114 
1115  if( aModule->GetAttributes() & MOD_VIRTUAL )
1116  m_out->Print( 0, " virtual" );
1117 
1118  m_out->Print( 0, ")\n" );
1119  }
1120 
1121  Format( (BOARD_ITEM*) &aModule->Reference(), aNestLevel+1 );
1122  Format( (BOARD_ITEM*) &aModule->Value(), aNestLevel+1 );
1123 
1124  // Save drawing elements.
1125  for( BOARD_ITEM* gr = aModule->GraphicalItemsList(); gr; gr = gr->Next() )
1126  Format( gr, aNestLevel+1 );
1127 
1128  // Save pads.
1129  for( D_PAD* pad = aModule->PadsList(); pad; pad = pad->Next() )
1130  format( pad, aNestLevel+1 );
1131 
1132  // Save 3D info.
1133  auto bs3D = aModule->Models().begin();
1134  auto es3D = aModule->Models().end();
1135 
1136  while( bs3D != es3D )
1137  {
1138  if( !bs3D->m_Filename.IsEmpty() )
1139  {
1140  m_out->Print( aNestLevel+1, "(model %s\n",
1141  m_out->Quotew( bs3D->m_Filename ).c_str() );
1142 
1143  // Model offset is in mm
1144  m_out->Print( aNestLevel+2, "(at (xyz %s %s %s))\n",
1145  Double2Str( bs3D->m_Offset.x ).c_str(),
1146  Double2Str( bs3D->m_Offset.y ).c_str(),
1147  Double2Str( bs3D->m_Offset.z ).c_str() );
1148 
1149  m_out->Print( aNestLevel+2, "(scale (xyz %s %s %s))\n",
1150  Double2Str( bs3D->m_Scale.x ).c_str(),
1151  Double2Str( bs3D->m_Scale.y ).c_str(),
1152  Double2Str( bs3D->m_Scale.z ).c_str() );
1153 
1154  m_out->Print( aNestLevel+2, "(rotate (xyz %s %s %s))\n",
1155  Double2Str( bs3D->m_Rotation.x ).c_str(),
1156  Double2Str( bs3D->m_Rotation.y ).c_str(),
1157  Double2Str( bs3D->m_Rotation.z ).c_str() );
1158 
1159  m_out->Print( aNestLevel+1, ")\n" );
1160  }
1161  ++bs3D;
1162  }
1163 
1164  m_out->Print( aNestLevel, ")\n" );
1165 }
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
const wxPoint & GetPosition() const override
Definition: class_module.h:175
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
time_t GetTimeStamp() const
Definition: base_struct.h:218
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
#define FMT_ANGLE
int GetThermalWidth() const
Definition: class_module.h:212
void PCB_IO::format ( D_PAD aPad,
int  aNestLevel = 0 
) const
private

Definition at line 1266 of file kicad_plugin.cpp.

References CTL_OMIT_NETS, CUST_PAD_SHAPE_IN_ZONE_CONVEXHULL, Double2Str(), FMT_ANGLE, FMT_IU, Format(), formatLayers(), 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, m_ctl, PAD_CS_PRIMITIVE::m_End, m_mapping, m_out, PAD_CS_PRIMITIVE::m_Poly, PAD_CS_PRIMITIVE::m_Radius, PAD_CS_PRIMITIVE::m_Shape, PAD_CS_PRIMITIVE::m_Start, PAD_CS_PRIMITIVE::m_Thickness, PAD_ATTRIB_CONN, PAD_ATTRIB_HOLE_NOT_PLATED, PAD_ATTRIB_SMD, PAD_ATTRIB_STANDARD, PAD_DRILL_SHAPE_OBLONG, PAD_SHAPE_CIRCLE, PAD_SHAPE_CUSTOM, PAD_SHAPE_OVAL, PAD_SHAPE_RECT, PAD_SHAPE_ROUNDRECT, PAD_SHAPE_TRAPEZOID, PAD_ZONE_CONN_INHERITED, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), S_ARC, S_CIRCLE, S_POLYGON, S_SEGMENT, StrPrintf(), THROW_IO_ERROR, NETINFO_MAPPING::Translate(), NETINFO_LIST::UNCONNECTED, wxPoint::x, and wxPoint::y.

1267 {
1268  const char* shape;
1269 
1270  switch( aPad->GetShape() )
1271  {
1272  case PAD_SHAPE_CIRCLE: shape = "circle"; break;
1273  case PAD_SHAPE_RECT: shape = "rect"; break;
1274  case PAD_SHAPE_OVAL: shape = "oval"; break;
1275  case PAD_SHAPE_TRAPEZOID: shape = "trapezoid"; break;
1276  case PAD_SHAPE_ROUNDRECT: shape = "roundrect"; break;
1277  case PAD_SHAPE_CUSTOM: shape = "custom"; break;
1278 
1279  default:
1280  THROW_IO_ERROR( wxString::Format( _( "unknown pad type: %d"), aPad->GetShape() ) );
1281  }
1282 
1283  const char* type;
1284 
1285  switch( aPad->GetAttribute() )
1286  {
1287  case PAD_ATTRIB_STANDARD: type = "thru_hole"; break;
1288  case PAD_ATTRIB_SMD: type = "smd"; break;
1289  case PAD_ATTRIB_CONN: type = "connect"; break;
1290  case PAD_ATTRIB_HOLE_NOT_PLATED: type = "np_thru_hole"; break;
1291 
1292  default:
1293  THROW_IO_ERROR( wxString::Format( _( "unknown pad attribute: %d" ),
1294  aPad->GetAttribute() ) );
1295  }
1296 
1297  m_out->Print( aNestLevel, "(pad %s %s %s",
1298  m_out->Quotew( aPad->GetName() ).c_str(),
1299  type, shape );
1300  m_out->Print( 0, " (at %s", FMT_IU( aPad->GetPos0() ).c_str() );
1301 
1302  if( aPad->GetOrientation() != 0.0 )
1303  m_out->Print( 0, " %s", FMT_ANGLE( aPad->GetOrientation() ).c_str() );
1304 
1305  m_out->Print( 0, ")" );
1306  m_out->Print( 0, " (size %s)", FMT_IU( aPad->GetSize() ).c_str() );
1307 
1308  if( (aPad->GetDelta().GetWidth()) != 0 || (aPad->GetDelta().GetHeight() != 0 ) )
1309  m_out->Print( 0, " (rect_delta %s )", FMT_IU( aPad->GetDelta() ).c_str() );
1310 
1311  wxSize sz = aPad->GetDrillSize();
1312  wxPoint shapeoffset = aPad->GetOffset();
1313 
1314  if( (sz.GetWidth() > 0) || (sz.GetHeight() > 0) ||
1315  (shapeoffset.x != 0) || (shapeoffset.y != 0) )
1316  {
1317  m_out->Print( 0, " (drill" );
1318 
1319  if( aPad->GetDrillShape() == PAD_DRILL_SHAPE_OBLONG )
1320  m_out->Print( 0, " oval" );
1321 
1322  if( sz.GetWidth() > 0 )
1323  m_out->Print( 0, " %s", FMT_IU( sz.GetWidth() ).c_str() );
1324 
1325  if( sz.GetHeight() > 0 && sz.GetWidth() != sz.GetHeight() )
1326  m_out->Print( 0, " %s", FMT_IU( sz.GetHeight() ).c_str() );
1327 
1328  if( (shapeoffset.x != 0) || (shapeoffset.y != 0) )
1329  m_out->Print( 0, " (offset %s)", FMT_IU( aPad->GetOffset() ).c_str() );
1330 
1331  m_out->Print( 0, ")" );
1332  }
1333 
1334  formatLayers( aPad->GetLayerSet(), 0 );
1335 
1336  // Output the radius ratio for rounded rect pads
1337  if( aPad->GetShape() == PAD_SHAPE_ROUNDRECT )
1338  {
1339  m_out->Print( 0, "(roundrect_rratio %s)",
1340  Double2Str( aPad->GetRoundRectRadiusRatio() ).c_str() );
1341  }
1342 
1343  std::string output;
1344 
1345  // Unconnected pad is default net so don't save it.
1346  if( !( m_ctl & CTL_OMIT_NETS ) && aPad->GetNetCode() != NETINFO_LIST::UNCONNECTED )
1347  StrPrintf( &output, " (net %d %s)", m_mapping->Translate( aPad->GetNetCode() ),
1348  m_out->Quotew( aPad->GetNetname() ).c_str() );
1349 
1350  if( aPad->GetPadToDieLength() != 0 )
1351  StrPrintf( &output, " (die_length %s)", FMT_IU( aPad->GetPadToDieLength() ).c_str() );
1352 
1353  if( aPad->GetLocalSolderMaskMargin() != 0 )
1354  StrPrintf( &output, " (solder_mask_margin %s)", FMT_IU( aPad->GetLocalSolderMaskMargin() ).c_str() );
1355 
1356  if( aPad->GetLocalSolderPasteMargin() != 0 )
1357  StrPrintf( &output, " (solder_paste_margin %s)", FMT_IU( aPad->GetLocalSolderPasteMargin() ).c_str() );
1358 
1359  if( aPad->GetLocalSolderPasteMarginRatio() != 0 )
1360  StrPrintf( &output, " (solder_paste_margin_ratio %s)",
1361  Double2Str( aPad->GetLocalSolderPasteMarginRatio() ).c_str() );
1362 
1363  if( aPad->GetLocalClearance() != 0 )
1364  StrPrintf( &output, " (clearance %s)", FMT_IU( aPad->GetLocalClearance() ).c_str() );
1365 
1367  StrPrintf( &output, " (zone_connect %d)", aPad->GetZoneConnection() );
1368 
1369  if( aPad->GetThermalWidth() != 0 )
1370  StrPrintf( &output, " (thermal_width %s)", FMT_IU( aPad->GetThermalWidth() ).c_str() );
1371 
1372  if( aPad->GetThermalGap() != 0 )
1373  StrPrintf( &output, " (thermal_gap %s)", FMT_IU( aPad->GetThermalGap() ).c_str() );
1374 
1375  if( output.size() )
1376  {
1377  m_out->Print( 0, "\n" );
1378  m_out->Print( aNestLevel+1, "%s", output.c_str()+1 ); // +1 skips 1st space on 1st element
1379  }
1380 
1381  if( aPad->GetShape() == PAD_SHAPE_CUSTOM )
1382  {
1383  m_out->Print( 0, "\n");
1384  m_out->Print( aNestLevel+1, "(options" );
1385 
1387  m_out->Print( 0, " (clearance convexhull)" );
1388  #if 1 // Set to 1 to output the default option
1389  else
1390  m_out->Print( 0, " (clearance outline)" );
1391  #endif
1392 
1393  // Output the anchor pad shape (circle/rect)
1394  if( aPad->GetAnchorPadShape() == PAD_SHAPE_RECT )
1395  shape = "rect";
1396  else
1397  shape = "circle";
1398 
1399  m_out->Print( 0, " (anchor %s)", shape );
1400 
1401  m_out->Print( 0, ")"); // end of (options ...
1402 
1403  // Output graphic primitive of the pad shape
1404  m_out->Print( 0, "\n");
1405  m_out->Print( aNestLevel+1, "(primitives" );
1406 
1407  int nested_level = aNestLevel+2;
1408 
1409  // Output all basic shapes
1410  for( unsigned icnt = 0; icnt < aPad->GetPrimitives().size(); ++icnt )
1411  {
1412  m_out->Print( 0, "\n");
1413 
1414  const PAD_CS_PRIMITIVE& primitive = aPad->GetPrimitives()[icnt];
1415 
1416  switch( primitive.m_Shape )
1417  {
1418  case S_SEGMENT: // usual segment : line with rounded ends
1419  m_out->Print( nested_level, "(gr_line (start %s) (end %s) (width %s))",
1420  FMT_IU( primitive.m_Start ).c_str(),
1421  FMT_IU( primitive.m_End ).c_str(),
1422  FMT_IU( primitive.m_Thickness ).c_str() );
1423  break;
1424 
1425  case S_ARC: // Arc with rounded ends
1426  m_out->Print( nested_level, "(gr_arc (start %s) (end %s) (angle %s) (width %s))",
1427  FMT_IU( primitive.m_Start ).c_str(),
1428  FMT_IU( primitive.m_End ).c_str(),
1429  FMT_ANGLE( primitive.m_ArcAngle ).c_str(),
1430  FMT_IU( primitive.m_Thickness ).c_str() );
1431  break;
1432 
1433  case S_CIRCLE: // ring or circle (circle if width == 0
1434  m_out->Print( nested_level, "(gr_circle (center %s) (end %s %s) (width %s))",
1435  FMT_IU( primitive.m_Start ).c_str(),
1436  FMT_IU( primitive.m_Start.x + primitive.m_Radius ).c_str(),
1437  FMT_IU( primitive.m_Start.y ).c_str(),
1438  FMT_IU( primitive.m_Thickness ).c_str() );
1439  break;
1440 
1441  case S_POLYGON: // polygon
1442  if( primitive.m_Poly.size() < 2 )
1443  break; // Malformed polygon.
1444 
1445  {
1446  m_out->Print( nested_level, "(gr_poly (pts\n");
1447 
1448  // Write the polygon corners coordinates:
1449  const std::vector< wxPoint>& poly = primitive.m_Poly;
1450  int newLine = 0;
1451 
1452  for( unsigned ii = 0; ii < poly.size(); ii++ )
1453  {
1454  if( newLine == 0 )
1455  m_out->Print( nested_level+1, " (xy %s)", FMT_IU( wxPoint( poly[ii].x, poly[ii].y ) ).c_str() );
1456  else
1457  m_out->Print( 0, " (xy %s)", FMT_IU( wxPoint( poly[ii].x, poly[ii].y ) ).c_str() );
1458 
1459  if( ++newLine > 4 )
1460  {
1461  newLine = 0;
1462  m_out->Print( 0, "\n" );
1463  }
1464  }
1465 
1466  m_out->Print( 0, ") (width %s))", FMT_IU( primitive.m_Thickness ).c_str() );
1467  }
1468  break;
1469 
1470  default:
1471  break;
1472  }
1473  }
1474 
1475  m_out->Print( 0, "\n");
1476  m_out->Print( aNestLevel+1, ")" ); // end of (basic_shapes
1477  }
1478 
1479  m_out->Print( 0, ")\n" );
1480 }
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:650
LSET GetLayerSet() const override
Function GetLayerSet returns a "layer mask", which is a bitmap of all layers on which the TRACK segme...
Definition: class_pad.h:395
int GetThermalWidth() const
Definition: class_pad.cpp:661
int GetThermalGap() const
Definition: class_pad.cpp:672
const wxSize & GetSize() const
Definition: class_pad.h:269
const wxString & GetName() const
Definition: class_pad.h:190
int GetLocalSolderPasteMargin() const
Definition: class_pad.h: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 ...
#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 1483 of file kicad_plugin.cpp.

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

1484 {
1485  m_out->Print( aNestLevel, "(gr_text %s (at %s",
1486  m_out->Quotew( aText->GetText() ).c_str(),
1487  FMT_IU( aText->GetTextPos() ).c_str() );
1488 
1489  if( aText->GetTextAngle() != 0.0 )
1490  m_out->Print( 0, " %s", FMT_ANGLE( aText->GetTextAngle() ).c_str() );
1491 
1492  m_out->Print( 0, ")" );
1493 
1494  formatLayer( aText );
1495 
1496  if( aText->GetTimeStamp() )
1497  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aText->GetTimeStamp() );
1498 
1499  m_out->Print( 0, "\n" );
1500 
1501  aText->EDA_TEXT::Format( m_out, aNestLevel, m_ctl );
1502 
1503  m_out->Print( aNestLevel, ")\n" );
1504 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const wxPoint & GetTextPos() const
Definition: eda_text.h:224
void formatLayer(const BOARD_ITEM *aItem) const
double GetTextAngle() const
Definition: eda_text.h:164
#define FMT_IU
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:130
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
time_t GetTimeStamp() const
Definition: base_struct.h:218
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
void PCB_IO::format ( TEXTE_MODULE aText,
int  aNestLevel = 0 
) const
private

Definition at line 1507 of file kicad_plugin.cpp.

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

1508 {
1509  wxString type;
1510 
1511  switch( aText->GetType() )
1512  {
1513  case TEXTE_MODULE::TEXT_is_REFERENCE: type = "reference"; break;
1514  case TEXTE_MODULE::TEXT_is_VALUE: type = "value"; break;
1515  case TEXTE_MODULE::TEXT_is_DIVERS: type = "user";
1516  }
1517 
1518  m_out->Print( aNestLevel, "(fp_text %s %s (at %s",
1519  m_out->Quotew( type ).c_str(),
1520  m_out->Quotew( aText->GetText() ).c_str(),
1521  FMT_IU( aText->GetPos0() ).c_str() );
1522 
1523  // Due to Pcbnew history, fp_text angle is saved as an absolute on screen angle,
1524  // but internally the angle is held relative to its parent footprint. parent
1525  // may be NULL when saving a footprint outside a BOARD.
1526  double orient = aText->GetTextAngle();
1527  MODULE* parent = (MODULE*) aText->GetParent();
1528 
1529  if( parent )
1530  {
1531  // GetTextAngle() is always in -360..+360 range because of
1532  // TEXTE_MODULE::SetTextAngle(), but summing that angle with an
1533  // additional board angle could kick sum up >= 360 or <= -360, so to have
1534  // consistent results, normalize again for the BOARD save. A footprint
1535  // save does not use this code path since parent is NULL.
1536 #if 0
1537  // This one could be considered reasonable if you like positive angles
1538  // in your board text.
1539  orient = NormalizeAnglePos( orient + parent->GetOrientation() );
1540 #else
1541  // Choose compatibility for now, even though this is only a 720 degree clamp
1542  // with two possible values for every angle.
1543  orient = NormalizeAngle360Min( orient + parent->GetOrientation() );
1544 #endif
1545  }
1546 
1547  if( orient != 0.0 )
1548  m_out->Print( 0, " %s", FMT_ANGLE( orient ).c_str() );
1549 
1550  m_out->Print( 0, ")" );
1551  formatLayer( aText );
1552 
1553  if( !aText->IsVisible() )
1554  m_out->Print( 0, " hide" );
1555 
1556  m_out->Print( 0, "\n" );
1557 
1558  aText->EDA_TEXT::Format( m_out, aNestLevel, m_ctl | CTL_OMIT_HIDE );
1559 
1560  m_out->Print( aNestLevel, ")\n" );
1561 }
BOARD_ITEM_CONTAINER * GetParent() const
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
TEXT_TYPE GetType() const
const wxPoint & GetPos0() const
void formatLayer(const BOARD_ITEM *aItem) const
double GetTextAngle() const
Definition: eda_text.h:164
#define FMT_IU
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:130
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
bool IsVisible() const
Definition: eda_text.h:176
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 1564 of file kicad_plugin.cpp.

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

1565 {
1566  if( aTrack->Type() == PCB_VIA_T )
1567  {
1568  PCB_LAYER_ID layer1, layer2;
1569 
1570  const VIA* via = static_cast<const VIA*>( aTrack );
1571  BOARD* board = (BOARD*) via->GetParent();
1572 
1573  wxCHECK_RET( board != 0, wxT( "Via " ) + via->GetSelectMenuText() +
1574  wxT( " has no parent." ) );
1575 
1576  m_out->Print( aNestLevel, "(via" );
1577 
1578  via->LayerPair( &layer1, &layer2 );
1579 
1580  switch( via->GetViaType() )
1581  {
1582  case VIA_THROUGH: // Default shape not saved.
1583  break;
1584 
1585  case VIA_BLIND_BURIED:
1586  m_out->Print( 0, " blind" );
1587  break;
1588 
1589  case VIA_MICROVIA:
1590  m_out->Print( 0, " micro" );
1591  break;
1592 
1593  default:
1594  THROW_IO_ERROR( wxString::Format( _( "unknown via type %d" ), via->GetViaType() ) );
1595  }
1596 
1597  m_out->Print( 0, " (at %s) (size %s)",
1598  FMT_IU( aTrack->GetStart() ).c_str(),
1599  FMT_IU( aTrack->GetWidth() ).c_str() );
1600 
1601  if( via->GetDrill() != UNDEFINED_DRILL_DIAMETER )
1602  m_out->Print( 0, " (drill %s)", FMT_IU( via->GetDrill() ).c_str() );
1603 
1604  m_out->Print( 0, " (layers %s %s)",
1605  m_out->Quotew( m_board->GetLayerName( layer1 ) ).c_str(),
1606  m_out->Quotew( m_board->GetLayerName( layer2 ) ).c_str() );
1607  }
1608  else
1609  {
1610  m_out->Print( aNestLevel, "(segment (start %s) (end %s) (width %s)",
1611  FMT_IU( aTrack->GetStart() ).c_str(), FMT_IU( aTrack->GetEnd() ).c_str(),
1612  FMT_IU( aTrack->GetWidth() ).c_str() );
1613 
1614  m_out->Print( 0, " (layer %s)", m_out->Quotew( aTrack->GetLayerName() ).c_str() );
1615  }
1616 
1617  m_out->Print( 0, " (net %d)", m_mapping->Translate( aTrack->GetNetCode() ) );
1618 
1619  if( aTrack->GetTimeStamp() != 0 )
1620  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aTrack->GetTimeStamp() );
1621 
1622  if( aTrack->GetStatus() != 0 )
1623  m_out->Print( 0, " (status %X)", aTrack->GetStatus() );
1624 
1625  m_out->Print( 0, ")\n" );
1626 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:212
BOARD_ITEM_CONTAINER * GetParent() const
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
STATUS_FLAGS GetStatus() const
Definition: base_struct.h:264
int GetDrill() const
Function GetDrill returns the local drill setting for this VIA.
Definition: class_track.h:458
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:120
#define FMT_IU
PCB_LAYER_ID
A quick note on layer IDs:
VIATYPE_T GetViaType() const
Definition: class_track.h:443
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:123
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:60
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes ...
void LayerPair(PCB_LAYER_ID *top_layer, PCB_LAYER_ID *bottom_layer) const
Function LayerPair Return the 2 layers used by the via (the via actually uses all layers between thes...
time_t GetTimeStamp() const
Definition: base_struct.h:218
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:117
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
void PCB_IO::format ( ZONE_CONTAINER aZone,
int  aNestLevel = 0 
) const
private

Definition at line 1629 of file kicad_plugin.cpp.

References SHAPE_POLY_SET::CIterate(), ZONE_CONTAINER::DIAGONAL_EDGE, ZONE_CONTAINER::DIAGONAL_FULL, ZONE_CONTAINER::FillSegments(), FMT_IU, Format(), formatLayer(), formatLayers(), 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(), m_mapping, m_out, ZONE_CONTAINER::NO_HATCH, PAD_ZONE_CONN_FULL, PAD_ZONE_CONN_NONE, PAD_ZONE_CONN_THERMAL, PAD_ZONE_CONN_THT_THERMAL, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), ZONE_SETTINGS::SMOOTHING_CHAMFER, ZONE_SETTINGS::SMOOTHING_FILLET, ZONE_SETTINGS::SMOOTHING_NONE, THROW_IO_ERROR, and NETINFO_MAPPING::Translate().

1630 {
1631  // Save the NET info; For keepout zones, net code and net name are irrelevant
1632  // so be sure a dummy value is stored, just for ZONE_CONTAINER compatibility
1633  // (perhaps netcode and netname should be not stored)
1634  m_out->Print( aNestLevel, "(zone (net %d) (net_name %s)",
1635  aZone->GetIsKeepout() ? 0 : m_mapping->Translate( aZone->GetNetCode() ),
1636  m_out->Quotew( aZone->GetIsKeepout() ? wxT("") : aZone->GetNetname() ).c_str() );
1637 
1638  // If a zone exists on multiple layers, format accordingly
1639  if( aZone->GetLayerSet().count() > 1 )
1640  {
1641  formatLayers( aZone->GetLayerSet() );
1642  }
1643  else
1644  {
1645  formatLayer( aZone );
1646  }
1647 
1648  m_out->Print( 0, " (tstamp %lX)", (unsigned long) aZone->GetTimeStamp() );
1649 
1650  // Save the outline aux info
1651  std::string hatch;
1652 
1653  switch( aZone->GetHatchStyle() )
1654  {
1655  default:
1656  case ZONE_CONTAINER::NO_HATCH: hatch = "none"; break;
1657  case ZONE_CONTAINER::DIAGONAL_EDGE: hatch = "edge"; break;
1658  case ZONE_CONTAINER::DIAGONAL_FULL: hatch = "full"; break;
1659  }
1660 
1661  m_out->Print( 0, " (hatch %s %s)\n", hatch.c_str(),
1662  FMT_IU( aZone->GetHatchPitch() ).c_str() );
1663 
1664  if( aZone->GetPriority() > 0 )
1665  m_out->Print( aNestLevel+1, "(priority %d)\n", aZone->GetPriority() );
1666 
1667  m_out->Print( aNestLevel+1, "(connect_pads" );
1668 
1669  switch( aZone->GetPadConnection() )
1670  {
1671  default:
1672  case PAD_ZONE_CONN_THERMAL: // Default option not saved or loaded.
1673  break;
1674 
1676  m_out->Print( 0, " thru_hole_only" );
1677  break;
1678 
1679  case PAD_ZONE_CONN_FULL:
1680  m_out->Print( 0, " yes" );
1681  break;
1682 
1683  case PAD_ZONE_CONN_NONE:
1684  m_out->Print( 0, " no" );
1685  break;
1686  }
1687 
1688  m_out->Print( 0, " (clearance %s))\n",
1689  FMT_IU( aZone->GetZoneClearance() ).c_str() );
1690 
1691  m_out->Print( aNestLevel+1, "(min_thickness %s)\n",
1692  FMT_IU( aZone->GetMinThickness() ).c_str() );
1693 
1694  if( aZone->GetIsKeepout() )
1695  {
1696  m_out->Print( aNestLevel+1, "(keepout (tracks %s) (vias %s) (copperpour %s))\n",
1697  aZone->GetDoNotAllowTracks() ? "not_allowed" : "allowed",
1698  aZone->GetDoNotAllowVias() ? "not_allowed" : "allowed",
1699  aZone->GetDoNotAllowCopperPour() ? "not_allowed" : "allowed" );
1700  }
1701 
1702  m_out->Print( aNestLevel+1, "(fill" );
1703 
1704  // Default is not filled.
1705  if( aZone->IsFilled() )
1706  m_out->Print( 0, " yes" );
1707 
1708  // Default is polygon filled.
1709  if( aZone->GetFillMode() )
1710  m_out->Print( 0, " (mode segment)" );
1711 
1712  m_out->Print( 0, " (arc_segments %d) (thermal_gap %s) (thermal_bridge_width %s)",
1713  aZone->GetArcSegmentCount(),
1714  FMT_IU( aZone->GetThermalReliefGap() ).c_str(),
1715  FMT_IU( aZone->GetThermalReliefCopperBridge() ).c_str() );
1716 
1718  {
1719  m_out->Print( 0, " (smoothing" );
1720 
1721  switch( aZone->GetCornerSmoothingType() )
1722  {
1724  m_out->Print( 0, " chamfer" );
1725  break;
1726 
1728  m_out->Print( 0, " fillet" );
1729  break;
1730 
1731  default:
1732  THROW_IO_ERROR( wxString::Format( _( "unknown zone corner smoothing type %d" ),
1733  aZone->GetCornerSmoothingType() ) );
1734  }
1735  m_out->Print( 0, ")" );
1736 
1737  if( aZone->GetCornerRadius() != 0 )
1738  m_out->Print( 0, " (radius %s)",
1739  FMT_IU( aZone->GetCornerRadius() ).c_str() );
1740  }
1741 
1742  m_out->Print( 0, ")\n" );
1743 
1744  int newLine = 0;
1745 
1746  if( aZone->GetNumCorners() )
1747  {
1748  bool new_polygon = true;
1749  bool is_closed = false;
1750 
1751  for( auto iterator = aZone->IterateWithHoles(); iterator; iterator++ )
1752  {
1753  if( new_polygon )
1754  {
1755  newLine = 0;
1756  m_out->Print( aNestLevel+1, "(polygon\n" );
1757  m_out->Print( aNestLevel+2, "(pts\n" );
1758  new_polygon = false;
1759  is_closed = false;
1760  }
1761 
1762  if( newLine == 0 )
1763  m_out->Print( aNestLevel+3, "(xy %s %s)",
1764  FMT_IU( iterator->x ).c_str(), FMT_IU( iterator->y ).c_str() );
1765  else
1766  m_out->Print( 0, " (xy %s %s)",
1767  FMT_IU( iterator->x ).c_str(), FMT_IU( iterator->y ).c_str() );
1768 
1769  if( newLine < 4 )
1770  {
1771  newLine += 1;
1772  }
1773  else
1774  {
1775  newLine = 0;
1776  m_out->Print( 0, "\n" );
1777  }
1778 
1779  if( iterator.IsEndContour() )
1780  {
1781  is_closed = true;
1782 
1783  if( newLine != 0 )
1784  m_out->Print( 0, "\n" );
1785 
1786  m_out->Print( aNestLevel+2, ")\n" );
1787  m_out->Print( aNestLevel+1, ")\n" );
1788  new_polygon = true;
1789  }
1790  }
1791 
1792  if( !is_closed ) // Should not happen, but...
1793  m_out->Print( aNestLevel+1, ")\n" );
1794 
1795  }
1796 
1797  // Save the PolysList (filled areas)
1798  const SHAPE_POLY_SET& fv = aZone->GetFilledPolysList();
1799  newLine = 0;
1800 
1801  if( !fv.IsEmpty() )
1802  {
1803  bool new_polygon = true;
1804  bool is_closed = false;
1805 
1806  for( auto it = fv.CIterate(); it; ++it )
1807  {
1808  if( new_polygon )
1809  {
1810  newLine = 0;
1811  m_out->Print( aNestLevel+1, "(filled_polygon\n" );
1812  m_out->Print( aNestLevel+2, "(pts\n" );
1813  new_polygon = false;
1814  is_closed = false;
1815  }
1816 
1817  if( newLine == 0 )
1818  m_out->Print( aNestLevel+3, "(xy %s %s)",
1819  FMT_IU( it->x ).c_str(), FMT_IU( it->y ).c_str() );
1820  else
1821  m_out->Print( 0, " (xy %s %s)",
1822  FMT_IU( it->x ) .c_str(), FMT_IU( it->y ).c_str() );
1823 
1824  if( newLine < 4 )
1825  {
1826  newLine += 1;
1827  }
1828  else
1829  {
1830  newLine = 0;
1831  m_out->Print( 0, "\n" );
1832  }
1833 
1834  if( it.IsEndContour() )
1835  {
1836  is_closed = true;
1837 
1838  if( newLine != 0 )
1839  m_out->Print( 0, "\n" );
1840 
1841  m_out->Print( aNestLevel+2, ")\n" );
1842  m_out->Print( aNestLevel+1, ")\n" );
1843  new_polygon = true;
1844  }
1845  }
1846 
1847  if( !is_closed ) // Should not happen, but...
1848  m_out->Print( aNestLevel+1, ")\n" );
1849  }
1850 
1851  // Save the filling segments list
1852  const std::vector< SEGMENT >& segs = aZone->FillSegments();
1853 
1854  if( segs.size() )
1855  {
1856  m_out->Print( aNestLevel+1, "(fill_segments\n" );
1857 
1858  for( std::vector< SEGMENT >::const_iterator it = segs.begin(); it != segs.end(); ++it )
1859  {
1860  m_out->Print( aNestLevel+2, "(pts (xy %s) (xy %s))\n",
1861  FMT_IU( it->m_Start ).c_str(),
1862  FMT_IU( it->m_End ).c_str() );
1863  }
1864 
1865  m_out->Print( aNestLevel+1, ")\n" );
1866  }
1867 
1868  m_out->Print( aNestLevel, ")\n" );
1869 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
int GetNumCorners(void) const
Access to m_Poly parameters.
Definition: class_zone.h:480
int GetMinThickness() const
Definition: class_zone.h:224
bool GetDoNotAllowCopperPour() const
Definition: class_zone.h:673
int GetArcSegmentCount() const
Definition: class_zone.h:213
bool IsFilled() const
Definition: class_zone.h:215
CONST_ITERATOR CIterate(int aFirst, int aLast, bool aIterateHoles=false) const
void formatLayer(const BOARD_ITEM *aItem) const
int GetCornerSmoothingType() const
Definition: class_zone.h:630
int GetThermalReliefCopperBridge(D_PAD *aPad=NULL) const
Definition: class_zone.cpp:644
unsigned int GetCornerRadius() const
Definition: class_zone.h:634
Pads are not covered.
Definition: zones.h:57
bool GetIsKeepout() const
Accessors to parameters used in Keepout zones:
Definition: class_zone.h:672
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:237
std::vector< SEGMENT > & FillSegments()
Definition: class_zone.h:259
#define FMT_IU
ZoneConnection GetPadConnection(D_PAD *aPad=NULL) const
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:635
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:600
Thermal relief only for THT pads.
Definition: zones.h:60
time_t GetTimeStamp() const
Definition: base_struct.h:218
int GetNetCode() const
Function GetNetCode.
bool GetDoNotAllowTracks() const
Definition: class_zone.h:675
int GetFillMode() const
Definition: class_zone.h:201
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:674
SHAPE_POLY_SET::ITERATOR IterateWithHoles()
Function IterateWithHoles returns an iterator to visit all points of the zone's main outline with hol...
Definition: class_zone.h:500
HATCH_STYLE GetHatchStyle() const
Definition: class_zone.h:564
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:119
#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:218
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 671 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(), m_out, Margin, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), LSET::Seq(), and LAYER::ShowType().

Referenced by formatHeader(), and CLIPBOARD_IO::SaveSelection().

672 {
673  m_out->Print( aNestLevel, "(layers\n" );
674 
675  // Save only the used copper layers from front to back.
676  LSET visible_layers = aBoard->GetVisibleLayers();
677 
678  for( LSEQ cu = aBoard->GetEnabledLayers().CuStack(); cu; ++cu )
679  {
680  PCB_LAYER_ID layer = *cu;
681 
682  m_out->Print( aNestLevel+1, "(%d %s %s", layer,
683  m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str(),
684  LAYER::ShowType( aBoard->GetLayerType( layer ) ) );
685 
686  if( !visible_layers[layer] )
687  m_out->Print( 0, " hide" );
688 
689  m_out->Print( 0, ")\n" );
690  }
691 
692  // Save used non-copper layers in the order they are defined.
693  // desired sequence for non Cu BOARD layers.
694  static const PCB_LAYER_ID non_cu[] =
695  {
696  B_Adhes, // 32
697  F_Adhes,
698  B_Paste,
699  F_Paste,
700  B_SilkS,
701  F_SilkS,
702  B_Mask,
703  F_Mask,
704  Dwgs_User,
705  Cmts_User,
706  Eco1_User,
707  Eco2_User,
708  Edge_Cuts,
709  Margin,
710  B_CrtYd,
711  F_CrtYd,
712  B_Fab,
713  F_Fab
714  };
715 
716  for( LSEQ seq = aBoard->GetEnabledLayers().Seq( non_cu, DIM( non_cu ) ); seq; ++seq )
717  {
718  PCB_LAYER_ID layer = *seq;
719 
720  m_out->Print( aNestLevel+1, "(%d %s user", layer,
721  m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str() );
722 
723  if( !visible_layers[layer] )
724  m_out->Print( 0, " hide" );
725 
726  m_out->Print( 0, ")\n" );
727  }
728 
729  m_out->Print( aNestLevel, ")\n\n" );
730 }
#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:337
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 649 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(), NETINFO_MAPPING::GetSize(), BOARD::GetTitleBlock(), m_ctl, m_mapping, BOARD::m_Modules, m_out, and OUTPUTFORMATTER::Print().

Referenced by formatHeader().

650 {
651  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
652 
653  m_out->Print( 0, "\n" );
654  m_out->Print( aNestLevel, "(general\n" );
655  // Write Bounding box info
656  m_out->Print( aNestLevel+1, "(thickness %s)\n",
657  FMT_IU( dsnSettings.GetBoardThickness() ).c_str() );
658 
659  m_out->Print( aNestLevel+1, "(drawings %d)\n", aBoard->Drawings().Size() );
660  m_out->Print( aNestLevel+1, "(tracks %d)\n", aBoard->GetNumSegmTrack() );
661  m_out->Print( aNestLevel+1, "(zones %d)\n", aBoard->GetNumSegmZone() );
662  m_out->Print( aNestLevel+1, "(modules %d)\n", aBoard->m_Modules.GetCount() );
663  m_out->Print( aNestLevel+1, "(nets %d)\n", m_mapping->GetSize() );
664  m_out->Print( aNestLevel, ")\n\n" );
665 
666  aBoard->GetPageSettings().Format( m_out, aNestLevel, m_ctl );
667  aBoard->GetTitleBlock().Format( m_out, aNestLevel, m_ctl );
668 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
#define FMT_IU
int GetSize() const
Function GetSize.
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:245
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.
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 763 of file kicad_plugin.cpp.

References formatBoardLayers(), formatGeneral(), formatNetInformation(), and formatSetup().

Referenced by format().

764 {
765  formatGeneral( aBoard, aNestLevel );
766  // Layers.
767  formatBoardLayers( aBoard, aNestLevel );
768  // Setup
769  formatSetup( aBoard, aNestLevel );
770  // Save net codes and names
771  formatNetInformation( aBoard, aNestLevel );
772 }
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 518 of file kicad_plugin.cpp.

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

Referenced by format().

519 {
520  if( m_ctl & CTL_STD_LAYER_NAMES )
521  {
522  PCB_LAYER_ID layer = aItem->GetLayer();
523 
524  // English layer names should never need quoting.
525  m_out->Print( 0, " (layer %s)", TO_UTF8( BOARD::GetStandardLayerName( layer ) ) );
526  }
527  else
528  m_out->Print( 0, " (layer %s)", m_out->Quotew( aItem->GetLayerName() ).c_str() );
529 }
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 1168 of file kicad_plugin.cpp.

References LSET::AllCuMask(), B_Adhes, B_CrtYd, B_Cu, B_Fab, B_Mask, B_Paste, B_SilkS, CTL_STD_LAYER_NAMES, F_Adhes, F_CrtYd, F_Cu, F_Fab, F_Mask, F_Paste, F_SilkS, BOARD::GetEnabledLayers(), BOARD::GetLayerName(), BOARD::GetStandardLayerName(), m_board, m_ctl, m_out, PCB_LAYER_ID_COUNT, OUTPUTFORMATTER::Print(), and OUTPUTFORMATTER::Quotew().

Referenced by format().

1169 {
1170  std::string output;
1171 
1172  if( aNestLevel == 0 )
1173  output += ' ';
1174 
1175  output += "(layers";
1176 
1177  static const LSET cu_all( LSET::AllCuMask() );
1178  static const LSET fr_bk( 2, B_Cu, F_Cu );
1179  static const LSET adhes( 2, B_Adhes, F_Adhes );
1180  static const LSET paste( 2, B_Paste, F_Paste );
1181  static const LSET silks( 2, B_SilkS, F_SilkS );
1182  static const LSET mask( 2, B_Mask, F_Mask );
1183  static const LSET crt_yd(2, B_CrtYd, F_CrtYd );
1184  static const LSET fab( 2, B_Fab, F_Fab );
1185 
1186  LSET cu_mask = cu_all;
1187 
1188  if( m_board )
1189  cu_mask &= m_board->GetEnabledLayers();
1190 
1191  // output copper layers first, then non copper
1192 
1193  if( ( aLayerMask & cu_mask ) == cu_mask )
1194  {
1195  output += " *.Cu";
1196  aLayerMask &= ~cu_all; // clear bits, so they are not output again below
1197  }
1198  else if( ( aLayerMask & cu_mask ) == fr_bk )
1199  {
1200  output += " F&B.Cu";
1201  aLayerMask &= ~fr_bk;
1202  }
1203 
1204  if( ( aLayerMask & adhes ) == adhes )
1205  {
1206  output += " *.Adhes";
1207  aLayerMask &= ~adhes;
1208  }
1209 
1210  if( ( aLayerMask & paste ) == paste )
1211  {
1212  output += " *.Paste";
1213  aLayerMask &= ~paste;
1214  }
1215 
1216  if( ( aLayerMask & silks ) == silks )
1217  {
1218  output += " *.SilkS";
1219  aLayerMask &= ~silks;
1220  }
1221 
1222  if( ( aLayerMask & mask ) == mask )
1223  {
1224  output += " *.Mask";
1225  aLayerMask &= ~mask;
1226  }
1227 
1228  if( ( aLayerMask & crt_yd ) == crt_yd )
1229  {
1230  output += " *.CrtYd";
1231  aLayerMask &= ~crt_yd;
1232  }
1233 
1234  if( ( aLayerMask & fab ) == fab )
1235  {
1236  output += " *.Fab";
1237  aLayerMask &= ~fab;
1238  }
1239 
1240  // output any individual layers not handled in wildcard combos above
1241 
1242  if( m_board )
1243  aLayerMask &= m_board->GetEnabledLayers();
1244 
1245  wxString layerName;
1246 
1247  for( LAYER_NUM layer = 0; layer < PCB_LAYER_ID_COUNT; ++layer )
1248  {
1249  if( aLayerMask[layer] )
1250  {
1251  if( m_board && !( m_ctl & CTL_STD_LAYER_NAMES ) )
1252  layerName = m_board->GetLayerName( PCB_LAYER_ID( layer ) );
1253 
1254  else // I am being called from FootprintSave()
1255  layerName = BOARD::GetStandardLayerName( PCB_LAYER_ID( layer ) );
1256 
1257  output += ' ';
1258  output += m_out->Quotew( layerName );
1259  }
1260  }
1261 
1262  m_out->Print( aNestLevel, "%s)", output.c_str() );
1263 }
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:646
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 733 of file kicad_plugin.cpp.

References NETCLASSES::begin(), NETINFO_MAPPING::begin(), NETCLASSES::end(), NETINFO_MAPPING::end(), filterNetClass(), NETCLASS::Format(), BOARD_DESIGN_SETTINGS::GetDefault(), BOARD::GetDesignSettings(), m_ctl, m_mapping, BOARD_DESIGN_SETTINGS::m_NetClasses, m_out, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), and NETINFO_MAPPING::Translate().

Referenced by formatHeader(), and CLIPBOARD_IO::SaveSelection().

734 {
735  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
736  for( NETINFO_MAPPING::iterator net = m_mapping->begin(), netEnd = m_mapping->end();
737  net != netEnd; ++net )
738  {
739  m_out->Print( aNestLevel, "(net %d %s)\n",
740  m_mapping->Translate( net->GetNet() ),
741  m_out->Quotew( net->GetNetname() ).c_str() );
742  }
743 
744  m_out->Print( 0, "\n" );
745 
746  // Save the default net class first.
747  NETCLASS defaultNC = *dsnSettings.GetDefault();
748  filterNetClass( *aBoard, defaultNC ); // Remove empty nets (from a copy of a netclass)
749  defaultNC.Format( m_out, aNestLevel, m_ctl );
750 
751  // Save the rest of the net classes alphabetically.
752  for( NETCLASSES::const_iterator it = dsnSettings.m_NetClasses.begin();
753  it != dsnSettings.m_NetClasses.end();
754  ++it )
755  {
756  NETCLASS netclass = *it->second;
757  filterNetClass( *aBoard, netclass ); // Remove empty nets (from a copy of a netclass)
758  netclass.Format( m_out, aNestLevel, m_ctl );
759  }
760 }
iterator begin() const
Function begin() Returns iterator to the first entry in the mapping.
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
NETCLASSPTR GetDefault() const
Function GetDefault.
iterator end()
NETCLASS_MAP::const_iterator const_iterator
iterator end() const
Function end() Returns iterator to the last entry in the mapping.
void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Function Format outputs the net class to aFormatter in s-expression form.
iterator begin()
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...
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
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 531 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, m_out, BOARD_DESIGN_SETTINGS::m_Pad_Master, BOARD_DESIGN_SETTINGS::m_PcbTextSize, BOARD_DESIGN_SETTINGS::m_PcbTextWidth, BOARD_DESIGN_SETTINGS::m_SolderMaskMargin, BOARD_DESIGN_SETTINGS::m_SolderMaskMinWidth, BOARD_DESIGN_SETTINGS::m_SolderPasteMargin, BOARD_DESIGN_SETTINGS::m_SolderPasteMarginRatio, BOARD_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, OUTPUTFORMATTER::Print(), wxPoint::x, and wxPoint::y.

Referenced by formatHeader().

532 {
533  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
534 
535  // Setup
536  m_out->Print( aNestLevel, "(setup\n" );
537 
538  // Save current default track width, for compatibility with older Pcbnew version;
539  m_out->Print( aNestLevel+1, "(last_trace_width %s)\n",
540  FMT_IU( dsnSettings.GetCurrentTrackWidth() ).c_str() );
541 
542  // Save custom tracks width list (the first is not saved here: this is the netclass value
543  for( unsigned ii = 1; ii < dsnSettings.m_TrackWidthList.size(); ii++ )
544  m_out->Print( aNestLevel+1, "(user_trace_width %s)\n",
545  FMT_IU( dsnSettings.m_TrackWidthList[ii] ).c_str() );
546 
547  m_out->Print( aNestLevel+1, "(trace_clearance %s)\n",
548  FMT_IU( dsnSettings.GetDefault()->GetClearance() ).c_str() );
549 
550  // ZONE_SETTINGS
551  m_out->Print( aNestLevel+1, "(zone_clearance %s)\n",
552  FMT_IU( aBoard->GetZoneSettings().m_ZoneClearance ).c_str() );
553  m_out->Print( aNestLevel+1, "(zone_45_only %s)\n",
554  aBoard->GetZoneSettings().m_Zone_45_Only ? "yes" : "no" );
555 
556  m_out->Print( aNestLevel+1, "(trace_min %s)\n",
557  FMT_IU( dsnSettings.m_TrackMinWidth ).c_str() );
558 
559  m_out->Print( aNestLevel+1, "(segment_width %s)\n",
560  FMT_IU( dsnSettings.m_DrawSegmentWidth ).c_str() );
561  m_out->Print( aNestLevel+1, "(edge_width %s)\n",
562  FMT_IU( dsnSettings.m_EdgeSegmentWidth ).c_str() );
563 
564  // Save current default via size, for compatibility with older Pcbnew version;
565  m_out->Print( aNestLevel+1, "(via_size %s)\n",
566  FMT_IU( dsnSettings.GetDefault()->GetViaDiameter() ).c_str() );
567  m_out->Print( aNestLevel+1, "(via_drill %s)\n",
568  FMT_IU( dsnSettings.GetDefault()->GetViaDrill() ).c_str() );
569  m_out->Print( aNestLevel+1, "(via_min_size %s)\n",
570  FMT_IU( dsnSettings.m_ViasMinSize ).c_str() );
571  m_out->Print( aNestLevel+1, "(via_min_drill %s)\n",
572  FMT_IU( dsnSettings.m_ViasMinDrill ).c_str() );
573 
574  // Save custom vias diameters list (the first is not saved here: this is
575  // the netclass value
576  for( unsigned ii = 1; ii < dsnSettings.m_ViasDimensionsList.size(); ii++ )
577  m_out->Print( aNestLevel+1, "(user_via %s %s)\n",
578  FMT_IU( dsnSettings.m_ViasDimensionsList[ii].m_Diameter ).c_str(),
579  FMT_IU( dsnSettings.m_ViasDimensionsList[ii].m_Drill ).c_str() );
580 
581  // for old versions compatibility:
582  if( dsnSettings.m_BlindBuriedViaAllowed )
583  m_out->Print( aNestLevel+1, "(blind_buried_vias_allowed yes)\n" );
584 
585  m_out->Print( aNestLevel+1, "(uvia_size %s)\n",
586  FMT_IU( dsnSettings.GetDefault()->GetuViaDiameter() ).c_str() );
587  m_out->Print( aNestLevel+1, "(uvia_drill %s)\n",
588  FMT_IU( dsnSettings.GetDefault()->GetuViaDrill() ).c_str() );
589  m_out->Print( aNestLevel+1, "(uvias_allowed %s)\n",
590  ( dsnSettings.m_MicroViasAllowed ) ? "yes" : "no" );
591  m_out->Print( aNestLevel+1, "(uvia_min_size %s)\n",
592  FMT_IU( dsnSettings.m_MicroViasMinSize ).c_str() );
593  m_out->Print( aNestLevel+1, "(uvia_min_drill %s)\n",
594  FMT_IU( dsnSettings.m_MicroViasMinDrill ).c_str() );
595 
596  m_out->Print( aNestLevel+1, "(pcb_text_width %s)\n",
597  FMT_IU( dsnSettings.m_PcbTextWidth ).c_str() );
598  m_out->Print( aNestLevel+1, "(pcb_text_size %s %s)\n",
599  FMT_IU( dsnSettings.m_PcbTextSize.x ).c_str(),
600  FMT_IU( dsnSettings.m_PcbTextSize.y ).c_str() );
601 
602  m_out->Print( aNestLevel+1, "(mod_edge_width %s)\n",
603  FMT_IU( dsnSettings.m_ModuleSegmentWidth ).c_str() );
604  m_out->Print( aNestLevel+1, "(mod_text_size %s %s)\n",
605  FMT_IU( dsnSettings.m_ModuleTextSize.x ).c_str(),
606  FMT_IU( dsnSettings.m_ModuleTextSize.y ).c_str() );
607  m_out->Print( aNestLevel+1, "(mod_text_width %s)\n",
608  FMT_IU( dsnSettings.m_ModuleTextWidth ).c_str() );
609 
610  m_out->Print( aNestLevel+1, "(pad_size %s %s)\n",
611  FMT_IU( dsnSettings.m_Pad_Master.GetSize().x ).c_str(),
612  FMT_IU( dsnSettings.m_Pad_Master.GetSize().y ).c_str() );
613  m_out->Print( aNestLevel+1, "(pad_drill %s)\n",
614  FMT_IU( dsnSettings.m_Pad_Master.GetDrillSize().x ).c_str() );
615 
616  m_out->Print( aNestLevel+1, "(pad_to_mask_clearance %s)\n",
617  FMT_IU( dsnSettings.m_SolderMaskMargin ).c_str() );
618 
619  if( dsnSettings.m_SolderMaskMinWidth )
620  m_out->Print( aNestLevel+1, "(solder_mask_min_width %s)\n",
621  FMT_IU( dsnSettings.m_SolderMaskMinWidth ).c_str() );
622 
623  if( dsnSettings.m_SolderPasteMargin != 0 )
624  m_out->Print( aNestLevel+1, "(pad_to_paste_clearance %s)\n",
625  FMT_IU( dsnSettings.m_SolderPasteMargin ).c_str() );
626 
627  if( dsnSettings.m_SolderPasteMarginRatio != 0 )
628  m_out->Print( aNestLevel+1, "(pad_to_paste_clearance_ratio %s)\n",
629  Double2Str( dsnSettings.m_SolderPasteMarginRatio ).c_str() );
630 
631  m_out->Print( aNestLevel+1, "(aux_axis_origin %s %s)\n",
632  FMT_IU( aBoard->GetAuxOrigin().x ).c_str(),
633  FMT_IU( aBoard->GetAuxOrigin().y ).c_str() );
634 
635  if( aBoard->GetGridOrigin().x || aBoard->GetGridOrigin().y )
636  m_out->Print( aNestLevel+1, "(grid_origin %s %s)\n",
637  FMT_IU( aBoard->GetGridOrigin().x ).c_str(),
638  FMT_IU( aBoard->GetGridOrigin().y ).c_str() );
639 
640  m_out->Print( aNestLevel+1, "(visible_elements %X)\n",
641  dsnSettings.GetVisibleElements() );
642 
643  aBoard->GetPlotOptions().Format( m_out, aNestLevel+1 );
644 
645  m_out->Print( aNestLevel, ")\n\n" );
646 }
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.
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 104 of file pcbnew/kicad_plugin.h.

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

Definition at line 153 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().

154  {
155  std::string ret = m_sf.GetString();
156  if( doClear )
157  m_sf.Clear();
158 
159  return ret;
160  }
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 1935 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(), CLIPBOARD_IO::Save(), and Save().

1936 {
1937  m_board = NULL;
1938  m_reader = NULL;
1940  m_props = aProperties;
1941 }
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 2204 of file kicad_plugin.cpp.

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

Referenced by GITHUB_PLUGIN::IsFootprintLibWritable().

2205 {
2206  LOCALE_IO toggle;
2207 
2208  init( NULL );
2209 
2210  cacheLib( aLibraryPath );
2211 
2212  return m_cache->IsWritable();
2213 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:165
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 1891 of file kicad_plugin.cpp.

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

1892 {
1893  FILE_LINE_READER reader( aFileName );
1894 
1895  init( aProperties );
1896 
1897  m_parser->SetLineReader( &reader );
1898  m_parser->SetBoard( aAppendToMe );
1899 
1900  BOARD* board;
1901 
1902  try
1903  {
1904  board = dynamic_cast<BOARD*>( m_parser->Parse() );
1905  }
1906  catch( const FUTURE_FORMAT_ERROR& )
1907  {
1908  // Don't wrap a FUTURE_FORMAT_ERROR in another
1909  throw;
1910  }
1911  catch( const PARSE_ERROR& parse_error )
1912  {
1913  if( m_parser->IsTooRecent() )
1914  throw FUTURE_FORMAT_ERROR( parse_error, m_parser->GetRequiredVersion() );
1915  else
1916  throw;
1917  }
1918 
1919  if( !board )
1920  {
1921  // The parser loaded something that was valid, but wasn't a board.
1922  THROW_PARSE_ERROR( _( "this file does not contain a PCB" ),
1925  }
1926 
1927  // Give the filename to the board if it's new
1928  if( !aAppendToMe )
1929  board->SetFileName( aFileName );
1930 
1931  return board;
1932 }
void init(const PROPERTIES *aProperties)
const wxString & CurSource()
Function CurFilename returns the current LINE_READER source.
Definition: dsnlexer.h:528
Class FILE_LINE_READER is a LINE_READER that reads from an open file.
Definition: richio.h:180
wxString GetRequiredVersion()
Return a string representing the version of kicad required to open this file.
Definition: pcb_parser.cpp:182
#define THROW_PARSE_ERROR(aProblem, aSource, aInputLine, aLineNumber, aByteIndex)
Definition: ki_exception.h:133
void SetBoard(BOARD *aBoard)
Definition: pcb_parser.h:296
int CurOffset()
Function CurOffset returns the byte offset within the current line, using a 1 based index...
Definition: dsnlexer.h:538
void SetFileName(const wxString &aFileName)
Definition: class_board.h:232
PCB_PARSER * m_parser
BOARD_ITEM * Parse()
Definition: pcb_parser.cpp:422
LINE_READER * SetLineReader(LINE_READER *aReader)
Function SetLineReader sets aLineReader into the parser, and returns the previous one...
Definition: pcb_parser.h:289
const char * CurLine()
Function CurLine returns the current line of text, from which the CurText() would return its token...
Definition: dsnlexer.h:517
bool IsTooRecent()
Return whether a version number, if any was parsed, was too recent.
Definition: pcb_parser.h:314
Struct PARSE_ERROR contains a filename or source description, a problem input line, a line number, a byte offset, and an error message which contains the the caller's report and his call site information: CPP source file, function, and line number.
Definition: ki_exception.h:94
Class BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:169
int CurLineNumber()
Function CurLineNumber returns the current line number within my LINE_READER.
Definition: dsnlexer.h:507
Struct FUTURE_FORMAT_ERROR variant of PARSE_ERROR indicating that a syntax or related error was likel...
Definition: ki_exception.h:143
BOARD_ITEM * PCB_IO::Parse ( const wxString &  aClipboardSourceInput)

Definition at line 439 of file kicad_plugin.cpp.

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

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

440 {
441  std::string input = TO_UTF8( aClipboardSourceInput );
442 
443  STRING_LINE_READER reader( input, wxT( "clipboard" ) );
444 
445  m_parser->SetLineReader( &reader );
446 
447  try
448  {
449  return m_parser->Parse();
450  }
451  catch( const PARSE_ERROR& parse_error )
452  {
453  if( m_parser->IsTooRecent() )
454  throw FUTURE_FORMAT_ERROR( parse_error, m_parser->GetRequiredVersion() );
455  else
456  throw;
457  }
458 }
#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:422
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'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 99 of file pcbnew/kicad_plugin.h.

100  {
101  return wxT( "KiCad" );
102  }
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 415 of file kicad_plugin.cpp.

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

416 {
417  LOCALE_IO toggle; // toggles on, then off, the C locale.
418 
419  init( aProperties );
420 
421  m_board = aBoard; // after init()
422 
423  // Prepare net mapping that assures that net codes saved in a file are consecutive integers
424  m_mapping->SetBoard( aBoard );
425 
426  FILE_OUTPUTFORMATTER formatter( aFileName );
427 
428  m_out = &formatter; // no ownership
429 
430  m_out->Print( 0, "(kicad_pcb (version %d) (host pcbnew %s)\n", SEXPR_BOARD_FILE_VERSION,
431  formatter.Quotew( GetBuildVersion() ).c_str() );
432 
433  Format( aBoard, 1 );
434 
435  m_out->Print( 0, ")\n" );
436 }
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:165
void init(const PROPERTIES *aProperties)
#define SEXPR_BOARD_FILE_VERSION
Current s-expression file format version. 2 was the last legacy format version.
void SetBoard(const BOARD *aBoard)
Function SetBoard Sets a BOARD object that is used to prepare the net code map.
wxString GetBuildVersion()
Function GetBuildVersion Return the build version string.
void Format(BOARD_ITEM *aItem, int aNestLevel=0) const
Function Format outputs aItem to aFormatter in s-expression format.
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes ...
BOARD * m_board
which BOARD, no ownership here
Class FILE_OUTPUTFORMATTER may be used for text file output.
Definition: richio.h:492
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
void PCB_IO::SetOutputFormatter ( OUTPUTFORMATTER aFormatter)
inline

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

References m_out.

Referenced by FP_CACHE::Save().

162 { 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 93 of file pcbnew/kicad_plugin.h.

Referenced by cacheLib(), and FootprintLibCreate().

Member Data Documentation

BOARD* PCB_IO::m_board
protected
int PCB_IO::m_ctl
protected
wxString PCB_IO::m_error
protected

for throwing exceptions

Definition at line 168 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 176 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 178 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 184 of file pcbnew/kicad_plugin.h.

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

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

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

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

Referenced by init().

LINE_READER* PCB_IO::m_reader
protected

no ownership here.

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

Referenced by init().

STRING_FORMATTER PCB_IO::m_sf
protected

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

Referenced by GetStringOutput(), and PCB_IO().


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