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
 Return a brief hard coded name for this SCH_PLUGIN. More...
 
const wxString GetFileExtension () const override
 Return 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, SCHEMATIC *aSchematic, 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_SHEET *aScreen, SCHEMATIC *aSchematic, 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_SHEET *aSheet)
 
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 SetReporter (REPORTER *aReporter)
 Set an optional reporter for warnings/errors. 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 (SCHEMATIC *aSchematic, 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...
 
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
 
SCHEMATICm_schematic
 Passed to Load(), the schematic object being loaded. More...
 

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, const PROPERTIES *aProperties)
 
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 581 of file sch_legacy_plugin.cpp.

582 {
583  init( NULL );
584 }
void init(SCHEMATIC *aSchematic, 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 587 of file sch_legacy_plugin.cpp.

588 {
589  delete m_cache;
590 }
SCH_LEGACY_PLUGIN_CACHE * m_cache

References m_cache.

Member Function Documentation

◆ cacheLib()

void SCH_LEGACY_PLUGIN::cacheLib ( const wxString &  aLibraryFileName,
const PROPERTIES aProperties 
)
private

Definition at line 4220 of file sch_legacy_plugin.cpp.

4221 {
4222  if( !m_cache || !m_cache->IsFile( aLibraryFileName ) || m_cache->IsFileChanged() )
4223  {
4224  // a spectacular episode in memory management:
4225  delete m_cache;
4226  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryFileName );
4227 
4228  // Because m_cache is rebuilt, increment PART_LIBS::s_modify_generation
4229  // to modify the hash value that indicate component to symbol links
4230  // must be updated.
4232 
4233  if( !isBuffering( aProperties ) )
4234  m_cache->Load();
4235  }
4236 }
SCH_LEGACY_PLUGIN_CACHE * m_cache
static void IncrementModifyGeneration()
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

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

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

4418 {
4419  // Open file and check first line
4420  wxTextFile tempFile;
4421 
4422  tempFile.Open( aFileName );
4423  wxString firstline;
4424  // read the first line
4425  firstline = tempFile.GetFirstLine();
4426  tempFile.Close();
4427 
4428  return firstline.StartsWith( "EESchema" );
4429 }

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

4354 {
4355  if( wxFileExists( aLibraryPath ) )
4356  {
4358  _( "symbol library \"%s\" already exists, cannot create a new library" ),
4359  aLibraryPath.GetData() ) );
4360  }
4361 
4362  LOCALE_IO toggle;
4363 
4364  delete m_cache;
4365  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryPath );
4366  m_cache->SetModified();
4367  m_cache->Save( writeDocFile( aProperties ) );
4368  m_cache->Load(); // update m_writable and m_mod_time
4369 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: locale_io.h:40
SCH_LEGACY_PLUGIN_CACHE * m_cache
A cache assistant for the part library portion of the SCH_PLUGIN API, and only for the SCH_LEGACY_PLU...
void SetModified(bool aModified=true)
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
#define _(s)
Definition: 3d_actions.cpp:33
void Save(bool aSaveDocFile=true)
Save the entire library to file m_libFileName;.
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
bool writeDocFile(const PROPERTIES *aProperties)

References _, Format(), SCH_LEGACY_PLUGIN_CACHE::Load(), m_cache, 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 4338 of file sch_legacy_plugin.cpp.

4340 {
4341  LOCALE_IO toggle; // toggles on, then off, the C locale.
4342 
4343  cacheLib( aLibraryPath, aProperties );
4344 
4345  m_cache->DeleteSymbol( aSymbolName );
4346 
4347  if( !isBuffering( aProperties ) )
4348  m_cache->Save( writeDocFile( aProperties ) );
4349 }
void DeleteSymbol(const wxString &aName)
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: locale_io.h:40
SCH_LEGACY_PLUGIN_CACHE * m_cache
bool isBuffering(const PROPERTIES *aProperties)
void cacheLib(const wxString &aLibraryFileName, const PROPERTIES *aProperties)
void Save(bool aSaveDocFile=true)
Save the entire library to file m_libFileName;.
bool writeDocFile(const PROPERTIES *aProperties)

References cacheLib(), SCH_LEGACY_PLUGIN_CACHE::DeleteSymbol(), isBuffering(), m_cache, 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 4372 of file sch_legacy_plugin.cpp.

4374 {
4375  wxFileName fn = aLibraryPath;
4376 
4377  if( !fn.FileExists() )
4378  return false;
4379 
4380  // Some of the more elaborate wxRemoveFile() crap puts up its own wxLog dialog
4381  // we don't want that. we want bare metal portability with no UI here.
4382  if( wxRemove( aLibraryPath ) )
4383  {
4384  THROW_IO_ERROR( wxString::Format( _( "library \"%s\" cannot be deleted" ),
4385  aLibraryPath.GetData() ) );
4386  }
4387 
4388  if( m_cache && m_cache->IsFile( aLibraryPath ) )
4389  {
4390  delete m_cache;
4391  m_cache = 0;
4392  }
4393 
4394  return true;
4395 }
SCH_LEGACY_PLUGIN_CACHE * m_cache
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
bool IsFile(const wxString &aFullPathAndFileName) const
#define _(s)
Definition: 3d_actions.cpp:33
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38

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

