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=nullptr, const PROPERTIES *aProperties=nullptr) 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 LoadContent (LINE_READER &aReader, SCH_SCREEN *aScreen, int version=EESCHEMA_VERSION)
 
void Save (const wxString &aFileName, SCH_SCREEN *aScreen, KIWAY *aKiway, const PROPERTIES *aProperties=nullptr) 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)
 
void Format (SELECTION *aSelection, OUTPUTFORMATTER *aFormatter)
 
size_t GetSymbolLibCount (const wxString &aLibraryPath, const PROPERTIES *aProperties=nullptr) override
 
void EnumerateSymbolLib (wxArrayString &aAliasNameList, const wxString &aLibraryPath, const PROPERTIES *aProperties=nullptr) 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=nullptr) 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=nullptr) 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=nullptr) override
 Write aSymbol to an existing library located at aLibraryPath. More...
 
void DeleteAlias (const wxString &aLibraryPath, const wxString &aAliasName, const PROPERTIES *aProperties=nullptr) override
 Delete aAliasName from the library at aLibraryPath. More...
 
void DeleteSymbol (const wxString &aLibraryPath, const wxString &aAliasName, const PROPERTIES *aProperties=nullptr) override
 Delete the entire LIB_PART associated with aAliasName from the library aLibraryPath. More...
 
void CreateSymbolLib (const wxString &aLibraryPath, const PROPERTIES *aProperties=nullptr) override
 Create a new empty symbol library at aLibraryPath. More...
 
bool DeleteSymbolLib (const wxString &aLibraryPath, const PROPERTIES *aProperties=nullptr) 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=nullptr) 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 Member Functions

static LIB_PARTParsePart (LINE_READER &aReader, int majorVersion=0, int minorVersion=0)
 
static void FormatPart (LIB_PART *aPart, OUTPUTFORMATTER &aFormatter)
 

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=nullptr)
 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...
 
std::stack< wxString > m_currentPath
 Stack to maintain nested sheet paths. More...
 
const PROPERTIESm_props
 Passed via Save() or Load(), no ownership, may be nullptr. More...
 
KIWAYm_kiway
 Required for path to legacy component libraries. More...
 
SCH_SHEETm_rootSheet
 The root sheet of the schematic being loaded.. More...
 
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 (LINE_READER &aReader, SCH_SCREEN *aScreen)
 
void loadPageSettings (LINE_READER &aReader, SCH_SCREEN *aScreen)
 
void loadFile (const wxString &aFileName, SCH_SCREEN *aScreen)
 
SCH_SHEETloadSheet (LINE_READER &aReader)
 
SCH_BITMAPloadBitmap (LINE_READER &aReader)
 
SCH_JUNCTIONloadJunction (LINE_READER &aReader)
 
SCH_NO_CONNECTloadNoConnect (LINE_READER &aReader)
 
SCH_LINEloadWire (LINE_READER &aReader)
 
SCH_BUS_ENTRY_BASEloadBusEntry (LINE_READER &aReader)
 
SCH_TEXTloadText (LINE_READER &aReader)
 
SCH_COMPONENTloadComponent (LINE_READER &aReader)
 
std::shared_ptr< BUS_ALIASloadBusAlias (LINE_READER &aReader, SCH_SCREEN *aScreen)
 
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 saveBusAlias (std::shared_ptr< BUS_ALIAS > aAlias)
 
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 64 of file sch_legacy_plugin.h.

Constructor & Destructor Documentation

◆ SCH_LEGACY_PLUGIN()

SCH_LEGACY_PLUGIN::SCH_LEGACY_PLUGIN ( )

Definition at line 560 of file sch_legacy_plugin.cpp.

561 {
562  init( NULL );
563 }
void init(KIWAY *aKiway, const PROPERTIES *aProperties=nullptr)
initialize PLUGIN like a constructor would.

References init().

◆ ~SCH_LEGACY_PLUGIN()

SCH_LEGACY_PLUGIN::~SCH_LEGACY_PLUGIN ( )
virtual

Definition at line 566 of file sch_legacy_plugin.cpp.

567 {
568  delete m_cache;
569 }
SCH_LEGACY_PLUGIN_CACHE * m_cache

References m_cache.

Member Function Documentation

◆ cacheLib()

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

Definition at line 4235 of file sch_legacy_plugin.cpp.

4236 {
4237  if( !m_cache || !m_cache->IsFile( aLibraryFileName ) || m_cache->IsFileChanged() )
4238  {
4239  // a spectacular episode in memory management:
4240  delete m_cache;
4241  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryFileName );
4242 
4243  // Because m_cache is rebuilt, increment PART_LIBS::s_modify_generation
4244  // to modify the hash value that indicate component to symbol links
4245  // must be updated.
4247 
4248  if( !isBuffering( m_props ) )
4249  m_cache->Load();
4250  }
4251 }
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 nullptr.

References isBuffering(), SCH_LEGACY_PLUGIN_CACHE::IsFile(), SCH_LEGACY_PLUGIN_CACHE::IsFileChanged(), SCH_LEGACY_PLUGIN_CACHE::Load(), m_cache, m_props, and PART_LIBS::s_modify_generation.

Referenced by DeleteAlias(), DeleteSymbol(), EnumerateSymbolLib(), GetSymbolLibCount(), LoadSymbol(), and SaveSymbol().

◆ CheckHeader()

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 4465 of file sch_legacy_plugin.cpp.

4466 {
4467  // Open file and check first line
4468  wxTextFile tempFile;
4469 
4470  tempFile.Open( aFileName );
4471  wxString firstline;
4472  // read the first line
4473  firstline = tempFile.GetFirstLine();
4474  tempFile.Close();
4475 
4476  return firstline.StartsWith( "EESchema" );
4477 }

◆ CreateSymbolLib()

void SCH_LEGACY_PLUGIN::CreateSymbolLib ( const wxString &  aLibraryPath,
const PROPERTIES aProperties = nullptr 
)
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 4398 of file sch_legacy_plugin.cpp.

4400 {
4401  if( wxFileExists( aLibraryPath ) )
4402  {
4404  _( "symbol library \"%s\" already exists, cannot create a new library" ),
4405  aLibraryPath.GetData() ) );
4406  }
4407 
4408  LOCALE_IO toggle;
4409 
4410  m_props = aProperties;
4411 
4412  delete m_cache;
4413  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryPath );
4414  m_cache->SetModified();
4415  m_cache->Save( writeDocFile( aProperties ) );
4416  m_cache->Load(); // update m_writable and m_mod_time
4417 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:177
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...
#define THROW_IO_ERROR(msg)
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;.
bool writeDocFile(const PROPERTIES *aProperties)
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be nullptr.

References Format(), SCH_LEGACY_PLUGIN_CACHE::Load(), m_cache, m_props, SCH_LEGACY_PLUGIN_CACHE::Save(), SCH_LEGACY_PLUGIN_CACHE::SetModified(), THROW_IO_ERROR, and writeDocFile().

◆ DeleteAlias()

void SCH_LEGACY_PLUGIN::DeleteAlias ( const wxString &  aLibraryPath,
const wxString &  aAliasName,
const PROPERTIES aProperties = nullptr 
)
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 4370 of file sch_legacy_plugin.cpp.

4372 {
4373  m_props = aProperties;
4374 
4375  cacheLib( aLibraryPath );
4376 
4377  m_cache->DeleteAlias( aAliasName );
4378 
4379  if( !isBuffering( aProperties ) )
4380  m_cache->Save( writeDocFile( aProperties ) );
4381 }
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 nullptr.

References cacheLib(), SCH_LEGACY_PLUGIN_CACHE::DeleteAlias(), isBuffering(), m_cache, m_props, SCH_LEGACY_PLUGIN_CACHE::Save(), and writeDocFile().

◆ DeleteSymbol()

void SCH_LEGACY_PLUGIN::DeleteSymbol ( const wxString &  aLibraryPath,
const wxString &  aAliasName,
const PROPERTIES aProperties = nullptr 
)
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 4384 of file sch_legacy_plugin.cpp.

4386 {
4387  m_props = aProperties;
4388 
4389  cacheLib( aLibraryPath );
4390 
4391  m_cache->DeleteSymbol( aAliasName );
4392 
4393  if( !isBuffering( aProperties ) )
4394  m_cache->Save( writeDocFile( aProperties ) );
4395 }
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 nullptr.

References cacheLib(), SCH_LEGACY_PLUGIN_CACHE::DeleteSymbol(), isBuffering(), m_cache, m_props, SCH_LEGACY_PLUGIN_CACHE::Save(), and writeDocFile().

◆ DeleteSymbolLib()

bool SCH_LEGACY_PLUGIN::DeleteSymbolLib ( const wxString &  aLibraryPath,
const PROPERTIES aProperties = nullptr 
)
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 4420 of file sch_legacy_plugin.cpp.

4422 {
4423  wxFileName fn = aLibraryPath;
4424 
4425  if( !fn.FileExists() )
4426  return false;
4427 
4428  // Some of the more elaborate wxRemoveFile() crap puts up its own wxLog dialog
4429  // we don't want that. we want bare metal portability with no UI here.
4430  if( wxRemove( aLibraryPath ) )
4431  {
4432  THROW_IO_ERROR( wxString::Format( _( "library \"%s\" cannot be deleted" ),
4433  aLibraryPath.GetData() ) );
4434  }
4435 
4436  if( m_cache && m_cache->IsFile( aLibraryPath ) )
4437  {
4438  delete m_cache;
4439  m_cache = 0;
4440  }
4441 
4442  return true;
4443 }
SCH_LEGACY_PLUGIN_CACHE * m_cache
#define THROW_IO_ERROR(msg)
bool IsFile(const wxString &aFullPathAndFileName) const
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205

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

◆ EnumerateSymbolLib() [1/2]

void SCH_LEGACY_PLUGIN::EnumerateSymbolLib ( wxArrayString &  aAliasNameList,
const wxString &  aLibraryPath,
const PROPERTIES aProperties = nullptr 
)
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 4294 of file sch_legacy_plugin.cpp.

