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...
 
const MODULEGetEnumeratedFootprint (const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties=NULL) override
 Function GetEnumeratedFootprint a version of FootprintLoad() for use after FootprintEnumerate() for more efficient cache management. More...
 
MODULEFootprintLoad (const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties=NULL) override
 Function FootprintLoad loads a footprint having aFootprintName from the aLibraryPath containing a library format that this PLUGIN knows about. More...
 
void FootprintSave (const wxString &aLibraryPath, const MODULE *aFootprint, const PROPERTIES *aProperties=NULL) override
 Function FootprintSave will write aModule to an existing library located at aLibraryPath. More...
 
void FootprintDelete (const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties=NULL) override
 Function FootprintDelete deletes aFootprintName from the library at aLibraryPath. More...
 
long long GetLibraryTimestamp (const wxString &aLibraryPath) const override
 Generate a timestamp representing all the files in the library (including the library directory). More...
 
void FootprintLibCreate (const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 Function FootprintLibCreate creates a new empty footprint library at aLibraryPath empty. More...
 
bool FootprintLibDelete (const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 Function FootprintLibDelete deletes an existing footprint library and returns true, or if library does not exist returns false, or throws an exception if library exists but is read only or cannot be deleted for some other reason. More...
 
bool IsFootprintLibWritable (const wxString &aLibraryPath) override
 Function IsFootprintLibWritable returns true iff the library at aLibraryPath is writable. More...
 
 PCB_IO (int aControlFlags=CTL_FOR_BOARD)
 
 ~PCB_IO ()
 
void Format (BOARD_ITEM *aItem, int aNestLevel=0) const
 Function Format outputs aItem to aFormatter in s-expression format. More...
 
std::string GetStringOutput (bool doClear)
 
void SetOutputFormatter (OUTPUTFORMATTER *aFormatter)
 
BOARD_ITEMParse (const wxString &aClipboardSourceInput)
 
virtual void PrefetchLib (const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL)
 Function PrefetchLib If possible, prefetches the specified library (e.g. More...
 
virtual void FootprintLibOptions (PROPERTIES *aListToAppendTo) const
 Function FootprintLibOptions appends supported PLUGIN options to aListToAppenTo along with internationalized descriptions. More...
 

Protected Member Functions

void validateCache (const wxString &aLibraryPath, bool checkModified=true)
 
const MODULEgetFootprint (const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties, bool checkModified)
 
void init (const PROPERTIES *aProperties)
 
void formatSetup (BOARD *aBoard, int aNestLevel=0) const
 formats the board setup information More...
 
void formatGeneral (BOARD *aBoard, int aNestLevel=0) const
 formats the General section of the file More...
 
void formatBoardLayers (BOARD *aBoard, int aNestLevel=0) const
 formats the board layer information More...
 
void formatNetInformation (BOARD *aBoard, int aNestLevel=0) const
 formats the Nets and Netclasses More...
 
void formatHeader (BOARD *aBoard, int aNestLevel=0) const
 writes everything that comes before the board_items, like settings and layers etc More...
 

Protected Attributes

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

Private Member Functions

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

Friends

class FP_CACHE
 

Detailed Description

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

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

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

Constructor & Destructor Documentation

PCB_IO::PCB_IO ( int  aControlFlags = CTL_FOR_BOARD)

Definition at line 1860 of file kicad_plugin.cpp.

References init(), m_out, and m_sf.

Referenced by GetFileExtension().

1860  :
1861  m_cache( 0 ),
1862  m_ctl( aControlFlags ),
1863  m_parser( new PCB_PARSER() ),
1864  m_mapping( new NETINFO_MAPPING() )
1865 {
1866  init( 0 );
1867  m_out = &m_sf;
1868 }
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 1871 of file kicad_plugin.cpp.

References m_cache, m_mapping, and m_parser.

Referenced by GetFileExtension().

1872 {
1873  delete m_cache;
1874  delete m_parser;
1875  delete m_mapping;
1876 }
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::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 2125 of file kicad_plugin.cpp.

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

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

2127 {
2128  LOCALE_IO toggle; // toggles on, then off, the C locale.
2129 
2130  init( aProperties );
2131 
2132  validateCache( aLibraryPath );
2133 
2134  if( !m_cache->IsWritable() )
2135  {
2136  THROW_IO_ERROR( wxString::Format( _( "Library \"%s\" is read only" ),
2137  aLibraryPath.GetData() ) );
2138  }
2139 
2140  m_cache->Remove( aFootprintName );
2141 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:179
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
void Remove(const wxString &aFootprintName)
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
#define THROW_IO_ERROR(msg)
bool IsWritable() const
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
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 1944 of file kicad_plugin.cpp.

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

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

1947 {
1948  LOCALE_IO toggle; // toggles on, then off, the C locale.
1949  wxDir dir( aLibraryPath );
1950 
1951  init( aProperties );
1952 
1953  wxString errorMsg;
1954 
1955  try
1956  {
1957  validateCache( aLibraryPath );
1958  }
1959  catch( const IO_ERROR& ioe )
1960  {
1961  errorMsg = ioe.What();
1962  }
1963 
1964  // Some of the files may have been parsed correctly so we want to add the valid files to
1965  // the library.
1966 
1967  const MODULE_MAP& mods = m_cache->GetModules();
1968 
1969  for( MODULE_CITER it = mods.begin(); it != mods.end(); ++it )
1970  {
1971  aFootprintNames.Add( it->first );
1972  }
1973 
1974  if( !errorMsg.IsEmpty() )
1975  THROW_IO_ERROR( errorMsg );
1976 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:179
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
#define THROW_IO_ERROR(msg)
std::map< wxString, MODULE * > MODULE_MAP
Definition: eagle_plugin.h:36
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:33
MODULE_MAP::const_iterator MODULE_CITER
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:76
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 2151 of file kicad_plugin.cpp.

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

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

2152 {
2153  if( wxDir::Exists( aLibraryPath ) )
2154  {
2155  THROW_IO_ERROR( wxString::Format( _( "cannot overwrite library path \"%s\"" ),
2156  aLibraryPath.GetData() ) );
2157  }
2158 
2159  LOCALE_IO toggle;
2160 
2161  init( aProperties );
2162 
2163  delete m_cache;
2164  m_cache = new FP_CACHE( this, aLibraryPath );
2165  m_cache->Save();
2166 }
friend class FP_CACHE
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:179
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
#define THROW_IO_ERROR(msg)
void Save(MODULE *aModule=NULL)
Function Save Save the footprint cache or a single module from it to disk.
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
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 2169 of file kicad_plugin.cpp.

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

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

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

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

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

References getFootprint().

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

2020 {
2021  const MODULE* footprint = getFootprint( aLibraryPath, aFootprintName, aProperties, true );
2022  return footprint ? new MODULE( *footprint ) : nullptr;
2023 }
const MODULE * getFootprint(const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties, bool checkModified)
void PCB_IO::FootprintSave ( const wxString &  aLibraryPath,
const MODULE aFootprint,
const PROPERTIES aProperties = NULL 
)
overridevirtual

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

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

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

Reimplemented from PLUGIN.

Definition at line 2026 of file kicad_plugin.cpp.

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

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

2028 {
2029  LOCALE_IO toggle; // toggles on, then off, the C locale.
2030 
2031  init( aProperties );
2032 
2033  // In this public PLUGIN API function, we can safely assume it was
2034  // called for saving into a library path.
2036 
2037  validateCache( aLibraryPath );
2038 
2039  if( !m_cache->IsWritable() )
2040  {
2041  if( !m_cache->Exists() )
2042  {
2043  const wxString msg = wxString::Format( _( "Library \"%s\" does not exist.\n"
2044  "Would you like to create it?"),
2045  GetChars( aLibraryPath ) );
2046 
2047  if( wxMessageBox( msg, _( "Library Not Found"), wxYES_NO | wxICON_QUESTION ) != wxYES )
2048  return;
2049 
2050  // Save throws its own IO_ERROR on failure, so no need to recreate here
2051  m_cache->Save( NULL );
2052  }
2053  else
2054  {
2055  wxString msg = wxString::Format( _( "Library \"%s\" is read only" ), aLibraryPath );
2056  THROW_IO_ERROR( msg );
2057  }
2058  }
2059 
2060  wxString footprintName = aFootprint->GetFPID().GetLibItemName();
2061 
2062  MODULE_MAP& mods = m_cache->GetModules();
2063 
2064  // Quietly overwrite module and delete module file from path for any by same name.
2065  wxFileName fn( aLibraryPath, aFootprint->GetFPID().GetLibItemName(),
2067 
2068 #ifndef __WINDOWS__
2069  // Write through symlinks, don't replace them
2070  if( fn.Exists( wxFILE_EXISTS_SYMLINK ) )
2071  {
2072  char buffer[ PATH_MAX + 1 ];
2073  ssize_t pathLen = readlink( TO_UTF8( fn.GetFullPath() ), buffer, PATH_MAX );
2074 
2075  if( pathLen > 0 )
2076  {
2077  buffer[ pathLen ] = '\0';
2078  fn.Assign( fn.GetPath() + wxT( "/" ) + wxString::FromUTF8( buffer ) );
2079  fn.Normalize();
2080  }
2081  }
2082 #endif
2083 
2084  if( !fn.IsOk() )
2085  {
2086  THROW_IO_ERROR( wxString::Format( _( "Footprint file name \"%s\" is not valid." ),
2087  fn.GetFullPath() ) );
2088  }
2089 
2090  if( fn.FileExists() && !fn.IsFileWritable() )
2091  {
2092  THROW_IO_ERROR( wxString::Format( _( "No write permissions to delete file \"%s\" " ),
2093  fn.GetFullPath() ) );
2094  }
2095 
2096  wxString fullPath = fn.GetFullPath();
2097  wxString fullName = fn.GetFullName();
2098  MODULE_CITER it = mods.find( footprintName );
2099 
2100  if( it != mods.end() )
2101  {
2102  wxLogTrace( traceKicadPcbPlugin, wxT( "Removing footprint file '%s'." ), fullPath );
2103  mods.erase( footprintName );
2104  wxRemoveFile( fullPath );
2105  }
2106 
2107  // I need my own copy for the cache
2108  MODULE* module = new MODULE( *aFootprint );
2109 
2110  // and it's time stamp must be 0, it should have no parent, orientation should
2111  // be zero, and it should be on the front layer.
2112  module->SetTimeStamp( 0 );
2113  module->SetParent( 0 );
2114  module->SetOrientation( 0 );
2115 
2116  if( module->GetLayer() != F_Cu )
2117  module->Flip( module->GetPosition() );
2118 
2119  wxLogTrace( traceKicadPcbPlugin, wxT( "Creating s-expr footprint file '%s'." ), fullPath );
2120  mods.insert( footprintName, new FP_CACHE_ITEM( module, WX_FILENAME( fn.GetPath(), fullName ) ) );
2121  m_cache->Save( module );
2122 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:179
const std::string KiCadFootprintFileExtension
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 LIB_ID & GetFPID() const
Definition: class_module.h:193
#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
void SetParent(EDA_ITEM *aParent)
Definition: base_struct.h:216
const UTF8 & GetLibItemName() const
Definition: lib_id.h:114
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
const wxChar *const traceKicadPcbPlugin
Flag to enable GEDA PCB plugin debug output.
bool Exists() const
#define THROW_IO_ERROR(msg)
std::map< wxString, MODULE * > MODULE_MAP
Definition: eagle_plugin.h:36
Class FP_CACHE_ITEM is helper class for creating a footprint library cache.
void Save(MODULE *aModule=NULL)
Function Save Save the footprint cache or a single module from it to disk.
bool IsWritable() const
MODULE_MAP::const_iterator MODULE_CITER
#define CTL_FOR_LIBRARY
Format output for a footprint library instead of clipboard or BOARD.
static const wxChar * GetChars(const wxString &s)
Function GetChars returns a wxChar* to the actual wxChar* data within a wxString, and is helpful for ...
Definition: macros.h:92
A wrapper around a wxFileName which is much more performant with a subset of the API.
Definition: common.h:391
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
void SetOrientation(double newangle)
const wxPoint GetPosition() const override
Definition: class_module.h:184
MODULE_MAP & GetModules()
void SetTimeStamp(timestamp_t aNewTimeStamp)
Definition: base_struct.h:206
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 401 of file kicad_plugin.cpp.

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

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

402 {
403  LOCALE_IO toggle; // public API function, perform anything convenient for caller
404 
405  switch( aItem->Type() )
406  {
407  case PCB_T:
408  format( static_cast<BOARD*>( aItem ), aNestLevel );
409  break;
410 
411  case PCB_DIMENSION_T:
412  format( static_cast<DIMENSION*>( aItem ), aNestLevel );
413  break;
414 
415  case PCB_LINE_T:
416  format( static_cast<DRAWSEGMENT*>( aItem ), aNestLevel );
417  break;
418 
419  case PCB_MODULE_EDGE_T:
420  format( static_cast<EDGE_MODULE*>( aItem ), aNestLevel );
421  break;
422 
423  case PCB_TARGET_T:
424  format( static_cast<PCB_TARGET*>( aItem ), aNestLevel );
425  break;
426 
427  case PCB_MODULE_T:
428  format( static_cast<MODULE*>( aItem ), aNestLevel );
429  break;
430 
431  case PCB_PAD_T:
432  format( static_cast<D_PAD*>( aItem ), aNestLevel );
433  break;
434 
435  case PCB_TEXT_T:
436  format( static_cast<TEXTE_PCB*>( aItem ), aNestLevel );
437  break;
438 
439  case PCB_MODULE_TEXT_T:
440  format( static_cast<TEXTE_MODULE*>( aItem ), aNestLevel );
441  break;
442 
443  case PCB_TRACE_T:
444  case PCB_VIA_T:
445  format( static_cast<TRACK*>( aItem ), aNestLevel );
446  break;
447 
448  case PCB_ZONE_AREA_T:
449  format( static_cast<ZONE_CONTAINER*>( aItem ), aNestLevel );
450  break;
451 
452  default:
453  wxFAIL_MSG( wxT( "Cannot format item " ) + aItem->GetClass() );
454  }
455 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:201
Definition: typeinfo.h:85
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:179
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 718 of file kicad_plugin.cpp.

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

719 {
720  formatHeader( aBoard, aNestLevel );
721 
722  // Save the modules.
723  for( MODULE* module = aBoard->m_Modules; module; module = module->Next() )
724  {
725  Format( module, aNestLevel );
726  m_out->Print( 0, "\n" );
727  }
728 
729  // Save the graphical items on the board (not owned by a module)
730  for( auto item : aBoard->Drawings() )
731  Format( item, aNestLevel );
732 
733  if( aBoard->Drawings().Size() )
734  m_out->Print( 0, "\n" );
735 
736  // Do not save MARKER_PCBs, they can be regenerated easily.
737 
738  // Save the tracks and vias.
739  for( TRACK* track = aBoard->m_Track; track; track = track->Next() )
740  Format( track, aNestLevel );
741 
742  if( aBoard->m_Track.GetCount() )
743  m_out->Print( 0, "\n" );
744 
747 
748  // Save the polygon (which are the newer technology) zones.
749  for( int i = 0; i < aBoard->GetAreaCount(); ++i )
750  Format( aBoard->GetArea( i ), aNestLevel );
751 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
MODULE * Next() const
Definition: class_module.h:123
int GetAreaCount() const
Function GetAreaCount.
Definition: class_board.h:1020
void Format(BOARD_ITEM *aItem, int aNestLevel=0) const
Function Format outputs aItem to aFormatter in s-expression format.
void formatHeader(BOARD *aBoard, int aNestLevel=0) const
writes everything that comes before the board_items, like settings and layers etc ...
TRACK * Next() const
Definition: class_track.h:99
ZONE_CONTAINER * GetArea(int index) const
Function GetArea returns the Area (Zone Container) at a given index.
Definition: class_board.h:991
DLIST< MODULE > m_Modules
Definition: class_board.h:248
size_t i
Definition: json11.cpp:597
unsigned GetCount() const
Function GetCount returns the number of elements in the list.
Definition: dlist.h:126
DLIST< TRACK > m_Track
Definition: class_board.h:249
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:255
void PCB_IO::format ( DIMENSION aDimension,
int  aNestLevel = 0 
) const
private

Definition at line 754 of file kicad_plugin.cpp.

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

755 {
756  m_out->Print( aNestLevel, "(dimension %s (width %s)",
757  FMT_IU( aDimension->GetValue() ).c_str(),
758  FMT_IU( aDimension->GetWidth() ).c_str() );
759 
760  formatLayer( aDimension );
761 
762  if( aDimension->GetTimeStamp() )
763  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aDimension->GetTimeStamp() );
764 
765  m_out->Print( 0, "\n" );
766 
767  Format( &aDimension->Text(), aNestLevel+1 );
768 
769  m_out->Print( aNestLevel+1, "(feature1 (pts (xy %s %s) (xy %s %s)))\n",
770  FMT_IU( aDimension->m_featureLineDO.x ).c_str(),
771  FMT_IU( aDimension->m_featureLineDO.y ).c_str(),
772  FMT_IU( aDimension->m_featureLineDF.x ).c_str(),
773  FMT_IU( aDimension->m_featureLineDF.y ).c_str() );
774 
775  m_out->Print( aNestLevel+1, "(feature2 (pts (xy %s %s) (xy %s %s)))\n",
776  FMT_IU( aDimension->m_featureLineGO.x ).c_str(),
777  FMT_IU( aDimension->m_featureLineGO.y ).c_str(),
778  FMT_IU( aDimension->m_featureLineGF.x ).c_str(),
779  FMT_IU( aDimension->m_featureLineGF.y ).c_str() );
780 
781  m_out->Print( aNestLevel+1, "(crossbar (pts (xy %s %s) (xy %s %s)))\n",
782  FMT_IU( aDimension->m_crossBarO.x ).c_str(),
783  FMT_IU( aDimension->m_crossBarO.y ).c_str(),
784  FMT_IU( aDimension->m_crossBarF.x ).c_str(),
785  FMT_IU( aDimension->m_crossBarF.y ).c_str() );
786 
787  m_out->Print( aNestLevel+1, "(arrow1a (pts (xy %s %s) (xy %s %s)))\n",
788  FMT_IU( aDimension->m_crossBarF.x ).c_str(),
789  FMT_IU( aDimension->m_crossBarF.y ).c_str(),
790  FMT_IU( aDimension->m_arrowD1F.x ).c_str(),
791  FMT_IU( aDimension->m_arrowD1F.y ).c_str() );
792 
793  m_out->Print( aNestLevel+1, "(arrow1b (pts (xy %s %s) (xy %s %s)))\n",
794  FMT_IU( aDimension->m_crossBarF.x ).c_str(),
795  FMT_IU( aDimension->m_crossBarF.y ).c_str(),
796  FMT_IU( aDimension->m_arrowD2F.x ).c_str(),
797  FMT_IU( aDimension->m_arrowD2F.y ).c_str() );
798 
799  m_out->Print( aNestLevel+1, "(arrow2a (pts (xy %s %s) (xy %s %s)))\n",
800  FMT_IU( aDimension->m_crossBarO.x ).c_str(),
801  FMT_IU( aDimension->m_crossBarO.y ).c_str(),
802  FMT_IU( aDimension->m_arrowG1F.x ).c_str(),
803  FMT_IU( aDimension->m_arrowG1F.y ).c_str() );
804 
805  m_out->Print( aNestLevel+1, "(arrow2b (pts (xy %s %s) (xy %s %s)))\n",
806  FMT_IU( aDimension->m_crossBarO.x ).c_str(),
807  FMT_IU( aDimension->m_crossBarO.y ).c_str(),
808  FMT_IU( aDimension->m_arrowG2F.x ).c_str(),
809  FMT_IU( aDimension->m_arrowG2F.y ).c_str() );
810 
811  m_out->Print( aNestLevel, ")\n" );
812 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
wxPoint m_crossBarF
wxPoint m_arrowD1F
int GetWidth() const
void formatLayer(const BOARD_ITEM *aItem) const
wxPoint m_featureLineDF
wxPoint m_featureLineGO
#define FMT_IU
wxPoint m_arrowG1F
wxPoint m_arrowD2F
wxPoint m_arrowG2F
void Format(BOARD_ITEM *aItem, int aNestLevel=0) const
Function Format outputs aItem to aFormatter in s-expression format.
TEXTE_PCB & Text()
wxPoint m_crossBarO
int GetValue() const
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
wxPoint m_featureLineDO
timestamp_t GetTimeStamp() const
Definition: base_struct.h:207
wxPoint m_featureLineGF
void PCB_IO::format ( EDGE_MODULE aModuleDrawing,
int  aNestLevel = 0 
) const
private

Definition at line 893 of file kicad_plugin.cpp.

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

894 {
895  switch( aModuleDrawing->GetShape() )
896  {
897  case S_SEGMENT: // Line
898  m_out->Print( aNestLevel, "(fp_line (start %s) (end %s)",
899  FMT_IU( aModuleDrawing->GetStart0() ).c_str(),
900  FMT_IU( aModuleDrawing->GetEnd0() ).c_str() );
901  break;
902 
903  case S_CIRCLE: // Circle
904  m_out->Print( aNestLevel, "(fp_circle (center %s) (end %s)",
905  FMT_IU( aModuleDrawing->GetStart0() ).c_str(),
906  FMT_IU( aModuleDrawing->GetEnd0() ).c_str() );
907  break;
908 
909  case S_ARC: // Arc
910  m_out->Print( aNestLevel, "(fp_arc (start %s) (end %s) (angle %s)",
911  FMT_IU( aModuleDrawing->GetStart0() ).c_str(),
912  FMT_IU( aModuleDrawing->GetEnd0() ).c_str(),
913  FMT_ANGLE( aModuleDrawing->GetAngle() ).c_str() );
914  break;
915 
916  case S_POLYGON: // Polygonal segment
917  if( aModuleDrawing->IsPolyShapeValid() )
918  {
919  SHAPE_POLY_SET& poly = aModuleDrawing->GetPolyShape();
920  SHAPE_LINE_CHAIN& outline = poly.Outline( 0 );
921  int pointsCount = outline.PointCount();
922 
923  m_out->Print( aNestLevel, "(fp_poly (pts" );
924 
925  for( int ii = 0; ii < pointsCount; ++ii )
926  {
927  int nestLevel = 0;
928 
929  if( ii && !( ii%4 ) ) // newline every 4 pts
930  {
931  nestLevel = aNestLevel + 1;
932  m_out->Print( 0, "\n" );
933  }
934 
935  m_out->Print( nestLevel, "%s(xy %s)",
936  nestLevel ? "" : " ", FMT_IU( outline.CPoint( ii ) ).c_str() );
937  }
938 
939  m_out->Print( 0, ")" );
940  }
941  else
942  {
943  wxFAIL_MSG( wxT( "Cannot format invalid polygon." ) );
944  return;
945  }
946  break;
947 
948  case S_CURVE: // Bezier curve
949  m_out->Print( aNestLevel, "(fp_curve (pts (xy %s) (xy %s) (xy %s) (xy %s))",
950  FMT_IU( aModuleDrawing->GetStart0() ).c_str(),
951  FMT_IU( aModuleDrawing->GetBezier0_C1() ).c_str(),
952  FMT_IU( aModuleDrawing->GetBezier0_C2() ).c_str(),
953  FMT_IU( aModuleDrawing->GetEnd0() ).c_str() );
954  break;
955 
956  default:
957  wxFAIL_MSG( wxT( "Cannot format invalid DRAWSEGMENT type." ) );
958  return;
959  };
960 
961  formatLayer( aModuleDrawing );
962 
963  m_out->Print( 0, " (width %s)", FMT_IU( aModuleDrawing->GetWidth() ).c_str() );
964 
965  m_out->Print( 0, ")\n" );
966 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const wxPoint & GetBezier0_C2() const
int PointCount() const
Function PointCount()
polygon (not yet used for tracks, but could be in microwave apps)
const wxPoint & GetEnd0() const
void formatLayer(const BOARD_ITEM *aItem) const
usual segment : line with rounded ends
bool IsPolyShapeValid() const
#define FMT_IU
STROKE_T GetShape() const
Class SHAPE_POLY_SET.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Returns the reference to aIndex-th outline in the set
Arcs (with rounded ends)
SHAPE_POLY_SET & GetPolyShape()
Bezier Curve.
double GetAngle() const
const wxPoint & GetStart0() const
Class SHAPE_LINE_CHAIN.
int GetWidth() const
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
const wxPoint & GetBezier0_C1() const
const VECTOR2I & CPoint(int aIndex) const
Function CPoint()
#define FMT_ANGLE
void PCB_IO::format ( DRAWSEGMENT aSegment,
int  aNestLevel = 0 
) const
private

Definition at line 815 of file kicad_plugin.cpp.

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

816 {
817  switch( aSegment->GetShape() )
818  {
819  case S_SEGMENT: // Line
820  m_out->Print( aNestLevel, "(gr_line (start %s) (end %s)",
821  FMT_IU( aSegment->GetStart() ).c_str(),
822  FMT_IU( aSegment->GetEnd() ).c_str() );
823 
824  if( aSegment->GetAngle() != 0.0 )
825  m_out->Print( 0, " (angle %s)", FMT_ANGLE( aSegment->GetAngle() ).c_str() );
826 
827  break;
828 
829  case S_CIRCLE: // Circle
830  m_out->Print( aNestLevel, "(gr_circle (center %s) (end %s)",
831  FMT_IU( aSegment->GetStart() ).c_str(),
832  FMT_IU( aSegment->GetEnd() ).c_str() );
833  break;
834 
835  case S_ARC: // Arc
836  m_out->Print( aNestLevel, "(gr_arc (start %s) (end %s) (angle %s)",
837  FMT_IU( aSegment->GetStart() ).c_str(),
838  FMT_IU( aSegment->GetEnd() ).c_str(),
839  FMT_ANGLE( aSegment->GetAngle() ).c_str() );
840  break;
841 
842  case S_POLYGON: // Polygon
843  if( aSegment->IsPolyShapeValid() )
844  {
845  SHAPE_POLY_SET& poly = aSegment->GetPolyShape();
846  SHAPE_LINE_CHAIN& outline = poly.Outline( 0 );
847  int pointsCount = outline.PointCount();
848 
849  m_out->Print( aNestLevel, "(gr_poly (pts" );
850 
851  for( int ii = 0; ii < pointsCount; ++ii )
852  {
853  m_out->Print( 0, " (xy %s)", FMT_IU( outline.CPoint( ii ) ).c_str() );
854  }
855 
856  m_out->Print( 0, ")" );
857  }
858  else
859  {
860  wxFAIL_MSG( wxT( "Cannot format invalid polygon." ) );
861  return;
862  }
863 
864  break;
865 
866  case S_CURVE: // Bezier curve
867  m_out->Print( aNestLevel, "(gr_curve (pts (xy %s) (xy %s) (xy %s) (xy %s))",
868  FMT_IU( aSegment->GetStart() ).c_str(),
869  FMT_IU( aSegment->GetBezControl1() ).c_str(),
870  FMT_IU( aSegment->GetBezControl2() ).c_str(),
871  FMT_IU( aSegment->GetEnd() ).c_str() );
872  break;
873 
874  default:
875  wxFAIL_MSG( wxT( "Cannot format invalid DRAWSEGMENT type." ) );
876  return;
877  };
878 
879  formatLayer( aSegment );
880 
881  m_out->Print( 0, " (width %s)", FMT_IU( aSegment->GetWidth() ).c_str() );
882 
883  if( aSegment->GetTimeStamp() )
884  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aSegment->GetTimeStamp() );
885 
886  if( aSegment->GetStatus() )
887  m_out->Print( 0, " (status %X)", aSegment->GetStatus() );
888 
889  m_out->Print( 0, ")\n" );
890 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const wxPoint & GetBezControl2() const
int PointCount() const
Function PointCount()
polygon (not yet used for tracks, but could be in microwave apps)
void formatLayer(const BOARD_ITEM *aItem) const
usual segment : line with rounded ends
bool IsPolyShapeValid() const
STATUS_FLAGS GetStatus() const
Definition: base_struct.h:253
#define FMT_IU
STROKE_T GetShape() const
const wxPoint & GetEnd() const
Function GetEnd returns the ending point of the graphic.
Class SHAPE_POLY_SET.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Returns the reference to aIndex-th outline in the set
Arcs (with rounded ends)
const wxPoint & GetBezControl1() const
SHAPE_POLY_SET & GetPolyShape()
Bezier Curve.
double GetAngle() const
Class SHAPE_LINE_CHAIN.
int GetWidth() const
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
const wxPoint & GetStart() const
Function GetStart returns the starting point of the graphic.
const VECTOR2I & CPoint(int aIndex) const
Function CPoint()
#define FMT_ANGLE
timestamp_t GetTimeStamp() const
Definition: base_struct.h:207
void PCB_IO::format ( PCB_TARGET aTarget,
int  aNestLevel = 0 
) const
private

Definition at line 969 of file kicad_plugin.cpp.

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

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

Definition at line 988 of file kicad_plugin.cpp.

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

989 {
990  if( !( m_ctl & CTL_OMIT_INITIAL_COMMENTS ) )
991  {
992  const wxArrayString* initial_comments = aModule->GetInitialComments();
993 
994  if( initial_comments )
995  {
996  for( unsigned i=0; i<initial_comments->GetCount(); ++i )
997  m_out->Print( aNestLevel, "%s\n", TO_UTF8( (*initial_comments)[i] ) );
998 
999  m_out->Print( 0, "\n" ); // improve readability?
1000  }
1001  }
1002 
1003  m_out->Print( aNestLevel, "(module %s",
1004  m_out->Quotes( aModule->GetFPID().Format() ).c_str() );
1005 
1006  if( aModule->IsLocked() )
1007  m_out->Print( 0, " locked" );
1008 
1009  if( aModule->IsPlaced() )
1010  m_out->Print( 0, " placed" );
1011 
1012  formatLayer( aModule );
1013 
1014  m_out->Print( 0, " (tedit %lX)", (unsigned long)aModule->GetLastEditTime() );
1015 
1016  if( !( m_ctl & CTL_OMIT_TSTAMPS ) )
1017  {
1018  m_out->Print( 0, " (tstamp %lX)\n", (unsigned long)aModule->GetTimeStamp() );
1019  }
1020  else
1021  m_out->Print( 0, "\n" );
1022 
1023  if( !( m_ctl & CTL_OMIT_AT ) )
1024  {
1025  m_out->Print( aNestLevel+1, "(at %s", FMT_IU( aModule->GetPosition() ).c_str() );
1026 
1027  if( aModule->GetOrientation() != 0.0 )
1028  m_out->Print( 0, " %s", FMT_ANGLE( aModule->GetOrientation() ).c_str() );
1029 
1030  m_out->Print( 0, ")\n" );
1031  }
1032 
1033  if( !aModule->GetDescription().IsEmpty() )
1034  m_out->Print( aNestLevel+1, "(descr %s)\n",
1035  m_out->Quotew( aModule->GetDescription() ).c_str() );
1036 
1037  if( !aModule->GetKeywords().IsEmpty() )
1038  m_out->Print( aNestLevel+1, "(tags %s)\n",
1039  m_out->Quotew( aModule->GetKeywords() ).c_str() );
1040 
1041  if( !( m_ctl & CTL_OMIT_PATH ) && !!aModule->GetPath() )
1042  m_out->Print( aNestLevel+1, "(path %s)\n",
1043  m_out->Quotew( aModule->GetPath() ).c_str() );
1044 
1045  if( aModule->GetPlacementCost90() != 0 )
1046  m_out->Print( aNestLevel+1, "(autoplace_cost90 %d)\n", aModule->GetPlacementCost90() );
1047 
1048  if( aModule->GetPlacementCost180() != 0 )
1049  m_out->Print( aNestLevel+1, "(autoplace_cost180 %d)\n", aModule->GetPlacementCost180() );
1050 
1051  if( aModule->GetLocalSolderMaskMargin() != 0 )
1052  m_out->Print( aNestLevel+1, "(solder_mask_margin %s)\n",
1053  FMT_IU( aModule->GetLocalSolderMaskMargin() ).c_str() );
1054 
1055  if( aModule->GetLocalSolderPasteMargin() != 0 )
1056  m_out->Print( aNestLevel+1, "(solder_paste_margin %s)\n",
1057  FMT_IU( aModule->GetLocalSolderPasteMargin() ).c_str() );
1058 
1059  if( aModule->GetLocalSolderPasteMarginRatio() != 0 )
1060  m_out->Print( aNestLevel+1, "(solder_paste_ratio %s)\n",
1061  Double2Str( aModule->GetLocalSolderPasteMarginRatio() ).c_str() );
1062 
1063  if( aModule->GetLocalClearance() != 0 )
1064  m_out->Print( aNestLevel+1, "(clearance %s)\n",
1065  FMT_IU( aModule->GetLocalClearance() ).c_str() );
1066 
1067  if( aModule->GetZoneConnection() != PAD_ZONE_CONN_INHERITED )
1068  m_out->Print( aNestLevel+1, "(zone_connect %d)\n", aModule->GetZoneConnection() );
1069 
1070  if( aModule->GetThermalWidth() != 0 )
1071  m_out->Print( aNestLevel+1, "(thermal_width %s)\n",
1072  FMT_IU( aModule->GetThermalWidth() ).c_str() );
1073 
1074  if( aModule->GetThermalGap() != 0 )
1075  m_out->Print( aNestLevel+1, "(thermal_gap %s)\n",
1076  FMT_IU( aModule->GetThermalGap() ).c_str() );
1077 
1078  // Attributes
1079  if( aModule->GetAttributes() != MOD_DEFAULT )
1080  {
1081  m_out->Print( aNestLevel+1, "(attr" );
1082 
1083  if( aModule->GetAttributes() & MOD_CMS )
1084  m_out->Print( 0, " smd" );
1085 
1086  if( aModule->GetAttributes() & MOD_VIRTUAL )
1087  m_out->Print( 0, " virtual" );
1088 
1089  m_out->Print( 0, ")\n" );
1090  }
1091 
1092  Format( (BOARD_ITEM*) &aModule->Reference(), aNestLevel+1 );
1093  Format( (BOARD_ITEM*) &aModule->Value(), aNestLevel+1 );
1094 
1095  // Save drawing elements.
1096  for( BOARD_ITEM* gr = aModule->GraphicalItemsList(); gr; gr = gr->Next() )
1097  Format( gr, aNestLevel+1 );
1098 
1099  // Save pads.
1100  for( D_PAD* pad = aModule->PadsList(); pad; pad = pad->Next() )
1101  format( pad, aNestLevel+1 );
1102 
1103  // Save 3D info.
1104  auto bs3D = aModule->Models().begin();
1105  auto es3D = aModule->Models().end();
1106 
1107  while( bs3D != es3D )
1108  {
1109  if( !bs3D->m_Filename.IsEmpty() )
1110  {
1111  m_out->Print( aNestLevel+1, "(model %s\n",
1112  m_out->Quotew( bs3D->m_Filename ).c_str() );
1113 
1114  /* Write 3D model offset in mm
1115  * 4.0.x wrote "at" which was actually in inches
1116  * 5.0.x onwards, 3D model offset is written using "offset"
1117  *
1118  * If the offset is all zero, write "at" (fewer file changes)
1119  * Otherwise, write "offset"
1120  */
1121 
1122  wxString offsetTag = "offset";
1123 
1124  if( bs3D->m_Offset.x == 0 &&
1125  bs3D->m_Offset.y == 0 &&
1126  bs3D->m_Offset.z == 0 )
1127  {
1128  offsetTag = "at";
1129  }
1130 
1131  m_out->Print( aNestLevel+2, "(%s (xyz %s %s %s))\n",
1132  offsetTag.ToStdString().c_str(),
1133  Double2Str( bs3D->m_Offset.x ).c_str(),
1134  Double2Str( bs3D->m_Offset.y ).c_str(),
1135  Double2Str( bs3D->m_Offset.z ).c_str() );
1136 
1137  m_out->Print( aNestLevel+2, "(scale (xyz %s %s %s))\n",
1138  Double2Str( bs3D->m_Scale.x ).c_str(),
1139  Double2Str( bs3D->m_Scale.y ).c_str(),
1140  Double2Str( bs3D->m_Scale.z ).c_str() );
1141 
1142  m_out->Print( aNestLevel+2, "(rotate (xyz %s %s %s))\n",
1143  Double2Str( bs3D->m_Rotation.x ).c_str(),
1144  Double2Str( bs3D->m_Rotation.y ).c_str(),
1145  Double2Str( bs3D->m_Rotation.z ).c_str() );
1146 
1147  m_out->Print( aNestLevel+1, ")\n" );
1148  }
1149  ++bs3D;
1150  }
1151 
1152  m_out->Print( aNestLevel, ")\n" );
1153 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
TEXTE_MODULE & Reference()
Definition: class_module.h:513
#define CTL_OMIT_AT
Omit position and rotation.
int GetThermalGap() const
Definition: class_module.h:224
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:208
void formatLayer(const BOARD_ITEM *aItem) const
Set for modules listed in the automatic insertion list (usually SMD footprints)
Definition: class_module.h:77
std::string Double2Str(double aValue)
Helper function Double2Str to print a float number without using scientific notation and no trailing ...
Definition: base_units.cpp:63
timestamp_t GetLastEditTime() const
Definition: class_module.h:316
ZoneConnection GetZoneConnection() const
Definition: class_module.h:218
int GetPlacementCost90() const
Definition: class_module.h:583
double GetLocalSolderPasteMarginRatio() const
Definition: class_module.h:214
BOARD_ITEM * Next() const
const LIB_ID & GetFPID() const
Definition: class_module.h:193
#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:189
TEXTE_MODULE & Value()
read/write accessors:
Definition: class_module.h:512
D_PAD * Next() const
Definition: class_pad.h:160
int GetAttributes() const
Definition: class_module.h:226
const wxString & GetKeywords() const
Definition: class_module.h:199
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
int GetLocalSolderMaskMargin() const
Definition: class_module.h:205
#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:268
int GetLocalSolderPasteMargin() const
Definition: class_module.h:211
default
Definition: class_module.h:76
virtual std::string Quotes(const std::string &aWrapee)
Function Quotes checks aWrapee input string for a need to be quoted (e.g.
Definition: richio.cpp:433
std::list< MODULE_3D_SETTINGS > & Models()
Definition: class_module.h:179
const wxString & GetDescription() const
Definition: class_module.h:196
Virtual component: when created by copper shapes on board (Like edge card connectors, mounting hole...)
Definition: class_module.h:79
#define CTL_OMIT_TSTAMPS
Omit component time stamp (useless in library)
size_t i
Definition: json11.cpp:597
void format(BOARD *aBoard, int aNestLevel=0) const
UTF8 Format() const
Definition: lib_id.cpp:237
DLIST< BOARD_ITEM > & GraphicalItemsList()
Definition: class_module.h:166
DLIST< D_PAD > & PadsList()
Definition: class_module.h:163
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:202
const wxArrayString * GetInitialComments() const
Return the initial comments block or NULL if none, without transfer of ownership. ...
Definition: class_module.h:707
bool IsPlaced() const
Definition: class_module.h:286
int GetPlacementCost180() const
Definition: class_module.h:580
const wxPoint GetPosition() const override
Definition: class_module.h:184
#define FMT_ANGLE
int GetThermalWidth() const
Definition: class_module.h:221
timestamp_t GetTimeStamp() const
Definition: base_struct.h:207
void PCB_IO::format ( D_PAD aPad,
int  aNestLevel = 0 
) const
private

Definition at line 1248 of file kicad_plugin.cpp.

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

1249 {
1250  const char* shape;
1251 
1252  switch( aPad->GetShape() )
1253  {
1254  case PAD_SHAPE_CIRCLE: shape = "circle"; break;
1255  case PAD_SHAPE_RECT: shape = "rect"; break;
1256  case PAD_SHAPE_OVAL: shape = "oval"; break;
1257  case PAD_SHAPE_TRAPEZOID: shape = "trapezoid"; break;
1258  case PAD_SHAPE_ROUNDRECT: shape = "roundrect"; break;
1259  case PAD_SHAPE_CUSTOM: shape = "custom"; break;
1260 
1261  default:
1262  THROW_IO_ERROR( wxString::Format( _( "unknown pad type: %d"), aPad->GetShape() ) );
1263  }
1264 
1265  const char* type;
1266 
1267  switch( aPad->GetAttribute() )
1268  {
1269  case PAD_ATTRIB_STANDARD: type = "thru_hole"; break;
1270  case PAD_ATTRIB_SMD: type = "smd"; break;
1271  case PAD_ATTRIB_CONN: type = "connect"; break;
1272  case PAD_ATTRIB_HOLE_NOT_PLATED: type = "np_thru_hole"; break;
1273 
1274  default:
1275  THROW_IO_ERROR( wxString::Format( "unknown pad attribute: %d", aPad->GetAttribute() ) );
1276  }
1277 
1278  m_out->Print( aNestLevel, "(pad %s %s %s",
1279  m_out->Quotew( aPad->GetName() ).c_str(),
1280  type, shape );
1281  m_out->Print( 0, " (at %s", FMT_IU( aPad->GetPos0() ).c_str() );
1282 
1283  if( aPad->GetOrientation() != 0.0 )
1284  m_out->Print( 0, " %s", FMT_ANGLE( aPad->GetOrientation() ).c_str() );
1285 
1286  m_out->Print( 0, ")" );
1287  m_out->Print( 0, " (size %s)", FMT_IU( aPad->GetSize() ).c_str() );
1288 
1289  if( (aPad->GetDelta().GetWidth()) != 0 || (aPad->GetDelta().GetHeight() != 0 ) )
1290  m_out->Print( 0, " (rect_delta %s )", FMT_IU( aPad->GetDelta() ).c_str() );
1291 
1292  wxSize sz = aPad->GetDrillSize();
1293  wxPoint shapeoffset = aPad->GetOffset();
1294 
1295  if( (sz.GetWidth() > 0) || (sz.GetHeight() > 0) ||
1296  (shapeoffset.x != 0) || (shapeoffset.y != 0) )
1297  {
1298  m_out->Print( 0, " (drill" );
1299 
1300  if( aPad->GetDrillShape() == PAD_DRILL_SHAPE_OBLONG )
1301  m_out->Print( 0, " oval" );
1302 
1303  if( sz.GetWidth() > 0 )
1304  m_out->Print( 0, " %s", FMT_IU( sz.GetWidth() ).c_str() );
1305 
1306  if( sz.GetHeight() > 0 && sz.GetWidth() != sz.GetHeight() )
1307  m_out->Print( 0, " %s", FMT_IU( sz.GetHeight() ).c_str() );
1308 
1309  if( (shapeoffset.x != 0) || (shapeoffset.y != 0) )
1310  m_out->Print( 0, " (offset %s)", FMT_IU( aPad->GetOffset() ).c_str() );
1311 
1312  m_out->Print( 0, ")" );
1313  }
1314 
1315  formatLayers( aPad->GetLayerSet() );
1316 
1317  // Output the radius ratio for rounded rect pads
1318  if( aPad->GetShape() == PAD_SHAPE_ROUNDRECT )
1319  {
1320  m_out->Print( 0, " (roundrect_rratio %s)",
1321  Double2Str( aPad->GetRoundRectRadiusRatio() ).c_str() );
1322  }
1323 
1324  std::string output;
1325 
1326  // Unconnected pad is default net so don't save it.
1327  if( !( m_ctl & CTL_OMIT_NETS ) && aPad->GetNetCode() != NETINFO_LIST::UNCONNECTED )
1328  StrPrintf( &output, " (net %d %s)", m_mapping->Translate( aPad->GetNetCode() ),
1329  m_out->Quotew( aPad->GetNetname() ).c_str() );
1330 
1331  if( aPad->GetPadToDieLength() != 0 )
1332  StrPrintf( &output, " (die_length %s)", FMT_IU( aPad->GetPadToDieLength() ).c_str() );
1333 
1334  if( aPad->GetLocalSolderMaskMargin() != 0 )
1335  StrPrintf( &output, " (solder_mask_margin %s)",
1336  FMT_IU( aPad->GetLocalSolderMaskMargin() ).c_str() );
1337 
1338  if( aPad->GetLocalSolderPasteMargin() != 0 )
1339  StrPrintf( &output, " (solder_paste_margin %s)",
1340  FMT_IU( aPad->GetLocalSolderPasteMargin() ).c_str() );
1341 
1342  if( aPad->GetLocalSolderPasteMarginRatio() != 0 )
1343  StrPrintf( &output, " (solder_paste_margin_ratio %s)",
1344  Double2Str( aPad->GetLocalSolderPasteMarginRatio() ).c_str() );
1345 
1346  if( aPad->GetLocalClearance() != 0 )
1347  StrPrintf( &output, " (clearance %s)", FMT_IU( aPad->GetLocalClearance() ).c_str() );
1348 
1350  StrPrintf( &output, " (zone_connect %d)", aPad->GetZoneConnection() );
1351 
1352  if( aPad->GetThermalWidth() != 0 )
1353  StrPrintf( &output, " (thermal_width %s)", FMT_IU( aPad->GetThermalWidth() ).c_str() );
1354 
1355  if( aPad->GetThermalGap() != 0 )
1356  StrPrintf( &output, " (thermal_gap %s)", FMT_IU( aPad->GetThermalGap() ).c_str() );
1357 
1358  if( output.size() )
1359  {
1360  m_out->Print( 0, "\n" );
1361  m_out->Print( aNestLevel+1, "%s", output.c_str()+1 ); // +1 skips 1st space on 1st element
1362  }
1363 
1364  if( aPad->GetShape() == PAD_SHAPE_CUSTOM )
1365  {
1366  m_out->Print( 0, "\n");
1367  m_out->Print( aNestLevel+1, "(options" );
1368 
1370  m_out->Print( 0, " (clearance convexhull)" );
1371  #if 1 // Set to 1 to output the default option
1372  else
1373  m_out->Print( 0, " (clearance outline)" );
1374  #endif
1375 
1376  // Output the anchor pad shape (circle/rect)
1377  if( aPad->GetAnchorPadShape() == PAD_SHAPE_RECT )
1378  shape = "rect";
1379  else
1380  shape = "circle";
1381 
1382  m_out->Print( 0, " (anchor %s)", shape );
1383 
1384  m_out->Print( 0, ")"); // end of (options ...
1385 
1386  // Output graphic primitive of the pad shape
1387  m_out->Print( 0, "\n");
1388  m_out->Print( aNestLevel+1, "(primitives" );
1389 
1390  int nested_level = aNestLevel+2;
1391 
1392  // Output all basic shapes
1393  for( unsigned icnt = 0; icnt < aPad->GetPrimitives().size(); ++icnt )
1394  {
1395  m_out->Print( 0, "\n");
1396 
1397  const PAD_CS_PRIMITIVE& primitive = aPad->GetPrimitives()[icnt];
1398 
1399  switch( primitive.m_Shape )
1400  {
1401  case S_SEGMENT: // usual segment : line with rounded ends
1402  m_out->Print( nested_level, "(gr_line (start %s) (end %s) (width %s))",
1403  FMT_IU( primitive.m_Start ).c_str(),
1404  FMT_IU( primitive.m_End ).c_str(),
1405  FMT_IU( primitive.m_Thickness ).c_str() );
1406  break;
1407 
1408  case S_ARC: // Arc with rounded ends
1409  m_out->Print( nested_level, "(gr_arc (start %s) (end %s) (angle %s) (width %s))",
1410  FMT_IU( primitive.m_Start ).c_str(),
1411  FMT_IU( primitive.m_End ).c_str(),
1412  FMT_ANGLE( primitive.m_ArcAngle ).c_str(),
1413  FMT_IU( primitive.m_Thickness ).c_str() );
1414  break;
1415 
1416  case S_CIRCLE: // ring or circle (circle if width == 0
1417  m_out->Print( nested_level, "(gr_circle (center %s) (end %s %s) (width %s))",
1418  FMT_IU( primitive.m_Start ).c_str(),
1419  FMT_IU( primitive.m_Start.x + primitive.m_Radius ).c_str(),
1420  FMT_IU( primitive.m_Start.y ).c_str(),
1421  FMT_IU( primitive.m_Thickness ).c_str() );
1422  break;
1423 
1424  case S_POLYGON: // polygon
1425  if( primitive.m_Poly.size() < 2 )
1426  break; // Malformed polygon.
1427 
1428  {
1429  m_out->Print( nested_level, "(gr_poly (pts\n");
1430 
1431  // Write the polygon corners coordinates:
1432  const std::vector< wxPoint>& poly = primitive.m_Poly;
1433  int newLine = 0;
1434 
1435  for( unsigned ii = 0; ii < poly.size(); ii++ )
1436  {
1437  if( newLine == 0 )
1438  m_out->Print( nested_level+1, " (xy %s)",
1439  FMT_IU( wxPoint( poly[ii].x, poly[ii].y ) ).c_str() );
1440  else
1441  m_out->Print( 0, " (xy %s)",
1442  FMT_IU( wxPoint( poly[ii].x, poly[ii].y ) ).c_str() );
1443 
1444  if( ++newLine > 4 )
1445  {
1446  newLine = 0;
1447  m_out->Print( 0, "\n" );
1448  }
1449  }
1450 
1451  m_out->Print( 0, ") (width %s))", FMT_IU( primitive.m_Thickness ).c_str() );
1452  }
1453  break;
1454 
1455  default:
1456  break;
1457  }
1458  }
1459 
1460  m_out->Print( 0, "\n");
1461  m_out->Print( aNestLevel+1, ")" ); // end of (basic_shapes
1462  }
1463 
1464  m_out->Print( 0, ")\n" );
1465 }
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
int StrPrintf(std::string *aResult, const char *aFormat,...)
Function StrPrintf is like sprintf() but the output is appended to a std::string instead of to a char...
Definition: richio.cpp:74
PAD_ATTR_T GetAttribute() const
Definition: class_pad.h:405
like PAD_STANDARD, but not plated mechanical use only, no connection allowed
Definition: pad_shapes.h:65
int GetPadToDieLength() const
Definition: class_pad.h:412
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:414
Smd pad, appears on the solder paste layer (default)
Definition: pad_shapes.h:61
const wxPoint & GetPos0() const
Definition: class_pad.h:263
PAD_DRILL_SHAPE_T GetDrillShape() const
Definition: class_pad.h:388
usual segment : line with rounded ends
std::string Double2Str(double aValue)
Helper function Double2Str to print a float number without using scientific notation and no trailing ...
Definition: base_units.cpp:63
const wxSize & GetDrillSize() const
Definition: class_pad.h:275
PAD_SHAPE_T GetShape() const
Function GetShape.
Definition: class_pad.h:216
#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:687
LSET GetLayerSet() const override
Function GetLayerSet returns a "layer mask", which is a bitmap of all layers on which the TRACK segme...
Definition: class_pad.h:402
int GetThermalWidth() const
Definition: class_pad.cpp:698
int GetThermalGap() const
Definition: class_pad.cpp:709
const wxSize & GetSize() const
Definition: class_pad.h:269
const wxString & GetName() const
Definition: class_pad.h:190
#define THROW_IO_ERROR(msg)
int GetLocalSolderPasteMargin() const
Definition: class_pad.h:420
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:417
double GetLocalSolderPasteMarginRatio() const
Definition: class_pad.h:423
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:634
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
CUST_PAD_SHAPE_IN_ZONE GetCustomShapeInZoneOpt() const
Definition: class_pad.h:232
double GetOrientation() const
Function GetOrientation returns the rotation angle of the pad in tenths of degrees, but soon degrees.
Definition: class_pad.h:382
const wxSize & GetDelta() const
Definition: class_pad.h:272
Usual pad.
Definition: pad_shapes.h:60
void formatLayers(LSET aLayerMask, int aNestLevel=0) const
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
static const int UNCONNECTED
Constant that holds the "unconnected net" number (typically 0) all items "connected" to this net are ...
Definition: netinfo.h:469
#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 1468 of file kicad_plugin.cpp.

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

1469 {
1470  m_out->Print( aNestLevel, "(gr_text %s (at %s",
1471  m_out->Quotew( aText->GetText() ).c_str(),
1472  FMT_IU( aText->GetTextPos() ).c_str() );
1473 
1474  if( aText->GetTextAngle() != 0.0 )
1475  m_out->Print( 0, " %s", FMT_ANGLE( aText->GetTextAngle() ).c_str() );
1476 
1477  m_out->Print( 0, ")" );
1478 
1479  formatLayer( aText );
1480 
1481  if( aText->GetTimeStamp() )
1482  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aText->GetTimeStamp() );
1483 
1484  m_out->Print( 0, "\n" );
1485 
1486  aText->EDA_TEXT::Format( m_out, aNestLevel, m_ctl );
1487 
1488  m_out->Print( aNestLevel, ")\n" );
1489 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
const wxPoint & GetTextPos() const
Definition: eda_text.h:237
void formatLayer(const BOARD_ITEM *aItem) const
double GetTextAngle() const
Definition: eda_text.h:177
#define FMT_IU
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:143
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
#define FMT_ANGLE
timestamp_t GetTimeStamp() const
Definition: base_struct.h:207
void PCB_IO::format ( TEXTE_MODULE aText,
int  aNestLevel = 0 
) const
private

Definition at line 1492 of file kicad_plugin.cpp.

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

1493 {
1494  wxString type;
1495 
1496  switch( aText->GetType() )
1497  {
1498  case TEXTE_MODULE::TEXT_is_REFERENCE: type = "reference"; break;
1499  case TEXTE_MODULE::TEXT_is_VALUE: type = "value"; break;
1500  case TEXTE_MODULE::TEXT_is_DIVERS: type = "user";
1501  }
1502 
1503  m_out->Print( aNestLevel, "(fp_text %s %s (at %s",
1504  m_out->Quotew( type ).c_str(),
1505  m_out->Quotew( aText->GetText() ).c_str(),
1506  FMT_IU( aText->GetPos0() ).c_str() );
1507 
1508  // Due to Pcbnew history, fp_text angle is saved as an absolute on screen angle,
1509  // but internally the angle is held relative to its parent footprint. parent
1510  // may be NULL when saving a footprint outside a BOARD.
1511  double orient = aText->GetTextAngle();
1512  MODULE* parent = (MODULE*) aText->GetParent();
1513 
1514  if( parent )
1515  {
1516  // GetTextAngle() is always in -360..+360 range because of
1517  // TEXTE_MODULE::SetTextAngle(), but summing that angle with an
1518  // additional board angle could kick sum up >= 360 or <= -360, so to have
1519  // consistent results, normalize again for the BOARD save. A footprint
1520  // save does not use this code path since parent is NULL.
1521 #if 0
1522  // This one could be considered reasonable if you like positive angles
1523  // in your board text.
1524  orient = NormalizeAnglePos( orient + parent->GetOrientation() );
1525 #else
1526  // Choose compatibility for now, even though this is only a 720 degree clamp
1527  // with two possible values for every angle.
1528  orient = NormalizeAngle360Min( orient + parent->GetOrientation() );
1529 #endif
1530  }
1531 
1532  if( orient != 0.0 )
1533  m_out->Print( 0, " %s", FMT_ANGLE( orient ).c_str() );
1534 
1535  if( !aText->IsKeepUpright() )
1536  m_out->Print( 0, " unlocked" );
1537 
1538  m_out->Print( 0, ")" );
1539  formatLayer( aText );
1540 
1541  if( !aText->IsVisible() )
1542  m_out->Print( 0, " hide" );
1543 
1544  m_out->Print( 0, "\n" );
1545 
1546  aText->EDA_TEXT::Format( m_out, aNestLevel, m_ctl | CTL_OMIT_HIDE );
1547 
1548  m_out->Print( aNestLevel, ")\n" );
1549 }
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:177
bool IsKeepUpright()
#define FMT_IU
double GetOrientation() const
Definition: class_module.h:189
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:143
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
bool IsVisible() const
Definition: eda_text.h:189
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:57
#define FMT_ANGLE
void PCB_IO::format ( TRACK aTrack,
int  aNestLevel = 0 
) const
private

Definition at line 1552 of file kicad_plugin.cpp.

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

1553 {
1554  if( aTrack->Type() == PCB_VIA_T )
1555  {
1556  PCB_LAYER_ID layer1, layer2;
1557 
1558  const VIA* via = static_cast<const VIA*>( aTrack );
1559  BOARD* board = (BOARD*) via->GetParent();
1560 
1561  wxCHECK_RET( board != 0, wxT( "Via " ) + via->GetSelectMenuText( MILLIMETRES ) +
1562  wxT( " has no parent." ) );
1563 
1564  m_out->Print( aNestLevel, "(via" );
1565 
1566  via->LayerPair( &layer1, &layer2 );
1567 
1568  switch( via->GetViaType() )
1569  {
1570  case VIA_THROUGH: // Default shape not saved.
1571  break;
1572 
1573  case VIA_BLIND_BURIED:
1574  m_out->Print( 0, " blind" );
1575  break;
1576 
1577  case VIA_MICROVIA:
1578  m_out->Print( 0, " micro" );
1579  break;
1580 
1581  default:
1582  THROW_IO_ERROR( wxString::Format( _( "unknown via type %d" ), via->GetViaType() ) );
1583  }
1584 
1585  m_out->Print( 0, " (at %s) (size %s)",
1586  FMT_IU( aTrack->GetStart() ).c_str(),
1587  FMT_IU( aTrack->GetWidth() ).c_str() );
1588 
1589  if( via->GetDrill() != UNDEFINED_DRILL_DIAMETER )
1590  m_out->Print( 0, " (drill %s)", FMT_IU( via->GetDrill() ).c_str() );
1591 
1592  m_out->Print( 0, " (layers %s %s)",
1593  m_out->Quotew( m_board->GetLayerName( layer1 ) ).c_str(),
1594  m_out->Quotew( m_board->GetLayerName( layer2 ) ).c_str() );
1595  }
1596  else
1597  {
1598  m_out->Print( aNestLevel, "(segment (start %s) (end %s) (width %s)",
1599  FMT_IU( aTrack->GetStart() ).c_str(), FMT_IU( aTrack->GetEnd() ).c_str(),
1600  FMT_IU( aTrack->GetWidth() ).c_str() );
1601 
1602  m_out->Print( 0, " (layer %s)", m_out->Quotew( aTrack->GetLayerName() ).c_str() );
1603  }
1604 
1605  m_out->Print( 0, " (net %d)", m_mapping->Translate( aTrack->GetNetCode() ) );
1606 
1607  if( aTrack->GetTimeStamp() != 0 )
1608  m_out->Print( 0, " (tstamp %lX)", (unsigned long)aTrack->GetTimeStamp() );
1609 
1610  if( aTrack->GetStatus() != 0 )
1611  m_out->Print( 0, " (status %X)", aTrack->GetStatus() );
1612 
1613  m_out->Print( 0, ")\n" );
1614 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:201
BOARD_ITEM_CONTAINER * GetParent() const
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
STATUS_FLAGS GetStatus() const
Definition: base_struct.h:253
int GetDrill() const
Function GetDrill returns the local drill setting for this VIA.
Definition: class_track.h:472
wxString GetLayerName() const
Function GetLayerName returns the name of the PCB layer on which the item resides.
const wxPoint & GetEnd() const
Definition: class_track.h:119
#define FMT_IU
PCB_LAYER_ID
A quick note on layer IDs:
VIATYPE_T GetViaType() const
Definition: class_track.h:457
int Translate(int aNetCode) const
Function Translate Translates net number according to the map prepared by Update() function...
const wxPoint & GetStart() const
Definition: class_track.h:122
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Function GetLayerName returns the name of a layer given by aLayer.
#define THROW_IO_ERROR(msg)
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
#define UNDEFINED_DRILL_DIAMETER
Definition: class_track.h:59
wxString GetSelectMenuText(EDA_UNITS_T aUnits) const override
Function GetSelectMenuText returns the text to display to be used in the selection clarification cont...
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes ...
void LayerPair(PCB_LAYER_ID *top_layer, PCB_LAYER_ID *bottom_layer) const
Function LayerPair Return the 2 layers used by the via (the via actually uses all layers between thes...
int GetNetCode() const
Function GetNetCode.
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:170
int GetWidth() const
Definition: class_track.h:116
BOARD * m_board
which BOARD, no ownership here
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:96
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
timestamp_t GetTimeStamp() const
Definition: base_struct.h:207
void PCB_IO::format ( ZONE_CONTAINER aZone,
int  aNestLevel = 0 
) const
private

Definition at line 1617 of file kicad_plugin.cpp.

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

1618 {
1619  // Save the NET info; For keepout zones, net code and net name are irrelevant
1620  // so be sure a dummy value is stored, just for ZONE_CONTAINER compatibility
1621  // (perhaps netcode and netname should be not stored)
1622  m_out->Print( aNestLevel, "(zone (net %d) (net_name %s)",
1623  aZone->GetIsKeepout() ? 0 : m_mapping->Translate( aZone->GetNetCode() ),
1624  m_out->Quotew( aZone->GetIsKeepout() ? wxT("") : aZone->GetNetname() ).c_str() );
1625 
1626  // If a zone exists on multiple layers, format accordingly
1627  if( aZone->GetLayerSet().count() > 1 )
1628  {
1629  formatLayers( aZone->GetLayerSet() );
1630  }
1631  else
1632  {
1633  formatLayer( aZone );
1634  }
1635 
1636  m_out->Print( 0, " (tstamp %lX)", (unsigned long) aZone->GetTimeStamp() );
1637 
1638  // Save the outline aux info
1639  std::string hatch;
1640 
1641  switch( aZone->GetHatchStyle() )
1642  {
1643  default:
1644  case ZONE_CONTAINER::NO_HATCH: hatch = "none"; break;
1645  case ZONE_CONTAINER::DIAGONAL_EDGE: hatch = "edge"; break;
1646  case ZONE_CONTAINER::DIAGONAL_FULL: hatch = "full"; break;
1647  }
1648 
1649  m_out->Print( 0, " (hatch %s %s)\n", hatch.c_str(),
1650  FMT_IU( aZone->GetHatchPitch() ).c_str() );
1651 
1652  if( aZone->GetPriority() > 0 )
1653  m_out->Print( aNestLevel+1, "(priority %d)\n", aZone->GetPriority() );
1654 
1655  m_out->Print( aNestLevel+1, "(connect_pads" );
1656 
1657  switch( aZone->GetPadConnection() )
1658  {
1659  default:
1660  case PAD_ZONE_CONN_THERMAL: // Default option not saved or loaded.
1661  break;
1662 
1664  m_out->Print( 0, " thru_hole_only" );
1665  break;
1666 
1667  case PAD_ZONE_CONN_FULL:
1668  m_out->Print( 0, " yes" );
1669  break;
1670 
1671  case PAD_ZONE_CONN_NONE:
1672  m_out->Print( 0, " no" );
1673  break;
1674  }
1675 
1676  m_out->Print( 0, " (clearance %s))\n",
1677  FMT_IU( aZone->GetZoneClearance() ).c_str() );
1678 
1679  m_out->Print( aNestLevel+1, "(min_thickness %s)\n",
1680  FMT_IU( aZone->GetMinThickness() ).c_str() );
1681 
1682  if( aZone->GetIsKeepout() )
1683  {
1684  m_out->Print( aNestLevel+1, "(keepout (tracks %s) (vias %s) (copperpour %s))\n",
1685  aZone->GetDoNotAllowTracks() ? "not_allowed" : "allowed",
1686  aZone->GetDoNotAllowVias() ? "not_allowed" : "allowed",
1687  aZone->GetDoNotAllowCopperPour() ? "not_allowed" : "allowed" );
1688  }
1689 
1690  m_out->Print( aNestLevel+1, "(fill" );
1691 
1692  // Default is not filled.
1693  if( aZone->IsFilled() )
1694  m_out->Print( 0, " yes" );
1695 
1696  // Default is polygon filled.
1697  if( aZone->GetFillMode() )
1698  m_out->Print( 0, " (mode segment)" );
1699 
1700  m_out->Print( 0, " (arc_segments %d) (thermal_gap %s) (thermal_bridge_width %s)",
1701  aZone->GetArcSegmentCount(),
1702  FMT_IU( aZone->GetThermalReliefGap() ).c_str(),
1703  FMT_IU( aZone->GetThermalReliefCopperBridge() ).c_str() );
1704 
1706  {
1707  m_out->Print( 0, " (smoothing" );
1708 
1709  switch( aZone->GetCornerSmoothingType() )
1710  {
1712  m_out->Print( 0, " chamfer" );
1713  break;
1714 
1716  m_out->Print( 0, " fillet" );
1717  break;
1718 
1719  default:
1720  THROW_IO_ERROR( wxString::Format( _( "unknown zone corner smoothing type %d" ),
1721  aZone->GetCornerSmoothingType() ) );
1722  }
1723  m_out->Print( 0, ")" );
1724 
1725  if( aZone->GetCornerRadius() != 0 )
1726  m_out->Print( 0, " (radius %s)",
1727  FMT_IU( aZone->GetCornerRadius() ).c_str() );
1728  }
1729 
1730  m_out->Print( 0, ")\n" );
1731 
1732  int newLine = 0;
1733 
1734  if( aZone->GetNumCorners() )
1735  {
1736  bool new_polygon = true;
1737  bool is_closed = false;
1738 
1739  for( auto iterator = aZone->IterateWithHoles(); iterator; iterator++ )
1740  {
1741  if( new_polygon )
1742  {
1743  newLine = 0;
1744  m_out->Print( aNestLevel+1, "(polygon\n" );
1745  m_out->Print( aNestLevel+2, "(pts\n" );
1746  new_polygon = false;
1747  is_closed = false;
1748  }
1749 
1750  if( newLine == 0 )
1751  m_out->Print( aNestLevel+3, "(xy %s %s)",
1752  FMT_IU( iterator->x ).c_str(), FMT_IU( iterator->y ).c_str() );
1753  else
1754  m_out->Print( 0, " (xy %s %s)",
1755  FMT_IU( iterator->x ).c_str(), FMT_IU( iterator->y ).c_str() );
1756 
1757  if( newLine < 4 )
1758  {
1759  newLine += 1;
1760  }
1761  else
1762  {
1763  newLine = 0;
1764  m_out->Print( 0, "\n" );
1765  }
1766 
1767  if( iterator.IsEndContour() )
1768  {
1769  is_closed = true;
1770 
1771  if( newLine != 0 )
1772  m_out->Print( 0, "\n" );
1773 
1774  m_out->Print( aNestLevel+2, ")\n" );
1775  m_out->Print( aNestLevel+1, ")\n" );
1776  new_polygon = true;
1777  }
1778  }
1779 
1780  if( !is_closed ) // Should not happen, but...
1781  m_out->Print( aNestLevel+1, ")\n" );
1782 
1783  }
1784 
1785  // Save the PolysList (filled areas)
1786  const SHAPE_POLY_SET& fv = aZone->GetFilledPolysList();
1787  newLine = 0;
1788 
1789  if( !fv.IsEmpty() )
1790  {
1791  bool new_polygon = true;
1792  bool is_closed = false;
1793 
1794  for( auto it = fv.CIterate(); it; ++it )
1795  {
1796  if( new_polygon )
1797  {
1798  newLine = 0;
1799  m_out->Print( aNestLevel+1, "(filled_polygon\n" );
1800  m_out->Print( aNestLevel+2, "(pts\n" );
1801  new_polygon = false;
1802  is_closed = false;
1803  }
1804 
1805  if( newLine == 0 )
1806  m_out->Print( aNestLevel+3, "(xy %s %s)",
1807  FMT_IU( it->x ).c_str(), FMT_IU( it->y ).c_str() );
1808  else
1809  m_out->Print( 0, " (xy %s %s)",
1810  FMT_IU( it->x ) .c_str(), FMT_IU( it->y ).c_str() );
1811 
1812  if( newLine < 4 )
1813  {
1814  newLine += 1;
1815  }
1816  else
1817  {
1818  newLine = 0;
1819  m_out->Print( 0, "\n" );
1820  }
1821 
1822  if( it.IsEndContour() )
1823  {
1824  is_closed = true;
1825 
1826  if( newLine != 0 )
1827  m_out->Print( 0, "\n" );
1828 
1829  m_out->Print( aNestLevel+2, ")\n" );
1830  m_out->Print( aNestLevel+1, ")\n" );
1831  new_polygon = true;
1832  }
1833  }
1834 
1835  if( !is_closed ) // Should not happen, but...
1836  m_out->Print( aNestLevel+1, ")\n" );
1837  }
1838 
1839  // Save the filling segments list
1840  const auto& segs = aZone->FillSegments();
1841 
1842  if( segs.size() )
1843  {
1844  m_out->Print( aNestLevel+1, "(fill_segments\n" );
1845 
1846  for( ZONE_SEGMENT_FILL::const_iterator it = segs.begin(); it != segs.end(); ++it )
1847  {
1848  m_out->Print( aNestLevel+2, "(pts (xy %s) (xy %s))\n",
1849  FMT_IU( wxPoint( it->A ) ).c_str(),
1850  FMT_IU( wxPoint( it->B ) ).c_str() );
1851  }
1852 
1853  m_out->Print( aNestLevel+1, ")\n" );
1854  }
1855 
1856  m_out->Print( aNestLevel, ")\n" );
1857 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
int GetNumCorners(void) const
Access to m_Poly parameters.
Definition: class_zone.h:435
int GetMinThickness() const
Definition: class_zone.h:204
bool GetDoNotAllowCopperPour() const
Definition: class_zone.h:624
int GetArcSegmentCount() const
Definition: class_zone.h:193
bool IsFilled() const
Definition: class_zone.h:195
CONST_ITERATOR CIterate(int aFirst, int aLast, bool aIterateHoles=false) const
ZONE_SEGMENT_FILL & FillSegments()
Definition: class_zone.h:239
void formatLayer(const BOARD_ITEM *aItem) const
int GetCornerSmoothingType() const
Definition: class_zone.h:591
int GetThermalReliefCopperBridge(D_PAD *aPad=NULL) const
Definition: class_zone.cpp:637
unsigned int GetCornerRadius() const
Definition: class_zone.h:595
Pads are not covered.
Definition: zones.h:52
bool GetIsKeepout() const
Accessors to parameters used in Keepout zones:
Definition: class_zone.h:623
virtual LSET GetLayerSet() const override
Function GetLayerSet returns a "layer mask", which is a bitmap of all layers on which the TRACK segme...
Definition: class_zone.cpp:230
#define FMT_IU
ZoneConnection GetPadConnection(D_PAD *aPad=NULL) const
Definition: class_zone.cpp:995
int Translate(int aNetCode) const
Function Translate Translates net number according to the map prepared by Update() function...
Class SHAPE_POLY_SET.
int GetThermalReliefGap(D_PAD *aPad=NULL) const
Definition: class_zone.cpp:628
ZONE_FILL_MODE GetFillMode() const
Definition: class_zone.h:181
#define THROW_IO_ERROR(msg)
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:555
Thermal relief only for THT pads.
Definition: zones.h:55
int GetNetCode() const
Function GetNetCode.
bool GetDoNotAllowTracks() const
Definition: class_zone.h:626
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:625
SHAPE_POLY_SET::ITERATOR IterateWithHoles()
Function IterateWithHoles returns an iterator to visit all points of the zone&#39;s main outline with hol...
Definition: class_zone.h:455
HATCH_STYLE GetHatchStyle() const
Definition: class_zone.h:519
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:107
Use thermal relief for pads.
Definition: zones.h:53
int GetZoneClearance() const
Definition: class_zone.h:198
timestamp_t GetTimeStamp() const
Definition: base_struct.h:207
pads are covered by copper
Definition: zones.h:54
void PCB_IO::formatBoardLayers ( BOARD aBoard,
int  aNestLevel = 0 
) const
protected

formats the board layer information

Definition at line 615 of file kicad_plugin.cpp.

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

Referenced by CLIPBOARD_IO::SaveSelection().

616 {
617  m_out->Print( aNestLevel, "(layers\n" );
618 
619  // Save only the used copper layers from front to back.
620  LSET visible_layers = aBoard->GetVisibleLayers();
621 
622  for( LSEQ cu = aBoard->GetEnabledLayers().CuStack(); cu; ++cu )
623  {
624  PCB_LAYER_ID layer = *cu;
625 
626  m_out->Print( aNestLevel+1, "(%d %s %s", layer,
627  m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str(),
628  LAYER::ShowType( aBoard->GetLayerType( layer ) ) );
629 
630  if( !visible_layers[layer] )
631  m_out->Print( 0, " hide" );
632 
633  m_out->Print( 0, ")\n" );
634  }
635 
636  // Save used non-copper layers in the order they are defined.
637  // desired sequence for non Cu BOARD layers.
638  static const PCB_LAYER_ID non_cu[] =
639  {
640  B_Adhes, // 32
641  F_Adhes,
642  B_Paste,
643  F_Paste,
644  B_SilkS,
645  F_SilkS,
646  B_Mask,
647  F_Mask,
648  Dwgs_User,
649  Cmts_User,
650  Eco1_User,
651  Eco2_User,
652  Edge_Cuts,
653  Margin,
654  B_CrtYd,
655  F_CrtYd,
656  B_Fab,
657  F_Fab
658  };
659 
660  for( LSEQ seq = aBoard->GetEnabledLayers().Seq( non_cu, DIM( non_cu ) ); seq; ++seq )
661  {
662  PCB_LAYER_ID layer = *seq;
663 
664  m_out->Print( aNestLevel+1, "(%d %s user", layer,
665  m_out->Quotew( aBoard->GetLayerName( layer ) ).c_str() );
666 
667  if( !visible_layers[layer] )
668  m_out->Print( 0, " hide" );
669 
670  m_out->Print( 0, ")\n" );
671  }
672 
673  m_out->Print( aNestLevel, ")\n\n" );
674 }
#define DIM(x)
of elements in an array
Definition: macros.h:98
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
LSEQ CuStack() const
Function CuStack returns a sequence of copper layers in starting from the front/top and extending to ...
Definition: lset.cpp:147
#define cu(a)
Definition: auxiliary.h:88
LSET GetEnabledLayers() const
Function GetEnabledLayers is a proxy function that calls the corresponding function in m_BoardSetting...
static const char * ShowType(LAYER_T aType)
Function ShowType converts a LAYER_T enum to a const char*.
LSEQ Seq(const PCB_LAYER_ID *aWishListSequence, unsigned aCount) const
Function Seq returns an LSEQ from the union of this LSET and a desired sequence.
Definition: lset.cpp:364
PCB_LAYER_ID
A quick note on layer IDs:
Class LSET is a set of PCB_LAYER_IDs.
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Function GetLayerName returns the name of a layer given by aLayer.
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
Class LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
LSET GetVisibleLayers() const
Function GetVisibleLayers is a proxy function that calls the correspondent function in m_BoardSetting...
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
LAYER_T GetLayerType(PCB_LAYER_ID aLayer) const
Function GetLayerType returns the type of the copper layer given by aLayer.
void PCB_IO::formatGeneral ( BOARD aBoard,
int  aNestLevel = 0 
) const
protected

formats the General section of the file

Definition at line 593 of file kicad_plugin.cpp.

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

594 {
595  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
596 
597  m_out->Print( 0, "\n" );
598  m_out->Print( aNestLevel, "(general\n" );
599  // Write Bounding box info
600  m_out->Print( aNestLevel+1, "(thickness %s)\n",
601  FMT_IU( dsnSettings.GetBoardThickness() ).c_str() );
602 
603  m_out->Print( aNestLevel+1, "(drawings %d)\n", aBoard->Drawings().Size() );
604  m_out->Print( aNestLevel+1, "(tracks %d)\n", aBoard->GetNumSegmTrack() );
605  m_out->Print( aNestLevel+1, "(zones %d)\n", aBoard->GetNumSegmZone() );
606  m_out->Print( aNestLevel+1, "(modules %d)\n", aBoard->m_Modules.GetCount() );
607  m_out->Print( aNestLevel+1, "(nets %d)\n", m_mapping->GetSize() );
608  m_out->Print( aNestLevel, ")\n\n" );
609 
610  aBoard->GetPageSettings().Format( m_out, aNestLevel, m_ctl );
611  aBoard->GetTitleBlock().Format( m_out, aNestLevel, m_ctl );
612 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
#define FMT_IU
int GetSize() const
Function GetSize.
Definition: netinfo.h:383
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:538
virtual void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Function Format outputs the object to aFormatter in s-expression form.
Definition: worksheet.cpp:168
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:553
void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Function GetStandardSizes returns the standard page types, such as "A4", "A3", etc.
Definition: page_info.cpp:267
TITLE_BLOCK & GetTitleBlock()
Definition: class_board.h:559
DLIST< MODULE > m_Modules
Definition: class_board.h:248
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:255
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 707 of file kicad_plugin.cpp.

708 {
709  formatGeneral( aBoard, aNestLevel );
710  // Layers.
711  formatBoardLayers( aBoard, aNestLevel );
712  // Setup
713  formatSetup( aBoard, aNestLevel );
714  // Save net codes and names
715  formatNetInformation( aBoard, aNestLevel );
716 }
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 458 of file kicad_plugin.cpp.

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

459 {
460  if( m_ctl & CTL_STD_LAYER_NAMES )
461  {
462  PCB_LAYER_ID layer = aItem->GetLayer();
463 
464  // English layer names should never need quoting.
465  m_out->Print( 0, " (layer %s)", TO_UTF8( BOARD::GetStandardLayerName( layer ) ) );
466  }
467  else
468  m_out->Print( 0, " (layer %s)", m_out->Quotew( aItem->GetLayerName() ).c_str() );
469 }
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:653
void PCB_IO::formatLayers ( LSET  aLayerMask,
int  aNestLevel = 0 
) const
private

Definition at line 1156 of file kicad_plugin.cpp.

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

1157 {
1158  std::string output;
1159 
1160  if( aNestLevel == 0 )
1161  output += ' ';
1162 
1163  output += "(layers";
1164 
1165  static const LSET cu_all( LSET::AllCuMask() );
1166  static const LSET fr_bk( 2, B_Cu, F_Cu );
1167  static const LSET adhes( 2, B_Adhes, F_Adhes );
1168  static const LSET paste( 2, B_Paste, F_Paste );
1169  static const LSET silks( 2, B_SilkS, F_SilkS );
1170  static const LSET mask( 2, B_Mask, F_Mask );
1171  static const LSET crt_yd(2, B_CrtYd, F_CrtYd );
1172  static const LSET fab( 2, B_Fab, F_Fab );
1173 
1174  LSET cu_mask = cu_all;
1175 
1176  // output copper layers first, then non copper
1177 
1178  if( ( aLayerMask & cu_mask ) == cu_mask )
1179  {
1180  output += " *.Cu";
1181  aLayerMask &= ~cu_all; // clear bits, so they are not output again below
1182  }
1183  else if( ( aLayerMask & cu_mask ) == fr_bk )
1184  {
1185  output += " F&B.Cu";
1186  aLayerMask &= ~fr_bk;
1187  }
1188 
1189  if( ( aLayerMask & adhes ) == adhes )
1190  {
1191  output += " *.Adhes";
1192  aLayerMask &= ~adhes;
1193  }
1194 
1195  if( ( aLayerMask & paste ) == paste )
1196  {
1197  output += " *.Paste";
1198  aLayerMask &= ~paste;
1199  }
1200 
1201  if( ( aLayerMask & silks ) == silks )
1202  {
1203  output += " *.SilkS";
1204  aLayerMask &= ~silks;
1205  }
1206 
1207  if( ( aLayerMask & mask ) == mask )
1208  {
1209  output += " *.Mask";
1210  aLayerMask &= ~mask;
1211  }
1212 
1213  if( ( aLayerMask & crt_yd ) == crt_yd )
1214  {
1215  output += " *.CrtYd";
1216  aLayerMask &= ~crt_yd;
1217  }
1218 
1219  if( ( aLayerMask & fab ) == fab )
1220  {
1221  output += " *.Fab";
1222  aLayerMask &= ~fab;
1223  }
1224 
1225  // output any individual layers not handled in wildcard combos above
1226 
1227  wxString layerName;
1228 
1229  for( LAYER_NUM layer = 0; layer < PCB_LAYER_ID_COUNT; ++layer )
1230  {
1231  if( aLayerMask[layer] )
1232  {
1233  if( m_board && !( m_ctl & CTL_STD_LAYER_NAMES ) )
1234  layerName = m_board->GetLayerName( PCB_LAYER_ID( layer ) );
1235 
1236  else // I am being called from FootprintSave()
1237  layerName = BOARD::GetStandardLayerName( PCB_LAYER_ID( layer ) );
1238 
1239  output += ' ';
1240  output += m_out->Quotew( layerName );
1241  }
1242  }
1243 
1244  m_out->Print( aNestLevel, "%s)", output.c_str() );
1245 }
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Function AllCuMask returns a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:673
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
PCB_LAYER_ID
A quick note on layer IDs:
Class LSET is a set of PCB_LAYER_IDs.
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Function GetLayerName returns the name of a layer given by aLayer.
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
int LAYER_NUM
Type LAYER_NUM can be replaced with int and removed.
#define CTL_STD_LAYER_NAMES
Use English Standard layer names.
BOARD * m_board
which BOARD, no ownership here
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
static wxString GetStandardLayerName(PCB_LAYER_ID aLayerId)
Function GetStandardLayerName returns an "English Standard" name of a PCB layer when given aLayerNumb...
Definition: class_board.h:653
void PCB_IO::formatNetInformation ( BOARD aBoard,
int  aNestLevel = 0 
) const
protected

formats the Nets and Netclasses

Definition at line 677 of file kicad_plugin.cpp.

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

Referenced by CLIPBOARD_IO::SaveSelection().

678 {
679  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
680  for( NETINFO_MAPPING::iterator net = m_mapping->begin(), netEnd = m_mapping->end();
681  net != netEnd; ++net )
682  {
683  m_out->Print( aNestLevel, "(net %d %s)\n",
684  m_mapping->Translate( net->GetNet() ),
685  m_out->Quotew( net->GetNetname() ).c_str() );
686  }
687 
688  m_out->Print( 0, "\n" );
689 
690  // Save the default net class first.
691  NETCLASS defaultNC = *dsnSettings.GetDefault();
692  filterNetClass( *aBoard, defaultNC ); // Remove empty nets (from a copy of a netclass)
693  defaultNC.Format( m_out, aNestLevel, m_ctl );
694 
695  // Save the rest of the net classes alphabetically.
696  for( NETCLASSES::const_iterator it = dsnSettings.m_NetClasses.begin();
697  it != dsnSettings.m_NetClasses.end();
698  ++it )
699  {
700  NETCLASS netclass = *it->second;
701  filterNetClass( *aBoard, netclass ); // Remove empty nets (from a copy of a netclass)
702  netclass.Format( m_out, aNestLevel, m_ctl );
703  }
704 }
iterator begin() const
Function begin() Returns iterator to the first entry in the mapping.
Definition: netinfo.h:363
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
NETCLASSPTR GetDefault() const
Function GetDefault.
iterator end()
Definition: netclass.h:249
NETCLASS_MAP::const_iterator const_iterator
Definition: netclass.h:251
iterator end() const
Function end() Returns iterator to the last entry in the mapping.
Definition: netinfo.h:374
void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Function Format outputs the net class to aFormatter in s-expression form.
Definition: netclass.cpp:258
iterator begin()
Definition: netclass.h:248
int Translate(int aNetCode) const
Function Translate Translates net number according to the map prepared by Update() function...
Class NETCLASS handles a collection of nets and the parameters used to route or test these nets...
Definition: netclass.h:55
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:538
std::string Quotew(const wxString &aWrapee)
Definition: richio.cpp:482
Wrapper class, so you can iterate through NETINFO_ITEM*s, not std::pair<int/wxString, NETINFO_ITEM*>
Definition: netinfo.h:313
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
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 471 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(), LAYER_CLASS_COPPER, LAYER_CLASS_EDGES, LAYER_CLASS_SILK, BOARD_DESIGN_SETTINGS::m_BlindBuriedViaAllowed, BOARD_DESIGN_SETTINGS::m_LineThickness, BOARD_DESIGN_SETTINGS::m_MicroViasAllowed, BOARD_DESIGN_SETTINGS::m_MicroViasMinDrill, BOARD_DESIGN_SETTINGS::m_MicroViasMinSize, BOARD_DESIGN_SETTINGS::m_Pad_Master, BOARD_DESIGN_SETTINGS::m_SolderMaskMargin, BOARD_DESIGN_SETTINGS::m_SolderMaskMinWidth, BOARD_DESIGN_SETTINGS::m_SolderPasteMargin, BOARD_DESIGN_SETTINGS::m_SolderPasteMarginRatio, BOARD_DESIGN_SETTINGS::m_TextSize, BOARD_DESIGN_SETTINGS::m_TextThickness, BOARD_DESIGN_SETTINGS::m_TrackMinWidth, BOARD_DESIGN_SETTINGS::m_TrackWidthList, BOARD_DESIGN_SETTINGS::m_ViasDimensionsList, BOARD_DESIGN_SETTINGS::m_ViasMinDrill, BOARD_DESIGN_SETTINGS::m_ViasMinSize, ZONE_SETTINGS::m_Zone_45_Only, ZONE_SETTINGS::m_ZoneClearance, wxPoint::x, and wxPoint::y.

472 {
473  const BOARD_DESIGN_SETTINGS& dsnSettings = aBoard->GetDesignSettings();
474 
475  // Setup
476  m_out->Print( aNestLevel, "(setup\n" );
477 
478  // Save current default track width, for compatibility with older Pcbnew version;
479  m_out->Print( aNestLevel+1, "(last_trace_width %s)\n",
480  FMT_IU( dsnSettings.GetCurrentTrackWidth() ).c_str() );
481 
482  // Save custom tracks width list (the first is not saved here: this is the netclass value
483  for( unsigned ii = 1; ii < dsnSettings.m_TrackWidthList.size(); ii++ )
484  m_out->Print( aNestLevel+1, "(user_trace_width %s)\n",
485  FMT_IU( dsnSettings.m_TrackWidthList[ii] ).c_str() );
486 
487  m_out->Print( aNestLevel+1, "(trace_clearance %s)\n",
488  FMT_IU( dsnSettings.GetDefault()->GetClearance() ).c_str() );
489 
490  // ZONE_SETTINGS
491  m_out->Print( aNestLevel+1, "(zone_clearance %s)\n",
492  FMT_IU( aBoard->GetZoneSettings().m_ZoneClearance ).c_str() );
493  m_out->Print( aNestLevel+1, "(zone_45_only %s)\n",
494  aBoard->GetZoneSettings().m_Zone_45_Only ? "yes" : "no" );
495 
496  m_out->Print( aNestLevel+1, "(trace_min %s)\n",
497  FMT_IU( dsnSettings.m_TrackMinWidth ).c_str() );
498 
499  // Save current default via size, for compatibility with older Pcbnew version;
500  m_out->Print( aNestLevel+1, "(via_size %s)\n",
501  FMT_IU( dsnSettings.GetDefault()->GetViaDiameter() ).c_str() );
502  m_out->Print( aNestLevel+1, "(via_drill %s)\n",
503  FMT_IU( dsnSettings.GetDefault()->GetViaDrill() ).c_str() );
504  m_out->Print( aNestLevel+1, "(via_min_size %s)\n",
505  FMT_IU( dsnSettings.m_ViasMinSize ).c_str() );
506  m_out->Print( aNestLevel+1, "(via_min_drill %s)\n",
507  FMT_IU( dsnSettings.m_ViasMinDrill ).c_str() );
508 
509  // Save custom vias diameters list (the first is not saved here: this is
510  // the netclass value
511  for( unsigned ii = 1; ii < dsnSettings.m_ViasDimensionsList.size(); ii++ )
512  m_out->Print( aNestLevel+1, "(user_via %s %s)\n",
513  FMT_IU( dsnSettings.m_ViasDimensionsList[ii].m_Diameter ).c_str(),
514  FMT_IU( dsnSettings.m_ViasDimensionsList[ii].m_Drill ).c_str() );
515 
516  // for old versions compatibility:
517  if( dsnSettings.m_BlindBuriedViaAllowed )
518  m_out->Print( aNestLevel+1, "(blind_buried_vias_allowed yes)\n" );
519 
520  m_out->Print( aNestLevel+1, "(uvia_size %s)\n",
521  FMT_IU( dsnSettings.GetDefault()->GetuViaDiameter() ).c_str() );
522  m_out->Print( aNestLevel+1, "(uvia_drill %s)\n",
523  FMT_IU( dsnSettings.GetDefault()->GetuViaDrill() ).c_str() );
524  m_out->Print( aNestLevel+1, "(uvias_allowed %s)\n",
525  ( dsnSettings.m_MicroViasAllowed ) ? "yes" : "no" );
526  m_out->Print( aNestLevel+1, "(uvia_min_size %s)\n",
527  FMT_IU( dsnSettings.m_MicroViasMinSize ).c_str() );
528  m_out->Print( aNestLevel+1, "(uvia_min_drill %s)\n",
529  FMT_IU( dsnSettings.m_MicroViasMinDrill ).c_str() );
530 
531  // 6.0 TODO: are we going to update the tokens we save these under?
532  // 6.0 TODO: need to save the LAYER_CLASS_OTHERS stuff
533  // 6.0 TODO: need to save the TextItalic and TextUpright settings
534 
535  m_out->Print( aNestLevel+1, "(edge_width %s)\n",
536  FMT_IU( dsnSettings.m_LineThickness[ LAYER_CLASS_EDGES ] ).c_str() );
537 
538  m_out->Print( aNestLevel+1, "(segment_width %s)\n",
539  FMT_IU( dsnSettings.m_LineThickness[ LAYER_CLASS_COPPER ] ).c_str() );
540  m_out->Print( aNestLevel+1, "(pcb_text_width %s)\n",
541  FMT_IU( dsnSettings.m_TextThickness[ LAYER_CLASS_COPPER ] ).c_str() );
542  m_out->Print( aNestLevel+1, "(pcb_text_size %s %s)\n",
543  FMT_IU( dsnSettings.m_TextSize[ LAYER_CLASS_COPPER ].x ).c_str(),
544  FMT_IU( dsnSettings.m_TextSize[ LAYER_CLASS_COPPER ].y ).c_str() );
545 
546  m_out->Print( aNestLevel+1, "(mod_edge_width %s)\n",
547  FMT_IU( dsnSettings.m_LineThickness[ LAYER_CLASS_SILK ] ).c_str() );
548  m_out->Print( aNestLevel+1, "(mod_text_size %s %s)\n",
549  FMT_IU( dsnSettings.m_TextSize[ LAYER_CLASS_SILK ].x ).c_str(),
550  FMT_IU( dsnSettings.m_TextSize[ LAYER_CLASS_SILK ].y ).c_str() );
551  m_out->Print( aNestLevel+1, "(mod_text_width %s)\n",
552  FMT_IU( dsnSettings.m_TextThickness[ LAYER_CLASS_SILK ] ).c_str() );
553 
554  m_out->Print( aNestLevel+1, "(pad_size %s %s)\n",
555  FMT_IU( dsnSettings.m_Pad_Master.GetSize().x ).c_str(),
556  FMT_IU( dsnSettings.m_Pad_Master.GetSize().y ).c_str() );
557  m_out->Print( aNestLevel+1, "(pad_drill %s)\n",
558  FMT_IU( dsnSettings.m_Pad_Master.GetDrillSize().x ).c_str() );
559 
560  m_out->Print( aNestLevel+1, "(pad_to_mask_clearance %s)\n",
561  FMT_IU( dsnSettings.m_SolderMaskMargin ).c_str() );
562 
563  if( dsnSettings.m_SolderMaskMinWidth )
564  m_out->Print( aNestLevel+1, "(solder_mask_min_width %s)\n",
565  FMT_IU( dsnSettings.m_SolderMaskMinWidth ).c_str() );
566 
567  if( dsnSettings.m_SolderPasteMargin != 0 )
568  m_out->Print( aNestLevel+1, "(pad_to_paste_clearance %s)\n",
569  FMT_IU( dsnSettings.m_SolderPasteMargin ).c_str() );
570 
571  if( dsnSettings.m_SolderPasteMarginRatio != 0 )
572  m_out->Print( aNestLevel+1, "(pad_to_paste_clearance_ratio %s)\n",
573  Double2Str( dsnSettings.m_SolderPasteMarginRatio ).c_str() );
574 
575  m_out->Print( aNestLevel+1, "(aux_axis_origin %s %s)\n",
576  FMT_IU( aBoard->GetAuxOrigin().x ).c_str(),
577  FMT_IU( aBoard->GetAuxOrigin().y ).c_str() );
578 
579  if( aBoard->GetGridOrigin().x || aBoard->GetGridOrigin().y )
580  m_out->Print( aNestLevel+1, "(grid_origin %s %s)\n",
581  FMT_IU( aBoard->GetGridOrigin().x ).c_str(),
582  FMT_IU( aBoard->GetGridOrigin().y ).c_str() );
583 
584  m_out->Print( aNestLevel+1, "(visible_elements %X)\n",
585  dsnSettings.GetVisibleElements() );
586 
587  aBoard->GetPlotOptions().Format( m_out, aNestLevel+1 );
588 
589  m_out->Print( aNestLevel, ")\n\n" );
590 }
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:562
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:356
int m_SolderPasteMargin
Solder paste margin absolute value.
std::vector< int > m_TrackWidthList
std::string Double2Str(double aValue)
Helper function Double2Str to print a float number without using scientific notation and no trailing ...
Definition: base_units.cpp:63
const wxSize & GetDrillSize() const
Definition: class_pad.h:275
wxSize m_TextSize[LAYER_CLASS_COUNT]
#define FMT_IU
int m_TextThickness[LAYER_CLASS_COUNT]
int m_TrackMinWidth
track min value for width ((min copper size value
int m_ViasMinSize
vias (not micro vias) min diameter
int m_ViasMinDrill
vias (not micro vias) min drill diameter
const PCB_PLOT_PARAMS & GetPlotOptions() const
Definition: class_board.h:556
const wxSize & GetSize() const
Definition: class_pad.h:269
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:538
int m_ZoneClearance
Clearance value.
Definition: zone_settings.h:63
bool m_BlindBuriedViaAllowed
true to allow blind/buried vias
int m_MicroViasMinSize
micro vias (not vias) min diameter
int m_LineThickness[LAYER_CLASS_COUNT]
const wxPoint & GetAuxOrigin() const
Definition: class_board.h:349
D_PAD m_Pad_Master
A dummy pad to store all default parameters.
std::vector< VIA_DIMENSION > m_ViasDimensionsList
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
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 MODULE * PCB_IO::GetEnumeratedFootprint ( const wxString &  aLibraryPath,
const wxString &  aFootprintName,
const PROPERTIES aProperties = NULL 
)
overridevirtual

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

Reimplemented from PLUGIN.

Definition at line 2010 of file kicad_plugin.cpp.

References getFootprint().

Referenced by GetFileExtension().

2013 {
2014  return getFootprint( aLibraryPath, aFootprintName, aProperties, false );
2015 }
const MODULE * getFootprint(const wxString &aLibraryPath, const wxString &aFootprintName, const PROPERTIES *aProperties, bool checkModified)
const wxString PCB_IO::GetFileExtension ( ) const
inlineoverridevirtual

Function GetFileExtension returns the file extension for the PLUGIN.

Implements PLUGIN.

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

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

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

Definition at line 1979 of file kicad_plugin.cpp.

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

Referenced by FootprintLoad(), and GetEnumeratedFootprint().

1983 {
1984  LOCALE_IO toggle; // toggles on, then off, the C locale.
1985 
1986  init( aProperties );
1987 
1988  try
1989  {
1990  validateCache( aLibraryPath, checkModified );
1991  }
1992  catch( const IO_ERROR& )
1993  {
1994  // do nothing with the error
1995  }
1996 
1997  const MODULE_MAP& mods = m_cache->GetModules();
1998 
1999  MODULE_CITER it = mods.find( aFootprintName );
2000 
2001  if( it == mods.end() )
2002  {
2003  return NULL;
2004  }
2005 
2006  return it->second->GetModule();
2007 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:179
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
std::map< wxString, MODULE * > MODULE_MAP
Definition: eagle_plugin.h:36
MODULE_MAP::const_iterator MODULE_CITER
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:76
MODULE_MAP & GetModules()
long long PCB_IO::GetLibraryTimestamp ( const wxString &  aLibraryPath) const
overridevirtual

Generate a timestamp representing all the files in the library (including the library directory).

Timestamps should not be considered ordered; they either match or they don't.

Implements PLUGIN.

Definition at line 2145 of file kicad_plugin.cpp.

References FP_CACHE::GetTimestamp().

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

2146 {
2147  return FP_CACHE::GetTimestamp( aLibraryPath );
2148 }
static long long GetTimestamp(const wxString &aLibPath)
Function GetTimestamp Generate a timestamp representing all source files in the cache (including the ...
std::string PCB_IO::GetStringOutput ( bool  doClear)
inline

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

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

Referenced by FOOTPRINT_EDIT_FRAME::Export_Module().

162  {
163  std::string ret = m_sf.GetString();
164  if( doClear )
165  m_sf.Clear();
166 
167  return ret;
168  }
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 1923 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(), FootprintSave(), getFootprint(), IsFootprintLibWritable(), CLIPBOARD_IO::Load(), Load(), PCB_IO(), and CLIPBOARD_IO::Save().

1924 {
1925  m_board = NULL;
1926  m_reader = NULL;
1928  m_props = aProperties;
1929 }
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 2246 of file kicad_plugin.cpp.

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

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

2247 {
2248  LOCALE_IO toggle;
2249 
2250  init( NULL );
2251 
2252  validateCache( aLibraryPath );
2253 
2254  return m_cache->IsWritable();
2255 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:179
FP_CACHE * m_cache
Footprint library cache.
void init(const PROPERTIES *aProperties)
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
bool IsWritable() const
BOARD * PCB_IO::Load ( const wxString &  aFileName,
BOARD aAppendToMe,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Function Load loads information from some input file format that this PLUGIN implementation knows about, into either a new BOARD or an existing one.

This may be used to load an entire new BOARD, or to augment an existing one if aAppendToMe is not NULL.

Parameters
aFileNameis the name of the file to use as input and may be foreign in nature or native in nature.
aAppendToMeis an existing BOARD to append to, but if NULL then this means "do not append, rather load anew".
aPropertiesis an associative array that can be used to tell the loader how to load the file, because it can take any number of additional named arguments that the plugin is known to support. These are tuning parameters for the import or load. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Returns
BOARD* - the successfully loaded board, or the same one as aAppendToMe if aAppendToMe was not NULL, and caller owns it.
Exceptions
IO_ERRORif there is a problem loading, and its contents should say what went wrong, using line number and character offsets of the input file if possible.

Reimplemented from PLUGIN.

Definition at line 1879 of file kicad_plugin.cpp.

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

Referenced by GetFileExtension().

1880 {
1881  FILE_LINE_READER reader( aFileName );
1882 
1883  init( aProperties );
1884 
1885  m_parser->SetLineReader( &reader );
1886  m_parser->SetBoard( aAppendToMe );
1887 
1888  BOARD* board;
1889 
1890  try
1891  {
1892  board = dynamic_cast<BOARD*>( m_parser->Parse() );
1893  }
1894  catch( const FUTURE_FORMAT_ERROR& )
1895  {
1896  // Don't wrap a FUTURE_FORMAT_ERROR in another
1897  throw;
1898  }
1899  catch( const PARSE_ERROR& parse_error )
1900  {
1901  if( m_parser->IsTooRecent() )
1902  throw FUTURE_FORMAT_ERROR( parse_error, m_parser->GetRequiredVersion() );
1903  else
1904  throw;
1905  }
1906 
1907  if( !board )
1908  {
1909  // The parser loaded something that was valid, but wasn't a board.
1910  THROW_PARSE_ERROR( _( "this file does not contain a PCB" ),
1911  m_parser->CurSource(), m_parser->CurLine(),
1912  m_parser->CurLineNumber(), m_parser->CurOffset() );
1913  }
1914 
1915  // Give the filename to the board if it's new
1916  if( !aAppendToMe )
1917  board->SetFileName( aFileName );
1918 
1919  return board;
1920 }
void init(const PROPERTIES *aProperties)
Class FILE_LINE_READER is a LINE_READER that reads from an open file.
Definition: richio.h:180
wxString GetRequiredVersion()
Return a string representing the version of kicad required to open this file.
Definition: pcb_parser.cpp:182
void SetBoard(BOARD *aBoard)
Definition: pcb_parser.h:300
void SetFileName(const wxString &aFileName)
Definition: class_board.h:235
PCB_PARSER * m_parser
#define THROW_PARSE_ERROR(aProblem, aSource, aInputLine, aLineNumber, aByteIndex)
BOARD_ITEM * Parse()
Definition: pcb_parser.cpp:442
LINE_READER * SetLineReader(LINE_READER *aReader)
Function SetLineReader sets aLineReader into the parser, and returns the previous one...
Definition: pcb_parser.h:293
bool IsTooRecent()
Return whether a version number, if any was parsed, was too recent.
Definition: pcb_parser.h:318
Struct PARSE_ERROR contains a filename or source description, a problem input line, a line number, a byte offset, and an error message which contains the the caller&#39;s report and his call site information: CPP source file, function, and line number.
Definition: ki_exception.h:123
Class BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:170
Struct FUTURE_FORMAT_ERROR variant of PARSE_ERROR indicating that a syntax or related error was likel...
Definition: ki_exception.h:172
BOARD_ITEM * PCB_IO::Parse ( const wxString &  aClipboardSourceInput)

Definition at line 379 of file kicad_plugin.cpp.

References TO_UTF8.

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

380 {
381  std::string input = TO_UTF8( aClipboardSourceInput );
382 
383  STRING_LINE_READER reader( input, wxT( "clipboard" ) );
384 
385  m_parser->SetLineReader( &reader );
386 
387  try
388  {
389  return m_parser->Parse();
390  }
391  catch( const PARSE_ERROR& parse_error )
392  {
393  if( m_parser->IsTooRecent() )
394  throw FUTURE_FORMAT_ERROR( parse_error, m_parser->GetRequiredVersion() );
395  else
396  throw;
397  }
398 }
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes...
Definition: macros.h:47
wxString GetRequiredVersion()
Return a string representing the version of kicad required to open this file.
Definition: pcb_parser.cpp:182
PCB_PARSER * m_parser
BOARD_ITEM * Parse()
Definition: pcb_parser.cpp:442
LINE_READER * SetLineReader(LINE_READER *aReader)
Function SetLineReader sets aLineReader into the parser, and returns the previous one...
Definition: pcb_parser.h:293
bool IsTooRecent()
Return whether a version number, if any was parsed, was too recent.
Definition: pcb_parser.h:318
Struct PARSE_ERROR contains a filename or source description, a problem input line, a line number, a byte offset, and an error message which contains the the caller&#39;s report and his call site information: CPP source file, function, and line number.
Definition: ki_exception.h:123
Struct FUTURE_FORMAT_ERROR variant of PARSE_ERROR indicating that a syntax or related error was likel...
Definition: ki_exception.h:172
Class STRING_LINE_READER is a LINE_READER that reads from a multiline 8 bit wide std::string.
Definition: richio.h:254
const wxString PCB_IO::PluginName ( ) const
inlineoverridevirtual

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

Implements PLUGIN.

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

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

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

performing downloads). Does not parse. Threadsafe.

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

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

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

Reimplemented in GITHUB_PLUGIN.

Definition at line 68 of file plugin.cpp.

Referenced by FP_LIB_TABLE::PrefetchLib().

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

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

Referenced by GetFileExtension().

356 {
357  LOCALE_IO toggle; // toggles on, then off, the C locale.
358 
359  init( aProperties );
360 
361  m_board = aBoard; // after init()
362 
363  // Prepare net mapping that assures that net codes saved in a file are consecutive integers
364  m_mapping->SetBoard( aBoard );
365 
366  FILE_OUTPUTFORMATTER formatter( aFileName );
367 
368  m_out = &formatter; // no ownership
369 
370  m_out->Print( 0, "(kicad_pcb (version %d) (host pcbnew %s)\n", SEXPR_BOARD_FILE_VERSION,
371  formatter.Quotew( GetBuildVersion() ).c_str() );
372 
373  Format( aBoard, 1 );
374 
375  m_out->Print( 0, ")\n" );
376 }
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:179
void init(const PROPERTIES *aProperties)
#define SEXPR_BOARD_FILE_VERSION
Current s-expression file format version. 2 was the last legacy format version.
void SetBoard(const BOARD *aBoard)
Function SetBoard Sets a BOARD object that is used to prepare the net code map.
Definition: netinfo.h:289
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 170 of file pcbnew/kicad_plugin.h.

References m_out, and Parse().

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

Definition at line 1932 of file kicad_plugin.cpp.

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

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

1933 {
1934  if( !m_cache || !m_cache->IsPath( aLibraryPath ) || ( checkModified && m_cache->IsModified() ) )
1935  {
1936  // a spectacular episode in memory management:
1937  delete m_cache;
1938  m_cache = new FP_CACHE( this, aLibraryPath );
1939  m_cache->Load();
1940  }
1941 }
friend class FP_CACHE
bool IsModified()
Function IsModified Return true if the cache is not up-to-date.
FP_CACHE * m_cache
Footprint library cache.
bool IsPath(const wxString &aPath) const
Function IsPath checks if aPath is the same as the current cache path.
void Load()

Friends And Related Function Documentation

friend class FP_CACHE
friend

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

Referenced by FootprintLibCreate(), and validateCache().

Member Data Documentation

BOARD* PCB_IO::m_board
protected

which BOARD, no ownership here

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

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

int PCB_IO::m_ctl
protected

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

Referenced by FootprintSave().

wxString PCB_IO::m_error
protected

for throwing exceptions

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

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

OUTPUTFORMATTER* PCB_IO::m_out
protected

output any Format()s to this, no ownership

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

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

PCB_PARSER* PCB_IO::m_parser
protected

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

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

const PROPERTIES* PCB_IO::m_props
protected

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

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

Referenced by init().

LINE_READER* PCB_IO::m_reader
protected

no ownership here.

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

Referenced by init().

STRING_FORMATTER PCB_IO::m_sf
protected

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

Referenced by GetStringOutput(), and PCB_IO().


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