KiCad PCB EDA Suite
SCH_LEGACY_PLUGIN Class Reference

A SCH_PLUGIN derivation for loading schematic files created before the new s-expression file format. More...

#include <sch_legacy_plugin.h>

Inheritance diagram for SCH_LEGACY_PLUGIN:
SCH_PLUGIN

Public Member Functions

 SCH_LEGACY_PLUGIN ()
 
virtual ~SCH_LEGACY_PLUGIN ()
 
const wxString GetName () const override
 Returns a brief hard coded name for this SCH_PLUGIN. More...
 
const wxString GetFileExtension () const override
 Returns the file extension for the SCH_PLUGIN. More...
 
int GetModifyHash () const override
 Return the modification hash from the library cache. More...
 
SCH_SHEETLoad (const wxString &aFileName, KIWAY *aKiway, SCH_SHEET *aAppendToMe=NULL, const PROPERTIES *aProperties=NULL) override
 Load information from some input file format that this SCH_PLUGIN implementation knows about, into either a new SCH_SHEET or an existing one. More...
 
void Save (const wxString &aFileName, SCH_SCREEN *aScreen, KIWAY *aKiway, const PROPERTIES *aProperties=NULL) override
 Write aSchematic to a storage file in a format that this SCH_PLUGIN implementation knows about, or it can be used to write a portion of aSchematic to a special kind of export file. More...
 
void Format (SCH_SCREEN *aScreen)
 