4297 {
4298  LOCALE_IO toggle; // toggles on, then off, the C locale.
4299 
4300  m_props = aProperties;
4301 
4302  bool powerSymbolsOnly = ( aProperties &&
4303  aProperties->find( SYMBOL_LIB_TABLE::PropPowerSymsOnly ) != aProperties->end() );
4304  cacheLib( aLibraryPath );
4305 
4306  const LIB_ALIAS_MAP& aliases = m_cache->m_aliases;
4307 
4308  for( LIB_ALIAS_MAP::const_iterator it = aliases.begin(); it != aliases.end(); ++it )
4309  {
4310  if( !powerSymbolsOnly || it->second->GetPart()->IsPower() )
4311  aAliasNameList.Add( it->first );
4312  }
4313 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:177
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 nullptr.

References cacheLib(), SCH_LEGACY_PLUGIN_CACHE::m_aliases, m_cache, m_props, and SYMBOL_LIB_TABLE::PropPowerSymsOnly.

◆ EnumerateSymbolLib() [2/2]

void SCH_LEGACY_PLUGIN::EnumerateSymbolLib ( std::vector< LIB_ALIAS * > &  aAliasList,
const wxString &  aLibraryPath,
const PROPERTIES aProperties = nullptr 
)
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 4316 of file sch_legacy_plugin.cpp.

4319 {
4320  LOCALE_IO toggle; // toggles on, then off, the C locale.
4321 
4322  m_props = aProperties;
4323 
4324  bool powerSymbolsOnly = ( aProperties &&
4325  aProperties->find( SYMBOL_LIB_TABLE::PropPowerSymsOnly ) != aProperties->end() );
4326  cacheLib( aLibraryPath );
4327 
4328  const LIB_ALIAS_MAP& aliases = m_cache->m_aliases;
4329 
4330  for( LIB_ALIAS_MAP::const_iterator it = aliases.begin(); it != aliases.end(); ++it )
4331  {
4332  if( !powerSymbolsOnly || it->second->GetPart()->IsPower() )
4333  aAliasList.push_back( it->second );
4334  }
4335 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:177
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 nullptr.

References cacheLib(), SCH_LEGACY_PLUGIN_CACHE::m_aliases, m_cache, m_props, and SYMBOL_LIB_TABLE::PropPowerSymsOnly.

◆ Format() [1/2]

void SCH_LEGACY_PLUGIN::Format ( SCH_SCREEN aScreen)

Definition at line 1792 of file sch_legacy_plugin.cpp.

1793 {
1794  wxCHECK_RET( aScreen != NULL, "NULL SCH_SCREEN* object." );
1795  wxCHECK_RET( m_kiway != NULL, "NULL KIWAY* object." );
1796 
1797  // Write the header
1798  m_out->Print( 0, "%s %s %d\n", "EESchema", SCHEMATIC_HEAD_STRING, EESCHEMA_VERSION );
1799 
1800  // Write the project libraries.
1801  for( const PART_LIB& lib : *m_kiway->Prj().SchLibs() )
1802  m_out->Print( 0, "LIBS:%s\n", TO_UTF8( lib.GetName() ) );
1803 
1804  // This section is not used, but written for file compatibility
1805  m_out->Print( 0, "EELAYER %d %d\n", SCH_LAYER_ID_COUNT, 0 );
1806  m_out->Print( 0, "EELAYER END\n" );
1807 
1808  /* Write page info, ScreenNumber and NumberOfScreen; not very meaningful for
1809  * SheetNumber and Sheet Count in a complex hierarchy, but useful in
1810  * simple hierarchy and flat hierarchy. Used also to search the root
1811  * sheet ( ScreenNumber = 1 ) within the files
1812  */
1813  const TITLE_BLOCK& tb = aScreen->GetTitleBlock();
1814  const PAGE_INFO& page = aScreen->GetPageSettings();
1815 
1816  m_out->Print( 0, "$Descr %s %d %d%s\n", TO_UTF8( page.GetType() ),
1817  page.GetWidthMils(),
1818  page.GetHeightMils(),
1819  !page.IsCustom() && page.IsPortrait() ? " portrait" : "" );
1820  m_out->Print( 0, "encoding utf-8\n" );
1821  m_out->Print( 0, "Sheet %d %d\n", aScreen->m_ScreenNumber, aScreen->m_NumberOfScreens );
1822  m_out->Print( 0, "Title %s\n", EscapedUTF8( tb.GetTitle() ).c_str() );
1823  m_out->Print( 0, "Date %s\n", EscapedUTF8( tb.GetDate() ).c_str() );
1824  m_out->Print( 0, "Rev %s\n", EscapedUTF8( tb.GetRevision() ).c_str() );
1825  m_out->Print( 0, "Comp %s\n", EscapedUTF8( tb.GetCompany() ).c_str() );
1826  m_out->Print( 0, "Comment1 %s\n", EscapedUTF8( tb.GetComment1() ).c_str() );
1827  m_out->Print( 0, "Comment2 %s\n", EscapedUTF8( tb.GetComment2() ).c_str() );
1828  m_out->Print( 0, "Comment3 %s\n", EscapedUTF8( tb.GetComment3() ).c_str() );
1829  m_out->Print( 0, "Comment4 %s\n", EscapedUTF8( tb.GetComment4() ).c_str() );
1830  m_out->Print( 0, "$EndDescr\n" );
1831 
1832  for( auto alias : aScreen->GetBusAliases() )
1833  {
1834  saveBusAlias( alias );
1835  }
1836 
1837  for( SCH_ITEM* item = aScreen->GetDrawItems(); item; item = item->Next() )
1838  {
1839  switch( item->Type() )
1840  {
1841  case SCH_COMPONENT_T:
1842  saveComponent( static_cast< SCH_COMPONENT* >( item ) );
1843  break;
1844  case SCH_BITMAP_T:
1845  saveBitmap( static_cast< SCH_BITMAP* >( item ) );
1846  break;
1847  case SCH_SHEET_T:
1848  saveSheet( static_cast< SCH_SHEET* >( item ) );
1849  break;
1850  case SCH_JUNCTION_T:
1851  saveJunction( static_cast< SCH_JUNCTION* >( item ) );
1852  break;
1853  case SCH_NO_CONNECT_T:
1854  saveNoConnect( static_cast< SCH_NO_CONNECT* >( item ) );
1855  break;
1856  case SCH_BUS_WIRE_ENTRY_T:
1857  case SCH_BUS_BUS_ENTRY_T:
1858  saveBusEntry( static_cast< SCH_BUS_ENTRY_BASE* >( item ) );
1859  break;
1860  case SCH_LINE_T:
1861  saveLine( static_cast< SCH_LINE* >( item ) );
1862  break;
1863  case SCH_TEXT_T:
1864  case SCH_LABEL_T:
1865  case SCH_GLOBAL_LABEL_T:
1866  case SCH_HIER_LABEL_T:
1867  saveText( static_cast< SCH_TEXT* >( item ) );
1868  break;
1869  default:
1870  wxASSERT( "Unexpected schematic object type in SCH_LEGACY_PLUGIN::Format()" );
1871  }
1872  }
1873 
1874  m_out->Print( 0, "$EndSCHEMATC\n" );
1875 }
int m_ScreenNumber
Definition: base_screen.h:216
SCH_ITEM * Next() const
Definition: sch_item.h:153
void saveLine(SCH_LINE *aLine)
int GetHeightMils() const
Definition: page_info.h:140
VTBL_ENTRY PROJECT & Prj() const
Function Prj returns the PROJECT associated with this KIWAY.
Definition: kiway.cpp:163
const wxString & GetComment4() const
Definition: title_block.h:124
void saveText(SCH_TEXT *aText)
const TITLE_BLOCK & GetTitleBlock() const
Definition: sch_screen.h:129
const wxString & GetType() const
Definition: page_info.h:97
#define SCH_LAYER_ID_COUNT
void saveNoConnect(SCH_NO_CONNECT *aNoConnect)
bool IsCustom() const
Function IsCustom returns true if the type is Custom.
Definition: page_info.cpp:176
Class TITLE_BLOCK holds the information shown in the lower right corner of a plot,...
Definition: title_block.h:40
const PAGE_INFO & GetPageSettings() const
Definition: sch_screen.h:119
void saveSheet(SCH_SHEET *aSheet)
void saveJunction(SCH_JUNCTION *aJunction)
#define SCHEMATIC_HEAD_STRING
Definition: general.h:43
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:47
std::string EscapedUTF8(const wxString &aString)
Function EscapedUTF8 returns an 8 bit UTF8 string given aString in unicode form.
Definition: string.cpp:241
#define EESCHEMA_VERSION
Definition: general.h:42
const wxString & GetRevision() const
Definition: title_block.h:89
Class PAGE_INFO describes the page size and margins of a paper page on which to eventually print or p...
Definition: page_info.h:54
const wxString & GetCompany() const
Definition: title_block.h:99
const wxString & GetComment3() const
Definition: title_block.h:123
void saveBitmap(SCH_BITMAP *aBitmap)
void saveComponent(SCH_COMPONENT *aComponent)
const wxString & GetDate() const
Definition: title_block.h:79
const wxString & GetComment2() const
Definition: title_block.h:122
void saveBusAlias(std::shared_ptr< BUS_ALIAS > aAlias)
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
bool IsPortrait() const
Definition: page_info.h:121
const wxString & GetComment1() const
Definition: title_block.h:121
int m_NumberOfScreens
Definition: base_screen.h:217
const wxString & GetTitle() const
Definition: title_block.h:65
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...
Definition: sch_item.h:114
void saveBusEntry(SCH_BUS_ENTRY_BASE *aBusEntry)
std::unordered_set< std::shared_ptr< BUS_ALIAS > > GetBusAliases()
Returns a list of bus aliases defined in this screen.
Definition: sch_screen.h:466
int GetWidthMils() const
Definition: page_info.h:137
SCH_ITEM * GetDrawItems() const
Definition: sch_screen.h:153

References EESCHEMA_VERSION, EscapedUTF8(), SCH_SCREEN::GetBusAliases(), 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(), m_kiway, BASE_SCREEN::m_NumberOfScreens, m_out, BASE_SCREEN::m_ScreenNumber, SCH_ITEM::Next(), OUTPUTFORMATTER::Print(), KIWAY::Prj(), saveBitmap(), saveBusAlias(), saveBusEntry(), saveComponent(), saveJunction(), saveLine(), saveNoConnect(), saveSheet(), saveText(), SCH_BITMAP_T, SCH_BUS_BUS_ENTRY_T, SCH_BUS_WIRE_ENTRY_T, SCH_COMPONENT_T, SCH_GLOBAL_LABEL_T, SCH_HIER_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.

Referenced by SCH_EDITOR_CONTROL::doCopy(), and Save().

◆ Format() [2/2]

void SCH_LEGACY_PLUGIN::Format ( SELECTION aSelection,
OUTPUTFORMATTER aFormatter 
)

Definition at line 1878 of file sch_legacy_plugin.cpp.

1879 {
1880  m_out = aFormatter;
1881 
1882  for( unsigned i = 0; i < aSelection->GetSize(); ++i )
1883  {
1884  SCH_ITEM* item = (SCH_ITEM*) aSelection->GetItem( i );
1885 
1886  switch( item->Type() )
1887  {
1888  case SCH_COMPONENT_T:
1889  saveComponent( static_cast< SCH_COMPONENT* >( item ) );
1890  break;
1891  case SCH_BITMAP_T:
1892  saveBitmap( static_cast< SCH_BITMAP* >( item ) );
1893  break;
1894  case SCH_SHEET_T:
1895  saveSheet( static_cast< SCH_SHEET* >( item ) );
1896  break;
1897  case SCH_JUNCTION_T:
1898  saveJunction( static_cast< SCH_JUNCTION* >( item ) );
1899  break;
1900  case SCH_NO_CONNECT_T:
1901  saveNoConnect( static_cast< SCH_NO_CONNECT* >( item ) );
1902  break;
1903  case SCH_BUS_WIRE_ENTRY_T:
1904  case SCH_BUS_BUS_ENTRY_T:
1905  saveBusEntry( static_cast< SCH_BUS_ENTRY_BASE* >( item ) );
1906  break;
1907  case SCH_LINE_T:
1908  saveLine( static_cast< SCH_LINE* >( item ) );
1909  break;
1910  case SCH_TEXT_T:
1911  case SCH_LABEL_T:
1912  case SCH_GLOBAL_LABEL_T:
1913  case SCH_HIER_LABEL_T:
1914  saveText( static_cast< SCH_TEXT* >( item ) );
1915  break;
1916  default:
1917  wxASSERT( "Unexpected schematic object type in SCH_LEGACY_PLUGIN::Format()" );
1918  }
1919  }
1920 }
void saveLine(SCH_LINE *aLine)
void saveText(SCH_TEXT *aText)
void saveNoConnect(SCH_NO_CONNECT *aNoConnect)
void saveSheet(SCH_SHEET *aSheet)
void saveJunction(SCH_JUNCTION *aJunction)
void saveBitmap(SCH_BITMAP *aBitmap)
virtual KIGFX::VIEW_ITEM * GetItem(unsigned int aIdx) const override
Definition: selection.h:103
void saveComponent(SCH_COMPONENT *aComponent)
virtual unsigned int GetSize() const override
Function GetSize() Returns the number of stored items.
Definition: selection.h:98
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
size_t i
Definition: json11.cpp:597
Class SCH_ITEM is a base class for any item which can be embedded within the SCHEMATIC container clas...
Definition: sch_item.h:114
void saveBusEntry(SCH_BUS_ENTRY_BASE *aBusEntry)
KICAD_T Type() const
Function Type()
Definition: base_struct.h:204

References SELECTION::GetItem(), SELECTION::GetSize(), i, m_out, saveBitmap(), saveBusEntry(), saveComponent(), saveJunction(), saveLine(), saveNoConnect(), saveSheet(), saveText(), SCH_BITMAP_T, SCH_BUS_BUS_ENTRY_T, SCH_BUS_WIRE_ENTRY_T, SCH_COMPONENT_T, SCH_GLOBAL_LABEL_T, SCH_HIER_LABEL_T, SCH_JUNCTION_T, SCH_LABEL_T, SCH_LINE_T, SCH_NO_CONNECT_T, SCH_SHEET_T, SCH_TEXT_T, and EDA_ITEM::Type().

◆ FormatPart()

void SCH_LEGACY_PLUGIN::FormatPart ( LIB_PART aPart,
OUTPUTFORMATTER aFormatter 
)
static

Definition at line 4493 of file sch_legacy_plugin.cpp.

4494 {
4495  SCH_LEGACY_PLUGIN_CACHE::SaveSymbol( part, formatter );
4496 }
static void SaveSymbol(LIB_PART *aSymbol, OUTPUTFORMATTER &aFormatter)

References SCH_LEGACY_PLUGIN_CACHE::SaveSymbol().

Referenced by LIB_EDIT_TOOL::Copy(), and LIB_EDIT_FRAME::OnCopyCutPart().

◆ GetError()

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 140 of file sch_legacy_plugin.h.

140 { return m_error; }
wxString m_error
For throwing exceptions or errors on partial schematic loads.

References m_error.

◆ GetFileExtension()

const wxString SCH_LEGACY_PLUGIN::GetFileExtension ( ) const
inlineoverridevirtual

Returns the file extension for the SCH_PLUGIN.

Implements SCH_PLUGIN.

Definition at line 76 of file sch_legacy_plugin.h.

77  {
78  return wxT( "sch" );
79  }

◆ GetModifyHash()

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 4271 of file sch_legacy_plugin.cpp.

4272 {
4273  if( m_cache )
4274  return m_cache->GetModifyHash();
4275 
4276  // If the cache hasn't been loaded, it hasn't been modified.
4277  return 0;
4278 }
SCH_LEGACY_PLUGIN_CACHE * m_cache

References SCH_LEGACY_PLUGIN_CACHE::GetModifyHash(), and m_cache.

◆ GetName()

const wxString SCH_LEGACY_PLUGIN::GetName ( ) const
inlineoverridevirtual

Returns a brief hard coded name for this SCH_PLUGIN.

Implements SCH_PLUGIN.

Definition at line 71 of file sch_legacy_plugin.h.

72  {
73  return wxT( "Eeschema-Legacy" );
74  }

◆ GetSymbolLibCount()

size_t SCH_LEGACY_PLUGIN::GetSymbolLibCount ( const wxString &  aLibraryPath,
const PROPERTIES aProperties = nullptr 
)
overridevirtual

Reimplemented from SCH_PLUGIN.

Definition at line 4281 of file sch_legacy_plugin.cpp.

4283 {
4284  LOCALE_IO toggle;
4285 
4286  m_props = aProperties;
4287 
4288  cacheLib( aLibraryPath );
4289 
4290  return m_cache->m_aliases.size();
4291 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:177
SCH_LEGACY_PLUGIN_CACHE * m_cache
void cacheLib(const wxString &aLibraryFileName)
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be nullptr.

References cacheLib(), SCH_LEGACY_PLUGIN_CACHE::m_aliases, m_cache, and m_props.

◆ init()

void SCH_LEGACY_PLUGIN::init ( KIWAY aKiway,
const PROPERTIES aProperties = nullptr 
)
protected

initialize PLUGIN like a constructor would.

Definition at line 572 of file sch_legacy_plugin.cpp.

573 {
574  m_version = 0;
575  m_rootSheet = NULL;
576  m_props = aProperties;
577  m_kiway = aKiway;
578  m_cache = NULL;
579  m_out = NULL;
580 }
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.
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
KIWAY * m_kiway
Required for path to legacy component libraries.
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be nullptr.

References m_cache, m_kiway, m_out, m_props, m_rootSheet, and m_version.

Referenced by Load(), Save(), and SCH_LEGACY_PLUGIN().

◆ isBuffering()

bool SCH_LEGACY_PLUGIN::isBuffering ( const PROPERTIES aProperties)
private

Definition at line 4265 of file sch_legacy_plugin.cpp.

4266 {
4267  return ( aProperties && aProperties->Exists( SCH_LEGACY_PLUGIN::PropBuffering ) );
4268 }
bool Exists(const std::string &aProperty) const
Definition: properties.h:44
static const char * PropBuffering
const char* PropBuffering

References PROPERTIES::Exists(), and PropBuffering.

Referenced by cacheLib(), DeleteAlias(), DeleteSymbol(), and SaveSymbol().

◆ IsSymbolLibWritable()

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 4480 of file sch_legacy_plugin.cpp.

4481 {
4482  return wxFileName::IsFileWritable( aLibraryPath );
4483 }

◆ Load()

SCH_SHEET * SCH_LEGACY_PLUGIN::Load ( const wxString &  aFileName,
KIWAY aKiway,
SCH_SHEET aAppendToMe = nullptr,
const PROPERTIES aProperties = nullptr 
)
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 583 of file sch_legacy_plugin.cpp.

585 {
586  wxASSERT( !aFileName || aKiway != NULL );
587 
588  LOCALE_IO toggle; // toggles on, then off, the C locale.
589  SCH_SHEET* sheet;
590 
591  wxFileName fn = aFileName;
592 
593  // Unfortunately child sheet file names the legacy schematic file format are not fully
594  // qualified and are always appended to the project path. The aFileName attribute must
595  // always be an absolute path so the project path can be used for load child sheet files.
596  wxASSERT( fn.IsAbsolute() );
597 
598  if( aAppendToMe )
599  {
600  wxLogTrace( traceSchLegacyPlugin, "Append \"%s\" to sheet \"%s\".",
601  aFileName, aAppendToMe->GetFileName() );
602 
603  wxFileName normedFn = aAppendToMe->GetFileName();
604 
605  if( !normedFn.IsAbsolute() )
606  {
607  if( aFileName.Right( normedFn.GetFullPath().Length() ) == normedFn.GetFullPath() )
608  m_path = aFileName.Left( aFileName.Length() - normedFn.GetFullPath().Length() );
609  }
610 
611  if( m_path.IsEmpty() )
612  m_path = aKiway->Prj().GetProjectPath();
613 
614  wxLogTrace( traceSchLegacyPlugin, "Normalized append path \"%s\".", m_path );
615  }
616  else
617  {
618  m_path = aKiway->Prj().GetProjectPath();
619  }
620 
621  m_currentPath.push( m_path );
622  init( aKiway, aProperties );
623 
624  if( aAppendToMe == NULL )
625  {
626  // Clean up any allocated memory if an exception occurs loading the schematic.
627  std::unique_ptr< SCH_SHEET > newSheet( new SCH_SHEET );
628  newSheet->SetFileName( aFileName );
629  m_rootSheet = newSheet.get();
630  loadHierarchy( newSheet.get() );
631 
632  // If we got here, the schematic loaded successfully.
633  sheet = newSheet.release();
634  }
635  else
636  {
637  m_rootSheet = aAppendToMe->GetRootSheet();
638  wxASSERT( m_rootSheet != NULL );
639  sheet = aAppendToMe;
640  loadHierarchy( sheet );
641  }
642 
643  wxASSERT( m_currentPath.size() == 1 ); // only the project path should remain
644 
645  return sheet;
646 }
void init(KIWAY *aKiway, const PROPERTIES *aProperties=nullptr)
initialize PLUGIN like a constructor would.
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:177
VTBL_ENTRY PROJECT & Prj() const
Function Prj returns the PROJECT associated with this KIWAY.
Definition: kiway.cpp:163
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
VTBL_ENTRY const wxString GetProjectPath() const
Function GetProjectPath returns the full path of the project.
Definition: project.cpp:102
wxString m_path
Root project path for loading child sheets.
void loadHierarchy(SCH_SHEET *aSheet)
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:201
wxString GetFileName(void) const
Return the filename corresponding to this sheet.
Definition: sch_sheet.cpp:627
std::stack< wxString > m_currentPath
Stack to maintain nested sheet paths.

References SCH_SHEET::GetFileName(), PROJECT::GetProjectPath(), SCH_SHEET::GetRootSheet(), init(), loadHierarchy(), m_currentPath, m_path, m_rootSheet, KIWAY::Prj(), and traceSchLegacyPlugin.

◆ loadBitmap()

SCH_BITMAP * SCH_LEGACY_PLUGIN::loadBitmap ( LINE_READER aReader)
private

Definition at line 1073 of file sch_legacy_plugin.cpp.

1074 {
1075  std::unique_ptr< SCH_BITMAP > bitmap( new SCH_BITMAP );
1076 
1077  const char* line = aReader.Line();
1078 
1079  wxCHECK( strCompare( "$Bitmap", line, &line ), NULL );
1080 
1081  line = aReader.ReadLine();
1082 
1083  while( line != NULL )
1084  {
1085  if( strCompare( "Pos", line, &line ) )
1086  {
1087  wxPoint position;
1088 
1089  position.x = parseInt( aReader, line, &line );
1090  position.y = parseInt( aReader, line, &line );
1091  bitmap->SetPosition( position );
1092  }
1093  else if( strCompare( "Scale", line, &line ) )
1094  {
1095  auto scalefactor = parseDouble( aReader, line, &line );
1096 
1097  // Prevent scalefactor values that cannot be displayed.
1098  // In the case of a bad value, we accept that the image might be mis-scaled
1099  // rather than removing the full image. Users can then edit the scale factor in
1100  // Eeschema to the appropriate value
1101  if( !std::isnormal( scalefactor ) )
1102  scalefactor = 1.0;
1103 
1104  bitmap->GetImage()->SetScale( scalefactor );
1105  }
1106  else if( strCompare( "Data", line, &line ) )
1107  {
1108  wxMemoryOutputStream stream;
1109 
1110  while( line )
1111  {
1112  if( !aReader.ReadLine() )
1113  SCH_PARSE_ERROR( _( "Unexpected end of file" ), aReader, line );
1114 
1115  line = aReader.Line();
1116 
1117  if( strCompare( "EndData", line ) )
1118  {
1119  // all the PNG date is read.
1120  // We expect here m_image and m_bitmap are void
1121  wxImage* image = new wxImage();
1122  wxMemoryInputStream istream( stream );
1123  image->LoadFile( istream, wxBITMAP_TYPE_PNG );
1124  bitmap->GetImage()->SetImage( image );
1125  bitmap->GetImage()->SetBitmap( new wxBitmap( *image ) );
1126  break;
1127  }
1128 
1129  // Read PNG data, stored in hexadecimal,
1130  // each byte = 2 hexadecimal digits and a space between 2 bytes
1131  // and put it in memory stream buffer
1132  int len = strlen( line );
1133 
1134  for( ; len > 0 && !isspace( *line ); len -= 3, line += 3 )
1135  {
1136  int value = 0;
1137 
1138  if( sscanf( line, "%X", &value ) == 1 )
1139  stream.PutC( (char) value );
1140  else
1141  THROW_IO_ERROR( "invalid PNG data" );
1142  }
1143  }
1144 
1145  if( line == NULL )
1146  THROW_IO_ERROR( _( "unexpected end of file" ) );
1147  }
1148  else if( strCompare( "$EndBitmap", line ) )
1149  return bitmap.release();
1150 
1151  line = aReader.ReadLine();
1152  }
1153 
1154  THROW_IO_ERROR( _( "unexpected end of file" ) );
1155 }
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
static double parseDouble(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 ...
#define THROW_IO_ERROR(msg)
static int parseInt(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...
Object to handle a bitmap image that can be inserted in a schematic.
Definition: sch_bitmap.h:42
virtual char * ReadLine()=0
Function ReadLine reads a line of text into the buffer and increments the line number counter.
#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...

References LINE_READER::Line(), parseDouble(), parseInt(), LINE_READER::ReadLine(), SCH_PARSE_ERROR, strCompare(), and THROW_IO_ERROR.

Referenced by LoadContent().

◆ loadBusAlias()

std::shared_ptr< BUS_ALIAS > SCH_LEGACY_PLUGIN::loadBusAlias ( LINE_READER aReader,
SCH_SCREEN aScreen 
)
private

Definition at line 1742 of file sch_legacy_plugin.cpp.

1744 {
1745  auto busAlias = std::make_shared< BUS_ALIAS >( aScreen );
1746  const char* line = aReader.Line();
1747 
1748  wxCHECK( strCompare( "BusAlias", line, &line ), NULL );
1749 
1750  wxString buf;
1751  parseUnquotedString( buf, aReader, line, &line );
1752  busAlias->SetName( buf );
1753 
1754  while( *line != '\0' )
1755  {
1756  buf.clear();
1757  parseUnquotedString( buf, aReader, line, &line, true );
1758  if( buf.Len() > 0 )
1759  {
1760  busAlias->AddMember( buf );
1761  }
1762  }
1763 
1764  return busAlias;
1765 }
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
static void parseUnquotedString(wxString &aString, 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.
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...

References LINE_READER::Line(), parseUnquotedString(), and strCompare().

Referenced by LoadContent().

◆ loadBusEntry()

SCH_BUS_ENTRY_BASE * SCH_LEGACY_PLUGIN::loadBusEntry ( LINE_READER aReader)
private

Definition at line 1300 of file sch_legacy_plugin.cpp.

1301 {
1302  const char* line = aReader.Line();
1303 
1304  wxCHECK( strCompare( "Entry", line, &line ), NULL );
1305 
1306  std::unique_ptr< SCH_BUS_ENTRY_BASE > busEntry;
1307 
1308  if( strCompare( "Wire", line, &line ) )
1309  {
1310  busEntry.reset( new SCH_BUS_WIRE_ENTRY );
1311 
1312  if( !strCompare( "Line", line, &line ) )
1313  SCH_PARSE_ERROR( "invalid bus entry definition expected 'Line'", aReader, line );
1314  }
1315  else if( strCompare( "Bus", line, &line ) )
1316  {
1317  busEntry.reset( new SCH_BUS_BUS_ENTRY );
1318 
1319  if( !strCompare( "Bus", line, &line ) )
1320  SCH_PARSE_ERROR( "invalid bus entry definition expected 'Bus'", aReader, line );
1321  }
1322  else
1323  SCH_PARSE_ERROR( "invalid bus entry type", aReader, line );
1324 
1325  line = aReader.ReadLine();
1326 
1327  wxPoint pos;
1328  wxSize size;
1329 
1330  pos.x = parseInt( aReader, line, &line );
1331  pos.y = parseInt( aReader, line, &line );
1332  size.x = parseInt( aReader, line, &line );
1333  size.y = parseInt( aReader, line, &line );
1334 
1335  size.x -= pos.x;
1336  size.y -= pos.y;
1337 
1338  busEntry->SetPosition( pos );
1339  busEntry->SetSize( size );
1340 
1341  return busEntry.release();
1342 }
Class for a bus to bus entry.
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
static int parseInt(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...
virtual char * ReadLine()=0
Function ReadLine reads a line of text into the buffer and increments the line number counter.
#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.

References LINE_READER::Line(), parseInt(), LINE_READER::ReadLine(), SCH_PARSE_ERROR, and strCompare().

Referenced by LoadContent().

◆ loadComponent()

SCH_COMPONENT * SCH_LEGACY_PLUGIN::loadComponent ( LINE_READER aReader)
private

Definition at line 1445 of file sch_legacy_plugin.cpp.

1446 {
1447  const char* line = aReader.Line();
1448 
1449  wxCHECK( strCompare( "$Comp", line, &line ), NULL );
1450 
1451  std::unique_ptr< SCH_COMPONENT > component( new SCH_COMPONENT() );
1452 
1453  line = aReader.ReadLine();
1454 
1455  while( line != NULL )
1456  {
1457  if( strCompare( "L", line, &line ) )
1458  {
1459  wxString libName;
1460  size_t pos = 2; // "X" plus ' ' space character.
1461  wxString utf8Line = wxString::FromUTF8( line );
1462  wxStringTokenizer tokens( utf8Line, " \r\n\t" );
1463 
1464  if( tokens.CountTokens() < 2 )
1465  THROW_PARSE_ERROR( "invalid symbol library definition", aReader.GetSource(),
1466  aReader.Line(), aReader.LineNumber(), pos );
1467 
1468  libName = tokens.GetNextToken();
1469  libName.Replace( "~", " " );
1470 
1471  LIB_ID libId;
1472 
1473  // Prior to schematic version 4, library IDs did not have a library nickname so
1474  // parsing the symbol name with LIB_ID::Parse() would break symbol library links
1475  // that contained '/' and ':' characters.
1476  if( m_version > 3 )
1477  libId.Parse( libName, LIB_ID::ID_SCH, true );
1478  else
1479  libId.SetLibItemName( libName, false );
1480 
1481  component->SetLibId( libId );
1482 
1483  wxString refDesignator = tokens.GetNextToken();
1484 
1485  refDesignator.Replace( "~", " " );
1486 
1487  wxString prefix = refDesignator;
1488 
1489  while( prefix.Length() )
1490  {
1491  if( ( prefix.Last() < '0' || prefix.Last() > '9') && prefix.Last() != '?' )
1492  break;
1493 
1494  prefix.RemoveLast();
1495  }
1496 
1497  // Avoid a prefix containing trailing/leading spaces
1498  prefix.Trim( true );
1499  prefix.Trim( false );
1500 
1501  if( prefix.IsEmpty() )
1502  component->SetPrefix( wxString( "U" ) );
1503  else
1504  component->SetPrefix( prefix );
1505  }
1506  else if( strCompare( "U", line, &line ) )
1507  {
1508  // This fixes a potentially buggy files caused by unit being set to zero which
1509  // causes netlist issues. See https://bugs.launchpad.net/kicad/+bug/1677282.
1510  int unit = parseInt( aReader, line, &line );
1511 
1512  if( unit == 0 )
1513  {
1514  unit = 1;
1515 
1516  // Set the file as modified so the user can be warned.
1517  if( m_rootSheet && m_rootSheet->GetScreen() )
1519  }
1520 
1521  component->SetUnit( unit );
1522 
1523  // Same can also happen with the convert parameter
1524  int convert = parseInt( aReader, line, &line );
1525 
1526  if( convert == 0 )
1527  {
1528  convert = 1;
1529 
1530  // Set the file as modified so the user can be warned.
1531  if( m_rootSheet && m_rootSheet->GetScreen() )
1533  }
1534 
1535  component->SetConvert( convert );
1536 
1537  component->SetTimeStamp( parseHex( aReader, line, &line ) );
1538  }
1539  else if( strCompare( "P", line, &line ) )
1540  {
1541  wxPoint pos;
1542 
1543  pos.x = parseInt( aReader, line, &line );
1544  pos.y = parseInt( aReader, line, &line );
1545  component->SetPosition( pos );
1546  }
1547  else if( strCompare( "AR", line, &line ) )
1548  {
1549  const char* strCompare = "Path=";
1550  int len = strlen( strCompare );
1551 
1552  if( strncasecmp( strCompare, line, len ) != 0 )
1553  SCH_PARSE_ERROR( "missing 'Path=' token", aReader, line );
1554 
1555  line += len;
1556  wxString path, reference, unit;
1557 
1558  parseQuotedString( path, aReader, line, &line );
1559 
1560  strCompare = "Ref=";
1561  len = strlen( strCompare );
1562 
1563  if( strncasecmp( strCompare, line, len ) != 0 )
1564  SCH_PARSE_ERROR( "missing 'Ref=' token", aReader, line );
1565 
1566  line+= len;
1567  parseQuotedString( reference, aReader, line, &line );
1568 
1569  strCompare = "Part=";
1570  len = strlen( strCompare );
1571 
1572  if( strncasecmp( strCompare, line, len ) != 0 )
1573  SCH_PARSE_ERROR( "missing 'Part=' token", aReader, line );
1574 
1575  line+= len;
1576  parseQuotedString( unit, aReader, line, &line );
1577 
1578  long tmp;
1579 
1580  if( !unit.ToLong( &tmp, 10 ) )
1581  SCH_PARSE_ERROR( "expected integer value", aReader, line );
1582 
1583  if( tmp < 0 || tmp > MAX_UNIT_COUNT_PER_PACKAGE )
1584  SCH_PARSE_ERROR( "unit value out of range", aReader, line );
1585 
1586  component->AddHierarchicalReference( path, reference, (int)tmp );
1587  component->GetField( REFERENCE )->SetText( reference );
1588 
1589  }
1590  else if( strCompare( "F", line, &line ) )
1591  {
1592  int index = parseInt( aReader, line, &line );
1593 
1594  wxString text, name;
1595 
1596  parseQuotedString( text, aReader, line, &line, true );
1597 
1598  char orientation = parseChar( aReader, line, &line );
1599  wxPoint pos;
1600  pos.x = parseInt( aReader, line, &line );
1601  pos.y = parseInt( aReader, line, &line );
1602  int size = parseInt( aReader, line, &line );
1603  int attributes = parseHex( aReader, line, &line );
1604 
1605  if( index >= component->GetFieldCount() )
1606  {
1607  // The first MANDATOR_FIELDS _must_ be constructed within
1608  // the SCH_COMPONENT constructor. This assert is simply here
1609  // to guard against a change in that constructor.
1610  wxASSERT( component->GetFieldCount() >= MANDATORY_FIELDS );
1611 
1612  // Ignore the _supplied_ fieldNdx. It is not important anymore
1613  // if within the user defined fields region (i.e. >= MANDATORY_FIELDS).
1614  // We freely renumber the index to fit the next available field slot.
1615  index = component->GetFieldCount(); // new has this index after insertion
1616 
1617  SCH_FIELD field( wxPoint( 0, 0 ), -1, component.get(), name );
1618  component->AddField( field );
1619  }
1620 
1621  // Prior to version 2 of the schematic file format, none of the following existed.
1622  if( m_version > 1 )
1623  {
1624  wxString textAttrs;
1625  char hjustify = parseChar( aReader, line, &line );
1626 
1627  parseUnquotedString( textAttrs, aReader, line, &line );
1628 
1629  // The name of the field is optional.
1630  parseQuotedString( name, aReader, line, &line, true );
1631 
1632  if( hjustify == 'L' )
1633  component->GetField( index )->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT );
1634  else if( hjustify == 'R' )
1635  component->GetField( index )->SetHorizJustify( GR_TEXT_HJUSTIFY_RIGHT );
1636  else if( hjustify != 'C' )
1637  SCH_PARSE_ERROR( "component field text horizontal justification must be "
1638  "L, R, or C", aReader, line );
1639 
1640  // We are guaranteed to have a least one character here for older file formats
1641  // otherwise an exception would have been raised..
1642  if( textAttrs[0] == 'T' )
1643  component->GetField( index )->SetVertJustify( GR_TEXT_VJUSTIFY_TOP );
1644  else if( textAttrs[0] == 'B' )
1645  component->GetField( index )->SetVertJustify( GR_TEXT_VJUSTIFY_BOTTOM );
1646  else if( textAttrs[0] != 'C' )
1647  SCH_PARSE_ERROR( "component field text vertical justification must be "
1648  "B, T, or C", aReader, line );
1649 
1650  // Newer file formats include the bold and italics text attribute.
1651  if( textAttrs.Length() > 1 )
1652  {
1653  if( textAttrs.Length() != 3 )
1654  SCH_PARSE_ERROR( _( "component field text attributes must be 3 characters wide" ),
1655  aReader, line );
1656 
1657  if( textAttrs[1] == 'I' )
1658  component->GetField( index )->SetItalic( true );
1659  else if( textAttrs[1] != 'N' )
1660  SCH_PARSE_ERROR( "component field text italics indicator must be I or N",
1661  aReader, line );
1662 
1663  if( textAttrs[2] == 'B' )
1664  component->GetField( index )->SetBold( true );
1665  else if( textAttrs[2] != 'N' )
1666  SCH_PARSE_ERROR( "component field text bold indicator must be B or N",
1667  aReader, line );
1668  }
1669  }
1670 
1671  component->GetField( index )->SetText( text );
1672  component->GetField( index )->SetTextPos( pos );
1673  component->GetField( index )->SetVisible( !attributes );
1674  component->GetField( index )->SetTextSize( wxSize( size, size ) );
1675 
1676  if( orientation == 'H' )
1677  component->GetField( index )->SetTextAngle( TEXT_ANGLE_HORIZ );
1678  else if( orientation == 'V' )
1679  component->GetField( index )->SetTextAngle( TEXT_ANGLE_VERT );
1680  else
1681  SCH_PARSE_ERROR( "component field orientation must be H or V",
1682  aReader, line );
1683 
1684  if( name.IsEmpty() )
1686 
1687  component->GetField( index )->SetName( name );
1688  }
1689  else if( strCompare( "$EndComp", line ) )
1690  {
1691  // Ensure all flags (some are set by previous initializations) are reset:
1692  component->ClearFlags();
1693  return component.release();
1694  }
1695  else
1696  {
1697  // There are two lines that begin with a tab or spaces that includes a line with the
1698  // redundant position information and the transform matrix settings.
1699 
1700  // Parse the redundant position information just the same to check for formatting
1701  // errors.
1702  parseInt( aReader, line, &line ); // Always 1.
1703  parseInt( aReader, line, &line ); // The X coordinate.
1704  parseInt( aReader, line, &line ); // The Y coordinate.
1705 
1706  line = aReader.ReadLine();
1707 
1708  TRANSFORM transform;
1709 
1710  transform.x1 = parseInt( aReader, line, &line );
1711 
1712  if( transform.x1 < -1 || transform.x1 > 1 )
1713  SCH_PARSE_ERROR( "invalid component X1 transform value", aReader, line );
1714 
1715  transform.y1 = parseInt( aReader, line, &line );
1716 
1717  if( transform.y1 < -1 || transform.y1 > 1 )
1718  SCH_PARSE_ERROR( "invalid component Y1 transform value", aReader, line );
1719 
1720  transform.x2 = parseInt( aReader, line, &line );
1721 
1722  if( transform.x2 < -1 || transform.x2 > 1 )
1723  SCH_PARSE_ERROR( "invalid component X2 transform value", aReader, line );
1724 
1725  transform.y2 = parseInt( aReader, line, &line );
1726 
1727  if( transform.y2 < -1 || transform.y2 > 1 )
1728  SCH_PARSE_ERROR( "invalid component Y2 transform value", aReader, line );
1729 
1730  component->SetTransform( transform );
1731  }
1732 
1733  line = aReader.ReadLine();
1734  }
1735 
1736  SCH_PARSE_ERROR( "invalid component line", aReader, line );
1737 
1738  return NULL; // Prevents compiler warning. Should never get here.
1739 }
#define TEXT_ANGLE_HORIZ
Class SCH_FIELD instances are attached to a component and provide a place for the component's value,...
Definition: sch_field.h:52
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
int y2
Definition: transform.h:51
virtual const wxString & GetSource() const
Function GetSource returns the name of the source of the lines in an abstract sense.
Definition: richio.h:130
#define TEXT_ANGLE_VERT
static uint32_t parseHex(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...
The first 4 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors.
int x2
Definition: transform.h:50
static void parseQuotedString(wxString &aString, 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.
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...
#define MAX_UNIT_COUNT_PER_PACKAGE
The maximum number of units per package.
Definition: eeschema_id.h:44
static void parseUnquotedString(wxString &aString, 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.
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:268
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
virtual unsigned LineNumber() const
Function Line Number returns the line number of the last line read from this LINE_READER.
Definition: richio.h:159
static char parseChar(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.
#define THROW_PARSE_ERROR(aProblem, aSource, aInputLine, aLineNumber, aByteIndex)
static int parseInt(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 SetLibItemName(const UTF8 &aLibItemName, bool aTestForRev=true)
Override the library item name portion of the LIB_ID to aLibItemName.
Definition: lib_id.cpp:206
virtual char * ReadLine()=0
Function ReadLine reads a line of text into the buffer and increments the line number counter.
#define SCH_PARSE_ERROR(text, reader, pos)
const char * name
Definition: DXF_plotter.cpp:61
Class SCH_COMPONENT describes a real schematic component.
Definition: sch_component.h:73
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
int Parse(const UTF8 &aId, LIB_ID_TYPE aType, bool aFix=false)
Parse LIB_ID with the information from aId.
Definition: lib_id.cpp:122

References TEMPLATE_FIELDNAME::GetDefaultFieldName(), SCH_SHEET::GetScreen(), LINE_READER::GetSource(), GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_HJUSTIFY_RIGHT, GR_TEXT_VJUSTIFY_BOTTOM, GR_TEXT_VJUSTIFY_TOP, LIB_ID::ID_SCH, LINE_READER::Line(), LINE_READER::LineNumber(), m_rootSheet, m_version, MANDATORY_FIELDS, MAX_UNIT_COUNT_PER_PACKAGE, name, LIB_ID::Parse(), parseChar(), parseHex(), parseInt(), parseQuotedString(), parseUnquotedString(), LINE_READER::ReadLine(), REFERENCE, SCH_PARSE_ERROR, LIB_ID::SetLibItemName(), BASE_SCREEN::SetModify(), strCompare(), TEXT_ANGLE_HORIZ, TEXT_ANGLE_VERT, THROW_PARSE_ERROR, TRANSFORM::x1, TRANSFORM::x2, TRANSFORM::y1, and TRANSFORM::y2.

Referenced by LoadContent().

◆ LoadContent()

void SCH_LEGACY_PLUGIN::LoadContent ( LINE_READER aReader,
SCH_SCREEN aScreen,
int  version = EESCHEMA_VERSION 
)

Definition at line 755 of file sch_legacy_plugin.cpp.

756 {
757  m_version = version;
758 
759  while( aReader.ReadLine() )
760  {
761  char* line = aReader.Line();
762 
763  while( *line == ' ' )
764  line++;
765 
766  // Either an object will be loaded properly or the file load will fail and raise
767  // an exception.
768  if( strCompare( "$Descr", line ) )
769  loadPageSettings( aReader, aScreen );
770  else if( strCompare( "$Comp", line ) )
771  aScreen->Append( loadComponent( aReader ) );
772  else if( strCompare( "$Sheet", line ) )
773  aScreen->Append( loadSheet( aReader ) );
774  else if( strCompare( "$Bitmap", line ) )
775  aScreen->Append( loadBitmap( aReader ) );
776  else if( strCompare( "Connection", line ) )
777  aScreen->Append( loadJunction( aReader ) );
778  else if( strCompare( "NoConn", line ) )
779  aScreen->Append( loadNoConnect( aReader ) );
780  else if( strCompare( "Wire", line ) )
781  aScreen->Append( loadWire( aReader ) );
782  else if( strCompare( "Entry", line ) )
783  aScreen->Append( loadBusEntry( aReader ) );
784  else if( strCompare( "Text", line ) )
785  aScreen->Append( loadText( aReader ) );
786  else if( strCompare( "BusAlias", line ) )
787  aScreen->AddBusAlias( loadBusAlias( aReader, aScreen ) );
788  else if( strCompare( "$EndSCHEMATC", line ) )
789  return;
790  }
791 }
SCH_SHEET * loadSheet(LINE_READER &aReader)
SCH_JUNCTION * loadJunction(LINE_READER &aReader)
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
SCH_COMPONENT * loadComponent(LINE_READER &aReader)
SCH_BUS_ENTRY_BASE * loadBusEntry(LINE_READER &aReader)
int m_version
Version of file being loaded.
void loadPageSettings(LINE_READER &aReader, SCH_SCREEN *aScreen)
SCH_BITMAP * loadBitmap(LINE_READER &aReader)
virtual char * ReadLine()=0
Function ReadLine reads a line of text into the buffer and increments the line number counter.
void AddBusAlias(std::shared_ptr< BUS_ALIAS > aAlias)
Adds a bus alias definition (and transfers ownership of the pointer)
Definition: sch_screen.cpp:908
void Append(SCH_ITEM *aItem)
Definition: sch_screen.h:155
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 * loadNoConnect(LINE_READER &aReader)
SCH_LINE * loadWire(LINE_READER &aReader)
SCH_TEXT * loadText(LINE_READER &aReader)
std::shared_ptr< BUS_ALIAS > loadBusAlias(LINE_READER &aReader, SCH_SCREEN *aScreen)

References SCH_SCREEN::AddBusAlias(), SCH_SCREEN::Append(), LINE_READER::Line(), loadBitmap(), loadBusAlias(), loadBusEntry(), loadComponent(), loadJunction(), loadNoConnect(), loadPageSettings(), loadSheet(), loadText(), loadWire(), m_version, LINE_READER::ReadLine(), and strCompare().

Referenced by loadFile(), and SCH_EDITOR_CONTROL::Paste().

◆ loadFile()

void SCH_LEGACY_PLUGIN::loadFile ( const wxString &  aFileName,
SCH_SCREEN aScreen 
)
private

Definition at line 732 of file sch_legacy_plugin.cpp.

733 {
734  FILE_LINE_READER reader( aFileName );
735 
736  loadHeader( reader, aScreen );
737 
738  LoadContent( reader, aScreen, m_version );
739 
740  // Unfortunately schematic files prior to version 2 are not terminated with $EndSCHEMATC
741  // so checking for it's existance will fail so just exit here and take our chances. :(
742  if( m_version > 1 )
743  {
744  char* line = reader.Line();
745 
746  while( *line == ' ' )
747  line++;
748 
749  if( !strCompare( "$EndSCHEMATC", line ) )
750  THROW_IO_ERROR( "'$EndSCHEMATC' not found" );
751  }
752 }
void LoadContent(LINE_READER &aReader, SCH_SCREEN *aScreen, int version=EESCHEMA_VERSION)
int m_version
Version of file being loaded.
Class FILE_LINE_READER is a LINE_READER that reads from an open file.
Definition: richio.h:180
#define THROW_IO_ERROR(msg)
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 loadHeader(LINE_READER &aReader, SCH_SCREEN *aScreen)

References LINE_READER::Line(), LoadContent(), loadHeader(), m_version, strCompare(), and THROW_IO_ERROR.

Referenced by loadHierarchy().

◆ loadHeader()

void SCH_LEGACY_PLUGIN::loadHeader ( LINE_READER aReader,
SCH_SCREEN aScreen 
)
private

Definition at line 794 of file sch_legacy_plugin.cpp.

795 {
796  const char* line = aReader.ReadLine();
797 
798  if( !line || !strCompare( "Eeschema Schematic File Version", line, &line ) )
799  {
800  m_error.Printf( _( "\"%s\" does not appear to be an Eeschema file" ),
801  GetChars( aScreen->GetFileName() ) );
803  }
804 
805  // get the file version here.
806  m_version = parseInt( aReader, line, &line );
807 
808  // The next lines are the lib list section, and are mainly comments, like:
809  // LIBS:power
810  // the lib list is not used, but is in schematic file just in case.
811  // It is usually not empty, but we accept empty list.
812  // If empty, there is a legacy section, not used
813  // EELAYER i j
814  // and the last line is
815  // EELAYER END
816  // Skip all lines until the end of header "EELAYER END" is found
817  while( aReader.ReadLine() )
818  {
819  line = aReader.Line();
820 
821  while( *line == ' ' )
822  line++;
823 
824  if( strCompare( "EELAYER END", line ) )
825  return;
826  }
827 
828  THROW_IO_ERROR( _( "Missing 'EELAYER END'" ) );
829 }
const wxString & GetFileName() const
Definition: sch_screen.h:124
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
wxString m_error
For throwing exceptions or errors on partial schematic loads.
int m_version
Version of file being loaded.
#define THROW_IO_ERROR(msg)
static int parseInt(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...
virtual char * ReadLine()=0
Function ReadLine reads a line of text into the buffer and increments the line number counter.
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:100
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...

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

Referenced by loadFile().

◆ loadHierarchy()

void SCH_LEGACY_PLUGIN::loadHierarchy ( SCH_SHEET aSheet)
private

Definition at line 651 of file sch_legacy_plugin.cpp.

652 {
653  SCH_SCREEN* screen = NULL;
654 
655  if( !aSheet->GetScreen() )
656  {
657  // SCH_SCREEN objects store the full path and file name where the SCH_SHEET object only
658  // stores the file name and extension. Add the project path to the file name and
659  // extension to compare when calling SCH_SHEET::SearchHierarchy().
660  wxFileName fileName = aSheet->GetFileName();
661 
662  if( !fileName.IsAbsolute() )
663  fileName.MakeAbsolute( m_currentPath.top() );
664 
665  // Save the current path so that it gets restored when decending and ascending the
666  // sheet hierarchy which allows for sheet schematic files to be nested in folders
667  // relative to the last path a schematic was loaded from.
668  wxLogTrace( traceSchLegacyPlugin, "Saving path \"%s\"", m_currentPath.top() );
669  m_currentPath.push( fileName.GetPath() );
670  wxLogTrace( traceSchLegacyPlugin, "Current path \"%s\"", m_currentPath.top() );
671  wxLogTrace( traceSchLegacyPlugin, "Loading \"%s\"", fileName.GetFullPath() );
672 
673  m_rootSheet->SearchHierarchy( fileName.GetFullPath(), &screen );
674 
675  if( screen )
676  {
677  aSheet->SetScreen( screen );
678 
679  // Do not need to load the sub-sheets - this has already been done.
680  }
681  else
682  {
683  aSheet->SetScreen( new SCH_SCREEN( m_kiway ) );
684  aSheet->GetScreen()->SetFileName( fileName.GetFullPath() );
685 
686  try
687  {
688  loadFile( fileName.GetFullPath(), aSheet->GetScreen() );
689 
690  EDA_ITEM* item = aSheet->GetScreen()->GetDrawItems();
691 
692  while( item )
693  {
694  if( item->Type() == SCH_SHEET_T )
695  {
696  SCH_SHEET* sheet = (SCH_SHEET*) item;
697 
698  // Set the parent to aSheet. This effectively creates a method to find
699  // the root sheet from any sheet so a pointer to the root sheet does not
700  // need to be stored globally. Note: this is not the same as a hierarchy.
701  // Complex hierarchies can have multiple copies of a sheet. This only
702  // provides a simple tree to find the root sheet.
703  sheet->SetParent( aSheet );
704 
705  // Recursion starts here.
706  loadHierarchy( sheet );
707  }
708 
709  item = item->Next();
710  }
711  }
712  catch( const IO_ERROR& ioe )
713  {
714  // If there is a problem loading the root sheet, there is no recovery.
715  if( aSheet == m_rootSheet )
716  throw( ioe );
717 
718  // For all subsheets, queue up the error message for the caller.
719  if( !m_error.IsEmpty() )
720  m_error += "\n";
721 
722  m_error += ioe.What();
723  }
724  }
725 
726  m_currentPath.pop();
727  wxLogTrace( traceSchLegacyPlugin, "Restoring path \"%s\"", m_currentPath.top() );
728  }
729 }
bool SearchHierarchy(const wxString &aFilename, SCH_SCREEN **aScreen)
Search the existing hierarchy for an instance of screen loaded from aFileName.
Definition: sch_sheet.cpp:544
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:268
void loadFile(const wxString &aFileName, SCH_SCREEN *aScreen)
void loadHierarchy(SCH_SHEET *aSheet)
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:33
void SetParent(EDA_ITEM *aParent)
Definition: base_struct.h:219
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:201
wxString GetFileName(void) const
Return the filename corresponding to this sheet.
Definition: sch_sheet.cpp:627
Class EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boa...
Definition: base_struct.h:157
void SetFileName(const wxString &aFileName)
Definition: sch_screen.h:122
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:76
std::stack< wxString > m_currentPath
Stack to maintain nested sheet paths.
SCH_ITEM * GetDrawItems() const
Definition: sch_screen.h:153

References SCH_SCREEN::GetDrawItems(), SCH_SHEET::GetFileName(), SCH_SHEET::GetScreen(), loadFile(), m_currentPath, m_error, m_kiway, m_rootSheet, SCH_SHEET_T, SCH_SHEET::SearchHierarchy(), SCH_SCREEN::SetFileName(), EDA_ITEM::SetParent(), SCH_SHEET::SetScreen(), traceSchLegacyPlugin, and IO_ERROR::What().

Referenced by Load().

◆ loadJunction()

SCH_JUNCTION * SCH_LEGACY_PLUGIN::loadJunction ( LINE_READER aReader)
private

Definition at line 1158 of file sch_legacy_plugin.cpp.

1159 {
1160  std::unique_ptr< SCH_JUNCTION > junction( new SCH_JUNCTION );
1161 
1162  const char* line = aReader.Line();
1163 
1164  wxCHECK( strCompare( "Connection", line, &line ), NULL );
1165 
1166  wxString name;
1167 
1168  parseUnquotedString( name, aReader, line, &line );
1169 
1170  wxPoint position;
1171 
1172  position.x = parseInt( aReader, line, &line );
1173  position.y = parseInt( aReader, line, &line );
1174  junction->SetPosition( position );
1175 
1176  return junction.release();
1177 }
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
static void parseUnquotedString(wxString &aString, 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.
static int parseInt(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 * 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...

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

Referenced by LoadContent().

◆ loadNoConnect()

SCH_NO_CONNECT * SCH_LEGACY_PLUGIN::loadNoConnect ( LINE_READER aReader)
private

Definition at line 1180 of file sch_legacy_plugin.cpp.

1181 {
1182  std::unique_ptr< SCH_NO_CONNECT > no_connect( new SCH_NO_CONNECT );
1183 
1184  const char* line = aReader.Line();
1185 
1186  wxCHECK( strCompare( "NoConn", line, &line ), NULL );
1187 
1188  wxString name;
1189 
1190  parseUnquotedString( name, aReader, line, &line );
1191 
1192  wxPoint position;
1193 
1194  position.x = parseInt( aReader, line, &line );
1195  position.y = parseInt( aReader, line, &line );
1196  no_connect->SetPosition( position );
1197 
1198  return no_connect.release();
1199 }
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
static void parseUnquotedString(wxString &aString, 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.
static int parseInt(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 * 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...

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

Referenced by LoadContent().

◆ loadPageSettings()

void SCH_LEGACY_PLUGIN::loadPageSettings ( LINE_READER aReader,
SCH_SCREEN aScreen 
)
private

Definition at line 832 of file sch_legacy_plugin.cpp.

833 {
834  wxASSERT( aScreen != NULL );
835 
836  wxString buf;
837  const char* line = aReader.Line();
838 
839  PAGE_INFO pageInfo;
840  TITLE_BLOCK tb;
841 
842  wxCHECK_RET( strCompare( "$Descr", line, &line ), "Invalid sheet description" );
843 
844  parseUnquotedString( buf, aReader, line, &line );
845 
846  if( !pageInfo.SetType( buf ) )
847  SCH_PARSE_ERROR( "invalid page size", aReader, line );
848 
849  int pagew = parseInt( aReader, line, &line );
850  int pageh = parseInt( aReader, line, &line );
851 
852  if( buf == PAGE_INFO::Custom )
853  {
854  pageInfo.SetWidthMils( pagew );
855  pageInfo.SetHeightMils( pageh );
856  }
857  else
858  {
859  wxString orientation;
860 
861  // Non custom size, set portrait if its present. Can be empty string which defaults
862  // to landscape.
863  parseUnquotedString( orientation, aReader, line, &line, true );
864 
865  if( orientation == "portrait" )
866  pageInfo.SetPortrait( true );
867  }
868 
869  aScreen->SetPageSettings( pageInfo );
870 
871  while( line != NULL )
872  {
873  buf.clear();
874 
875  if( !aReader.ReadLine() )
876  SCH_PARSE_ERROR( _( "unexpected end of file" ), aReader, line );
877 
878  line = aReader.Line();
879 
880  if( strCompare( "Sheet", line, &line ) )
881  {
882  aScreen->m_ScreenNumber = parseInt( aReader, line, &line );
883  aScreen->m_NumberOfScreens = parseInt( aReader, line, &line );
884  }
885  else if( strCompare( "Title", line, &line ) )
886  {
887  parseQuotedString( buf, aReader, line, &line, true );
888  tb.SetTitle( buf );
889  }
890  else if( strCompare( "Date", line, &line ) )
891  {
892  parseQuotedString( buf, aReader, line, &line, true );
893  tb.SetDate( buf );
894  }
895  else if( strCompare( "Rev", line, &line ) )
896  {
897  parseQuotedString( buf, aReader, line, &line, true );
898  tb.SetRevision( buf );
899  }
900  else if( strCompare( "Comp", line, &line ) )
901  {
902  parseQuotedString( buf, aReader, line, &line, true );
903  tb.SetCompany( buf );
904  }
905  else if( strCompare( "Comment1", line, &line ) )
906  {
907  parseQuotedString( buf, aReader, line, &line, true );
908  tb.SetComment1( buf );
909  }
910  else if( strCompare( "Comment2", line, &line ) )
911  {
912  parseQuotedString( buf, aReader, line, &line, true );
913  tb.SetComment2( buf );
914  }
915  else if( strCompare( "Comment3", line, &line ) )
916  {
917  parseQuotedString( buf, aReader, line, &line, true );
918  tb.SetComment3( buf );
919  }
920  else if( strCompare( "Comment4", line, &line ) )
921  {
922  parseQuotedString( buf, aReader, line, &line, true );
923  tb.SetComment4( buf );
924  }
925  else if( strCompare( "$EndDescr", line ) )
926  {
927  aScreen->SetTitleBlock( tb );
928  return;
929  }
930  }
931 
932  SCH_PARSE_ERROR( "missing 'EndDescr'", aReader, line );
933 }
void SetComment1(const wxString &aComment)
Definition: title_block.h:117
int m_ScreenNumber
Definition: base_screen.h:216
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
void SetRevision(const wxString &aRevision)
Definition: title_block.h:84
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
static void parseQuotedString(wxString &aString, 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 SetDate(const wxString &aDate)
Function SetDate sets the date field, and defaults to the current time and date.
Definition: title_block.h:74
void SetPageSettings(const PAGE_INFO &aPageSettings)
Definition: sch_screen.h:120
static const wxChar Custom[]
"User" defined page type
Definition: page_info.h:78
static void parseUnquotedString(wxString &aString, 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 TITLE_BLOCK holds the information shown in the lower right corner of a plot,...
Definition: title_block.h:40
void SetComment4(const wxString &aComment)
Definition: title_block.h:120
Class PAGE_INFO describes the page size and margins of a paper page on which to eventually print or p...
Definition: page_info.h:54
void SetCompany(const wxString &aCompany)
Definition: title_block.h:94
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)
Definition: sch_screen.h:131
static int parseInt(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 SetTitle(const wxString &aTitle)
Definition: title_block.h:60
void SetHeightMils(int aHeightInMils)
Definition: page_info.cpp:253
void SetComment2(const wxString &aComment)
Definition: title_block.h:118
virtual char * ReadLine()=0
Function ReadLine reads a line of text into the buffer and increments the line number counter.
#define SCH_PARSE_ERROR(text, reader, pos)
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:119
void SetPortrait(bool aIsPortrait)
Function SetPortrait will rotate the paper page 90 degrees.
Definition: page_info.cpp:182

References PAGE_INFO::Custom, LINE_READER::Line(), BASE_SCREEN::m_NumberOfScreens, BASE_SCREEN::m_ScreenNumber, parseInt(), parseQuotedString(), parseUnquotedString(), 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 LoadContent().

◆ loadSheet()

SCH_SHEET * SCH_LEGACY_PLUGIN::loadSheet ( LINE_READER aReader)
private

Definition at line 936 of file sch_legacy_plugin.cpp.

937 {
938  std::unique_ptr< SCH_SHEET > sheet( new SCH_SHEET() );
939 
940  sheet->SetTimeStamp( GetNewTimeStamp() );
941 
942  const char* line = aReader.ReadLine();
943 
944  while( line != NULL )
945  {
946  if( strCompare( "S", line, &line ) ) // Sheet dimensions.
947  {
948  wxPoint position;
949 
950  position.x = parseInt( aReader, line, &line );
951  position.y = parseInt( aReader, line, &line );
952  sheet->SetPosition( position );
953 
954  wxSize size;
955 
956  size.SetWidth( parseInt( aReader, line, &line ) );
957  size.SetHeight( parseInt( aReader, line, &line ) );
958  sheet->SetSize( size );
959  }
960  else if( strCompare( "U", line, &line ) ) // Sheet time stamp.
961  {
962  sheet->SetTimeStamp( parseHex( aReader, line ) );
963  }
964  else if( *line == 'F' ) // Sheet field.
965  {
966  line++;
967 
968  wxString text;
969  int size;
970  int fieldId = parseInt( aReader, line, &line );
971 
972  if( fieldId == 0 || fieldId == 1 ) // Sheet name and file name.
973  {
974  parseQuotedString( text, aReader, line, &line );
975  size = parseInt( aReader, line, &line );
976 
977  if( fieldId == 0 )
978  {
979  sheet->SetName( text );
980  sheet->SetSheetNameSize( size );
981  }
982  else
983  {
984  sheet->SetFileName( text );
985  sheet->SetFileNameSize( size );
986  }
987  }
988  else // Sheet pin.
989  {
990  std::unique_ptr< SCH_SHEET_PIN > sheetPin( new SCH_SHEET_PIN( sheet.get() ) );
991 
992  sheetPin->SetNumber( fieldId );
993 
994  // Can be empty fields.
995  parseQuotedString( text, aReader, line, &line, true );
996 
997  sheetPin->SetText( text );
998 
999  if( line == NULL )
1000  THROW_IO_ERROR( _( "unexpected end of line" ) );
1001 
1002  switch( parseChar( aReader, line, &line ) )
1003  {
1004  case 'I':
1005  sheetPin->SetShape( NET_INPUT );
1006  break;
1007 
1008  case 'O':
1009  sheetPin->SetShape( NET_OUTPUT );
1010  break;
1011 
1012  case 'B':
1013  sheetPin->SetShape( NET_BIDI );
1014  break;
1015 
1016  case 'T':
1017  sheetPin->SetShape( NET_TRISTATE );
1018  break;
1019 
1020  case 'U':
1021  sheetPin->SetShape( NET_UNSPECIFIED );
1022  break;
1023  default:
1024  SCH_PARSE_ERROR( "invalid sheet pin type", aReader, line );
1025  }
1026 
1027  switch( parseChar( aReader, line, &line ) )
1028  {
1029  case 'R': /* pin on right side */
1030  sheetPin->SetEdge( SCH_SHEET_PIN::SHEET_RIGHT_SIDE );
1031  break;
1032 
1033  case 'T': /* pin on top side */
1034  sheetPin->SetEdge( SCH_SHEET_PIN::SHEET_TOP_SIDE );
1035  break;
1036 
1037  case 'B': /* pin on bottom side */
1038  sheetPin->SetEdge( SCH_SHEET_PIN::SHEET_BOTTOM_SIDE );
1039  break;
1040 
1041  case 'L': /* pin on left side */
1042  sheetPin->SetEdge( SCH_SHEET_PIN::SHEET_LEFT_SIDE );
1043  break;
1044  default:
1045  SCH_PARSE_ERROR( "invalid sheet pin side", aReader, line );
1046  }
1047 
1048  wxPoint position;
1049 
1050  position.x = parseInt( aReader, line, &line );
1051  position.y = parseInt( aReader, line, &line );
1052  sheetPin->SetPosition( position );
1053 
1054  size = parseInt( aReader, line, &line );
1055 
1056  sheetPin->SetTextSize( wxSize( size, size ) );
1057 
1058  sheet->AddPin( sheetPin.release() );
1059  }
1060  }
1061  else if( strCompare( "$EndSheet", line ) )
1062  return sheet.release();
1063 
1064  line = aReader.ReadLine();
1065  }
1066 
1067  SCH_PARSE_ERROR( "missing '$EndSheet`", aReader, line );
1068 
1069  return NULL; // Prevents compiler warning. Should never get here.
1070 }
static uint32_t parseHex(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...
static void parseQuotedString(wxString &aString, 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.
timestamp_t GetNewTimeStamp()
Definition: common.cpp:217
static char parseChar(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.
#define THROW_IO_ERROR(msg)
Define a sheet pin (label) used in sheets to create hierarchical schematics.
Definition: sch_sheet.h:56
static int parseInt(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...
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:201
virtual char * ReadLine()=0
Function ReadLine reads a line of text into the buffer and increments the line number counter.
#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...

References GetNewTimeStamp(), NET_BIDI, NET_INPUT, NET_OUTPUT, NET_TRISTATE, NET_UNSPECIFIED, parseChar(), parseHex(), parseInt(), parseQuotedString(), 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(), and THROW_IO_ERROR.

Referenced by LoadContent().

◆ LoadSymbol()

LIB_ALIAS * SCH_LEGACY_PLUGIN::LoadSymbol ( const wxString &  aLibraryPath,
const wxString &  aAliasName,
const PROPERTIES aProperties = nullptr 
)
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 4338 of file sch_legacy_plugin.cpp.

4340 {
4341  LOCALE_IO toggle; // toggles on, then off, the C locale.
4342 
4343  m_props = aProperties;
4344 
4345  cacheLib( aLibraryPath );
4346 
4347  LIB_ALIAS_MAP::const_iterator it = m_cache->m_aliases.find( aAliasName );
4348 
4349  if( it == m_cache->m_aliases.end() )
4350  return NULL;
4351 
4352  return it->second;
4353 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:177
SCH_LEGACY_PLUGIN_CACHE * m_cache
void cacheLib(const wxString &aLibraryFileName)
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be nullptr.

References cacheLib(), SCH_LEGACY_PLUGIN_CACHE::m_aliases, m_cache, and m_props.

◆ loadText()

SCH_TEXT * SCH_LEGACY_PLUGIN::loadText ( LINE_READER aReader)
private

Definition at line 1345 of file sch_legacy_plugin.cpp.

1346 {
1347  const char* line = aReader.Line();
1348 
1349  wxCHECK( strCompare( "Text", line, &line ), NULL );
1350 
1351  std::unique_ptr< SCH_TEXT> text;
1352 
1353  if( strCompare( "Notes", line, &line ) )
1354  text.reset( new SCH_TEXT );
1355  else if( strCompare( "Label", line, &line ) )
1356  text.reset( new SCH_LABEL );
1357  else if( strCompare( "HLabel", line, &line ) )
1358  text.reset( new SCH_HIERLABEL );
1359  else if( strCompare( "GLabel", line, &line ) )
1360  {
1361  // Prior to version 2, the SCH_GLOBALLABEL object did not exist.
1362  if( m_version == 1 )
1363  text.reset( new SCH_HIERLABEL );
1364  else
1365  text.reset( new SCH_GLOBALLABEL );
1366  }
1367  else
1368  SCH_PARSE_ERROR( "unknown Text type", aReader, line );
1369 
1370  // Parse the parameters common to all text objects.
1371  wxPoint position;
1372 
1373  position.x = parseInt( aReader, line, &line );
1374  position.y = parseInt( aReader, line, &line );
1375  text->SetPosition( position );
1376  text->SetLabelSpinStyle( parseInt( aReader, line, &line ) );
1377 
1378  int size = parseInt( aReader, line, &line );
1379 
1380  text->SetTextSize( wxSize( size, size ) );
1381 
1382  // Parse the global and hierarchical label type.
1383  if( text->Type() == SCH_HIER_LABEL_T || text->Type() == SCH_GLOBAL_LABEL_T )
1384  {
1385  if( strCompare( SheetLabelType[NET_INPUT], line, &line ) )
1386  text->SetShape( NET_INPUT );
1387  else if( strCompare( SheetLabelType[NET_OUTPUT], line, &line ) )
1388  text->SetShape( NET_OUTPUT );
1389  else if( strCompare( SheetLabelType[NET_BIDI], line, &line ) )
1390  text->SetShape( NET_BIDI );
1391  else if( strCompare( SheetLabelType[NET_TRISTATE], line, &line ) )
1392  text->SetShape( NET_TRISTATE );
1393  else if( strCompare( SheetLabelType[NET_UNSPECIFIED], line, &line ) )
1394  text->SetShape( NET_UNSPECIFIED );
1395  else
1396  SCH_PARSE_ERROR( "invalid label type", aReader, line );
1397  }
1398 
1399  int thickness = 0;
1400 
1401  // The following tokens do not exist in version 1 schematic files,
1402  // and not always in version 2 for HLabels and GLabels
1403  if( m_version > 1 )
1404  {
1405  if( m_version > 2 || *line >= ' ' )
1406  {
1407  if( strCompare( "Italic", line, &line ) )
1408  text->SetItalic( true );
1409  else if( !strCompare( "~", line, &line ) )
1410  SCH_PARSE_ERROR( _( "expected 'Italics' or '~'" ), aReader, line );
1411  }
1412 
1413  // The thickness token does not exist in older versions of the schematic file format
1414  // so calling parseInt will be made only if the EOL is not reached.
1415  if( *line >= ' ' )
1416  thickness = parseInt( aReader, line, &line );
1417  }
1418 
1419  text->SetBold( thickness != 0 );
1420  text->SetThickness( thickness != 0 ? GetPenSizeForBold( size ) : 0 );
1421 
1422  // Read the text string for the text.
1423  char* tmp = aReader.ReadLine();
1424 
1425  tmp = strtok( tmp, "\r\n" );
1426  wxString val = FROM_UTF8( tmp );
1427 
1428  for( ; ; )
1429  {
1430  int i = val.find( wxT( "\\n" ) );
1431 
1432  if( i == wxNOT_FOUND )
1433  break;
1434 
1435  val.erase( i, 2 );
1436  val.insert( i, wxT( "\n" ) );
1437  }
1438 
1439  text->SetText( val );
1440 
1441  return text.release();
1442 }
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
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:61
int GetPenSizeForBold(int aTextSize)
Function GetPensizeForBold.
const char * SheetLabelType[]
Definition: sch_text.cpp:57
int m_version
Version of file being loaded.
static int parseInt(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...
virtual char * ReadLine()=0
Function ReadLine reads a line of text into the buffer and increments the line number counter.
#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...

References FROM_UTF8(), GetPenSizeForBold(), i, LINE_READER::Line(), m_version, NET_BIDI, NET_INPUT, NET_OUTPUT, NET_TRISTATE, NET_UNSPECIFIED, parseInt(), LINE_READER::ReadLine(), SCH_GLOBAL_LABEL_T, SCH_HIER_LABEL_T, SCH_PARSE_ERROR, SheetLabelType, and strCompare().

Referenced by LoadContent().

◆ loadWire()

SCH_LINE * SCH_LEGACY_PLUGIN::loadWire ( LINE_READER aReader)
private

Definition at line 1202 of file sch_legacy_plugin.cpp.

1203 {
1204  std::unique_ptr< SCH_LINE > wire( new SCH_LINE );
1205 
1206  const char* line = aReader.Line();
1207 
1208  wxCHECK( strCompare( "Wire", line, &line ), NULL );
1209 
1210  if( strCompare( "Wire", line, &line ) )
1211  wire->SetLayer( LAYER_WIRE );
1212  else if( strCompare( "Bus", line, &line ) )
1213  wire->SetLayer( LAYER_BUS );
1214  else if( strCompare( "Notes", line, &line ) )
1215  wire->SetLayer( LAYER_NOTES );
1216  else
1217  SCH_PARSE_ERROR( "invalid line type", aReader, line );
1218 
1219  if( !strCompare( "Line", line, &line ) )
1220  SCH_PARSE_ERROR( "invalid wire definition", aReader, line );
1221 
1222  // Since Sept 15, 2017, a line style is alloved (width, style, color)
1223  // Only non default values are stored
1224  while( !is_eol( *line ) )
1225  {
1226  wxString buf;
1227 
1228  parseUnquotedString( buf, aReader, line, &line );
1229 
1230  if( buf == ")" )
1231  continue;
1232 
1233  else if( buf == T_WIDTH )
1234  {
1235  int size = parseInt( aReader, line, &line );
1236  wire->SetLineWidth( size );
1237  }
1238  else if( buf == T_STYLE )
1239  {
1240  parseUnquotedString( buf, aReader, line, &line );
1241  int style = SCH_LINE::GetLineStyleInternalId( buf );
1242  wire->SetLineStyle( style );
1243  }
1244  else // should be the color parameter.
1245  {
1246  // The color param is something like rgb(150, 40, 191)
1247  // and because there is no space between ( and 150
1248  // the first param is inside buf.
1249  // So break keyword and the first param into 2 separate strings.
1250  wxString prm, keyword;
1251  keyword = buf.BeforeLast( '(', &prm );
1252 
1253  if( ( keyword == T_COLOR ) || ( keyword == T_COLORA ) )
1254  {
1255  long color[4] = { 0 };
1256 
1257  int ii = 0;
1258 
1259  if( !prm.IsEmpty() )
1260  {
1261  prm.ToLong( &color[ii] );
1262  ii++;
1263  }
1264 
1265  int prm_count = ( keyword == T_COLORA ) ? 4 : 3;
1266  // fix opacity to 1.0 or 255, when not exists in file
1267  color[3] = 255;
1268 
1269  for(; ii < prm_count && !is_eol( *line ); ii++ )
1270  {
1271  color[ii] = parseInt( aReader, line, &line );
1272 
1273  // Skip the separator between values
1274  if( *line == ',' || *line == ' ')
1275  line++;
1276  }
1277 
1278  wire->SetLineColor( color[0]/255.0, color[1]/255.0, color[2]/255.0,color[3]/255.0 );
1279  }
1280  }
1281  }
1282 
1283  // Read the segment en points coordinates:
1284  line = aReader.ReadLine();
1285 
1286  wxPoint begin, end;
1287 
1288  begin.x = parseInt( aReader, line, &line );
1289  begin.y = parseInt( aReader, line, &line );
1290  end.x = parseInt( aReader, line, &line );
1291  end.y = parseInt( aReader, line, &line );
1292 
1293  wire->SetStartPoint( begin );
1294  wire->SetEndPoint( end );
1295 
1296  return wire.release();
1297 }
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
int color
Definition: DXF_plotter.cpp:62
static void parseUnquotedString(wxString &aString, 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.
#define T_WIDTH
#define T_STYLE
static bool is_eol(char c)
#define T_COLOR
static int parseInt(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 int GetLineStyleInternalId(const wxString &aStyleName)
Definition: sch_line.cpp:139
virtual char * ReadLine()=0
Function ReadLine reads a line of text into the buffer and increments the line number counter.
#define SCH_PARSE_ERROR(text, reader, pos)
Segment description base class to describe items which have 2 end points (track, wire,...
Definition: sch_line.h:37
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

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

Referenced by LoadContent().

◆ ParsePart()

LIB_PART * SCH_LEGACY_PLUGIN::ParsePart ( LINE_READER aReader,
int  majorVersion = 0,
int  minorVersion = 0 
)
static

Definition at line 4486 of file sch_legacy_plugin.cpp.

4488 {
4489  return SCH_LEGACY_PLUGIN_CACHE::LoadPart( reader, aMajorVersion, aMinorVersion );
4490 }
static LIB_PART * LoadPart(LINE_READER &aReader, int aMajorVersion, int aMinorVersion)

References SCH_LEGACY_PLUGIN_CACHE::LoadPart().

Referenced by LIB_EDIT_FRAME::OnPasteDuplicatePart(), and LIB_EDIT_TOOL::Paste().

◆ Save()

void SCH_LEGACY_PLUGIN::Save ( const wxString &  aFileName,
SCH_SCREEN aSchematic,
KIWAY aKiway,
const PROPERTIES aProperties = nullptr 
)
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 1768 of file sch_legacy_plugin.cpp.

1770 {
1771  wxCHECK_RET( aScreen != NULL, "NULL SCH_SCREEN object." );
1772  wxCHECK_RET( !aFileName.IsEmpty(), "No schematic file name defined." );
1773 
1774  LOCALE_IO toggle; // toggles on, then off, the C locale, to write floating point values.
1775 
1776  init( aKiway, aProperties );
1777 
1778  wxFileName fn = aFileName;
1779 
1780  // File names should be absolute. Don't assume everything relative to the project path
1781  // works properly.
1782  wxASSERT( fn.IsAbsolute() );
1783 
1784  FILE_OUTPUTFORMATTER formatter( fn.GetFullPath() );
1785 
1786  m_out = &formatter; // no ownership
1787 
1788  Format( aScreen );
1789 }
void init(KIWAY *aKiway, const PROPERTIES *aProperties=nullptr)
initialize PLUGIN like a constructor would.
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:177
void Format(SCH_SCREEN *aScreen)
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
Class FILE_OUTPUTFORMATTER may be used for text file output.
Definition: richio.h:492

References Format(), init(), and m_out.

◆ saveBitmap()

void SCH_LEGACY_PLUGIN::saveBitmap ( SCH_BITMAP aBitmap)
private

Definition at line 2060 of file sch_legacy_plugin.cpp.

2061 {
2062  wxCHECK_RET( aBitmap != NULL, "SCH_BITMAP* is NULL" );
2063 
2064  const wxImage* image = aBitmap->GetImage()->GetImageData();
2065 
2066  wxCHECK_RET( image != NULL, "wxImage* is NULL" );
2067 
2068  m_out->Print( 0, "$Bitmap\n" );
2069  m_out->Print( 0, "Pos %-4d %-4d\n", aBitmap->GetPosition().x, aBitmap->GetPosition().y );
2070  m_out->Print( 0, "Scale %f\n", aBitmap->GetImage()->GetScale() );
2071  m_out->Print( 0, "Data\n" );
2072 
2073  wxMemoryOutputStream stream;
2074 
2075  image->SaveFile( stream, wxBITMAP_TYPE_PNG );
2076 
2077  // Write binary data in hexadecimal form (ASCII)
2078  wxStreamBuffer* buffer = stream.GetOutputStreamBuffer();
2079  char* begin = (char*) buffer->GetBufferStart();
2080 
2081  for( int ii = 0; begin < buffer->GetBufferEnd(); begin++, ii++ )
2082  {
2083  if( ii >= 32 )
2084  {
2085  ii = 0;
2086 
2087  m_out->Print( 0, "\n" );
2088  }
2089 
2090  m_out->Print( 0, "%2.2X ", *begin & 0xFF );
2091  }
2092 
2093  m_out->Print( 0, "\nEndData\n" );
2094  m_out->Print( 0, "$EndBitmap\n" );
2095 }
double GetScale() const
Definition: bitmap_base.h:87
wxImage * GetImageData()
Definition: bitmap_base.h:78
wxPoint GetPosition() const override
Function GetPosition.
Definition: sch_bitmap.h:152
BITMAP_BASE * GetImage()
Definition: sch_bitmap.h:65
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404

References SCH_BITMAP::GetImage(), BITMAP_BASE::GetImageData(), SCH_BITMAP::GetPosition(), BITMAP_BASE::GetScale(), m_out, and OUTPUTFORMATTER::Print().

Referenced by Format().

◆ saveBusAlias()

void SCH_LEGACY_PLUGIN::saveBusAlias ( std::shared_ptr< BUS_ALIAS aAlias)
private

Definition at line 2306 of file sch_legacy_plugin.cpp.

2307 {
2308  wxCHECK_RET( aAlias != NULL, "BUS_ALIAS* is NULL" );
2309 
2310  wxString members = boost::algorithm::join( aAlias->Members(), " " );
2311 
2312  m_out->Print( 0, "BusAlias %s %s\n",
2313  TO_UTF8( aAlias->GetName() ), TO_UTF8( members ) );
2314 }
#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
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404

References m_out, OUTPUTFORMATTER::Print(), and TO_UTF8.

Referenced by Format().

◆ saveBusEntry()

void SCH_LEGACY_PLUGIN::saveBusEntry ( SCH_BUS_ENTRY_BASE aBusEntry)
private

Definition at line 2191 of file sch_legacy_plugin.cpp.

2192 {
2193  wxCHECK_RET( aBusEntry != NULL, "SCH_BUS_ENTRY_BASE* is NULL" );
2194 
2195  if( aBusEntry->GetLayer() == LAYER_WIRE )
2196  m_out->Print( 0, "Entry Wire Line\n\t%-4d %-4d %-4d %-4d\n",
2197  aBusEntry->GetPosition().x, aBusEntry->GetPosition().y,
2198  aBusEntry->m_End().x, aBusEntry->m_End().y );
2199  else
2200  m_out->Print( 0, "Entry Bus Bus\n\t%-4d %-4d %-4d %-4d\n",
2201  aBusEntry->GetPosition().x, aBusEntry->GetPosition().y,
2202  aBusEntry->m_End().x, aBusEntry->m_End().y );
2203 }
wxPoint m_End() const
SCH_LAYER_ID GetLayer() const
Function GetLayer returns the layer this item is on.
Definition: sch_item.h:193
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
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.

References SCH_ITEM::GetLayer(), SCH_BUS_ENTRY_BASE::GetPosition(), LAYER_WIRE, SCH_BUS_ENTRY_BASE::m_End(), m_out, and OUTPUTFORMATTER::Print().

Referenced by Format().

◆ saveComponent()

void SCH_LEGACY_PLUGIN::saveComponent ( SCH_COMPONENT aComponent)
private

Definition at line 1923 of file sch_legacy_plugin.cpp.

1924 {
1925  std::string name1;
1926  std::string name2;
1927  wxArrayString reference_fields;
1928 
1929  static wxString delimiters( wxT( " " ) );
1930 
1931  // This is redundant with the AR entries below, but it makes the files backwards-compatible.
1932  if( aComponent->GetPathsAndReferences().GetCount() > 0 )
1933  {
1934  reference_fields = wxStringTokenize( aComponent->GetPathsAndReferences()[0], delimiters );
1935  name1 = toUTFTildaText( reference_fields[1] );
1936  }
1937  else
1938  {
1939  if( aComponent->GetField( REFERENCE )->GetText().IsEmpty() )
1940  name1 = toUTFTildaText( aComponent->GetPrefix() );
1941  else
1942  name1 = toUTFTildaText( aComponent->GetField( REFERENCE )->GetText() );
1943  }
1944 
1945  wxString part_name = aComponent->GetLibId().Format();
1946 
1947  if( part_name.size() )
1948  {
1949  name2 = toUTFTildaText( part_name );
1950  }
1951  else
1952  {
1953  name2 = "_NONAME_";
1954  }
1955 
1956  m_out->Print( 0, "$Comp\n" );
1957  m_out->Print( 0, "L %s %s\n", name2.c_str(), name1.c_str() );
1958 
1959  // Generate unit number, convert and time stamp
1960  m_out->Print( 0, "U %d %d %8.8X\n", aComponent->GetUnit(), aComponent->GetConvert(),
1961  aComponent->GetTimeStamp() );
1962 
1963  // Save the position
1964  m_out->Print( 0, "P %d %d\n", aComponent->GetPosition().x, aComponent->GetPosition().y );
1965 
1966  /* If this is a complex hierarchy; save hierarchical references.
1967  * but for simple hierarchies it is not necessary.
1968  * the reference inf is already saved
1969  * this is useful for old Eeschema version compatibility
1970  */
1971  if( aComponent->GetPathsAndReferences().GetCount() > 1 )
1972  {
1973  for( unsigned int ii = 0; ii < aComponent->GetPathsAndReferences().GetCount(); ii++ )
1974  {
1975  /*format:
1976  * AR Path="/140/2" Ref="C99" Part="1"
1977  * where 140 is the uid of the containing sheet
1978  * and 2 is the timestamp of this component.
1979  * (timestamps are actually 8 hex chars)
1980  * Ref is the conventional component reference for this 'path'
1981  * Part is the conventional component part selection for this 'path'
1982  */
1983  reference_fields = wxStringTokenize( aComponent->GetPathsAndReferences()[ii],
1984  delimiters );
1985 
1986  m_out->Print( 0, "AR Path=\"%s\" Ref=\"%s\" Part=\"%s\" \n",
1987  TO_UTF8( reference_fields[0] ),
1988  TO_UTF8( reference_fields[1] ),
1989  TO_UTF8( reference_fields[2] ) );
1990  }
1991  }
1992 
1993  // update the ugly field index, which I would like to see go away someday soon.
1994  for( int i = 0; i < aComponent->GetFieldCount(); ++i )
1995  aComponent->GetField( i )->SetId( i );
1996 
1997  // Fixed fields:
1998  // Save mandatory fields even if they are blank,
1999  // because the visibility, size and orientation are set from libary editor.
2000  for( unsigned i = 0; i < MANDATORY_FIELDS; ++i )
2001  saveField( aComponent->GetField( i ) );
2002 
2003  // User defined fields:
2004  // The *policy* about which user defined fields are part of a symbol is now
2005  // only in the dialog editors. No policy should be enforced here, simply
2006  // save all the user defined fields, they are present because a dialog editor
2007  // thought they should be. If you disagree, go fix the dialog editors.
2008  for( int i = MANDATORY_FIELDS; i < aComponent->GetFieldCount(); ++i )
2009  saveField( aComponent->GetField( i ) );
2010 
2011  // Unit number, position, box ( old standard )
2012  m_out->Print( 0, "\t%-4d %-4d %-4d\n", aComponent->GetUnit(), aComponent->GetPosition().x,
2013  aComponent->GetPosition().y );
2014 
2015  TRANSFORM transform = aComponent->GetTransform();
2016 
2017  m_out->Print( 0, "\t%-4d %-4d %-4d %-4d\n",
2018  transform.x1, transform.y1, transform.x2, transform.y2 );
2019  m_out->Print( 0, "$EndComp\n" );
2020 }
int y2
Definition: transform.h:51
const wxString GetText() const override
Function GetText returns the string associated with the text object.
Definition: sch_field.cpp:105
The first 4 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors.
int x2
Definition: transform.h:50
wxString GetPrefix() const
int x1
Definition: transform.h:48
Field Reference of part, i.e. "IC21".
const wxArrayString & GetPathsAndReferences() const
void saveField(SCH_FIELD *aField)
SCH_FIELD * GetField(int aFieldNdx) const
Returns a field in this symbol.
#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 y1
Definition: transform.h:49
int GetUnit() const
Class for tranforming drawing coordinates for a wxDC device context.
Definition: transform.h:45
TRANSFORM & GetTransform() const
std::string toUTFTildaText(const wxString &txt)
Function toUTFTildaText convert a wxString to UTF8 and replace any control characters with a ~,...
timestamp_t GetTimeStamp() const
Definition: base_struct.h:210
int GetFieldCount() const
Return the number of fields in this symbol.
UTF8 Format() const
Definition: lib_id.cpp:237
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
size_t i
Definition: json11.cpp:597
wxPoint GetPosition() const override
Function GetPosition.
int GetConvert() const
void SetId(int aId)
Definition: sch_field.h:107
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
const LIB_ID & GetLibId() const

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(), SCH_FIELD::GetText(), EDA_ITEM::GetTimeStamp(), SCH_COMPONENT::GetTransform(), SCH_COMPONENT::GetUnit(), i, m_out, MANDATORY_FIELDS, OUTPUTFORMATTER::Print(), REFERENCE, saveField(), SCH_FIELD::SetId(), TO_UTF8, toUTFTildaText(), TRANSFORM::x1, TRANSFORM::x2, TRANSFORM::y1, and TRANSFORM::y2.

Referenced by Format().

◆ saveField()

void SCH_LEGACY_PLUGIN::saveField ( SCH_FIELD aField)
private

Definition at line 2023 of file sch_legacy_plugin.cpp.

2024 {
2025  char hjustify = 'C';
2026 
2027  if( aField->GetHorizJustify() == GR_TEXT_HJUSTIFY_LEFT )
2028  hjustify = 'L';
2029  else if( aField->GetHorizJustify() == GR_TEXT_HJUSTIFY_RIGHT )
2030  hjustify = 'R';
2031 
2032  char vjustify = 'C';
2033 
2034  if( aField->GetVertJustify() == GR_TEXT_VJUSTIFY_BOTTOM )
2035  vjustify = 'B';
2036  else if( aField->GetVertJustify() == GR_TEXT_VJUSTIFY_TOP )
2037  vjustify = 'T';
2038 
2039  m_out->Print( 0, "F %d %s %c %-3d %-3d %-3d %4.4X %c %c%c%c",
2040  aField->GetId(),
2041  EscapedUTF8( aField->GetText() ).c_str(), // wraps in quotes too
2042  aField->GetTextAngle() == TEXT_ANGLE_HORIZ ? 'H' : 'V',
2043  aField->GetLibPosition().x, aField->GetLibPosition().y,
2044  aField->GetTextWidth(),
2045  !aField->IsVisible(),
2046  hjustify, vjustify,
2047  aField->IsItalic() ? 'I' : 'N',
2048  aField->IsBold() ? 'B' : 'N' );
2049 
2050  // Save field name, if the name is user definable
2051  if( aField->GetId() >= FIELD1 )
2052  {
2053  m_out->Print( 0, " %s", EscapedUTF8( aField->GetName() ).c_str() );
2054  }
2055 
2056  m_out->Print( 0, "\n" );
2057 }
#define TEXT_ANGLE_HORIZ
bool IsBold() const
Definition: eda_text.h:190
EDA_TEXT_VJUSTIFY_T GetVertJustify() const
Definition: eda_text.h:208
const wxString GetText() const override
Function GetText returns the string associated with the text object.
Definition: sch_field.cpp:105
bool IsVisible() const
Definition: eda_text.h:193
double GetTextAngle() const
Definition: eda_text.h:181
int GetId() const
Definition: sch_field.h:105
bool IsItalic() const
Definition: eda_text.h:187
std::string EscapedUTF8(const wxString &aString)
Function EscapedUTF8 returns an 8 bit UTF8 string given aString in unicode form.
Definition: string.cpp:241
EDA_TEXT_HJUSTIFY_T GetHorizJustify() const
Definition: eda_text.h:207
wxPoint GetLibPosition() const
Definition: sch_field.h:195
int GetTextWidth() const
Definition: eda_text.h:235
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
wxString GetName(bool aUseDefaultName=true) const
Function GetName returns the field name.
Definition: sch_field.cpp:427
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404

References EscapedUTF8(), FIELD1, EDA_TEXT::GetHorizJustify(), SCH_FIELD::GetId(), SCH_FIELD::GetLibPosition(), SCH_FIELD::GetName(), SCH_FIELD::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(), m_out, OUTPUTFORMATTER::Print(), and TEXT_ANGLE_HORIZ.

Referenced by saveComponent().

◆ saveJunction()

void SCH_LEGACY_PLUGIN::saveJunction ( SCH_JUNCTION aJunction)
private

Definition at line 2173 of file sch_legacy_plugin.cpp.

2174 {
2175  wxCHECK_RET( aJunction != NULL, "SCH_JUNCTION* is NULL" );
2176 
2177  m_out->Print( 0, "Connection ~ %-4d %-4d\n",
2178  aJunction->GetPosition().x, aJunction->GetPosition().y );
2179 }
wxPoint GetPosition() const override
Function GetPosition.
Definition: sch_junction.h:95
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404

References SCH_JUNCTION::GetPosition(), m_out, and OUTPUTFORMATTER::Print().

Referenced by Format().

◆ SaveLibrary()

void SCH_LEGACY_PLUGIN::SaveLibrary ( const wxString &  aLibraryPath,
const PROPERTIES aProperties = nullptr 
)
overridevirtual

Reimplemented from SCH_PLUGIN.

Definition at line 4446 of file sch_legacy_plugin.cpp.

4447 {
4448  if( !m_cache )
4449  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryPath );
4450 
4451  wxString oldFileName = m_cache->GetFileName();
4452 
4453  if( !m_cache->IsFile( aLibraryPath ) )
4454  {
4455  m_cache->SetFileName( aLibraryPath );
4456  }
4457 
4458  // This is a forced save.
4459  m_cache->SetModified();
4460  m_cache->Save( writeDocFile( aProperties ) );
4461  m_cache->SetFileName( oldFileName );
4462 }
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 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)

References SCH_LEGACY_PLUGIN_CACHE::GetFileName(), SCH_LEGACY_PLUGIN_CACHE::IsFile(), m_cache, SCH_LEGACY_PLUGIN_CACHE::Save(), SCH_LEGACY_PLUGIN_CACHE::SetFileName(), SCH_LEGACY_PLUGIN_CACHE::SetModified(), and writeDocFile().

◆ saveLine()

void SCH_LEGACY_PLUGIN::saveLine ( SCH_LINE aLine)
private

Definition at line 2206 of file sch_legacy_plugin.cpp.

2207 {
2208  wxCHECK_RET( aLine != NULL, "SCH_LINE* is NULL" );
2209 
2210  const char* layer = "Notes";
2211  const char* width = "Line";
2212 
2213  if( aLine->GetLayer() == LAYER_WIRE )
2214  layer = "Wire";
2215  else if( aLine->GetLayer() == LAYER_BUS )
2216  layer = "Bus";
2217 
2218  m_out->Print( 0, "Wire %s %s", layer, width );
2219 
2220  // Write line style (width, type, color) only for non default values
2221  if( aLine->GetLayer() == LAYER_NOTES )
2222  {
2223  if( aLine->GetPenSize() != aLine->GetDefaultWidth() )
2224  m_out->Print( 0, " %s %d", T_WIDTH, aLine->GetLineSize() );
2225 
2226  if( aLine->GetLineStyle() != aLine->GetDefaultStyle() )
2227  m_out->Print( 0, " %s %s", T_STYLE, SCH_LINE::GetLineStyleName( aLine->GetLineStyle() ) );
2228 
2229  if( aLine->GetLineColor() != aLine->GetDefaultColor() )
2230  m_out->Print( 0, " %s",
2231  TO_UTF8( aLine->GetLineColor().ToColour().GetAsString( wxC2S_CSS_SYNTAX ) ) );
2232  }
2233 
2234  m_out->Print( 0, "\n" );
2235 
2236  m_out->Print( 0, "\t%-4d %-4d %-4d %-4d",
2237  aLine->GetStartPoint().x, aLine->GetStartPoint().y,
2238  aLine->GetEndPoint().x, aLine->GetEndPoint().y );
2239 
2240  m_out->Print( 0, "\n");
2241 }
COLOR4D GetLineColor() const
Definition: sch_line.cpp:257
wxPoint GetStartPoint() const
Definition: sch_line.h:90
#define T_WIDTH
int GetDefaultWidth() const
Definition: sch_line.cpp:292
#define T_STYLE
#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 GetDefaultStyle() const
Definition: sch_line.cpp:265
SCH_LAYER_ID GetLayer() const
Function GetLayer returns the layer this item is on.
Definition: sch_item.h:193
int GetLineSize() const
Definition: sch_line.h:121
COLOR4D GetDefaultColor() const
Definition: sch_line.cpp:227
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
static const char * GetLineStyleName(int aStyle)
Definition: sch_line.cpp:111
int GetPenSize() const override
Function GetPenSize virtual pure.
Definition: sch_line.cpp:310
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
int GetLineStyle() const
Definition: sch_line.cpp:283
wxPoint GetEndPoint() const
Definition: sch_line.h:93

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, m_out, OUTPUTFORMATTER::Print(), T_STYLE, T_WIDTH, and TO_UTF8.

Referenced by Format().

◆ saveNoConnect()

void SCH_LEGACY_PLUGIN::saveNoConnect ( SCH_NO_CONNECT aNoConnect)
private

Definition at line 2182 of file sch_legacy_plugin.cpp.

2183 {
2184  wxCHECK_RET( aNoConnect != NULL, "SCH_NOCONNECT* is NULL" );
2185 
2186  m_out->Print( 0, "NoConn ~ %-4d %-4d\n", aNoConnect->GetPosition().x,
2187  aNoConnect->GetPosition().y );
2188 }
wxPoint GetPosition() const override
Function GetPosition.
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404

References SCH_NO_CONNECT::GetPosition(), m_out, and OUTPUTFORMATTER::Print().

Referenced by Format().

◆ saveSheet()

void SCH_LEGACY_PLUGIN::saveSheet ( SCH_SHEET aSheet)
private

Definition at line 2098 of file sch_legacy_plugin.cpp.

2099 {
2100  wxCHECK_RET( aSheet != NULL, "SCH_SHEET* is NULL" );
2101 
2102  m_out->Print( 0, "$Sheet\n" );
2103  m_out->Print( 0, "S %-4d %-4d %-4d %-4d\n",
2104  aSheet->GetPosition().x, aSheet->GetPosition().y,
2105  aSheet->GetSize().x, aSheet->GetSize().y );
2106 
2107  m_out->Print( 0, "U %8.8X\n", aSheet->GetTimeStamp() );
2108 
2109  if( !aSheet->GetName().IsEmpty() )
2110  m_out->Print( 0, "F0 %s %d\n", EscapedUTF8( aSheet->GetName() ).c_str(),
2111  aSheet->GetSheetNameSize() );
2112 
2113  if( !aSheet->GetFileName().IsEmpty() )
2114  m_out->Print( 0, "F1 %s %d\n", EscapedUTF8( aSheet->GetFileName() ).c_str(),
2115  aSheet->GetFileNameSize() );
2116 
2117  for( const SCH_SHEET_PIN& pin : aSheet->GetPins() )
2118  {
2119  int type, side;
2120 
2121  if( pin.GetText().IsEmpty() )
2122  break;
2123 
2124  switch( pin.GetEdge() )
2125  {
2126  default:
2128  side = 'L';
2129  break;
2130 
2132  side = 'R';
2133  break;
2134 
2136  side = 'T';
2137  break;
2138 
2140  side = 'B';
2141  break;
2142  }
2143 
2144  switch( pin.GetShape() )
2145  {
2146  case NET_INPUT:
2147  type = 'I'; break;
2148 
2149  case NET_OUTPUT:
2150  type = 'O'; break;
2151 
2152  case NET_BIDI:
2153  type = 'B'; break;
2154 
2155  case NET_TRISTATE:
2156  type = 'T'; break;
2157 
2158  default:
2159  case NET_UNSPECIFIED:
2160  type = 'U'; break;
2161  }
2162 
2163  m_out->Print( 0, "F%d %s %c %c %-3d %-3d %-3d\n", pin.GetNumber(),
2164  EscapedUTF8( pin.GetText() ).c_str(), // supplies wrapping quotes
2165  type, side, pin.GetPosition().x, pin.GetPosition().y,
2166  pin.GetTextWidth() );
2167  }
2168 
2169  m_out->Print( 0, "$EndSheet\n" );
2170 }
SCH_SHEET_PINS & GetPins()
Definition: sch_sheet.h:322
int GetFileNameSize() const
Definition: sch_sheet.h:265
std::string EscapedUTF8(const wxString &aString)
Function EscapedUTF8 returns an 8 bit UTF8 string given aString in unicode form.
Definition: string.cpp:241
int GetSheetNameSize() const
Definition: sch_sheet.h:262
wxString GetName() const
Definition: sch_sheet.h:259
timestamp_t GetTimeStamp() const
Definition: base_struct.h:210
Define a sheet pin (label) used in sheets to create hierarchical schematics.
Definition: sch_sheet.h:56
wxPoint GetPosition() const override
Function GetPosition.
Definition: sch_sheet.h:530
wxString GetFileName(void) const
Return the filename corresponding to this sheet.
Definition: sch_sheet.cpp:627
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
wxSize GetSize()
Definition: sch_sheet.h:270

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(), m_out, NET_BIDI, NET_INPUT, NET_OUTPUT, NET_TRISTATE, NET_UNSPECIFIED, OUTPUTFORMATTER::Print(), SCH_SHEET_PIN::SHEET_BOTTOM_SIDE, SCH_SHEET_PIN::SHEET_LEFT_SIDE, SCH_SHEET_PIN::SHEET_RIGHT_SIDE, and SCH_SHEET_PIN::SHEET_TOP_SIDE.

Referenced by Format().

◆ SaveSymbol()

void SCH_LEGACY_PLUGIN::SaveSymbol ( const wxString &  aLibraryPath,
const LIB_PART aSymbol,
const PROPERTIES aProperties = nullptr 
)
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 4356 of file sch_legacy_plugin.cpp.

4358 {
4359  m_props = aProperties;
4360 
4361  cacheLib( aLibraryPath );
4362 
4363  m_cache->AddSymbol( aSymbol );
4364 
4365  if( !isBuffering( aProperties ) )
4366  m_cache->Save( writeDocFile( aProperties ) );
4367 }
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 nullptr.

References SCH_LEGACY_PLUGIN_CACHE::AddSymbol(), cacheLib(), isBuffering(), m_cache, m_props, SCH_LEGACY_PLUGIN_CACHE::Save(), and writeDocFile().

◆ saveText()

void SCH_LEGACY_PLUGIN::saveText ( SCH_TEXT aText)
private

Definition at line 2244 of file sch_legacy_plugin.cpp.

2245 {
2246  wxCHECK_RET( aText != NULL, "SCH_TEXT* is NULL" );
2247 
2248  const char* italics = "~";
2249  const char* textType = "Notes";
2250 
2251  if( aText->IsItalic() )
2252  italics = "Italic";
2253 
2254  wxString text = aText->GetText();
2255 
2256  SCH_LAYER_ID layer = aText->GetLayer();
2257 
2258  if( layer == LAYER_NOTES || layer == LAYER_LOCLABEL )
2259  {
2260  if( layer == LAYER_NOTES )
2261  {
2262  // For compatibility reasons, the text must be saved in only one text line
2263  // so replace all EOLs with \\n
2264  text.Replace( wxT( "\n" ), wxT( "\\n" ) );
2265 
2266  // Here we should have no CR or LF character in line
2267  // This is not always the case if a multiline text was copied (using a copy/paste
2268  // function) from a text that uses E.O.L characters that differs from the current
2269  // EOL format. This is mainly the case under Linux using LF symbol when copying
2270  // a text from Windows (using CRLF symbol) so we must just remove the extra CR left
2271  // (or LF left under MacOSX)
2272  for( unsigned ii = 0; ii < text.Len(); )
2273  {
2274  if( text[ii] == 0x0A || text[ii] == 0x0D )
2275  text.erase( ii, 1 );
2276  else
2277  ii++;
2278  }
2279  }
2280  else
2281  {
2282  textType = "Label";
2283  }
2284 
2285  m_out->Print( 0, "Text %s %-4d %-4d %-4d %-4d %s %d\n%s\n", textType,
2286  aText->GetPosition().x, aText->GetPosition().y,
2287  aText->GetLabelSpinStyle(),
2288  aText->GetTextWidth(),
2289  italics, aText->GetThickness(), TO_UTF8( text ) );
2290  }
2291  else if( layer == LAYER_GLOBLABEL || layer == LAYER_HIERLABEL )
2292  {
2293  textType = ( layer == LAYER_GLOBLABEL ) ? "GLabel" : "HLabel";
2294 
2295  m_out->Print( 0, "Text %s %-4d %-4d %-4d %-4d %s %s %d\n%s\n", textType,
2296  aText->GetPosition().x, aText->GetPosition().y,
2297  aText->GetLabelSpinStyle(),
2298  aText->GetTextWidth(),
2299  SheetLabelType[aText->GetShape()],
2300  italics,
2301  aText->GetThickness(), TO_UTF8( text ) );
2302  }
2303 }
int GetThickness() const
Function GetThickness returns pen width.
Definition: eda_text.h:171
virtual const wxString GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:147
const char * SheetLabelType[]
Definition: sch_text.cpp:57
bool IsItalic() const
Definition: eda_text.h:187
int GetLabelSpinStyle() const
Definition: sch_text.h:119
#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
SCH_LAYER_ID
Eeschema drawing layers.
wxPoint GetPosition() const override
Function GetPosition.
Definition: sch_text.h:190
SCH_LAYER_ID GetLayer() const
Function GetLayer returns the layer this item is on.
Definition: sch_item.h:193
int GetTextWidth() const
Definition: eda_text.h:235
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
PINSHEETLABEL_SHAPE GetShape() const
Definition: sch_text.h:121

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, m_out, OUTPUTFORMATTER::Print(), SheetLabelType, and TO_UTF8.

Referenced by Format().

◆ SymbolLibOptions()

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

◆ writeDocFile()

bool SCH_LEGACY_PLUGIN::writeDocFile ( const PROPERTIES aProperties)
private

Definition at line 4254 of file sch_legacy_plugin.cpp.

4255 {
4256  std::string propName( SCH_LEGACY_PLUGIN::PropNoDocFile );
4257 
4258  if( aProperties && aProperties->find( propName ) != aProperties->end() )
4259  return false;
4260 
4261  return true;
4262 }
static const char * PropNoDocFile
const char* PropBuffering

References PropNoDocFile.

Referenced by CreateSymbolLib(), DeleteAlias(), DeleteSymbol(), SaveLibrary(), and SaveSymbol().

Member Data Documentation

◆ m_cache

◆ m_currentPath

std::stack<wxString> SCH_LEGACY_PLUGIN::m_currentPath
protected

Stack to maintain nested sheet paths.

Definition at line 182 of file sch_legacy_plugin.h.

Referenced by Load(), and loadHierarchy().

◆ m_error

wxString SCH_LEGACY_PLUGIN::m_error
protected

For throwing exceptions or errors on partial schematic loads.

Definition at line 179 of file sch_legacy_plugin.h.

Referenced by GetError(), loadHeader(), and loadHierarchy().

◆ m_kiway

KIWAY* SCH_LEGACY_PLUGIN::m_kiway
protected

Required for path to legacy component libraries.

Definition at line 184 of file sch_legacy_plugin.h.

Referenced by Format(), init(), and loadHierarchy().

◆ m_out

OUTPUTFORMATTER* SCH_LEGACY_PLUGIN::m_out
protected

◆ m_path

wxString SCH_LEGACY_PLUGIN::m_path
protected

Root project path for loading child sheets.

Definition at line 181 of file sch_legacy_plugin.h.

Referenced by Load().

◆ m_props

const PROPERTIES* SCH_LEGACY_PLUGIN::m_props
protected

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

Definition at line 183 of file sch_legacy_plugin.h.

Referenced by cacheLib(), CreateSymbolLib(), DeleteAlias(), DeleteSymbol(), EnumerateSymbolLib(), GetSymbolLibCount(), init(), LoadSymbol(), and SaveSymbol().

◆ m_rootSheet

SCH_SHEET* SCH_LEGACY_PLUGIN::m_rootSheet
protected

The root sheet of the schematic being loaded..

Definition at line 185 of file sch_legacy_plugin.h.

Referenced by init(), Load(), loadComponent(), and loadHierarchy().

◆ m_version

int SCH_LEGACY_PLUGIN::m_version
protected

Version of file being loaded.

Definition at line 176 of file sch_legacy_plugin.h.

Referenced by init(), loadComponent(), LoadContent(), loadFile(), loadHeader(), and loadText().

◆ PropBuffering

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 88 of file sch_legacy_plugin.h.

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

◆ PropNoDocFile

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 96 of file sch_legacy_plugin.h.

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


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