4269 {
4270  LOCALE_IO toggle; // toggles on, then off, the C locale.
4271 
4272  bool powerSymbolsOnly = ( aProperties &&
4273  aProperties->find( SYMBOL_LIB_TABLE::PropPowerSymsOnly ) != aProperties->end() );
4274 
4275  cacheLib( aLibraryPath, aProperties );
4276 
4277  const LIB_PART_MAP& symbols = m_cache->m_symbols;
4278 
4279  for( LIB_PART_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
4280  {
4281  if( !powerSymbolsOnly || it->second->IsPower() )
4282  aSymbolNameList.Add( it->first );
4283  }
4284 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: locale_io.h:40
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, const PROPERTIES *aProperties)
static const char * PropPowerSymsOnly

References cacheLib(), m_cache, 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 responsibility 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 4287 of file sch_legacy_plugin.cpp.

4290 {
4291  LOCALE_IO toggle; // toggles on, then off, the C locale.
4292 
4293  bool powerSymbolsOnly = ( aProperties &&
4294  aProperties->find( SYMBOL_LIB_TABLE::PropPowerSymsOnly ) != aProperties->end() );
4295 
4296  cacheLib( aLibraryPath, aProperties );
4297 
4298  const LIB_PART_MAP& symbols = m_cache->m_symbols;
4299 
4300  for( LIB_PART_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
4301  {
4302  if( !powerSymbolsOnly || it->second->IsPower() )
4303  aSymbolList.push_back( it->second );
4304  }
4305 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: locale_io.h:40
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, const PROPERTIES *aProperties)
static const char * PropPowerSymsOnly

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

◆ Format() [1/2]

void SCH_LEGACY_PLUGIN::Format ( SCH_SHEET aSheet)

Definition at line 1859 of file sch_legacy_plugin.cpp.

1860 {
1861  wxCHECK_RET( aSheet != NULL, "NULL SCH_SHEET* object." );
1862  wxCHECK_RET( m_schematic != NULL, "NULL SCHEMATIC* object." );
1863 
1864  SCH_SCREEN* screen = aSheet->GetScreen();
1865 
1866  wxCHECK( screen, /* void */ );
1867 
1868  // Write the header
1869  m_out->Print( 0, "%s %s %d\n", "EESchema", SCHEMATIC_HEAD_STRING, EESCHEMA_VERSION );
1870 
1871  // This section is not used, but written for file compatibility
1872  m_out->Print( 0, "EELAYER %d %d\n", SCH_LAYER_ID_COUNT, 0 );
1873  m_out->Print( 0, "EELAYER END\n" );
1874 
1875  /* Write page info, ScreenNumber and NumberOfScreen; not very meaningful for
1876  * SheetNumber and Sheet Count in a complex hierarchy, but useful in
1877  * simple hierarchy and flat hierarchy. Used also to search the root
1878  * sheet ( ScreenNumber = 1 ) within the files
1879  */
1880  const TITLE_BLOCK& tb = screen->GetTitleBlock();
1881  const PAGE_INFO& page = screen->GetPageSettings();
1882 
1883  m_out->Print( 0, "$Descr %s %d %d%s\n", TO_UTF8( page.GetType() ),
1884  page.GetWidthMils(),
1885  page.GetHeightMils(),
1886  !page.IsCustom() && page.IsPortrait() ? " portrait" : "" );
1887  m_out->Print( 0, "encoding utf-8\n" );
1888  m_out->Print( 0, "Sheet %d %d\n", screen->GetVirtualPageNumber(), screen->GetPageCount() );
1889  m_out->Print( 0, "Title %s\n", EscapedUTF8( tb.GetTitle() ).c_str() );
1890  m_out->Print( 0, "Date %s\n", EscapedUTF8( tb.GetDate() ).c_str() );
1891  m_out->Print( 0, "Rev %s\n", EscapedUTF8( tb.GetRevision() ).c_str() );
1892  m_out->Print( 0, "Comp %s\n", EscapedUTF8( tb.GetCompany() ).c_str() );
1893  m_out->Print( 0, "Comment1 %s\n", EscapedUTF8( tb.GetComment( 0 ) ).c_str() );
1894  m_out->Print( 0, "Comment2 %s\n", EscapedUTF8( tb.GetComment( 1 ) ).c_str() );
1895  m_out->Print( 0, "Comment3 %s\n", EscapedUTF8( tb.GetComment( 2 ) ).c_str() );
1896  m_out->Print( 0, "Comment4 %s\n", EscapedUTF8( tb.GetComment( 3 ) ).c_str() );
1897  m_out->Print( 0, "Comment5 %s\n", EscapedUTF8( tb.GetComment( 4 ) ).c_str() );
1898  m_out->Print( 0, "Comment6 %s\n", EscapedUTF8( tb.GetComment( 5 ) ).c_str() );
1899  m_out->Print( 0, "Comment7 %s\n", EscapedUTF8( tb.GetComment( 6 ) ).c_str() );
1900  m_out->Print( 0, "Comment8 %s\n", EscapedUTF8( tb.GetComment( 7 ) ).c_str() );
1901  m_out->Print( 0, "Comment9 %s\n", EscapedUTF8( tb.GetComment( 8 ) ).c_str() );
1902  m_out->Print( 0, "$EndDescr\n" );
1903 
1904  for( const auto& alias : screen->GetBusAliases() )
1905  {
1906  saveBusAlias( alias );
1907  }
1908 
1909  // Enforce item ordering
1910  auto cmp = []( const SCH_ITEM* a, const SCH_ITEM* b ) { return *a < *b; };
1911  std::multiset<SCH_ITEM*, decltype( cmp )> save_map( cmp );
1912 
1913  for( auto item : screen->Items() )
1914  save_map.insert( item );
1915 
1916 
1917  for( auto& item : save_map )
1918  {
1919  switch( item->Type() )
1920  {
1921  case SCH_COMPONENT_T:
1922  saveComponent( static_cast<SCH_COMPONENT*>( item ) );
1923  break;
1924  case SCH_BITMAP_T:
1925  saveBitmap( static_cast<SCH_BITMAP*>( item ) );
1926  break;
1927  case SCH_SHEET_T:
1928  saveSheet( static_cast<SCH_SHEET*>( item ) );
1929  break;
1930  case SCH_JUNCTION_T:
1931  saveJunction( static_cast<SCH_JUNCTION*>( item ) );
1932  break;
1933  case SCH_NO_CONNECT_T:
1934  saveNoConnect( static_cast<SCH_NO_CONNECT*>( item ) );
1935  break;
1936  case SCH_BUS_WIRE_ENTRY_T:
1937  case SCH_BUS_BUS_ENTRY_T:
1938  saveBusEntry( static_cast<SCH_BUS_ENTRY_BASE*>( item ) );
1939  break;
1940  case SCH_LINE_T:
1941  saveLine( static_cast<SCH_LINE*>( item ) );
1942  break;
1943  case SCH_TEXT_T:
1944  case SCH_LABEL_T:
1945  case SCH_GLOBAL_LABEL_T:
1946  case SCH_HIER_LABEL_T:
1947  saveText( static_cast<SCH_TEXT*>( item ) );
1948  break;
1949  default:
1950  wxASSERT( "Unexpected schematic object type in SCH_LEGACY_PLUGIN::Format()" );
1951  }
1952  }
1953 
1954  m_out->Print( 0, "$EndSCHEMATC\n" );
1955 }
SCHEMATIC * m_schematic
Passed to Load(), the schematic object being loaded.
void saveLine(SCH_LINE *aLine)
const wxString & GetComment(int aIdx) const
Definition: title_block.h:107
int GetHeightMils() const
Definition: page_info.h:133
int GetVirtualPageNumber() const
Definition: base_screen.h:79
int GetPageCount() const
Definition: base_screen.h:76
void saveText(SCH_TEXT *aText)
const TITLE_BLOCK & GetTitleBlock() const
Definition: sch_screen.h:138
const wxString & GetType() const
Definition: page_info.h:94
#define SCH_LAYER_ID_COUNT
void saveNoConnect(SCH_NO_CONNECT *aNoConnect)
bool IsCustom() const
Definition: page_info.cpp:180
SCH_SCREEN * GetScreen() const
Definition: sch_sheet.h:103
Hold the information shown in the lower right corner of a plot, printout, or editing view.
Definition: title_block.h:40
const PAGE_INFO & GetPageSettings() const
Definition: sch_screen.h:128
void saveSheet(SCH_SHEET *aSheet)
std::string EscapedUTF8(wxString aString)
Return an 8 bit UTF8 string given aString in Unicode form.
Definition: string.cpp:329
void saveJunction(SCH_JUNCTION *aJunction)
#define SCHEMATIC_HEAD_STRING
Definition: general.h:36
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:96
#define EESCHEMA_VERSION
Definition: general.h:35
#define NULL
const wxString & GetRevision() const
Definition: title_block.h:86
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition: page_info.h:53
const wxString & GetCompany() const
Definition: title_block.h:96
void saveBitmap(SCH_BITMAP *aBitmap)
void saveComponent(SCH_COMPONENT *aComponent)
const wxString & GetDate() const
Definition: title_block.h:76
std::unordered_set< std::shared_ptr< BUS_ALIAS > > GetBusAliases() const
Return a list of bus aliases defined in this screen.
Definition: sch_screen.h:446
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:117
EE_RTREE & Items()
Definition: sch_screen.h:103
const wxString & GetTitle() const
Definition: title_block.h:63
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Format and write text to the output stream.
Definition: richio.cpp:408
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:197
void saveBusEntry(SCH_BUS_ENTRY_BASE *aBusEntry)
int GetWidthMils() const
Definition: page_info.h:130

References EESCHEMA_VERSION, EscapedUTF8(), SCH_SCREEN::GetBusAliases(), TITLE_BLOCK::GetComment(), TITLE_BLOCK::GetCompany(), TITLE_BLOCK::GetDate(), PAGE_INFO::GetHeightMils(), BASE_SCREEN::GetPageCount(), SCH_SCREEN::GetPageSettings(), TITLE_BLOCK::GetRevision(), SCH_SHEET::GetScreen(), TITLE_BLOCK::GetTitle(), SCH_SCREEN::GetTitleBlock(), PAGE_INFO::GetType(), BASE_SCREEN::GetVirtualPageNumber(), PAGE_INFO::GetWidthMils(), PAGE_INFO::IsCustom(), PAGE_INFO::IsPortrait(), SCH_SCREEN::Items(), m_out, m_schematic, 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 Save().

◆ Format() [2/2]

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

Definition at line 1958 of file sch_legacy_plugin.cpp.

1959 {
1960  m_out = aFormatter;
1961 
1962  for( unsigned i = 0; i < aSelection->GetSize(); ++i )
1963  {
1964  SCH_ITEM* item = (SCH_ITEM*) aSelection->GetItem( i );
1965 
1966  switch( item->Type() )
1967  {
1968  case SCH_COMPONENT_T:
1969  saveComponent( static_cast< SCH_COMPONENT* >( item ) );
1970  break;
1971  case SCH_BITMAP_T:
1972  saveBitmap( static_cast< SCH_BITMAP* >( item ) );
1973  break;
1974  case SCH_SHEET_T:
1975  saveSheet( static_cast< SCH_SHEET* >( item ) );
1976  break;
1977  case SCH_JUNCTION_T:
1978  saveJunction( static_cast< SCH_JUNCTION* >( item ) );
1979  break;
1980  case SCH_NO_CONNECT_T:
1981  saveNoConnect( static_cast< SCH_NO_CONNECT* >( item ) );
1982  break;
1983  case SCH_BUS_WIRE_ENTRY_T:
1984  case SCH_BUS_BUS_ENTRY_T:
1985  saveBusEntry( static_cast< SCH_BUS_ENTRY_BASE* >( item ) );
1986  break;
1987  case SCH_LINE_T:
1988  saveLine( static_cast< SCH_LINE* >( item ) );
1989  break;
1990  case SCH_TEXT_T:
1991  case SCH_LABEL_T:
1992  case SCH_GLOBAL_LABEL_T:
1993  case SCH_HIER_LABEL_T:
1994  saveText( static_cast< SCH_TEXT* >( item ) );
1995  break;
1996  default:
1997  wxASSERT( "Unexpected schematic object type in SCH_LEGACY_PLUGIN::Format()" );
1998  }
1999  }
2000 }
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:106
void saveComponent(SCH_COMPONENT *aComponent)
virtual unsigned int GetSize() const override
Return the number of stored items.
Definition: selection.h:101
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:197
void saveBusEntry(SCH_BUS_ENTRY_BASE *aBusEntry)
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:163

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

4447 {
4448  SCH_LEGACY_PLUGIN_CACHE::SaveSymbol( part, formatter );
4449 }
static void SaveSymbol(LIB_PART *aSymbol, OUTPUTFORMATTER &aFormatter, LIB_PART_MAP *aMap=nullptr)

References SCH_LEGACY_PLUGIN_CACHE::SaveSymbol().

◆ 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

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

4257 {
4258  if( m_cache )
4260 
4261  // If the cache hasn't been loaded, it hasn't been modified.
4262  return 0;
4263 }
SCH_LEGACY_PLUGIN_CACHE * m_cache

References SCH_LEGACY_PLUGIN_CACHE::GetModifyHash(), and m_cache.

◆ GetName()

const wxString SCH_LEGACY_PLUGIN::GetName ( ) const
inlineoverridevirtual

Return 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 ( SCHEMATIC aSchematic,
const PROPERTIES aProperties = nullptr 
)
protected

initialize PLUGIN like a constructor would.

Definition at line 593 of file sch_legacy_plugin.cpp.

594 {
595  m_version = 0;
596  m_rootSheet = nullptr;
597  m_schematic = aSchematic;
598  m_cache = nullptr;
599  m_out = nullptr;
600 }
SCHEMATIC * m_schematic
Passed to Load(), the schematic object being loaded.
SCH_LEGACY_PLUGIN_CACHE * m_cache
SCH_SHEET * m_rootSheet
The root sheet of the schematic being loaded..
int m_version
Version of file being loaded.
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.

References m_cache, m_out, m_rootSheet, m_schematic, and m_version.

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

◆ isBuffering()

bool SCH_LEGACY_PLUGIN::isBuffering ( const PROPERTIES aProperties)
private

Definition at line 4250 of file sch_legacy_plugin.cpp.

4251 {
4252  return ( aProperties && aProperties->Exists( SCH_LEGACY_PLUGIN::PropBuffering ) );
4253 }
bool Exists(const std::string &aProperty) const
Definition: properties.h:41
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 4432 of file sch_legacy_plugin.cpp.

4433 {
4434  // Writing legacy symbol libraries is deprecated.
4435  return false;
4436 }

◆ Load()

SCH_SHEET * SCH_LEGACY_PLUGIN::Load ( const wxString &  aFileName,
SCHEMATIC aSchematic,
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 603 of file sch_legacy_plugin.cpp.

605 {
606  wxASSERT( !aFileName || aSchematic != NULL );
607 
608  LOCALE_IO toggle; // toggles on, then off, the C locale.
609  SCH_SHEET* sheet;
610 
611  wxFileName fn = aFileName;
612 
613  // Unfortunately child sheet file names the legacy schematic file format are not fully
614  // qualified and are always appended to the project path. The aFileName attribute must
615  // always be an absolute path so the project path can be used for load child sheet files.
616  wxASSERT( fn.IsAbsolute() );
617 
618  if( aAppendToMe )
619  {
620  wxLogTrace( traceSchLegacyPlugin, "Append \"%s\" to sheet \"%s\".",
621  aFileName, aAppendToMe->GetFileName() );
622 
623  wxFileName normedFn = aAppendToMe->GetFileName();
624 
625  if( !normedFn.IsAbsolute() )
626  {
627  if( aFileName.Right( normedFn.GetFullPath().Length() ) == normedFn.GetFullPath() )
628  m_path = aFileName.Left( aFileName.Length() - normedFn.GetFullPath().Length() );
629  }
630 
631  if( m_path.IsEmpty() )
632  m_path = aSchematic->Prj().GetProjectPath();
633 
634  wxLogTrace( traceSchLegacyPlugin, "m_Normalized append path \"%s\".", m_path );
635  }
636  else
637  {
638  m_path = aSchematic->Prj().GetProjectPath();
639  }
640 
641  m_currentPath.push( m_path );
642  init( aSchematic, aProperties );
643 
644  if( aAppendToMe == NULL )
645  {
646  // Clean up any allocated memory if an exception occurs loading the schematic.
647  std::unique_ptr<SCH_SHEET> newSheet = std::make_unique<SCH_SHEET>( aSchematic );
648  newSheet->SetFileName( aFileName );
649  m_rootSheet = newSheet.get();
650  loadHierarchy( newSheet.get() );
651 
652  // If we got here, the schematic loaded successfully.
653  sheet = newSheet.release();
654  m_rootSheet = nullptr; // Quiet Coverity warning.
655  }
656  else
657  {
658  wxCHECK_MSG( aSchematic->IsValid(), nullptr, "Can't append to a schematic with no root!" );
659  m_rootSheet = &aSchematic->Root();
660  sheet = aAppendToMe;
661  loadHierarchy( sheet );
662  }
663 
664  wxASSERT( m_currentPath.size() == 1 ); // only the project path should remain
665 
666  return sheet;
667 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: locale_io.h:40
const wxChar *const traceSchLegacyPlugin
Flag to enable legacy schematic plugin debug output.
bool IsValid() const
A simple test if the schematic is loaded, not a complete one.
Definition: schematic.h:108
void init(SCHEMATIC *aSchematic, const PROPERTIES *aProperties=nullptr)
initialize PLUGIN like a constructor would.
SCH_SHEET * m_rootSheet
The root sheet of the schematic being loaded..
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition: project.cpp:123
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:315
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:54
PROJECT & Prj() const override
Return a reference to the project this schematic is part of.
Definition: schematic.h:75
SCH_SHEET & Root() const
Definition: schematic.h:92
std::stack< wxString > m_currentPath
Stack to maintain nested sheet paths.

References SCH_SHEET::GetFileName(), PROJECT::GetProjectPath(), init(), SCHEMATIC::IsValid(), loadHierarchy(), m_currentPath, m_path, m_rootSheet, NULL, SCHEMATIC::Prj(), SCHEMATIC::Root(), and traceSchLegacyPlugin.

◆ loadBitmap()

SCH_BITMAP * SCH_LEGACY_PLUGIN::loadBitmap ( LINE_READER aReader)
private

Definition at line 1093 of file sch_legacy_plugin.cpp.

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

References _, image, LINE_READER::Line(), Mils2Iu, NULL, parseDouble(), parseInt(), LINE_READER::ReadLine(), SCH_PARSE_ERROR, strCompare(), and THROW_IO_ERROR.

Referenced by LoadContent().

◆ loadBusAlias()

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

Definition at line 1809 of file sch_legacy_plugin.cpp.

1811 {
1812  auto busAlias = std::make_shared<BUS_ALIAS>( aScreen );
1813  const char* line = aReader.Line();
1814 
1815  wxCHECK( strCompare( "BusAlias", line, &line ), NULL );
1816 
1817  wxString buf;
1818  parseUnquotedString( buf, aReader, line, &line );
1819  busAlias->SetName( buf );
1820 
1821  while( *line != '\0' )
1822  {
1823  buf.clear();
1824  parseUnquotedString( buf, aReader, line, &line, true );
1825  if( buf.Len() > 0 )
1826  {
1827  busAlias->AddMember( buf );
1828  }
1829  }
1830 
1831  return busAlias;
1832 }
char * Line() const
Return a pointer to the last line that was read in.
Definition: richio.h:117
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 1320 of file sch_legacy_plugin.cpp.

1321 {
1322  const char* line = aReader.Line();
1323 
1324  wxCHECK( strCompare( "Entry", line, &line ), NULL );
1325 
1326  std::unique_ptr<SCH_BUS_ENTRY_BASE> busEntry;
1327 
1328  if( strCompare( "Wire", line, &line ) )
1329  {
1330  busEntry = std::make_unique<SCH_BUS_WIRE_ENTRY>();
1331 
1332  if( !strCompare( "Line", line, &line ) )
1333  SCH_PARSE_ERROR( "invalid bus entry definition expected 'Line'", aReader, line );
1334  }
1335  else if( strCompare( "Bus", line, &line ) )
1336  {
1337  busEntry = std::make_unique<SCH_BUS_BUS_ENTRY>();
1338 
1339  if( !strCompare( "Bus", line, &line ) )
1340  SCH_PARSE_ERROR( "invalid bus entry definition expected 'Bus'", aReader, line );
1341  }
1342  else
1343  SCH_PARSE_ERROR( "invalid bus entry type", aReader, line );
1344 
1345  line = aReader.ReadLine();
1346 
1347  wxPoint pos;
1348  wxSize size;
1349 
1350  pos.x = Mils2Iu( parseInt( aReader, line, &line ) );
1351  pos.y = Mils2Iu( parseInt( aReader, line, &line ) );
1352  size.x = Mils2Iu( parseInt( aReader, line, &line ) );
1353  size.y = Mils2Iu( parseInt( aReader, line, &line ) );
1354 
1355  size.x -= pos.x;
1356  size.y -= pos.y;
1357 
1358  busEntry->SetPosition( pos );
1359  busEntry->SetSize( size );
1360 
1361  return busEntry.release();
1362 }
char * Line() const
Return a pointer to the last line that was read in.
Definition: richio.h:117
#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
Read a line of text into the buffer and increments the line number counter.
#define SCH_PARSE_ERROR(text, reader, pos)
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Compare aString to the string starting at aLine and advances the character point to the end of String...

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

Referenced by LoadContent().

◆ loadComponent()

SCH_COMPONENT * SCH_LEGACY_PLUGIN::loadComponent ( LINE_READER aReader)
private

Definition at line 1493 of file sch_legacy_plugin.cpp.

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

References _, convert, 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, 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(), path, LINE_READER::ReadLine(), REFERENCE_FIELD, SCH_PARSE_ERROR, EDA_TEXT::SetBold(), EDA_TEXT::SetHorizJustify(), EDA_TEXT::SetItalic(), LIB_ID::SetLibItemName(), BASE_SCREEN::SetModify(), SCH_FIELD::SetName(), EDA_TEXT::SetText(), EDA_TEXT::SetTextAngle(), EDA_TEXT::SetTextPos(), EDA_TEXT::SetTextSize(), EDA_TEXT::SetVertJustify(), EDA_TEXT::SetVisible(), strCompare(), text, TEXT_ANGLE_HORIZ, TEXT_ANGLE_VERT, THROW_PARSE_ERROR, TRANSFORM::x1, TRANSFORM::x2, TRANSFORM::y1, and TRANSFORM::y2.

Referenced by LoadContent().

◆ LoadContent()

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

Definition at line 771 of file sch_legacy_plugin.cpp.

772 {
773  m_version = version;
774 
775  // We cannot safely load content without a set root level.
776  wxCHECK_RET( m_rootSheet,
777  "Cannot call SCH_LEGACY_PLUGIN::LoadContent() without setting root sheet." );
778 
779  while( aReader.ReadLine() )
780  {
781  char* line = aReader.Line();
782 
783  while( *line == ' ' )
784  line++;
785 
786  // Either an object will be loaded properly or the file load will fail and raise
787  // an exception.
788  if( strCompare( "$Descr", line ) )
789  loadPageSettings( aReader, aScreen );
790  else if( strCompare( "$Comp", line ) )
791  aScreen->Append( loadComponent( aReader ) );
792  else if( strCompare( "$Sheet", line ) )
793  aScreen->Append( loadSheet( aReader ) );
794  else if( strCompare( "$Bitmap", line ) )
795  aScreen->Append( loadBitmap( aReader ) );
796  else if( strCompare( "Connection", line ) )
797  aScreen->Append( loadJunction( aReader ) );
798  else if( strCompare( "NoConn", line ) )
799  aScreen->Append( loadNoConnect( aReader ) );
800  else if( strCompare( "Wire", line ) )
801  aScreen->Append( loadWire( aReader ) );
802  else if( strCompare( "Entry", line ) )
803  aScreen->Append( loadBusEntry( aReader ) );
804  else if( strCompare( "Text", line ) )
805  aScreen->Append( loadText( aReader ) );
806  else if( strCompare( "BusAlias", line ) )
807  aScreen->AddBusAlias( loadBusAlias( aReader, aScreen ) );
808  else if( strCompare( "$EndSCHEMATC", line ) )
809  return;
810  else
811  SCH_PARSE_ERROR( "unrecognized token", aReader, line );
812  }
813 }
SCH_SHEET * loadSheet(LINE_READER &aReader)
SCH_JUNCTION * loadJunction(LINE_READER &aReader)
char * Line() const
Return a pointer to the last line that was read in.
Definition: richio.h:117
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
Read 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)
Add a bus alias definition (and transfers ownership of the pointer).
void Append(SCH_ITEM *aItem)
Definition: sch_screen.cpp:128
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Compare aString to the string starting at aLine and advances the character point to the end of String...
SCH_NO_CONNECT * loadNoConnect(LINE_READER &aReader)
SCH_LINE * loadWire(LINE_READER &aReader)
SCH_TEXT * loadText(LINE_READER &aReader)
std::shared_ptr< BUS_ALIAS > loadBusAlias(LINE_READER &aReader, SCH_SCREEN *aScreen)

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

Referenced by loadFile().

◆ loadFile()

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

Definition at line 748 of file sch_legacy_plugin.cpp.

749 {
750  FILE_LINE_READER reader( aFileName );
751 
752  loadHeader( reader, aScreen );
753 
754  LoadContent( reader, aScreen, m_version );
755 
756  // Unfortunately schematic files prior to version 2 are not terminated with $EndSCHEMATC
757  // so checking for it's existance will fail so just exit here and take our chances. :(
758  if( m_version > 1 )
759  {
760  char* line = reader.Line();
761 
762  while( *line == ' ' )
763  line++;
764 
765  if( !strCompare( "$EndSCHEMATC", line ) )
766  THROW_IO_ERROR( "'$EndSCHEMATC' not found" );
767  }
768 }
void LoadContent(LINE_READER &aReader, SCH_SCREEN *aScreen, int version=EESCHEMA_VERSION)
int m_version
Version of file being loaded.
A LINE_READER that reads from an open file.
Definition: richio.h:172
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)
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38

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

817 {
818  const char* line = aReader.ReadLine();
819 
820  if( !line || !strCompare( "Eeschema Schematic File Version", line, &line ) )
821  {
822  m_error.Printf(
823  _( "\"%s\" does not appear to be an Eeschema file" ), aScreen->GetFileName() );
825  }
826 
827  // get the file version here.
828  m_version = parseInt( aReader, line, &line );
829 
830  // The next lines are the lib list section, and are mainly comments, like:
831  // LIBS:power
832  // the lib list is not used, but is in schematic file just in case.
833  // It is usually not empty, but we accept empty list.
834  // If empty, there is a legacy section, not used
835  // EELAYER i j
836  // and the last line is
837  // EELAYER END
838  // Skip all lines until the end of header "EELAYER END" is found
839  while( aReader.ReadLine() )
840  {
841  line = aReader.Line();
842 
843  while( *line == ' ' )
844  line++;
845 
846  if( strCompare( "EELAYER END", line ) )
847  return;
848  }
849 
850  THROW_IO_ERROR( _( "Missing 'EELAYER END'" ) );
851 }
const wxString & GetFileName() const
Definition: sch_screen.h:133
char * Line() const
Return a pointer to the last line that was read in.
Definition: richio.h:117
wxString m_error
For throwing exceptions or errors on partial schematic loads.
int m_version
Version of file being loaded.
static int parseInt(LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Parse an ASCII integer string with possible leading whitespace into an integer and updates the pointe...
virtual char * ReadLine()=0
Read a line of text into the buffer and increments the line number counter.
#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...
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38

References _, 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 672 of file sch_legacy_plugin.cpp.

673 {
674  SCH_SCREEN* screen = NULL;
675 
676  if( !aSheet->GetScreen() )
677  {
678  // SCH_SCREEN objects store the full path and file name where the SCH_SHEET object only
679  // stores the file name and extension. Add the project path to the file name and
680  // extension to compare when calling SCH_SHEET::SearchHierarchy().
681  wxFileName fileName = aSheet->GetFileName();
682  fileName.SetExt( "sch" );
683 
684  if( !fileName.IsAbsolute() )
685  fileName.MakeAbsolute( m_currentPath.top() );
686 
687  // Save the current path so that it gets restored when decending and ascending the
688  // sheet hierarchy which allows for sheet schematic files to be nested in folders
689  // relative to the last path a schematic was loaded from.
690  wxLogTrace( traceSchLegacyPlugin, "Saving path \"%s\"", m_currentPath.top() );
691  m_currentPath.push( fileName.GetPath() );
692  wxLogTrace( traceSchLegacyPlugin, "Current path \"%s\"", m_currentPath.top() );
693  wxLogTrace( traceSchLegacyPlugin, "Loading \"%s\"", fileName.GetFullPath() );
694 
695  m_rootSheet->SearchHierarchy( fileName.GetFullPath(), &screen );
696 
697  if( screen )
698  {
699  aSheet->SetScreen( screen );
700  screen->SetParent( m_schematic );
701  // Do not need to load the sub-sheets - this has already been done.
702  }
703  else
704  {
705  aSheet->SetScreen( new SCH_SCREEN( m_schematic ) );
706  aSheet->GetScreen()->SetFileName( fileName.GetFullPath() );
707 
708  try
709  {
710  loadFile( fileName.GetFullPath(), aSheet->GetScreen() );
711  }
712  catch( const IO_ERROR& ioe )
713  {
714  // If there is a problem loading the root sheet, there is no recovery.
715  if( aSheet == m_rootSheet )
716  throw( ioe );
717 
718  // For all subsheets, queue up the error message for the caller.
719  if( !m_error.IsEmpty() )
720  m_error += "\n";
721 
722  m_error += ioe.What();
723  }
724 
725  for( auto aItem : aSheet->GetScreen()->Items().OfType( SCH_SHEET_T ) )
726  {
727  wxCHECK2( aItem->Type() == SCH_SHEET_T, continue );
728  auto sheet = static_cast<SCH_SHEET*>( aItem );
729 
730  // Set the parent to aSheet. This effectively creates a method to find
731  // the root sheet from any sheet so a pointer to the root sheet does not
732  // need to be stored globally. Note: this is not the same as a hierarchy.
733  // Complex hierarchies can have multiple copies of a sheet. This only
734  // provides a simple tree to find the root sheet.
735  sheet->SetParent( aSheet );
736 
737  // Recursion starts here.
738  loadHierarchy( sheet );
739  }
740  }
741 
742  m_currentPath.pop();
743  wxLogTrace( traceSchLegacyPlugin, "Restoring path \"%s\"", m_currentPath.top() );
744  }
745 }
SCHEMATIC * m_schematic
Passed to Load(), the schematic object being loaded.
EE_TYPE OfType(KICAD_T aType) const
Definition: sch_rtree.h:216
bool SearchHierarchy(const wxString &aFilename, SCH_SCREEN **aScreen)
Search the existing hierarchy for an instance of screen loaded from aFileName.
Definition: sch_sheet.cpp:629
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:156
const wxChar *const traceSchLegacyPlugin
Flag to enable legacy schematic plugin debug output.
SCH_SHEET * m_rootSheet
The root sheet of the schematic being loaded..
SCH_SCREEN * GetScreen() const
Definition: sch_sheet.h:103
virtual void SetParent(EDA_ITEM *aParent)
Definition: eda_item.h:166
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:29
wxString GetFileName() const
Return the filename corresponding to this sheet.
Definition: sch_sheet.h:315
EE_RTREE & Items()
Definition: sch_screen.h:103
void SetFileName(const wxString &aFileName)
Definition: sch_screen.h:131
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Definition: ki_exception.h:75
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_rootSheet, m_schematic, NULL, EE_RTREE::OfType(), SCH_SHEET_T, SCH_SHEET::SearchHierarchy(), SCH_SCREEN::SetFileName(), EDA_ITEM::SetParent(), SCH_SHEET::SetScreen(), traceSchLegacyPlugin, and IO_ERROR::What().

Referenced by Load().

◆ loadJunction()

SCH_JUNCTION * SCH_LEGACY_PLUGIN::loadJunction ( LINE_READER aReader)
private

Definition at line 1178 of file sch_legacy_plugin.cpp.

1179 {
1180  std::unique_ptr<SCH_JUNCTION> junction = std::make_unique<SCH_JUNCTION>();
1181 
1182  const char* line = aReader.Line();
1183 
1184  wxCHECK( strCompare( "Connection", line, &line ), NULL );
1185 
1186  wxString name;
1187 
1188  parseUnquotedString( name, aReader, line, &line );
1189 
1190  wxPoint position;
1191 
1192  position.x = Mils2Iu( parseInt( aReader, line, &line ) );
1193  position.y = Mils2Iu( parseInt( aReader, line, &line ) );
1194  junction->SetPosition( position );
1195 
1196  return junction.release();
1197 }
char * Line() const
Return a pointer to the last line that was read in.
Definition: richio.h:117
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:59
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(), and strCompare().

Referenced by LoadContent().

◆ loadNoConnect()

SCH_NO_CONNECT * SCH_LEGACY_PLUGIN::loadNoConnect ( LINE_READER aReader)
private

Definition at line 1200 of file sch_legacy_plugin.cpp.

1201 {
1202  std::unique_ptr<SCH_NO_CONNECT> no_connect = std::make_unique<SCH_NO_CONNECT>();
1203 
1204  const char* line = aReader.Line();
1205 
1206  wxCHECK( strCompare( "NoConn", line, &line ), NULL );
1207 
1208  wxString name;
1209 
1210  parseUnquotedString( name, aReader, line, &line );
1211 
1212  wxPoint position;
1213 
1214  position.x = Mils2Iu( parseInt( aReader, line, &line ) );
1215  position.y = Mils2Iu( parseInt( aReader, line, &line ) );
1216  no_connect->SetPosition( position );
1217 
1218  return no_connect.release();
1219 }
char * Line() const
Return a pointer to the last line that was read in.
Definition: richio.h:117
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:59
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(), and strCompare().

Referenced by LoadContent().

◆ loadPageSettings()

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

Definition at line 854 of file sch_legacy_plugin.cpp.

855 {
856  wxASSERT( aScreen != NULL );
857 
858  wxString buf;
859  const char* line = aReader.Line();
860 
861  PAGE_INFO pageInfo;
862  TITLE_BLOCK tb;
863 
864  wxCHECK_RET( strCompare( "$Descr", line, &line ), "Invalid sheet description" );
865 
866  parseUnquotedString( buf, aReader, line, &line );
867 
868  if( !pageInfo.SetType( buf ) )
869  SCH_PARSE_ERROR( "invalid page size", aReader, line );
870 
871  int pagew = parseInt( aReader, line, &line );
872  int pageh = parseInt( aReader, line, &line );
873 
874  if( buf == PAGE_INFO::Custom )
875  {
876  pageInfo.SetWidthMils( pagew );
877  pageInfo.SetHeightMils( pageh );
878  }
879  else
880  {
881  wxString orientation;
882 
883  // Non custom size, set portrait if its present. Can be empty string which defaults
884  // to landscape.
885  parseUnquotedString( orientation, aReader, line, &line, true );
886 
887  if( orientation == "portrait" )
888  pageInfo.SetPortrait( true );
889  }
890 
891  aScreen->SetPageSettings( pageInfo );
892 
893  while( line != NULL )
894  {
895  buf.clear();
896 
897  if( !aReader.ReadLine() )
898  SCH_PARSE_ERROR( _( "unexpected end of file" ), aReader, line );
899 
900  line = aReader.Line();
901 
902  if( strCompare( "Sheet", line, &line ) )
903  {
904  aScreen->SetVirtualPageNumber( parseInt( aReader, line, &line ) );
905  aScreen->SetPageCount( parseInt( aReader, line, &line ) );
906  }
907  else if( strCompare( "Title", line, &line ) )
908  {
909  parseQuotedString( buf, aReader, line, &line, true );
910  tb.SetTitle( buf );
911  }
912  else if( strCompare( "Date", line, &line ) )
913  {
914  parseQuotedString( buf, aReader, line, &line, true );
915  tb.SetDate( buf );
916  }
917  else if( strCompare( "Rev", line, &line ) )
918  {
919  parseQuotedString( buf, aReader, line, &line, true );
920  tb.SetRevision( buf );
921  }
922  else if( strCompare( "Comp", line, &line ) )
923  {
924  parseQuotedString( buf, aReader, line, &line, true );
925  tb.SetCompany( buf );
926  }
927  else if( strCompare( "Comment1", line, &line ) )
928  {
929  parseQuotedString( buf, aReader, line, &line, true );
930  tb.SetComment( 0, buf );
931  }
932  else if( strCompare( "Comment2", line, &line ) )
933  {
934  parseQuotedString( buf, aReader, line, &line, true );
935  tb.SetComment( 1, buf );
936  }
937  else if( strCompare( "Comment3", line, &line ) )
938  {
939  parseQuotedString( buf, aReader, line, &line, true );
940  tb.SetComment( 2, buf );
941  }
942  else if( strCompare( "Comment4", line, &line ) )
943  {
944  parseQuotedString( buf, aReader, line, &line, true );
945  tb.SetComment( 3, buf );
946  }
947  else if( strCompare( "Comment5", line, &line ) )
948  {
949  parseQuotedString( buf, aReader, line, &line, true );
950  tb.SetComment( 4, buf );
951  }
952  else if( strCompare( "Comment6", line, &line ) )
953  {
954  parseQuotedString( buf, aReader, line, &line, true );
955  tb.SetComment( 5, buf );
956  }
957  else if( strCompare( "Comment7", line, &line ) )
958  {
959  parseQuotedString( buf, aReader, line, &line, true );
960  tb.SetComment( 6, buf );
961  }
962  else if( strCompare( "Comment8", line, &line ) )
963  {
964  parseQuotedString( buf, aReader, line, &line, true );
965  tb.SetComment( 7, buf );
966  }
967  else if( strCompare( "Comment9", line, &line ) )
968  {
969  parseQuotedString( buf, aReader, line, &line, true );
970  tb.SetComment( 8, buf );
971  }
972  else if( strCompare( "$EndDescr", line ) )
973  {
974  aScreen->SetTitleBlock( tb );
975  return;
976  }
977  }
978 
979  SCH_PARSE_ERROR( "missing 'EndDescr'", aReader, line );
980 }
char * Line() const
Return a pointer to the last line that was read in.
Definition: richio.h:117
void SetVirtualPageNumber(int aPageNumber)
Definition: base_screen.h:80
void SetRevision(const wxString &aRevision)
Definition: title_block.h:81
bool SetType(const wxString &aStandardPageDescriptionName, bool aIsPortrait=false)
Set the name of the page type and also the sizes and margins commonly associated with that type name.
Definition: page_info.cpp:119
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)
Set the date field, and defaults to the current time and date.
Definition: title_block.h:71
void SetPageSettings(const PAGE_INFO &aPageSettings)
Definition: sch_screen.h:129
static const wxChar Custom[]
"User" defined page type
Definition: page_info.h:77
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.
Hold the information shown in the lower right corner of a plot, printout, or editing view.
Definition: title_block.h:40
void SetComment(int aIdx, const wxString &aComment)
Definition: title_block.h:101
#define NULL
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition: page_info.h:53
void SetCompany(const wxString &aCompany)
Definition: title_block.h:91
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)
Definition: sch_screen.h:140
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:58
void SetHeightMils(int aHeightInMils)
Definition: page_info.cpp:257
virtual char * ReadLine()=0
Read 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:243
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 SetPageCount(int aPageCount)
Definition: base_screen.cpp:70
void SetPortrait(bool aIsPortrait)
Rotate the paper page 90 degrees.
Definition: page_info.cpp:186

References _, PAGE_INFO::Custom, LINE_READER::Line(), NULL, parseInt(), parseQuotedString(), parseUnquotedString(), LINE_READER::ReadLine(), SCH_PARSE_ERROR, TITLE_BLOCK::SetComment(), TITLE_BLOCK::SetCompany(), TITLE_BLOCK::SetDate(), PAGE_INFO::SetHeightMils(), BASE_SCREEN::SetPageCount(), SCH_SCREEN::SetPageSettings(), PAGE_INFO::SetPortrait(), TITLE_BLOCK::SetRevision(), TITLE_BLOCK::SetTitle(), SCH_SCREEN::SetTitleBlock(), PAGE_INFO::SetType(), BASE_SCREEN::SetVirtualPageNumber(), PAGE_INFO::SetWidthMils(), and strCompare().

Referenced by LoadContent().

◆ loadSheet()

SCH_SHEET * SCH_LEGACY_PLUGIN::loadSheet ( LINE_READER aReader)
private

Definition at line 983 of file sch_legacy_plugin.cpp.

984 {
985  std::unique_ptr<SCH_SHEET> sheet = std::make_unique<SCH_SHEET>();
986 
987  const char* line = aReader.ReadLine();
988 
989  while( line != NULL )
990  {
991  if( strCompare( "S", line, &line ) ) // Sheet dimensions.
992  {
993  wxPoint position;
994 
995  position.x = Mils2Iu( parseInt( aReader, line, &line ) );
996  position.y = Mils2Iu( parseInt( aReader, line, &line ) );
997  sheet->SetPosition( position );
998 
999  wxSize size;
1000 
1001  size.SetWidth( Mils2Iu( parseInt( aReader, line, &line ) ) );
1002  size.SetHeight( Mils2Iu( parseInt( aReader, line, &line ) ) );
1003  sheet->SetSize( size );
1004  }
1005  else if( strCompare( "U", line, &line ) ) // Sheet UUID.
1006  {
1007  wxString text;
1008  parseUnquotedString( text, aReader, line );
1009 
1010  if( text != "00000000" )
1011  const_cast<KIID&>( sheet->m_Uuid ) = KIID( text );
1012  }
1013  else if( *line == 'F' ) // Sheet field.
1014  {
1015  line++;
1016 
1017  wxString text;
1018  int size;
1019  int fieldId = parseInt( aReader, line, &line );
1020 
1021  if( fieldId == 0 || fieldId == 1 ) // Sheet name and file name.
1022  {
1023  parseQuotedString( text, aReader, line, &line );
1024  size = Mils2Iu( parseInt( aReader, line, &line ) );
1025 
1026  SCH_FIELD& field = sheet->GetFields()[ fieldId ];
1027  field.SetText( text );
1028  field.SetTextSize( wxSize( size, size ) );
1029  }
1030  else // Sheet pin.
1031  {
1032  // Use a unique_ptr so that we clean up in the case of a throw
1033  std::unique_ptr<SCH_SHEET_PIN> sheetPin = std::make_unique<SCH_SHEET_PIN>( sheet.get() );
1034 
1035  sheetPin->SetNumber( fieldId );
1036 
1037  // Can be empty fields.
1038  parseQuotedString( text, aReader, line, &line, true );
1039 
1040  sheetPin->SetText( text );
1041 
1042  if( line == NULL )
1043  THROW_IO_ERROR( _( "unexpected end of line" ) );
1044 
1045  switch( parseChar( aReader, line, &line ) )
1046  {
1047  case 'I': sheetPin->SetShape( PINSHEETLABEL_SHAPE::PS_INPUT ); break;
1048  case 'O': sheetPin->SetShape( PINSHEETLABEL_SHAPE::PS_OUTPUT ); break;
1049  case 'B': sheetPin->SetShape( PINSHEETLABEL_SHAPE::PS_BIDI ); break;
1050  case 'T': sheetPin->SetShape( PINSHEETLABEL_SHAPE::PS_TRISTATE ); break;
1051  case 'U': sheetPin->SetShape( PINSHEETLABEL_SHAPE::PS_UNSPECIFIED ); break;
1052  default: SCH_PARSE_ERROR( "invalid sheet pin type", aReader, line );
1053  }
1054 
1055  switch( parseChar( aReader, line, &line ) )
1056  {
1057  case 'R': sheetPin->SetEdge( SHEET_RIGHT_SIDE ); break;
1058  case 'T': sheetPin->SetEdge( SHEET_TOP_SIDE ); break;
1059  case 'B': sheetPin->SetEdge( SHEET_BOTTOM_SIDE ); break;
1060  case 'L': sheetPin->SetEdge( SHEET_LEFT_SIDE ); break;
1061  default:
1062  SCH_PARSE_ERROR( "invalid sheet pin side", aReader, line );
1063  }
1064 
1065  wxPoint position;
1066 
1067  position.x = Mils2Iu( parseInt( aReader, line, &line ) );
1068  position.y = Mils2Iu( parseInt( aReader, line, &line ) );
1069  sheetPin->SetPosition( position );
1070 
1071  size = Mils2Iu( parseInt( aReader, line, &line ) );
1072 
1073  sheetPin->SetTextSize( wxSize( size, size ) );
1074 
1075  sheet->AddPin( sheetPin.release() );
1076  }
1077  }
1078  else if( strCompare( "$EndSheet", line ) )
1079  {
1080  sheet->AutoplaceFields( /* aScreen */ NULL, /* aManual */ false );
1081  return sheet.release();
1082  }
1083 
1084  line = aReader.ReadLine();
1085  }
1086 
1087  SCH_PARSE_ERROR( "missing '$EndSheet`", aReader, line );
1088 
1089  return NULL; // Prevents compiler warning. Should never get here.
1090 }
Instances are attached to a symbol or sheet and provide a place for the component's value,...
Definition: sch_field.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.
void SetTextSize(const wxSize &aNewSize)
Definition: eda_text.h:244
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: kiid.h:44
virtual void SetText(const wxString &aText)
Definition: eda_text.cpp:121
#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.
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
Read 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...
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38

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(), text, and THROW_IO_ERROR.

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

4310 {
4311  LOCALE_IO toggle; // toggles on, then off, the C locale.
4312 
4313  cacheLib( aLibraryPath, aProperties );
4314 
4315  LIB_PART_MAP::const_iterator it = m_cache->m_symbols.find( aSymbolName );
4316 
4317  if( it == m_cache->m_symbols.end() )
4318  return nullptr;
4319 
4320  return it->second;
4321 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: locale_io.h:40
SCH_LEGACY_PLUGIN_CACHE * m_cache
void cacheLib(const wxString &aLibraryFileName, const PROPERTIES *aProperties)

References cacheLib(), m_cache, and SCH_LEGACY_PLUGIN_CACHE::m_symbols.

◆ loadText()

SCH_TEXT * SCH_LEGACY_PLUGIN::loadText ( LINE_READER aReader)
private

Definition at line 1376 of file sch_legacy_plugin.cpp.

1377 {
1378  const char* line = aReader.Line();
1379 
1380  wxCHECK( strCompare( "Text", line, &line ), NULL );
1381 
1382  std::unique_ptr<SCH_TEXT> text;
1383 
1384  if( strCompare( "Notes", line, &line ) )
1385  text.reset( new SCH_TEXT );
1386  else if( strCompare( "Label", line, &line ) )
1387  text.reset( new SCH_LABEL );
1388  else if( strCompare( "HLabel", line, &line ) )
1389  text.reset( new SCH_HIERLABEL );
1390  else if( strCompare( "GLabel", line, &line ) )
1391  {
1392  // Prior to version 2, the SCH_GLOBALLABEL object did not exist.
1393  if( m_version == 1 )
1394  text = std::make_unique<SCH_HIERLABEL>();
1395  else
1396  text = std::make_unique<SCH_GLOBALLABEL>();
1397  }
1398  else
1399  SCH_PARSE_ERROR( "unknown Text type", aReader, line );
1400 
1401  // Parse the parameters common to all text objects.
1402  wxPoint position;
1403 
1404  position.x = Mils2Iu( parseInt( aReader, line, &line ) );
1405  position.y = Mils2Iu( parseInt( aReader, line, &line ) );
1406  text->SetPosition( position );
1407 
1408  int spinStyle = parseInt( aReader, line, &line );
1409 
1410  // Sadly we store the orientation of hierarchical and global labels using a different
1411  // int encoding than that for local labels:
1412  // Global Local
1413  // Left justified 0 2
1414  // Up 1 3
1415  // Right justified 2 0
1416  // Down 3 1
1417  // So we must flip it as the enum is setup with the "global" numbering
1418  if( text->Type() != SCH_GLOBAL_LABEL_T && text->Type() != SCH_HIER_LABEL_T )
1419  {
1420  if( spinStyle == 0 )
1421  spinStyle = 2;
1422  else if( spinStyle == 2 )
1423  spinStyle = 0;
1424  }
1425 
1426  text->SetLabelSpinStyle( (LABEL_SPIN_STYLE::SPIN) spinStyle );
1427 
1428  int size = Mils2Iu( parseInt( aReader, line, &line ) );
1429 
1430  text->SetTextSize( wxSize( size, size ) );
1431 
1432  // Parse the global and hierarchical label type.
1433  if( text->Type() == SCH_HIER_LABEL_T || text->Type() == SCH_GLOBAL_LABEL_T )
1434  {
1435  auto resultIt = std::find_if( sheetLabelNames.begin(), sheetLabelNames.end(),
1436  [ &line ]( const auto& it )
1437  {
1438  return strCompare( it.second, line, &line );
1439  } );
1440 
1441  if( resultIt != sheetLabelNames.end() )
1442  text->SetShape( resultIt->first );
1443  else
1444  SCH_PARSE_ERROR( "invalid label type", aReader, line );
1445  }
1446 
1447  int penWidth = 0;
1448 
1449  // The following tokens do not exist in version 1 schematic files,
1450  // and not always in version 2 for HLabels and GLabels
1451  if( m_version > 1 )
1452  {
1453  if( m_version > 2 || *line >= ' ' )
1454  {
1455  if( strCompare( "Italic", line, &line ) )
1456  text->SetItalic( true );
1457  else if( !strCompare( "~", line, &line ) )
1458  SCH_PARSE_ERROR( _( "expected 'Italics' or '~'" ), aReader, line );
1459  }
1460 
1461  // The penWidth token does not exist in older versions of the schematic file format
1462  // so calling parseInt will be made only if the EOL is not reached.
1463  if( *line >= ' ' )
1464  penWidth = parseInt( aReader, line, &line );
1465  }
1466 
1467  text->SetBold( penWidth != 0 );
1468  text->SetTextThickness( penWidth != 0 ? GetPenSizeForBold( size ) : 0 );
1469 
1470  // Read the text string for the text.
1471  char* tmp = aReader.ReadLine();
1472 
1473  tmp = strtok( tmp, "\r\n" );
1474  wxString val = FROM_UTF8( tmp );
1475 
1476  for( ; ; )
1477  {
1478  int i = val.find( wxT( "\\n" ) );
1479 
1480  if( i == wxNOT_FOUND )
1481  break;
1482 
1483  val.erase( i, 2 );
1484  val.insert( i, wxT( "\n" ) );
1485  }
1486 
1487  text->SetText( val );
1488 
1489  return text.release();
1490 }
char * Line() const
Return a pointer to the last line that was read in.
Definition: richio.h:117
static wxString FROM_UTF8(const char *cstring)
Convert a UTF8 encoded C string to a wxString for all wxWidgets build modes.
Definition: macros.h:110
int GetPenSizeForBold(int aTextSize)
Function GetPensizeForBold.
Definition: gr_text.cpp:48
#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
Read 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(), and text.

Referenced by LoadContent().

◆ loadWire()

SCH_LINE * SCH_LEGACY_PLUGIN::loadWire ( LINE_READER aReader)
private

Definition at line 1222 of file sch_legacy_plugin.cpp.

1223 {
1224  std::unique_ptr<SCH_LINE> wire = std::make_unique<SCH_LINE>();
1225 
1226  const char* line = aReader.Line();
1227 
1228  wxCHECK( strCompare( "Wire", line, &line ), NULL );
1229 
1230  if( strCompare( "Wire", line, &line ) )
1231  wire->SetLayer( LAYER_WIRE );
1232  else if( strCompare( "Bus", line, &line ) )
1233  wire->SetLayer( LAYER_BUS );
1234  else if( strCompare( "Notes", line, &line ) )
1235  wire->SetLayer( LAYER_NOTES );
1236  else
1237  SCH_PARSE_ERROR( "invalid line type", aReader, line );
1238 
1239  if( !strCompare( "Line", line, &line ) )
1240  SCH_PARSE_ERROR( "invalid wire definition", aReader, line );
1241 
1242  // Since Sept 15, 2017, a line style is alloved (width, style, color)
1243  // Only non default values are stored
1244  while( !is_eol( *line ) )
1245  {
1246  wxString buf;
1247 
1248  parseUnquotedString( buf, aReader, line, &line );
1249 
1250  if( buf == ")" )
1251  continue;
1252 
1253  else if( buf == T_WIDTH )
1254  {
1255  int size = Mils2Iu( parseInt( aReader, line, &line ) );
1256  wire->SetLineWidth( size );
1257  }
1258  else if( buf == T_STYLE )
1259  {
1260  parseUnquotedString( buf, aReader, line, &line );
1262  wire->SetLineStyle( style );
1263  }
1264  else // should be the color parameter.
1265  {
1266  // The color param is something like rgb(150, 40, 191)
1267  // and because there is no space between ( and 150
1268  // the first param is inside buf.
1269  // So break keyword and the first param into 2 separate strings.
1270  wxString prm, keyword;
1271  keyword = buf.BeforeLast( '(', &prm );
1272 
1273  if( ( keyword == T_COLOR ) || ( keyword == T_COLORA ) )
1274  {
1275  long color[4] = { 0 };
1276 
1277  int ii = 0;
1278 
1279  if( !prm.IsEmpty() )
1280  {
1281  prm.ToLong( &color[ii] );
1282  ii++;
1283  }
1284 
1285  int prm_count = ( keyword == T_COLORA ) ? 4 : 3;
1286  // fix opacity to 1.0 or 255, when not exists in file
1287  color[3] = 255;
1288 
1289  for(; ii < prm_count && !is_eol( *line ); ii++ )
1290  {
1291  color[ii] = parseInt( aReader, line, &line );
1292 
1293  // Skip the separator between values
1294  if( *line == ',' || *line == ' ')
1295  line++;
1296  }
1297 
1298  wire->SetLineColor( color[0]/255.0, color[1]/255.0, color[2]/255.0,color[3]/255.0 );
1299  }
1300  }
1301  }
1302 
1303  // Read the segment en points coordinates:
1304  line = aReader.ReadLine();
1305 
1306  wxPoint begin, end;
1307 
1308  begin.x = Mils2Iu( parseInt( aReader, line, &line ) );
1309  begin.y = Mils2Iu( parseInt( aReader, line, &line ) );
1310  end.x = Mils2Iu( parseInt( aReader, line, &line ) );
1311  end.y = Mils2Iu( parseInt( aReader, line, &line ) );
1312 
1313  wire->SetStartPoint( begin );
1314  wire->SetEndPoint( end );
1315 
1316  return wire.release();
1317 }
char * Line() const
Return a pointer to the last line that was read in.
Definition: richio.h:117
int color
Definition: DXF_plotter.cpp:60
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:95
PLOT_DASH_TYPE
Dashed line types.
Definition: plotter.h:104
virtual char * ReadLine()=0
Read 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...
#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, and T_WIDTH.

Referenced by LoadContent().

◆ ParsePart()

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

Definition at line 4439 of file sch_legacy_plugin.cpp.

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

References SCH_LEGACY_PLUGIN_CACHE::LoadPart().

◆ Save()

void SCH_LEGACY_PLUGIN::Save ( const wxString &  aFileName,
SCH_SHEET aSheet,
SCHEMATIC aSchematic,
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.
aSheetis the class SCH_SHEET 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.
aSchematicis the SCHEMATIC object used to access any schematic-wide or project information needed to save the document.
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. Set the #PropSaveCurrentSheetOnly property to only save the current sheet. Otherwise, all hierarchical sheets are saved.
Exceptions
IO_ERRORif there is a problem saving or exporting.

Reimplemented from SCH_PLUGIN.

Definition at line 1835 of file sch_legacy_plugin.cpp.

1837 {
1838  wxCHECK_RET( aSheet != NULL, "NULL SCH_SHEET object." );
1839  wxCHECK_RET( !aFileName.IsEmpty(), "No schematic file name defined." );
1840 
1841  LOCALE_IO toggle; // toggles on, then off, the C locale, to write floating point values.
1842 
1843  init( aSchematic, aProperties );
1844 
1845  wxFileName fn = aFileName;
1846 
1847  // File names should be absolute. Don't assume everything relative to the project path
1848  // works properly.
1849  wxASSERT( fn.IsAbsolute() );
1850 
1851  FILE_OUTPUTFORMATTER formatter( fn.GetFullPath() );
1852 
1853  m_out = &formatter; // no ownership
1854 
1855  Format( aSheet );
1856 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: locale_io.h:40
void init(SCHEMATIC *aSchematic, const PROPERTIES *aProperties=nullptr)
initialize PLUGIN like a constructor would.
#define NULL
void Format(SCH_SHEET *aSheet)
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
Used for text file output.
Definition: richio.h:453

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

◆ saveBitmap()

void SCH_LEGACY_PLUGIN::saveBitmap ( SCH_BITMAP aBitmap)
private

Definition at line 2146 of file sch_legacy_plugin.cpp.

2147 {
2148  wxCHECK_RET( aBitmap != NULL, "SCH_BITMAP* is NULL" );
2149 
2150  const wxImage* image = aBitmap->GetImage()->GetImageData();
2151 
2152  wxCHECK_RET( image != NULL, "wxImage* is NULL" );
2153 
2154  m_out->Print( 0, "$Bitmap\n" );
2155  m_out->Print( 0, "Pos %-4d %-4d\n",
2156  Iu2Mils( aBitmap->GetPosition().x ),
2157  Iu2Mils( aBitmap->GetPosition().y ) );
2158  m_out->Print( 0, "Scale %f\n", aBitmap->GetImage()->GetScale() );
2159  m_out->Print( 0, "Data\n" );
2160 
2161  wxMemoryOutputStream stream;
2162 
2163  image->SaveFile( stream, wxBITMAP_TYPE_PNG );
2164 
2165  // Write binary data in hexadecimal form (ASCII)
2166  wxStreamBuffer* buffer = stream.GetOutputStreamBuffer();
2167  char* begin = (char*) buffer->GetBufferStart();
2168 
2169  for( int ii = 0; begin < buffer->GetBufferEnd(); begin++, ii++ )
2170  {
2171  if( ii >= 32 )
2172  {
2173  ii = 0;
2174 
2175  m_out->Print( 0, "\n" );
2176  }
2177 
2178  m_out->Print( 0, "%2.2X ", *begin & 0xFF );
2179  }
2180 
2181  m_out->Print( 0, "\nEndData\n" );
2182  m_out->Print( 0, "$EndBitmap\n" );
2183 }
double GetScale() const
Definition: bitmap_base.h:79
wxImage * GetImageData()
Definition: bitmap_base.h:70
wxPoint GetPosition() const override
Definition: sch_bitmap.h:136
#define NULL
BITMAP_BASE * GetImage() const
Definition: sch_bitmap.h:54
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Format and write text to the output stream.
Definition: richio.cpp:408

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

Referenced by Format().

◆ saveBusAlias()

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

Definition at line 2399 of file sch_legacy_plugin.cpp.

2400 {
2401  wxCHECK_RET( aAlias != NULL, "BUS_ALIAS* is NULL" );
2402 
2403  wxString members = boost::algorithm::join( aAlias->Members(), " " );
2404 
2405  m_out->Print( 0, "BusAlias %s %s\n",
2406  TO_UTF8( aAlias->GetName() ), TO_UTF8( members ) );
2407 }
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:96
#define NULL
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Format and write text to the output stream.
Definition: richio.cpp:408

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

2271 {
2272  wxCHECK_RET( aBusEntry != NULL, "SCH_BUS_ENTRY_BASE* is NULL" );
2273 
2274  if( aBusEntry->GetLayer() == LAYER_WIRE )
2275  m_out->Print( 0, "Entry Wire Line\n\t%-4d %-4d %-4d %-4d\n",
2276  Iu2Mils( aBusEntry->GetPosition().x ),
2277  Iu2Mils( aBusEntry->GetPosition().y ),
2278  Iu2Mils( aBusEntry->GetEnd().x ), Iu2Mils( aBusEntry->GetEnd().y ) );
2279  else
2280  m_out->Print( 0, "Entry Bus Bus\n\t%-4d %-4d %-4d %-4d\n",
2281  Iu2Mils( aBusEntry->GetPosition().x ),
2282  Iu2Mils( aBusEntry->GetPosition().y ),
2283  Iu2Mils( aBusEntry->GetEnd().x ), Iu2Mils( aBusEntry->GetEnd().y ) );
2284 }
#define NULL
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition: sch_item.h:272
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Format and write text to the output stream.
Definition: richio.cpp:408
wxPoint GetEnd() const
wxPoint GetPosition() const override

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

Referenced by Format().

◆ saveComponent()

void SCH_LEGACY_PLUGIN::saveComponent ( SCH_COMPONENT aComponent)
private

Definition at line 2003 of file sch_legacy_plugin.cpp.

2004 {
2005  std::string name1;
2006  std::string name2;
2007 
2008  static wxString delimiters( wxT( " " ) );
2009 
2010  // This is redundant with the AR entries below, but it makes the files backwards-compatible.
2011  if( aComponent->GetInstanceReferences().size() > 0 )
2012  {
2013  const SYMBOL_INSTANCE_REFERENCE& instance = aComponent->GetInstanceReferences()[0];
2014  name1 = toUTFTildaText( instance.m_Reference );
2015  }
2016  else
2017  {
2018  if( aComponent->GetField( REFERENCE_FIELD )->GetText().IsEmpty() )
2019  name1 = toUTFTildaText( aComponent->GetPrefix() );
2020  else
2021  name1 = toUTFTildaText( aComponent->GetField( REFERENCE_FIELD )->GetText() );
2022  }
2023 
2024  wxString part_name = aComponent->GetLibId().Format();
2025 
2026  if( part_name.size() )
2027  {
2028  name2 = toUTFTildaText( part_name );
2029  }
2030  else
2031  {
2032  name2 = "_NONAME_";
2033  }
2034 
2035  m_out->Print( 0, "$Comp\n" );
2036  m_out->Print( 0, "L %s %s\n", name2.c_str(), name1.c_str() );
2037 
2038  // Generate unit number, conversion and timestamp
2039  m_out->Print( 0, "U %d %d %8.8X\n",
2040  aComponent->GetUnit(),
2041  aComponent->GetConvert(),
2042  aComponent->m_Uuid.AsLegacyTimestamp() );
2043 
2044  // Save the position
2045  m_out->Print( 0, "P %d %d\n",
2046  Iu2Mils( aComponent->GetPosition().x ),
2047  Iu2Mils( aComponent->GetPosition().y ) );
2048 
2049  /* If this is a complex hierarchy; save hierarchical references.
2050  * but for simple hierarchies it is not necessary.
2051  * the reference inf is already saved
2052  * this is useful for old Eeschema version compatibility
2053  */
2054  if( aComponent->GetInstanceReferences().size() > 1 )
2055  {
2056  for( const SYMBOL_INSTANCE_REFERENCE& instance : aComponent->GetInstanceReferences() )
2057  {
2058  /*format:
2059  * AR Path="/140/2" Ref="C99" Part="1"
2060  * where 140 is the uid of the containing sheet
2061  * and 2 is the timestamp of this component.
2062  * (timestamps are actually 8 hex chars)
2063  * Ref is the conventional component reference for this 'path'
2064  * Part is the conventional component part selection for this 'path'
2065  */
2066  wxString path = "/";
2067 
2068  // Skip root sheet
2069  for( int i = 1; i < (int) instance.m_Path.size(); ++i )
2070  path += instance.m_Path[i].AsLegacyTimestampString() + "/";
2071 
2072  m_out->Print( 0, "AR Path=\"%s\" Ref=\"%s\" Part=\"%d\" \n",
2073  TO_UTF8( path + aComponent->m_Uuid.AsLegacyTimestampString() ),
2074  TO_UTF8( instance.m_Reference ),
2075  instance.m_Unit );
2076  }
2077  }
2078 
2079  // update the ugly field id, which I would like to see go away someday soon.
2080  for( int i = 0; i < aComponent->GetFieldCount(); ++i )
2081  aComponent->GetFields()[i].SetId( i );
2082 
2083  // Fixed fields:
2084  // Save mandatory fields even if they are blank,
2085  // because the visibility, size and orientation are set from library editor.
2086  for( unsigned i = 0; i < MANDATORY_FIELDS; ++i )
2087  saveField( &aComponent->GetFields()[i] );
2088 
2089  // User defined fields:
2090  // The *policy* about which user defined fields are part of a symbol is now
2091  // only in the dialog editors. No policy should be enforced here, simply
2092  // save all the user defined fields, they are present because a dialog editor
2093  // thought they should be. If you disagree, go fix the dialog editors.
2094  for( int i = MANDATORY_FIELDS; i < aComponent->GetFieldCount(); ++i )
2095  saveField( &aComponent->GetFields()[i] );
2096 
2097  // Unit number, position, box ( old standard )
2098  m_out->Print( 0, "\t%-4d %-4d %-4d\n", aComponent->GetUnit(),
2099  Iu2Mils( aComponent->GetPosition().x ),
2100  Iu2Mils( aComponent->GetPosition().y ) );
2101 
2102  TRANSFORM transform = aComponent->GetTransform();
2103 
2104  m_out->Print( 0, "\t%-4d %-4d %-4d %-4d\n",
2105  transform.x1, transform.y1, transform.x2, transform.y2 );
2106  m_out->Print( 0, "$EndComp\n" );
2107 }
Field Reference of part, i.e. "IC21".
SCH_FIELD * GetField(MANDATORY_FIELD_T aFieldType)
Return a mandatory field in this symbol.
Definition: sch_symbol.cpp:665
int y2
Definition: transform.h:51
int x2
Definition: transform.h:50
wxString GetPrefix() const
Definition: sch_symbol.h:227
int x1
Definition: transform.h:48
std::string toUTFTildaText(const wxString &txt)
Convert a wxString to UTF8 and replace any control characters with a ~, where a control character is ...
Definition: sch_symbol.cpp:43
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with SCH_FIELDs.
Definition: sch_symbol.cpp:701
void saveField(SCH_FIELD *aField)
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:96
int y1
Definition: transform.h:49
int GetUnit() const
Definition: sch_symbol.h:195
for transforming drawing coordinates for a wxDC device context.
Definition: transform.h:45
timestamp_t AsLegacyTimestamp() const
Definition: kiid.cpp:191
A simple container for schematic symbol instance information.
TRANSFORM & GetTransform()
Definition: sch_symbol.h:231
int GetFieldCount() const
Return the number of fields in this symbol.
Definition: sch_symbol.h:421
UTF8 Format() const
Definition: lib_id.cpp:233
const KIID m_Uuid
Definition: eda_item.h:525
The first 4 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors.
wxString AsLegacyTimestampString() const
Definition: kiid.cpp:224
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
wxPoint GetPosition() const override
Definition: sch_symbol.h:641
int GetConvert() const
Definition: sch_symbol.h:223
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Format and write text to the output stream.
Definition: richio.cpp:408
const std::vector< SYMBOL_INSTANCE_REFERENCE > & GetInstanceReferences()
Definition: sch_symbol.h:123
const LIB_ID & GetLibId() const
Definition: sch_symbol.h:147
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:133

References KIID::AsLegacyTimestamp(), KIID::AsLegacyTimestampString(), LIB_ID::Format(), SCH_COMPONENT::GetConvert(), SCH_COMPONENT::GetField(), SCH_COMPONENT::GetFieldCount(), SCH_COMPONENT::GetFields(), SCH_COMPONENT::GetInstanceReferences(), SCH_COMPONENT::GetLibId(), SCH_COMPONENT::GetPosition(), SCH_COMPONENT::GetPrefix(), EDA_TEXT::GetText(), SCH_COMPONENT::GetTransform(), SCH_COMPONENT::GetUnit(), m_out, SYMBOL_INSTANCE_REFERENCE::m_Reference, EDA_ITEM::m_Uuid, MANDATORY_FIELDS, path, OUTPUTFORMATTER::Print(), REFERENCE_FIELD, saveField(), TO_UTF8, toUTFTildaText(), TRANSFORM::x1, TRANSFORM::x2, TRANSFORM::y1, and TRANSFORM::y2.

Referenced by Format().

◆ saveField()

void SCH_LEGACY_PLUGIN::saveField ( SCH_FIELD aField)
private

Definition at line 2110 of file sch_legacy_plugin.cpp.

2111 {
2112  char hjustify = 'C';
2113 
2114  if( aField->GetHorizJustify() == GR_TEXT_HJUSTIFY_LEFT )
2115  hjustify = 'L';
2116  else if( aField->GetHorizJustify() == GR_TEXT_HJUSTIFY_RIGHT )
2117  hjustify = 'R';
2118 
2119  char vjustify = 'C';
2120 
2121  if( aField->GetVertJustify() == GR_TEXT_VJUSTIFY_BOTTOM )
2122  vjustify = 'B';
2123  else if( aField->GetVertJustify() == GR_TEXT_VJUSTIFY_TOP )
2124  vjustify = 'T';
2125 
2126  m_out->Print( 0, "F %d %s %c %-3d %-3d %-3d %4.4X %c %c%c%c",
2127  aField->GetId(),
2128  EscapedUTF8( aField->GetText() ).c_str(), // wraps in quotes too
2129  aField->GetTextAngle() == TEXT_ANGLE_HORIZ ? 'H' : 'V',
2130  Iu2Mils( aField->GetLibPosition().x ),
2131  Iu2Mils( aField->GetLibPosition().y ),
2132  Iu2Mils( aField->GetTextWidth() ),
2133  !aField->IsVisible(),
2134  hjustify, vjustify,
2135  aField->IsItalic() ? 'I' : 'N',
2136  aField->IsBold() ? 'B' : 'N' );
2137 
2138  // Save field name, if the name is user definable
2139  if( aField->GetId() >= MANDATORY_FIELDS )
2140  m_out->Print( 0, " %s", EscapedUTF8( aField->GetName() ).c_str() );
2141 
2142  m_out->Print( 0, "\n" );
2143 }
#define TEXT_ANGLE_HORIZ
Frequent text rotations, used with {Set,Get}TextAngle(), in 0.1 degrees for now, hoping to migrate to...
Definition: eda_text.h:50
bool IsBold() const
Definition: eda_text.h:190
EDA_TEXT_VJUSTIFY_T GetVertJustify() const
Definition: eda_text.h:206
bool IsVisible() const
Definition: eda_text.h:193
double GetTextAngle() const
Definition: eda_text.h:181
int GetId() const
Definition: sch_field.h:114
std::string EscapedUTF8(wxString aString)
Return an 8 bit UTF8 string given aString in Unicode form.
Definition: string.cpp:329
bool IsItalic() const
Definition: eda_text.h:187
EDA_TEXT_HJUSTIFY_T GetHorizJustify() const
Definition: eda_text.h:205
wxPoint GetLibPosition() const
Definition: sch_field.h:187
The first 4 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors.
int GetTextWidth() const
Definition: eda_text.h:248
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
wxString GetName(bool aUseDefaultName=true) const
Return the field name.
Definition: sch_field.cpp:519
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Format and write text to the output stream.
Definition: richio.cpp:408
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:133

References EscapedUTF8(), 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, MANDATORY_FIELDS, OUTPUTFORMATTER::Print(), and TEXT_ANGLE_HORIZ.

Referenced by saveComponent().

◆ saveJunction()

void SCH_LEGACY_PLUGIN::saveJunction ( SCH_JUNCTION aJunction)
private

Definition at line 2250 of file sch_legacy_plugin.cpp.

2251 {
2252  wxCHECK_RET( aJunction != NULL, "SCH_JUNCTION* is NULL" );
2253 
2254  m_out->Print( 0, "Connection ~ %-4d %-4d\n",
2255  Iu2Mils( aJunction->GetPosition().x ),
2256  Iu2Mils( aJunction->GetPosition().y ) );
2257 }
#define NULL
wxPoint GetPosition() const override
Definition: sch_junction.h:92
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Format and write text to the output stream.
Definition: richio.cpp:408

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

Referenced by Format().

◆ SaveLibrary()

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

Reimplemented from SCH_PLUGIN.

Definition at line 4398 of file sch_legacy_plugin.cpp.

4399 {
4400  if( !m_cache )
4401  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryPath );
4402 
4403  wxString oldFileName = m_cache->GetFileName();
4404 
4405  if( !m_cache->IsFile( aLibraryPath ) )
4406  {
4407  m_cache->SetFileName( aLibraryPath );
4408  }
4409 
4410  // This is a forced save.
4411  m_cache->SetModified();
4412  m_cache->Save( writeDocFile( aProperties ) );
4413  m_cache->SetFileName( oldFileName );
4414 }
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 2287 of file sch_legacy_plugin.cpp.

2288 {
2289  wxCHECK_RET( aLine != NULL, "SCH_LINE* is NULL" );
2290 
2291  const char* layer = "Notes";
2292  const char* width = "Line";
2293 
2294  if( aLine->GetLayer() == LAYER_WIRE )
2295  layer = "Wire";
2296  else if( aLine->GetLayer() == LAYER_BUS )
2297  layer = "Bus";
2298 
2299  m_out->Print( 0, "Wire %s %s", layer, width );
2300 
2301  // Write line style (width, type, color) only for non default values
2302  if( aLine->IsGraphicLine() )
2303  {
2304  if( aLine->GetLineSize() != 0 )
2305  m_out->Print( 0, " %s %d", T_WIDTH, Iu2Mils( aLine->GetLineSize() ) );
2306 
2307  if( aLine->GetLineStyle() != aLine->GetDefaultStyle() )
2308  m_out->Print( 0, " %s %s", T_STYLE,
2310 
2311  if( aLine->GetLineColor() != COLOR4D::UNSPECIFIED )
2312  m_out->Print( 0, " %s",
2313  TO_UTF8( aLine->GetLineColor().ToColour().GetAsString( wxC2S_CSS_SYNTAX ) ) );
2314  }
2315 
2316  m_out->Print( 0, "\n" );
2317 
2318  m_out->Print( 0, "\t%-4d %-4d %-4d %-4d",
2319  Iu2Mils( aLine->GetStartPoint().x ), Iu2Mils( aLine->GetStartPoint().y ),
2320  Iu2Mils( aLine->GetEndPoint().x ), Iu2Mils( aLine->GetEndPoint().y ) );
2321 
2322  m_out->Print( 0, "\n");
2323 }
static const char * GetLineStyleName(PLOT_DASH_TYPE aStyle)
Definition: sch_line.cpp:85
COLOR4D GetLineColor() const
Returns COLOR4D::UNSPECIFIED if a custom color hasn't been set for this line.
Definition: sch_line.cpp:210
bool IsGraphicLine() const
Return if the line is a graphic (non electrical line)
Definition: sch_line.cpp:916
wxPoint GetStartPoint() const
Definition: sch_line.h:90
#define T_WIDTH
#define T_STYLE
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:96
PLOT_DASH_TYPE GetDefaultStyle() const
Definition: sch_line.cpp:224
#define NULL
PLOT_DASH_TYPE GetLineStyle() const
Definition: sch_line.cpp:248
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition: sch_item.h:272
int GetLineSize() const
Definition: sch_line.h:152
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Format and write text to the output stream.
Definition: richio.cpp:408
wxPoint GetEndPoint() const
Definition: sch_line.h:93

References SCH_LINE::GetDefaultStyle(), SCH_LINE::GetEndPoint(), SCH_ITEM::GetLayer(), SCH_LINE::GetLineColor(), SCH_LINE::GetLineSize(), SCH_LINE::GetLineStyle(), SCH_LINE::GetLineStyleName(), SCH_LINE::GetStartPoint(), SCH_LINE::IsGraphicLine(), LAYER_BUS, LAYER_WIRE, m_out, NULL, OUTPUTFORMATTER::Print(), T_STYLE, T_WIDTH, and TO_UTF8.

Referenced by Format().

◆ saveNoConnect()

void SCH_LEGACY_PLUGIN::saveNoConnect ( SCH_NO_CONNECT aNoConnect)
private

Definition at line 2260 of file sch_legacy_plugin.cpp.

2261 {
2262  wxCHECK_RET( aNoConnect != NULL, "SCH_NOCONNECT* is NULL" );
2263 
2264  m_out->Print( 0, "NoConn ~ %-4d %-4d\n",
2265  Iu2Mils( aNoConnect->GetPosition().x ),
2266  Iu2Mils( aNoConnect->GetPosition().y ) );
2267 }
wxPoint GetPosition() const override
#define NULL
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Format and write text to the output stream.
Definition: richio.cpp:408

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

Referenced by Format().

◆ saveSheet()

void SCH_LEGACY_PLUGIN::saveSheet ( SCH_SHEET aSheet)
private

Definition at line 2186 of file sch_legacy_plugin.cpp.

2187 {
2188  wxCHECK_RET( aSheet != NULL, "SCH_SHEET* is NULL" );
2189 
2190  m_out->Print( 0, "$Sheet\n" );
2191  m_out->Print( 0, "S %-4d %-4d %-4d %-4d\n",
2192  Iu2Mils( aSheet->GetPosition().x ),
2193  Iu2Mils( aSheet->GetPosition().y ),
2194  Iu2Mils( aSheet->GetSize().x ),
2195  Iu2Mils( aSheet->GetSize().y ) );
2196 
2197  m_out->Print( 0, "U %8.8X\n", aSheet->m_Uuid.AsLegacyTimestamp() );
2198 
2199  SCH_FIELD& sheetName = aSheet->GetFields()[SHEETNAME];
2200  SCH_FIELD& fileName = aSheet->GetFields()[SHEETFILENAME];
2201 
2202  if( !sheetName.GetText().IsEmpty() )
2203  m_out->Print( 0, "F0 %s %d\n",
2204  EscapedUTF8( sheetName.GetText() ).c_str(),
2205  Iu2Mils( sheetName.GetTextSize().x ) );
2206 
2207  if( !fileName.GetText().IsEmpty() )
2208  m_out->Print( 0, "F1 %s %d\n",
2209  EscapedUTF8( fileName.GetText() ).c_str(),
2210  Iu2Mils( fileName.GetTextSize().x ) );
2211 
2212  for( const SCH_SHEET_PIN* pin : aSheet->GetPins() )
2213  {
2214  int type, side;
2215 
2216  if( pin->GetText().IsEmpty() )
2217  break;
2218 
2219  switch( pin->GetEdge() )
2220  {
2221  default:
2222  case SHEET_LEFT_SIDE: side = 'L'; break;
2223  case SHEET_RIGHT_SIDE: side = 'R'; break;
2224  case SHEET_TOP_SIDE: side = 'T'; break;
2225  case SHEET_BOTTOM_SIDE: side = 'B'; break;
2226  }
2227 
2228  switch( pin->GetShape() )
2229  {
2230  default:
2231  case PINSHEETLABEL_SHAPE::PS_UNSPECIFIED: type = 'U'; break;
2232  case PINSHEETLABEL_SHAPE::PS_INPUT: type = 'I'; break;
2233  case PINSHEETLABEL_SHAPE::PS_OUTPUT: type = 'O'; break;
2234  case PINSHEETLABEL_SHAPE::PS_BIDI: type = 'B'; break;
2235  case PINSHEETLABEL_SHAPE::PS_TRISTATE: type = 'T'; break;
2236  }
2237 
2238  m_out->Print( 0, "F%d %s %c %c %-3d %-3d %-3d\n",
2239  pin->GetNumber(),
2240  EscapedUTF8( pin->GetText() ).c_str(), // supplies wrapping quotes
2241  type, side, Iu2Mils( pin->GetPosition().x ),
2242  Iu2Mils( pin->GetPosition().y ),
2243  Iu2Mils( pin->GetTextWidth() ) );
2244  }
2245 
2246  m_out->Print( 0, "$EndSheet\n" );
2247 }
Instances are attached to a symbol or sheet and provide a place for the component's value,...
Definition: sch_field.h:50
std::string EscapedUTF8(wxString aString)
Return an 8 bit UTF8 string given aString in Unicode form.
Definition: string.cpp:329
std::vector< SCH_FIELD > & GetFields()
Definition: sch_sheet.h:88
#define NULL
timestamp_t AsLegacyTimestamp() const
Definition: kiid.cpp:191
const wxSize & GetTextSize() const
Definition: eda_text.h:245
Define a sheet pin (label) used in sheets to create hierarchical schematics.
Definition: sch_sheet_pin.h:65
wxPoint GetPosition() const override
Definition: sch_sheet.h:378
const KIID m_Uuid
Definition: eda_item.h:525
std::vector< SCH_SHEET_PIN * > & GetPins()
Definition: sch_sheet.h:184
OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
wxSize GetSize() const
Definition: sch_sheet.h:105
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Format and write text to the output stream.
Definition: richio.cpp:408
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:133

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, pin, 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, and SHEETNAME.

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

4326 {
4327  LOCALE_IO toggle; // toggles on, then off, the C locale.
4328 
4329  cacheLib( aLibraryPath, aProperties );
4330 
4331  m_cache->AddSymbol( aSymbol );
4332 
4333  if( !isBuffering( aProperties ) )
4334  m_cache->Save( writeDocFile( aProperties ) );
4335 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: locale_io.h:40
SCH_LEGACY_PLUGIN_CACHE * m_cache
bool isBuffering(const PROPERTIES *aProperties)
void cacheLib(const wxString &aLibraryFileName, const PROPERTIES *aProperties)
void Save(bool aSaveDocFile=true)
Save the entire library to file m_libFileName;.
void AddSymbol(const LIB_PART *aPart)
bool writeDocFile(const PROPERTIES *aProperties)

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

◆ saveText()

void SCH_LEGACY_PLUGIN::saveText ( SCH_TEXT aText)
private

Definition at line 2326 of file sch_legacy_plugin.cpp.

2327 {
2328  wxCHECK_RET( aText != NULL, "SCH_TEXT* is NULL" );
2329 
2330  const char* italics = "~";
2331  const char* textType = "Notes";
2332 
2333  if( aText->IsItalic() )
2334  italics = "Italic";
2335 
2336  wxString text = aText->GetText();
2337 
2338  SCH_LAYER_ID layer = aText->GetLayer();
2339 
2340  if( layer == LAYER_NOTES || layer == LAYER_LOCLABEL )
2341  {
2342  if( layer == LAYER_NOTES )
2343  {
2344  // For compatibility reasons, the text must be saved in only one text line
2345  // so replace all EOLs with \\n
2346  text.Replace( wxT( "\n" ), wxT( "\\n" ) );
2347 
2348  // Here we should have no CR or LF character in line
2349  // This is not always the case if a multiline text was copied (using a copy/paste
2350  // function) from a text that uses E.O.L characters that differs from the current
2351  // EOL format. This is mainly the case under Linux using LF symbol when copying
2352  // a text from Windows (using CRLF symbol) so we must just remove the extra CR left
2353  // (or LF left under MacOSX)
2354  for( unsigned ii = 0; ii < text.Len(); )
2355  {
2356  if( text[ii] == 0x0A || text[ii] == 0x0D )
2357  text.erase( ii, 1 );
2358  else
2359  ii++;
2360  }
2361  }
2362  else
2363  {
2364  textType = "Label";
2365  }
2366 
2367  // Local labels must have their spin style inverted for left and right
2368  int spinStyle = static_cast<int>( aText->GetLabelSpinStyle() );
2369 
2370  if( spinStyle == 0 )
2371  spinStyle = 2;
2372  else if( spinStyle == 2 )
2373  spinStyle = 0;
2374 
2375  m_out->Print( 0, "Text %s %-4d %-4d %-4d %-4d %s %d\n%s\n", textType,
2376  Iu2Mils( aText->GetPosition().x ), Iu2Mils( aText->GetPosition().y ),
2377  spinStyle,
2378  Iu2Mils( aText->GetTextWidth() ),
2379  italics, Iu2Mils( aText->GetTextThickness() ), TO_UTF8( text ) );
2380  }
2381  else if( layer == LAYER_GLOBLABEL || layer == LAYER_HIERLABEL )
2382  {
2383  textType = ( layer == LAYER_GLOBLABEL ) ? "GLabel" : "HLabel";
2384 
2385  auto shapeLabelIt = sheetLabelNames.find( aText->GetShape() );
2386  wxCHECK_RET( shapeLabelIt != sheetLabelNames.end(), "Shape not found in names list" );
2387 
2388  m_out->Print( 0, "Text %s %-4d %-4d %-4d %-4d %s %s %d\n%s\n", textType,
2389  Iu2Mils( aText->GetPosition().x ), Iu2Mils( aText->GetPosition().y ),
2390  static_cast<int>( aText->GetLabelSpinStyle() ),
2391  Iu2Mils( aText->GetTextWidth() ),
2392  shapeLabelIt->second,
2393  italics,
2394  Iu2Mils( aText->GetTextThickness() ), TO_UTF8( text ) );
2395  }
2396 }
int GetTextThickness() const
Definition: eda_text.h:167
bool IsItalic() const
Definition: eda_text.h:187
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:96
#define NULL
LABEL_SPIN_STYLE GetLabelSpinStyle() const
Definition: sch_text.h:215
SCH_LAYER_ID
Eeschema drawing layers.
wxPoint GetPosition() const override
Definition: sch_text.h:293
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition: sch_item.h:272
int GetTextWidth() const
Definition: eda_text.h:248
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,...)
Format and write text to the output stream.
Definition: richio.cpp:408
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:133
PINSHEETLABEL_SHAPE GetShape() const
Definition: sch_text.h:217

References SCH_TEXT::GetLabelSpinStyle(), SCH_ITEM::GetLayer(), SCH_TEXT::GetPosition(), SCH_TEXT::GetShape(), EDA_TEXT::GetText(), EDA_TEXT::GetTextThickness(), EDA_TEXT::GetTextWidth(), EDA_TEXT::IsItalic(), LAYER_GLOBLABEL, LAYER_HIERLABEL, LAYER_LOCLABEL, LAYER_NOTES, m_out, NULL, OUTPUTFORMATTER::Print(), sheetLabelNames, text, and TO_UTF8.

Referenced by Format().

◆ SetReporter()

virtual void SCH_PLUGIN::SetReporter ( REPORTER aReporter)
inlinevirtualinherited

Set an optional reporter for warnings/errors.

Reimplemented in SCH_EAGLE_PLUGIN, SCH_ALTIUM_PLUGIN, and CADSTAR_SCH_ARCHIVE_PLUGIN.

Definition at line 165 of file sch_io_mgr.h.

165 {}

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

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

References _.

◆ writeDocFile()

bool SCH_LEGACY_PLUGIN::writeDocFile ( const PROPERTIES aProperties)
private

Definition at line 4239 of file sch_legacy_plugin.cpp.

4240 {
4241  std::string propName( SCH_LEGACY_PLUGIN::PropNoDocFile );
4242 
4243  if( aProperties && aProperties->find( propName ) != aProperties->end() )
4244  return false;
4245 
4246  return true;
4247 }
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_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_rootSheet

SCH_SHEET* SCH_LEGACY_PLUGIN::m_rootSheet
protected

The root sheet of the schematic being loaded..

Definition at line 179 of file sch_legacy_plugin.h.

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

◆ m_schematic

SCHEMATIC* SCH_LEGACY_PLUGIN::m_schematic
protected

Passed to Load(), the schematic object being loaded.

Definition at line 182 of file sch_legacy_plugin.h.

Referenced by Format(), init(), 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(), SYMBOL_LIBRARY_MANAGER::LIB_BUFFER::SaveBuffer(), and SYMBOL_LIBRARY_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(), PART_LIB::Save(), PART_LIB::SetCache(), and writeDocFile().


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