size_t GetSymbolLibCount (const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 
void EnumerateSymbolLib (wxArrayString &aAliasNameList, const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 Populate a list of LIB_PART alias names contained within the library aLibraryPath. More...
 
void EnumerateSymbolLib (std::vector< LIB_ALIAS * > &aAliasList, const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 Populate a list of LIB_PART aliases contained within the library aLibraryPath. More...
 
LIB_ALIASLoadSymbol (const wxString &aLibraryPath, const wxString &aAliasName, const PROPERTIES *aProperties=NULL) override
 Load a LIB_ALIAS object having aAliasName from the aLibraryPath containing a library format that this SCH_PLUGIN knows about. More...
 
void SaveSymbol (const wxString &aLibraryPath, const LIB_PART *aSymbol, const PROPERTIES *aProperties=NULL) override
 Write aSymbol to an existing library located at aLibraryPath. More...
 
void DeleteAlias (const wxString &aLibraryPath, const wxString &aAliasName, const PROPERTIES *aProperties=NULL) override
 Delete aAliasName from the library at aLibraryPath. More...
 
void DeleteSymbol (const wxString &aLibraryPath, const wxString &aAliasName, const PROPERTIES *aProperties=NULL) override
 Delete the entire LIB_PART associated with aAliasName from the library aLibraryPath. More...
 
void CreateSymbolLib (const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 Create a new empty symbol library at aLibraryPath. More...
 
bool DeleteSymbolLib (const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 Delete an existing symbol library and returns true if successful, 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...
 
void SaveLibrary (const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 
bool CheckHeader (const wxString &aFileName) override
 Return true if the first line in aFileName begins with the expected header. More...
 
bool IsSymbolLibWritable (const wxString &aLibraryPath) override
 Return true if the library at aLibraryPath is writable. More...
 
const wxString & GetError () const override
 Return an error string to the caller. More...
 
virtual void SymbolLibOptions (PROPERTIES *aListToAppendTo) const
 Append supported SCH_PLUGIN options to aListToAppenTo along with internationalized descriptions. More...
 

Static Public Attributes

static const char * PropBuffering = "buffering"
 const char* PropBuffering More...
 
static const char * PropNoDocFile = "no_doc_file"
 const char* PropBuffering More...
 

Protected Member Functions

void init (KIWAY *aKiway, const PROPERTIES *aProperties=NULL)
 initialize PLUGIN like a constructor would. More...
 

Protected Attributes

int m_version
 Version of file being loaded. More...
 
wxString m_error
 For throwing exceptions or errors on partial schematic loads. More...
 
wxString m_path
 Root project path for loading child sheets. More...
 
const PROPERTIESm_props
 Passed via Save() or Load(), no ownership, may be NULL. More...
 
KIWAYm_kiway
 Required for path to legacy component libraries. More...
 
SCH_SHEETm_rootSheet
 The root sheet of the schematic being loaded.. More...
 
FILE_OUTPUTFORMATTERm_out
 The output formatter for saving SCH_SCREEN objects. More...
 
SCH_LEGACY_PLUGIN_CACHEm_cache
 

Private Member Functions

void loadHierarchy (SCH_SHEET *aSheet)
 
void loadHeader (FILE_LINE_READER &aReader, SCH_SCREEN *aScreen)
 
void loadPageSettings (FILE_LINE_READER &aReader, SCH_SCREEN *aScreen)
 
void loadFile (const wxString &aFileName, SCH_SCREEN *aScreen)
 
SCH_SHEETloadSheet (FILE_LINE_READER &aReader)
 
SCH_BITMAPloadBitmap (FILE_LINE_READER &aReader)
 
SCH_JUNCTIONloadJunction (FILE_LINE_READER &aReader)
 
SCH_NO_CONNECTloadNoConnect (FILE_LINE_READER &aReader)
 
SCH_LINEloadWire (FILE_LINE_READER &aReader)
 
SCH_BUS_ENTRY_BASEloadBusEntry (FILE_LINE_READER &aReader)
 
SCH_TEXTloadText (FILE_LINE_READER &aReader)
 
SCH_COMPONENTloadComponent (FILE_LINE_READER &aReader)
 
void saveComponent (SCH_COMPONENT *aComponent)
 
void saveField (SCH_FIELD *aField)
 
void saveBitmap (SCH_BITMAP *aBitmap)
 
void saveSheet (SCH_SHEET *aSheet)
 
void saveJunction (SCH_JUNCTION *aJunction)
 
void saveNoConnect (SCH_NO_CONNECT *aNoConnect)
 
void saveBusEntry (SCH_BUS_ENTRY_BASE *aBusEntry)
 
void saveLine (SCH_LINE *aLine)
 
void saveText (SCH_TEXT *aText)
 
void cacheLib (const wxString &aLibraryFileName)
 
bool writeDocFile (const PROPERTIES *aProperties)
 
bool isBuffering (const PROPERTIES *aProperties)
 

Detailed Description

A SCH_PLUGIN derivation for loading schematic files created before the new s-expression file format.

The legacy parser and formatter attempt to be compatible with the legacy file format. The original parser was very forgiving in that it would parse only part of a keyword. So "$C", "$Co", and "$Com" could be used for "$Comp" and the old parser would allow this. This parser is not that forgiving and sticks to the legacy file format document.

As with all SCH_PLUGINs there is no UI dependencies i.e. windowing calls allowed.

Definition at line 59 of file sch_legacy_plugin.h.

Constructor & Destructor Documentation

SCH_LEGACY_PLUGIN::SCH_LEGACY_PLUGIN ( )

Definition at line 557 of file sch_legacy_plugin.cpp.

558 {
559  init( NULL );
560 }
void init(KIWAY *aKiway, const PROPERTIES *aProperties=NULL)
initialize PLUGIN like a constructor would.
SCH_LEGACY_PLUGIN::~SCH_LEGACY_PLUGIN ( )
virtual

Definition at line 563 of file sch_legacy_plugin.cpp.

564 {
565  delete m_cache;
566 }
SCH_LEGACY_PLUGIN_CACHE * m_cache

Member Function Documentation

void SCH_LEGACY_PLUGIN::cacheLib ( const wxString &  aLibraryFileName)
private

Definition at line 4051 of file sch_legacy_plugin.cpp.

References PART_LIBS::s_modify_generation, and SCH_LEGACY_PLUGIN_CACHE::SCH_LEGACY_PLUGIN_CACHE().

Referenced by GetError().

4052 {
4053  if( !m_cache || !m_cache->IsFile( aLibraryFileName ) || m_cache->IsFileChanged() )
4054  {
4055  // a spectacular episode in memory management:
4056  delete m_cache;
4057  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryFileName );
4058 
4059  // Because m_cache is rebuilt, increment PART_LIBS::s_modify_generation
4060  // to modify the hash value that indicate component to symbol links
4061  // must be updated.
4063 
4064  if( !isBuffering( m_props ) )
4065  m_cache->Load();
4066  }
4067 }
static int s_modify_generation
helper for GetModifyHash()
SCH_LEGACY_PLUGIN_CACHE * m_cache
A cache assistant for the part library portion of the SCH_PLUGIN API, and only for the SCH_LEGACY_PLU...
bool isBuffering(const PROPERTIES *aProperties)
bool IsFile(const wxString &aFullPathAndFileName) const
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
bool SCH_LEGACY_PLUGIN::CheckHeader ( const wxString &  aFileName)
overridevirtual

Return true if the first line in aFileName begins with the expected header.

Parameters
aFileNameis the name of the file to use as input

Reimplemented from SCH_PLUGIN.

Definition at line 4281 of file sch_legacy_plugin.cpp.

4282 {
4283  // Open file and check first line
4284  wxTextFile tempFile;
4285 
4286  tempFile.Open( aFileName );
4287  wxString firstline;
4288  // read the first line
4289  firstline = tempFile.GetFirstLine();
4290  tempFile.Close();
4291 
4292  return firstline.StartsWith( "EESchema" );
4293 }
void SCH_LEGACY_PLUGIN::CreateSymbolLib ( const wxString &  aLibraryPath,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Create a new empty symbol library at aLibraryPath.

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 SCH_PLUGIN.

Definition at line 4214 of file sch_legacy_plugin.cpp.

References Format(), SCH_LEGACY_PLUGIN_CACHE::SCH_LEGACY_PLUGIN_CACHE(), and THROW_IO_ERROR.

4216 {
4217  if( wxFileExists( aLibraryPath ) )
4218  {
4220  _( "symbol library \"%s\" already exists, cannot create a new library" ),
4221  aLibraryPath.GetData() ) );
4222  }
4223 
4224  LOCALE_IO toggle;
4225 
4226  m_props = aProperties;
4227 
4228  delete m_cache;
4229  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryPath );
4230  m_cache->SetModified();
4231  m_cache->Save( writeDocFile( aProperties ) );
4232  m_cache->Load(); // update m_writable and m_mod_time
4233 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
SCH_LEGACY_PLUGIN_CACHE * m_cache
A cache assistant for the part library portion of the SCH_PLUGIN API, and only for the SCH_LEGACY_PLU...
void SetModified(bool aModified=true)
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 Save(bool aSaveDocFile=true)
Save the entire library to file m_libFileName;.
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
bool writeDocFile(const PROPERTIES *aProperties)
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
void SCH_LEGACY_PLUGIN::DeleteAlias ( const wxString &  aLibraryPath,
const wxString &  aAliasName,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Delete aAliasName from the library at aLibraryPath.

If aAliasName refers the the root LIB_PART object, the part is renamed to the next or previous LIB_ALIAS in the LIB_PART if one exists. If the LIB_ALIAS is the last alias referring to the root LIB_PART, the LIB_PART is also removed from the library.

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several symbols.
aAliasNameis the name of a LIB_ALIAS 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 alias or the library or deleting it.

Reimplemented from SCH_PLUGIN.

Definition at line 4186 of file sch_legacy_plugin.cpp.

4188 {
4189  m_props = aProperties;
4190 
4191  cacheLib( aLibraryPath );
4192 
4193  m_cache->DeleteAlias( aAliasName );
4194 
4195  if( !isBuffering( aProperties ) )
4196  m_cache->Save( writeDocFile( aProperties ) );
4197 }
SCH_LEGACY_PLUGIN_CACHE * m_cache
bool isBuffering(const PROPERTIES *aProperties)
void DeleteAlias(const wxString &aAliasName)
void cacheLib(const wxString &aLibraryFileName)
void Save(bool aSaveDocFile=true)
Save the entire library to file m_libFileName;.
bool writeDocFile(const PROPERTIES *aProperties)
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
void SCH_LEGACY_PLUGIN::DeleteSymbol ( const wxString &  aLibraryPath,
const wxString &  aAliasName,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Delete the entire LIB_PART associated with aAliasName from the library aLibraryPath.

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several symbols.
aAliasNameis the name of a LIB_ALIAS associated with it's root LIB_PART object 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 alias or the library or deleting it.

Reimplemented from SCH_PLUGIN.

Definition at line 4200 of file sch_legacy_plugin.cpp.

4202 {
4203  m_props = aProperties;
4204 
4205  cacheLib( aLibraryPath );
4206 
4207  m_cache->DeleteSymbol( aAliasName );
4208 
4209  if( !isBuffering( aProperties ) )
4210  m_cache->Save( writeDocFile( aProperties ) );
4211 }
SCH_LEGACY_PLUGIN_CACHE * m_cache
bool isBuffering(const PROPERTIES *aProperties)
void cacheLib(const wxString &aLibraryFileName)
void Save(bool aSaveDocFile=true)
Save the entire library to file m_libFileName;.
void DeleteSymbol(const wxString &aAliasName)
bool writeDocFile(const PROPERTIES *aProperties)
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
bool SCH_LEGACY_PLUGIN::DeleteSymbolLib ( const wxString &  aLibraryPath,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Delete an existing symbol library and returns true if successful, 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 symbols.
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
true if library deleted or false if library did not exist.
Exceptions
IO_ERRORif there is a problem deleting an existing library.

Reimplemented from SCH_PLUGIN.

Definition at line 4236 of file sch_legacy_plugin.cpp.

References Format(), and THROW_IO_ERROR.

4238 {
4239  wxFileName fn = aLibraryPath;
4240 
4241  if( !fn.FileExists() )
4242  return false;
4243 
4244  // Some of the more elaborate wxRemoveFile() crap puts up its own wxLog dialog
4245  // we don't want that. we want bare metal portability with no UI here.
4246  if( wxRemove( aLibraryPath ) )
4247  {
4248  THROW_IO_ERROR( wxString::Format( _( "library \"%s\" cannot be deleted" ),
4249  aLibraryPath.GetData() ) );
4250  }
4251 
4252  if( m_cache && m_cache->IsFile( aLibraryPath ) )
4253  {
4254  delete m_cache;
4255  m_cache = 0;
4256  }
4257 
4258  return true;
4259 }
SCH_LEGACY_PLUGIN_CACHE * m_cache
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 IsFile(const wxString &aFullPathAndFileName) const
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
void SCH_LEGACY_PLUGIN::EnumerateSymbolLib ( wxArrayString &  aAliasNameList,
const wxString &  aLibraryPath,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Populate a list of LIB_PART alias names contained within the library aLibraryPath.

Parameters
aAliasNameListis an array to populate with the LIB_ALIAS names associated with the library.
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing one or more LIB_PART objects.
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 the library cannot be found, the part library cannot be loaded.

Reimplemented from SCH_PLUGIN.

Definition at line 4110 of file sch_legacy_plugin.cpp.

References SYMBOL_LIB_TABLE::PropPowerSymsOnly.

4113 {
4114  LOCALE_IO toggle; // toggles on, then off, the C locale.
4115 
4116  m_props = aProperties;
4117 
4118  bool powerSymbolsOnly = ( aProperties &&
4119  aProperties->find( SYMBOL_LIB_TABLE::PropPowerSymsOnly ) != aProperties->end() );
4120  cacheLib( aLibraryPath );
4121 
4122  const LIB_ALIAS_MAP& aliases = m_cache->m_aliases;
4123 
4124  for( LIB_ALIAS_MAP::const_iterator it = aliases.begin(); it != aliases.end(); ++it )
4125  {
4126  if( !powerSymbolsOnly || it->second->GetPart()->IsPower() )
4127  aAliasNameList.Add( it->first );
4128  }
4129 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
SCH_LEGACY_PLUGIN_CACHE * m_cache
std::map< wxString, LIB_ALIAS *, AliasMapSort > LIB_ALIAS_MAP
Alias map used by part library object.
void cacheLib(const wxString &aLibraryFileName)
static const char * PropPowerSymsOnly
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
void SCH_LEGACY_PLUGIN::EnumerateSymbolLib ( std::vector< LIB_ALIAS * > &  aAliasList,
const wxString &  aLibraryPath,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Populate a list of LIB_PART aliases contained within the library aLibraryPath.

Parameters
aAliasListis an array to populate with the LIB_ALIAS pointers associated with the library.
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing one or more LIB_PART objects.
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 the library cannot be found, the part library cannot be loaded.

Reimplemented from SCH_PLUGIN.

Definition at line 4132 of file sch_legacy_plugin.cpp.

References SYMBOL_LIB_TABLE::PropPowerSymsOnly.

4135 {
4136  LOCALE_IO toggle; // toggles on, then off, the C locale.
4137 
4138  m_props = aProperties;
4139 
4140  bool powerSymbolsOnly = ( aProperties &&
4141  aProperties->find( SYMBOL_LIB_TABLE::PropPowerSymsOnly ) != aProperties->end() );
4142  cacheLib( aLibraryPath );
4143 
4144  const LIB_ALIAS_MAP& aliases = m_cache->m_aliases;
4145 
4146  for( LIB_ALIAS_MAP::const_iterator it = aliases.begin(); it != aliases.end(); ++it )
4147  {
4148  if( !powerSymbolsOnly || it->second->GetPart()->IsPower() )
4149  aAliasList.push_back( it->second );
4150  }
4151 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
SCH_LEGACY_PLUGIN_CACHE * m_cache
std::map< wxString, LIB_ALIAS *, AliasMapSort > LIB_ALIAS_MAP
Alias map used by part library object.
void cacheLib(const wxString &aLibraryFileName)
static const char * PropPowerSymsOnly
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
void SCH_LEGACY_PLUGIN::Format ( SCH_SCREEN aScreen)

Definition at line 1711 of file sch_legacy_plugin.cpp.

References EESCHEMA_VERSION, EscapedUTF8(), TITLE_BLOCK::GetComment1(), TITLE_BLOCK::GetComment2(), TITLE_BLOCK::GetComment3(), TITLE_BLOCK::GetComment4(), TITLE_BLOCK::GetCompany(), TITLE_BLOCK::GetDate(), SCH_SCREEN::GetDrawItems(), PAGE_INFO::GetHeightMils(), SCH_SCREEN::GetPageSettings(), TITLE_BLOCK::GetRevision(), TITLE_BLOCK::GetTitle(), SCH_SCREEN::GetTitleBlock(), PAGE_INFO::GetType(), PAGE_INFO::GetWidthMils(), PAGE_INFO::IsCustom(), PAGE_INFO::IsPortrait(), BASE_SCREEN::m_NumberOfScreens, BASE_SCREEN::m_ScreenNumber, SCH_ITEM::Next(), SCH_LEGACY_PLUGIN_CACHE::saveText(), SCH_BITMAP_T, SCH_BUS_BUS_ENTRY_T, SCH_BUS_WIRE_ENTRY_T, SCH_COMPONENT_T, SCH_GLOBAL_LABEL_T, SCH_HIERARCHICAL_LABEL_T, SCH_JUNCTION_T, SCH_LABEL_T, SCH_LAYER_ID_COUNT, SCH_LINE_T, SCH_NO_CONNECT_T, SCH_SHEET_T, SCH_TEXT_T, SCHEMATIC_HEAD_STRING, and TO_UTF8.

1712 {
1713  wxCHECK_RET( aScreen != NULL, "NULL SCH_SCREEN* object." );
1714  wxCHECK_RET( m_kiway != NULL, "NULL KIWAY* object." );
1715 
1716  // Write the header
1717  m_out->Print( 0, "%s %s %d\n", "EESchema", SCHEMATIC_HEAD_STRING, EESCHEMA_VERSION );
1718 
1719  // Write the project libraries.
1720  for( const PART_LIB& lib : *m_kiway->Prj().SchLibs() )
1721  m_out->Print( 0, "LIBS:%s\n", TO_UTF8( lib.GetName() ) );
1722 
1723  // This section is not used, but written for file compatibility
1724  m_out->Print( 0, "EELAYER %d %d\n", SCH_LAYER_ID_COUNT, 0 );
1725  m_out->Print( 0, "EELAYER END\n" );
1726 
1727  /* Write page info, ScreenNumber and NumberOfScreen; not very meaningful for
1728  * SheetNumber and Sheet Count in a complex hierarchy, but useful in
1729  * simple hierarchy and flat hierarchy. Used also to search the root
1730  * sheet ( ScreenNumber = 1 ) within the files
1731  */
1732  const TITLE_BLOCK& tb = aScreen->GetTitleBlock();
1733  const PAGE_INFO& page = aScreen->GetPageSettings();
1734 
1735  m_out->Print( 0, "$Descr %s %d %d%s\n", TO_UTF8( page.GetType() ),
1736  page.GetWidthMils(),
1737  page.GetHeightMils(),
1738  !page.IsCustom() && page.IsPortrait() ? " portrait" : "" );
1739  m_out->Print( 0, "encoding utf-8\n" );
1740  m_out->Print( 0, "Sheet %d %d\n", aScreen->m_ScreenNumber, aScreen->m_NumberOfScreens );
1741  m_out->Print( 0, "Title %s\n", EscapedUTF8( tb.GetTitle() ).c_str() );
1742  m_out->Print( 0, "Date %s\n", EscapedUTF8( tb.GetDate() ).c_str() );
1743  m_out->Print( 0, "Rev %s\n", EscapedUTF8( tb.GetRevision() ).c_str() );
1744  m_out->Print( 0, "Comp %s\n", EscapedUTF8( tb.GetCompany() ).c_str() );
1745  m_out->Print( 0, "Comment1 %s\n", EscapedUTF8( tb.GetComment1() ).c_str() );
1746  m_out->Print( 0, "Comment2 %s\n", EscapedUTF8( tb.GetComment2() ).c_str() );
1747  m_out->Print( 0, "Comment3 %s\n", EscapedUTF8( tb.GetComment3() ).c_str() );
1748  m_out->Print( 0, "Comment4 %s\n", EscapedUTF8( tb.GetComment4() ).c_str() );
1749  m_out->Print( 0, "$EndDescr\n" );
1750 
1751  for( SCH_ITEM* item = aScreen->GetDrawItems(); item; item = item->Next() )
1752  {
1753  switch( item->Type() )
1754  {
1755  case SCH_COMPONENT_T:
1756  saveComponent( static_cast< SCH_COMPONENT* >( item ) );
1757  break;
1758  case SCH_BITMAP_T:
1759  saveBitmap( static_cast< SCH_BITMAP* >( item ) );
1760  break;
1761  case SCH_SHEET_T:
1762  saveSheet( static_cast< SCH_SHEET* >( item ) );
1763  break;
1764  case SCH_JUNCTION_T:
1765  saveJunction( static_cast< SCH_JUNCTION* >( item ) );
1766  break;
1767  case SCH_NO_CONNECT_T:
1768  saveNoConnect( static_cast< SCH_NO_CONNECT* >( item ) );
1769  break;
1770  case SCH_BUS_WIRE_ENTRY_T:
1771  case SCH_BUS_BUS_ENTRY_T:
1772  saveBusEntry( static_cast< SCH_BUS_ENTRY_BASE* >( item ) );
1773  break;
1774  case SCH_LINE_T:
1775  saveLine( static_cast< SCH_LINE* >( item ) );
1776  break;
1777  case SCH_TEXT_T:
1778  case SCH_LABEL_T:
1779  case SCH_GLOBAL_LABEL_T:
1781  saveText( static_cast< SCH_TEXT* >( item ) );
1782  break;
1783  default:
1784  wxASSERT( "Unexpected schematic object type in SCH_LEGACY_PLUGIN::Format()" );
1785  }
1786  }
1787 
1788  m_out->Print( 0, "$EndSCHEMATC\n" );
1789 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
int m_ScreenNumber
Definition: base_screen.h:216
const wxString & GetCompany() const
Definition: title_block.h:98
void saveLine(SCH_LINE *aLine)
void saveText(SCH_TEXT *aText)
const wxString & GetComment4() const
Definition: title_block.h:123
const wxString & GetDate() const
Definition: title_block.h:78
#define SCH_LAYER_ID_COUNT
void saveNoConnect(SCH_NO_CONNECT *aNoConnect)
Class TITLE_BLOCK holds the information shown in the lower right corner of a plot, printout, or editing view.
Definition: title_block.h:39
SCH_ITEM * Next() const
void saveSheet(SCH_SHEET *aSheet)
void saveJunction(SCH_JUNCTION *aJunction)
#define SCHEMATIC_HEAD_STRING
Definition: general.h:41
#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
const wxString & GetTitle() const
Definition: title_block.h:64
std::string EscapedUTF8(const wxString &aString)
Function EscapedUTF8 returns an 8 bit UTF8 string given aString in unicode form.
Definition: string.cpp:137
#define EESCHEMA_VERSION
Definition: general.h:40
bool IsPortrait() const
Definition: page_info.h:116
const wxString & GetRevision() const
Definition: title_block.h:88
Class PAGE_INFO describes the page size and margins of a paper page on which to eventually print or p...
Definition: page_info.h:49
VTBL_ENTRY PROJECT & Prj() const
Function Prj returns the PROJECT associated with this KIWAY.
Definition: kiway.cpp:142
void saveBitmap(SCH_BITMAP *aBitmap)
const wxString & GetComment3() const
Definition: title_block.h:122
int GetWidthMils() const
Definition: page_info.h:132
void saveComponent(SCH_COMPONENT *aComponent)
const TITLE_BLOCK & GetTitleBlock() const
Definition: sch_screen.h:125
const wxString & GetComment2() const
Definition: title_block.h:121
SCH_ITEM * GetDrawItems() const
Definition: sch_screen.h:138
bool IsCustom() const
Function IsCustom returns true if the type is Custom.
Definition: page_info.cpp:176
const wxString & GetComment1() const
Definition: title_block.h:120
int m_NumberOfScreens
Definition: base_screen.h:217
const PAGE_INFO & GetPageSettings() const
Definition: sch_screen.h:115
const wxString & GetType() const
Definition: page_info.h:92
KIWAY * m_kiway
Required for path to legacy component libraries.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
Object used to load, save, search, and otherwise manipulate symbol library files. ...
Class SCH_ITEM is a base class for any item which can be embedded within the SCHEMATIC container clas...
void saveBusEntry(SCH_BUS_ENTRY_BASE *aBusEntry)
int GetHeightMils() const
Definition: page_info.h:135
const wxString& SCH_LEGACY_PLUGIN::GetError ( ) const
inlineoverridevirtual

Return an error string to the caller.

This is useful for schematic loaders that can load partial schematics where throwing an exception would be problematic such as the KiCad legacy plugin.

Returns
an unformatted string containing errors if any.

Reimplemented from SCH_PLUGIN.

Definition at line 128 of file sch_legacy_plugin.h.

References cacheLib(), isBuffering(), loadBitmap(), loadBusEntry(), loadComponent(), loadFile(), loadHeader(), loadHierarchy(), loadJunction(), loadNoConnect(), loadPageSettings(), loadSheet(), loadText(), loadWire(), m_error, saveBitmap(), saveBusEntry(), saveComponent(), saveField(), saveJunction(), saveLine(), saveNoConnect(), saveSheet(), saveText(), and writeDocFile().

128 { return m_error; }
wxString m_error
For throwing exceptions or errors on partial schematic loads.
const wxString SCH_LEGACY_PLUGIN::GetFileExtension ( ) const
inlineoverridevirtual

Returns the file extension for the SCH_PLUGIN.

Implements SCH_PLUGIN.

Definition at line 71 of file sch_legacy_plugin.h.

72  {
73  return wxT( "sch" );
74  }
int SCH_LEGACY_PLUGIN::GetModifyHash ( ) const
overridevirtual

Return the modification hash from the library cache.

Note
This is temporary until the new s-expr file format is implement. The new file format will embed symbols instead of referencing them from the library. This function can be removed when the new file format is implemented.
Returns
the modification hash of the library cache.

Implements SCH_PLUGIN.

Definition at line 4087 of file sch_legacy_plugin.cpp.

4088 {
4089  if( m_cache )
4090  return m_cache->GetModifyHash();
4091 
4092  // If the cache hasn't been loaded, it hasn't been modified.
4093  return 0;
4094 }
SCH_LEGACY_PLUGIN_CACHE * m_cache
const wxString SCH_LEGACY_PLUGIN::GetName ( ) const
inlineoverridevirtual

Returns a brief hard coded name for this SCH_PLUGIN.

Implements SCH_PLUGIN.

Definition at line 66 of file sch_legacy_plugin.h.

67  {
68  return wxT( "Eeschema-Legacy" );
69  }
size_t SCH_LEGACY_PLUGIN::GetSymbolLibCount ( const wxString &  aLibraryPath,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Reimplemented from SCH_PLUGIN.

Definition at line 4097 of file sch_legacy_plugin.cpp.

4099 {
4100  LOCALE_IO toggle;
4101 
4102  m_props = aProperties;
4103 
4104  cacheLib( aLibraryPath );
4105 
4106  return m_cache->m_aliases.size();
4107 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
SCH_LEGACY_PLUGIN_CACHE * m_cache
void cacheLib(const wxString &aLibraryFileName)
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
void SCH_LEGACY_PLUGIN::init ( KIWAY aKiway,
const PROPERTIES aProperties = NULL 
)
protected

initialize PLUGIN like a constructor would.

Definition at line 569 of file sch_legacy_plugin.cpp.

570 {
571  m_version = 0;
572  m_rootSheet = NULL;
573  m_props = aProperties;
574  m_kiway = aKiway;
575  m_cache = NULL;
576  m_out = NULL;
577 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
SCH_LEGACY_PLUGIN_CACHE * m_cache
SCH_SHEET * m_rootSheet
The root sheet of the schematic being loaded..
int m_version
Version of file being loaded.
KIWAY * m_kiway
Required for path to legacy component libraries.
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
bool SCH_LEGACY_PLUGIN::isBuffering ( const PROPERTIES aProperties)
private

Definition at line 4081 of file sch_legacy_plugin.cpp.

References PROPERTIES::Exists(), and PropBuffering.

Referenced by GetError().

4082 {
4083  return ( aProperties && aProperties->Exists( SCH_LEGACY_PLUGIN::PropBuffering ) );
4084 }
bool Exists(const std::string &aProperty) const
Definition: properties.h:44
static const char * PropBuffering
const char* PropBuffering
bool SCH_LEGACY_PLUGIN::IsSymbolLibWritable ( const wxString &  aLibraryPath)
overridevirtual

Return true if 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 symbols.
Exceptions
IO_ERRORif no library at aLibraryPath exists.

Reimplemented from SCH_PLUGIN.

Definition at line 4296 of file sch_legacy_plugin.cpp.

References PropBuffering, and PropNoDocFile.

4297 {
4298  return wxFileName::IsFileWritable( aLibraryPath );
4299 }
SCH_SHEET * SCH_LEGACY_PLUGIN::Load ( const wxString &  aFileName,
KIWAY aKiway,
SCH_SHEET aAppendToMe = NULL,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Load information from some input file format that this SCH_PLUGIN implementation knows about, into either a new SCH_SHEET or an existing one.

This may be used to load an entire new SCH_SHEET, 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.
aKiwayis the KIWAY object used to access the component libraries loaded by the project.
aAppendToMeis an existing SCH_SHEET 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
the successfully loaded schematic, or the same one as aAppendToMe if aAppendToMe was not NULL, and the 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 SCH_PLUGIN.

Definition at line 580 of file sch_legacy_plugin.cpp.

References SCH_SHEET::GetFileName(), PROJECT::GetProjectPath(), SCH_SHEET::GetRootSheet(), KIWAY::Prj(), and traceSchLegacyPlugin.

582 {
583  wxASSERT( !aFileName || aKiway != NULL );
584 
585  LOCALE_IO toggle; // toggles on, then off, the C locale.
586  SCH_SHEET* sheet;
587 
588  wxFileName fn = aFileName;
589 
590  // Unfortunately child sheet file names the legacy schematic file format are not fully
591  // qualified and are always appended to the project path. The aFileName attribute must
592  // always be an absolute path so the project path can be used for load child sheet files.
593  wxASSERT( fn.IsAbsolute() );
594 
595  if( aAppendToMe )
596  {
597  wxLogTrace( traceSchLegacyPlugin, "Append \"%s\" to sheet \"%s\".",
598  aFileName, aAppendToMe->GetFileName() );
599 
600  wxFileName normedFn = aAppendToMe->GetFileName();
601 
602  if( !normedFn.IsAbsolute() )
603  {
604  if( aFileName.Right( normedFn.GetFullPath().Length() ) == normedFn.GetFullPath() )
605  m_path = aFileName.Left( aFileName.Length() - normedFn.GetFullPath().Length() );
606  }
607 
608  wxLogTrace( traceSchLegacyPlugin, "Normalized append path \"%s\".", m_path );
609  }
610  else
611  {
612  m_path = aKiway->Prj().GetProjectPath();
613  }
614 
615  init( aKiway, aProperties );
616 
617  if( aAppendToMe == NULL )
618  {
619  // Clean up any allocated memory if an exception occurs loading the schematic.
620  std::unique_ptr< SCH_SHEET > newSheet( new SCH_SHEET );
621  newSheet->SetFileName( aFileName );
622  m_rootSheet = newSheet.get();
623  loadHierarchy( newSheet.get() );
624 
625  // If we got here, the schematic loaded successfully.
626  sheet = newSheet.release();
627  }
628  else
629  {
630  m_rootSheet = aAppendToMe->GetRootSheet();
631  wxASSERT( m_rootSheet != NULL );
632  sheet = aAppendToMe;
633  loadHierarchy( sheet );
634  }
635 
636  return sheet;
637 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
const wxChar *const traceSchLegacyPlugin
Flag to enable legacy schematic plugin debug output.
SCH_SHEET * m_rootSheet
The root sheet of the schematic being loaded..
SCH_SHEET * GetRootSheet()
Return the root sheet of this SCH_SHEET object.
Definition: sch_sheet.cpp:136
wxString m_path
Root project path for loading child sheets.
void loadHierarchy(SCH_SHEET *aSheet)
VTBL_ENTRY PROJECT & Prj() const
Function Prj returns the PROJECT associated with this KIWAY.
Definition: kiway.cpp:142
void init(KIWAY *aKiway, const PROPERTIES *aProperties=NULL)
initialize PLUGIN like a constructor would.
wxString GetFileName(void) const
Return the filename corresponding to this sheet.
Definition: sch_sheet.cpp:646
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:209
VTBL_ENTRY const wxString GetProjectPath() const
Function GetProjectPath returns the full path of the project.
Definition: project.cpp:100
SCH_BITMAP * SCH_LEGACY_PLUGIN::loadBitmap ( FILE_LINE_READER aReader)
private
Todo:
Make m_scale private and add accessors.

Definition at line 1056 of file sch_legacy_plugin.cpp.

References LINE_READER::Line(), parseDouble(), parseInt(), FILE_LINE_READER::ReadLine(), SCH_PARSE_ERROR, strCompare(), THROW_IO_ERROR, wxPoint::x, and wxPoint::y.

Referenced by GetError().

1057 {
1058  std::unique_ptr< SCH_BITMAP > bitmap( new SCH_BITMAP );
1059 
1060  const char* line = aReader.Line();
1061 
1062  wxCHECK( strCompare( "$Bitmap", line, &line ), NULL );
1063 
1064  line = aReader.ReadLine();
1065 
1066  while( line != NULL )
1067  {
1068  if( strCompare( "Pos", line, &line ) )
1069  {
1070  wxPoint position;
1071 
1072  position.x = parseInt( aReader, line, &line );
1073  position.y = parseInt( aReader, line, &line );
1074  bitmap->SetPosition( position );
1075  }
1076  else if( strCompare( "Scale", line, &line ) )
1077  {
1079  bitmap->GetImage()->SetScale( parseDouble( aReader, line, &line ) );
1080  }
1081  else if( strCompare( "Data", line, &line ) )
1082  {
1083  wxMemoryOutputStream stream;
1084 
1085  while( line )
1086  {
1087  if( !aReader.ReadLine() )
1088  SCH_PARSE_ERROR( _( "Unexpected end of file" ), aReader, line );
1089 
1090  line = aReader.Line();
1091 
1092  if( strCompare( "EndData", line ) )
1093  {
1094  // all the PNG date is read.
1095  // We expect here m_image and m_bitmap are void
1096  wxImage* image = new wxImage();
1097  wxMemoryInputStream istream( stream );
1098  image->LoadFile( istream, wxBITMAP_TYPE_PNG );
1099  bitmap->GetImage()->SetImage( image );
1100  bitmap->GetImage()->SetBitmap( new wxBitmap( *image ) );
1101  break;
1102  }
1103 
1104  // Read PNG data, stored in hexadecimal,
1105  // each byte = 2 hexadecimal digits and a space between 2 bytes
1106  // and put it in memory stream buffer
1107  int len = strlen( line );
1108 
1109  for( ; len > 0 && !isspace( *line ); len -= 3, line += 3 )
1110  {
1111  int value = 0;
1112 
1113  if( sscanf( line, "%X", &value ) == 1 )
1114  stream.PutC( (char) value );
1115  else
1116  THROW_IO_ERROR( "invalid PNG data" );
1117  }
1118  }
1119 
1120  if( line == NULL )
1121  THROW_IO_ERROR( _( "unexpected end of file" ) );
1122  }
1123  else if( strCompare( "$EndBitmap", line ) )
1124  return bitmap.release();
1125 
1126  line = aReader.ReadLine();
1127  }
1128 
1129  THROW_IO_ERROR( _( "unexpected end of file" ) );
1130 }
char * ReadLine() override
Function ReadLine reads a line of text into the buffer and increments the line number counter...
Definition: richio.cpp:194
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Parse an ASCII integer string with possible leading whitespace into an integer and updates the pointe...
static double parseDouble(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Parses an ASCII point string with possible leading whitespace into a double precision floating point ...
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
Object to handle a bitmap image that can be inserted in a schematic.
Definition: sch_bitmap.h:42
#define SCH_PARSE_ERROR(text, reader, pos)
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Compare aString to the string starting at aLine and advances the character point to the end of String...
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
SCH_BUS_ENTRY_BASE * SCH_LEGACY_PLUGIN::loadBusEntry ( FILE_LINE_READER aReader)
private

Definition at line 1269 of file sch_legacy_plugin.cpp.

References LINE_READER::Line(), parseInt(), FILE_LINE_READER::ReadLine(), SCH_PARSE_ERROR, strCompare(), wxPoint::x, and wxPoint::y.

Referenced by GetError().

1270 {
1271  const char* line = aReader.Line();
1272 
1273  wxCHECK( strCompare( "Entry", line, &line ), NULL );
1274 
1275  std::unique_ptr< SCH_BUS_ENTRY_BASE > busEntry;
1276 
1277  if( strCompare( "Wire", line, &line ) )
1278  {
1279  busEntry.reset( new SCH_BUS_WIRE_ENTRY );
1280 
1281  if( !strCompare( "Line", line, &line ) )
1282  SCH_PARSE_ERROR( "invalid bus entry definition expected 'Line'", aReader, line );
1283  }
1284  else if( strCompare( "Bus", line, &line ) )
1285  {
1286  busEntry.reset( new SCH_BUS_BUS_ENTRY );
1287 
1288  if( !strCompare( "Bus", line, &line ) )
1289  SCH_PARSE_ERROR( "invalid bus entry definition expected 'Bus'", aReader, line );
1290  }
1291  else
1292  SCH_PARSE_ERROR( "invalid bus entry type", aReader, line );
1293 
1294  line = aReader.ReadLine();
1295 
1296  wxPoint pos;
1297  wxSize size;
1298 
1299  pos.x = parseInt( aReader, line, &line );
1300  pos.y = parseInt( aReader, line, &line );
1301  size.x = parseInt( aReader, line, &line );
1302  size.y = parseInt( aReader, line, &line );
1303 
1304  size.x -= pos.x;
1305  size.y -= pos.y;
1306 
1307  busEntry->SetPosition( pos );
1308  busEntry->SetSize( size );
1309 
1310  return busEntry.release();
1311 }
Class for a bus to bus entry.
char * ReadLine() override
Function ReadLine reads a line of text into the buffer and increments the line number counter...
Definition: richio.cpp:194
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Parse an ASCII integer string with possible leading whitespace into an integer and updates the pointe...
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
#define SCH_PARSE_ERROR(text, reader, pos)
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Compare aString to the string starting at aLine and advances the character point to the end of String...
Class for a wire to bus entry.
SCH_COMPONENT * SCH_LEGACY_PLUGIN::loadComponent ( FILE_LINE_READER aReader)
private

Definition at line 1410 of file sch_legacy_plugin.cpp.

References TEMPLATE_FIELDNAME::GetDefaultFieldName(), GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_HJUSTIFY_RIGHT, GR_TEXT_VJUSTIFY_BOTTOM, GR_TEXT_VJUSTIFY_TOP, LINE_READER::Line(), MANDATORY_FIELDS, MAX_UNIT_COUNT_PER_PACKAGE, name, LIB_ID::Parse(), parseChar(), parseHex(), parseInt(), parseQuotedString(), parseUnquotedString(), FILE_LINE_READER::ReadLine(), REFERENCE, SCH_PARSE_ERROR, LIB_ID::SetLibItemName(), strCompare(), TEXT_ANGLE_HORIZ, TEXT_ANGLE_VERT, wxPoint::x, TRANSFORM::x1, TRANSFORM::x2, wxPoint::y, TRANSFORM::y1, and TRANSFORM::y2.

Referenced by GetError().

1411 {
1412  const char* line = aReader.Line();
1413 
1414  wxCHECK( strCompare( "$Comp", line, &line ), NULL );
1415 
1416  std::unique_ptr< SCH_COMPONENT > component( new SCH_COMPONENT() );
1417 
1418  line = aReader.ReadLine();
1419 
1420  while( line != NULL )
1421  {
1422  if( strCompare( "L", line, &line ) )
1423  {
1424  wxString libName;
1425 
1426  parseUnquotedString( libName, aReader, line, &line );
1427  libName.Replace( "~", " " );
1428 
1429  LIB_ID libId;
1430 
1431  // Prior to schematic version 4, library IDs did not have a library nickname so
1432  // parsing the symbol name with LIB_ID::Parse() would break symbol library links
1433  // that contained '/' and ':' characters.
1434  if( m_version > 3 )
1435  libId.Parse( libName );
1436  else
1437  libId.SetLibItemName( libName, false );
1438 
1439  component->SetLibId( libId );
1440 
1441  wxString refDesignator;
1442 
1443  parseUnquotedString( refDesignator, aReader, line, &line );
1444  refDesignator.Replace( "~", " " );
1445 
1446  wxString prefix = refDesignator;
1447 
1448  while( prefix.Length() )
1449  {
1450  if( ( prefix.Last() < '0' || prefix.Last() > '9') && prefix.Last() != '?' )
1451  break;
1452 
1453  prefix.RemoveLast();
1454  }
1455 
1456  // Avoid a prefix containing trailing/leading spaces
1457  prefix.Trim( true );
1458  prefix.Trim( false );
1459 
1460  if( prefix.IsEmpty() )
1461  component->SetPrefix( wxString( "U" ) );
1462  else
1463  component->SetPrefix( prefix );
1464  }
1465  else if( strCompare( "U", line, &line ) )
1466  {
1467  // This fixes a potentially buggy files caused by unit being set to zero which
1468  // causes netlist issues. See https://bugs.launchpad.net/kicad/+bug/1677282.
1469  int unit = parseInt( aReader, line, &line );
1470 
1471  if( unit == 0 )
1472  {
1473  unit = 1;
1474 
1475  // Set the file as modified so the user can be warned.
1476  if( m_rootSheet && m_rootSheet->GetScreen() )
1478  }
1479 
1480  component->SetUnit( unit );
1481  component->SetConvert( parseInt( aReader, line, &line ) );
1482  component->SetTimeStamp( parseHex( aReader, line, &line ) );
1483  }
1484  else if( strCompare( "P", line, &line ) )
1485  {
1486  wxPoint pos;
1487 
1488  pos.x = parseInt( aReader, line, &line );
1489  pos.y = parseInt( aReader, line, &line );
1490  component->SetPosition( pos );
1491  }
1492  else if( strCompare( "AR", line, &line ) )
1493  {
1494  const char* strCompare = "Path=";
1495  int len = strlen( strCompare );
1496 
1497  if( strncasecmp( strCompare, line, len ) != 0 )
1498  SCH_PARSE_ERROR( "missing 'Path=' token", aReader, line );
1499 
1500  line += len;
1501  wxString path, reference, unit;
1502 
1503  parseQuotedString( path, aReader, line, &line );
1504 
1505  strCompare = "Ref=";
1506  len = strlen( strCompare );
1507 
1508  if( strncasecmp( strCompare, line, len ) != 0 )
1509  SCH_PARSE_ERROR( "missing 'Ref=' token", aReader, line );
1510 
1511  line+= len;
1512  parseQuotedString( reference, aReader, line, &line );
1513 
1514  strCompare = "Part=";
1515  len = strlen( strCompare );
1516 
1517  if( strncasecmp( strCompare, line, len ) != 0 )
1518  SCH_PARSE_ERROR( "missing 'Part=' token", aReader, line );
1519 
1520  line+= len;
1521  parseQuotedString( unit, aReader, line, &line );
1522 
1523  long tmp;
1524 
1525  if( !unit.ToLong( &tmp, 10 ) )
1526  SCH_PARSE_ERROR( "expected integer value", aReader, line );
1527 
1528  if( tmp < 0 || tmp > MAX_UNIT_COUNT_PER_PACKAGE )
1529  SCH_PARSE_ERROR( "unit value out of range", aReader, line );
1530 
1531  component->AddHierarchicalReference( path, reference, (int)tmp );
1532  component->GetField( REFERENCE )->SetText( reference );
1533 
1534  }
1535  else if( strCompare( "F", line, &line ) )
1536  {
1537  int index = parseInt( aReader, line, &line );
1538 
1539  wxString text, name;
1540 
1541  parseQuotedString( text, aReader, line, &line, true );
1542 
1543  char orientation = parseChar( aReader, line, &line );
1544  wxPoint pos;
1545  pos.x = parseInt( aReader, line, &line );
1546  pos.y = parseInt( aReader, line, &line );
1547  int size = parseInt( aReader, line, &line );
1548  int attributes = parseHex( aReader, line, &line );
1549 
1550  if( index >= component->GetFieldCount() )
1551  {
1552  // The first MANDATOR_FIELDS _must_ be constructed within
1553  // the SCH_COMPONENT constructor. This assert is simply here
1554  // to guard against a change in that constructor.
1555  wxASSERT( component->GetFieldCount() >= MANDATORY_FIELDS );
1556 
1557  // Ignore the _supplied_ fieldNdx. It is not important anymore
1558  // if within the user defined fields region (i.e. >= MANDATORY_FIELDS).
1559  // We freely renumber the index to fit the next available field slot.
1560  index = component->GetFieldCount(); // new has this index after insertion
1561 
1562  SCH_FIELD field( wxPoint( 0, 0 ), -1, component.get(), name );
1563  component->AddField( field );
1564  }
1565 
1566  // Prior to version 2 of the schematic file format, none of the following existed.
1567  if( m_version > 1 )
1568  {
1569  wxString textAttrs;
1570  char hjustify = parseChar( aReader, line, &line );
1571 
1572  parseUnquotedString( textAttrs, aReader, line, &line );
1573 
1574  // The name of the field is optional.
1575  parseQuotedString( name, aReader, line, &line, true );
1576 
1577  if( hjustify == 'L' )
1578  component->GetField( index )->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT );
1579  else if( hjustify == 'R' )
1580  component->GetField( index )->SetHorizJustify( GR_TEXT_HJUSTIFY_RIGHT );
1581  else if( hjustify != 'C' )
1582  SCH_PARSE_ERROR( "component field text horizontal justification must be "
1583  "L, R, or C", aReader, line );
1584 
1585  // We are guaranteed to have a least one character here for older file formats
1586  // otherwise an exception would have been raised..
1587  if( textAttrs[0] == 'T' )
1588  component->GetField( index )->SetVertJustify( GR_TEXT_VJUSTIFY_TOP );
1589  else if( textAttrs[0] == 'B' )
1590  component->GetField( index )->SetVertJustify( GR_TEXT_VJUSTIFY_BOTTOM );
1591  else if( textAttrs[0] != 'C' )
1592  SCH_PARSE_ERROR( "component field text vertical justification must be "
1593  "B, T, or C", aReader, line );
1594 
1595  // Newer file formats include the bold and italics text attribute.
1596  if( textAttrs.Length() > 1 )
1597  {
1598  if( textAttrs.Length() != 3 )
1599  SCH_PARSE_ERROR( _( "component field text attributes must be 3 characters wide" ),
1600  aReader, line );
1601 
1602  if( textAttrs[1] == 'I' )
1603  component->GetField( index )->SetItalic( true );
1604  else if( textAttrs[1] != 'N' )
1605  SCH_PARSE_ERROR( "component field text italics indicator must be I or N",
1606  aReader, line );
1607 
1608  if( textAttrs[2] == 'B' )
1609  component->GetField( index )->SetBold( true );
1610  else if( textAttrs[2] != 'N' )
1611  SCH_PARSE_ERROR( "component field text bold indicator must be B or N",
1612  aReader, line );
1613  }
1614  }
1615 
1616  component->GetField( index )->SetText( text );
1617  component->GetField( index )->SetTextPos( pos );
1618  component->GetField( index )->SetVisible( !attributes );
1619  component->GetField( index )->SetTextSize( wxSize( size, size ) );
1620 
1621  if( orientation == 'H' )
1622  component->GetField( index )->SetTextAngle( TEXT_ANGLE_HORIZ );
1623  else if( orientation == 'V' )
1624  component->GetField( index )->SetTextAngle( TEXT_ANGLE_VERT );
1625  else
1626  SCH_PARSE_ERROR( "component field orientation must be H or V",
1627  aReader, line );
1628 
1629  if( name.IsEmpty() )
1631 
1632  component->GetField( index )->SetName( name );
1633  }
1634  else if( strCompare( "$EndComp", line ) )
1635  {
1636  // Ensure all flags (some are set by previous initializations) are reset:
1637  component->ClearFlags();
1638  return component.release();
1639  }
1640  else
1641  {
1642  // There are two lines that begin with a tab or spaces that includes a line with the
1643  // redundant position information and the transform matrix settings.
1644 
1645  // Parse the redundant position information just the same to check for formatting
1646  // errors.
1647  parseInt( aReader, line, &line ); // Always 1.
1648  parseInt( aReader, line, &line ); // The X coordinate.
1649  parseInt( aReader, line, &line ); // The Y coordinate.
1650 
1651  line = aReader.ReadLine();
1652 
1653  TRANSFORM transform;
1654 
1655  transform.x1 = parseInt( aReader, line, &line );
1656 
1657  if( transform.x1 < -1 || transform.x1 > 1 )
1658  SCH_PARSE_ERROR( "invalid component X1 transform value", aReader, line );
1659 
1660  transform.y1 = parseInt( aReader, line, &line );
1661 
1662  if( transform.y1 < -1 || transform.y1 > 1 )
1663  SCH_PARSE_ERROR( "invalid component Y1 transform value", aReader, line );
1664 
1665  transform.x2 = parseInt( aReader, line, &line );
1666 
1667  if( transform.x2 < -1 || transform.x2 > 1 )
1668  SCH_PARSE_ERROR( "invalid component X2 transform value", aReader, line );
1669 
1670  transform.y2 = parseInt( aReader, line, &line );
1671 
1672  if( transform.y2 < -1 || transform.y2 > 1 )
1673  SCH_PARSE_ERROR( "invalid component Y2 transform value", aReader, line );
1674 
1675  component->SetTransform( transform );
1676  }
1677 
1678  line = aReader.ReadLine();
1679  }
1680 
1681  SCH_PARSE_ERROR( "invalid component line", aReader, line );
1682 
1683  return NULL; // Prevents compiler warning. Should never get here.
1684 }
#define TEXT_ANGLE_HORIZ
Frequent text rotations, used with {Set,Get}TextAngle(), in 0.1 degrees for now, hoping to migrate to...
Definition: common.h:91
Class SCH_FIELD instances are attached to a component and provide a place for the component&#39;s value...
Definition: sch_field.h:56
char * ReadLine() override
Function ReadLine reads a line of text into the buffer and increments the line number counter...
Definition: richio.cpp:194
int y2
Definition: transform.h:51
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Parse an ASCII integer string with possible leading whitespace into an integer and updates the pointe...
static char parseChar(FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL)
Parse a single ASCII character and updates the pointer at aOutput if it is not NULL.
The first 4 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors...
int x2
Definition: transform.h:50
SCH_SHEET * m_rootSheet
The root sheet of the schematic being loaded..
int x1
Definition: transform.h:48
static const wxString GetDefaultFieldName(int aFieldNdx)
Function GetDefaultFieldName returns a default symbol field name for field aFieldNdx for all componen...
int Parse(const UTF8 &aId)
Parse LIB_ID with the information from aId.
Definition: lib_id.cpp:122
#define MAX_UNIT_COUNT_PER_PACKAGE
The maximum number of units per package.
Definition: eeschema_id.h:48
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:51
SCH_SCREEN * GetScreen()
Definition: sch_sheet.h:279
#define TEXT_ANGLE_VERT
Definition: common.h:92
Field Reference of part, i.e. "IC21".
int m_version
Version of file being loaded.
int y1
Definition: transform.h:49
Class for tranforming drawing coordinates for a wxDC device context.
Definition: transform.h:45
static void parseUnquotedString(wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
Parse an unquoted utf8 string and updates the pointer at aOutput if it is not NULL.
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
static unsigned long parseHex(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Parse an ASCII hex integer string with possible leading whitespace into a long integer and updates th...
int SetLibItemName(const UTF8 &aLibItemName, bool aTestForRev=true)
Override the library item name portion of the LIB_ID to aLibItemName.
Definition: lib_id.cpp:232
#define SCH_PARSE_ERROR(text, reader, pos)
const char * name
Definition: DXF_plotter.cpp:61
static void parseQuotedString(wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
Parse an quoted ASCII utf8 and updates the pointer at aOutput if it is not NULL.
Class SCH_COMPONENT describes a real schematic component.
Definition: sch_component.h:69
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Compare aString to the string starting at aLine and advances the character point to the end of String...
void SetModify()
Definition: base_screen.h:324
void SCH_LEGACY_PLUGIN::loadFile ( const wxString &  aFileName,
SCH_SCREEN aScreen 
)
private

Definition at line 733 of file sch_legacy_plugin.cpp.

References SCH_SCREEN::Append(), LINE_READER::Line(), SCH_LEGACY_PLUGIN_CACHE::loadHeader(), SCH_LEGACY_PLUGIN_CACHE::loadText(), FILE_LINE_READER::ReadLine(), strCompare(), and THROW_IO_ERROR.

Referenced by GetError().

734 {
735  FILE_LINE_READER reader( aFileName );
736 
737  loadHeader( reader, aScreen );
738 
739  while( reader.ReadLine() )
740  {
741  char* line = reader.Line();
742 
743  while( *line && *line == ' ' )
744  line++;
745 
746  // Either an object will be loaded properly or the file load will fail and raise
747  // an exception.
748  if( strCompare( "$Descr", line ) )
749  loadPageSettings( reader, aScreen );
750  else if( strCompare( "$Comp", line ) )
751  aScreen->Append( loadComponent( reader ) );
752  else if( strCompare( "$Sheet", line ) )
753  aScreen->Append( loadSheet( reader ) );
754  else if( strCompare( "$Bitmap", line ) )
755  aScreen->Append( loadBitmap( reader ) );
756  else if( strCompare( "Connection", line ) )
757  aScreen->Append( loadJunction( reader ) );
758  else if( strCompare( "NoConn", line ) )
759  aScreen->Append( loadNoConnect( reader ) );
760  else if( strCompare( "Wire", line ) )
761  aScreen->Append( loadWire( reader ) );
762  else if( strCompare( "Entry", line ) )
763  aScreen->Append( loadBusEntry( reader ) );
764  else if( strCompare( "Text", line ) )
765  aScreen->Append( loadText( reader ) );
766  else if( strCompare( "$EndSCHEMATC", line ) )
767  return;
768  }
769 
770  // Unfortunately schematic files prior to version 2 are not terminated with $EndSCHEMATC
771  // so checking for it's existance will fail so just exit here and take our chances. :(
772  if( m_version > 1 )
773  THROW_IO_ERROR( "'$EndSCHEMATC' not found" );
774 }
SCH_BITMAP * loadBitmap(FILE_LINE_READER &aReader)
void loadPageSettings(FILE_LINE_READER &aReader, SCH_SCREEN *aScreen)
int m_version
Version of file being loaded.
SCH_SHEET * loadSheet(FILE_LINE_READER &aReader)
Class FILE_LINE_READER is a LINE_READER that reads from an open file.
Definition: richio.h:180
SCH_TEXT * loadText(FILE_LINE_READER &aReader)
SCH_JUNCTION * loadJunction(FILE_LINE_READER &aReader)
void Append(SCH_ITEM *aItem)
Definition: sch_screen.h:140
void loadHeader(FILE_LINE_READER &aReader, SCH_SCREEN *aScreen)
SCH_BUS_ENTRY_BASE * loadBusEntry(FILE_LINE_READER &aReader)
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Compare aString to the string starting at aLine and advances the character point to the end of String...
SCH_COMPONENT * loadComponent(FILE_LINE_READER &aReader)
SCH_LINE * loadWire(FILE_LINE_READER &aReader)
SCH_NO_CONNECT * loadNoConnect(FILE_LINE_READER &aReader)
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
void SCH_LEGACY_PLUGIN::loadHeader ( FILE_LINE_READER aReader,
SCH_SCREEN aScreen 
)
private

Definition at line 777 of file sch_legacy_plugin.cpp.

References GetChars(), SCH_SCREEN::GetFileName(), LINE_READER::Line(), parseInt(), FILE_LINE_READER::ReadLine(), strCompare(), and THROW_IO_ERROR.

Referenced by GetError().

778 {
779  const char* line = aReader.ReadLine();
780 
781  if( !line || !strCompare( "Eeschema Schematic File Version", line, &line ) )
782  {
783  m_error.Printf( _( "\"%s\" does not appear to be an Eeschema file" ),
784  GetChars( aScreen->GetFileName() ) );
786  }
787 
788  // get the file version here.
789  m_version = parseInt( aReader, line, &line );
790 
791  // The next lines are the lib list section, and are mainly comments, like:
792  // LIBS:power
793  // the lib list is not used, but is in schematic file just in case.
794  // It is usually not empty, but we accept empty list.
795  // If empty, there is a legacy section, not used
796  // EELAYER i j
797  // and the last line is
798  // EELAYER END
799  // Skip all lines until the end of header "EELAYER END" is found
800  while( aReader.ReadLine() )
801  {
802  line = aReader.Line();
803 
804  while( *line == ' ' )
805  line++;
806 
807  if( strCompare( "EELAYER END", line ) )
808  return;
809  }
810 
811  THROW_IO_ERROR( _( "Missing 'EELAYER END'" ) );
812 }
char * ReadLine() override
Function ReadLine reads a line of text into the buffer and increments the line number counter...
Definition: richio.cpp:194
wxString m_error
For throwing exceptions or errors on partial schematic loads.
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Parse an ASCII integer string with possible leading whitespace into an integer and updates the pointe...
const wxString & GetFileName() const
Definition: sch_screen.h:120
int m_version
Version of file being loaded.
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
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
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Compare aString to the string starting at aLine and advances the character point to the end of String...
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
void SCH_LEGACY_PLUGIN::loadHierarchy ( SCH_SHEET aSheet)
private

Definition at line 642 of file sch_legacy_plugin.cpp.

References SCH_SCREEN::GetDrawItems(), SCH_SHEET::GetFileName(), SCH_SHEET::GetScreen(), SCH_SHEET_T, SCH_SCREEN::SetFileName(), EDA_ITEM::SetParent(), SCH_SHEET::SetScreen(), traceSchLegacyPlugin, and IO_ERROR::What().

Referenced by GetError().

643 {
644  SCH_SCREEN* screen = NULL;
645 
646  if( !aSheet->GetScreen() )
647  {
648  // SCH_SCREEN objects store the full path and file name where the SCH_SHEET object only
649  // stores the file name and extension. Add the project path to the file name and
650  // extension to compare when calling SCH_SHEET::SearchHierarchy().
651  wxFileName fileName = aSheet->GetFileName();
652  size_t dirCount = 0;
653 
654  if( !fileName.IsAbsolute() )
655  {
656  dirCount = fileName.GetDirCount();
657  fileName.MakeAbsolute( m_path );
658  }
659 
660  // Save the current path so that it gets restored when decending and ascending the
661  // sheet hierarchy which allows for sheet schematic files to be nested in folders
662  // relative to the last path a schematic was loaded from.
663  m_path = fileName.GetPath();
664 
665  wxLogTrace( traceSchLegacyPlugin, "Saving last path \"%s\"", m_path );
666 
667  m_rootSheet->SearchHierarchy( fileName.GetFullPath(), &screen );
668 
669  if( screen )
670  {
671  aSheet->SetScreen( screen );
672 
673  // Do not need to load the sub-sheets - this has already been done.
674  }
675  else
676  {
677  aSheet->SetScreen( new SCH_SCREEN( m_kiway ) );
678  aSheet->GetScreen()->SetFileName( fileName.GetFullPath() );
679 
680  try
681  {
682  loadFile( fileName.GetFullPath(), aSheet->GetScreen() );
683 
684  EDA_ITEM* item = aSheet->GetScreen()->GetDrawItems();
685 
686  while( item )
687  {
688  if( item->Type() == SCH_SHEET_T )
689  {
690  SCH_SHEET* sheet = (SCH_SHEET*) item;
691 
692  // Set the parent to aSheet. This effectively creates a method to find
693  // the root sheet from any sheet so a pointer to the root sheet does not
694  // need to be stored globally. Note: this is not the same as a hierarchy.
695  // Complex hierarchies can have multiple copies of a sheet. This only
696  // provides a simple tree to find the root sheet.
697  sheet->SetParent( aSheet );
698 
699  // Recursion starts here.
700  loadHierarchy( sheet );
701  }
702 
703  item = item->Next();
704  }
705  }
706  catch( const IO_ERROR& ioe )
707  {
708  // If there is a problem loading the root sheet, there is no recovery.
709  if( aSheet == m_rootSheet )
710  throw( ioe );
711 
712  // For all subsheets, queue up the error message for the caller.
713  if( !m_error.IsEmpty() )
714  m_error += "\n";
715 
716  m_error += ioe.What();
717  }
718  }
719 
720  // Back out any relative paths so the last sheet file path is correct.
721  while( dirCount )
722  {
723  fileName.RemoveLastDir();
724  dirCount--;
725  }
726 
727  wxLogTrace( traceSchLegacyPlugin, "Restoring last path \"%s\"", fileName.GetPath() );
728  m_path = fileName.GetPath();
729  }
730 }
bool SearchHierarchy(const wxString &aFilename, SCH_SCREEN **aScreen)
Search the existing hierarchy for an instance of screen loaded from aFileName.
Definition: sch_sheet.cpp:563
wxString m_error
For throwing exceptions or errors on partial schematic loads.
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
Definition: sch_sheet.cpp:104
const wxChar *const traceSchLegacyPlugin
Flag to enable legacy schematic plugin debug output.
SCH_SHEET * m_rootSheet
The root sheet of the schematic being loaded..
SCH_SCREEN * GetScreen()
Definition: sch_sheet.h:279
void loadFile(const wxString &aFileName, SCH_SCREEN *aScreen)
wxString m_path
Root project path for loading child sheets.
void loadHierarchy(SCH_SHEET *aSheet)
void SetParent(EDA_ITEM *aParent)
Definition: base_struct.h:224
wxString GetFileName(void) const
Return the filename corresponding to this sheet.
Definition: sch_sheet.cpp:646
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:209
SCH_ITEM * GetDrawItems() const
Definition: sch_screen.h:138
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:33
Class EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boa...
Definition: base_struct.h:162
void SetFileName(const wxString &aFileName)
Definition: sch_screen.h:118
KIWAY * m_kiway
Required for path to legacy component libraries.
Struct IO_ERROR is a class used to hold an error message and may be used when throwing exceptions con...
Definition: ki_exception.h:47
SCH_JUNCTION * SCH_LEGACY_PLUGIN::loadJunction ( FILE_LINE_READER aReader)
private

Definition at line 1133 of file sch_legacy_plugin.cpp.

References LINE_READER::Line(), name, parseInt(), parseUnquotedString(), strCompare(), wxPoint::x, and wxPoint::y.

Referenced by GetError().

1134 {
1135  std::unique_ptr< SCH_JUNCTION > junction( new SCH_JUNCTION );
1136 
1137  const char* line = aReader.Line();
1138 
1139  wxCHECK( strCompare( "Connection", line, &line ), NULL );
1140 
1141  wxString name;
1142 
1143  parseUnquotedString( name, aReader, line, &line );
1144 
1145  wxPoint position;
1146 
1147  position.x = parseInt( aReader, line, &line );
1148  position.y = parseInt( aReader, line, &line );
1149  junction->SetPosition( position );
1150 
1151  return junction.release();
1152 }
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Parse an ASCII integer string with possible leading whitespace into an integer and updates the pointe...
static void parseUnquotedString(wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
Parse an unquoted utf8 string and updates the pointer at aOutput if it is not NULL.
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
const char * name
Definition: DXF_plotter.cpp:61
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Compare aString to the string starting at aLine and advances the character point to the end of String...
SCH_NO_CONNECT * SCH_LEGACY_PLUGIN::loadNoConnect ( FILE_LINE_READER aReader)
private

Definition at line 1155 of file sch_legacy_plugin.cpp.

References LINE_READER::Line(), name, parseInt(), parseUnquotedString(), strCompare(), wxPoint::x, and wxPoint::y.

Referenced by GetError().

1156 {
1157  std::unique_ptr< SCH_NO_CONNECT > no_connect( new SCH_NO_CONNECT );
1158 
1159  const char* line = aReader.Line();
1160 
1161  wxCHECK( strCompare( "NoConn", line, &line ), NULL );
1162 
1163  wxString name;
1164 
1165  parseUnquotedString( name, aReader, line, &line );
1166 
1167  wxPoint position;
1168 
1169  position.x = parseInt( aReader, line, &line );
1170  position.y = parseInt( aReader, line, &line );
1171  no_connect->SetPosition( position );
1172 
1173  return no_connect.release();
1174 }
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Parse an ASCII integer string with possible leading whitespace into an integer and updates the pointe...
static void parseUnquotedString(wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
Parse an unquoted utf8 string and updates the pointer at aOutput if it is not NULL.
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
const char * name
Definition: DXF_plotter.cpp:61
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Compare aString to the string starting at aLine and advances the character point to the end of String...
void SCH_LEGACY_PLUGIN::loadPageSettings ( FILE_LINE_READER aReader,
SCH_SCREEN aScreen 
)
private

Definition at line 815 of file sch_legacy_plugin.cpp.

References PAGE_INFO::Custom, LINE_READER::Line(), BASE_SCREEN::m_NumberOfScreens, BASE_SCREEN::m_ScreenNumber, parseInt(), parseQuotedString(), parseUnquotedString(), FILE_LINE_READER::ReadLine(), SCH_PARSE_ERROR, TITLE_BLOCK::SetComment1(), TITLE_BLOCK::SetComment2(), TITLE_BLOCK::SetComment3(), TITLE_BLOCK::SetComment4(), TITLE_BLOCK::SetCompany(), TITLE_BLOCK::SetDate(), PAGE_INFO::SetHeightMils(), SCH_SCREEN::SetPageSettings(), PAGE_INFO::SetPortrait(), TITLE_BLOCK::SetRevision(), TITLE_BLOCK::SetTitle(), SCH_SCREEN::SetTitleBlock(), PAGE_INFO::SetType(), PAGE_INFO::SetWidthMils(), and strCompare().

Referenced by GetError().

816 {
817  wxASSERT( aScreen != NULL );
818 
819  wxString buf;
820  const char* line = aReader.Line();
821 
822  PAGE_INFO pageInfo;
823  TITLE_BLOCK tb;
824 
825  wxCHECK_RET( strCompare( "$Descr", line, &line ), "Invalid sheet description" );
826 
827  parseUnquotedString( buf, aReader, line, &line );
828 
829  if( !pageInfo.SetType( buf ) )
830  SCH_PARSE_ERROR( "invalid page size", aReader, line );
831 
832  int pagew = parseInt( aReader, line, &line );
833  int pageh = parseInt( aReader, line, &line );
834 
835  if( buf == PAGE_INFO::Custom )
836  {
837  pageInfo.SetWidthMils( pagew );
838  pageInfo.SetHeightMils( pageh );
839  }
840  else
841  {
842  wxString orientation;
843 
844  // Non custom size, set portrait if its present. Can be empty string which defaults
845  // to landscape.
846  parseUnquotedString( orientation, aReader, line, &line, true );
847 
848  if( orientation == "portrait" )
849  pageInfo.SetPortrait( true );
850  }
851 
852  aScreen->SetPageSettings( pageInfo );
853 
854  while( line != NULL )
855  {
856  buf.clear();
857 
858  if( !aReader.ReadLine() )
859  SCH_PARSE_ERROR( _( "unexpected end of file" ), aReader, line );
860 
861  line = aReader.Line();
862 
863  if( strCompare( "Sheet", line, &line ) )
864  {
865  aScreen->m_ScreenNumber = parseInt( aReader, line, &line );
866  aScreen->m_NumberOfScreens = parseInt( aReader, line, &line );
867  }
868  else if( strCompare( "Title", line, &line ) )
869  {
870  parseQuotedString( buf, aReader, line, &line, true );
871  tb.SetTitle( buf );
872  }
873  else if( strCompare( "Date", line, &line ) )
874  {
875  parseQuotedString( buf, aReader, line, &line, true );
876  tb.SetDate( buf );
877  }
878  else if( strCompare( "Rev", line, &line ) )
879  {
880  parseQuotedString( buf, aReader, line, &line, true );
881  tb.SetRevision( buf );
882  }
883  else if( strCompare( "Comp", line, &line ) )
884  {
885  parseQuotedString( buf, aReader, line, &line, true );
886  tb.SetCompany( buf );
887  }
888  else if( strCompare( "Comment1", line, &line ) )
889  {
890  parseQuotedString( buf, aReader, line, &line, true );
891  tb.SetComment1( buf );
892  }
893  else if( strCompare( "Comment2", line, &line ) )
894  {
895  parseQuotedString( buf, aReader, line, &line, true );
896  tb.SetComment2( buf );
897  }
898  else if( strCompare( "Comment3", line, &line ) )
899  {
900  parseQuotedString( buf, aReader, line, &line, true );
901  tb.SetComment3( buf );
902  }
903  else if( strCompare( "Comment4", line, &line ) )
904  {
905  parseQuotedString( buf, aReader, line, &line, true );
906  tb.SetComment4( buf );
907  }
908  else if( strCompare( "$EndDescr", line ) )
909  {
910  aScreen->SetTitleBlock( tb );
911  return;
912  }
913  }
914 
915  SCH_PARSE_ERROR( "missing 'EndDescr'", aReader, line );
916 }
void SetComment1(const wxString &aComment)
Definition: title_block.h:116
char * ReadLine() override
Function ReadLine reads a line of text into the buffer and increments the line number counter...
Definition: richio.cpp:194
int m_ScreenNumber
Definition: base_screen.h:216
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Parse an ASCII integer string with possible leading whitespace into an integer and updates the pointe...
void SetRevision(const wxString &aRevision)
Definition: title_block.h:83
bool SetType(const wxString &aStandardPageDescriptionName, bool aIsPortrait=false)
Function SetType sets the name of the page type and also the sizes and margins commonly associated wi...
Definition: page_info.cpp:117
void SetDate(const wxString &aDate)
Function SetDate sets the date field, and defaults to the current time and date.
Definition: title_block.h:73
void SetPageSettings(const PAGE_INFO &aPageSettings)
Definition: sch_screen.h:116
static const wxChar Custom[]
"User" defined page type
Definition: page_info.h:73
Class TITLE_BLOCK holds the information shown in the lower right corner of a plot, printout, or editing view.
Definition: title_block.h:39
void SetComment4(const wxString &aComment)
Definition: title_block.h:119
static void parseUnquotedString(wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
Parse an unquoted utf8 string and updates the pointer at aOutput if it is not NULL.
Class PAGE_INFO describes the page size and margins of a paper page on which to eventually print or p...
Definition: page_info.h:49
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
void SetCompany(const wxString &aCompany)
Definition: title_block.h:93
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)
Definition: sch_screen.h:127
void SetTitle(const wxString &aTitle)
Definition: title_block.h:59
void SetHeightMils(int aHeightInMils)
Definition: page_info.cpp:253
void SetComment2(const wxString &aComment)
Definition: title_block.h:117
#define SCH_PARSE_ERROR(text, reader, pos)
static void parseQuotedString(wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
Parse an quoted ASCII utf8 and updates the pointer at aOutput if it is not NULL.
void SetWidthMils(int aWidthInMils)
Definition: page_info.cpp:239
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Compare aString to the string starting at aLine and advances the character point to the end of String...
int m_NumberOfScreens
Definition: base_screen.h:217
void SetComment3(const wxString &aComment)
Definition: title_block.h:118
void SetPortrait(bool aIsPortrait)
Function SetPortrait will rotate the paper page 90 degrees.
Definition: page_info.cpp:182
SCH_SHEET * SCH_LEGACY_PLUGIN::loadSheet ( FILE_LINE_READER aReader)
private

Definition at line 919 of file sch_legacy_plugin.cpp.

References GetNewTimeStamp(), NET_BIDI, NET_INPUT, NET_OUTPUT, NET_TRISTATE, NET_UNSPECIFIED, parseChar(), parseHex(), parseInt(), parseQuotedString(), FILE_LINE_READER::ReadLine(), SCH_PARSE_ERROR, SCH_SHEET_PIN::SHEET_BOTTOM_SIDE, SCH_SHEET_PIN::SHEET_LEFT_SIDE, SCH_SHEET_PIN::SHEET_RIGHT_SIDE, SCH_SHEET_PIN::SHEET_TOP_SIDE, strCompare(), THROW_IO_ERROR, wxPoint::x, and wxPoint::y.

Referenced by GetError().

920 {
921  std::unique_ptr< SCH_SHEET > sheet( new SCH_SHEET() );
922 
923  sheet->SetTimeStamp( GetNewTimeStamp() );
924 
925  const char* line = aReader.ReadLine();
926 
927  while( line != NULL )
928  {
929  if( strCompare( "S", line, &line ) ) // Sheet dimensions.
930  {
931  wxPoint position;
932 
933  position.x = parseInt( aReader, line, &line );
934  position.y = parseInt( aReader, line, &line );
935  sheet->SetPosition( position );
936 
937  wxSize size;
938 
939  size.SetWidth( parseInt( aReader, line, &line ) );
940  size.SetHeight( parseInt( aReader, line, &line ) );
941  sheet->SetSize( size );
942  }
943  else if( strCompare( "U", line, &line ) ) // Sheet time stamp.
944  {
945  sheet->SetTimeStamp( parseHex( aReader, line ) );
946  }
947  else if( *line == 'F' ) // Sheet field.
948  {
949  line++;
950 
951  wxString text;
952  int size;
953  int fieldId = parseInt( aReader, line, &line );
954 
955  if( fieldId == 0 || fieldId == 1 ) // Sheet name and file name.
956  {
957  parseQuotedString( text, aReader, line, &line );
958  size = parseInt( aReader, line, &line );
959 
960  if( fieldId == 0 )
961  {
962  sheet->SetName( text );
963  sheet->SetSheetNameSize( size );
964  }
965  else
966  {
967  sheet->SetFileName( text );
968  sheet->SetFileNameSize( size );
969  }
970  }
971  else // Sheet pin.
972  {
973  std::unique_ptr< SCH_SHEET_PIN > sheetPin( new SCH_SHEET_PIN( sheet.get() ) );
974 
975  sheetPin->SetNumber( fieldId );
976 
977  // Can be empty fields.
978  parseQuotedString( text, aReader, line, &line, true );
979 
980  sheetPin->SetText( text );
981 
982  if( line == NULL )
983  THROW_IO_ERROR( _( "unexpected end of line" ) );
984 
985  switch( parseChar( aReader, line, &line ) )
986  {
987  case 'I':
988  sheetPin->SetShape( NET_INPUT );
989  break;
990 
991  case 'O':
992  sheetPin->SetShape( NET_OUTPUT );
993  break;
994 
995  case 'B':
996  sheetPin->SetShape( NET_BIDI );
997  break;
998 
999  case 'T':
1000  sheetPin->SetShape( NET_TRISTATE );
1001  break;
1002 
1003  case 'U':
1004  sheetPin->SetShape( NET_UNSPECIFIED );
1005  break;
1006  default:
1007  SCH_PARSE_ERROR( "invalid sheet pin type", aReader, line );
1008  }
1009 
1010  switch( parseChar( aReader, line, &line ) )
1011  {
1012  case 'R': /* pin on right side */
1013  sheetPin->SetEdge( SCH_SHEET_PIN::SHEET_RIGHT_SIDE );
1014  break;
1015 
1016  case 'T': /* pin on top side */
1017  sheetPin->SetEdge( SCH_SHEET_PIN::SHEET_TOP_SIDE );
1018  break;
1019 
1020  case 'B': /* pin on bottom side */
1021  sheetPin->SetEdge( SCH_SHEET_PIN::SHEET_BOTTOM_SIDE );
1022  break;
1023 
1024  case 'L': /* pin on left side */
1025  sheetPin->SetEdge( SCH_SHEET_PIN::SHEET_LEFT_SIDE );
1026  break;
1027  default:
1028  SCH_PARSE_ERROR( "invalid sheet pin side", aReader, line );
1029  }
1030 
1031  wxPoint position;
1032 
1033  position.x = parseInt( aReader, line, &line );
1034  position.y = parseInt( aReader, line, &line );
1035  sheetPin->SetPosition( position );
1036 
1037  size = parseInt( aReader, line, &line );
1038 
1039  sheetPin->SetTextSize( wxSize( size, size ) );
1040 
1041  sheet->AddPin( sheetPin.release() );
1042  }
1043  }
1044  else if( strCompare( "$EndSheet", line ) )
1045  return sheet.release();
1046 
1047  line = aReader.ReadLine();
1048  }
1049 
1050  SCH_PARSE_ERROR( "missing '$EndSheet`", aReader, line );
1051 
1052  return NULL; // Prevents compiler warning. Should never get here.
1053 }
char * ReadLine() override
Function ReadLine reads a line of text into the buffer and increments the line number counter...
Definition: richio.cpp:194
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Parse an ASCII integer string with possible leading whitespace into an integer and updates the pointe...
static char parseChar(FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL)
Parse a single ASCII character and updates the pointer at aOutput if it is not NULL.
timestamp_t GetNewTimeStamp()
Definition: common.cpp:167
static unsigned long parseHex(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Parse an ASCII hex integer string with possible leading whitespace into a long integer and updates th...
Define a sheet pin (label) used in sheets to create hierarchical schematics.
Definition: sch_sheet.h:61
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:209
#define SCH_PARSE_ERROR(text, reader, pos)
static void parseQuotedString(wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
Parse an quoted ASCII utf8 and updates the pointer at aOutput if it is not NULL.
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Compare aString to the string starting at aLine and advances the character point to the end of String...
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
LIB_ALIAS * SCH_LEGACY_PLUGIN::LoadSymbol ( const wxString &  aLibraryPath,
const wxString &  aAliasName,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Load a LIB_ALIAS object having aAliasName from the aLibraryPath containing a library format that this SCH_PLUGIN knows about.

The LIB_PART should be accessed indirectly using the LIB_ALIAS it is associated with.

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several symbols.
aAliasNameis the alias name of the LIB_PART 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
the alias if found caller shares it or NULL if not found.
Exceptions
IO_ERRORif the library cannot be found or read. No exception is thrown in the case where aAliasName cannot be found.

Reimplemented from SCH_PLUGIN.

Definition at line 4154 of file sch_legacy_plugin.cpp.

4156 {
4157  LOCALE_IO toggle; // toggles on, then off, the C locale.
4158 
4159  m_props = aProperties;
4160 
4161  cacheLib( aLibraryPath );
4162 
4163  LIB_ALIAS_MAP::const_iterator it = m_cache->m_aliases.find( aAliasName );
4164 
4165  if( it == m_cache->m_aliases.end() )
4166  return NULL;
4167 
4168  return it->second;
4169 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
SCH_LEGACY_PLUGIN_CACHE * m_cache
void cacheLib(const wxString &aLibraryFileName)
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
SCH_TEXT * SCH_LEGACY_PLUGIN::loadText ( FILE_LINE_READER aReader)
private

Definition at line 1314 of file sch_legacy_plugin.cpp.

References FROM_UTF8(), GetPenSizeForBold(), i, LINE_READER::Line(), NET_BIDI, NET_INPUT, NET_OUTPUT, NET_TRISTATE, NET_UNSPECIFIED, parseInt(), FILE_LINE_READER::ReadLine(), SCH_GLOBAL_LABEL_T, SCH_HIERARCHICAL_LABEL_T, SCH_PARSE_ERROR, SheetLabelType, strCompare(), wxPoint::x, and wxPoint::y.

Referenced by GetError().

1315 {
1316  const char* line = aReader.Line();
1317 
1318  wxCHECK( strCompare( "Text", line, &line ), NULL );
1319 
1320  std::unique_ptr< SCH_TEXT> text;
1321 
1322  if( strCompare( "Notes", line, &line ) )
1323  text.reset( new SCH_TEXT );
1324  else if( strCompare( "Label", line, &line ) )
1325  text.reset( new SCH_LABEL );
1326  else if( strCompare( "HLabel", line, &line ) )
1327  text.reset( new SCH_HIERLABEL );
1328  else if( strCompare( "GLabel", line, &line ) )
1329  {
1330  // Prior to version 2, the SCH_GLOBALLABEL object did not exist.
1331  if( m_version == 1 )
1332  text.reset( new SCH_HIERLABEL );
1333  else
1334  text.reset( new SCH_GLOBALLABEL );
1335  }
1336  else
1337  SCH_PARSE_ERROR( "unknown Text type", aReader, line );
1338 
1339  // Parse the parameters common to all text objects.
1340  wxPoint position;
1341 
1342  position.x = parseInt( aReader, line, &line );
1343  position.y = parseInt( aReader, line, &line );
1344  text->SetPosition( position );
1345  text->SetLabelSpinStyle( parseInt( aReader, line, &line ) );
1346 
1347  int size = parseInt( aReader, line, &line );
1348 
1349  text->SetTextSize( wxSize( size, size ) );
1350 
1351  // Parse the global and hierarchical label type.
1352  if( text->Type() == SCH_HIERARCHICAL_LABEL_T || text->Type() == SCH_GLOBAL_LABEL_T )
1353  {
1354  if( strCompare( SheetLabelType[NET_INPUT], line, &line ) )
1355  text->SetShape( NET_INPUT );
1356  else if( strCompare( SheetLabelType[NET_OUTPUT], line, &line ) )
1357  text->SetShape( NET_OUTPUT );
1358  else if( strCompare( SheetLabelType[NET_BIDI], line, &line ) )
1359  text->SetShape( NET_BIDI );
1360  else if( strCompare( SheetLabelType[NET_TRISTATE], line, &line ) )
1361  text->SetShape( NET_TRISTATE );
1362  else if( strCompare( SheetLabelType[NET_UNSPECIFIED], line, &line ) )
1363  text->SetShape( NET_UNSPECIFIED );
1364  else
1365  SCH_PARSE_ERROR( "invalid label type", aReader, line );
1366  }
1367 
1368  int thickness = 0;
1369 
1370  // The following tokens do not exist in version 1 schematic files.
1371  if( m_version > 1 )
1372  {
1373  if( strCompare( "Italic", line, &line ) )
1374  text->SetItalic( true );
1375  else if( !strCompare( "~", line, &line ) )
1376  SCH_PARSE_ERROR( _( "expected 'Italics' or '~'" ), aReader, line );
1377 
1378  // The thickness token does not exist in older versions of the schematic file format
1379  // so calling parseInt will be made only if the EOL is not reached.
1380  if( *line >= ' ' )
1381  thickness = parseInt( aReader, line, &line );
1382  }
1383 
1384  text->SetBold( thickness != 0 );
1385  text->SetThickness( thickness != 0 ? GetPenSizeForBold( size ) : 0 );
1386 
1387  // Read the text string for the text.
1388  char* tmp = aReader.ReadLine();
1389 
1390  tmp = strtok( tmp, "\r\n" );
1391  wxString val = FROM_UTF8( tmp );
1392 
1393  for( ; ; )
1394  {
1395  int i = val.find( wxT( "\\n" ) );
1396 
1397  if( i == wxNOT_FOUND )
1398  break;
1399 
1400  val.erase( i, 2 );
1401  val.insert( i, wxT( "\n" ) );
1402  }
1403 
1404  text->SetText( val );
1405 
1406  return text.release();
1407 }
char * ReadLine() override
Function ReadLine reads a line of text into the buffer and increments the line number counter...
Definition: richio.cpp:194
static wxString FROM_UTF8(const char *cstring)
function FROM_UTF8 converts a UTF8 encoded C string to a wxString for all wxWidgets build modes...
Definition: macros.h:53
int GetPenSizeForBold(int aTextSize)
Function GetPensizeForBold.
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Parse an ASCII integer string with possible leading whitespace into an integer and updates the pointe...
const char * SheetLabelType[]
Definition: sch_text.cpp:58
int m_version
Version of file being loaded.
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
#define SCH_PARSE_ERROR(text, reader, pos)
size_t i
Definition: json11.cpp:597
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Compare aString to the string starting at aLine and advances the character point to the end of String...
SCH_LINE * SCH_LEGACY_PLUGIN::loadWire ( FILE_LINE_READER aReader)
private

Definition at line 1177 of file sch_legacy_plugin.cpp.

References color, SCH_LINE::GetLineStyleInternalId(), is_eol(), LAYER_BUS, LAYER_NOTES, LAYER_WIRE, LINE_READER::Line(), parseInt(), parseUnquotedString(), FILE_LINE_READER::ReadLine(), SCH_PARSE_ERROR, strCompare(), T_COLOR, T_COLORA, T_STYLE, T_WIDTH, wxPoint::x, and wxPoint::y.

Referenced by GetError().

1178 {
1179  std::unique_ptr< SCH_LINE > wire( new SCH_LINE );
1180 
1181  const char* line = aReader.Line();
1182 
1183  wxCHECK( strCompare( "Wire", line, &line ), NULL );
1184 
1185  if( strCompare( "Wire", line, &line ) )
1186  wire->SetLayer( LAYER_WIRE );
1187  else if( strCompare( "Bus", line, &line ) )
1188  wire->SetLayer( LAYER_BUS );
1189  else if( strCompare( "Notes", line, &line ) )
1190  wire->SetLayer( LAYER_NOTES );
1191  else
1192  SCH_PARSE_ERROR( "invalid line type", aReader, line );
1193 
1194  if( !strCompare( "Line", line, &line ) )
1195  SCH_PARSE_ERROR( "invalid wire definition", aReader, line );
1196 
1197  // Since Sept 15, 2017, a line style is alloved (width, style, color)
1198  // Only non default values are stored
1199  while( !is_eol( *line ) )
1200  {
1201  wxString buf;
1202 
1203  parseUnquotedString( buf, aReader, line, &line );
1204 
1205  if( buf == ")" )
1206  continue;
1207 
1208  else if( buf == T_WIDTH )
1209  {
1210  int size = parseInt( aReader, line, &line );
1211  wire->SetLineWidth( size );
1212  }
1213  else if( buf == T_STYLE )
1214  {
1215  parseUnquotedString( buf, aReader, line, &line );
1216  int style = SCH_LINE::GetLineStyleInternalId( buf );
1217  wire->SetLineStyle( style );
1218  }
1219  else // should be the color parameter.
1220  {
1221  // The color param is something like rgb(150, 40, 191)
1222  // and because there is no space between ( and 150
1223  // the first param is inside buf.
1224  // So break keyword and the first param into 2 separate strings.
1225  wxString prm, keyword;
1226  keyword = buf.BeforeLast( '(', &prm );
1227 
1228  if( ( keyword == T_COLOR ) || ( keyword == T_COLORA ) )
1229  {
1230  long color[4] = { 0 };
1231 
1232  int ii = 0;
1233 
1234  if( !prm.IsEmpty() )
1235  {
1236  prm.ToLong( &color[ii] );
1237  ii++;
1238  }
1239 
1240  int prm_count = ( keyword == T_COLORA ) ? 4 : 3;
1241  // fix opacity to 1.0 or 255, when not exists in file
1242  color[3] = 255;
1243 
1244  for(; ii < prm_count && !is_eol( *line ); ii++ )
1245  color[ii] = parseInt( aReader, line, &line );
1246 
1247  wire->SetLineColor( color[0]/255.0, color[1]/255.0, color[2]/255.0,color[3]/255.0 );
1248  }
1249  }
1250  }
1251 
1252  // Read the segment en points coordinates:
1253  line = aReader.ReadLine();
1254 
1255  wxPoint begin, end;
1256 
1257  begin.x = parseInt( aReader, line, &line );
1258  begin.y = parseInt( aReader, line, &line );
1259  end.x = parseInt( aReader, line, &line );
1260  end.y = parseInt( aReader, line, &line );
1261 
1262  wire->SetStartPoint( begin );
1263  wire->SetEndPoint( end );
1264 
1265  return wire.release();
1266 }
char * ReadLine() override
Function ReadLine reads a line of text into the buffer and increments the line number counter...
Definition: richio.cpp:194
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Parse an ASCII integer string with possible leading whitespace into an integer and updates the pointe...
int color
Definition: DXF_plotter.cpp:62
#define T_WIDTH
#define T_STYLE
static void parseUnquotedString(wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
Parse an unquoted utf8 string and updates the pointer at aOutput if it is not NULL.
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
static bool is_eol(char c)
#define T_COLOR
static int GetLineStyleInternalId(const wxString &aStyleName)
Definition: sch_line.cpp:138
#define SCH_PARSE_ERROR(text, reader, pos)
Segment description base class to describe items which have 2 end points (track, wire, draw line ...)
Definition: sch_line.h:41
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Compare aString to the string starting at aLine and advances the character point to the end of String...
#define T_COLORA
void SCH_LEGACY_PLUGIN::Save ( const wxString &  aFileName,
SCH_SCREEN aSchematic,
KIWAY aKiway,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Write aSchematic to a storage file in a format that this SCH_PLUGIN implementation knows about, or it can be used to write a portion of aSchematic to a special kind of export file.

Parameters
aFileNameis the name of a file to save to on disk.
aSchematicis the class SCH_SCREEN in memory document tree from which to extract information when writing to aFileName. The caller continues to own the SCHEMATIC, and the plugin should refrain from modifying the SCHEMATIC if possible.
aKiwayis the KIWAY object used to access the component libraries loaded by the project.
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 SCH_PLUGIN.

Definition at line 1687 of file sch_legacy_plugin.cpp.

References Format().

1689 {
1690  wxCHECK_RET( aScreen != NULL, "NULL SCH_SCREEN object." );
1691  wxCHECK_RET( !aFileName.IsEmpty(), "No schematic file name defined." );
1692 
1693  LOCALE_IO toggle; // toggles on, then off, the C locale, to write floating point values.
1694 
1695  init( aKiway, aProperties );
1696 
1697  wxFileName fn = aFileName;
1698 
1699  // File names should be absolute. Don't assume everything relative to the project path
1700  // works properly.
1701  wxASSERT( fn.IsAbsolute() );
1702 
1703  FILE_OUTPUTFORMATTER formatter( fn.GetFullPath() );
1704 
1705  m_out = &formatter; // no ownership
1706 
1707  Format( aScreen );
1708 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
void Format(SCH_SCREEN *aScreen)
void init(KIWAY *aKiway, const PROPERTIES *aProperties=NULL)
initialize PLUGIN like a constructor would.
Class FILE_OUTPUTFORMATTER may be used for text file output.
Definition: richio.h:492
void SCH_LEGACY_PLUGIN::saveBitmap ( SCH_BITMAP aBitmap)
private

Definition at line 1929 of file sch_legacy_plugin.cpp.

References SCH_BITMAP::GetImage(), BITMAP_BASE::GetImageData(), SCH_BITMAP::GetPosition(), BITMAP_BASE::GetScale(), wxPoint::x, and wxPoint::y.

Referenced by GetError().

1930 {
1931  wxCHECK_RET( aBitmap != NULL, "SCH_BITMAP* is NULL" );
1932 
1933  wxImage* image = aBitmap->GetImage()->GetImageData();
1934 
1935  wxCHECK_RET( image != NULL, "wxImage* is NULL" );
1936 
1937  m_out->Print( 0, "$Bitmap\n" );
1938  m_out->Print( 0, "Pos %-4d %-4d\n", aBitmap->GetPosition().x, aBitmap->GetPosition().y );
1939  m_out->Print( 0, "Scale %f\n", aBitmap->GetImage()->GetScale() );
1940  m_out->Print( 0, "Data\n" );
1941 
1942  wxMemoryOutputStream stream;
1943 
1944  image->SaveFile( stream, wxBITMAP_TYPE_PNG );
1945 
1946  // Write binary data in hexadecimal form (ASCII)
1947  wxStreamBuffer* buffer = stream.GetOutputStreamBuffer();
1948  char* begin = (char*) buffer->GetBufferStart();
1949 
1950  for( int ii = 0; begin < buffer->GetBufferEnd(); begin++, ii++ )
1951  {
1952  if( ii >= 32 )
1953  {
1954  ii = 0;
1955 
1956  m_out->Print( 0, "\n" );
1957  }
1958 
1959  m_out->Print( 0, "%2.2X ", *begin & 0xFF );
1960  }
1961 
1962  m_out->Print( 0, "\nEndData\n" );
1963  m_out->Print( 0, "$EndBitmap\n" );
1964 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
wxImage * GetImageData()
Definition: bitmap_base.h:75
wxPoint GetPosition() const override
Function GetPosition.
Definition: sch_bitmap.h:133
BITMAP_BASE * GetImage()
Definition: sch_bitmap.h:65
double GetScale() const
Definition: bitmap_base.h:82
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
void SCH_LEGACY_PLUGIN::saveBusEntry ( SCH_BUS_ENTRY_BASE aBusEntry)
private

Definition at line 2060 of file sch_legacy_plugin.cpp.

References SCH_ITEM::GetLayer(), SCH_BUS_ENTRY_BASE::GetPosition(), LAYER_WIRE, SCH_BUS_ENTRY_BASE::m_End(), wxPoint::x, and wxPoint::y.

Referenced by GetError().

2061 {
2062  wxCHECK_RET( aBusEntry != NULL, "SCH_BUS_ENTRY_BASE* is NULL" );
2063 
2064  if( aBusEntry->GetLayer() == LAYER_WIRE )
2065  m_out->Print( 0, "Entry Wire Line\n\t%-4d %-4d %-4d %-4d\n",
2066  aBusEntry->GetPosition().x, aBusEntry->GetPosition().y,
2067  aBusEntry->m_End().x, aBusEntry->m_End().y );
2068  else
2069  m_out->Print( 0, "Entry Bus Bus\n\t%-4d %-4d %-4d %-4d\n",
2070  aBusEntry->GetPosition().x, aBusEntry->GetPosition().y,
2071  aBusEntry->m_End().x, aBusEntry->m_End().y );
2072 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
SCH_LAYER_ID GetLayer() const
Function GetLayer returns the layer this item is on.
wxPoint m_End() 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 GetPosition() const override
Function GetPosition.
void SCH_LEGACY_PLUGIN::saveComponent ( SCH_COMPONENT aComponent)
private

Definition at line 1792 of file sch_legacy_plugin.cpp.

References LIB_ID::Format(), SCH_COMPONENT::GetConvert(), SCH_COMPONENT::GetField(), SCH_COMPONENT::GetFieldCount(), SCH_COMPONENT::GetLibId(), SCH_COMPONENT::GetPathsAndReferences(), SCH_COMPONENT::GetPosition(), SCH_COMPONENT::GetPrefix(), EDA_TEXT::GetText(), EDA_ITEM::GetTimeStamp(), SCH_COMPONENT::GetTransform(), SCH_COMPONENT::GetUnit(), i, MANDATORY_FIELDS, REFERENCE, SCH_LEGACY_PLUGIN_CACHE::saveField(), SCH_FIELD::SetId(), TO_UTF8, toUTFTildaText(), wxPoint::x, TRANSFORM::x1, TRANSFORM::x2, wxPoint::y, TRANSFORM::y1, and TRANSFORM::y2.

Referenced by GetError().

1793 {
1794  std::string name1;
1795  std::string name2;
1796  wxArrayString reference_fields;
1797 
1798  static wxString delimiters( wxT( " " ) );
1799 
1800  // This is redundant with the AR entries below, but it makes the files backwards-compatible.
1801  if( aComponent->GetPathsAndReferences().GetCount() > 0 )
1802  {
1803  reference_fields = wxStringTokenize( aComponent->GetPathsAndReferences()[0], delimiters );
1804  name1 = toUTFTildaText( reference_fields[1] );
1805  }
1806  else
1807  {
1808  if( aComponent->GetField( REFERENCE )->GetText().IsEmpty() )
1809  name1 = toUTFTildaText( aComponent->GetPrefix() );
1810  else
1811  name1 = toUTFTildaText( aComponent->GetField( REFERENCE )->GetText() );
1812  }
1813 
1814  wxString part_name = aComponent->GetLibId().Format();
1815 
1816  if( part_name.size() )
1817  {
1818  name2 = toUTFTildaText( part_name );
1819  }
1820  else
1821  {
1822  name2 = "_NONAME_";
1823  }
1824 
1825  m_out->Print( 0, "$Comp\n" );
1826  m_out->Print( 0, "L %s %s\n", name2.c_str(), name1.c_str() );
1827 
1828  // Generate unit number, convert and time stamp
1829  m_out->Print( 0, "U %d %d %8.8lX\n", aComponent->GetUnit(), aComponent->GetConvert(),
1830  (unsigned long)aComponent->GetTimeStamp() );
1831 
1832  // Save the position
1833  m_out->Print( 0, "P %d %d\n", aComponent->GetPosition().x, aComponent->GetPosition().y );
1834 
1835  /* If this is a complex hierarchy; save hierarchical references.
1836  * but for simple hierarchies it is not necessary.
1837  * the reference inf is already saved
1838  * this is useful for old Eeschema version compatibility
1839  */
1840  if( aComponent->GetPathsAndReferences().GetCount() > 1 )
1841  {
1842  for( unsigned int ii = 0; ii < aComponent->GetPathsAndReferences().GetCount(); ii++ )
1843  {
1844  /*format:
1845  * AR Path="/140/2" Ref="C99" Part="1"
1846  * where 140 is the uid of the containing sheet
1847  * and 2 is the timestamp of this component.
1848  * (timestamps are actually 8 hex chars)
1849  * Ref is the conventional component reference for this 'path'
1850  * Part is the conventional component part selection for this 'path'
1851  */
1852  reference_fields = wxStringTokenize( aComponent->GetPathsAndReferences()[ii],
1853  delimiters );
1854 
1855  m_out->Print( 0, "AR Path=\"%s\" Ref=\"%s\" Part=\"%s\" \n",
1856  TO_UTF8( reference_fields[0] ),
1857  TO_UTF8( reference_fields[1] ),
1858  TO_UTF8( reference_fields[2] ) );
1859  }
1860  }
1861 
1862  // update the ugly field index, which I would like to see go away someday soon.
1863  for( int i = 0; i < aComponent->GetFieldCount(); ++i )
1864  aComponent->GetField( i )->SetId( i );
1865 
1866  // Fixed fields:
1867  // Save mandatory fields even if they are blank,
1868  // because the visibility, size and orientation are set from libary editor.
1869  for( unsigned i = 0; i < MANDATORY_FIELDS; ++i )
1870  saveField( aComponent->GetField( i ) );
1871 
1872  // User defined fields:
1873  // The *policy* about which user defined fields are part of a symbol is now
1874  // only in the dialog editors. No policy should be enforced here, simply
1875  // save all the user defined fields, they are present because a dialog editor
1876  // thought they should be. If you disagree, go fix the dialog editors.
1877  for( int i = MANDATORY_FIELDS; i < aComponent->GetFieldCount(); ++i )
1878  saveField( aComponent->GetField( i ) );
1879 
1880  // Unit number, position, box ( old standard )
1881  m_out->Print( 0, "\t%-4d %-4d %-4d\n", aComponent->GetUnit(), aComponent->GetPosition().x,
1882  aComponent->GetPosition().y );
1883 
1884  TRANSFORM transform = aComponent->GetTransform();
1885 
1886  m_out->Print( 0, "\t%-4d %-4d %-4d %-4d\n",
1887  transform.x1, transform.y1, transform.x2, transform.y2 );
1888  m_out->Print( 0, "$EndComp\n" );
1889 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
TRANSFORM & GetTransform() const
int y2
Definition: transform.h:51
The first 4 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors...
wxString GetPrefix() const
int x2
Definition: transform.h:50
int x1
Definition: transform.h:48
Field Reference of part, i.e. "IC21".
void saveField(SCH_FIELD *aField)
#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
int GetConvert() const
int y1
Definition: transform.h:49
Class for tranforming drawing coordinates for a wxDC device context.
Definition: transform.h:45
SCH_FIELD * GetField(int aFieldNdx) const
Returns a field in this symbol.
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:128
const wxArrayString & GetPathsAndReferences() const
std::string toUTFTildaText(const wxString &txt)
Function toUTFTildaText convert a wxString to UTF8 and replace any control characters with a ~...
int GetUnit() const
int GetFieldCount() const
Return the number of fields in this symbol.
size_t i
Definition: json11.cpp:597
wxPoint GetPosition() const override
Function GetPosition.
const LIB_ID & GetLibId() const
UTF8 Format() const
Definition: lib_id.cpp:263
void SetId(int aId)
Definition: sch_field.h:89
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:215
void SCH_LEGACY_PLUGIN::saveField ( SCH_FIELD aField)
private

Definition at line 1892 of file sch_legacy_plugin.cpp.

References EscapedUTF8(), FIELD1, EDA_TEXT::GetHorizJustify(), SCH_FIELD::GetId(), SCH_FIELD::GetLibPosition(), SCH_FIELD::GetName(), EDA_TEXT::GetText(), EDA_TEXT::GetTextAngle(), EDA_TEXT::GetTextWidth(), EDA_TEXT::GetVertJustify(), GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_HJUSTIFY_RIGHT, GR_TEXT_VJUSTIFY_BOTTOM, GR_TEXT_VJUSTIFY_TOP, EDA_TEXT::IsBold(), EDA_TEXT::IsItalic(), EDA_TEXT::IsVisible(), TEXT_ANGLE_HORIZ, wxPoint::x, and wxPoint::y.

Referenced by GetError().

1893 {
1894  char hjustify = 'C';
1895 
1896  if( aField->GetHorizJustify() == GR_TEXT_HJUSTIFY_LEFT )
1897  hjustify = 'L';
1898  else if( aField->GetHorizJustify() == GR_TEXT_HJUSTIFY_RIGHT )
1899  hjustify = 'R';
1900 
1901  char vjustify = 'C';
1902 
1903  if( aField->GetVertJustify() == GR_TEXT_VJUSTIFY_BOTTOM )
1904  vjustify = 'B';
1905  else if( aField->GetVertJustify() == GR_TEXT_VJUSTIFY_TOP )
1906  vjustify = 'T';
1907 
1908  m_out->Print( 0, "F %d %s %c %-3d %-3d %-3d %4.4X %c %c%c%c",
1909  aField->GetId(),
1910  EscapedUTF8( aField->GetText() ).c_str(), // wraps in quotes too
1911  aField->GetTextAngle() == TEXT_ANGLE_HORIZ ? 'H' : 'V',
1912  aField->GetLibPosition().x, aField->GetLibPosition().y,
1913  aField->GetTextWidth(),
1914  !aField->IsVisible(),
1915  hjustify, vjustify,
1916  aField->IsItalic() ? 'I' : 'N',
1917  aField->IsBold() ? 'B' : 'N' );
1918 
1919  // Save field name, if the name is user definable
1920  if( aField->GetId() >= FIELD1 )
1921  {
1922  m_out->Print( 0, " %s", EscapedUTF8( aField->GetName() ).c_str() );
1923  }
1924 
1925  m_out->Print( 0, "\n" );
1926 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
#define TEXT_ANGLE_HORIZ
Frequent text rotations, used with {Set,Get}TextAngle(), in 0.1 degrees for now, hoping to migrate to...
Definition: common.h:91
wxString GetName(bool aUseDefaultName=true) const
Function GetName returns the field name.
Definition: sch_field.cpp:425
bool IsItalic() const
Definition: eda_text.h:168
int GetId() const
Definition: sch_field.h:87
int GetTextWidth() const
Definition: eda_text.h:216
wxPoint GetLibPosition() const
Definition: sch_field.h:187
EDA_TEXT_HJUSTIFY_T GetHorizJustify() const
Definition: eda_text.h:188
bool IsBold() const
Definition: eda_text.h:171
double GetTextAngle() const
Definition: eda_text.h:162
std::string EscapedUTF8(const wxString &aString)
Function EscapedUTF8 returns an 8 bit UTF8 string given aString in unicode form.
Definition: string.cpp:137
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:128
EDA_TEXT_VJUSTIFY_T GetVertJustify() const
Definition: eda_text.h:189
bool IsVisible() const
Definition: eda_text.h:174
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
void SCH_LEGACY_PLUGIN::saveJunction ( SCH_JUNCTION aJunction)
private

Definition at line 2042 of file sch_legacy_plugin.cpp.

References SCH_JUNCTION::GetPosition(), wxPoint::x, and wxPoint::y.

Referenced by GetError().

2043 {
2044  wxCHECK_RET( aJunction != NULL, "SCH_JUNCTION* is NULL" );
2045 
2046  m_out->Print( 0, "Connection ~ %-4d %-4d\n",
2047  aJunction->GetPosition().x, aJunction->GetPosition().y );
2048 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
wxPoint GetPosition() const override
Function GetPosition.
Definition: sch_junction.h:94
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
void SCH_LEGACY_PLUGIN::SaveLibrary ( const wxString &  aLibraryPath,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Reimplemented from SCH_PLUGIN.

Definition at line 4262 of file sch_legacy_plugin.cpp.

References SCH_LEGACY_PLUGIN_CACHE::SCH_LEGACY_PLUGIN_CACHE().

4263 {
4264  if( !m_cache )
4265  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryPath );
4266 
4267  wxString oldFileName = m_cache->GetFileName();
4268 
4269  if( !m_cache->IsFile( aLibraryPath ) )
4270  {
4271  m_cache->SetFileName( aLibraryPath );
4272  }
4273 
4274  // This is a forced save.
4275  m_cache->SetModified();
4276  m_cache->Save( writeDocFile( aProperties ) );
4277  m_cache->SetFileName( oldFileName );
4278 }
SCH_LEGACY_PLUGIN_CACHE * m_cache
A cache assistant for the part library portion of the SCH_PLUGIN API, and only for the SCH_LEGACY_PLU...
wxString GetFileName() const
void SetModified(bool aModified=true)
void SetFileName(const wxString &aFileName)
bool IsFile(const wxString &aFullPathAndFileName) const
void Save(bool aSaveDocFile=true)
Save the entire library to file m_libFileName;.
bool writeDocFile(const PROPERTIES *aProperties)
void SCH_LEGACY_PLUGIN::saveLine ( SCH_LINE aLine)
private

Definition at line 2075 of file sch_legacy_plugin.cpp.

References SCH_LINE::GetDefaultColor(), SCH_LINE::GetDefaultStyle(), SCH_LINE::GetDefaultWidth(), SCH_LINE::GetEndPoint(), SCH_ITEM::GetLayer(), SCH_LINE::GetLineColor(), SCH_LINE::GetLineSize(), SCH_LINE::GetLineStyle(), SCH_LINE::GetLineStyleName(), SCH_LINE::GetPenSize(), SCH_LINE::GetStartPoint(), LAYER_BUS, LAYER_NOTES, LAYER_WIRE, T_STYLE, T_WIDTH, TO_UTF8, wxPoint::x, and wxPoint::y.

Referenced by GetError().

2076 {
2077  wxCHECK_RET( aLine != NULL, "SCH_LINE* is NULL" );
2078 
2079  const char* layer = "Notes";
2080  const char* width = "Line";
2081 
2082  if( aLine->GetLayer() == LAYER_WIRE )
2083  layer = "Wire";
2084  else if( aLine->GetLayer() == LAYER_BUS )
2085  layer = "Bus";
2086 
2087  m_out->Print( 0, "Wire %s %s", layer, width );
2088 
2089  // Write line style (width, type, color) only for non default values
2090  if( aLine->GetLayer() == LAYER_NOTES )
2091  {
2092  if( aLine->GetPenSize() != aLine->GetDefaultWidth() )
2093  m_out->Print( 0, " %s %d", T_WIDTH, aLine->GetLineSize() );
2094 
2095  if( aLine->GetLineStyle() != aLine->GetDefaultStyle() )
2096  m_out->Print( 0, " %s %s", T_STYLE, SCH_LINE::GetLineStyleName( aLine->GetLineStyle() ) );
2097 
2098  if( aLine->GetLineColor() != aLine->GetDefaultColor() )
2099  m_out->Print( 0, " %s",
2100  TO_UTF8( aLine->GetLineColor().ToColour().GetAsString( wxC2S_CSS_SYNTAX ) ) );
2101  }
2102 
2103  m_out->Print( 0, "\n" );
2104 
2105  m_out->Print( 0, "\t%-4d %-4d %-4d %-4d",
2106  aLine->GetStartPoint().x, aLine->GetStartPoint().y,
2107  aLine->GetEndPoint().x, aLine->GetEndPoint().y );
2108 
2109  m_out->Print( 0, "\n");
2110 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
COLOR4D GetLineColor() const
Definition: sch_line.cpp:241
wxPoint GetEndPoint() const
Definition: sch_line.h:80
SCH_LAYER_ID GetLayer() const
Function GetLayer returns the layer this item is on.
#define T_WIDTH
#define T_STYLE
wxPoint GetStartPoint() const
Definition: sch_line.h:76
#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
COLOR4D GetDefaultColor() const
Definition: sch_line.cpp:211
int GetLineStyle() const
Definition: sch_line.cpp:267
int GetDefaultWidth() const
Definition: sch_line.cpp:276
int GetLineSize() const
Definition: sch_line.h:110
static const char * GetLineStyleName(int aStyle)
Definition: sch_line.cpp:110
int GetDefaultStyle() const
Definition: sch_line.cpp:249
int GetPenSize() const override
Function GetPenSize virtual pure.
Definition: sch_line.cpp:294
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
void SCH_LEGACY_PLUGIN::saveNoConnect ( SCH_NO_CONNECT aNoConnect)
private

Definition at line 2051 of file sch_legacy_plugin.cpp.

References SCH_NO_CONNECT::GetPosition(), wxPoint::x, and wxPoint::y.

Referenced by GetError().

2052 {
2053  wxCHECK_RET( aNoConnect != NULL, "SCH_NOCONNECT* is NULL" );
2054 
2055  m_out->Print( 0, "NoConn ~ %-4d %-4d\n", aNoConnect->GetPosition().x,
2056  aNoConnect->GetPosition().y );
2057 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
wxPoint GetPosition() const override
Function GetPosition.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
void SCH_LEGACY_PLUGIN::saveSheet ( SCH_SHEET aSheet)
private

Definition at line 1967 of file sch_legacy_plugin.cpp.

References EscapedUTF8(), SCH_SHEET::GetFileName(), SCH_SHEET::GetFileNameSize(), SCH_SHEET::GetName(), SCH_SHEET::GetPins(), SCH_SHEET::GetPosition(), SCH_SHEET::GetSheetNameSize(), SCH_SHEET::GetSize(), EDA_ITEM::GetTimeStamp(), NET_BIDI, NET_INPUT, NET_OUTPUT, NET_TRISTATE, NET_UNSPECIFIED, SCH_SHEET_PIN::SHEET_BOTTOM_SIDE, SCH_SHEET_PIN::SHEET_LEFT_SIDE, SCH_SHEET_PIN::SHEET_RIGHT_SIDE, SCH_SHEET_PIN::SHEET_TOP_SIDE, wxPoint::x, and wxPoint::y.

Referenced by GetError().

1968 {
1969  wxCHECK_RET( aSheet != NULL, "SCH_SHEET* is NULL" );
1970 
1971  m_out->Print( 0, "$Sheet\n" );
1972  m_out->Print( 0, "S %-4d %-4d %-4d %-4d\n",
1973  aSheet->GetPosition().x, aSheet->GetPosition().y,
1974  aSheet->GetSize().x, aSheet->GetSize().y );
1975 
1976  m_out->Print( 0, "U %8.8lX\n", (unsigned long) aSheet->GetTimeStamp() );
1977 
1978  if( !aSheet->GetName().IsEmpty() )
1979  m_out->Print( 0, "F0 %s %d\n", EscapedUTF8( aSheet->GetName() ).c_str(),
1980  aSheet->GetSheetNameSize() );
1981 
1982  if( !aSheet->GetFileName().IsEmpty() )
1983  m_out->Print( 0, "F1 %s %d\n", EscapedUTF8( aSheet->GetFileName() ).c_str(),
1984  aSheet->GetFileNameSize() );
1985 
1986  for( const SCH_SHEET_PIN& pin : aSheet->GetPins() )
1987  {
1988  int type, side;
1989 
1990  if( pin.GetText().IsEmpty() )
1991  break;
1992 
1993  switch( pin.GetEdge() )
1994  {
1995  default:
1997  side = 'L';
1998  break;
1999 
2001  side = 'R';
2002  break;
2003 
2005  side = 'T';
2006  break;
2007 
2009  side = 'B';
2010  break;
2011  }
2012 
2013  switch( pin.GetShape() )
2014  {
2015  case NET_INPUT:
2016  type = 'I'; break;
2017 
2018  case NET_OUTPUT:
2019  type = 'O'; break;
2020 
2021  case NET_BIDI:
2022  type = 'B'; break;
2023 
2024  case NET_TRISTATE:
2025  type = 'T'; break;
2026 
2027  default:
2028  case NET_UNSPECIFIED:
2029  type = 'U'; break;
2030  }
2031 
2032  m_out->Print( 0, "F%d %s %c %c %-3d %-3d %-3d\n", pin.GetNumber(),
2033  EscapedUTF8( pin.GetText() ).c_str(), // supplies wrapping quotes
2034  type, side, pin.GetPosition().x, pin.GetPosition().y,
2035  pin.GetTextWidth() );
2036  }
2037 
2038  m_out->Print( 0, "$EndSheet\n" );
2039 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
SCH_SHEET_PINS & GetPins()
Definition: sch_sheet.h:334
int GetSheetNameSize() const
Definition: sch_sheet.h:271
std::string EscapedUTF8(const wxString &aString)
Function EscapedUTF8 returns an 8 bit UTF8 string given aString in unicode form.
Definition: string.cpp:137
int GetFileNameSize() const
Definition: sch_sheet.h:275
Define a sheet pin (label) used in sheets to create hierarchical schematics.
Definition: sch_sheet.h:61
wxPoint GetPosition() const override
Function GetPosition.
Definition: sch_sheet.h:547
wxString GetFileName(void) const
Return the filename corresponding to this sheet.
Definition: sch_sheet.cpp:646
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
wxString GetName() const
Definition: sch_sheet.h:267
wxSize GetSize()
Definition: sch_sheet.h:281
timestamp_t GetTimeStamp() const
Definition: base_struct.h:215
void SCH_LEGACY_PLUGIN::SaveSymbol ( const wxString &  aLibraryPath,
const LIB_PART aSymbol,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Write aSymbol to an existing library located at aLibraryPath.

If a LIB_PART by the same name already exists or there are any conflicting alias names, the new LIB_PART will silently overwrite any existing aliases and/or part becaue libraries cannot have duplicate alias names. It is the responsibility of the caller to check the library for conflicts before saving.

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several symbols.
aSymbolis what to store in the library. The library is refreshed and the caller must update any LIB_PART pointers that may have changed.
aPropertiesis an associative array that can be used to tell the saver how to save the symbol, 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 SCH_PLUGIN.

Definition at line 4172 of file sch_legacy_plugin.cpp.

4174 {
4175  m_props = aProperties;
4176 
4177  cacheLib( aLibraryPath );
4178 
4179  m_cache->AddSymbol( aSymbol );
4180 
4181  if( !isBuffering( aProperties ) )
4182  m_cache->Save( writeDocFile( aProperties ) );
4183 }
SCH_LEGACY_PLUGIN_CACHE * m_cache
bool isBuffering(const PROPERTIES *aProperties)
void cacheLib(const wxString &aLibraryFileName)
void Save(bool aSaveDocFile=true)
Save the entire library to file m_libFileName;.
void AddSymbol(const LIB_PART *aPart)
bool writeDocFile(const PROPERTIES *aProperties)
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
void SCH_LEGACY_PLUGIN::saveText ( SCH_TEXT aText)
private

Definition at line 2113 of file sch_legacy_plugin.cpp.

References SCH_TEXT::GetLabelSpinStyle(), SCH_ITEM::GetLayer(), SCH_TEXT::GetPosition(), SCH_TEXT::GetShape(), EDA_TEXT::GetText(), EDA_TEXT::GetTextWidth(), EDA_TEXT::GetThickness(), EDA_TEXT::IsItalic(), LAYER_GLOBLABEL, LAYER_HIERLABEL, LAYER_LOCLABEL, LAYER_NOTES, SCH_LEGACY_PLUGIN_CACHE::m_modHash, SheetLabelType, TO_UTF8, wxPoint::x, and wxPoint::y.

Referenced by GetError().

2114 {
2115  wxCHECK_RET( aText != NULL, "SCH_TEXT* is NULL" );
2116 
2117  const char* italics = "~";
2118  const char* textType = "Notes";
2119 
2120  if( aText->IsItalic() )
2121  italics = "Italic";
2122 
2123  wxString text = aText->GetText();
2124 
2125  SCH_LAYER_ID layer = aText->GetLayer();
2126 
2127  if( layer == LAYER_NOTES || layer == LAYER_LOCLABEL )
2128  {
2129  if( layer == LAYER_NOTES )
2130  {
2131  // For compatibility reasons, the text must be saved in only one text line
2132  // so replace all EOLs with \\n
2133  text.Replace( wxT( "\n" ), wxT( "\\n" ) );
2134 
2135  // Here we should have no CR or LF character in line
2136  // This is not always the case if a multiline text was copied (using a copy/paste
2137  // function) from a text that uses E.O.L characters that differs from the current
2138  // EOL format. This is mainly the case under Linux using LF symbol when copying
2139  // a text from Windows (using CRLF symbol) so we must just remove the extra CR left
2140  // (or LF left under MacOSX)
2141  for( unsigned ii = 0; ii < text.Len(); )
2142  {
2143  if( text[ii] == 0x0A || text[ii] == 0x0D )
2144  text.erase( ii, 1 );
2145  else
2146  ii++;
2147  }
2148  }
2149  else
2150  {
2151  textType = "Label";
2152  }
2153 
2154  m_out->Print( 0, "Text %s %-4d %-4d %-4d %-4d %s %d\n%s\n", textType,
2155  aText->GetPosition().x, aText->GetPosition().y,
2156  aText->GetLabelSpinStyle(),
2157  aText->GetTextWidth(),
2158  italics, aText->GetThickness(), TO_UTF8( text ) );
2159  }
2160  else if( layer == LAYER_GLOBLABEL || layer == LAYER_HIERLABEL )
2161  {
2162  textType = ( layer == LAYER_GLOBLABEL ) ? "GLabel" : "HLabel";
2163 
2164  m_out->Print( 0, "Text %s %-4d %-4d %-4d %-4d %s %s %d\n%s\n", textType,
2165  aText->GetPosition().x, aText->GetPosition().y,
2166  aText->GetLabelSpinStyle(),
2167  aText->GetTextWidth(),
2168  SheetLabelType[aText->GetShape()],
2169  italics,
2170  aText->GetThickness(), TO_UTF8( text ) );
2171  }
2172 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
PINSHEETLABEL_SHAPE GetShape() const
Definition: sch_text.h:118
bool IsItalic() const
Definition: eda_text.h:168
int GetTextWidth() const
Definition: eda_text.h:216
int GetLabelSpinStyle() const
Definition: sch_text.h:116
SCH_LAYER_ID GetLayer() const
Function GetLayer returns the layer this item is on.
const char * SheetLabelType[]
Definition: sch_text.cpp:58
int GetThickness() const
Function GetThickness returns pen width.
Definition: eda_text.h:152
#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
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:128
SCH_LAYER_ID
Eeschema drawing layers.
virtual wxPoint GetPosition() const override
Function GetPosition.
Definition: sch_text.h:192
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
void SCH_PLUGIN::SymbolLibOptions ( PROPERTIES aListToAppendTo) const
virtualinherited

Append supported SCH_PLUGIN options to aListToAppenTo along with internationalized descriptions.

Options are typically appended so that a derived SCH_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 Symbol*() functions in all derived SCH_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_SCH_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 SCH_PLUGIN, which has been avoided to date.

Definition at line 149 of file sch_plugin.cpp.

150 {
151  // disable all these in another couple of months, after everyone has seen them:
152 #if 1
153  (*aListToAppendTo)["debug_level"] = UTF8( _(
154  "Enable <b>debug</b> logging for Symbol*() functions in this SCH_PLUGIN."
155  ) );
156 
157  (*aListToAppendTo)["read_filter_regex"] = UTF8( _(
158  "Regular expression <b>symbol name</b> filter."
159  ) );
160 
161  (*aListToAppendTo)["enable_transaction_logging"] = UTF8( _(
162  "Enable transaction logging. The mere presence of this option turns on the "
163  "logging, no need to set a Value."
164  ) );
165 
166  (*aListToAppendTo)["username"] = UTF8( _(
167  "User name for <b>login</b> to some special library server."
168  ));
169 
170  (*aListToAppendTo)["password"] = UTF8( _(
171  "Password for <b>login</b> to some special library server."
172  ) );
173 #endif
174 
175 #if 1
176  // Suitable for a C++ to python SCH_PLUGIN::Footprint*() adapter, move it to the adapter
177  // if and when implemented.
178  (*aListToAppendTo)["python_symbol_plugin"] = UTF8( _(
179  "Enter the python symbol which implements the SCH_PLUGIN::Symbol*() functions."
180  ) );
181 #endif
182 }
Class UTF8 is an 8 bit string that is assuredly encoded in UTF8, and supplies special conversion supp...
Definition: utf8.h:73
bool SCH_LEGACY_PLUGIN::writeDocFile ( const PROPERTIES aProperties)
private

Definition at line 4070 of file sch_legacy_plugin.cpp.

References PropNoDocFile.

Referenced by GetError().

4071 {
4072  std::string propName( SCH_LEGACY_PLUGIN::PropNoDocFile );
4073 
4074  if( aProperties && aProperties->find( propName ) != aProperties->end() )
4075  return false;
4076 
4077  return true;
4078 }
static const char * PropNoDocFile
const char* PropBuffering

Member Data Documentation

SCH_LEGACY_PLUGIN_CACHE* SCH_LEGACY_PLUGIN::m_cache
protected

Definition at line 169 of file sch_legacy_plugin.h.

wxString SCH_LEGACY_PLUGIN::m_error
protected

For throwing exceptions or errors on partial schematic loads.

Definition at line 162 of file sch_legacy_plugin.h.

Referenced by GetError().

KIWAY* SCH_LEGACY_PLUGIN::m_kiway
protected

Required for path to legacy component libraries.

Definition at line 166 of file sch_legacy_plugin.h.

FILE_OUTPUTFORMATTER* SCH_LEGACY_PLUGIN::m_out
protected

The output formatter for saving SCH_SCREEN objects.

Definition at line 168 of file sch_legacy_plugin.h.

wxString SCH_LEGACY_PLUGIN::m_path
protected

Root project path for loading child sheets.

Definition at line 164 of file sch_legacy_plugin.h.

const PROPERTIES* SCH_LEGACY_PLUGIN::m_props
protected

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

Definition at line 165 of file sch_legacy_plugin.h.

SCH_SHEET* SCH_LEGACY_PLUGIN::m_rootSheet
protected

The root sheet of the schematic being loaded..

Definition at line 167 of file sch_legacy_plugin.h.

int SCH_LEGACY_PLUGIN::m_version
protected

Version of file being loaded.

Definition at line 159 of file sch_legacy_plugin.h.

const char * SCH_LEGACY_PLUGIN::PropBuffering = "buffering"
static

const char* PropBuffering

is a property used internally by the plugin to enable cache buffering which prevents the library file from being written every time the cache is changed. This is useful when writing the schematic cache library file or saving a library to a new file name.

Definition at line 83 of file sch_legacy_plugin.h.

Referenced by PART_LIB::EnableBuffering(), isBuffering(), PART_LIB::IsBuffering(), IsSymbolLibWritable(), SCH_EAGLE_PLUGIN::Load(), SYMBOL_LIB_TABLE_RESCUER::OpenRescueLibrary(), LIB_MANAGER::LIB_BUFFER::SaveBuffer(), and LIB_MANAGER::SaveLibrary().

const char * SCH_LEGACY_PLUGIN::PropNoDocFile = "no_doc_file"
static

const char* PropBuffering

is a property used internally by the plugin to disable writing the library documentation (.dcm) file when saving the library cache.

Definition at line 91 of file sch_legacy_plugin.h.

Referenced by PART_LIB::IsCache(), IsSymbolLibWritable(), PART_LIB::Save(), LIB_EDIT_FRAME::SaveOneSymbol(), PART_LIB::SetCache(), and writeDocFile().


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