KiCad PCB EDA Suite
SCH_LEGACY_PLUGIN Class Reference

Class SCH_LEGACY_PLUGIN. More...

#include <sch_legacy_plugin.h>

Inheritance diagram for SCH_LEGACY_PLUGIN:
SCH_PLUGIN

Public Member Functions

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

Static Public Attributes

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

Protected Member Functions

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

Protected Attributes

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

Private Member Functions

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

Detailed Description

Class SCH_LEGACY_PLUGIN.

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

Constructor & Destructor Documentation

SCH_LEGACY_PLUGIN::SCH_LEGACY_PLUGIN ( )

Definition at line 554 of file sch_legacy_plugin.cpp.

References init().

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

Definition at line 560 of file sch_legacy_plugin.cpp.

References m_cache.

561 {
562  delete m_cache;
563 }
SCH_LEGACY_PLUGIN_CACHE * m_cache

Member Function Documentation

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

Definition at line 3387 of file sch_legacy_plugin.cpp.

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

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

3388 {
3389  if( !m_cache || !m_cache->IsFile( aLibraryFileName ) || m_cache->IsFileChanged() )
3390  {
3391  // a spectacular episode in memory management:
3392  delete m_cache;
3393  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryFileName );
3394 
3395  // Because m_cache is rebuilt, increment PART_LIBS::s_modify_generation
3396  // to modify the hash value that indicate component to symbol links
3397  // must be updated.
3399 
3400  if( !isBuffering( m_props ) )
3401  m_cache->Load();
3402  }
3403 }
static int s_modify_generation
helper for GetModifyHash()
SCH_LEGACY_PLUGIN_CACHE * m_cache
Class SCH_LEGACY_PLUGIN_CACHE is a cache assistant for the part library portion of the SCH_PLUGIN API...
bool isBuffering(const PROPERTIES *aProperties)
bool IsFile(const wxString &aFullPathAndFileName) const
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
void SCH_LEGACY_PLUGIN::CreateSymbolLib ( const wxString &  aLibraryPath,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Create a new empty symbol library at aLibraryPath.

It is an error to attempt to create an existing library or to attempt to create on a "read only" location.

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several footprints.
aPropertiesis an associative array that can be used to tell the library create function anything special, because it can take any number of additional named tuning arguments that the plugin is known to support. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Exceptions
IO_ERRORif there is a problem finding the library, or creating it.

Reimplemented from SCH_PLUGIN.

Definition at line 3540 of file sch_legacy_plugin.cpp.

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

3542 {
3543  if( wxFileExists( aLibraryPath ) )
3544  {
3546  _( "symbol library '%s' already exists, cannot create a new library" ),
3547  aLibraryPath.GetData() ) );
3548  }
3549 
3550  LOCALE_IO toggle;
3551 
3552  m_props = aProperties;
3553 
3554  delete m_cache;
3555  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryPath );
3556  m_cache->SetModified();
3557  m_cache->Save( writeDocFile( aProperties ) );
3558  m_cache->Load(); // update m_writable and m_mod_time
3559 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
SCH_LEGACY_PLUGIN_CACHE * m_cache
Class SCH_LEGACY_PLUGIN_CACHE is a cache assistant for the part library portion of the SCH_PLUGIN API...
void SetModified(bool aModified=true)
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
void Save(bool aSaveDocFile=true)
Save the entire library to file m_libFileName;.
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
bool writeDocFile(const PROPERTIES *aProperties)
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
void SCH_LEGACY_PLUGIN::DeleteAlias ( const wxString &  aLibraryPath,
const wxString &  aAliasName,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Delete aAliasName from the library at aLibraryPath.

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

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several symbols.
aAliasNameis the name of a LIB_ALIAS to delete from the specified library.
aPropertiesis an associative array that can be used to tell the library delete function anything special, because it can take any number of additional named tuning arguments that the plugin is known to support. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Exceptions
IO_ERRORif there is a problem finding the alias or the library or deleting it.

Reimplemented from SCH_PLUGIN.

Definition at line 3512 of file sch_legacy_plugin.cpp.

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

3514 {
3515  m_props = aProperties;
3516 
3517  cacheLib( aLibraryPath );
3518 
3519  m_cache->DeleteAlias( aAliasName );
3520 
3521  if( !isBuffering( aProperties ) )
3522  m_cache->Save( writeDocFile( aProperties ) );
3523 }
SCH_LEGACY_PLUGIN_CACHE * m_cache
bool isBuffering(const PROPERTIES *aProperties)
void DeleteAlias(const wxString &aAliasName)
void cacheLib(const wxString &aLibraryFileName)
void Save(bool aSaveDocFile=true)
Save the entire library to file m_libFileName;.
bool writeDocFile(const PROPERTIES *aProperties)
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
void SCH_LEGACY_PLUGIN::DeleteSymbol ( const wxString &  aLibraryPath,
const wxString &  aAliasName,
const PROPERTIES aProperties = NULL 
)
overridevirtual

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

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several symbols.
aAliasNameis the name of a LIB_ALIAS associated with it's root LIB_PART object to delete from the specified library.
aPropertiesis an associative array that can be used to tell the library delete function anything special, because it can take any number of additional named tuning arguments that the plugin is known to support. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Exceptions
IO_ERRORif there is a problem finding the alias or the library or deleting it.

Reimplemented from SCH_PLUGIN.

Definition at line 3526 of file sch_legacy_plugin.cpp.

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

3528 {
3529  m_props = aProperties;
3530 
3531  cacheLib( aLibraryPath );
3532 
3533  m_cache->DeleteSymbol( aAliasName );
3534 
3535  if( !isBuffering( aProperties ) )
3536  m_cache->Save( writeDocFile( aProperties ) );
3537 }
SCH_LEGACY_PLUGIN_CACHE * m_cache
bool isBuffering(const PROPERTIES *aProperties)
void cacheLib(const wxString &aLibraryFileName)
void Save(bool aSaveDocFile=true)
Save the entire library to file m_libFileName;.
void DeleteSymbol(const wxString &aAliasName)
bool writeDocFile(const PROPERTIES *aProperties)
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
bool SCH_LEGACY_PLUGIN::DeleteSymbolLib ( const wxString &  aLibraryPath,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Delete an existing symbol library and returns true if successful, or if library does not exist returns false, or throws an exception if library exists but is read only or cannot be deleted for some other reason.

Parameters
aLibraryPathis a locator for the "library", usually a directory or file which will contain symbols.
aPropertiesis an associative array that can be used to tell the library delete implementation function anything special, because it can take any number of additional named tuning arguments that the plugin is known to support. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Returns
true if library deleted or false if library did not exist.
Exceptions
IO_ERRORif there is a problem deleting an existing library.

Reimplemented from SCH_PLUGIN.

Definition at line 3562 of file sch_legacy_plugin.cpp.

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

3564 {
3565  wxFileName fn = aLibraryPath;
3566 
3567  if( !fn.FileExists() )
3568  return false;
3569 
3570  // Some of the more elaborate wxRemoveFile() crap puts up its own wxLog dialog
3571  // we don't want that. we want bare metal portability with no UI here.
3572  if( wxRemove( aLibraryPath ) )
3573  {
3574  THROW_IO_ERROR( wxString::Format( _( "library '%s' cannot be deleted" ),
3575  aLibraryPath.GetData() ) );
3576  }
3577 
3578  if( m_cache && m_cache->IsFile( aLibraryPath ) )
3579  {
3580  delete m_cache;
3581  m_cache = 0;
3582  }
3583 
3584  return true;
3585 }
SCH_LEGACY_PLUGIN_CACHE * m_cache
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
bool IsFile(const wxString &aFullPathAndFileName) const
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
void SCH_LEGACY_PLUGIN::EnumerateSymbolLib ( wxArrayString &  aAliasNameList,
const wxString &  aLibraryPath,
const PROPERTIES aProperties = NULL 
)
overridevirtual

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

Parameters
aAliasNameListis an array to populate with the LIB_ALIAS names associated with the library.
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing one or more LIB_PART objects.
aPropertiesis an associative array that can be used to tell the plugin anything needed about how to perform with respect to aLibraryPath. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Exceptions
IO_ERRORif the library cannot be found, the part library cannot be loaded.

Reimplemented from SCH_PLUGIN.

Definition at line 3446 of file sch_legacy_plugin.cpp.

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

3449 {
3450  LOCALE_IO toggle; // toggles on, then off, the C locale.
3451 
3452  m_props = aProperties;
3453 
3454  cacheLib( aLibraryPath );
3455 
3456  const LIB_ALIAS_MAP& aliases = m_cache->m_aliases;
3457 
3458  for( LIB_ALIAS_MAP::const_iterator it = aliases.begin(); it != aliases.end(); ++it )
3459  aAliasNameList.Add( it->first );
3460 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
SCH_LEGACY_PLUGIN_CACHE * m_cache
std::map< wxString, LIB_ALIAS *, AliasMapSort > LIB_ALIAS_MAP
Alias map used by part library object.
void cacheLib(const wxString &aLibraryFileName)
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
void SCH_LEGACY_PLUGIN::EnumerateSymbolLib ( std::vector< LIB_ALIAS * > &  aAliasList,
const wxString &  aLibraryPath,
const PROPERTIES aProperties = NULL 
)
overridevirtual

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

Parameters
aAliasListis an array to populate with the LIB_ALIAS pointers associated with the library.
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing one or more LIB_PART objects.
aPropertiesis an associative array that can be used to tell the plugin anything needed about how to perform with respect to aLibraryPath. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Exceptions
IO_ERRORif the library cannot be found, the part library cannot be loaded.

Reimplemented from SCH_PLUGIN.

Definition at line 3463 of file sch_legacy_plugin.cpp.

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

3466 {
3467  LOCALE_IO toggle; // toggles on, then off, the C locale.
3468 
3469  m_props = aProperties;
3470 
3471  cacheLib( aLibraryPath );
3472 
3473  const LIB_ALIAS_MAP& aliases = m_cache->m_aliases;
3474 
3475  for( LIB_ALIAS_MAP::const_iterator it = aliases.begin(); it != aliases.end(); ++it )
3476  aAliasList.push_back( it->second );
3477 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
SCH_LEGACY_PLUGIN_CACHE * m_cache
std::map< wxString, LIB_ALIAS *, AliasMapSort > LIB_ALIAS_MAP
Alias map used by part library object.
void cacheLib(const wxString &aLibraryFileName)
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
void SCH_LEGACY_PLUGIN::Format ( SCH_SCREEN aScreen)

Definition at line 1587 of file sch_legacy_plugin.cpp.

References EESCHEMA_VERSION, EscapedUTF8(), TITLE_BLOCK::GetComment1(), TITLE_BLOCK::GetComment2(), TITLE_BLOCK::GetComment3(), TITLE_BLOCK::GetComment4(), TITLE_BLOCK::GetCompany(), TITLE_BLOCK::GetDate(), SCH_SCREEN::GetDrawItems(), PAGE_INFO::GetHeightMils(), SCH_SCREEN::GetPageSettings(), TITLE_BLOCK::GetRevision(), TITLE_BLOCK::GetTitle(), SCH_SCREEN::GetTitleBlock(), PAGE_INFO::GetType(), PAGE_INFO::GetWidthMils(), PAGE_INFO::IsCustom(), PAGE_INFO::IsPortrait(), m_kiway, BASE_SCREEN::m_NumberOfScreens, m_out, BASE_SCREEN::m_ScreenNumber, SCH_ITEM::Next(), OUTPUTFORMATTER::Print(), KIWAY::Prj(), 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_HIERARCHICAL_LABEL_T, SCH_JUNCTION_T, SCH_LABEL_T, SCH_LAYER_ID_COUNT, SCH_LINE_T, SCH_NO_CONNECT_T, SCH_SHEET_T, SCH_TEXT_T, SCHEMATIC_HEAD_STRING, and TO_UTF8.

Referenced by Save().

1588 {
1589  wxCHECK_RET( aScreen != NULL, "NULL SCH_SCREEN* object." );
1590  wxCHECK_RET( m_kiway != NULL, "NULL KIWAY* object." );
1591 
1592  // Write the header
1593  m_out->Print( 0, "%s %s %d\n", "EESchema", SCHEMATIC_HEAD_STRING, EESCHEMA_VERSION );
1594 
1595  // Write the project libraries.
1596  for( const PART_LIB& lib : *m_kiway->Prj().SchLibs() )
1597  m_out->Print( 0, "LIBS:%s\n", TO_UTF8( lib.GetName() ) );
1598 
1599  // This section is not used, but written for file compatibility
1600  m_out->Print( 0, "EELAYER %d %d\n", SCH_LAYER_ID_COUNT, 0 );
1601  m_out->Print( 0, "EELAYER END\n" );
1602 
1603  /* Write page info, ScreenNumber and NumberOfScreen; not very meaningful for
1604  * SheetNumber and Sheet Count in a complex hierarchy, but useful in
1605  * simple hierarchy and flat hierarchy. Used also to search the root
1606  * sheet ( ScreenNumber = 1 ) within the files
1607  */
1608  const TITLE_BLOCK& tb = aScreen->GetTitleBlock();
1609  const PAGE_INFO& page = aScreen->GetPageSettings();
1610 
1611  m_out->Print( 0, "$Descr %s %d %d%s\n", TO_UTF8( page.GetType() ),
1612  page.GetWidthMils(),
1613  page.GetHeightMils(),
1614  !page.IsCustom() && page.IsPortrait() ? " portrait" : "" );
1615  m_out->Print( 0, "encoding utf-8\n" );
1616  m_out->Print( 0, "Sheet %d %d\n", aScreen->m_ScreenNumber, aScreen->m_NumberOfScreens );
1617  m_out->Print( 0, "Title %s\n", EscapedUTF8( tb.GetTitle() ).c_str() );
1618  m_out->Print( 0, "Date %s\n", EscapedUTF8( tb.GetDate() ).c_str() );
1619  m_out->Print( 0, "Rev %s\n", EscapedUTF8( tb.GetRevision() ).c_str() );
1620  m_out->Print( 0, "Comp %s\n", EscapedUTF8( tb.GetCompany() ).c_str() );
1621  m_out->Print( 0, "Comment1 %s\n", EscapedUTF8( tb.GetComment1() ).c_str() );
1622  m_out->Print( 0, "Comment2 %s\n", EscapedUTF8( tb.GetComment2() ).c_str() );
1623  m_out->Print( 0, "Comment3 %s\n", EscapedUTF8( tb.GetComment3() ).c_str() );
1624  m_out->Print( 0, "Comment4 %s\n", EscapedUTF8( tb.GetComment4() ).c_str() );
1625  m_out->Print( 0, "$EndDescr\n" );
1626 
1627  for( SCH_ITEM* item = aScreen->GetDrawItems(); item; item = item->Next() )
1628  {
1629  switch( item->Type() )
1630  {
1631  case SCH_COMPONENT_T:
1632  saveComponent( dynamic_cast< SCH_COMPONENT* >( item ) );
1633  break;
1634  case SCH_BITMAP_T:
1635  saveBitmap( dynamic_cast< SCH_BITMAP* >( item ) );
1636  break;
1637  case SCH_SHEET_T:
1638  saveSheet( dynamic_cast< SCH_SHEET* >( item ) );
1639  break;
1640  case SCH_JUNCTION_T:
1641  saveJunction( dynamic_cast< SCH_JUNCTION* >( item ) );
1642  break;
1643  case SCH_NO_CONNECT_T:
1644  saveNoConnect( dynamic_cast< SCH_NO_CONNECT* >( item ) );
1645  break;
1646  case SCH_BUS_WIRE_ENTRY_T:
1647  case SCH_BUS_BUS_ENTRY_T:
1648  saveBusEntry( dynamic_cast< SCH_BUS_ENTRY_BASE* >( item ) );
1649  break;
1650  case SCH_LINE_T:
1651  saveLine( dynamic_cast< SCH_LINE* >( item ) );
1652  break;
1653  case SCH_TEXT_T:
1654  case SCH_LABEL_T:
1655  case SCH_GLOBAL_LABEL_T:
1657  saveText( dynamic_cast< SCH_TEXT* >( item ) );
1658  break;
1659  default:
1660  wxASSERT( "Unexpected schematic object type in SCH_LEGACY_PLUGIN::Format()" );
1661  }
1662  }
1663 
1664  m_out->Print( 0, "$EndSCHEMATC\n" );
1665 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
const wxString & GetCompany() const
void saveLine(SCH_LINE *aLine)
void saveText(SCH_TEXT *aText)
const wxString & GetComment4() const
const wxString & GetDate() const
#define SCH_LAYER_ID_COUNT
void saveNoConnect(SCH_NO_CONNECT *aNoConnect)
Class TITLE_BLOCK holds the information shown in the lower right corner of a plot, printout, or editing view.
SCH_ITEM * Next() const
void saveSheet(SCH_SHEET *aSheet)
void saveJunction(SCH_JUNCTION *aJunction)
#define SCHEMATIC_HEAD_STRING
Definition: general.h:41
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes...
Definition: macros.h:47
const wxString & GetTitle() const
std::string EscapedUTF8(const wxString &aString)
Function EscapedUTF8 returns an 8 bit UTF8 string given aString in unicode form.
Definition: string.cpp:137
#define EESCHEMA_VERSION
Definition: general.h:40
bool IsPortrait() const
const wxString & GetRevision() const
Class PAGE_INFO describes the page size and margins of a paper page on which to eventually print or p...
VTBL_ENTRY PROJECT & Prj() const
Function Prj returns the PROJECT associated with this KIWAY.
Definition: kiway.cpp:144
void saveBitmap(SCH_BITMAP *aBitmap)
const wxString & GetComment3() const
int GetWidthMils() const
void saveComponent(SCH_COMPONENT *aComponent)
const TITLE_BLOCK & GetTitleBlock() const
const wxString & GetComment2() const
SCH_ITEM * GetDrawItems() const
Function GetDrawItems().
bool IsCustom() const
Function IsCustom returns true if the type is Custom.
const wxString & GetComment1() const
const PAGE_INFO & GetPageSettings() const
const wxString & GetType() const
KIWAY * m_kiway
Required for path to legacy component libraries.
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:408
Class PART_LIB is used to load, save, search, and otherwise manipulate part library files...
Class SCH_ITEM is a base class for any item which can be embedded within the SCHEMATIC container clas...
void saveBusEntry(SCH_BUS_ENTRY_BASE *aBusEntry)
int GetHeightMils() const
const wxString SCH_LEGACY_PLUGIN::GetFileExtension ( ) const
inlineoverridevirtual

Returns the file extension for the SCH_PLUGIN.

Implements SCH_PLUGIN.

Definition at line 73 of file sch_legacy_plugin.h.

74  {
75  return wxT( "sch" );
76  }
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 3423 of file sch_legacy_plugin.cpp.

References SCH_LEGACY_PLUGIN_CACHE::GetModifyHash(), and m_cache.

3424 {
3425  if( m_cache )
3426  return m_cache->GetModifyHash();
3427 
3428  // If the cache hasn't been loaded, it hasn't been modified.
3429  return 0;
3430 }
SCH_LEGACY_PLUGIN_CACHE * m_cache
const wxString SCH_LEGACY_PLUGIN::GetName ( ) const
inlineoverridevirtual

Returns a brief hard coded name for this SCH_PLUGIN.

Implements SCH_PLUGIN.

Definition at line 68 of file sch_legacy_plugin.h.

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

Reimplemented from SCH_PLUGIN.

Definition at line 3433 of file sch_legacy_plugin.cpp.

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

3435 {
3436  LOCALE_IO toggle;
3437 
3438  m_props = aProperties;
3439 
3440  cacheLib( aLibraryPath );
3441 
3442  return m_cache->m_aliases.size();
3443 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
SCH_LEGACY_PLUGIN_CACHE * m_cache
void cacheLib(const wxString &aLibraryFileName)
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
void SCH_LEGACY_PLUGIN::init ( KIWAY aKiway,
const PROPERTIES aProperties = NULL 
)
protected

initialize PLUGIN like a constructor would.

Definition at line 566 of file sch_legacy_plugin.cpp.

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

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

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

Definition at line 3417 of file sch_legacy_plugin.cpp.

References PROPERTIES::Exists(), and PropBuffering.

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

3418 {
3419  return ( aProperties && aProperties->Exists( SCH_LEGACY_PLUGIN::PropBuffering ) );
3420 }
bool Exists(const std::string &aProperty) const
Definition: properties.h:44
static const char * PropBuffering
const char* PropBuffering
bool SCH_PLUGIN::IsSymbolLibWritable ( const wxString &  aLibraryPath)
virtualinherited

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.

Definition at line 149 of file sch_plugin.cpp.

References not_implemented().

Referenced by SYMBOL_LIB_TABLE::IsSymbolLibWritable().

150 {
151  // not pure virtual so that plugins only have to implement subset of the SCH_PLUGIN interface.
152  not_implemented( this, __FUNCTION__ );
153  return false;
154 }
static void not_implemented(SCH_PLUGIN *aPlugin, const char *aCaller)
Function not_implemented throws an IO_ERROR and complains of an API function not being implemented...
Definition: sch_plugin.cpp:36
SCH_SHEET * SCH_LEGACY_PLUGIN::Load ( const wxString &  aFileName,
KIWAY aKiway,
SCH_SHEET aAppendToMe = NULL,
const PROPERTIES aProperties = NULL 
)
overridevirtual

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

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

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

Reimplemented from SCH_PLUGIN.

Definition at line 577 of file sch_legacy_plugin.cpp.

References SCH_SHEET::GetRootSheet(), init(), loadHierarchy(), m_path, and m_rootSheet.

579 {
580  wxASSERT( !aFileName || aKiway != NULL );
581 
582  LOCALE_IO toggle; // toggles on, then off, the C locale.
583  SCH_SHEET* sheet;
584 
585  wxFileName fn = aFileName;
586 
587  // Unfortunately child sheet file names the legacy schematic file format are not fully
588  // qualified and are always appended to the project path. The aFileName attribute must
589  // always be an absolute path so the project path can be used for load child sheet files.
590  wxASSERT( fn.IsAbsolute() );
591 
592  m_path = fn.GetPath();
593 
594  init( aKiway, aProperties );
595 
596  if( aAppendToMe == NULL )
597  {
598  // Clean up any allocated memory if an exception occurs loading the schematic.
599  std::unique_ptr< SCH_SHEET > newSheet( new SCH_SHEET );
600  newSheet->SetFileName( aFileName );
601  m_rootSheet = newSheet.get();
602  loadHierarchy( newSheet.get() );
603 
604  // If we got here, the schematic loaded successfully.
605  sheet = newSheet.release();
606  }
607  else
608  {
609  m_rootSheet = aAppendToMe->GetRootSheet();
610  wxASSERT( m_rootSheet != NULL );
611  sheet = aAppendToMe;
612  loadHierarchy( sheet );
613  }
614 
615  return sheet;
616 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
SCH_SHEET * m_rootSheet
The root sheet of the schematic being loaded..
SCH_SHEET * GetRootSheet()
Function GetRootSheet.
Definition: sch_sheet.cpp:135
wxString m_path
Root project path for loading child sheets.
void loadHierarchy(SCH_SHEET *aSheet)
void init(KIWAY *aKiway, const PROPERTIES *aProperties=NULL)
initialize PLUGIN like a constructor would.
Class SCH_SHEET is the sheet symbol placed in a schematic, and is the entry point for a sub schematic...
Definition: sch_sheet.h:216
SCH_BITMAP * SCH_LEGACY_PLUGIN::loadBitmap ( FILE_LINE_READER aReader)
private
Todo:
Make m_scale private and add accessors.

Definition at line 998 of file sch_legacy_plugin.cpp.

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

Referenced by loadFile().

999 {
1000  std::unique_ptr< SCH_BITMAP > bitmap( new SCH_BITMAP );
1001 
1002  const char* line = aReader.Line();
1003 
1004  wxCHECK( strCompare( "$Bitmap", line, &line ), NULL );
1005 
1006  line = aReader.ReadLine();
1007 
1008  while( line != NULL )
1009  {
1010  if( strCompare( "Pos", line, &line ) )
1011  {
1012  wxPoint position;
1013 
1014  position.x = parseInt( aReader, line, &line );
1015  position.y = parseInt( aReader, line, &line );
1016  bitmap->SetPosition( position );
1017  }
1018  else if( strCompare( "Scale", line, &line ) )
1019  {
1021  bitmap->GetImage()->SetScale( parseDouble( aReader, line, &line ) );
1022  }
1023  else if( strCompare( "Data", line, &line ) )
1024  {
1025  wxMemoryOutputStream stream;
1026 
1027  while( line )
1028  {
1029  if( !aReader.ReadLine() )
1030  SCH_PARSE_ERROR( _( "Unexpected end of file" ), aReader, line );
1031 
1032  line = aReader.Line();
1033 
1034  if( strCompare( "EndData", line ) )
1035  {
1036  // all the PNG date is read.
1037  // We expect here m_image and m_bitmap are void
1038  wxImage* image = new wxImage();
1039  wxMemoryInputStream istream( stream );
1040  image->LoadFile( istream, wxBITMAP_TYPE_PNG );
1041  bitmap->GetImage()->SetImage( image );
1042  bitmap->GetImage()->SetBitmap( new wxBitmap( *image ) );
1043  break;
1044  }
1045 
1046  // Read PNG data, stored in hexadecimal,
1047  // each byte = 2 hexadecimal digits and a space between 2 bytes
1048  // and put it in memory stream buffer
1049  int len = strlen( line );
1050 
1051  for( ; len > 0 && !isspace( *line ); len -= 3, line += 3 )
1052  {
1053  int value = 0;
1054 
1055  if( sscanf( line, "%X", &value ) == 1 )
1056  stream.PutC( (char) value );
1057  else
1058  THROW_IO_ERROR( "invalid PNG data" );
1059  }
1060  }
1061 
1062  if( line == NULL )
1063  THROW_IO_ERROR( _( "unexpected end of file" ) );
1064  }
1065  else if( strCompare( "$EndBitmap", line ) )
1066  return bitmap.release();
1067 
1068  line = aReader.ReadLine();
1069  }
1070 
1071  THROW_IO_ERROR( _( "unexpected end of file" ) );
1072 }
char * ReadLine() override
Function ReadLine reads a line of text into the buffer and increments the line number counter...
Definition: richio.cpp:196
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Function parseInt.
static double parseDouble(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Function parseDouble.
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
#define SCH_PARSE_ERROR(text, reader, pos)
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Function strCompare.
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
SCH_BUS_ENTRY_BASE * SCH_LEGACY_PLUGIN::loadBusEntry ( FILE_LINE_READER aReader)
private

Definition at line 1155 of file sch_legacy_plugin.cpp.

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

Referenced by loadFile().

1156 {
1157  const char* line = aReader.Line();
1158 
1159  wxCHECK( strCompare( "Entry", line, &line ), NULL );
1160 
1161  std::unique_ptr< SCH_BUS_ENTRY_BASE > busEntry;
1162 
1163  if( strCompare( "Wire", line, &line ) )
1164  {
1165  busEntry.reset( new SCH_BUS_WIRE_ENTRY );
1166 
1167  if( !strCompare( "Line", line, &line ) )
1168  SCH_PARSE_ERROR( "invalid bus entry definition expected 'Line'", aReader, line );
1169  }
1170  else if( strCompare( "Bus", line, &line ) )
1171  {
1172  busEntry.reset( new SCH_BUS_BUS_ENTRY );
1173 
1174  if( !strCompare( "Bus", line, &line ) )
1175  SCH_PARSE_ERROR( "invalid bus entry definition expected 'Bus'", aReader, line );
1176  }
1177  else
1178  SCH_PARSE_ERROR( "invalid bus entry type", aReader, line );
1179 
1180  line = aReader.ReadLine();
1181 
1182  wxPoint pos;
1183  wxSize size;
1184 
1185  pos.x = parseInt( aReader, line, &line );
1186  pos.y = parseInt( aReader, line, &line );
1187  size.x = parseInt( aReader, line, &line );
1188  size.y = parseInt( aReader, line, &line );
1189 
1190  size.x -= pos.x;
1191  size.y -= pos.y;
1192 
1193  busEntry->SetPosition( pos );
1194  busEntry->SetSize( size );
1195 
1196  return busEntry.release();
1197 }
Class SCH_BUS_WIRE_ENTRY.
char * ReadLine() override
Function ReadLine reads a line of text into the buffer and increments the line number counter...
Definition: richio.cpp:196
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Function parseInt.
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
#define SCH_PARSE_ERROR(text, reader, pos)
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Function strCompare.
Class SCH_BUS_WIRE_ENTRY.
SCH_COMPONENT * SCH_LEGACY_PLUGIN::loadComponent ( FILE_LINE_READER aReader)
private

Definition at line 1296 of file sch_legacy_plugin.cpp.

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

Referenced by loadFile().

1297 {
1298  const char* line = aReader.Line();
1299 
1300  wxCHECK( strCompare( "$Comp", line, &line ), NULL );
1301 
1302  std::unique_ptr< SCH_COMPONENT > component( new SCH_COMPONENT() );
1303 
1304  line = aReader.ReadLine();
1305 
1306  while( line != NULL )
1307  {
1308  if( strCompare( "L", line, &line ) )
1309  {
1310  wxString libName;
1311 
1312  parseUnquotedString( libName, aReader, line, &line );
1313  libName.Replace( "~", " " );
1314 
1315  LIB_ID libId( wxEmptyString, libName );
1316 
1317  component->SetLibId( libId );
1318 
1319  wxString refDesignator;
1320 
1321  parseUnquotedString( refDesignator, aReader, line, &line );
1322  refDesignator.Replace( "~", " " );
1323 
1324  wxString prefix = refDesignator;
1325 
1326  while( prefix.Length() )
1327  {
1328  if( ( prefix.Last() < '0' || prefix.Last() > '9') && prefix.Last() != '?' )
1329  break;
1330 
1331  prefix.RemoveLast();
1332  }
1333 
1334  // Avoid a prefix containing trailing/leading spaces
1335  prefix.Trim( true );
1336  prefix.Trim( false );
1337 
1338  if( prefix.IsEmpty() )
1339  component->SetPrefix( wxString( "U" ) );
1340  else
1341  component->SetPrefix( prefix );
1342  }
1343  else if( strCompare( "U", line, &line ) )
1344  {
1345  // This fixes a potentially buggy files caused by unit being set to zero which
1346  // causes netlist issues. See https://bugs.launchpad.net/kicad/+bug/1677282.
1347  int unit = parseInt( aReader, line, &line );
1348 
1349  if( unit == 0 )
1350  {
1351  unit = 1;
1352 
1353  // Set the file as modified so the user can be warned.
1354  if( m_rootSheet && m_rootSheet->GetScreen() )
1356  }
1357 
1358  component->SetUnit( unit );
1359  component->SetConvert( parseInt( aReader, line, &line ) );
1360  component->SetTimeStamp( parseHex( aReader, line, &line ) );
1361  }
1362  else if( strCompare( "P", line, &line ) )
1363  {
1364  wxPoint pos;
1365 
1366  pos.x = parseInt( aReader, line, &line );
1367  pos.y = parseInt( aReader, line, &line );
1368  component->SetPosition( pos );
1369  }
1370  else if( strCompare( "AR", line, &line ) )
1371  {
1372  const char* strCompare = "Path=";
1373  int len = strlen( strCompare );
1374 
1375  if( strncasecmp( strCompare, line, len ) != 0 )
1376  SCH_PARSE_ERROR( "missing 'Path=' token", aReader, line );
1377 
1378  line += len;
1379  wxString path, reference, unit;
1380 
1381  parseQuotedString( path, aReader, line, &line );
1382 
1383  strCompare = "Ref=";
1384  len = strlen( strCompare );
1385 
1386  if( strncasecmp( strCompare, line, len ) != 0 )
1387  SCH_PARSE_ERROR( "missing 'Ref=' token", aReader, line );
1388 
1389  line+= len;
1390  parseQuotedString( reference, aReader, line, &line );
1391 
1392  strCompare = "Part=";
1393  len = strlen( strCompare );
1394 
1395  if( strncasecmp( strCompare, line, len ) != 0 )
1396  SCH_PARSE_ERROR( "missing 'Part=' token", aReader, line );
1397 
1398  line+= len;
1399  parseQuotedString( unit, aReader, line, &line );
1400 
1401  long tmp;
1402 
1403  if( !unit.ToLong( &tmp, 10 ) )
1404  SCH_PARSE_ERROR( "expected integer value", aReader, line );
1405 
1406  if( tmp < 0 || tmp > MAX_UNIT_COUNT_PER_PACKAGE )
1407  SCH_PARSE_ERROR( "unit value out of range", aReader, line );
1408 
1409  component->AddHierarchicalReference( path, reference, (int)tmp );
1410  component->GetField( REFERENCE )->SetText( reference );
1411 
1412  }
1413  else if( strCompare( "F", line, &line ) )
1414  {
1415  int index = parseInt( aReader, line, &line );
1416 
1417  wxString text, name;
1418 
1419  parseQuotedString( text, aReader, line, &line, true );
1420 
1421  char orientation = parseChar( aReader, line, &line );
1422  wxPoint pos;
1423  pos.x = parseInt( aReader, line, &line );
1424  pos.y = parseInt( aReader, line, &line );
1425  int size = parseInt( aReader, line, &line );
1426  int attributes = parseHex( aReader, line, &line );
1427 
1428  if( index >= component->GetFieldCount() )
1429  {
1430  // The first MANDATOR_FIELDS _must_ be constructed within
1431  // the SCH_COMPONENT constructor. This assert is simply here
1432  // to guard against a change in that constructor.
1433  wxASSERT( component->GetFieldCount() >= MANDATORY_FIELDS );
1434 
1435  // Ignore the _supplied_ fieldNdx. It is not important anymore
1436  // if within the user defined fields region (i.e. >= MANDATORY_FIELDS).
1437  // We freely renumber the index to fit the next available field slot.
1438  index = component->GetFieldCount(); // new has this index after insertion
1439 
1440  SCH_FIELD field( wxPoint( 0, 0 ), -1, component.get(), name );
1441  component->AddField( field );
1442  }
1443 
1444  // Prior to version 2 of the schematic file format, none of the following existed.
1445  if( m_version > 1 )
1446  {
1447  wxString textAttrs;
1448  char hjustify = parseChar( aReader, line, &line );
1449 
1450  parseUnquotedString( textAttrs, aReader, line, &line );
1451 
1452  // The name of the field is optional.
1453  parseQuotedString( name, aReader, line, &line, true );
1454 
1455  if( hjustify == 'L' )
1456  component->GetField( index )->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT );
1457  else if( hjustify == 'R' )
1458  component->GetField( index )->SetHorizJustify( GR_TEXT_HJUSTIFY_RIGHT );
1459  else if( hjustify != 'C' )
1460  SCH_PARSE_ERROR( "component field text horizontal justification must be "
1461  "L, R, or C", aReader, line );
1462 
1463  // We are guaranteed to have a least one character here for older file formats
1464  // otherwise an exception would have been raised..
1465  if( textAttrs[0] == 'T' )
1466  component->GetField( index )->SetVertJustify( GR_TEXT_VJUSTIFY_TOP );
1467  else if( textAttrs[0] == 'B' )
1468  component->GetField( index )->SetVertJustify( GR_TEXT_VJUSTIFY_BOTTOM );
1469  else if( textAttrs[0] != 'C' )
1470  SCH_PARSE_ERROR( "component field text vertical justification must be "
1471  "B, T, or C", aReader, line );
1472 
1473  // Newer file formats include the bold and italics text attribute.
1474  if( textAttrs.Length() > 1 )
1475  {
1476  if( textAttrs.Length() != 3 )
1477  SCH_PARSE_ERROR( _( "component field text attributes must be 3 characters wide" ),
1478  aReader, line );
1479 
1480  if( textAttrs[1] == 'I' )
1481  component->GetField( index )->SetItalic( true );
1482  else if( textAttrs[1] != 'N' )
1483  SCH_PARSE_ERROR( "component field text italics indicator must be I or N",
1484  aReader, line );
1485 
1486  if( textAttrs[2] == 'B' )
1487  component->GetField( index )->SetBold( true );
1488  else if( textAttrs[2] != 'N' )
1489  SCH_PARSE_ERROR( "component field text bold indicator must be B or N",
1490  aReader, line );
1491  }
1492  }
1493 
1494  component->GetField( index )->SetText( text );
1495  component->GetField( index )->SetTextPos( pos );
1496  component->GetField( index )->SetVisible( !attributes );
1497  component->GetField( index )->SetTextSize( wxSize( size, size ) );
1498 
1499  if( orientation == 'H' )
1500  component->GetField( index )->SetTextAngle( TEXT_ANGLE_HORIZ );
1501  else if( orientation == 'V' )
1502  component->GetField( index )->SetTextAngle( TEXT_ANGLE_VERT );
1503  else
1504  SCH_PARSE_ERROR( "component field orientation must be H or V",
1505  aReader, line );
1506 
1507  if( name.IsEmpty() )
1509 
1510  component->GetField( index )->SetName( name );
1511  }
1512  else if( strCompare( "$EndComp", line ) )
1513  {
1514  // Ensure all flags (some are set by previous initializations) are reset:
1515  component->ClearFlags();
1516  return component.release();
1517  }
1518  else
1519  {
1520  // There are two lines that begin with a tab or spaces that includes a line with the
1521  // redundant position information and the transform matrix settings.
1522 
1523  // Parse the redundant position information just the same to check for formatting
1524  // errors.
1525  parseInt( aReader, line, &line ); // Always 1.
1526  parseInt( aReader, line, &line ); // The X coordinate.
1527  parseInt( aReader, line, &line ); // The Y coordinate.
1528 
1529  line = aReader.ReadLine();
1530 
1531  TRANSFORM transform;
1532 
1533  transform.x1 = parseInt( aReader, line, &line );
1534 
1535  if( transform.x1 < -1 || transform.x1 > 1 )
1536  SCH_PARSE_ERROR( "invalid component X1 transform value", aReader, line );
1537 
1538  transform.y1 = parseInt( aReader, line, &line );
1539 
1540  if( transform.y1 < -1 || transform.y1 > 1 )
1541  SCH_PARSE_ERROR( "invalid component Y1 transform value", aReader, line );
1542 
1543  transform.x2 = parseInt( aReader, line, &line );
1544 
1545  if( transform.x2 < -1 || transform.x2 > 1 )
1546  SCH_PARSE_ERROR( "invalid component X2 transform value", aReader, line );
1547 
1548  transform.y2 = parseInt( aReader, line, &line );
1549 
1550  if( transform.y2 < -1 || transform.y2 > 1 )
1551  SCH_PARSE_ERROR( "invalid component Y2 transform value", aReader, line );
1552 
1553  component->SetTransform( transform );
1554  }
1555 
1556  line = aReader.ReadLine();
1557  }
1558 
1559  SCH_PARSE_ERROR( "invalid component line", aReader, line );
1560 
1561  return NULL; // Prevents compiler warning. Should never get here.
1562 }
#define TEXT_ANGLE_HORIZ
Frequent text rotations, used with {Set,Get}TextAngle(), in 0.1 degrees for now, hoping to migrate to...
Definition: common.h:91
Class SCH_FIELD instances are attached to a component and provide a place for the component's value...
Definition: sch_field.h:56
char * ReadLine() override
Function ReadLine reads a line of text into the buffer and increments the line number counter...
Definition: richio.cpp:196
int y2
Definition: transform.h:51
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Function parseInt.
static char parseChar(FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL)
Function parseChar.
The first 4 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors...
int x2
Definition: transform.h:50
SCH_SHEET * m_rootSheet
The root sheet of the schematic being loaded..
int x1
Definition: transform.h:48
static const wxString GetDefaultFieldName(int aFieldNdx)
Function GetDefaultFieldName returns a default symbol field name for field aFieldNdx for all componen...
#define MAX_UNIT_COUNT_PER_PACKAGE
The maximum number of units per package.
Definition: eeschema_id.h:48
Class LIB_ID.
Definition: lib_id.h:56
SCH_SCREEN * GetScreen()
Definition: sch_sheet.h:286
#define TEXT_ANGLE_VERT
Definition: common.h:92
Field Reference of part, i.e. "IC21".
int m_version
Version of file being loaded.
int y1
Definition: transform.h:49
Class for tranforming drawing coordinates for a wxDC device context.
Definition: transform.h:45
static void parseUnquotedString(wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
Function parseUnquotedString.
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
static unsigned long parseHex(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Function parseHex.
#define SCH_PARSE_ERROR(text, reader, pos)
static void parseQuotedString(wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
Function parseQuotedString.
Class SCH_COMPONENT describes a real schematic component.
Definition: sch_component.h:69
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Function strCompare.
const char * name
void SCH_LEGACY_PLUGIN::loadFile ( const wxString &  aFileName,
SCH_SCREEN aScreen 
)
private

Definition at line 675 of file sch_legacy_plugin.cpp.

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

Referenced by loadHierarchy().

676 {
677  FILE_LINE_READER reader( aFileName );
678 
679  loadHeader( reader, aScreen );
680 
681  while( reader.ReadLine() )
682  {
683  char* line = reader.Line();
684 
685  while( *line && *line == ' ' )
686  line++;
687 
688  // Either an object will be loaded properly or the file load will fail and raise
689  // an exception.
690  if( strCompare( "$Descr", line ) )
691  loadPageSettings( reader, aScreen );
692  else if( strCompare( "$Comp", line ) )
693  aScreen->Append( loadComponent( reader ) );
694  else if( strCompare( "$Sheet", line ) )
695  aScreen->Append( loadSheet( reader ) );
696  else if( strCompare( "$Bitmap", line ) )
697  aScreen->Append( loadBitmap( reader ) );
698  else if( strCompare( "Connection", line ) )
699  aScreen->Append( loadJunction( reader ) );
700  else if( strCompare( "NoConn", line ) )
701  aScreen->Append( loadNoConnect( reader ) );
702  else if( strCompare( "Wire", line ) )
703  aScreen->Append( loadWire( reader ) );
704  else if( strCompare( "Entry", line ) )
705  aScreen->Append( loadBusEntry( reader ) );
706  else if( strCompare( "Text", line ) )
707  aScreen->Append( loadText( reader ) );
708  else if( strCompare( "$EndSCHEMATC", line ) )
709  return;
710  }
711 
712  // Unfortunately schematic files prior to version 2 are not terminated with $EndSCHEMATC
713  // so checking for it's existance will fail so just exit here and take our chances. :(
714  if( m_version > 1 )
715  THROW_IO_ERROR( "'$EndSCHEMATC' not found" );
716 }
SCH_BITMAP * loadBitmap(FILE_LINE_READER &aReader)
void loadPageSettings(FILE_LINE_READER &aReader, SCH_SCREEN *aScreen)
int m_version
Version of file being loaded.
SCH_SHEET * loadSheet(FILE_LINE_READER &aReader)
Class FILE_LINE_READER is a LINE_READER that reads from an open file.
Definition: richio.h:180
SCH_TEXT * loadText(FILE_LINE_READER &aReader)
SCH_JUNCTION * loadJunction(FILE_LINE_READER &aReader)
void Append(SCH_ITEM *aItem)
void loadHeader(FILE_LINE_READER &aReader, SCH_SCREEN *aScreen)
SCH_BUS_ENTRY_BASE * loadBusEntry(FILE_LINE_READER &aReader)
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Function strCompare.
SCH_COMPONENT * loadComponent(FILE_LINE_READER &aReader)
SCH_LINE * loadWire(FILE_LINE_READER &aReader)
SCH_NO_CONNECT * loadNoConnect(FILE_LINE_READER &aReader)
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
void SCH_LEGACY_PLUGIN::loadHeader ( FILE_LINE_READER aReader,
SCH_SCREEN aScreen 
)
private

Definition at line 719 of file sch_legacy_plugin.cpp.

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

Referenced by loadFile().

720 {
721  const char* line = aReader.ReadLine();
722 
723  if( !strCompare( "Eeschema Schematic File Version", line, &line ) )
724  {
725  m_error.Printf( _( "'%s' does not appear to be an Eeschema file" ),
726  GetChars( aScreen->GetFileName() ) );
728  }
729 
730  // get the file version here.
731  m_version = parseInt( aReader, line, &line );
732 
733  // The next lines are the lib list section, and are mainly comments, like:
734  // LIBS:power
735  // the lib list is not used, but is in schematic file just in case.
736  // It is usually not empty, but we accept empty list.
737  // If empty, there is a legacy section, not used
738  // EELAYER i j
739  // and the last line is
740  // EELAYER END
741  // Skip all lines until the end of header "EELAYER END" is found
742  while( aReader.ReadLine() )
743  {
744  line = aReader.Line();
745 
746  while( *line == ' ' )
747  line++;
748 
749  if( strCompare( "EELAYER END", line ) )
750  return;
751  }
752 
753  THROW_IO_ERROR( _( "Missing 'EELAYER END'" ) );
754 }
char * ReadLine() override
Function ReadLine reads a line of text into the buffer and increments the line number counter...
Definition: richio.cpp:196
wxString m_error
For throwing exceptions.
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Function parseInt.
const wxString & GetFileName() const
int m_version
Version of file being loaded.
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
static const wxChar * GetChars(const wxString &s)
Function GetChars returns a wxChar* to the actual wxChar* data within a wxString, and is helpful for ...
Definition: macros.h:92
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Function strCompare.
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
void SCH_LEGACY_PLUGIN::loadHierarchy ( SCH_SHEET aSheet)
private

Definition at line 621 of file sch_legacy_plugin.cpp.

References SCH_SCREEN::GetDrawItems(), SCH_SHEET::GetFileName(), SCH_SHEET::GetScreen(), loadFile(), m_kiway, m_path, m_rootSheet, SCH_SHEET_T, SCH_SHEET::SearchHierarchy(), SCH_SCREEN::SetFileName(), EDA_ITEM::SetParent(), and SCH_SHEET::SetScreen().

Referenced by Load().

622 {
623  SCH_SCREEN* screen = NULL;
624 
625  if( !aSheet->GetScreen() )
626  {
627  // SCH_SCREEN objects store the full path and file name where the SCH_SHEET object only
628  // stores the file name and extension. Add the project path to the file name and
629  // extension to compare when calling SCH_SHEET::SearchHierarchy().
630  wxFileName fileName = aSheet->GetFileName();
631 
632  if( !fileName.IsAbsolute() )
633  fileName.MakeAbsolute( m_path );
634 
635  m_rootSheet->SearchHierarchy( fileName.GetFullPath(), &screen );
636 
637  if( screen )
638  {
639  aSheet->SetScreen( screen );
640 
641  // Do not need to load the sub-sheets - this has already been done.
642  }
643  else
644  {
645  aSheet->SetScreen( new SCH_SCREEN( m_kiway ) );
646  aSheet->GetScreen()->SetFileName( fileName.GetFullPath() );
647  loadFile( fileName.GetFullPath(), aSheet->GetScreen() );
648 
649  EDA_ITEM* item = aSheet->GetScreen()->GetDrawItems();
650 
651  while( item )
652  {
653  if( item->Type() == SCH_SHEET_T )
654  {
655  SCH_SHEET* sheet = (SCH_SHEET*) item;
656 
657  // Set the parent to aSheet. This effectively creates a method to find
658  // the root sheet from any sheet so a pointer to the root sheet does not
659  // need to be stored globally. Note: this is not the same as a hierarchy.
660  // Complex hierarchies can have multiple copies of a sheet. This only
661  // provides a simple tree to find the root sheet.
662  sheet->SetParent( aSheet );
663 
664  // Recursion starts here.
665  loadHierarchy( sheet );
666  }
667 
668  item = item->Next();
669  }
670  }
671  }
672 }
bool SearchHierarchy(const wxString &aFilename, SCH_SCREEN **aScreen)
Function SearchHierarchy search the existing hierarchy for an instance of screen "FileName".
Definition: sch_sheet.cpp:744
void SetScreen(SCH_SCREEN *aScreen)
Function SetScreen sets the screen associated with this sheet to aScreen.
Definition: sch_sheet.cpp:103
SCH_SHEET * m_rootSheet
The root sheet of the schematic being loaded..
SCH_SCREEN * GetScreen()
Definition: sch_sheet.h:286
void loadFile(const wxString &aFileName, SCH_SCREEN *aScreen)
wxString m_path
Root project path for loading child sheets.
void loadHierarchy(SCH_SHEET *aSheet)
void SetParent(EDA_ITEM *aParent)
Definition: base_struct.h:227
wxString GetFileName(void) const
Function GetFileName return the filename corresponding to this sheet.
Definition: sch_sheet.cpp:880
Class SCH_SHEET is the sheet symbol placed in a schematic, and is the entry point for a sub schematic...
Definition: sch_sheet.h:216
SCH_ITEM * GetDrawItems() const
Function GetDrawItems().
Class EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boa...
Definition: base_struct.h:165
void SetFileName(const wxString &aFileName)
KIWAY * m_kiway
Required for path to legacy component libraries.
SCH_JUNCTION * SCH_LEGACY_PLUGIN::loadJunction ( FILE_LINE_READER aReader)
private

Definition at line 1075 of file sch_legacy_plugin.cpp.

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

Referenced by loadFile().

1076 {
1077  std::unique_ptr< SCH_JUNCTION > junction( new SCH_JUNCTION );
1078 
1079  const char* line = aReader.Line();
1080 
1081  wxCHECK( strCompare( "Connection", line, &line ), NULL );
1082 
1083  wxString name;
1084 
1085  parseUnquotedString( name, aReader, line, &line );
1086 
1087  wxPoint position;
1088 
1089  position.x = parseInt( aReader, line, &line );
1090  position.y = parseInt( aReader, line, &line );
1091  junction->SetPosition( position );
1092 
1093  return junction.release();
1094 }
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Function parseInt.
static void parseUnquotedString(wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
Function parseUnquotedString.
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Function strCompare.
const char * name
SCH_NO_CONNECT * SCH_LEGACY_PLUGIN::loadNoConnect ( FILE_LINE_READER aReader)
private

Definition at line 1097 of file sch_legacy_plugin.cpp.

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

Referenced by loadFile().

1098 {
1099  std::unique_ptr< SCH_NO_CONNECT > no_connect( new SCH_NO_CONNECT );
1100 
1101  const char* line = aReader.Line();
1102 
1103  wxCHECK( strCompare( "NoConn", line, &line ), NULL );
1104 
1105  wxString name;
1106 
1107  parseUnquotedString( name, aReader, line, &line );
1108 
1109  wxPoint position;
1110 
1111  position.x = parseInt( aReader, line, &line );
1112  position.y = parseInt( aReader, line, &line );
1113  no_connect->SetPosition( position );
1114 
1115  return no_connect.release();
1116 }
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Function parseInt.
static void parseUnquotedString(wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
Function parseUnquotedString.
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Function strCompare.
const char * name
void SCH_LEGACY_PLUGIN::loadPageSettings ( FILE_LINE_READER aReader,
SCH_SCREEN aScreen 
)
private

Definition at line 757 of file sch_legacy_plugin.cpp.

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

Referenced by loadFile().

758 {
759  wxASSERT( aScreen != NULL );
760 
761  wxString buf;
762  const char* line = aReader.Line();
763 
764  PAGE_INFO pageInfo;
765  TITLE_BLOCK tb;
766 
767  wxCHECK_RET( strCompare( "$Descr", line, &line ), "Invalid sheet description" );
768 
769  parseUnquotedString( buf, aReader, line, &line );
770 
771  if( !pageInfo.SetType( buf ) )
772  SCH_PARSE_ERROR( "invalid page size", aReader, line );
773 
774  int pagew = parseInt( aReader, line, &line );
775  int pageh = parseInt( aReader, line, &line );
776 
777  if( buf == PAGE_INFO::Custom )
778  {
779  pageInfo.SetWidthMils( pagew );
780  pageInfo.SetHeightMils( pageh );
781  }
782  else
783  {
784  wxString orientation;
785 
786  // Non custom size, set portrait if its present. Can be empty string which defaults
787  // to landscape.
788  parseUnquotedString( orientation, aReader, line, &line, true );
789 
790  if( orientation == "portrait" )
791  pageInfo.SetPortrait( true );
792  }
793 
794  aScreen->SetPageSettings( pageInfo );
795 
796  while( line != NULL )
797  {
798  buf.clear();
799 
800  if( !aReader.ReadLine() )
801  SCH_PARSE_ERROR( _( "unexpected end of file" ), aReader, line );
802 
803  line = aReader.Line();
804 
805  if( strCompare( "Sheet", line, &line ) )
806  {
807  aScreen->m_ScreenNumber = parseInt( aReader, line, &line );
808  aScreen->m_NumberOfScreens = parseInt( aReader, line, &line );
809  }
810  else if( strCompare( "Title", line, &line ) )
811  {
812  parseQuotedString( buf, aReader, line, &line, true );
813  tb.SetTitle( buf );
814  }
815  else if( strCompare( "Date", line, &line ) )
816  {
817  parseQuotedString( buf, aReader, line, &line, true );
818  tb.SetDate( buf );
819  }
820  else if( strCompare( "Rev", line, &line ) )
821  {
822  parseQuotedString( buf, aReader, line, &line, true );
823  tb.SetRevision( buf );
824  }
825  else if( strCompare( "Comp", line, &line ) )
826  {
827  parseQuotedString( buf, aReader, line, &line, true );
828  tb.SetCompany( buf );
829  }
830  else if( strCompare( "Comment1", line, &line ) )
831  {
832  parseQuotedString( buf, aReader, line, &line, true );
833  tb.SetComment1( buf );
834  }
835  else if( strCompare( "Comment2", line, &line ) )
836  {
837  parseQuotedString( buf, aReader, line, &line, true );
838  tb.SetComment2( buf );
839  }
840  else if( strCompare( "Comment3", line, &line ) )
841  {
842  parseQuotedString( buf, aReader, line, &line, true );
843  tb.SetComment3( buf );
844  }
845  else if( strCompare( "Comment4", line, &line ) )
846  {
847  parseQuotedString( buf, aReader, line, &line, true );
848  tb.SetComment4( buf );
849  }
850  else if( strCompare( "$EndDescr", line ) )
851  {
852  aScreen->SetTitleBlock( tb );
853  return;
854  }
855  }
856 
857  SCH_PARSE_ERROR( "missing 'EndDescr'", aReader, line );
858 }
void SetComment1(const wxString &aComment)
char * ReadLine() override
Function ReadLine reads a line of text into the buffer and increments the line number counter...
Definition: richio.cpp:196
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Function parseInt.
void SetRevision(const wxString &aRevision)
void SetDate(const wxString &aDate)
Function SetDate sets the date field, and defaults to the current time and date.
void SetPageSettings(const PAGE_INFO &aPageSettings)
static const wxChar Custom[]
"User" defined page type
Class TITLE_BLOCK holds the information shown in the lower right corner of a plot, printout, or editing view.
void SetComment4(const wxString &aComment)
static void parseUnquotedString(wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
Function parseUnquotedString.
Class PAGE_INFO describes the page size and margins of a paper page on which to eventually print or p...
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
void SetCompany(const wxString &aCompany)
bool SetType(const wxString &aStandardPageDescriptionName, bool IsPortrait=false)
Function SetType sets the name of the page type and also the sizes and margins commonly associated wi...
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)
void SetTitle(const wxString &aTitle)
void SetPortrait(bool isPortrait)
Function SetPortrait will rotate the paper page 90 degrees.
void SetHeightMils(int aHeightInMils)
void SetComment2(const wxString &aComment)
#define SCH_PARSE_ERROR(text, reader, pos)
static void parseQuotedString(wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
Function parseQuotedString.
void SetWidthMils(int aWidthInMils)
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Function strCompare.
void SetComment3(const wxString &aComment)
SCH_SHEET * SCH_LEGACY_PLUGIN::loadSheet ( FILE_LINE_READER aReader)
private

Definition at line 861 of file sch_legacy_plugin.cpp.

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

Referenced by loadFile().

862 {
863  std::unique_ptr< SCH_SHEET > sheet( new SCH_SHEET() );
864 
865  sheet->SetTimeStamp( GetNewTimeStamp() );
866 
867  const char* line = aReader.ReadLine();
868 
869  while( line != NULL )
870  {
871  if( strCompare( "S", line, &line ) ) // Sheet dimensions.
872  {
873  wxPoint position;
874 
875  position.x = parseInt( aReader, line, &line );
876  position.y = parseInt( aReader, line, &line );
877  sheet->SetPosition( position );
878 
879  wxSize size;
880 
881  size.SetWidth( parseInt( aReader, line, &line ) );
882  size.SetHeight( parseInt( aReader, line, &line ) );
883  sheet->SetSize( size );
884  }
885  else if( strCompare( "U", line, &line ) ) // Sheet time stamp.
886  {
887  sheet->SetTimeStamp( parseHex( aReader, line ) );
888  }
889  else if( *line == 'F' ) // Sheet field.
890  {
891  line++;
892 
893  wxString text;
894  int size;
895  int fieldId = parseInt( aReader, line, &line );
896 
897  if( fieldId == 0 || fieldId == 1 ) // Sheet name and file name.
898  {
899  parseQuotedString( text, aReader, line, &line );
900  size = parseInt( aReader, line, &line );
901 
902  if( fieldId == 0 )
903  {
904  sheet->SetName( text );
905  sheet->SetSheetNameSize( size );
906  }
907  else
908  {
909  sheet->SetFileName( text );
910  sheet->SetFileNameSize( size );
911  }
912  }
913  else // Sheet pin.
914  {
915  std::unique_ptr< SCH_SHEET_PIN > sheetPin( new SCH_SHEET_PIN( sheet.get() ) );
916 
917  sheetPin->SetNumber( fieldId );
918 
919  // Can be empty fields.
920  parseQuotedString( text, aReader, line, &line, true );
921 
922  sheetPin->SetText( text );
923 
924  if( line == NULL )
925  THROW_IO_ERROR( _( "unexpected end of line" ) );
926 
927  switch( parseChar( aReader, line, &line ) )
928  {
929  case 'I':
930  sheetPin->SetShape( NET_INPUT );
931  break;
932 
933  case 'O':
934  sheetPin->SetShape( NET_OUTPUT );
935  break;
936 
937  case 'B':
938  sheetPin->SetShape( NET_BIDI );
939  break;
940 
941  case 'T':
942  sheetPin->SetShape( NET_TRISTATE );
943  break;
944 
945  case 'U':
946  sheetPin->SetShape( NET_UNSPECIFIED );
947  break;
948  default:
949  SCH_PARSE_ERROR( "invalid sheet pin type", aReader, line );
950  }
951 
952  switch( parseChar( aReader, line, &line ) )
953  {
954  case 'R': /* pin on right side */
955  sheetPin->SetEdge( SCH_SHEET_PIN::SHEET_RIGHT_SIDE );
956  break;
957 
958  case 'T': /* pin on top side */
959  sheetPin->SetEdge( SCH_SHEET_PIN::SHEET_TOP_SIDE );
960  break;
961 
962  case 'B': /* pin on bottom side */
963  sheetPin->SetEdge( SCH_SHEET_PIN::SHEET_BOTTOM_SIDE );
964  break;
965 
966  case 'L': /* pin on left side */
967  sheetPin->SetEdge( SCH_SHEET_PIN::SHEET_LEFT_SIDE );
968  break;
969  default:
970  SCH_PARSE_ERROR( "invalid sheet pin side", aReader, line );
971  }
972 
973  wxPoint position;
974 
975  position.x = parseInt( aReader, line, &line );
976  position.y = parseInt( aReader, line, &line );
977  sheetPin->SetPosition( position );
978 
979  size = parseInt( aReader, line, &line );
980 
981  sheetPin->SetTextSize( wxSize( size, size ) );
982 
983  sheet->AddPin( sheetPin.release() );
984  }
985  }
986  else if( strCompare( "$EndSheet", line ) )
987  return sheet.release();
988 
989  line = aReader.ReadLine();
990  }
991 
992  SCH_PARSE_ERROR( "missing '$EndSheet`", aReader, line );
993 
994  return NULL; // Prevents compiler warning. Should never get here.
995 }
char * ReadLine() override
Function ReadLine reads a line of text into the buffer and increments the line number counter...
Definition: richio.cpp:196
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Function parseInt.
static char parseChar(FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL)
Function parseChar.
time_t GetNewTimeStamp()
Definition: common.cpp:166
static unsigned long parseHex(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Function parseHex.
Class SCH_SHEET_PIN defines a sheet pin (label) used in sheets to create hierarchical schematics...
Definition: sch_sheet.h:62
Class SCH_SHEET is the sheet symbol placed in a schematic, and is the entry point for a sub schematic...
Definition: sch_sheet.h:216
#define SCH_PARSE_ERROR(text, reader, pos)
static void parseQuotedString(wxString &aString, FILE_LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken=NULL, bool aCanBeEmpty=false)
Function parseQuotedString.
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Function strCompare.
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
LIB_ALIAS * SCH_LEGACY_PLUGIN::LoadSymbol ( const wxString &  aLibraryPath,
const wxString &  aAliasName,
const PROPERTIES aProperties = NULL 
)
overridevirtual

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

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

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several symbols.
aAliasNameis the alias name of the LIB_PART to load.
aPropertiesis an associative array that can be used to tell the loader implementation to do something special, because it can take any number of additional named tuning arguments that the plugin is known to support. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Returns
the alias if found caller shares it or NULL if not found.
Exceptions
IO_ERRORif the library cannot be found or read. No exception is thrown in the case where aAliasName cannot be found.

Reimplemented from SCH_PLUGIN.

Definition at line 3480 of file sch_legacy_plugin.cpp.

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

3482 {
3483  LOCALE_IO toggle; // toggles on, then off, the C locale.
3484 
3485  m_props = aProperties;
3486 
3487  cacheLib( aLibraryPath );
3488 
3489  LIB_ALIAS_MAP::const_iterator it = m_cache->m_aliases.find( aAliasName );
3490 
3491  if( it == m_cache->m_aliases.end() )
3492  return NULL;
3493 
3494  return it->second;
3495 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
SCH_LEGACY_PLUGIN_CACHE * m_cache
void cacheLib(const wxString &aLibraryFileName)
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
SCH_TEXT * SCH_LEGACY_PLUGIN::loadText ( FILE_LINE_READER aReader)
private

Definition at line 1200 of file sch_legacy_plugin.cpp.

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

Referenced by loadFile().

1201 {
1202  const char* line = aReader.Line();
1203 
1204  wxCHECK( strCompare( "Text", line, &line ), NULL );
1205 
1206  std::unique_ptr< SCH_TEXT> text;
1207 
1208  if( strCompare( "Notes", line, &line ) )
1209  text.reset( new SCH_TEXT );
1210  else if( strCompare( "Label", line, &line ) )
1211  text.reset( new SCH_LABEL );
1212  else if( strCompare( "HLabel", line, &line ) )
1213  text.reset( new SCH_HIERLABEL );
1214  else if( strCompare( "GLabel", line, &line ) )
1215  {
1216  // Prior to version 2, the SCH_GLOBALLABEL object did not exist.
1217  if( m_version == 1 )
1218  text.reset( new SCH_HIERLABEL );
1219  else
1220  text.reset( new SCH_GLOBALLABEL );
1221  }
1222  else
1223  SCH_PARSE_ERROR( "unknown Text type", aReader, line );
1224 
1225  // Parse the parameters common to all text objects.
1226  wxPoint position;
1227 
1228  position.x = parseInt( aReader, line, &line );
1229  position.y = parseInt( aReader, line, &line );
1230  text->SetPosition( position );
1231  text->SetLabelSpinStyle( parseInt( aReader, line, &line ) );
1232 
1233  int size = parseInt( aReader, line, &line );
1234 
1235  text->SetTextSize( wxSize( size, size ) );
1236 
1237  // Parse the global and hierarchical label type.
1238  if( text->Type() == SCH_HIERARCHICAL_LABEL_T || text->Type() == SCH_GLOBAL_LABEL_T )
1239  {
1240  if( strCompare( SheetLabelType[NET_INPUT], line, &line ) )
1241  text->SetShape( NET_INPUT );
1242  else if( strCompare( SheetLabelType[NET_OUTPUT], line, &line ) )
1243  text->SetShape( NET_OUTPUT );
1244  else if( strCompare( SheetLabelType[NET_BIDI], line, &line ) )
1245  text->SetShape( NET_BIDI );
1246  else if( strCompare( SheetLabelType[NET_TRISTATE], line, &line ) )
1247  text->SetShape( NET_TRISTATE );
1248  else if( strCompare( SheetLabelType[NET_UNSPECIFIED], line, &line ) )
1249  text->SetShape( NET_UNSPECIFIED );
1250  else
1251  SCH_PARSE_ERROR( "invalid label type", aReader, line );
1252  }
1253 
1254  int thickness = 0;
1255 
1256  // The following tokens do not exist in version 1 schematic files.
1257  if( m_version > 1 )
1258  {
1259  if( strCompare( "Italic", line, &line ) )
1260  text->SetItalic( true );
1261  else if( !strCompare( "~", line, &line ) )
1262  SCH_PARSE_ERROR( _( "expected 'Italics' or '~'" ), aReader, line );
1263 
1264  // The thickness token does not exist in older versions of the schematic file format
1265  // so calling parseInt will be made only if the EOL is not reached.
1266  if( *line >= ' ' )
1267  thickness = parseInt( aReader, line, &line );
1268  }
1269 
1270  text->SetBold( thickness != 0 );
1271  text->SetThickness( thickness != 0 ? GetPenSizeForBold( size ) : 0 );
1272 
1273  // Read the text string for the text.
1274  char* tmp = aReader.ReadLine();
1275 
1276  tmp = strtok( tmp, "\r\n" );
1277  wxString val = FROM_UTF8( tmp );
1278 
1279  for( ; ; )
1280  {
1281  int i = val.find( wxT( "\\n" ) );
1282 
1283  if( i == wxNOT_FOUND )
1284  break;
1285 
1286  val.erase( i, 2 );
1287  val.insert( i, wxT( "\n" ) );
1288  }
1289 
1290  text->SetText( val );
1291 
1292  return text.release();
1293 }
char * ReadLine() override
Function ReadLine reads a line of text into the buffer and increments the line number counter...
Definition: richio.cpp:196
static wxString FROM_UTF8(const char *cstring)
function FROM_UTF8 converts a UTF8 encoded C string to a wxString for all wxWidgets build modes...
Definition: macros.h:53
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Function parseInt.
const char * SheetLabelType[]
Definition: sch_text.cpp:57
int m_version
Version of file being loaded.
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
int GetPenSizeForBold(int aTextSize)
Function GetPensizeForBold.
Definition: drawtxt.cpp:49
#define SCH_PARSE_ERROR(text, reader, pos)
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Function strCompare.
SCH_LINE * SCH_LEGACY_PLUGIN::loadWire ( FILE_LINE_READER aReader)
private

Definition at line 1119 of file sch_legacy_plugin.cpp.

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

Referenced by loadFile().

1120 {
1121  std::unique_ptr< SCH_LINE > wire( new SCH_LINE );
1122 
1123  const char* line = aReader.Line();
1124 
1125  wxCHECK( strCompare( "Wire", line, &line ), NULL );
1126 
1127  if( strCompare( "Wire", line, &line ) )
1128  wire->SetLayer( LAYER_WIRE );
1129  else if( strCompare( "Bus", line, &line ) )
1130  wire->SetLayer( LAYER_BUS );
1131  else if( strCompare( "Notes", line, &line ) )
1132  wire->SetLayer( LAYER_NOTES );
1133  else
1134  SCH_PARSE_ERROR( "invalid line type", aReader, line );
1135 
1136  if( !strCompare( "Line", line, &line ) )
1137  SCH_PARSE_ERROR( "invalid wire definition", aReader, line );
1138 
1139  line = aReader.ReadLine();
1140 
1141  wxPoint begin, end;
1142 
1143  begin.x = parseInt( aReader, line, &line );
1144  begin.y = parseInt( aReader, line, &line );
1145  end.x = parseInt( aReader, line, &line );
1146  end.y = parseInt( aReader, line, &line );
1147 
1148  wire->SetStartPoint( begin );
1149  wire->SetEndPoint( end );
1150 
1151  return wire.release();
1152 }
char * ReadLine() override
Function ReadLine reads a line of text into the buffer and increments the line number counter...
Definition: richio.cpp:196
static int parseInt(FILE_LINE_READER &aReader, const char *aLine, const char **aOutput=NULL)
Function parseInt.
char * Line() const
Function Line returns a pointer to the last line that was read in.
Definition: richio.h:139
#define SCH_PARSE_ERROR(text, reader, pos)
Class SCH_LINE is a segment description base class to describe items which have 2 end points (track...
Definition: sch_line.h:42
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Function strCompare.
void SCH_LEGACY_PLUGIN::Save ( const wxString &  aFileName,
SCH_SCREEN aSchematic,
KIWAY aKiway,
const PROPERTIES aProperties = NULL 
)
overridevirtual

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

Parameters
aFileNameis the name of a file to save to on disk.
aSchematicis the class SCH_SCREEN in memory document tree from which to extract information when writing to aFileName. The caller continues to own the SCHEMATIC, and the plugin should refrain from modifying the SCHEMATIC if possible.
aKiwayis the KIWAY object used to access the component libraries loaded by the project.
aPropertiesis an associative array that can be used to tell the saver how to save the file, because it can take any number of additional named tuning arguments that the plugin is known to support. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL.
Exceptions
IO_ERRORif there is a problem saving or exporting.

Reimplemented from SCH_PLUGIN.

Definition at line 1565 of file sch_legacy_plugin.cpp.

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

1567 {
1568  wxCHECK_RET( aScreen != NULL, "NULL SCH_SCREEN object." );
1569  wxCHECK_RET( !aFileName.IsEmpty(), "No schematic file name defined." );
1570 
1571  init( aKiway, aProperties );
1572 
1573  wxFileName fn = aFileName;
1574 
1575  // File names should be absolute. Don't assume everything relative to the project path
1576  // works properly.
1577  wxASSERT( fn.IsAbsolute() );
1578 
1579  FILE_OUTPUTFORMATTER formatter( fn.GetFullPath() );
1580 
1581  m_out = &formatter; // no ownership
1582 
1583  Format( aScreen );
1584 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
void Format(SCH_SCREEN *aScreen)
void init(KIWAY *aKiway, const PROPERTIES *aProperties=NULL)
initialize PLUGIN like a constructor would.
Class FILE_OUTPUTFORMATTER may be used for text file output.
Definition: richio.h:492
void SCH_LEGACY_PLUGIN::saveBitmap ( SCH_BITMAP aBitmap)
private

Definition at line 1805 of file sch_legacy_plugin.cpp.

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

Referenced by Format().

1806 {
1807  wxCHECK_RET( aBitmap != NULL, "SCH_BITMAP* is NULL" );
1808 
1809  wxImage* image = aBitmap->GetImage()->GetImageData();
1810 
1811  wxCHECK_RET( image != NULL, "wxImage* is NULL" );
1812 
1813  m_out->Print( 0, "$Bitmap\n" );
1814  m_out->Print( 0, "Pos %-4d %-4d\n", aBitmap->GetPosition().x, aBitmap->GetPosition().y );
1815  m_out->Print( 0, "Scale %f\n", aBitmap->GetImage()->GetScale() );
1816  m_out->Print( 0, "Data\n" );
1817 
1818  wxMemoryOutputStream stream;
1819 
1820  image->SaveFile( stream, wxBITMAP_TYPE_PNG );
1821 
1822  // Write binary data in hexadecimal form (ASCII)
1823  wxStreamBuffer* buffer = stream.GetOutputStreamBuffer();
1824  char* begin = (char*) buffer->GetBufferStart();
1825 
1826  for( int ii = 0; begin < buffer->GetBufferEnd(); begin++, ii++ )
1827  {
1828  if( ii >= 32 )
1829  {
1830  ii = 0;
1831 
1832  m_out->Print( 0, "\n" );
1833  }
1834 
1835  m_out->Print( 0, "%2.2X ", *begin & 0xFF );
1836  }
1837 
1838  m_out->Print( 0, "\nEndData\n" );
1839  m_out->Print( 0, "$EndBitmap\n" );
1840 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
wxImage * GetImageData()
wxPoint GetPosition() const override
Function GetPosition.
Definition: sch_bitmap.h:135
BITMAP_BASE * GetImage()
Definition: sch_bitmap.h:61
double GetScale() const
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:408
void SCH_LEGACY_PLUGIN::saveBusEntry ( SCH_BUS_ENTRY_BASE aBusEntry)
private

Definition at line 1936 of file sch_legacy_plugin.cpp.

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

Referenced by Format().

1937 {
1938  wxCHECK_RET( aBusEntry != NULL, "SCH_BUS_ENTRY_BASE* is NULL" );
1939 
1940  if( aBusEntry->GetLayer() == LAYER_WIRE )
1941  m_out->Print( 0, "Entry Wire Line\n\t%-4d %-4d %-4d %-4d\n",
1942  aBusEntry->GetPosition().x, aBusEntry->GetPosition().y,
1943  aBusEntry->m_End().x, aBusEntry->m_End().y );
1944  else
1945  m_out->Print( 0, "Entry Bus Bus\n\t%-4d %-4d %-4d %-4d\n",
1946  aBusEntry->GetPosition().x, aBusEntry->GetPosition().y,
1947  aBusEntry->m_End().x, aBusEntry->m_End().y );
1948 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
SCH_LAYER_ID GetLayer() const
Function GetLayer returns the layer this item is on.
wxPoint m_End() const
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:408
wxPoint GetPosition() const override
Function GetPosition.
void SCH_LEGACY_PLUGIN::saveComponent ( SCH_COMPONENT aComponent)
private

Definition at line 1668 of file sch_legacy_plugin.cpp.

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

Referenced by Format().

1669 {
1670  std::string name1;
1671  std::string name2;
1672  wxArrayString reference_fields;
1673 
1674  static wxString delimiters( wxT( " " ) );
1675 
1676  // This is redundant with the AR entries below, but it makes the files backwards-compatible.
1677  if( aComponent->GetPathsAndReferences().GetCount() > 0 )
1678  {
1679  reference_fields = wxStringTokenize( aComponent->GetPathsAndReferences()[0], delimiters );
1680  name1 = toUTFTildaText( reference_fields[1] );
1681  }
1682  else
1683  {
1684  if( aComponent->GetField( REFERENCE )->GetText().IsEmpty() )
1685  name1 = toUTFTildaText( aComponent->GetPrefix() );
1686  else
1687  name1 = toUTFTildaText( aComponent->GetField( REFERENCE )->GetText() );
1688  }
1689 
1690  wxString part_name = aComponent->GetLibId().GetLibItemName();
1691 
1692  if( part_name.size() )
1693  {
1694  name2 = toUTFTildaText( part_name );
1695  }
1696  else
1697  {
1698  name2 = "_NONAME_";
1699  }
1700 
1701  m_out->Print( 0, "$Comp\n" );
1702  m_out->Print( 0, "L %s %s\n", name2.c_str(), name1.c_str() );
1703 
1704  // Generate unit number, convert and time stamp
1705  m_out->Print( 0, "U %d %d %8.8lX\n", aComponent->GetUnit(), aComponent->GetConvert(),
1706  (unsigned long)aComponent->GetTimeStamp() );
1707 
1708  // Save the position
1709  m_out->Print( 0, "P %d %d\n", aComponent->GetPosition().x, aComponent->GetPosition().y );
1710 
1711  /* If this is a complex hierarchy; save hierarchical references.
1712  * but for simple hierarchies it is not necessary.
1713  * the reference inf is already saved
1714  * this is useful for old Eeschema version compatibility
1715  */
1716  if( aComponent->GetPathsAndReferences().GetCount() > 1 )
1717  {
1718  for( unsigned int ii = 0; ii < aComponent->GetPathsAndReferences().GetCount(); ii++ )
1719  {
1720  /*format:
1721  * AR Path="/140/2" Ref="C99" Part="1"
1722  * where 140 is the uid of the containing sheet
1723  * and 2 is the timestamp of this component.
1724  * (timestamps are actually 8 hex chars)
1725  * Ref is the conventional component reference for this 'path'
1726  * Part is the conventional component part selection for this 'path'
1727  */
1728  reference_fields = wxStringTokenize( aComponent->GetPathsAndReferences()[ii],
1729  delimiters );
1730 
1731  m_out->Print( 0, "AR Path=\"%s\" Ref=\"%s\" Part=\"%s\" \n",
1732  TO_UTF8( reference_fields[0] ),
1733  TO_UTF8( reference_fields[1] ),
1734  TO_UTF8( reference_fields[2] ) );
1735  }
1736  }
1737 
1738  // update the ugly field index, which I would like to see go away someday soon.
1739  for( int i = 0; i < aComponent->GetFieldCount(); ++i )
1740  aComponent->GetField( i )->SetId( i );
1741 
1742  // Fixed fields:
1743  // Save mandatory fields even if they are blank,
1744  // because the visibility, size and orientation are set from libary editor.
1745  for( unsigned i = 0; i < MANDATORY_FIELDS; ++i )
1746  saveField( aComponent->GetField( i ) );
1747 
1748  // User defined fields:
1749  // The *policy* about which user defined fields are part of a symbol is now
1750  // only in the dialog editors. No policy should be enforced here, simply
1751  // save all the user defined fields, they are present because a dialog editor
1752  // thought they should be. If you disagree, go fix the dialog editors.
1753  for( int i = MANDATORY_FIELDS; i < aComponent->GetFieldCount(); ++i )
1754  saveField( aComponent->GetField( i ) );
1755 
1756  // Unit number, position, box ( old standard )
1757  m_out->Print( 0, "\t%-4d %-4d %-4d\n", aComponent->GetUnit(), aComponent->GetPosition().x,
1758  aComponent->GetPosition().y );
1759 
1760  TRANSFORM transform = aComponent->GetTransform();
1761 
1762  m_out->Print( 0, "\t%-4d %-4d %-4d %-4d\n",
1763  transform.x1, transform.y1, transform.x2, transform.y2 );
1764  m_out->Print( 0, "$EndComp\n" );
1765 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
TRANSFORM & GetTransform() const
int y2
Definition: transform.h:51
The first 4 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors...
wxString GetPrefix() const
int x2
Definition: transform.h:50
int x1
Definition: transform.h:48
Field Reference of part, i.e. "IC21".
void saveField(SCH_FIELD *aField)
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes...
Definition: macros.h:47
int GetConvert() const
int y1
Definition: transform.h:49
Class for tranforming drawing coordinates for a wxDC device context.
Definition: transform.h:45
SCH_FIELD * GetField(int aFieldNdx) const
Returns a field in this symbol.
const UTF8 & GetLibItemName() const
Function GetLibItemName.
Definition: lib_id.h:129
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:130
const wxArrayString & GetPathsAndReferences() const
std::string toUTFTildaText(const wxString &txt)
Function toUTFTildaText convert a wxString to UTF8 and replace any control characters with a ~...
int GetUnit() const
time_t GetTimeStamp() const
Definition: base_struct.h:218
int GetFieldCount() const
Return the number of fields in this symbol.
wxPoint GetPosition() const override
Function GetPosition.
const LIB_ID & GetLibId() const
void SetId(int aId)
Definition: sch_field.h:89
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:408
void SCH_LEGACY_PLUGIN::saveField ( SCH_FIELD aField)
private

Definition at line 1768 of file sch_legacy_plugin.cpp.

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

Referenced by saveComponent().

1769 {
1770  char hjustify = 'C';
1771 
1772  if( aField->GetHorizJustify() == GR_TEXT_HJUSTIFY_LEFT )
1773  hjustify = 'L';
1774  else if( aField->GetHorizJustify() == GR_TEXT_HJUSTIFY_RIGHT )
1775  hjustify = 'R';
1776 
1777  char vjustify = 'C';
1778 
1779  if( aField->GetVertJustify() == GR_TEXT_VJUSTIFY_BOTTOM )
1780  vjustify = 'B';
1781  else if( aField->GetVertJustify() == GR_TEXT_VJUSTIFY_TOP )
1782  vjustify = 'T';
1783 
1784  m_out->Print( 0, "F %d %s %c %-3d %-3d %-3d %4.4X %c %c%c%c",
1785  aField->GetId(),
1786  EscapedUTF8( aField->GetText() ).c_str(), // wraps in quotes too
1787  aField->GetTextAngle() == TEXT_ANGLE_HORIZ ? 'H' : 'V',
1788  aField->GetLibPosition().x, aField->GetLibPosition().y,
1789  aField->GetTextWidth(),
1790  !aField->IsVisible(),
1791  hjustify, vjustify,
1792  aField->IsItalic() ? 'I' : 'N',
1793  aField->IsBold() ? 'B' : 'N' );
1794 
1795  // Save field name, if the name is user definable
1796  if( aField->GetId() >= FIELD1 )
1797  {
1798  m_out->Print( 0, " %s", EscapedUTF8( aField->GetName() ).c_str() );
1799  }
1800 
1801  m_out->Print( 0, "\n" );
1802 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
#define TEXT_ANGLE_HORIZ
Frequent text rotations, used with {Set,Get}TextAngle(), in 0.1 degrees for now, hoping to migrate to...
Definition: common.h:91
wxString GetName(bool aUseDefaultName=true) const
Function GetName returns the field name.
Definition: sch_field.cpp:473
bool IsItalic() const
Definition: eda_text.h:170
int GetId() const
Definition: sch_field.h:87
int GetTextWidth() const
Definition: eda_text.h:218
wxPoint GetLibPosition() const
Definition: sch_field.h:189
EDA_TEXT_HJUSTIFY_T GetHorizJustify() const
Definition: eda_text.h:190
bool IsBold() const
Definition: eda_text.h:173
double GetTextAngle() const
Definition: eda_text.h:164
std::string EscapedUTF8(const wxString &aString)
Function EscapedUTF8 returns an 8 bit UTF8 string given aString in unicode form.
Definition: string.cpp:137
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:130
EDA_TEXT_VJUSTIFY_T GetVertJustify() const
Definition: eda_text.h:191
bool IsVisible() const
Definition: eda_text.h:176
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:408
void SCH_LEGACY_PLUGIN::saveJunction ( SCH_JUNCTION aJunction)
private

Definition at line 1918 of file sch_legacy_plugin.cpp.

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

Referenced by Format().

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

Reimplemented from SCH_PLUGIN.

Definition at line 3588 of file sch_legacy_plugin.cpp.

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().

3589 {
3590  if( !m_cache )
3591  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryPath );
3592 
3593  wxString oldFileName = m_cache->GetFileName();
3594 
3595  if( !m_cache->IsFile( aLibraryPath ) )
3596  {
3597  m_cache->SetFileName( aLibraryPath );
3598  }
3599 
3600  // This is a forced save.
3601  m_cache->SetModified();
3602  m_cache->Save( writeDocFile( aProperties ) );
3603  m_cache->SetFileName( oldFileName );
3604 }
SCH_LEGACY_PLUGIN_CACHE * m_cache
Class SCH_LEGACY_PLUGIN_CACHE is a cache assistant for the part library portion of the SCH_PLUGIN API...
wxString GetFileName() const
void SetModified(bool aModified=true)
void SetFileName(const wxString &aFileName)
bool IsFile(const wxString &aFullPathAndFileName) const
void Save(bool aSaveDocFile=true)
Save the entire library to file m_libFileName;.
bool writeDocFile(const PROPERTIES *aProperties)
void SCH_LEGACY_PLUGIN::saveLine ( SCH_LINE aLine)
private

Definition at line 1951 of file sch_legacy_plugin.cpp.

References SCH_LINE::GetEndPoint(), SCH_ITEM::GetLayer(), SCH_LINE::GetStartPoint(), LAYER_BUS, LAYER_WIRE, m_out, OUTPUTFORMATTER::Print(), wxPoint::x, and wxPoint::y.

Referenced by Format().

1952 {
1953  wxCHECK_RET( aLine != NULL, "SCH_LINE* is NULL" );
1954 
1955  const char* layer = "Notes";
1956  const char* width = "Line";
1957 
1958  if( aLine->GetLayer() == LAYER_WIRE )
1959  layer = "Wire";
1960  else if( aLine->GetLayer() == LAYER_BUS )
1961  layer = "Bus";
1962 
1963  m_out->Print( 0, "Wire %s %s\n", layer, width );
1964  m_out->Print( 0, "\t%-4d %-4d %-4d %-4d\n", aLine->GetStartPoint().x, aLine->GetStartPoint().y,
1965  aLine->GetEndPoint().x, aLine->GetEndPoint().y );
1966 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
wxPoint GetEndPoint() const
Definition: sch_line.h:75
SCH_LAYER_ID GetLayer() const
Function GetLayer returns the layer this item is on.
wxPoint GetStartPoint() const
Definition: sch_line.h:71
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:408
void SCH_LEGACY_PLUGIN::saveNoConnect ( SCH_NO_CONNECT aNoConnect)
private

Definition at line 1927 of file sch_legacy_plugin.cpp.

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

Referenced by Format().

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

Definition at line 1843 of file sch_legacy_plugin.cpp.

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

Referenced by Format().

1844 {
1845  wxCHECK_RET( aSheet != NULL, "SCH_SHEET* is NULL" );
1846 
1847  m_out->Print( 0, "$Sheet\n" );
1848  m_out->Print( 0, "S %-4d %-4d %-4d %-4d\n",
1849  aSheet->GetPosition().x, aSheet->GetPosition().y,
1850  aSheet->GetSize().x, aSheet->GetSize().y );
1851 
1852  m_out->Print( 0, "U %8.8lX\n", (unsigned long) aSheet->GetTimeStamp() );
1853 
1854  if( !aSheet->GetName().IsEmpty() )
1855  m_out->Print( 0, "F0 %s %d\n", EscapedUTF8( aSheet->GetName() ).c_str(),
1856  aSheet->GetSheetNameSize() );
1857 
1858  if( !aSheet->GetFileName().IsEmpty() )
1859  m_out->Print( 0, "F1 %s %d\n", EscapedUTF8( aSheet->GetFileName() ).c_str(),
1860  aSheet->GetFileNameSize() );
1861 
1862  for( const SCH_SHEET_PIN& pin : aSheet->GetPins() )
1863  {
1864  int type, side;
1865 
1866  if( pin.GetText().IsEmpty() )
1867  break;
1868 
1869  switch( pin.GetEdge() )
1870  {
1871  default:
1873  side = 'L';
1874  break;
1875 
1877  side = 'R';
1878  break;
1879 
1881  side = 'T';
1882  break;
1883 
1885  side = 'B';
1886  break;
1887  }
1888 
1889  switch( pin.GetShape() )
1890  {
1891  case NET_INPUT:
1892  type = 'I'; break;
1893 
1894  case NET_OUTPUT:
1895  type = 'O'; break;
1896 
1897  case NET_BIDI:
1898  type = 'B'; break;
1899 
1900  case NET_TRISTATE:
1901  type = 'T'; break;
1902 
1903  default:
1904  case NET_UNSPECIFIED:
1905  type = 'U'; break;
1906  }
1907 
1908  m_out->Print( 0, "F%d %s %c %c %-3d %-3d %-3d\n", pin.GetNumber(),
1909  EscapedUTF8( pin.GetText() ).c_str(), // supplies wrapping quotes
1910  type, side, pin.GetPosition().x, pin.GetPosition().y,
1911  pin.GetTextWidth() );
1912  }
1913 
1914  m_out->Print( 0, "$EndSheet\n" );
1915 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
SCH_SHEET_PINS & GetPins()
Definition: sch_sheet.h:348
int GetSheetNameSize() const
Definition: sch_sheet.h:278
std::string EscapedUTF8(const wxString &aString)
Function EscapedUTF8 returns an 8 bit UTF8 string given aString in unicode form.
Definition: string.cpp:137
int GetFileNameSize() const
Definition: sch_sheet.h:282
Class SCH_SHEET_PIN defines a sheet pin (label) used in sheets to create hierarchical schematics...
Definition: sch_sheet.h:62
wxPoint GetPosition() const override
Function GetPosition.
Definition: sch_sheet.h:582
wxString GetFileName(void) const
Function GetFileName return the filename corresponding to this sheet.
Definition: sch_sheet.cpp:880
time_t GetTimeStamp() const
Definition: base_struct.h:218
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:408
wxString GetName() const
Definition: sch_sheet.h:274
wxSize GetSize()
Definition: sch_sheet.h:288
void SCH_LEGACY_PLUGIN::SaveSymbol ( const wxString &  aLibraryPath,
const LIB_PART aSymbol,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Write aSymbol to an existing library located at aLibraryPath.

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

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

Reimplemented from SCH_PLUGIN.

Definition at line 3498 of file sch_legacy_plugin.cpp.

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

3500 {
3501  m_props = aProperties;
3502 
3503  cacheLib( aLibraryPath );
3504 
3505  m_cache->AddSymbol( aSymbol );
3506 
3507  if( !isBuffering( aProperties ) )
3508  m_cache->Save( writeDocFile( aProperties ) );
3509 }
SCH_LEGACY_PLUGIN_CACHE * m_cache
bool isBuffering(const PROPERTIES *aProperties)
void cacheLib(const wxString &aLibraryFileName)
void Save(bool aSaveDocFile=true)
Save the entire library to file m_libFileName;.
void AddSymbol(const LIB_PART *aPart)
bool writeDocFile(const PROPERTIES *aProperties)
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
void SCH_LEGACY_PLUGIN::saveText ( SCH_TEXT aText)
private

Definition at line 1969 of file sch_legacy_plugin.cpp.

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

Referenced by Format().

1970 {
1971  wxCHECK_RET( aText != NULL, "SCH_TEXT* is NULL" );
1972 
1973  const char* italics = "~";
1974  const char* textType = "Notes";
1975 
1976  if( aText->IsItalic() )
1977  italics = "Italic";
1978 
1979  wxString text = aText->GetText();
1980 
1981  SCH_LAYER_ID layer = aText->GetLayer();
1982 
1983  if( layer == LAYER_NOTES || layer == LAYER_LOCLABEL )
1984  {
1985  if( layer == LAYER_NOTES )
1986  {
1987  // For compatibility reasons, the text must be saved in only one text line
1988  // so replace all EOLs with \\n
1989  text.Replace( wxT( "\n" ), wxT( "\\n" ) );
1990 
1991  // Here we should have no CR or LF character in line
1992  // This is not always the case if a multiline text was copied (using a copy/paste
1993  // function) from a text that uses E.O.L characters that differs from the current
1994  // EOL format. This is mainly the case under Linux using LF symbol when copying
1995  // a text from Windows (using CRLF symbol) so we must just remove the extra CR left
1996  // (or LF left under MacOSX)
1997  for( unsigned ii = 0; ii < text.Len(); )
1998  {
1999  if( text[ii] == 0x0A || text[ii] == 0x0D )
2000  text.erase( ii, 1 );
2001  else
2002  ii++;
2003  }
2004  }
2005  else
2006  {
2007  textType = "Label";
2008  }
2009 
2010  m_out->Print( 0, "Text %s %-4d %-4d %-4d %-4d %s %d\n%s\n", textType,
2011  aText->GetPosition().x, aText->GetPosition().y,
2012  aText->GetLabelSpinStyle(),
2013  aText->GetTextWidth(),
2014  italics, aText->GetThickness(), TO_UTF8( text ) );
2015  }
2016  else if( layer == LAYER_GLOBLABEL || layer == LAYER_HIERLABEL )
2017  {
2018  textType = ( layer == LAYER_GLOBLABEL ) ? "GLabel" : "HLabel";
2019 
2020  m_out->Print( 0, "Text %s %-4d %-4d %-4d %-4d %s %s %d\n%s\n", textType,
2021  aText->GetPosition().x, aText->GetPosition().y,
2022  aText->GetLabelSpinStyle(),
2023  aText->GetTextWidth(),
2024  SheetLabelType[aText->GetShape()],
2025  italics,
2026  aText->GetThickness(), TO_UTF8( text ) );
2027  }
2028 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
PINSHEETLABEL_SHAPE GetShape() const
Definition: sch_text.h:121
bool IsItalic() const
Definition: eda_text.h:170
int GetTextWidth() const
Definition: eda_text.h:218
int GetLabelSpinStyle() const
Definition: sch_text.h:119
SCH_LAYER_ID GetLayer() const
Function GetLayer returns the layer this item is on.
const char * SheetLabelType[]
Definition: sch_text.cpp:57
int GetThickness() const
Function GetThickness returns pen width.
Definition: eda_text.h:154
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes...
Definition: macros.h:47
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:130
SCH_LAYER_ID
Eeschema drawing layers.
virtual wxPoint GetPosition() const override
Function GetPosition.
Definition: sch_text.h:200
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Function Print formats and writes text to the output stream.
Definition: richio.cpp:408
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 157 of file sch_plugin.cpp.

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

Definition at line 3406 of file sch_legacy_plugin.cpp.

References PropNoDocFile.

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

3407 {
3408  std::string propName( SCH_LEGACY_PLUGIN::PropNoDocFile );
3409 
3410  if( aProperties && aProperties->find( propName ) != aProperties->end() )
3411  return false;
3412 
3413  return true;
3414 }
static const char * PropNoDocFile
const char* PropBuffering

Member Data Documentation

wxString SCH_LEGACY_PLUGIN::m_error
protected

For throwing exceptions.

Definition at line 157 of file sch_legacy_plugin.h.

Referenced by loadHeader().

KIWAY* SCH_LEGACY_PLUGIN::m_kiway
protected

Required for path to legacy component libraries.

Definition at line 160 of file sch_legacy_plugin.h.

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

FILE_OUTPUTFORMATTER* SCH_LEGACY_PLUGIN::m_out
protected

The output formatter for saving SCH_SCREEN objects.

Definition at line 162 of file sch_legacy_plugin.h.

Referenced by Format(), init(), Save(), saveBitmap(), saveBusEntry(), saveComponent(), saveField(), saveJunction(), saveLine(), saveNoConnect(), saveSheet(), and saveText().

wxString SCH_LEGACY_PLUGIN::m_path
protected

Root project path for loading child sheets.

Definition at line 158 of file sch_legacy_plugin.h.

Referenced by Load(), and loadHierarchy().

const PROPERTIES* SCH_LEGACY_PLUGIN::m_props
protected

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

Definition at line 159 of file sch_legacy_plugin.h.

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

SCH_SHEET* SCH_LEGACY_PLUGIN::m_rootSheet
protected

The root sheet of the schematic being loaded..

Definition at line 161 of file sch_legacy_plugin.h.

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

int SCH_LEGACY_PLUGIN::m_version
protected

Version of file being loaded.

Definition at line 156 of file sch_legacy_plugin.h.

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

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

const char* PropBuffering

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

Definition at line 85 of file sch_legacy_plugin.h.

Referenced by PART_LIB::EnableBuffering(), isBuffering(), and PART_LIB::IsBuffering().

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

const char* PropBuffering

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

Definition at line 93 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: