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...
 
const wxString GetLibraryFileExtension () const override
 Return the library file extension for the SCH_PLUGIN object. 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)
 
void EnumerateSymbolLib (wxArrayString &aSymbolNameList, 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_PART * > &aSymbolList, const wxString &aLibraryPath, const PROPERTIES *aProperties=nullptr) override
 Populate a list of LIB_PART aliases contained within the library aLibraryPath. More...
 
LIB_PARTLoadSymbol (const wxString &aLibraryPath, const wxString &aAliasName, const PROPERTIES *aProperties=nullptr) override
 Load a LIB_PART object having aPartName 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 DeleteSymbol (const wxString &aLibraryPath, const wxString &aSymbolName, 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"
 The property used internally by the plugin to enable cache buffering which prevents the library file from being written every time the cache is changed. More...
 
static const char * PropNoDocFile = "no_doc_file"
 The property used internally by the plugin to disable writing the library documentation (.dcm) file when saving the library cache. 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 63 of file sch_legacy_plugin.h.

Constructor & Destructor Documentation

◆ SCH_LEGACY_PLUGIN()

SCH_LEGACY_PLUGIN::SCH_LEGACY_PLUGIN ( )

Definition at line 565 of file sch_legacy_plugin.cpp.

566 {
567  init( NULL );
568 }
void init(KIWAY *aKiway, const PROPERTIES *aProperties=nullptr)
initialize PLUGIN like a constructor would.
#define NULL

References init(), and NULL.

◆ ~SCH_LEGACY_PLUGIN()

SCH_LEGACY_PLUGIN::~SCH_LEGACY_PLUGIN ( )
virtual

Definition at line 571 of file sch_legacy_plugin.cpp.

572 {
573  delete m_cache;
574 }
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 4313 of file sch_legacy_plugin.cpp.

4314 {
4315  if( !m_cache || !m_cache->IsFile( aLibraryFileName ) || m_cache->IsFileChanged() )
4316  {
4317  // a spectacular episode in memory management:
4318  delete m_cache;
4319  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryFileName );
4320 
4321  // Because m_cache is rebuilt, increment PART_LIBS::s_modify_generation
4322  // to modify the hash value that indicate component to symbol links
4323  // must be updated.
4325 
4326  if( !isBuffering( m_props ) )
4327  m_cache->Load();
4328  }
4329 }
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 DeleteSymbol(), EnumerateSymbolLib(), 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 4516 of file sch_legacy_plugin.cpp.

4517 {
4518  // Open file and check first line
4519  wxTextFile tempFile;
4520 
4521  tempFile.Open( aFileName );
4522  wxString firstline;
4523  // read the first line
4524  firstline = tempFile.GetFirstLine();
4525  tempFile.Close();
4526 
4527  return firstline.StartsWith( "EESchema" );
4528 }

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

4451 {
4452  if( wxFileExists( aLibraryPath ) )
4453  {
4455  _( "symbol library \"%s\" already exists, cannot create a new library" ),
4456  aLibraryPath.GetData() ) );
4457  }
4458 
4459  LOCALE_IO toggle;
4460 
4461  m_props = aProperties;
4462 
4463  delete m_cache;
4464  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryPath );
4465  m_cache->SetModified();
4466  m_cache->Save( writeDocFile( aProperties ) );
4467  m_cache->Load(); // update m_writable and m_mod_time
4468 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:202
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
#define _(s)
Definition: 3d_actions.cpp:33
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().

◆ DeleteSymbol()

void SCH_LEGACY_PLUGIN::DeleteSymbol ( const wxString &  aLibraryPath,
const wxString &  aSymbolName,
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.
aSymbolNameis the name of a LIB_PART 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 4435 of file sch_legacy_plugin.cpp.

4437 {
4438  m_props = aProperties;
4439 
4440  cacheLib( aLibraryPath );
4441 
4442  m_cache->DeleteSymbol( aSymbolName );
4443 
4444  if( !isBuffering( aProperties ) )
4445  m_cache->Save( writeDocFile( aProperties ) );
4446 }
void DeleteSymbol(const wxString &aName)
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;.
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 4471 of file sch_legacy_plugin.cpp.

4473 {
4474  wxFileName fn = aLibraryPath;
4475 
4476  if( !fn.FileExists() )
4477  return false;
4478 
4479  // Some of the more elaborate wxRemoveFile() crap puts up its own wxLog dialog
4480  // we don't want that. we want bare metal portability with no UI here.
4481  if( wxRemove( aLibraryPath ) )
4482  {
4483  THROW_IO_ERROR( wxString::Format( _( "library \"%s\" cannot be deleted" ),
4484  aLibraryPath.GetData() ) );
4485  }
4486 
4487  if( m_cache && m_cache->IsFile( aLibraryPath ) )
4488  {
4489  delete m_cache;
4490  m_cache = 0;
4491  }
4492 
4493  return true;
4494 }
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
#define _(s)
Definition: 3d_actions.cpp:33

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

◆ EnumerateSymbolLib() [1/2]

void SCH_LEGACY_PLUGIN::EnumerateSymbolLib ( wxArrayString &  aSymbolNameList,
const wxString &  aLibraryPath,
const PROPERTIES aProperties = nullptr 
)
overridevirtual

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

Parameters
aSymbolNameListis an array to populate with the LIB_PART 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 4359 of file sch_legacy_plugin.cpp.

4362 {
4363  LOCALE_IO toggle; // toggles on, then off, the C locale.
4364 
4365  m_props = aProperties;
4366 
4367  bool powerSymbolsOnly = ( aProperties &&
4368  aProperties->find( SYMBOL_LIB_TABLE::PropPowerSymsOnly ) != aProperties->end() );
4369  cacheLib( aLibraryPath );
4370 
4371  const LIB_PART_MAP& symbols = m_cache->m_symbols;
4372 
4373  for( LIB_PART_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
4374  {
4375  if( !powerSymbolsOnly || it->second->IsPower() )
4376  aSymbolNameList.Add( it->first );
4377  }
4378 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:202
SCH_LEGACY_PLUGIN_CACHE * m_cache
std::map< wxString, LIB_PART *, LibPartMapSort > LIB_PART_MAP
Part 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(), m_cache, m_props, SCH_LEGACY_PLUGIN_CACHE::m_symbols, and SYMBOL_LIB_TABLE::PropPowerSymsOnly.

◆ EnumerateSymbolLib() [2/2]

void SCH_LEGACY_PLUGIN::EnumerateSymbolLib ( std::vector< LIB_PART * > &  aSymbolList,
const wxString &  aLibraryPath,
const PROPERTIES aProperties = nullptr 
)
overridevirtual

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

Note
It is the reponsibility of the caller to delete the returned object from the heap. Failure to do this will result in memory leaks.
Parameters
aSymbolListis an array to populate with the LIB_PART 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 4381 of file sch_legacy_plugin.cpp.

4384 {
4385  LOCALE_IO toggle; // toggles on, then off, the C locale.
4386 
4387  m_props = aProperties;
4388 
4389  bool powerSymbolsOnly = ( aProperties &&
4390  aProperties->find( SYMBOL_LIB_TABLE::PropPowerSymsOnly ) != aProperties->end() );
4391  cacheLib( aLibraryPath );
4392 
4393  const LIB_PART_MAP& symbols = m_cache->m_symbols;
4394 
4395  for( LIB_PART_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
4396  {
4397  if( !powerSymbolsOnly || it->second->IsPower() )
4398  aSymbolList.push_back( it->second );
4399  }
4400 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:202
SCH_LEGACY_PLUGIN_CACHE * m_cache
std::map< wxString, LIB_PART *, LibPartMapSort > LIB_PART_MAP
Part 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(), m_cache, m_props, SCH_LEGACY_PLUGIN_CACHE::m_symbols, and SYMBOL_LIB_TABLE::PropPowerSymsOnly.

◆ Format() [1/2]

void SCH_LEGACY_PLUGIN::Format ( SCH_SCREEN aScreen)

Definition at line 1841 of file sch_legacy_plugin.cpp.

1842 {
1843  wxCHECK_RET( aScreen != NULL, "NULL SCH_SCREEN* object." );
1844  wxCHECK_RET( m_kiway != NULL, "NULL KIWAY* object." );
1845 
1846  // Write the header
1847  m_out->Print( 0, "%s %s %d\n", "EESchema", SCHEMATIC_HEAD_STRING, EESCHEMA_VERSION );
1848 
1849  // This section is not used, but written for file compatibility
1850  m_out->Print( 0, "EELAYER %d %d\n", SCH_LAYER_ID_COUNT, 0 );
1851  m_out->Print( 0, "EELAYER END\n" );
1852 
1853  /* Write page info, ScreenNumber and NumberOfScreen; not very meaningful for
1854  * SheetNumber and Sheet Count in a complex hierarchy, but useful in
1855  * simple hierarchy and flat hierarchy. Used also to search the root
1856  * sheet ( ScreenNumber = 1 ) within the files
1857  */
1858  const TITLE_BLOCK& tb = aScreen->GetTitleBlock();
1859  const PAGE_INFO& page = aScreen->GetPageSettings();
1860 
1861  m_out->Print( 0, "$Descr %s %d %d%s\n", TO_UTF8( page.GetType() ),
1862  page.GetWidthMils(),
1863  page.GetHeightMils(),
1864  !page.IsCustom() && page.IsPortrait() ? " portrait" : "" );
1865  m_out->Print( 0, "encoding utf-8\n" );
1866  m_out->Print( 0, "Sheet %d %d\n", aScreen->m_ScreenNumber, aScreen->m_NumberOfScreens );
1867  m_out->Print( 0, "Title %s\n", EscapedUTF8( tb.GetTitle() ).c_str() );
1868  m_out->Print( 0, "Date %s\n", EscapedUTF8( tb.GetDate() ).c_str() );
1869  m_out->Print( 0, "Rev %s\n", EscapedUTF8( tb.GetRevision() ).c_str() );
1870  m_out->Print( 0, "Comp %s\n", EscapedUTF8( tb.GetCompany() ).c_str() );
1871  m_out->Print( 0, "Comment1 %s\n", EscapedUTF8( tb.GetComment( 0 ) ).c_str() );
1872  m_out->Print( 0, "Comment2 %s\n", EscapedUTF8( tb.GetComment( 1 ) ).c_str() );
1873  m_out->Print( 0, "Comment3 %s\n", EscapedUTF8( tb.GetComment( 2 ) ).c_str() );
1874  m_out->Print( 0, "Comment4 %s\n", EscapedUTF8( tb.GetComment( 3 ) ).c_str() );
1875  m_out->Print( 0, "Comment5 %s\n", EscapedUTF8( tb.GetComment( 4 ) ).c_str() );
1876  m_out->Print( 0, "Comment6 %s\n", EscapedUTF8( tb.GetComment( 5 ) ).c_str() );
1877  m_out->Print( 0, "Comment7 %s\n", EscapedUTF8( tb.GetComment( 6 ) ).c_str() );
1878  m_out->Print( 0, "Comment8 %s\n", EscapedUTF8( tb.GetComment( 7 ) ).c_str() );
1879  m_out->Print( 0, "Comment9 %s\n", EscapedUTF8( tb.GetComment( 8 ) ).c_str() );
1880  m_out->Print( 0, "$EndDescr\n" );
1881 
1882  for( const auto& alias : aScreen->GetBusAliases() )
1883  {
1884  saveBusAlias( alias );
1885  }
1886 
1887  // Enforce item ordering
1888  auto cmp = []( const SCH_ITEM* a, const SCH_ITEM* b ) { return *a < *b; };
1889  std::multiset<SCH_ITEM*, decltype( cmp )> save_map( cmp );
1890 
1891  for( auto item : aScreen->Items() )
1892  save_map.insert( item );
1893 
1894 
1895  for( auto& item : save_map )
1896  {
1897  switch( item->Type() )
1898  {
1899  case SCH_COMPONENT_T:
1900  saveComponent( static_cast<SCH_COMPONENT*>( item ) );
1901  break;
1902  case SCH_BITMAP_T:
1903  saveBitmap( static_cast<SCH_BITMAP*>( item ) );
1904  break;
1905  case SCH_SHEET_T:
1906  saveSheet( static_cast<SCH_SHEET*>( item ) );
1907  break;
1908  case SCH_JUNCTION_T:
1909  saveJunction( static_cast<SCH_JUNCTION*>( item ) );
1910  break;
1911  case SCH_NO_CONNECT_T:
1912  saveNoConnect( static_cast<SCH_NO_CONNECT*>( item ) );
1913  break;
1914  case SCH_BUS_WIRE_ENTRY_T:
1915  case SCH_BUS_BUS_ENTRY_T:
1916  saveBusEntry( static_cast<SCH_BUS_ENTRY_BASE*>( item ) );
1917  break;
1918  case SCH_LINE_T:
1919  saveLine( static_cast<SCH_LINE*>( item ) );
1920  break;
1921  case SCH_TEXT_T:
1922  case SCH_LABEL_T:
1923  case SCH_GLOBAL_LABEL_T:
1924  case SCH_HIER_LABEL_T:
1925  saveText( static_cast<SCH_TEXT*>( item ) );
1926  break;
1927  default:
1928  wxASSERT( "Unexpected schematic object type in SCH_LEGACY_PLUGIN::Format()" );
1929  }
1930  }
1931 
1932  m_out->Print( 0, "$EndSCHEMATC\n" );
1933 }
int m_ScreenNumber
Definition: base_screen.h:135
void saveLine(SCH_LINE *aLine)
const wxString & GetComment(int aIdx) const
Definition: title_block.h:110
int GetHeightMils() const
Definition: page_info.h:140
void saveText(SCH_TEXT *aText)
const TITLE_BLOCK & GetTitleBlock() const
Definition: sch_screen.h:162
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
TITLE_BLOCK holds the information shown in the lower right corner of a plot, printout,...
Definition: title_block.h:40
const PAGE_INFO & GetPageSettings() const
Definition: sch_screen.h:152
void saveSheet(SCH_SHEET *aSheet)
std::string EscapedUTF8(wxString aString)
Function EscapedUTF8 returns an 8 bit UTF8 string given aString in unicode form.
Definition: string.cpp:249
void saveJunction(SCH_JUNCTION *aJunction)
#define SCHEMATIC_HEAD_STRING
Definition: general.h:41
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:48
#define EESCHEMA_VERSION
Definition: general.h:40
#define NULL
const wxString & GetRevision() const
Definition: title_block.h:89
PAGE_INFO describes the page size and margins of a paper page on which to eventually print or plot.
Definition: page_info.h:54
const wxString & GetCompany() const
Definition: title_block.h:99
void saveBitmap(SCH_BITMAP *aBitmap)
void saveComponent(SCH_COMPONENT *aComponent)
const wxString & GetDate() const
Definition: title_block.h:79
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
EE_RTREE & Items()
Definition: sch_screen.h:127
int m_NumberOfScreens
Definition: base_screen.h:136
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
SCH_ITEM is a base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:147
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:464
int GetWidthMils() const
Definition: page_info.h:137

References EESCHEMA_VERSION, EscapedUTF8(), SCH_SCREEN::GetBusAliases(), TITLE_BLOCK::GetComment(), TITLE_BLOCK::GetCompany(), TITLE_BLOCK::GetDate(), 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(), SCH_SCREEN::Items(), m_kiway, BASE_SCREEN::m_NumberOfScreens, m_out, BASE_SCREEN::m_ScreenNumber, NULL, OUTPUTFORMATTER::Print(), 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 1936 of file sch_legacy_plugin.cpp.

1937 {
1938  m_out = aFormatter;
1939 
1940  for( unsigned i = 0; i < aSelection->GetSize(); ++i )
1941  {
1942  SCH_ITEM* item = (SCH_ITEM*) aSelection->GetItem( i );
1943 
1944  switch( item->Type() )
1945  {
1946  case SCH_COMPONENT_T:
1947  saveComponent( static_cast< SCH_COMPONENT* >( item ) );
1948  break;
1949  case SCH_BITMAP_T:
1950  saveBitmap( static_cast< SCH_BITMAP* >( item ) );
1951  break;
1952  case SCH_SHEET_T:
1953  saveSheet( static_cast< SCH_SHEET* >( item ) );
1954  break;
1955  case SCH_JUNCTION_T:
1956  saveJunction( static_cast< SCH_JUNCTION* >( item ) );
1957  break;
1958  case SCH_NO_CONNECT_T:
1959  saveNoConnect( static_cast< SCH_NO_CONNECT* >( item ) );
1960  break;
1961  case SCH_BUS_WIRE_ENTRY_T:
1962  case SCH_BUS_BUS_ENTRY_T:
1963  saveBusEntry( static_cast< SCH_BUS_ENTRY_BASE* >( item ) );
1964  break;
1965  case SCH_LINE_T:
1966  saveLine( static_cast< SCH_LINE* >( item ) );
1967  break;
1968  case SCH_TEXT_T:
1969  case SCH_LABEL_T:
1970  case SCH_GLOBAL_LABEL_T:
1971  case SCH_HIER_LABEL_T:
1972  saveText( static_cast< SCH_TEXT* >( item ) );
1973  break;
1974  default:
1975  wxASSERT( "Unexpected schematic object type in SCH_LEGACY_PLUGIN::Format()" );
1976  }
1977  }
1978 }
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:104
void saveComponent(SCH_COMPONENT *aComponent)
virtual unsigned int GetSize() const override
Function GetSize() Returns the number of stored items.
Definition: selection.h:99
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
SCH_ITEM is a base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:147
void saveBusEntry(SCH_BUS_ENTRY_BASE *aBusEntry)
KICAD_T Type() const
Function Type()
Definition: base_struct.h:212

References SELECTION::GetItem(), SELECTION::GetSize(), 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 4544 of file sch_legacy_plugin.cpp.

4545 {
4546  SCH_LEGACY_PLUGIN_CACHE::SaveSymbol( part, formatter );
4547 }
static void SaveSymbol(LIB_PART *aSymbol, OUTPUTFORMATTER &aFormatter, LIB_PART_MAP *aMap=nullptr)

References SCH_LEGACY_PLUGIN_CACHE::SaveSymbol().

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

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

136 { 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 75 of file sch_legacy_plugin.h.

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

◆ GetLibraryFileExtension()

const wxString SCH_LEGACY_PLUGIN::GetLibraryFileExtension ( ) const
inlineoverridevirtual

Return the library file extension for the SCH_PLUGIN object.

Implements SCH_PLUGIN.

Definition at line 80 of file sch_legacy_plugin.h.

81  {
82  return wxT( "lib" );
83  }

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

4350 {
4351  if( m_cache )
4352  return m_cache->GetModifyHash();
4353 
4354  // If the cache hasn't been loaded, it hasn't been modified.
4355  return 0;
4356 }
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 70 of file sch_legacy_plugin.h.

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

◆ init()

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

initialize PLUGIN like a constructor would.

Definition at line 577 of file sch_legacy_plugin.cpp.

578 {
579  m_version = 0;
580  m_rootSheet = NULL;
581  m_props = aProperties;
582  m_kiway = aKiway;
583  m_cache = NULL;
584  m_out = NULL;
585 }
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.
#define NULL
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, m_version, and NULL.

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

◆ isBuffering()

bool SCH_LEGACY_PLUGIN::isBuffering ( const PROPERTIES aProperties)
private

Definition at line 4343 of file sch_legacy_plugin.cpp.

4344 {
4345  return ( aProperties && aProperties->Exists( SCH_LEGACY_PLUGIN::PropBuffering ) );
4346 }
bool Exists(const std::string &aProperty) const
Definition: properties.h:44
static const char * PropBuffering
The property used internally by the plugin to enable cache buffering which prevents the library file ...

References PROPERTIES::Exists(), and PropBuffering.

Referenced by cacheLib(), 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 4531 of file sch_legacy_plugin.cpp.

4532 {
4533  return wxFileName::IsFileWritable( aLibraryPath );
4534 }

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

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

◆ loadBitmap()

SCH_BITMAP * SCH_LEGACY_PLUGIN::loadBitmap ( LINE_READER aReader)
private

Definition at line 1076 of file sch_legacy_plugin.cpp.

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

Referenced by LoadContent().

◆ loadBusAlias()

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

Definition at line 1791 of file sch_legacy_plugin.cpp.

1793 {
1794  auto busAlias = std::make_shared< BUS_ALIAS >( aScreen );
1795  const char* line = aReader.Line();
1796 
1797  wxCHECK( strCompare( "BusAlias", line, &line ), NULL );
1798 
1799  wxString buf;
1800  parseUnquotedString( buf, aReader, line, &line );
1801  busAlias->SetName( buf );
1802 
1803  while( *line != '\0' )
1804  {
1805  buf.clear();
1806  parseUnquotedString( buf, aReader, line, &line, true );
1807  if( buf.Len() > 0 )
1808  {
1809  busAlias->AddMember( buf );
1810  }
1811  }
1812 
1813  return busAlias;
1814 }
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.
#define 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(), NULL, parseUnquotedString(), and strCompare().

Referenced by LoadContent().

◆ loadBusEntry()

SCH_BUS_ENTRY_BASE * SCH_LEGACY_PLUGIN::loadBusEntry ( LINE_READER aReader)
private

Definition at line 1303 of file sch_legacy_plugin.cpp.

1304 {
1305  const char* line = aReader.Line();
1306 
1307  wxCHECK( strCompare( "Entry", line, &line ), NULL );
1308 
1309  std::unique_ptr< SCH_BUS_ENTRY_BASE > busEntry;
1310 
1311  if( strCompare( "Wire", line, &line ) )
1312  {
1313  busEntry.reset( new SCH_BUS_WIRE_ENTRY );
1314 
1315  if( !strCompare( "Line", line, &line ) )
1316  SCH_PARSE_ERROR( "invalid bus entry definition expected 'Line'", aReader, line );
1317  }
1318  else if( strCompare( "Bus", line, &line ) )
1319  {
1320  busEntry.reset( new SCH_BUS_BUS_ENTRY );
1321 
1322  if( !strCompare( "Bus", line, &line ) )
1323  SCH_PARSE_ERROR( "invalid bus entry definition expected 'Bus'", aReader, line );
1324  }
1325  else
1326  SCH_PARSE_ERROR( "invalid bus entry type", aReader, line );
1327 
1328  line = aReader.ReadLine();
1329 
1330  wxPoint pos;
1331  wxSize size;
1332 
1333  pos.x = Mils2Iu( parseInt( aReader, line, &line ) );
1334  pos.y = Mils2Iu( parseInt( aReader, line, &line ) );
1335  size.x = Mils2Iu( parseInt( aReader, line, &line ) );
1336  size.y = Mils2Iu( parseInt( aReader, line, &line ) );
1337 
1338  size.x -= pos.x;
1339  size.y -= pos.y;
1340 
1341  busEntry->SetPosition( pos );
1342  busEntry->SetSize( size );
1343 
1344  return busEntry.release();
1345 }
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
#define Mils2Iu(x)
#define 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...
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(), Mils2Iu, NULL, parseInt(), LINE_READER::ReadLine(), SCH_PARSE_ERROR, strCompare(), wxPoint::x, and wxPoint::y.

Referenced by LoadContent().

◆ loadComponent()

SCH_COMPONENT * SCH_LEGACY_PLUGIN::loadComponent ( LINE_READER aReader)
private

Definition at line 1476 of file sch_legacy_plugin.cpp.

1477 {
1478  const char* line = aReader.Line();
1479 
1480  wxCHECK( strCompare( "$Comp", line, &line ), NULL );
1481 
1482  std::unique_ptr< SCH_COMPONENT > component( new SCH_COMPONENT() );
1483 
1484  line = aReader.ReadLine();
1485 
1486  while( line != NULL )
1487  {
1488  if( strCompare( "L", line, &line ) )
1489  {
1490  wxString libName;
1491  size_t pos = 2; // "X" plus ' ' space character.
1492  wxString utf8Line = wxString::FromUTF8( line );
1493  wxStringTokenizer tokens( utf8Line, " \r\n\t" );
1494 
1495  if( tokens.CountTokens() < 2 )
1496  THROW_PARSE_ERROR( "invalid symbol library definition", aReader.GetSource(),
1497  aReader.Line(), aReader.LineNumber(), pos );
1498 
1499  libName = tokens.GetNextToken();
1500  libName.Replace( "~", " " );
1501 
1502  LIB_ID libId;
1503 
1504  // Prior to schematic version 4, library IDs did not have a library nickname so
1505  // parsing the symbol name with LIB_ID::Parse() would break symbol library links
1506  // that contained '/' and ':' characters.
1507  if( m_version > 3 )
1508  libId.Parse( libName, LIB_ID::ID_SCH, true );
1509  else
1510  libId.SetLibItemName( libName, false );
1511 
1512  component->SetLibId( libId );
1513 
1514  wxString refDesignator = tokens.GetNextToken();
1515 
1516  refDesignator.Replace( "~", " " );
1517 
1518  wxString prefix = refDesignator;
1519 
1520  while( prefix.Length() )
1521  {
1522  if( ( prefix.Last() < '0' || prefix.Last() > '9') && prefix.Last() != '?' )
1523  break;
1524 
1525  prefix.RemoveLast();
1526  }
1527 
1528  // Avoid a prefix containing trailing/leading spaces
1529  prefix.Trim( true );
1530  prefix.Trim( false );
1531 
1532  if( prefix.IsEmpty() )
1533  component->SetPrefix( wxString( "U" ) );
1534  else
1535  component->SetPrefix( prefix );
1536  }
1537  else if( strCompare( "U", line, &line ) )
1538  {
1539  // This fixes a potentially buggy files caused by unit being set to zero which
1540  // causes netlist issues. See https://bugs.launchpad.net/kicad/+bug/1677282.
1541  int unit = parseInt( aReader, line, &line );
1542 
1543  if( unit == 0 )
1544  {
1545  unit = 1;
1546 
1547  // Set the file as modified so the user can be warned.
1548  if( m_rootSheet && m_rootSheet->GetScreen() )
1550  }
1551 
1552  component->SetUnit( unit );
1553 
1554  // Same can also happen with the convert parameter
1555  int convert = parseInt( aReader, line, &line );
1556 
1557  if( convert == 0 )
1558  {
1559  convert = 1;
1560 
1561  // Set the file as modified so the user can be warned.
1562  if( m_rootSheet && m_rootSheet->GetScreen() )
1564  }
1565 
1566  component->SetConvert( convert );
1567 
1568  wxString text;
1569  parseUnquotedString( text, aReader, line, &line );
1570 
1571  if( text != "00000000" )
1572  const_cast<KIID&>( component->m_Uuid ) = KIID( text );
1573  }
1574  else if( strCompare( "P", line, &line ) )
1575  {
1576  wxPoint pos;
1577 
1578  pos.x = Mils2Iu( parseInt( aReader, line, &line ) );
1579  pos.y = Mils2Iu( parseInt( aReader, line, &line ) );
1580  component->SetPosition( pos );
1581  }
1582  else if( strCompare( "AR", line, &line ) )
1583  {
1584  const char* strCompare = "Path=";
1585  int len = strlen( strCompare );
1586 
1587  if( strncasecmp( strCompare, line, len ) != 0 )
1588  SCH_PARSE_ERROR( "missing 'Path=' token", aReader, line );
1589 
1590  line += len;
1591  wxString pathStr, reference, unit;
1592 
1593  parseQuotedString( pathStr, aReader, line, &line );
1594 
1595  // Note: AR path excludes root sheet, but includes component. Normalize to
1596  // internal format by shifting everything down one and adding the root sheet.
1597  KIID_PATH path( pathStr );
1598 
1599  if( path.size() > 0 )
1600  {
1601  for( size_t i = path.size() - 1; i > 0; --i )
1602  path[i] = path[i-1];
1603 
1604  path[0] = m_rootSheet->m_Uuid;
1605  }
1606  else
1607  path.push_back( m_rootSheet->m_Uuid );
1608 
1609  strCompare = "Ref=";
1610  len = strlen( strCompare );
1611 
1612  if( strncasecmp( strCompare, line, len ) != 0 )
1613  SCH_PARSE_ERROR( "missing 'Ref=' token", aReader, line );
1614 
1615  line+= len;
1616  parseQuotedString( reference, aReader, line, &line );
1617 
1618  strCompare = "Part=";
1619  len = strlen( strCompare );
1620 
1621  if( strncasecmp( strCompare, line, len ) != 0 )
1622  SCH_PARSE_ERROR( "missing 'Part=' token", aReader, line );
1623 
1624  line+= len;
1625  parseQuotedString( unit, aReader, line, &line );
1626 
1627  long tmp;
1628 
1629  if( !unit.ToLong( &tmp, 10 ) )
1630  SCH_PARSE_ERROR( "expected integer value", aReader, line );
1631 
1632  if( tmp < 0 || tmp > MAX_UNIT_COUNT_PER_PACKAGE )
1633  SCH_PARSE_ERROR( "unit value out of range", aReader, line );
1634 
1635  component->AddHierarchicalReference( path, reference, (int)tmp );
1636  component->GetField( REFERENCE )->SetText( reference );
1637 
1638  }
1639  else if( strCompare( "F", line, &line ) )
1640  {
1641  int index = parseInt( aReader, line, &line );
1642 
1643  wxString text, name;
1644 
1645  parseQuotedString( text, aReader, line, &line, true );
1646 
1647  char orientation = parseChar( aReader, line, &line );
1648  wxPoint pos;
1649  pos.x = Mils2Iu( parseInt( aReader, line, &line ) );
1650  pos.y = Mils2Iu( parseInt( aReader, line, &line ) );
1651  int size = Mils2Iu( parseInt( aReader, line, &line ) );
1652  int attributes = parseHex( aReader, line, &line );
1653 
1654  if( index >= component->GetFieldCount() )
1655  {
1656  // The first MANDATOR_FIELDS _must_ be constructed within
1657  // the SCH_COMPONENT constructor. This assert is simply here
1658  // to guard against a change in that constructor.
1659  wxASSERT( component->GetFieldCount() >= MANDATORY_FIELDS );
1660 
1661  // Ignore the _supplied_ fieldNdx. It is not important anymore
1662  // if within the user defined fields region (i.e. >= MANDATORY_FIELDS).
1663  // We freely renumber the index to fit the next available field slot.
1664  index = component->GetFieldCount(); // new has this index after insertion
1665 
1666  SCH_FIELD field( wxPoint( 0, 0 ), -1, component.get(), name );
1667  component->AddField( field );
1668  }
1669 
1670  // Prior to version 2 of the schematic file format, none of the following existed.
1671  if( m_version > 1 )
1672  {
1673  wxString textAttrs;
1674  char hjustify = parseChar( aReader, line, &line );
1675 
1676  parseUnquotedString( textAttrs, aReader, line, &line );
1677 
1678  // The name of the field is optional.
1679  parseQuotedString( name, aReader, line, &line, true );
1680 
1681  if( hjustify == 'L' )
1682  component->GetField( index )->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT );
1683  else if( hjustify == 'R' )
1684  component->GetField( index )->SetHorizJustify( GR_TEXT_HJUSTIFY_RIGHT );
1685  else if( hjustify != 'C' )
1686  SCH_PARSE_ERROR( "component field text horizontal justification must be "
1687  "L, R, or C", aReader, line );
1688 
1689  // We are guaranteed to have a least one character here for older file formats
1690  // otherwise an exception would have been raised..
1691  if( textAttrs[0] == 'T' )
1692  component->GetField( index )->SetVertJustify( GR_TEXT_VJUSTIFY_TOP );
1693  else if( textAttrs[0] == 'B' )
1694  component->GetField( index )->SetVertJustify( GR_TEXT_VJUSTIFY_BOTTOM );
1695  else if( textAttrs[0] != 'C' )
1696  SCH_PARSE_ERROR( "component field text vertical justification must be "
1697  "B, T, or C", aReader, line );
1698 
1699  // Newer file formats include the bold and italics text attribute.
1700  if( textAttrs.Length() > 1 )
1701  {
1702  if( textAttrs.Length() != 3 )
1703  SCH_PARSE_ERROR( _( "component field text attributes must be 3 characters wide" ),
1704  aReader, line );
1705 
1706  if( textAttrs[1] == 'I' )
1707  component->GetField( index )->SetItalic( true );
1708  else if( textAttrs[1] != 'N' )
1709  SCH_PARSE_ERROR( "component field text italics indicator must be I or N",
1710  aReader, line );
1711 
1712  if( textAttrs[2] == 'B' )
1713  component->GetField( index )->SetBold( true );
1714  else if( textAttrs[2] != 'N' )
1715  SCH_PARSE_ERROR( "component field text bold indicator must be B or N",
1716  aReader, line );
1717  }
1718  }
1719 
1720  component->GetField( index )->SetText( text );
1721  component->GetField( index )->SetTextPos( pos );
1722  component->GetField( index )->SetVisible( !attributes );
1723  component->GetField( index )->SetTextSize( wxSize( size, size ) );
1724 
1725  if( orientation == 'H' )
1726  component->GetField( index )->SetTextAngle( TEXT_ANGLE_HORIZ );
1727  else if( orientation == 'V' )
1728  component->GetField( index )->SetTextAngle( TEXT_ANGLE_VERT );
1729  else
1730  SCH_PARSE_ERROR( "component field orientation must be H or V",
1731  aReader, line );
1732 
1733  if( name.IsEmpty() )
1735 
1736  component->GetField( index )->SetName( name );
1737  }
1738  else if( strCompare( "$EndComp", line ) )
1739  {
1740  // Ensure all flags (some are set by previous initializations) are reset:
1741  component->ClearFlags();
1742  return component.release();
1743  }
1744  else
1745  {
1746  // There are two lines that begin with a tab or spaces that includes a line with the
1747  // redundant position information and the transform matrix settings.
1748 
1749  // Parse the redundant position information just the same to check for formatting
1750  // errors.
1751  parseInt( aReader, line, &line ); // Always 1.
1752  parseInt( aReader, line, &line ); // The X coordinate.
1753  parseInt( aReader, line, &line ); // The Y coordinate.
1754 
1755  line = aReader.ReadLine();
1756 
1757  TRANSFORM transform;
1758 
1759  transform.x1 = parseInt( aReader, line, &line );
1760 
1761  if( transform.x1 < -1 || transform.x1 > 1 )
1762  SCH_PARSE_ERROR( "invalid component X1 transform value", aReader, line );
1763 
1764  transform.y1 = parseInt( aReader, line, &line );
1765 
1766  if( transform.y1 < -1 || transform.y1 > 1 )
1767  SCH_PARSE_ERROR( "invalid component Y1 transform value", aReader, line );
1768 
1769  transform.x2 = parseInt( aReader, line, &line );
1770 
1771  if( transform.x2 < -1 || transform.x2 > 1 )
1772  SCH_PARSE_ERROR( "invalid component X2 transform value", aReader, line );
1773 
1774  transform.y2 = parseInt( aReader, line, &line );
1775 
1776  if( transform.y2 < -1 || transform.y2 > 1 )
1777  SCH_PARSE_ERROR( "invalid component Y2 transform value", aReader, line );
1778 
1779  component->SetTransform( transform );
1780  }
1781 
1782  line = aReader.ReadLine();
1783  }
1784 
1785  SCH_PARSE_ERROR( "invalid component line", aReader, line );
1786 
1787  return NULL; // Prevents compiler warning. Should never get here.
1788 }
#define TEXT_ANGLE_HORIZ
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:282
#define Mils2Iu(x)
Field Reference of part, i.e. "IC21".
int m_version
Version of file being loaded.
int y1
Definition: transform.h:49
Definition: common.h:65
for transforming drawing coordinates for a wxDC device context.
Definition: transform.h:45
#define NULL
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
const KIID m_Uuid
Definition: base_struct.h:169
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:60
#define _(s)
Definition: 3d_actions.cpp:33
SCH_COMPONENT describes a real schematic component.
Definition: sch_component.h:99
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:224
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, EDA_ITEM::m_Uuid, m_version, MANDATORY_FIELDS, MAX_UNIT_COUNT_PER_PACKAGE, Mils2Iu, name, NULL, 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, wxPoint::x, TRANSFORM::x1, TRANSFORM::x2, wxPoint::y, 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 753 of file sch_legacy_plugin.cpp.

754 {
755  m_version = version;
756 
757  // We cannot safely load content without a set root level. If we haven't been given one,
758  // pick the default
759  if( m_rootSheet == nullptr )
761 
762  while( aReader.ReadLine() )
763  {
764  char* line = aReader.Line();
765 
766  while( *line == ' ' )
767  line++;
768 
769  // Either an object will be loaded properly or the file load will fail and raise
770  // an exception.
771  if( strCompare( "$Descr", line ) )
772  loadPageSettings( aReader, aScreen );
773  else if( strCompare( "$Comp", line ) )
774  aScreen->Append( loadComponent( aReader ) );
775  else if( strCompare( "$Sheet", line ) )
776  aScreen->Append( loadSheet( aReader ) );
777  else if( strCompare( "$Bitmap", line ) )
778  aScreen->Append( loadBitmap( aReader ) );
779  else if( strCompare( "Connection", line ) )
780  aScreen->Append( loadJunction( aReader ) );
781  else if( strCompare( "NoConn", line ) )
782  aScreen->Append( loadNoConnect( aReader ) );
783  else if( strCompare( "Wire", line ) )
784  aScreen->Append( loadWire( aReader ) );
785  else if( strCompare( "Entry", line ) )
786  aScreen->Append( loadBusEntry( aReader ) );
787  else if( strCompare( "Text", line ) )
788  aScreen->Append( loadText( aReader ) );
789  else if( strCompare( "BusAlias", line ) )
790  aScreen->AddBusAlias( loadBusAlias( aReader, aScreen ) );
791  else if( strCompare( "$EndSCHEMATC", line ) )
792  return;
793  else
794  SCH_PARSE_ERROR( "unrecognized token", aReader, line );
795  }
796 }
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_SHEET * m_rootSheet
The root sheet of the schematic being loaded..
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.
#define SCH_PARSE_ERROR(text, reader, pos)
void AddBusAlias(std::shared_ptr< BUS_ALIAS > aAlias)
Adds a bus alias definition (and transfers ownership of the pointer)
Definition: sch_screen.cpp:891
void Append(SCH_ITEM *aItem)
Definition: sch_screen.cpp:175
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_SHEET * g_RootSheet
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(), g_RootSheet, LINE_READER::Line(), loadBitmap(), loadBusAlias(), loadBusEntry(), loadComponent(), loadJunction(), loadNoConnect(), loadPageSettings(), loadSheet(), loadText(), loadWire(), m_rootSheet, m_version, LINE_READER::ReadLine(), SCH_PARSE_ERROR, 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 730 of file sch_legacy_plugin.cpp.

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

800 {
801  const char* line = aReader.ReadLine();
802 
803  if( !line || !strCompare( "Eeschema Schematic File Version", line, &line ) )
804  {
805  m_error.Printf( _( "\"%s\" does not appear to be an Eeschema file" ),
806  GetChars( aScreen->GetFileName() ) );
808  }
809 
810  // get the file version here.
811  m_version = parseInt( aReader, line, &line );
812 
813  // The next lines are the lib list section, and are mainly comments, like:
814  // LIBS:power
815  // the lib list is not used, but is in schematic file just in case.
816  // It is usually not empty, but we accept empty list.
817  // If empty, there is a legacy section, not used
818  // EELAYER i j
819  // and the last line is
820  // EELAYER END
821  // Skip all lines until the end of header "EELAYER END" is found
822  while( aReader.ReadLine() )
823  {
824  line = aReader.Line();
825 
826  while( *line == ' ' )
827  line++;
828 
829  if( strCompare( "EELAYER END", line ) )
830  return;
831  }
832 
833  THROW_IO_ERROR( _( "Missing 'EELAYER END'" ) );
834 }
const wxString & GetFileName() const
Definition: sch_screen.h:157
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:101
#define _(s)
Definition: 3d_actions.cpp:33
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 656 of file sch_legacy_plugin.cpp.

657 {
658  SCH_SCREEN* screen = NULL;
659 
660  if( !aSheet->GetScreen() )
661  {
662  // SCH_SCREEN objects store the full path and file name where the SCH_SHEET object only
663  // stores the file name and extension. Add the project path to the file name and
664  // extension to compare when calling SCH_SHEET::SearchHierarchy().
665  wxFileName fileName = aSheet->GetFileName();
666 
667  if( !fileName.IsAbsolute() )
668  fileName.MakeAbsolute( m_currentPath.top() );
669 
670  // Save the current path so that it gets restored when decending and ascending the
671  // sheet hierarchy which allows for sheet schematic files to be nested in folders
672  // relative to the last path a schematic was loaded from.
673  wxLogTrace( traceSchLegacyPlugin, "Saving path \"%s\"", m_currentPath.top() );
674  m_currentPath.push( fileName.GetPath() );
675  wxLogTrace( traceSchLegacyPlugin, "Current path \"%s\"", m_currentPath.top() );
676  wxLogTrace( traceSchLegacyPlugin, "Loading \"%s\"", fileName.GetFullPath() );
677 
678  m_rootSheet->SearchHierarchy( fileName.GetFullPath(), &screen );
679 
680  if( screen )
681  {
682  aSheet->SetScreen( screen );
683 
684  // Do not need to load the sub-sheets - this has already been done.
685  }
686  else
687  {
688  aSheet->SetScreen( new SCH_SCREEN( m_kiway ) );
689  aSheet->GetScreen()->SetFileName( fileName.GetFullPath() );
690 
691  try
692  {
693  loadFile( fileName.GetFullPath(), aSheet->GetScreen() );
694  for( auto aItem : aSheet->GetScreen()->Items().OfType( SCH_SHEET_T ) )
695  {
696  assert( aItem->Type() == SCH_SHEET_T );
697  auto sheet = static_cast<SCH_SHEET*>( aItem );
698 
699  // Set the parent to aSheet. This effectively creates a method to find
700  // the root sheet from any sheet so a pointer to the root sheet does not
701  // need to be stored globally. Note: this is not the same as a hierarchy.
702  // Complex hierarchies can have multiple copies of a sheet. This only
703  // provides a simple tree to find the root sheet.
704  sheet->SetParent( aSheet );
705 
706  // Recursion starts here.
707  loadHierarchy( sheet );
708  }
709  }
710  catch( const IO_ERROR& ioe )
711  {
712  // If there is a problem loading the root sheet, there is no recovery.
713  if( aSheet == m_rootSheet )
714  throw( ioe );
715 
716  // For all subsheets, queue up the error message for the caller.
717  if( !m_error.IsEmpty() )
718  m_error += "\n";
719 
720  m_error += ioe.What();
721  }
722  }
723 
724  m_currentPath.pop();
725  wxLogTrace( traceSchLegacyPlugin, "Restoring path \"%s\"", m_currentPath.top() );
726  }
727 }
bool SearchHierarchy(const wxString &aFilename, SCH_SCREEN **aScreen)
Search the existing hierarchy for an instance of screen loaded from aFileName.
Definition: sch_sheet.cpp:584
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:149
const wxChar *const traceSchLegacyPlugin
Flag to enable legacy schematic plugin debug output.
EE_TYPE OfType(KICAD_T aType)
Definition: sch_rtree.h:219
SCH_SHEET * m_rootSheet
The root sheet of the schematic being loaded..
SCH_SCREEN * GetScreen()
Definition: sch_sheet.h:282
void loadFile(const wxString &aFileName, SCH_SCREEN *aScreen)
#define NULL
void loadHierarchy(SCH_SHEET *aSheet)
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:33
wxString GetFileName() const
Return the filename corresponding to this sheet.
Definition: sch_sheet.h:491
EE_RTREE & Items()
Definition: sch_screen.h:127
void SetFileName(const wxString &aFileName)
Definition: sch_screen.h:155
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.

References SCH_SHEET::GetFileName(), SCH_SHEET::GetScreen(), SCH_SCREEN::Items(), loadFile(), m_currentPath, m_error, m_kiway, m_rootSheet, NULL, EE_RTREE::OfType(), SCH_SHEET_T, SCH_SHEET::SearchHierarchy(), SCH_SCREEN::SetFileName(), 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 1161 of file sch_legacy_plugin.cpp.

1162 {
1163  std::unique_ptr< SCH_JUNCTION > junction( new SCH_JUNCTION );
1164 
1165  const char* line = aReader.Line();
1166 
1167  wxCHECK( strCompare( "Connection", line, &line ), NULL );
1168 
1169  wxString name;
1170 
1171  parseUnquotedString( name, aReader, line, &line );
1172 
1173  wxPoint position;
1174 
1175  position.x = Mils2Iu( parseInt( aReader, line, &line ) );
1176  position.y = Mils2Iu( parseInt( aReader, line, &line ) );
1177  junction->SetPosition( position );
1178 
1179  return junction.release();
1180 }
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.
#define Mils2Iu(x)
#define 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:60
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(), Mils2Iu, name, NULL, parseInt(), parseUnquotedString(), strCompare(), wxPoint::x, and wxPoint::y.

Referenced by LoadContent().

◆ loadNoConnect()

SCH_NO_CONNECT * SCH_LEGACY_PLUGIN::loadNoConnect ( LINE_READER aReader)
private

Definition at line 1183 of file sch_legacy_plugin.cpp.

1184 {
1185  std::unique_ptr< SCH_NO_CONNECT > no_connect( new SCH_NO_CONNECT );
1186 
1187  const char* line = aReader.Line();
1188 
1189  wxCHECK( strCompare( "NoConn", line, &line ), NULL );
1190 
1191  wxString name;
1192 
1193  parseUnquotedString( name, aReader, line, &line );
1194 
1195  wxPoint position;
1196 
1197  position.x = Mils2Iu( parseInt( aReader, line, &line ) );
1198  position.y = Mils2Iu( parseInt( aReader, line, &line ) );
1199  no_connect->SetPosition( position );
1200 
1201  return no_connect.release();
1202 }
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.
#define Mils2Iu(x)
#define 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:60
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(), Mils2Iu, name, NULL, parseInt(), parseUnquotedString(), strCompare(), wxPoint::x, and wxPoint::y.

Referenced by LoadContent().

◆ loadPageSettings()

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

Definition at line 837 of file sch_legacy_plugin.cpp.

838 {
839  wxASSERT( aScreen != NULL );
840 
841  wxString buf;
842  const char* line = aReader.Line();
843 
844  PAGE_INFO pageInfo;
845  TITLE_BLOCK tb;
846 
847  wxCHECK_RET( strCompare( "$Descr", line, &line ), "Invalid sheet description" );
848 
849  parseUnquotedString( buf, aReader, line, &line );
850 
851  if( !pageInfo.SetType( buf ) )
852  SCH_PARSE_ERROR( "invalid page size", aReader, line );
853 
854  int pagew = parseInt( aReader, line, &line );
855  int pageh = parseInt( aReader, line, &line );
856 
857  if( buf == PAGE_INFO::Custom )
858  {
859  pageInfo.SetWidthMils( pagew );
860  pageInfo.SetHeightMils( pageh );
861  }
862  else
863  {
864  wxString orientation;
865 
866  // Non custom size, set portrait if its present. Can be empty string which defaults
867  // to landscape.
868  parseUnquotedString( orientation, aReader, line, &line, true );
869 
870  if( orientation == "portrait" )
871  pageInfo.SetPortrait( true );
872  }
873 
874  aScreen->SetPageSettings( pageInfo );
875 
876  while( line != NULL )
877  {
878  buf.clear();
879 
880  if( !aReader.ReadLine() )
881  SCH_PARSE_ERROR( _( "unexpected end of file" ), aReader, line );
882 
883  line = aReader.Line();
884 
885  if( strCompare( "Sheet", line, &line ) )
886  {
887  aScreen->m_ScreenNumber = parseInt( aReader, line, &line );
888  aScreen->m_NumberOfScreens = parseInt( aReader, line, &line );
889  }
890  else if( strCompare( "Title", line, &line ) )
891  {
892  parseQuotedString( buf, aReader, line, &line, true );
893  tb.SetTitle( buf );
894  }
895  else if( strCompare( "Date", line, &line ) )
896  {
897  parseQuotedString( buf, aReader, line, &line, true );
898  tb.SetDate( buf );
899  }
900  else if( strCompare( "Rev", line, &line ) )
901  {
902  parseQuotedString( buf, aReader, line, &line, true );
903  tb.SetRevision( buf );
904  }
905  else if( strCompare( "Comp", line, &line ) )
906  {
907  parseQuotedString( buf, aReader, line, &line, true );
908  tb.SetCompany( buf );
909  }
910  else if( strCompare( "Comment1", line, &line ) )
911  {
912  parseQuotedString( buf, aReader, line, &line, true );
913  tb.SetComment( 0, buf );
914  }
915  else if( strCompare( "Comment2", line, &line ) )
916  {
917  parseQuotedString( buf, aReader, line, &line, true );
918  tb.SetComment( 1, buf );
919  }
920  else if( strCompare( "Comment3", line, &line ) )
921  {
922  parseQuotedString( buf, aReader, line, &line, true );
923  tb.SetComment( 2, buf );
924  }
925  else if( strCompare( "Comment4", line, &line ) )
926  {
927  parseQuotedString( buf, aReader, line, &line, true );
928  tb.SetComment( 3, buf );
929  }
930  else if( strCompare( "Comment5", line, &line ) )
931  {
932  parseQuotedString( buf, aReader, line, &line, true );
933  tb.SetComment( 4, buf );
934  }
935  else if( strCompare( "Comment6", line, &line ) )
936  {
937  parseQuotedString( buf, aReader, line, &line, true );
938  tb.SetComment( 5, buf );
939  }
940  else if( strCompare( "Comment7", line, &line ) )
941  {
942  parseQuotedString( buf, aReader, line, &line, true );
943  tb.SetComment( 6, buf );
944  }
945  else if( strCompare( "Comment8", line, &line ) )
946  {
947  parseQuotedString( buf, aReader, line, &line, true );
948  tb.SetComment( 7, buf );
949  }
950  else if( strCompare( "Comment9", line, &line ) )
951  {
952  parseQuotedString( buf, aReader, line, &line, true );
953  tb.SetComment( 8, buf );
954  }
955  else if( strCompare( "$EndDescr", line ) )
956  {
957  aScreen->SetTitleBlock( tb );
958  return;
959  }
960  }
961 
962  SCH_PARSE_ERROR( "missing 'EndDescr'", aReader, line );
963 }
int m_ScreenNumber
Definition: base_screen.h:135
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:153
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.
TITLE_BLOCK holds the information shown in the lower right corner of a plot, printout,...
Definition: title_block.h:40
void SetComment(int aIdx, const wxString &aComment)
Definition: title_block.h:104
#define NULL
PAGE_INFO describes the page size and margins of a paper page on which to eventually print or plot.
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:164
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
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)
#define _(s)
Definition: 3d_actions.cpp:33
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:136
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, NULL, parseInt(), parseQuotedString(), parseUnquotedString(), LINE_READER::ReadLine(), SCH_PARSE_ERROR, TITLE_BLOCK::SetComment(), 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 966 of file sch_legacy_plugin.cpp.

967 {
968  std::unique_ptr< SCH_SHEET > sheet( new SCH_SHEET() );
969 
970  const char* line = aReader.ReadLine();
971 
972  while( line != NULL )
973  {
974  if( strCompare( "S", line, &line ) ) // Sheet dimensions.
975  {
976  wxPoint position;
977 
978  position.x = Mils2Iu( parseInt( aReader, line, &line ) );
979  position.y = Mils2Iu( parseInt( aReader, line, &line ) );
980  sheet->SetPosition( position );
981 
982  wxSize size;
983 
984  size.SetWidth( Mils2Iu( parseInt( aReader, line, &line ) ) );
985  size.SetHeight( Mils2Iu( parseInt( aReader, line, &line ) ) );
986  sheet->SetSize( size );
987  }
988  else if( strCompare( "U", line, &line ) ) // Sheet UUID.
989  {
990  wxString text;
991  parseUnquotedString( text, aReader, line );
992 
993  if( text != "00000000" )
994  const_cast<KIID&>( sheet->m_Uuid ) = KIID( text );
995  }
996  else if( *line == 'F' ) // Sheet field.
997  {
998  line++;
999 
1000  wxString text;
1001  int size;
1002  int fieldId = parseInt( aReader, line, &line );
1003 
1004  if( fieldId == 0 || fieldId == 1 ) // Sheet name and file name.
1005  {
1006  parseQuotedString( text, aReader, line, &line );
1007  size = Mils2Iu( parseInt( aReader, line, &line ) );
1008 
1009  SCH_FIELD& field = sheet->GetFields()[ fieldId ];
1010  field.SetText( text );
1011  field.SetTextSize( wxSize( size, size ) );
1012  }
1013  else // Sheet pin.
1014  {
1015  // Use a unique_ptr so that we clean up in the case of a throw
1016  std::unique_ptr< SCH_SHEET_PIN > sheetPin( new SCH_SHEET_PIN( sheet.get() ) );
1017 
1018  sheetPin->SetNumber( fieldId );
1019 
1020  // Can be empty fields.
1021  parseQuotedString( text, aReader, line, &line, true );
1022 
1023  sheetPin->SetText( text );
1024 
1025  if( line == NULL )
1026  THROW_IO_ERROR( _( "unexpected end of line" ) );
1027 
1028  switch( parseChar( aReader, line, &line ) )
1029  {
1030  case 'I': sheetPin->SetShape( PINSHEETLABEL_SHAPE::PS_INPUT ); break;
1031  case 'O': sheetPin->SetShape( PINSHEETLABEL_SHAPE::PS_OUTPUT ); break;
1032  case 'B': sheetPin->SetShape( PINSHEETLABEL_SHAPE::PS_BIDI ); break;
1033  case 'T': sheetPin->SetShape( PINSHEETLABEL_SHAPE::PS_TRISTATE ); break;
1034  case 'U': sheetPin->SetShape( PINSHEETLABEL_SHAPE::PS_UNSPECIFIED ); break;
1035  default: SCH_PARSE_ERROR( "invalid sheet pin type", aReader, line );
1036  }
1037 
1038  switch( parseChar( aReader, line, &line ) )
1039  {
1040  case 'R': sheetPin->SetEdge( SHEET_RIGHT_SIDE ); break;
1041  case 'T': sheetPin->SetEdge( SHEET_TOP_SIDE ); break;
1042  case 'B': sheetPin->SetEdge( SHEET_BOTTOM_SIDE ); break;
1043  case 'L': sheetPin->SetEdge( SHEET_LEFT_SIDE ); break;
1044  default:
1045  SCH_PARSE_ERROR( "invalid sheet pin side", aReader, line );
1046  }
1047 
1048  wxPoint position;
1049 
1050  position.x = Mils2Iu( parseInt( aReader, line, &line ) );
1051  position.y = Mils2Iu( parseInt( aReader, line, &line ) );
1052  sheetPin->SetPosition( position );
1053 
1054  size = Mils2Iu( 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  {
1063  sheet->AutoplaceFields( /* aScreen */ NULL, /* aManual */ false );
1064  return sheet.release();
1065  }
1066 
1067  line = aReader.ReadLine();
1068  }
1069 
1070  SCH_PARSE_ERROR( "missing '$EndSheet`", aReader, line );
1071 
1072  return NULL; // Prevents compiler warning. Should never get here.
1073 }
SCH_FIELD instances are attached to a component and provide a place for the component's value,...
Definition: sch_field.h:52
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 SetTextSize(const wxSize &aNewSize)
Definition: eda_text.h:222
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 Mils2Iu(x)
Definition: common.h:65
virtual void SetText(const wxString &aText)
Definition: eda_text.cpp:111
#define NULL
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:84
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:215
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)
#define _(s)
Definition: 3d_actions.cpp:33
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 _, Mils2Iu, NULL, parseChar(), parseInt(), parseQuotedString(), parseUnquotedString(), PS_BIDI, PS_INPUT, PS_OUTPUT, PS_TRISTATE, PS_UNSPECIFIED, LINE_READER::ReadLine(), SCH_PARSE_ERROR, EDA_TEXT::SetText(), EDA_TEXT::SetTextSize(), SHEET_BOTTOM_SIDE, SHEET_LEFT_SIDE, SHEET_RIGHT_SIDE, SHEET_TOP_SIDE, strCompare(), THROW_IO_ERROR, wxPoint::x, and wxPoint::y.

Referenced by LoadContent().

◆ LoadSymbol()

LIB_PART * SCH_LEGACY_PLUGIN::LoadSymbol ( const wxString &  aLibraryPath,
const wxString &  aPartName,
const PROPERTIES aProperties = nullptr 
)
overridevirtual

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

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several symbols.
aPartNameis the 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 part created on the heap 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 4403 of file sch_legacy_plugin.cpp.

4405 {
4406  LOCALE_IO toggle; // toggles on, then off, the C locale.
4407 
4408  m_props = aProperties;
4409 
4410  cacheLib( aLibraryPath );
4411 
4412  LIB_PART_MAP::const_iterator it = m_cache->m_symbols.find( aSymbolName );
4413 
4414  if( it == m_cache->m_symbols.end() )
4415  return nullptr;
4416 
4417  return it->second;
4418 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:202
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(), m_cache, m_props, and SCH_LEGACY_PLUGIN_CACHE::m_symbols.

◆ loadText()

SCH_TEXT * SCH_LEGACY_PLUGIN::loadText ( LINE_READER aReader)
private

Definition at line 1359 of file sch_legacy_plugin.cpp.

1360 {
1361  const char* line = aReader.Line();
1362 
1363  wxCHECK( strCompare( "Text", line, &line ), NULL );
1364 
1365  std::unique_ptr< SCH_TEXT> text;
1366 
1367  if( strCompare( "Notes", line, &line ) )
1368  text.reset( new SCH_TEXT );
1369  else if( strCompare( "Label", line, &line ) )
1370  text.reset( new SCH_LABEL );
1371  else if( strCompare( "HLabel", line, &line ) )
1372  text.reset( new SCH_HIERLABEL );
1373  else if( strCompare( "GLabel", line, &line ) )
1374  {
1375  // Prior to version 2, the SCH_GLOBALLABEL object did not exist.
1376  if( m_version == 1 )
1377  text.reset( new SCH_HIERLABEL );
1378  else
1379  text.reset( new SCH_GLOBALLABEL );
1380  }
1381  else
1382  SCH_PARSE_ERROR( "unknown Text type", aReader, line );
1383 
1384  // Parse the parameters common to all text objects.
1385  wxPoint position;
1386 
1387  position.x = Mils2Iu( parseInt( aReader, line, &line ) );
1388  position.y = Mils2Iu( parseInt( aReader, line, &line ) );
1389  text->SetPosition( position );
1390 
1391  int spinStyle = parseInt( aReader, line, &line );
1392 
1393  // Sadly we store the orientation of hierarchical and global labels using a different
1394  // int encoding than that for local labels:
1395  // Global Local
1396  // Left justified 0 2
1397  // Up 1 3
1398  // Right justified 2 0
1399  // Down 3 1
1400  // So we must flip it as the enum is setup with the "global" numbering
1401  if( text->Type() != SCH_GLOBAL_LABEL_T && text->Type() != SCH_HIER_LABEL_T )
1402  {
1403  if( spinStyle == 0 )
1404  spinStyle = 2;
1405  else if( spinStyle == 2 )
1406  spinStyle = 0;
1407  }
1408 
1409  text->SetLabelSpinStyle( spinStyle );
1410 
1411  int size = Mils2Iu( parseInt( aReader, line, &line ) );
1412 
1413  text->SetTextSize( wxSize( size, size ) );
1414 
1415  // Parse the global and hierarchical label type.
1416  if( text->Type() == SCH_HIER_LABEL_T || text->Type() == SCH_GLOBAL_LABEL_T )
1417  {
1418  auto resultIt = std::find_if( sheetLabelNames.begin(), sheetLabelNames.end(),
1419  [ &line ]( const auto& it )
1420  {
1421  return strCompare( it.second, line, &line );
1422  } );
1423 
1424  if( resultIt != sheetLabelNames.end() )
1425  text->SetShape( resultIt->first );
1426  else
1427  SCH_PARSE_ERROR( "invalid label type", aReader, line );
1428  }
1429 
1430  int thickness = 0;
1431 
1432  // The following tokens do not exist in version 1 schematic files,
1433  // and not always in version 2 for HLabels and GLabels
1434  if( m_version > 1 )
1435  {
1436  if( m_version > 2 || *line >= ' ' )
1437  {
1438  if( strCompare( "Italic", line, &line ) )
1439  text->SetItalic( true );
1440  else if( !strCompare( "~", line, &line ) )
1441  SCH_PARSE_ERROR( _( "expected 'Italics' or '~'" ), aReader, line );
1442  }
1443 
1444  // The thickness token does not exist in older versions of the schematic file format
1445  // so calling parseInt will be made only if the EOL is not reached.
1446  if( *line >= ' ' )
1447  thickness = parseInt( aReader, line, &line );
1448  }
1449 
1450  text->SetBold( thickness != 0 );
1451  text->SetThickness( thickness != 0 ? GetPenSizeForBold( size ) : 0 );
1452 
1453  // Read the text string for the text.
1454  char* tmp = aReader.ReadLine();
1455 
1456  tmp = strtok( tmp, "\r\n" );
1457  wxString val = FROM_UTF8( tmp );
1458 
1459  for( ; ; )
1460  {
1461  int i = val.find( wxT( "\\n" ) );
1462 
1463  if( i == wxNOT_FOUND )
1464  break;
1465 
1466  val.erase( i, 2 );
1467  val.insert( i, wxT( "\n" ) );
1468  }
1469 
1470  text->SetText( val );
1471 
1472  return text.release();
1473 }
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:62
int GetPenSizeForBold(int aTextSize)
Function GetPensizeForBold.
Definition: gr_text.cpp:66
#define Mils2Iu(x)
int m_version
Version of file being loaded.
#define 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...
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 std::map< PINSHEETLABEL_SHAPE, const char * > sheetLabelNames
#define _(s)
Definition: 3d_actions.cpp:33
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(), LINE_READER::Line(), m_version, Mils2Iu, NULL, parseInt(), LINE_READER::ReadLine(), SCH_GLOBAL_LABEL_T, SCH_HIER_LABEL_T, SCH_PARSE_ERROR, sheetLabelNames, strCompare(), wxPoint::x, and wxPoint::y.

Referenced by LoadContent().

◆ loadWire()

SCH_LINE * SCH_LEGACY_PLUGIN::loadWire ( LINE_READER aReader)
private

Definition at line 1205 of file sch_legacy_plugin.cpp.

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

Referenced by LoadContent().

◆ ParsePart()

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

Definition at line 4537 of file sch_legacy_plugin.cpp.

4539 {
4540  return SCH_LEGACY_PLUGIN_CACHE::LoadPart( reader, aMajorVersion, aMinorVersion );
4541 }
static LIB_PART * LoadPart(LINE_READER &aReader, int aMajorVersion, int aMinorVersion, LIB_PART_MAP *aMap=nullptr)

References SCH_LEGACY_PLUGIN_CACHE::LoadPart().

Referenced by LIB_EDIT_FRAME::DuplicatePart(), 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 1817 of file sch_legacy_plugin.cpp.

1819 {
1820  wxCHECK_RET( aScreen != NULL, "NULL SCH_SCREEN object." );
1821  wxCHECK_RET( !aFileName.IsEmpty(), "No schematic file name defined." );
1822 
1823  LOCALE_IO toggle; // toggles on, then off, the C locale, to write floating point values.
1824 
1825  init( aKiway, aProperties );
1826 
1827  wxFileName fn = aFileName;
1828 
1829  // File names should be absolute. Don't assume everything relative to the project path
1830  // works properly.
1831  wxASSERT( fn.IsAbsolute() );
1832 
1833  FILE_OUTPUTFORMATTER formatter( fn.GetFullPath() );
1834 
1835  m_out = &formatter; // no ownership
1836 
1837  Format( aScreen );
1838 }
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:202
void Format(SCH_SCREEN *aScreen)
#define NULL
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
FILE_OUTPUTFORMATTER may be used for text file output.
Definition: richio.h:492

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

◆ saveBitmap()

void SCH_LEGACY_PLUGIN::saveBitmap ( SCH_BITMAP aBitmap)
private

Definition at line 2127 of file sch_legacy_plugin.cpp.

2128 {
2129  wxCHECK_RET( aBitmap != NULL, "SCH_BITMAP* is NULL" );
2130 
2131  const wxImage* image = aBitmap->GetImage()->GetImageData();
2132 
2133  wxCHECK_RET( image != NULL, "wxImage* is NULL" );
2134 
2135  m_out->Print( 0, "$Bitmap\n" );
2136  m_out->Print( 0, "Pos %-4d %-4d\n",
2137  Iu2Mils( aBitmap->GetPosition().x ),
2138  Iu2Mils( aBitmap->GetPosition().y ) );
2139  m_out->Print( 0, "Scale %f\n", aBitmap->GetImage()->GetScale() );
2140  m_out->Print( 0, "Data\n" );
2141 
2142  wxMemoryOutputStream stream;
2143 
2144  image->SaveFile( stream, wxBITMAP_TYPE_PNG );
2145 
2146  // Write binary data in hexadecimal form (ASCII)
2147  wxStreamBuffer* buffer = stream.GetOutputStreamBuffer();
2148  char* begin = (char*) buffer->GetBufferStart();
2149 
2150  for( int ii = 0; begin < buffer->GetBufferEnd(); begin++, ii++ )
2151  {
2152  if( ii >= 32 )
2153  {
2154  ii = 0;
2155 
2156  m_out->Print( 0, "\n" );
2157  }
2158 
2159  m_out->Print( 0, "%2.2X ", *begin & 0xFF );
2160  }
2161 
2162  m_out->Print( 0, "\nEndData\n" );
2163  m_out->Print( 0, "$EndBitmap\n" );
2164 }
double GetScale() const
Definition: bitmap_base.h:92
wxImage * GetImageData()
Definition: bitmap_base.h:83
wxPoint GetPosition() const override
Function GetPosition.
Definition: sch_bitmap.h:140
#define NULL
BITMAP_BASE * GetImage()
Definition: sch_bitmap.h:59
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, NULL, OUTPUTFORMATTER::Print(), wxPoint::x, and wxPoint::y.

Referenced by Format().

◆ saveBusAlias()

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

Definition at line 2380 of file sch_legacy_plugin.cpp.

2381 {
2382  wxCHECK_RET( aAlias != NULL, "BUS_ALIAS* is NULL" );
2383 
2384  wxString members = boost::algorithm::join( aAlias->Members(), " " );
2385 
2386  m_out->Print( 0, "BusAlias %s %s\n",
2387  TO_UTF8( aAlias->GetName() ), TO_UTF8( members ) );
2388 }
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:48
#define NULL
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, NULL, OUTPUTFORMATTER::Print(), and TO_UTF8.

Referenced by Format().

◆ saveBusEntry()

void SCH_LEGACY_PLUGIN::saveBusEntry ( SCH_BUS_ENTRY_BASE aBusEntry)
private

Definition at line 2251 of file sch_legacy_plugin.cpp.

2252 {
2253  wxCHECK_RET( aBusEntry != NULL, "SCH_BUS_ENTRY_BASE* is NULL" );
2254 
2255  if( aBusEntry->GetLayer() == LAYER_WIRE )
2256  m_out->Print( 0, "Entry Wire Line\n\t%-4d %-4d %-4d %-4d\n",
2257  Iu2Mils( aBusEntry->GetPosition().x ),
2258  Iu2Mils( aBusEntry->GetPosition().y ),
2259  Iu2Mils( aBusEntry->m_End().x ), Iu2Mils( aBusEntry->m_End().y ) );
2260  else
2261  m_out->Print( 0, "Entry Bus Bus\n\t%-4d %-4d %-4d %-4d\n",
2262  Iu2Mils( aBusEntry->GetPosition().x ),
2263  Iu2Mils( aBusEntry->GetPosition().y ),
2264  Iu2Mils( aBusEntry->m_End().x ), Iu2Mils( aBusEntry->m_End().y ) );
2265 }
#define NULL
wxPoint m_End() const
SCH_LAYER_ID GetLayer() const
Function GetLayer returns the layer this item is on.
Definition: sch_item.h:224
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, NULL, OUTPUTFORMATTER::Print(), wxPoint::x, and wxPoint::y.

Referenced by Format().

◆ saveComponent()

void SCH_LEGACY_PLUGIN::saveComponent ( SCH_COMPONENT aComponent)
private

Definition at line 1981 of file sch_legacy_plugin.cpp.

1982 {
1983  std::string name1;
1984  std::string name2;
1985  wxArrayString reference_fields;
1986 
1987  static wxString delimiters( wxT( " " ) );
1988 
1989  // This is redundant with the AR entries below, but it makes the files backwards-compatible.
1990  if( aComponent->GetInstanceReferences().size() > 0 )
1991  {
1992  const COMPONENT_INSTANCE_REFERENCE& instance = aComponent->GetInstanceReferences()[0];
1993  name1 = toUTFTildaText( instance.m_Reference );
1994  }
1995  else
1996  {
1997  if( aComponent->GetField( REFERENCE )->GetText().IsEmpty() )
1998  name1 = toUTFTildaText( aComponent->GetPrefix() );
1999  else
2000  name1 = toUTFTildaText( aComponent->GetField( REFERENCE )->GetText() );
2001  }
2002 
2003  wxString part_name = aComponent->GetLibId().Format();
2004 
2005  if( part_name.size() )
2006  {
2007  name2 = toUTFTildaText( part_name );
2008  }
2009  else
2010  {
2011  name2 = "_NONAME_";
2012  }
2013 
2014  m_out->Print( 0, "$Comp\n" );
2015  m_out->Print( 0, "L %s %s\n", name2.c_str(), name1.c_str() );
2016 
2017  // Generate unit number, conversion and timestamp
2018  m_out->Print( 0, "U %d %d %8.8X\n",
2019  aComponent->GetUnit(),
2020  aComponent->GetConvert(),
2021  aComponent->m_Uuid.AsLegacyTimestamp() );
2022 
2023  // Save the position
2024  m_out->Print( 0, "P %d %d\n",
2025  Iu2Mils( aComponent->GetPosition().x ),
2026  Iu2Mils( aComponent->GetPosition().y ) );
2027 
2028  /* If this is a complex hierarchy; save hierarchical references.
2029  * but for simple hierarchies it is not necessary.
2030  * the reference inf is already saved
2031  * this is useful for old Eeschema version compatibility
2032  */
2033  if( aComponent->GetInstanceReferences().size() > 1 )
2034  {
2035  for( const COMPONENT_INSTANCE_REFERENCE& instance : aComponent->GetInstanceReferences() )
2036  {
2037  /*format:
2038  * AR Path="/140/2" Ref="C99" Part="1"
2039  * where 140 is the uid of the containing sheet
2040  * and 2 is the timestamp of this component.
2041  * (timestamps are actually 8 hex chars)
2042  * Ref is the conventional component reference for this 'path'
2043  * Part is the conventional component part selection for this 'path'
2044  */
2045  wxString path = "/";
2046 
2047  // Skip root sheet
2048  for( int i = 1; i < (int) instance.m_Path.size(); ++i )
2049  path += instance.m_Path[i].AsLegacyTimestampString() + "/";
2050 
2051  m_out->Print( 0, "AR Path=\"%s\" Ref=\"%s\" Part=\"%d\" \n",
2052  TO_UTF8( path + aComponent->m_Uuid.AsLegacyTimestampString() ),
2053  TO_UTF8( instance.m_Reference ),
2054  instance.m_Unit );
2055  }
2056  }
2057 
2058  // update the ugly field index, which I would like to see go away someday soon.
2059  for( int i = 0; i < aComponent->GetFieldCount(); ++i )
2060  aComponent->GetField( i )->SetId( i );
2061 
2062  // Fixed fields:
2063  // Save mandatory fields even if they are blank,
2064  // because the visibility, size and orientation are set from library editor.
2065  for( unsigned i = 0; i < MANDATORY_FIELDS; ++i )
2066  saveField( aComponent->GetField( i ) );
2067 
2068  // User defined fields:
2069  // The *policy* about which user defined fields are part of a symbol is now
2070  // only in the dialog editors. No policy should be enforced here, simply
2071  // save all the user defined fields, they are present because a dialog editor
2072  // thought they should be. If you disagree, go fix the dialog editors.
2073  for( int i = MANDATORY_FIELDS; i < aComponent->GetFieldCount(); ++i )
2074  saveField( aComponent->GetField( i ) );
2075 
2076  // Unit number, position, box ( old standard )
2077  m_out->Print( 0, "\t%-4d %-4d %-4d\n", aComponent->GetUnit(),
2078  Iu2Mils( aComponent->GetPosition().x ),
2079  Iu2Mils( aComponent->GetPosition().y ) );
2080 
2081  TRANSFORM transform = aComponent->GetTransform();
2082 
2083  m_out->Print( 0, "\t%-4d %-4d %-4d %-4d\n",
2084  transform.x1, transform.y1, transform.x2, transform.y2 );
2085  m_out->Print( 0, "$EndComp\n" );
2086 }
int y2
Definition: transform.h:51
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".
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:48
int y1
Definition: transform.h:49
int GetUnit() const
for transforming drawing coordinates for a wxDC device context.
Definition: transform.h:45
timestamp_t AsLegacyTimestamp() const
Definition: common.cpp:143
TRANSFORM & GetTransform() const
const std::vector< COMPONENT_INSTANCE_REFERENCE > & GetInstanceReferences()
std::string toUTFTildaText(const wxString &txt)
Convert a wxString to UTF8 and replace any control characters with a ~, where a control character is ...
int GetFieldCount() const
Return the number of fields in this symbol.
UTF8 Format() const
Definition: lib_id.cpp:237
const KIID m_Uuid
Definition: base_struct.h:169
wxString AsLegacyTimestampString() const
Definition: common.cpp:176
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
wxPoint GetPosition() const override
Function GetPosition.
int GetConvert() const
void SetId(int aId)
Definition: sch_field.h:110
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
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:123

References KIID::AsLegacyTimestamp(), KIID::AsLegacyTimestampString(), LIB_ID::Format(), SCH_COMPONENT::GetConvert(), SCH_COMPONENT::GetField(), SCH_COMPONENT::GetFieldCount(), SCH_COMPONENT::GetInstanceReferences(), SCH_COMPONENT::GetLibId(), SCH_COMPONENT::GetPosition(), SCH_COMPONENT::GetPrefix(), EDA_TEXT::GetText(), SCH_COMPONENT::GetTransform(), SCH_COMPONENT::GetUnit(), m_out, COMPONENT_INSTANCE_REFERENCE::m_Reference, EDA_ITEM::m_Uuid, MANDATORY_FIELDS, OUTPUTFORMATTER::Print(), REFERENCE, saveField(), SCH_FIELD::SetId(), TO_UTF8, toUTFTildaText(), wxPoint::x, TRANSFORM::x1, TRANSFORM::x2, wxPoint::y, TRANSFORM::y1, and TRANSFORM::y2.

Referenced by Format().

◆ saveField()

void SCH_LEGACY_PLUGIN::saveField ( SCH_FIELD aField)
private

Definition at line 2089 of file sch_legacy_plugin.cpp.

2090 {
2091  char hjustify = 'C';
2092 
2093  if( aField->GetHorizJustify() == GR_TEXT_HJUSTIFY_LEFT )
2094  hjustify = 'L';
2095  else if( aField->GetHorizJustify() == GR_TEXT_HJUSTIFY_RIGHT )
2096  hjustify = 'R';
2097 
2098  char vjustify = 'C';
2099 
2100  if( aField->GetVertJustify() == GR_TEXT_VJUSTIFY_BOTTOM )
2101  vjustify = 'B';
2102  else if( aField->GetVertJustify() == GR_TEXT_VJUSTIFY_TOP )
2103  vjustify = 'T';
2104 
2105  m_out->Print( 0, "F %d %s %c %-3d %-3d %-3d %4.4X %c %c%c%c",
2106  aField->GetId(),
2107  EscapedUTF8( aField->GetText() ).c_str(), // wraps in quotes too
2108  aField->GetTextAngle() == TEXT_ANGLE_HORIZ ? 'H' : 'V',
2109  Iu2Mils( aField->GetLibPosition().x ),
2110  Iu2Mils( aField->GetLibPosition().y ),
2111  Iu2Mils( aField->GetTextWidth() ),
2112  !aField->IsVisible(),
2113  hjustify, vjustify,
2114  aField->IsItalic() ? 'I' : 'N',
2115  aField->IsBold() ? 'B' : 'N' );
2116 
2117  // Save field name, if the name is user definable
2118  if( aField->GetId() >= FIELD1 )
2119  {
2120  m_out->Print( 0, " %s", EscapedUTF8( aField->GetName() ).c_str() );
2121  }
2122 
2123  m_out->Print( 0, "\n" );
2124 }
#define TEXT_ANGLE_HORIZ
bool IsBold() const
Definition: eda_text.h:167
EDA_TEXT_VJUSTIFY_T GetVertJustify() const
Definition: eda_text.h:184
bool IsVisible() const
Definition: eda_text.h:170
double GetTextAngle() const
Definition: eda_text.h:158
int GetId() const
Definition: sch_field.h:108
std::string EscapedUTF8(wxString aString)
Function EscapedUTF8 returns an 8 bit UTF8 string given aString in unicode form.
Definition: string.cpp:249
bool IsItalic() const
Definition: eda_text.h:164
EDA_TEXT_HJUSTIFY_T GetHorizJustify() const
Definition: eda_text.h:183
wxPoint GetLibPosition() const
Definition: sch_field.h:190
int GetTextWidth() const
Definition: eda_text.h:226
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:403
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:123

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

Referenced by saveComponent().

◆ saveJunction()

void SCH_LEGACY_PLUGIN::saveJunction ( SCH_JUNCTION aJunction)
private

Definition at line 2231 of file sch_legacy_plugin.cpp.

2232 {
2233  wxCHECK_RET( aJunction != NULL, "SCH_JUNCTION* is NULL" );
2234 
2235  m_out->Print( 0, "Connection ~ %-4d %-4d\n",
2236  Iu2Mils( aJunction->GetPosition().x ),
2237  Iu2Mils( aJunction->GetPosition().y ) );
2238 }
#define NULL
wxPoint GetPosition() const override
Function GetPosition.
Definition: sch_junction.h:99
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, NULL, OUTPUTFORMATTER::Print(), wxPoint::x, and wxPoint::y.

Referenced by Format().

◆ SaveLibrary()

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

Reimplemented from SCH_PLUGIN.

Definition at line 4497 of file sch_legacy_plugin.cpp.

4498 {
4499  if( !m_cache )
4500  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryPath );
4501 
4502  wxString oldFileName = m_cache->GetFileName();
4503 
4504  if( !m_cache->IsFile( aLibraryPath ) )
4505  {
4506  m_cache->SetFileName( aLibraryPath );
4507  }
4508 
4509  // This is a forced save.
4510  m_cache->SetModified();
4511  m_cache->Save( writeDocFile( aProperties ) );
4512  m_cache->SetFileName( oldFileName );
4513 }
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 2268 of file sch_legacy_plugin.cpp.

2269 {
2270  wxCHECK_RET( aLine != NULL, "SCH_LINE* is NULL" );
2271 
2272  const char* layer = "Notes";
2273  const char* width = "Line";
2274 
2275  if( aLine->GetLayer() == LAYER_WIRE )
2276  layer = "Wire";
2277  else if( aLine->GetLayer() == LAYER_BUS )
2278  layer = "Bus";
2279 
2280  m_out->Print( 0, "Wire %s %s", layer, width );
2281 
2282  // Write line style (width, type, color) only for non default values
2283  if( aLine->IsGraphicLine() )
2284  {
2285  if( aLine->GetPenSize() != aLine->GetDefaultWidth() )
2286  m_out->Print( 0, " %s %d", T_WIDTH, Iu2Mils( aLine->GetLineSize() ) );
2287 
2288  if( aLine->GetLineStyle() != aLine->GetDefaultStyle() )
2289  m_out->Print( 0, " %s %s", T_STYLE,
2291 
2292  if( aLine->GetLineColor() != COLOR4D::UNSPECIFIED )
2293  m_out->Print( 0, " %s",
2294  TO_UTF8( aLine->GetLineColor().ToColour().GetAsString( wxC2S_CSS_SYNTAX ) ) );
2295  }
2296 
2297  m_out->Print( 0, "\n" );
2298 
2299  m_out->Print( 0, "\t%-4d %-4d %-4d %-4d",
2300  Iu2Mils( aLine->GetStartPoint().x ), Iu2Mils( aLine->GetStartPoint().y ),
2301  Iu2Mils( aLine->GetEndPoint().x ), Iu2Mils( aLine->GetEndPoint().y ) );
2302 
2303  m_out->Print( 0, "\n");
2304 }
static const char * GetLineStyleName(PLOT_DASH_TYPE aStyle)
Definition: sch_line.cpp:122
COLOR4D GetLineColor() const
Returns COLOR4D::UNSPECIFIED if a custom color hasn't been set for this line.
Definition: sch_line.cpp:247
bool IsGraphicLine() const
Returns if the line is a graphic (non electrical line)
Definition: sch_line.cpp:809
wxPoint GetStartPoint() const
Definition: sch_line.h:97
#define T_WIDTH
int GetDefaultWidth() const
Definition: sch_line.cpp:286
#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:48
PLOT_DASH_TYPE GetDefaultStyle() const
Definition: sch_line.cpp:253
#define NULL
PLOT_DASH_TYPE GetLineStyle() const
Definition: sch_line.cpp:277
SCH_LAYER_ID GetLayer() const
Function GetLayer returns the layer this item is on.
Definition: sch_item.h:224
int GetLineSize() const
Definition: sch_line.h:137
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
int GetPenSize() const override
Function GetPenSize virtual pure.
Definition: sch_line.cpp:306
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
wxPoint GetEndPoint() const
Definition: sch_line.h:100

References 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(), SCH_LINE::IsGraphicLine(), LAYER_BUS, LAYER_WIRE, m_out, NULL, OUTPUTFORMATTER::Print(), T_STYLE, T_WIDTH, TO_UTF8, wxPoint::x, and wxPoint::y.

Referenced by Format().

◆ saveNoConnect()

void SCH_LEGACY_PLUGIN::saveNoConnect ( SCH_NO_CONNECT aNoConnect)
private

Definition at line 2241 of file sch_legacy_plugin.cpp.

2242 {
2243  wxCHECK_RET( aNoConnect != NULL, "SCH_NOCONNECT* is NULL" );
2244 
2245  m_out->Print( 0, "NoConn ~ %-4d %-4d\n",
2246  Iu2Mils( aNoConnect->GetPosition().x ),
2247  Iu2Mils( aNoConnect->GetPosition().y ) );
2248 }
wxPoint GetPosition() const override
Function GetPosition.
#define NULL
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, NULL, OUTPUTFORMATTER::Print(), wxPoint::x, and wxPoint::y.

Referenced by Format().

◆ saveSheet()

void SCH_LEGACY_PLUGIN::saveSheet ( SCH_SHEET aSheet)
private

Definition at line 2167 of file sch_legacy_plugin.cpp.

2168 {
2169  wxCHECK_RET( aSheet != NULL, "SCH_SHEET* is NULL" );
2170 
2171  m_out->Print( 0, "$Sheet\n" );
2172  m_out->Print( 0, "S %-4d %-4d %-4d %-4d\n",
2173  Iu2Mils( aSheet->GetPosition().x ),
2174  Iu2Mils( aSheet->GetPosition().y ),
2175  Iu2Mils( aSheet->GetSize().x ),
2176  Iu2Mils( aSheet->GetSize().y ) );
2177 
2178  m_out->Print( 0, "U %8.8X\n", aSheet->m_Uuid.AsLegacyTimestamp() );
2179 
2180  SCH_FIELD& sheetName = aSheet->GetFields()[SHEETNAME];
2181  SCH_FIELD& fileName = aSheet->GetFields()[SHEETFILENAME];
2182 
2183  if( !sheetName.GetText().IsEmpty() )
2184  m_out->Print( 0, "F0 %s %d\n",
2185  EscapedUTF8( sheetName.GetText() ).c_str(),
2186  Iu2Mils( sheetName.GetTextSize().x ) );
2187 
2188  if( !fileName.GetText().IsEmpty() )
2189  m_out->Print( 0, "F1 %s %d\n",
2190  EscapedUTF8( fileName.GetText() ).c_str(),
2191  Iu2Mils( fileName.GetTextSize().x ) );
2192 
2193  for( const SCH_SHEET_PIN* pin : aSheet->GetPins() )
2194  {
2195  int type, side;
2196 
2197  if( pin->GetText().IsEmpty() )
2198  break;
2199 
2200  switch( pin->GetEdge() )
2201  {
2202  default:
2203  case SHEET_LEFT_SIDE: side = 'L'; break;
2204  case SHEET_RIGHT_SIDE: side = 'R'; break;
2205  case SHEET_TOP_SIDE: side = 'T'; break;
2206  case SHEET_BOTTOM_SIDE: side = 'B'; break;
2207  }
2208 
2209  switch( pin->GetShape() )
2210  {
2211  default:
2212  case PINSHEETLABEL_SHAPE::PS_UNSPECIFIED: type = 'U'; break;
2213  case PINSHEETLABEL_SHAPE::PS_INPUT: type = 'I'; break;
2214  case PINSHEETLABEL_SHAPE::PS_OUTPUT: type = 'O'; break;
2215  case PINSHEETLABEL_SHAPE::PS_BIDI: type = 'B'; break;
2216  case PINSHEETLABEL_SHAPE::PS_TRISTATE: type = 'T'; break;
2217  }
2218 
2219  m_out->Print( 0, "F%d %s %c %c %-3d %-3d %-3d\n",
2220  pin->GetNumber(),
2221  EscapedUTF8( pin->GetText() ).c_str(), // supplies wrapping quotes
2222  type, side, Iu2Mils( pin->GetPosition().x ),
2223  Iu2Mils( pin->GetPosition().y ),
2224  Iu2Mils( pin->GetTextWidth() ) );
2225  }
2226 
2227  m_out->Print( 0, "$EndSheet\n" );
2228 }
SCH_FIELD instances are attached to a component and provide a place for the component's value,...
Definition: sch_field.h:52
std::string EscapedUTF8(wxString aString)
Function EscapedUTF8 returns an 8 bit UTF8 string given aString in unicode form.
Definition: string.cpp:249
std::vector< SCH_FIELD > & GetFields()
Definition: sch_sheet.h:268
#define NULL
timestamp_t AsLegacyTimestamp() const
Definition: common.cpp:143
const wxSize & GetTextSize() const
Definition: eda_text.h:223
Define a sheet pin (label) used in sheets to create hierarchical schematics.
Definition: sch_sheet.h:84
wxPoint GetPosition() const override
Function GetPosition.
Definition: sch_sheet.h:565
const KIID m_Uuid
Definition: base_struct.h:169
std::vector< SCH_SHEET_PIN * > & GetPins()
Definition: sch_sheet.h:357
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
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:123
wxSize GetSize()
Definition: sch_sheet.h:284

References KIID::AsLegacyTimestamp(), EscapedUTF8(), SCH_SHEET::GetFields(), SCH_SHEET::GetPins(), SCH_SHEET::GetPosition(), SCH_SHEET::GetSize(), EDA_TEXT::GetText(), EDA_TEXT::GetTextSize(), m_out, EDA_ITEM::m_Uuid, NULL, OUTPUTFORMATTER::Print(), PS_BIDI, PS_INPUT, PS_OUTPUT, PS_TRISTATE, PS_UNSPECIFIED, SHEET_BOTTOM_SIDE, SHEET_LEFT_SIDE, SHEET_RIGHT_SIDE, SHEET_TOP_SIDE, SHEETFILENAME, SHEETNAME, wxPoint::x, and wxPoint::y.

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

4423 {
4424  m_props = aProperties;
4425 
4426  cacheLib( aLibraryPath );
4427 
4428  m_cache->AddSymbol( aSymbol );
4429 
4430  if( !isBuffering( aProperties ) )
4431  m_cache->Save( writeDocFile( aProperties ) );
4432 }
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 2307 of file sch_legacy_plugin.cpp.

2308 {
2309  wxCHECK_RET( aText != NULL, "SCH_TEXT* is NULL" );
2310 
2311  const char* italics = "~";
2312  const char* textType = "Notes";
2313 
2314  if( aText->IsItalic() )
2315  italics = "Italic";
2316 
2317  wxString text = aText->GetText();
2318 
2319  SCH_LAYER_ID layer = aText->GetLayer();
2320 
2321  if( layer == LAYER_NOTES || layer == LAYER_LOCLABEL )
2322  {
2323  if( layer == LAYER_NOTES )
2324  {
2325  // For compatibility reasons, the text must be saved in only one text line
2326  // so replace all EOLs with \\n
2327  text.Replace( wxT( "\n" ), wxT( "\\n" ) );
2328 
2329  // Here we should have no CR or LF character in line
2330  // This is not always the case if a multiline text was copied (using a copy/paste
2331  // function) from a text that uses E.O.L characters that differs from the current
2332  // EOL format. This is mainly the case under Linux using LF symbol when copying
2333  // a text from Windows (using CRLF symbol) so we must just remove the extra CR left
2334  // (or LF left under MacOSX)
2335  for( unsigned ii = 0; ii < text.Len(); )
2336  {
2337  if( text[ii] == 0x0A || text[ii] == 0x0D )
2338  text.erase( ii, 1 );
2339  else
2340  ii++;
2341  }
2342  }
2343  else
2344  {
2345  textType = "Label";
2346  }
2347 
2348  // Local labels must have their spin style inverted for left and right
2349  int spinStyle = static_cast<int>( aText->GetLabelSpinStyle() );
2350 
2351  if( spinStyle == 0 )
2352  spinStyle = 2;
2353  else if( spinStyle == 2 )
2354  spinStyle = 0;
2355 
2356  m_out->Print( 0, "Text %s %-4d %-4d %-4d %-4d %s %d\n%s\n", textType,
2357  Iu2Mils( aText->GetPosition().x ), Iu2Mils( aText->GetPosition().y ),
2358  spinStyle,
2359  Iu2Mils( aText->GetTextWidth() ),
2360  italics, Iu2Mils( aText->GetThickness() ), TO_UTF8( text ) );
2361  }
2362  else if( layer == LAYER_GLOBLABEL || layer == LAYER_HIERLABEL )
2363  {
2364  textType = ( layer == LAYER_GLOBLABEL ) ? "GLabel" : "HLabel";
2365 
2366  auto shapeLabelIt = sheetLabelNames.find( aText->GetShape() );
2367  wxCHECK_RET( shapeLabelIt != sheetLabelNames.end(), "Shape not found in names list" );
2368 
2369  m_out->Print( 0, "Text %s %-4d %-4d %-4d %-4d %s %s %d\n%s\n", textType,
2370  Iu2Mils( aText->GetPosition().x ), Iu2Mils( aText->GetPosition().y ),
2371  static_cast<int>( aText->GetLabelSpinStyle() ),
2372  Iu2Mils( aText->GetTextWidth() ),
2373  shapeLabelIt->second,
2374  italics,
2375  Iu2Mils( aText->GetThickness() ), TO_UTF8( text ) );
2376  }
2377 }
int GetThickness() const
Return the pen width.
Definition: eda_text.h:148
bool IsItalic() const
Definition: eda_text.h:164
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:48
#define NULL
LABEL_SPIN_STYLE GetLabelSpinStyle() const
Definition: sch_text.h:237
SCH_LAYER_ID
Eeschema drawing layers.
wxPoint GetPosition() const override
Function GetPosition.
Definition: sch_text.h:317
SCH_LAYER_ID GetLayer() const
Function GetLayer returns the layer this item is on.
Definition: sch_item.h:224
int GetTextWidth() const
Definition: eda_text.h:226
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
const std::map< PINSHEETLABEL_SHAPE, const char * > sheetLabelNames
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:404
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:123
PINSHEETLABEL_SHAPE GetShape() const
Definition: sch_text.h:242

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, NULL, OUTPUTFORMATTER::Print(), sheetLabelNames, TO_UTF8, wxPoint::x, and wxPoint::y.

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 132 of file sch_plugin.cpp.

133 {
134  // disable all these in another couple of months, after everyone has seen them:
135 #if 1
136  (*aListToAppendTo)["debug_level"] = UTF8( _(
137  "Enable <b>debug</b> logging for Symbol*() functions in this SCH_PLUGIN."
138  ) );
139 
140  (*aListToAppendTo)["read_filter_regex"] = UTF8( _(
141  "Regular expression <b>symbol name</b> filter."
142  ) );
143 
144  (*aListToAppendTo)["enable_transaction_logging"] = UTF8( _(
145  "Enable transaction logging. The mere presence of this option turns on the "
146  "logging, no need to set a Value."
147  ) );
148 
149  (*aListToAppendTo)["username"] = UTF8( _(
150  "User name for <b>login</b> to some special library server."
151  ));
152 
153  (*aListToAppendTo)["password"] = UTF8( _(
154  "Password for <b>login</b> to some special library server."
155  ) );
156 #endif
157 
158 #if 1
159  // Suitable for a C++ to python SCH_PLUGIN::Footprint*() adapter, move it to the adapter
160  // if and when implemented.
161  (*aListToAppendTo)["python_symbol_plugin"] = UTF8( _(
162  "Enter the python symbol which implements the SCH_PLUGIN::Symbol*() functions."
163  ) );
164 #endif
165 }
UTF8 is an 8 bit string that is assuredly encoded in UTF8, and supplies special conversion support to...
Definition: utf8.h:73
#define _(s)
Definition: 3d_actions.cpp:33

References _.

◆ writeDocFile()

bool SCH_LEGACY_PLUGIN::writeDocFile ( const PROPERTIES aProperties)
private

Definition at line 4332 of file sch_legacy_plugin.cpp.

4333 {
4334  std::string propName( SCH_LEGACY_PLUGIN::PropNoDocFile );
4335 
4336  if( aProperties && aProperties->find( propName ) != aProperties->end() )
4337  return false;
4338 
4339  return true;
4340 }
static const char * PropNoDocFile
The property used internally by the plugin to disable writing the library documentation (....

References PropNoDocFile.

Referenced by CreateSymbolLib(), 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 178 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 175 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 180 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 177 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 179 of file sch_legacy_plugin.h.

Referenced by cacheLib(), CreateSymbolLib(), DeleteSymbol(), EnumerateSymbolLib(), 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 181 of file sch_legacy_plugin.h.

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

◆ m_version

int SCH_LEGACY_PLUGIN::m_version
protected

Version of file being loaded.

Definition at line 172 of file sch_legacy_plugin.h.

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

◆ PropBuffering

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

The 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 90 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

The 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(), SCH_COMPONENT::Resolve(), PART_LIB::Save(), LIB_EDIT_FRAME::SaveOneSymbol(), PART_LIB::SetCache(), and writeDocFile().


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