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
 Function GetName returns a brief hard coded name for this SCH_PLUGIN. More...
 
const wxString GetFileExtension () const override
 Function GetFileExtension returns the file extension for the SCH_PLUGIN. More...
 
int GetModifyHash () const override
 Function GetModifyHash. More...
 
SCH_SHEETLoad (const wxString &aFileName, KIWAY *aKiway, SCH_SHEET *aAppendToMe=NULL, const PROPERTIES *aProperties=NULL) override
 Function Load. More...
 
void Save (const wxString &aFileName, SCH_SCREEN *aScreen, KIWAY *aKiway, const PROPERTIES *aProperties=NULL) override
 Function Save. 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
 Function EnumerateSymbolLib. More...
 
void EnumerateSymbolLib (std::vector< LIB_ALIAS * > &aAliasList, const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 Function EnumerateSymbolLib. More...
 
LIB_ALIASLoadSymbol (const wxString &aLibraryPath, const wxString &aAliasName, const PROPERTIES *aProperties=NULL) override
 Function LoadSymbol. More...
 
void SaveSymbol (const wxString &aLibraryPath, const LIB_PART *aSymbol, const PROPERTIES *aProperties=NULL) override
 Function SaveSymbol. More...
 
void DeleteAlias (const wxString &aLibraryPath, const wxString &aAliasName, const PROPERTIES *aProperties=NULL) override
 Function DeleteAlias. More...
 
void DeleteSymbol (const wxString &aLibraryPath, const wxString &aAliasName, const PROPERTIES *aProperties=NULL) override
 Function DeleteSymbol. More...
 
void CreateSymbolLib (const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 Function CreateSymbolLib. More...
 
bool DeleteSymbolLib (const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 Function DeleteSymbolLib. More...
 
void SaveLibrary (const wxString &aLibraryPath, const PROPERTIES *aProperties=NULL) override
 
virtual bool IsSymbolLibWritable (const wxString &aLibraryPath)
 Function IsSymbolLibWritable returns true if the library at aLibraryPath is writable. More...
 
virtual void SymbolLibOptions (PROPERTIES *aListToAppendTo) const
 Function SymbolLibOptions. 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 548 of file sch_legacy_plugin.cpp.

References init().

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

Definition at line 554 of file sch_legacy_plugin.cpp.

References m_cache.

555 {
556  delete m_cache;
557 }
SCH_LEGACY_PLUGIN_CACHE * m_cache

Member Function Documentation

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

Definition at line 3368 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, and m_props.

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

3369 {
3370  if( !m_cache || !m_cache->IsFile( aLibraryFileName ) || m_cache->IsFileChanged() )
3371  {
3372  // a spectacular episode in memory management:
3373  delete m_cache;
3374  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryFileName );
3375 
3376  if( !isBuffering( m_props ) )
3377  m_cache->Load();
3378  }
3379 }
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

Function CreateSymbolLib.

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

3518 {
3519  if( wxFileExists( aLibraryPath ) )
3520  {
3522  _( "symbol library '%s' already exists, cannot create a new library" ),
3523  aLibraryPath.GetData() ) );
3524  }
3525 
3526  LOCALE_IO toggle;
3527 
3528  m_props = aProperties;
3529 
3530  delete m_cache;
3531  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryPath );
3532  m_cache->SetModified();
3533  m_cache->Save( writeDocFile( aProperties ) );
3534  m_cache->Load(); // update m_writable and m_mod_time
3535 }
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...
#define THROW_IO_ERROR(x)
Definition: utf8.cpp:60
void SetModified(bool aModified=true)
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
void Save(bool aSaveDocFile=true)
Save the entire library to file m_libFileName;.
bool writeDocFile(const PROPERTIES *aProperties)
const PROPERTIES * m_props
Passed via Save() or Load(), no ownership, may be NULL.
void SCH_LEGACY_PLUGIN::DeleteAlias ( const wxString &  aLibraryPath,
const wxString &  aAliasName,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Function DeleteAlias.

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

3490 {
3491  m_props = aProperties;
3492 
3493  cacheLib( aLibraryPath );
3494 
3495  m_cache->DeleteAlias( aAliasName );
3496 
3497  if( !isBuffering( aProperties ) )
3498  m_cache->Save( writeDocFile( aProperties ) );
3499 }
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

Function DeleteSymbol.

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

3504 {
3505  m_props = aProperties;
3506 
3507  cacheLib( aLibraryPath );
3508 
3509  m_cache->DeleteSymbol( aAliasName );
3510 
3511  if( !isBuffering( aProperties ) )
3512  m_cache->Save( writeDocFile( aProperties ) );
3513 }
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

Function DeleteSymbolLib.

deletes 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
bool - true if library deleted, false if library did not exist.
Exceptions
IO_ERRORif there is a problem deleting an existing library.

Reimplemented from SCH_PLUGIN.

Definition at line 3538 of file sch_legacy_plugin.cpp.

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

3540 {
3541  wxFileName fn = aLibraryPath;
3542 
3543  if( !fn.FileExists() )
3544  return false;
3545 
3546  // Some of the more elaborate wxRemoveFile() crap puts up its own wxLog dialog
3547  // we don't want that. we want bare metal portability with no UI here.
3548  if( wxRemove( aLibraryPath ) )
3549  {
3550  THROW_IO_ERROR( wxString::Format( _( "library '%s' cannot be deleted" ),
3551  aLibraryPath.GetData() ) );
3552  }
3553 
3554  if( m_cache && m_cache->IsFile( aLibraryPath ) )
3555  {
3556  delete m_cache;
3557  m_cache = 0;
3558  }
3559 
3560  return true;
3561 }
SCH_LEGACY_PLUGIN_CACHE * m_cache
#define THROW_IO_ERROR(x)
Definition: utf8.cpp:60
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
void SCH_LEGACY_PLUGIN::EnumerateSymbolLib ( wxArrayString &  aAliasNameList,
const wxString &  aLibraryPath,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Function EnumerateSymbolLib.

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

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

3425 {
3426  LOCALE_IO toggle; // toggles on, then off, the C locale.
3427 
3428  m_props = aProperties;
3429 
3430  cacheLib( aLibraryPath );
3431 
3432  const LIB_ALIAS_MAP& aliases = m_cache->m_aliases;
3433 
3434  for( LIB_ALIAS_MAP::const_iterator it = aliases.begin(); it != aliases.end(); ++it )
3435  aAliasNameList.Add( it->first );
3436 }
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

Function EnumerateSymbolLib.

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

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

3442 {
3443  LOCALE_IO toggle; // toggles on, then off, the C locale.
3444 
3445  m_props = aProperties;
3446 
3447  cacheLib( aLibraryPath );
3448 
3449  const LIB_ALIAS_MAP& aliases = m_cache->m_aliases;
3450 
3451  for( LIB_ALIAS_MAP::const_iterator it = aliases.begin(); it != aliases.end(); ++it )
3452  aAliasList.push_back( it->second );
3453 }
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 1568 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(), LAYERSCH_ID_COUNT, 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_LINE_T, SCH_NO_CONNECT_T, SCH_SHEET_T, SCH_TEXT_T, SCHEMATIC_HEAD_STRING, and TO_UTF8.

Referenced by Save().

1569 {
1570  wxCHECK_RET( aScreen != NULL, "NULL SCH_SCREEN* object." );
1571  wxCHECK_RET( m_kiway != NULL, "NULL KIWAY* object." );
1572 
1573  // Write the header
1574  m_out->Print( 0, "%s %s %d\n", "EESchema", SCHEMATIC_HEAD_STRING, EESCHEMA_VERSION );
1575 
1576  // Write the project libraries.
1577  for( const PART_LIB& lib : *m_kiway->Prj().SchLibs() )
1578  m_out->Print( 0, "LIBS:%s\n", TO_UTF8( lib.GetName() ) );
1579 
1580  // This section is not used, but written for file compatibility
1581  m_out->Print( 0, "EELAYER %d %d\n", LAYERSCH_ID_COUNT, 0 );
1582  m_out->Print( 0, "EELAYER END\n" );
1583 
1584  /* Write page info, ScreenNumber and NumberOfScreen; not very meaningful for
1585  * SheetNumber and Sheet Count in a complex hierarchy, but useful in
1586  * simple hierarchy and flat hierarchy. Used also to search the root
1587  * sheet ( ScreenNumber = 1 ) within the files
1588  */
1589  const TITLE_BLOCK& tb = aScreen->GetTitleBlock();
1590  const PAGE_INFO& page = aScreen->GetPageSettings();
1591 
1592  m_out->Print( 0, "$Descr %s %d %d%s\n", TO_UTF8( page.GetType() ),
1593  page.GetWidthMils(),
1594  page.GetHeightMils(),
1595  !page.IsCustom() && page.IsPortrait() ? " portrait" : "" );
1596  m_out->Print( 0, "encoding utf-8\n" );
1597  m_out->Print( 0, "Sheet %d %d\n", aScreen->m_ScreenNumber, aScreen->m_NumberOfScreens );
1598  m_out->Print( 0, "Title %s\n", EscapedUTF8( tb.GetTitle() ).c_str() );
1599  m_out->Print( 0, "Date %s\n", EscapedUTF8( tb.GetDate() ).c_str() );
1600  m_out->Print( 0, "Rev %s\n", EscapedUTF8( tb.GetRevision() ).c_str() );
1601  m_out->Print( 0, "Comp %s\n", EscapedUTF8( tb.GetCompany() ).c_str() );
1602  m_out->Print( 0, "Comment1 %s\n", EscapedUTF8( tb.GetComment1() ).c_str() );
1603  m_out->Print( 0, "Comment2 %s\n", EscapedUTF8( tb.GetComment2() ).c_str() );
1604  m_out->Print( 0, "Comment3 %s\n", EscapedUTF8( tb.GetComment3() ).c_str() );
1605  m_out->Print( 0, "Comment4 %s\n", EscapedUTF8( tb.GetComment4() ).c_str() );
1606  m_out->Print( 0, "$EndDescr\n" );
1607 
1608  for( SCH_ITEM* item = aScreen->GetDrawItems(); item; item = item->Next() )
1609  {
1610  switch( item->Type() )
1611  {
1612  case SCH_COMPONENT_T:
1613  saveComponent( dynamic_cast< SCH_COMPONENT* >( item ) );
1614  break;
1615  case SCH_BITMAP_T:
1616  saveBitmap( dynamic_cast< SCH_BITMAP* >( item ) );
1617  break;
1618  case SCH_SHEET_T:
1619  saveSheet( dynamic_cast< SCH_SHEET* >( item ) );
1620  break;
1621  case SCH_JUNCTION_T:
1622  saveJunction( dynamic_cast< SCH_JUNCTION* >( item ) );
1623  break;
1624  case SCH_NO_CONNECT_T:
1625  saveNoConnect( dynamic_cast< SCH_NO_CONNECT* >( item ) );
1626  break;
1627  case SCH_BUS_WIRE_ENTRY_T:
1628  case SCH_BUS_BUS_ENTRY_T:
1629  saveBusEntry( dynamic_cast< SCH_BUS_ENTRY_BASE* >( item ) );
1630  break;
1631  case SCH_LINE_T:
1632  saveLine( dynamic_cast< SCH_LINE* >( item ) );
1633  break;
1634  case SCH_TEXT_T:
1635  case SCH_LABEL_T:
1636  case SCH_GLOBAL_LABEL_T:
1638  saveText( dynamic_cast< SCH_TEXT* >( item ) );
1639  break;
1640  default:
1641  wxASSERT( "Unexpected schematic object type in SCH_LEGACY_PLUGIN::Format()" );
1642  }
1643  }
1644 
1645  m_out->Print( 0, "$EndSCHEMATC\n" );
1646 }
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
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:40
#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:39
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

Function GetFileExtension 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

Function GetModifyHash.

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

References SCH_LEGACY_PLUGIN_CACHE::GetModifyHash(), and m_cache.

3400 {
3401  if( m_cache )
3402  return m_cache->GetModifyHash();
3403 
3404  // If the cache hasn't been loaded, it hasn't been modified.
3405  return 0;
3406 }
SCH_LEGACY_PLUGIN_CACHE * m_cache
const wxString SCH_LEGACY_PLUGIN::GetName ( ) const
inlineoverridevirtual

Function GetName 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 3409 of file sch_legacy_plugin.cpp.

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

3411 {
3412  LOCALE_IO toggle;
3413 
3414  m_props = aProperties;
3415 
3416  cacheLib( aLibraryPath );
3417 
3418  return m_cache->m_aliases.size();
3419 }
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 560 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().

561 {
562  m_version = 0;
563  m_rootSheet = NULL;
564  m_props = aProperties;
565  m_kiway = aKiway;
566  m_cache = NULL;
567  m_out = NULL;
568 }
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 3393 of file sch_legacy_plugin.cpp.

References PROPERTIES::Exists(), and PropBuffering.

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

3394 {
3395  return ( aProperties && aProperties->Exists( SCH_LEGACY_PLUGIN::PropBuffering ) );
3396 }
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

Function IsSymbolLibWritable returns 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

Function Load.

loads information from some input file format that this SCH_PLUGIN implementation knows about, into either a new SCHEMATIC or an existing one. This may be used to load an entire new SCHEMATIC, 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.
aAppendToMeis an existing SCHEMATIC 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
SCHEMATIC* - 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 571 of file sch_legacy_plugin.cpp.

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

573 {
574  wxASSERT( !aFileName || aKiway != NULL );
575 
576  LOCALE_IO toggle; // toggles on, then off, the C locale.
577  SCH_SHEET* sheet;
578 
579  wxFileName fn = aFileName;
580 
581  // Unfortunately child sheet file names the legacy schematic file format are not fully
582  // qualified and are always appended to the project path. The aFileName attribute must
583  // always be an absolute path so the project path can be used for load child sheet files.
584  wxASSERT( fn.IsAbsolute() );
585 
586  m_path = fn.GetPath();
587 
588  init( aKiway, aProperties );
589 
590  if( aAppendToMe == NULL )
591  {
592  // Clean up any allocated memory if an exception occurs loading the schematic.
593  std::unique_ptr< SCH_SHEET > newSheet( new SCH_SHEET );
594  newSheet->SetFileName( aFileName );
595  m_rootSheet = newSheet.get();
596  loadHierarchy( newSheet.get() );
597 
598  // If we got here, the schematic loaded successfully.
599  sheet = newSheet.release();
600  }
601  else
602  {
603  m_rootSheet = aAppendToMe->GetRootSheet();
604  wxASSERT( m_rootSheet != NULL );
605  sheet = aAppendToMe;
606  loadHierarchy( sheet );
607  }
608 
609  return sheet;
610 }
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:137
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 992 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().

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

Definition at line 1149 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().

1150 {
1151  const char* line = aReader.Line();
1152 
1153  wxCHECK( strCompare( "Entry", line, &line ), NULL );
1154 
1155  std::unique_ptr< SCH_BUS_ENTRY_BASE > busEntry;
1156 
1157  if( strCompare( "Wire", line, &line ) )
1158  {
1159  busEntry.reset( new SCH_BUS_WIRE_ENTRY );
1160 
1161  if( !strCompare( "Line", line, &line ) )
1162  SCH_PARSE_ERROR( "invalid bus entry definition expected 'Line'", aReader, line );
1163  }
1164  else if( strCompare( "Bus", line, &line ) )
1165  {
1166  busEntry.reset( new SCH_BUS_BUS_ENTRY );
1167 
1168  if( !strCompare( "Bus", line, &line ) )
1169  SCH_PARSE_ERROR( "invalid bus entry definition expected 'Bus'", aReader, line );
1170  }
1171  else
1172  SCH_PARSE_ERROR( "invalid bus entry type", aReader, line );
1173 
1174  line = aReader.ReadLine();
1175 
1176  wxPoint pos;
1177  wxSize size;
1178 
1179  pos.x = parseInt( aReader, line, &line );
1180  pos.y = parseInt( aReader, line, &line );
1181  size.x = parseInt( aReader, line, &line );
1182  size.y = parseInt( aReader, line, &line );
1183 
1184  size.x -= pos.x;
1185  size.y -= pos.y;
1186 
1187  busEntry->SetPosition( pos );
1188  busEntry->SetSize( size );
1189 
1190  return busEntry.release();
1191 }
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 1290 of file sch_legacy_plugin.cpp.

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

Referenced by loadFile().

1291 {
1292  const char* line = aReader.Line();
1293 
1294  wxCHECK( strCompare( "$Comp", line, &line ), NULL );
1295 
1296  std::unique_ptr< SCH_COMPONENT > component( new SCH_COMPONENT() );
1297 
1298  line = aReader.ReadLine();
1299 
1300  while( line != NULL )
1301  {
1302  if( strCompare( "L", line, &line ) )
1303  {
1304  wxString libName;
1305 
1306  parseUnquotedString( libName, aReader, line, &line );
1307  libName.Replace( "~", " " );
1308 
1309  LIB_ID libId( wxEmptyString, libName );
1310 
1311  component->SetLibId( libId );
1312 
1313  wxString refDesignator;
1314 
1315  parseUnquotedString( refDesignator, aReader, line, &line );
1316  refDesignator.Replace( "~", " " );
1317 
1318  wxString prefix = refDesignator;
1319 
1320  while( prefix.Length() )
1321  {
1322  if( ( prefix.Last() < '0' || prefix.Last() > '9') && prefix.Last() != '?' )
1323  break;
1324 
1325  prefix.RemoveLast();
1326  }
1327 
1328  // Avoid a prefix containing trailing/leading spaces
1329  prefix.Trim( true );
1330  prefix.Trim( false );
1331 
1332  if( prefix.IsEmpty() )
1333  component->SetPrefix( wxString( "U" ) );
1334  else
1335  component->SetPrefix( prefix );
1336  }
1337  else if( strCompare( "U", line, &line ) )
1338  {
1339  component->SetUnit( parseInt( aReader, line, &line ) );
1340  component->SetConvert( parseInt( aReader, line, &line ) );
1341  component->SetTimeStamp( parseHex( aReader, line, &line ) );
1342  }
1343  else if( strCompare( "P", line, &line ) )
1344  {
1345  wxPoint pos;
1346 
1347  pos.x = parseInt( aReader, line, &line );
1348  pos.y = parseInt( aReader, line, &line );
1349  component->SetPosition( pos );
1350  }
1351  else if( strCompare( "AR", line, &line ) )
1352  {
1353  const char* strCompare = "Path=";
1354  int len = strlen( strCompare );
1355 
1356  if( strncasecmp( strCompare, line, len ) != 0 )
1357  SCH_PARSE_ERROR( "missing 'Path=' token", aReader, line );
1358 
1359  line += len;
1360  wxString path, reference, unit;
1361 
1362  parseQuotedString( path, aReader, line, &line );
1363 
1364  strCompare = "Ref=";
1365  len = strlen( strCompare );
1366 
1367  if( strncasecmp( strCompare, line, len ) != 0 )
1368  SCH_PARSE_ERROR( "missing 'Ref=' token", aReader, line );
1369 
1370  line+= len;
1371  parseQuotedString( reference, aReader, line, &line );
1372 
1373  strCompare = "Part=";
1374  len = strlen( strCompare );
1375 
1376  if( strncasecmp( strCompare, line, len ) != 0 )
1377  SCH_PARSE_ERROR( "missing 'Part=' token", aReader, line );
1378 
1379  line+= len;
1380  parseQuotedString( unit, aReader, line, &line );
1381 
1382  long tmp;
1383 
1384  if( !unit.ToLong( &tmp, 10 ) )
1385  SCH_PARSE_ERROR( "expected integer value", aReader, line );
1386 
1387  if( tmp < 0 || tmp > 26 )
1388  SCH_PARSE_ERROR( "unit value out of range", aReader, line );
1389 
1390  component->AddHierarchicalReference( path, reference, (int)tmp );
1391  component->GetField( REFERENCE )->SetText( reference );
1392 
1393  }
1394  else if( strCompare( "F", line, &line ) )
1395  {
1396  int index = parseInt( aReader, line, &line );
1397 
1398  wxString text, name;
1399 
1400  parseQuotedString( text, aReader, line, &line, true );
1401 
1402  char orientation = parseChar( aReader, line, &line );
1403  wxPoint pos;
1404  pos.x = parseInt( aReader, line, &line );
1405  pos.y = parseInt( aReader, line, &line );
1406  int size = parseInt( aReader, line, &line );
1407  int attributes = parseHex( aReader, line, &line );
1408 
1409  if( index >= component->GetFieldCount() )
1410  {
1411  // The first MANDATOR_FIELDS _must_ be constructed within
1412  // the SCH_COMPONENT constructor. This assert is simply here
1413  // to guard against a change in that constructor.
1414  wxASSERT( component->GetFieldCount() >= MANDATORY_FIELDS );
1415 
1416  // Ignore the _supplied_ fieldNdx. It is not important anymore
1417  // if within the user defined fields region (i.e. >= MANDATORY_FIELDS).
1418  // We freely renumber the index to fit the next available field slot.
1419  index = component->GetFieldCount(); // new has this index after insertion
1420 
1421  SCH_FIELD field( wxPoint( 0, 0 ), -1, component.get(), name );
1422  component->AddField( field );
1423  }
1424 
1425  // Prior to version 2 of the schematic file format, none of the following existed.
1426  if( m_version > 1 )
1427  {
1428  wxString textAttrs;
1429  char hjustify = parseChar( aReader, line, &line );
1430 
1431  parseUnquotedString( textAttrs, aReader, line, &line );
1432 
1433  // The name of the field is optional.
1434  parseQuotedString( name, aReader, line, &line, true );
1435 
1436  if( hjustify == 'L' )
1437  component->GetField( index )->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT );
1438  else if( hjustify == 'R' )
1439  component->GetField( index )->SetHorizJustify( GR_TEXT_HJUSTIFY_RIGHT );
1440  else if( hjustify != 'C' )
1441  SCH_PARSE_ERROR( _( "component field text horizontal justification must be "
1442  "L, R, or C" ), aReader, line );
1443 
1444  // We are guaranteed to have a least one character here for older file formats
1445  // otherwise an exception would have been raised..
1446  if( textAttrs[0] == 'T' )
1447  component->GetField( index )->SetVertJustify( GR_TEXT_VJUSTIFY_TOP );
1448  else if( textAttrs[0] == 'B' )
1449  component->GetField( index )->SetVertJustify( GR_TEXT_VJUSTIFY_BOTTOM );
1450  else if( textAttrs[0] != 'C' )
1451  SCH_PARSE_ERROR( _( "component field text vertical justification must be "
1452  "B, T, or C" ), aReader, line );
1453 
1454  // Newer file formats include the bold and italics text attribute.
1455  if( textAttrs.Length() > 1 )
1456  {
1457  if( textAttrs.Length() != 3 )
1458  SCH_PARSE_ERROR( _( "component field text attributes must be 3 characters wide" ),
1459  aReader, line );
1460 
1461  if( textAttrs[1] == 'I' )
1462  component->GetField( index )->SetItalic( true );
1463  else if( textAttrs[1] != 'N' )
1464  SCH_PARSE_ERROR( _( "component field text italics indicator must be I or N" ),
1465  aReader, line );
1466 
1467  if( textAttrs[2] == 'B' )
1468  component->GetField( index )->SetBold( true );
1469  else if( textAttrs[2] != 'N' )
1470  SCH_PARSE_ERROR( _( "component field text bold indicator must be B or N" ),
1471  aReader, line );
1472  }
1473  }
1474 
1475  component->GetField( index )->SetText( text );
1476  component->GetField( index )->SetTextPos( pos );
1477  component->GetField( index )->SetVisible( !attributes );
1478  component->GetField( index )->SetTextSize( wxSize( size, size ) );
1479 
1480  if( orientation == 'H' )
1481  component->GetField( index )->SetTextAngle( TEXT_ANGLE_HORIZ );
1482  else if( orientation == 'V' )
1483  component->GetField( index )->SetTextAngle( TEXT_ANGLE_VERT );
1484  else
1485  SCH_PARSE_ERROR( _( "component field orientation must be H or V" ),
1486  aReader, line );
1487 
1488  if( name.IsEmpty() )
1490 
1491  component->GetField( index )->SetName( name );
1492  }
1493  else if( strCompare( "$EndComp", line ) )
1494  {
1495  // Ensure all flags (some are set by previous initializations) are reset:
1496  component->ClearFlags();
1497  return component.release();
1498  }
1499  else
1500  {
1501  // There are two lines that begin with a tab or spaces that includes a line with the
1502  // redundant position information and the transform matrix settings.
1503 
1504  // Parse the redundant position information just the same to check for formatting
1505  // errors.
1506  parseInt( aReader, line, &line ); // Always 1.
1507  parseInt( aReader, line, &line ); // The X coordinate.
1508  parseInt( aReader, line, &line ); // The Y coordinate.
1509 
1510  line = aReader.ReadLine();
1511 
1512  TRANSFORM transform;
1513 
1514  transform.x1 = parseInt( aReader, line, &line );
1515 
1516  if( transform.x1 < -1 || transform.x1 > 1 )
1517  SCH_PARSE_ERROR( _( "invalid component X1 transform value" ), aReader, line );
1518 
1519  transform.y1 = parseInt( aReader, line, &line );
1520 
1521  if( transform.y1 < -1 || transform.y1 > 1 )
1522  SCH_PARSE_ERROR( _( "invalid component Y1 transform value" ), aReader, line );
1523 
1524  transform.x2 = parseInt( aReader, line, &line );
1525 
1526  if( transform.x2 < -1 || transform.x2 > 1 )
1527  SCH_PARSE_ERROR( _( "invalid component X2 transform value" ), aReader, line );
1528 
1529  transform.y2 = parseInt( aReader, line, &line );
1530 
1531  if( transform.y2 < -1 || transform.y2 > 1 )
1532  SCH_PARSE_ERROR( _( "invalid component Y2 transform value" ), aReader, line );
1533 
1534  component->SetTransform( transform );
1535  }
1536 
1537  line = aReader.ReadLine();
1538  }
1539 
1540  SCH_PARSE_ERROR( "invalid component line", aReader, line );
1541 
1542  return NULL; // Prevents compiler warning. Should never get here.
1543 }
#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
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...
Class LIB_ID.
Definition: lib_id.h:56
#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:68
static bool strCompare(const char *aString, const char *aLine, const char **aOutput=NULL)
Function strCompare.
void SCH_LEGACY_PLUGIN::loadFile ( const wxString &  aFileName,
SCH_SCREEN aScreen 
)
private

Definition at line 669 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().

670 {
671  FILE_LINE_READER reader( aFileName );
672 
673  loadHeader( reader, aScreen );
674 
675  while( reader.ReadLine() )
676  {
677  char* line = reader.Line();
678 
679  while( *line && *line == ' ' )
680  line++;
681 
682  // Either an object will be loaded properly or the file load will fail and raise
683  // an exception.
684  if( strCompare( "$Descr", line ) )
685  loadPageSettings( reader, aScreen );
686  else if( strCompare( "$Comp", line ) )
687  aScreen->Append( loadComponent( reader ) );
688  else if( strCompare( "$Sheet", line ) )
689  aScreen->Append( loadSheet( reader ) );
690  else if( strCompare( "$Bitmap", line ) )
691  aScreen->Append( loadBitmap( reader ) );
692  else if( strCompare( "Connection", line ) )
693  aScreen->Append( loadJunction( reader ) );
694  else if( strCompare( "NoConn", line ) )
695  aScreen->Append( loadNoConnect( reader ) );
696  else if( strCompare( "Wire", line ) )
697  aScreen->Append( loadWire( reader ) );
698  else if( strCompare( "Entry", line ) )
699  aScreen->Append( loadBusEntry( reader ) );
700  else if( strCompare( "Text", line ) )
701  aScreen->Append( loadText( reader ) );
702  else if( strCompare( "$EndSCHEMATC", line ) )
703  return;
704  }
705 
706  // Unfortunately schematic files prior to version 2 are not terminated with $EndSCHEMATC
707  // so checking for it's existance will fail so just exit here and take our chances. :(
708  if( m_version > 1 )
709  THROW_IO_ERROR( "'$EndSCHEMATC' not found" );
710 }
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)
#define THROW_IO_ERROR(x)
Definition: utf8.cpp:60
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)
void SCH_LEGACY_PLUGIN::loadHeader ( FILE_LINE_READER aReader,
SCH_SCREEN aScreen 
)
private

Definition at line 713 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().

714 {
715  const char* line = aReader.ReadLine();
716 
717  if( !strCompare( "Eeschema Schematic File Version", line, &line ) )
718  {
719  m_error.Printf( _( "'%s' does not appear to be an Eeschema file" ),
720  GetChars( aScreen->GetFileName() ) );
722  }
723 
724  // get the file version here.
725  m_version = parseInt( aReader, line, &line );
726 
727  // The next lines are the lib list section, and are mainly comments, like:
728  // LIBS:power
729  // the lib list is not used, but is in schematic file just in case.
730  // It is usually not empty, but we accept empty list.
731  // If empty, there is a legacy section, not used
732  // EELAYER i j
733  // and the last line is
734  // EELAYER END
735  // Skip all lines until the end of header "EELAYER END" is found
736  while( aReader.ReadLine() )
737  {
738  line = aReader.Line();
739 
740  while( *line == ' ' )
741  line++;
742 
743  if( strCompare( "EELAYER END", line ) )
744  return;
745  }
746 
747  THROW_IO_ERROR( _( "Missing 'EELAYER END'" ) );
748 }
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
#define THROW_IO_ERROR(x)
Definition: utf8.cpp:60
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.
void SCH_LEGACY_PLUGIN::loadHierarchy ( SCH_SHEET aSheet)
private

Definition at line 615 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().

616 {
617  SCH_SCREEN* screen = NULL;
618 
619  if( !aSheet->GetScreen() )
620  {
621  // SCH_SCREEN objects store the full path and file name where the SCH_SHEET object only
622  // stores the file name and extension. Add the project path to the file name and
623  // extension to compare when calling SCH_SHEET::SearchHierarchy().
624  wxFileName fileName = aSheet->GetFileName();
625 
626  if( !fileName.IsAbsolute() )
627  fileName.SetPath( m_path );
628 
629  m_rootSheet->SearchHierarchy( fileName.GetFullPath(), &screen );
630 
631  if( screen )
632  {
633  aSheet->SetScreen( screen );
634 
635  // Do not need to load the sub-sheets - this has already been done.
636  }
637  else
638  {
639  aSheet->SetScreen( new SCH_SCREEN( m_kiway ) );
640  aSheet->GetScreen()->SetFileName( fileName.GetFullPath() );
641  loadFile( fileName.GetFullPath(), aSheet->GetScreen() );
642 
643  EDA_ITEM* item = aSheet->GetScreen()->GetDrawItems();
644 
645  while( item )
646  {
647  if( item->Type() == SCH_SHEET_T )
648  {
649  SCH_SHEET* sheet = (SCH_SHEET*) item;
650 
651  // Set the parent to aSheet. This effectively creates a method to find
652  // the root sheet from any sheet so a pointer to the root sheet does not
653  // need to be stored globally. Note: this is not the same as a hierarchy.
654  // Complex hierarchies can have multiple copies of a sheet. This only
655  // provides a simple tree to find the root sheet.
656  sheet->SetParent( aSheet );
657 
658  // Recursion starts here.
659  loadHierarchy( sheet );
660  }
661 
662  item = item->Next();
663  }
664  }
665  }
666 }
bool SearchHierarchy(const wxString &aFilename, SCH_SCREEN **aScreen)
Function SearchHierarchy search the existing hierarchy for an instance of screen "FileName".
Definition: sch_sheet.cpp:713
void SetScreen(SCH_SCREEN *aScreen)
Function SetScreen sets the screen associated with this sheet to aScreen.
Definition: sch_sheet.cpp:105
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:213
wxString GetFileName(void) const
Function GetFileName return the filename corresponding to this sheet.
Definition: sch_sheet.cpp:849
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:151
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 1069 of file sch_legacy_plugin.cpp.

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

Referenced by loadFile().

1070 {
1071  std::unique_ptr< SCH_JUNCTION > junction( new SCH_JUNCTION );
1072 
1073  const char* line = aReader.Line();
1074 
1075  wxCHECK( strCompare( "Connection", line, &line ), NULL );
1076 
1077  wxString name;
1078 
1079  parseUnquotedString( name, aReader, line, &line );
1080 
1081  wxPoint position;
1082 
1083  position.x = parseInt( aReader, line, &line );
1084  position.y = parseInt( aReader, line, &line );
1085  junction->SetPosition( position );
1086 
1087  return junction.release();
1088 }
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.
SCH_NO_CONNECT * SCH_LEGACY_PLUGIN::loadNoConnect ( FILE_LINE_READER aReader)
private

Definition at line 1091 of file sch_legacy_plugin.cpp.

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

Referenced by loadFile().

1092 {
1093  std::unique_ptr< SCH_NO_CONNECT > no_connect( new SCH_NO_CONNECT );
1094 
1095  const char* line = aReader.Line();
1096 
1097  wxCHECK( strCompare( "NoConn", line, &line ), NULL );
1098 
1099  wxString name;
1100 
1101  parseUnquotedString( name, aReader, line, &line );
1102 
1103  wxPoint position;
1104 
1105  position.x = parseInt( aReader, line, &line );
1106  position.y = parseInt( aReader, line, &line );
1107  no_connect->SetPosition( position );
1108 
1109  return no_connect.release();
1110 }
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.
void SCH_LEGACY_PLUGIN::loadPageSettings ( FILE_LINE_READER aReader,
SCH_SCREEN aScreen 
)
private

Definition at line 751 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().

752 {
753  wxASSERT( aScreen != NULL );
754 
755  wxString buf;
756  const char* line = aReader.Line();
757 
758  PAGE_INFO pageInfo;
759  TITLE_BLOCK tb;
760 
761  wxCHECK_RET( strCompare( "$Descr", line, &line ), "Invalid sheet description" );
762 
763  parseUnquotedString( buf, aReader, line, &line );
764 
765  if( !pageInfo.SetType( buf ) )
766  SCH_PARSE_ERROR( _( "invalid page size" ), aReader, line );
767 
768  int pagew = parseInt( aReader, line, &line );
769  int pageh = parseInt( aReader, line, &line );
770 
771  if( buf == PAGE_INFO::Custom )
772  {
773  pageInfo.SetWidthMils( pagew );
774  pageInfo.SetHeightMils( pageh );
775  }
776  else
777  {
778  wxString orientation;
779 
780  // Non custom size, set portrait if its present. Can be empty string which defaults
781  // to landscape.
782  parseUnquotedString( orientation, aReader, line, &line, true );
783 
784  if( orientation == "portrait" )
785  pageInfo.SetPortrait( true );
786  }
787 
788  aScreen->SetPageSettings( pageInfo );
789 
790  while( line != NULL )
791  {
792  buf.clear();
793 
794  if( !aReader.ReadLine() )
795  SCH_PARSE_ERROR( _( "unexpected end of file" ), aReader, line );
796 
797  line = aReader.Line();
798 
799  if( strCompare( "Sheet", line, &line ) )
800  {
801  aScreen->m_ScreenNumber = parseInt( aReader, line, &line );
802  aScreen->m_NumberOfScreens = parseInt( aReader, line, &line );
803  }
804  else if( strCompare( "Title", line, &line ) )
805  {
806  parseQuotedString( buf, aReader, line, &line, true );
807  tb.SetTitle( buf );
808  }
809  else if( strCompare( "Date", line, &line ) )
810  {
811  parseQuotedString( buf, aReader, line, &line, true );
812  tb.SetDate( buf );
813  }
814  else if( strCompare( "Rev", line, &line ) )
815  {
816  parseQuotedString( buf, aReader, line, &line, true );
817  tb.SetRevision( buf );
818  }
819  else if( strCompare( "Comp", line, &line ) )
820  {
821  parseQuotedString( buf, aReader, line, &line, true );
822  tb.SetCompany( buf );
823  }
824  else if( strCompare( "Comment1", line, &line ) )
825  {
826  parseQuotedString( buf, aReader, line, &line, true );
827  tb.SetComment1( buf );
828  }
829  else if( strCompare( "Comment2", line, &line ) )
830  {
831  parseQuotedString( buf, aReader, line, &line, true );
832  tb.SetComment2( buf );
833  }
834  else if( strCompare( "Comment3", line, &line ) )
835  {
836  parseQuotedString( buf, aReader, line, &line, true );
837  tb.SetComment3( buf );
838  }
839  else if( strCompare( "Comment4", line, &line ) )
840  {
841  parseQuotedString( buf, aReader, line, &line, true );
842  tb.SetComment4( buf );
843  }
844  else if( strCompare( "$EndDescr", line ) )
845  {
846  aScreen->SetTitleBlock( tb );
847  return;
848  }
849  }
850 
851  SCH_PARSE_ERROR( _( "missing 'EndDescr'" ), aReader, line );
852 }
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 855 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().

856 {
857  std::unique_ptr< SCH_SHEET > sheet( new SCH_SHEET() );
858 
859  sheet->SetTimeStamp( GetNewTimeStamp() );
860 
861  const char* line = aReader.ReadLine();
862 
863  while( line != NULL )
864  {
865  if( strCompare( "S", line, &line ) ) // Sheet dimensions.
866  {
867  wxPoint position;
868 
869  position.x = parseInt( aReader, line, &line );
870  position.y = parseInt( aReader, line, &line );
871  sheet->SetPosition( position );
872 
873  wxSize size;
874 
875  size.SetWidth( parseInt( aReader, line, &line ) );
876  size.SetHeight( parseInt( aReader, line, &line ) );
877  sheet->SetSize( size );
878  }
879  else if( strCompare( "U", line, &line ) ) // Sheet time stamp.
880  {
881  sheet->SetTimeStamp( parseHex( aReader, line ) );
882  }
883  else if( *line == 'F' ) // Sheet field.
884  {
885  line++;
886 
887  wxString text;
888  int size;
889  int fieldId = parseInt( aReader, line, &line );
890 
891  if( fieldId == 0 || fieldId == 1 ) // Sheet name and file name.
892  {
893  parseQuotedString( text, aReader, line, &line );
894  size = parseInt( aReader, line, &line );
895 
896  if( fieldId == 0 )
897  {
898  sheet->SetName( text );
899  sheet->SetSheetNameSize( size );
900  }
901  else
902  {
903  sheet->SetFileName( text );
904  sheet->SetFileNameSize( size );
905  }
906  }
907  else // Sheet pin.
908  {
909  std::unique_ptr< SCH_SHEET_PIN > sheetPin( new SCH_SHEET_PIN( sheet.get() ) );
910 
911  sheetPin->SetNumber( fieldId );
912 
913  // Can be empty fields.
914  parseQuotedString( text, aReader, line, &line, true );
915 
916  sheetPin->SetText( text );
917 
918  if( line == NULL )
919  THROW_IO_ERROR( _( "unexpected end of line" ) );
920 
921  switch( parseChar( aReader, line, &line ) )
922  {
923  case 'I':
924  sheetPin->SetShape( NET_INPUT );
925  break;
926 
927  case 'O':
928  sheetPin->SetShape( NET_OUTPUT );
929  break;
930 
931  case 'B':
932  sheetPin->SetShape( NET_BIDI );
933  break;
934 
935  case 'T':
936  sheetPin->SetShape( NET_TRISTATE );
937  break;
938 
939  case 'U':
940  sheetPin->SetShape( NET_UNSPECIFIED );
941  break;
942  default:
943  SCH_PARSE_ERROR( _( "invalid sheet pin type" ), aReader, line );
944  }
945 
946  switch( parseChar( aReader, line, &line ) )
947  {
948  case 'R': /* pin on right side */
949  sheetPin->SetEdge( SCH_SHEET_PIN::SHEET_RIGHT_SIDE );
950  break;
951 
952  case 'T': /* pin on top side */
953  sheetPin->SetEdge( SCH_SHEET_PIN::SHEET_TOP_SIDE );
954  break;
955 
956  case 'B': /* pin on bottom side */
957  sheetPin->SetEdge( SCH_SHEET_PIN::SHEET_BOTTOM_SIDE );
958  break;
959 
960  case 'L': /* pin on left side */
961  sheetPin->SetEdge( SCH_SHEET_PIN::SHEET_LEFT_SIDE );
962  break;
963  default:
964  SCH_PARSE_ERROR( _( "invalid sheet pin side" ), aReader, line );
965  }
966 
967  wxPoint position;
968 
969  position.x = parseInt( aReader, line, &line );
970  position.y = parseInt( aReader, line, &line );
971  sheetPin->SetPosition( position );
972 
973  size = parseInt( aReader, line, &line );
974 
975  sheetPin->SetTextSize( wxSize( size, size ) );
976 
977  sheet->AddPin( sheetPin.release() );
978  }
979  }
980  else if( strCompare( "$EndSheet", line ) )
981  return sheet.release();
982 
983  line = aReader.ReadLine();
984  }
985 
986  SCH_PARSE_ERROR( _( "missing '$EndSheet`" ), aReader, line );
987 
988  return NULL; // Prevents compiler warning. Should never get here.
989 }
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
#define THROW_IO_ERROR(x)
Definition: utf8.cpp:60
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.
LIB_ALIAS * SCH_LEGACY_PLUGIN::LoadSymbol ( const wxString &  aLibraryPath,
const wxString &  aAliasName,
const PROPERTIES aProperties = NULL 
)
overridevirtual

Function LoadSymbol.

loads 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
LIB_ALIAS* - if found caller shares it, else 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 3456 of file sch_legacy_plugin.cpp.

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

3458 {
3459  LOCALE_IO toggle; // toggles on, then off, the C locale.
3460 
3461  m_props = aProperties;
3462 
3463  cacheLib( aLibraryPath );
3464 
3465  LIB_ALIAS_MAP::const_iterator it = m_cache->m_aliases.find( aAliasName );
3466 
3467  if( it == m_cache->m_aliases.end() )
3468  return NULL;
3469 
3470  return it->second;
3471 }
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 1194 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().

1195 {
1196  const char* line = aReader.Line();
1197 
1198  wxCHECK( strCompare( "Text", line, &line ), NULL );
1199 
1200  std::unique_ptr< SCH_TEXT> text;
1201 
1202  if( strCompare( "Notes", line, &line ) )
1203  text.reset( new SCH_TEXT );
1204  else if( strCompare( "Label", line, &line ) )
1205  text.reset( new SCH_LABEL );
1206  else if( strCompare( "HLabel", line, &line ) )
1207  text.reset( new SCH_HIERLABEL );
1208  else if( strCompare( "GLabel", line, &line ) )
1209  {
1210  // Prior to version 2, the SCH_GLOBALLABEL object did not exist.
1211  if( m_version == 1 )
1212  text.reset( new SCH_HIERLABEL );
1213  else
1214  text.reset( new SCH_GLOBALLABEL );
1215  }
1216  else
1217  SCH_PARSE_ERROR( "unknown Text type", aReader, line );
1218 
1219  // Parse the parameters common to all text objects.
1220  wxPoint position;
1221 
1222  position.x = parseInt( aReader, line, &line );
1223  position.y = parseInt( aReader, line, &line );
1224  text->SetPosition( position );
1225  text->SetLabelSpinStyle( parseInt( aReader, line, &line ) );
1226 
1227  int size = parseInt( aReader, line, &line );
1228 
1229  text->SetTextSize( wxSize( size, size ) );
1230 
1231  // Parse the global and hierarchical label type.
1232  if( text->Type() == SCH_HIERARCHICAL_LABEL_T || text->Type() == SCH_GLOBAL_LABEL_T )
1233  {
1234  if( strCompare( SheetLabelType[NET_INPUT], line, &line ) )
1235  text->SetShape( NET_INPUT );
1236  else if( strCompare( SheetLabelType[NET_OUTPUT], line, &line ) )
1237  text->SetShape( NET_OUTPUT );
1238  else if( strCompare( SheetLabelType[NET_BIDI], line, &line ) )
1239  text->SetShape( NET_BIDI );
1240  else if( strCompare( SheetLabelType[NET_TRISTATE], line, &line ) )
1241  text->SetShape( NET_TRISTATE );
1242  else if( strCompare( SheetLabelType[NET_UNSPECIFIED], line, &line ) )
1243  text->SetShape( NET_UNSPECIFIED );
1244  else
1245  SCH_PARSE_ERROR( _( "invalid label type" ), aReader, line );
1246  }
1247 
1248  int thickness = 0;
1249 
1250  // The following tokens do not exist in version 1 schematic files.
1251  if( m_version > 1 )
1252  {
1253  if( strCompare( "Italic", line, &line ) )
1254  text->SetItalic( true );
1255  else if( !strCompare( "~", line, &line ) )
1256  SCH_PARSE_ERROR( _( "expected 'Italics' or '~'" ), aReader, line );
1257 
1258  // The thickness token does not exist in older versions of the schematic file format
1259  // so calling parseInt will be made only if the EOL is not reached.
1260  if( *line >= ' ' )
1261  thickness = parseInt( aReader, line, &line );
1262  }
1263 
1264  text->SetBold( thickness != 0 );
1265  text->SetThickness( thickness != 0 ? GetPenSizeForBold( size ) : 0 );
1266 
1267  // Read the text string for the text.
1268  char* tmp = aReader.ReadLine();
1269 
1270  tmp = strtok( tmp, "\r\n" );
1271  wxString val = FROM_UTF8( tmp );
1272 
1273  for( ; ; )
1274  {
1275  int i = val.find( wxT( "\\n" ) );
1276 
1277  if( i == wxNOT_FOUND )
1278  break;
1279 
1280  val.erase( i, 2 );
1281  val.insert( i, wxT( "\n" ) );
1282  }
1283 
1284  text->SetText( val );
1285 
1286  return text.release();
1287 }
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 1113 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().

1114 {
1115  std::unique_ptr< SCH_LINE > wire( new SCH_LINE );
1116 
1117  const char* line = aReader.Line();
1118 
1119  wxCHECK( strCompare( "Wire", line, &line ), NULL );
1120 
1121  if( strCompare( "Wire", line, &line ) )
1122  wire->SetLayer( LAYER_WIRE );
1123  else if( strCompare( "Bus", line, &line ) )
1124  wire->SetLayer( LAYER_BUS );
1125  else if( strCompare( "Notes", line, &line ) )
1126  wire->SetLayer( LAYER_NOTES );
1127  else
1128  SCH_PARSE_ERROR( "invalid line type", aReader, line );
1129 
1130  if( !strCompare( "Line", line, &line ) )
1131  SCH_PARSE_ERROR( "invalid wire definition", aReader, line );
1132 
1133  line = aReader.ReadLine();
1134 
1135  wxPoint begin, end;
1136 
1137  begin.x = parseInt( aReader, line, &line );
1138  begin.y = parseInt( aReader, line, &line );
1139  end.x = parseInt( aReader, line, &line );
1140  end.y = parseInt( aReader, line, &line );
1141 
1142  wire->SetStartPoint( begin );
1143  wire->SetEndPoint( end );
1144 
1145  return wire.release();
1146 }
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

Function Save.

will 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 SCHEMATIC 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.
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 1546 of file sch_legacy_plugin.cpp.

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

1548 {
1549  wxCHECK_RET( aScreen != NULL, "NULL SCH_SCREEN object." );
1550  wxCHECK_RET( !aFileName.IsEmpty(), "No schematic file name defined." );
1551 
1552  init( aKiway, aProperties );
1553 
1554  wxFileName fn = aFileName;
1555 
1556  // File names should be absolute. Don't assume everything relative to the project path
1557  // works properly.
1558  wxASSERT( fn.IsAbsolute() );
1559 
1560  FILE_OUTPUTFORMATTER formatter( fn.GetFullPath() );
1561 
1562  m_out = &formatter; // no ownership
1563 
1564  Format( aScreen );
1565 }
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 1786 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().

1787 {
1788  wxCHECK_RET( aBitmap != NULL, "SCH_BITMAP* is NULL" );
1789 
1790  wxImage* image = aBitmap->GetImage()->GetImageData();
1791 
1792  wxCHECK_RET( image != NULL, "wxImage* is NULL" );
1793 
1794  m_out->Print( 0, "$Bitmap\n" );
1795  m_out->Print( 0, "Pos %-4d %-4d\n", aBitmap->GetPosition().x, aBitmap->GetPosition().y );
1796  m_out->Print( 0, "Scale %f\n", aBitmap->GetImage()->GetScale() );
1797  m_out->Print( 0, "Data\n" );
1798 
1799  wxMemoryOutputStream stream;
1800 
1801  image->SaveFile( stream, wxBITMAP_TYPE_PNG );
1802 
1803  // Write binary data in hexadecimal form (ASCII)
1804  wxStreamBuffer* buffer = stream.GetOutputStreamBuffer();
1805  char* begin = (char*) buffer->GetBufferStart();
1806 
1807  for( int ii = 0; begin < buffer->GetBufferEnd(); begin++, ii++ )
1808  {
1809  if( ii >= 32 )
1810  {
1811  ii = 0;
1812 
1813  m_out->Print( 0, "\n" );
1814  }
1815 
1816  m_out->Print( 0, "%2.2X ", *begin & 0xFF );
1817  }
1818 
1819  m_out->Print( 0, "\nEndData\n" );
1820  m_out->Print( 0, "$EndBitmap\n" );
1821 }
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 1917 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().

1918 {
1919  wxCHECK_RET( aBusEntry != NULL, "SCH_BUS_ENTRY_BASE* is NULL" );
1920 
1921  if( aBusEntry->GetLayer() == LAYER_WIRE )
1922  m_out->Print( 0, "Entry Wire Line\n\t%-4d %-4d %-4d %-4d\n",
1923  aBusEntry->GetPosition().x, aBusEntry->GetPosition().y,
1924  aBusEntry->m_End().x, aBusEntry->m_End().y );
1925  else
1926  m_out->Print( 0, "Entry Bus Bus\n\t%-4d %-4d %-4d %-4d\n",
1927  aBusEntry->GetPosition().x, aBusEntry->GetPosition().y,
1928  aBusEntry->m_End().x, aBusEntry->m_End().y );
1929 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
wxPoint m_End() const
LAYERSCH_ID GetLayer() const
Function GetLayer returns the layer this item is on.
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 1649 of file sch_legacy_plugin.cpp.

References FROM_UTF8(), 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().

1650 {
1651  std::string name1;
1652  std::string name2;
1653  wxArrayString reference_fields;
1654 
1655  static wxString delimiters( wxT( " " ) );
1656 
1657  // This is redundant with the AR entries below, but it makes the files backwards-compatible.
1658  if( aComponent->GetPathsAndReferences().GetCount() > 0 )
1659  {
1660  reference_fields = wxStringTokenize( aComponent->GetPathsAndReferences()[0], delimiters );
1661  name1 = toUTFTildaText( reference_fields[1] );
1662  }
1663  else
1664  {
1665  if( aComponent->GetField( REFERENCE )->GetText().IsEmpty() )
1666  name1 = toUTFTildaText( aComponent->GetPrefix() );
1667  else
1668  name1 = toUTFTildaText( aComponent->GetField( REFERENCE )->GetText() );
1669  }
1670 
1671  wxString part_name = FROM_UTF8( aComponent->GetLibId().GetLibItemName() );
1672 
1673  if( part_name.size() )
1674  {
1675  name2 = toUTFTildaText( part_name );
1676  }
1677  else
1678  {
1679  name2 = "_NONAME_";
1680  }
1681 
1682  m_out->Print( 0, "$Comp\n" );
1683  m_out->Print( 0, "L %s %s\n", name2.c_str(), name1.c_str() );
1684 
1685  // Generate unit number, convert and time stamp
1686  m_out->Print( 0, "U %d %d %8.8lX\n", aComponent->GetUnit(), aComponent->GetConvert(),
1687  (unsigned long)aComponent->GetTimeStamp() );
1688 
1689  // Save the position
1690  m_out->Print( 0, "P %d %d\n", aComponent->GetPosition().x, aComponent->GetPosition().y );
1691 
1692  /* If this is a complex hierarchy; save hierarchical references.
1693  * but for simple hierarchies it is not necessary.
1694  * the reference inf is already saved
1695  * this is useful for old Eeschema version compatibility
1696  */
1697  if( aComponent->GetPathsAndReferences().GetCount() > 1 )
1698  {
1699  for( unsigned int ii = 0; ii < aComponent->GetPathsAndReferences().GetCount(); ii++ )
1700  {
1701  /*format:
1702  * AR Path="/140/2" Ref="C99" Part="1"
1703  * where 140 is the uid of the containing sheet
1704  * and 2 is the timestamp of this component.
1705  * (timestamps are actually 8 hex chars)
1706  * Ref is the conventional component reference for this 'path'
1707  * Part is the conventional component part selection for this 'path'
1708  */
1709  reference_fields = wxStringTokenize( aComponent->GetPathsAndReferences()[ii],
1710  delimiters );
1711 
1712  m_out->Print( 0, "AR Path=\"%s\" Ref=\"%s\" Part=\"%s\" \n",
1713  TO_UTF8( reference_fields[0] ),
1714  TO_UTF8( reference_fields[1] ),
1715  TO_UTF8( reference_fields[2] ) );
1716  }
1717  }
1718 
1719  // update the ugly field index, which I would like to see go away someday soon.
1720  for( int i = 0; i < aComponent->GetFieldCount(); ++i )
1721  aComponent->GetField( i )->SetId( i );
1722 
1723  // Fixed fields:
1724  // Save mandatory fields even if they are blank,
1725  // because the visibility, size and orientation are set from libary editor.
1726  for( unsigned i = 0; i < MANDATORY_FIELDS; ++i )
1727  saveField( aComponent->GetField( i ) );
1728 
1729  // User defined fields:
1730  // The *policy* about which user defined fields are part of a symbol is now
1731  // only in the dialog editors. No policy should be enforced here, simply
1732  // save all the user defined fields, they are present because a dialog editor
1733  // thought they should be. If you disagree, go fix the dialog editors.
1734  for( int i = MANDATORY_FIELDS; i < aComponent->GetFieldCount(); ++i )
1735  saveField( aComponent->GetField( i ) );
1736 
1737  // Unit number, position, box ( old standard )
1738  m_out->Print( 0, "\t%-4d %-4d %-4d\n", aComponent->GetUnit(), aComponent->GetPosition().x,
1739  aComponent->GetPosition().y );
1740 
1741  TRANSFORM transform = aComponent->GetTransform();
1742 
1743  m_out->Print( 0, "\t%-4d %-4d %-4d %-4d\n",
1744  transform.x1, transform.y1, transform.x2, transform.y2 );
1745  m_out->Print( 0, "$EndComp\n" );
1746 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
TRANSFORM & GetTransform() const
static wxString FROM_UTF8(const char *cstring)
function FROM_UTF8 converts a UTF8 encoded C string to a wxString for all wxWidgets build modes...
Definition: macros.h:53
int 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
Function GetField returns a field.
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:204
int GetFieldCount() const
Function GetFieldCount returns the number of fields in this component.
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 1749 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().

1750 {
1751  char hjustify = 'C';
1752 
1753  if( aField->GetHorizJustify() == GR_TEXT_HJUSTIFY_LEFT )
1754  hjustify = 'L';
1755  else if( aField->GetHorizJustify() == GR_TEXT_HJUSTIFY_RIGHT )
1756  hjustify = 'R';
1757 
1758  char vjustify = 'C';
1759 
1760  if( aField->GetVertJustify() == GR_TEXT_VJUSTIFY_BOTTOM )
1761  vjustify = 'B';
1762  else if( aField->GetVertJustify() == GR_TEXT_VJUSTIFY_TOP )
1763  vjustify = 'T';
1764 
1765  m_out->Print( 0, "F %d %s %c %-3d %-3d %-3d %4.4X %c %c%c%c",
1766  aField->GetId(),
1767  EscapedUTF8( aField->GetText() ).c_str(), // wraps in quotes too
1768  aField->GetTextAngle() == TEXT_ANGLE_HORIZ ? 'H' : 'V',
1769  aField->GetLibPosition().x, aField->GetLibPosition().y,
1770  aField->GetTextWidth(),
1771  !aField->IsVisible(),
1772  hjustify, vjustify,
1773  aField->IsItalic() ? 'I' : 'N',
1774  aField->IsBold() ? 'B' : 'N' );
1775 
1776  // Save field name, if the name is user definable
1777  if( aField->GetId() >= FIELD1 )
1778  {
1779  m_out->Print( 0, " %s", EscapedUTF8( aField->GetName() ).c_str() );
1780  }
1781 
1782  m_out->Print( 0, "\n" );
1783 }
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 1899 of file sch_legacy_plugin.cpp.

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

Referenced by Format().

1900 {
1901  wxCHECK_RET( aJunction != NULL, "SCH_JUNCTION* is NULL" );
1902 
1903  m_out->Print( 0, "Connection ~ %-4d %-4d\n",
1904  aJunction->GetPosition().x, aJunction->GetPosition().y );
1905 }
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 3564 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().

3565 {
3566  if( !m_cache )
3567  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryPath );
3568 
3569  wxString oldFileName = m_cache->GetFileName();
3570 
3571  if( !m_cache->IsFile( aLibraryPath ) )
3572  {
3573  m_cache->SetFileName( aLibraryPath );
3574  }
3575 
3576  // This is a forced save.
3577  m_cache->SetModified();
3578  m_cache->Save( writeDocFile( aProperties ) );
3579  m_cache->SetFileName( oldFileName );
3580 }
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 1932 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().

1933 {
1934  wxCHECK_RET( aLine != NULL, "SCH_LINE* is NULL" );
1935 
1936  const char* layer = "Notes";
1937  const char* width = "Line";
1938 
1939  if( aLine->GetLayer() == LAYER_WIRE )
1940  layer = "Wire";
1941  else if( aLine->GetLayer() == LAYER_BUS )
1942  layer = "Bus";
1943 
1944  m_out->Print( 0, "Wire %s %s\n", layer, width );
1945  m_out->Print( 0, "\t%-4d %-4d %-4d %-4d\n", aLine->GetStartPoint().x, aLine->GetStartPoint().y,
1946  aLine->GetEndPoint().x, aLine->GetEndPoint().y );
1947 }
FILE_OUTPUTFORMATTER * m_out
The output formatter for saving SCH_SCREEN objects.
wxPoint GetEndPoint() const
Definition: sch_line.h:75
wxPoint GetStartPoint() const
Definition: sch_line.h:71
LAYERSCH_ID GetLayer() const
Function GetLayer returns the layer this item is on.
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 1908 of file sch_legacy_plugin.cpp.

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

Referenced by Format().

1909 {
1910  wxCHECK_RET( aNoConnect != NULL, "SCH_NOCONNECT* is NULL" );
1911 
1912  m_out->Print( 0, "NoConn ~ %-4d %-4d\n", aNoConnect->GetPosition().x,
1913  aNoConnect->GetPosition().y );
1914 }
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 1824 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().

1825 {
1826  wxCHECK_RET( aSheet != NULL, "SCH_SHEET* is NULL" );
1827 
1828  m_out->Print( 0, "$Sheet\n" );
1829  m_out->Print( 0, "S %-4d %-4d %-4d %-4d\n",
1830  aSheet->GetPosition().x, aSheet->GetPosition().y,
1831  aSheet->GetSize().x, aSheet->GetSize().y );
1832 
1833  m_out->Print( 0, "U %8.8lX\n", (unsigned long) aSheet->GetTimeStamp() );
1834 
1835  if( !aSheet->GetName().IsEmpty() )
1836  m_out->Print( 0, "F0 %s %d\n", EscapedUTF8( aSheet->GetName() ).c_str(),
1837  aSheet->GetSheetNameSize() );
1838 
1839  if( !aSheet->GetFileName().IsEmpty() )
1840  m_out->Print( 0, "F1 %s %d\n", EscapedUTF8( aSheet->GetFileName() ).c_str(),
1841  aSheet->GetFileNameSize() );
1842 
1843  for( const SCH_SHEET_PIN& pin : aSheet->GetPins() )
1844  {
1845  int type, side;
1846 
1847  if( pin.GetText().IsEmpty() )
1848  break;
1849 
1850  switch( pin.GetEdge() )
1851  {
1852  default:
1854  side = 'L';
1855  break;
1856 
1858  side = 'R';
1859  break;
1860 
1862  side = 'T';
1863  break;
1864 
1866  side = 'B';
1867  break;
1868  }
1869 
1870  switch( pin.GetShape() )
1871  {
1872  case NET_INPUT:
1873  type = 'I'; break;
1874 
1875  case NET_OUTPUT:
1876  type = 'O'; break;
1877 
1878  case NET_BIDI:
1879  type = 'B'; break;
1880 
1881  case NET_TRISTATE:
1882  type = 'T'; break;
1883 
1884  default:
1885  case NET_UNSPECIFIED:
1886  type = 'U'; break;
1887  }
1888 
1889  m_out->Print( 0, "F%d %s %c %c %-3d %-3d %-3d\n", pin.GetNumber(),
1890  EscapedUTF8( pin.GetText() ).c_str(), // supplies wrapping quotes
1891  type, side, pin.GetPosition().x, pin.GetPosition().y,
1892  pin.GetTextWidth() );
1893  }
1894 
1895  m_out->Print( 0, "$EndSheet\n" );
1896 }
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:849
time_t GetTimeStamp() const
Definition: base_struct.h:204
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

Function SaveSymbol.

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

3476 {
3477  m_props = aProperties;
3478 
3479  cacheLib( aLibraryPath );
3480 
3481  m_cache->AddSymbol( aSymbol );
3482 
3483  if( !isBuffering( aProperties ) )
3484  m_cache->Save( writeDocFile( aProperties ) );
3485 }
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 1950 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().

1951 {
1952  wxCHECK_RET( aText != NULL, "SCH_TEXT* is NULL" );
1953 
1954  const char* italics = "~";
1955  const char* textType = "Notes";
1956 
1957  if( aText->IsItalic() )
1958  italics = "Italic";
1959 
1960  wxString text = aText->GetText();
1961 
1962  LAYERSCH_ID layer = aText->GetLayer();
1963 
1964  if( layer == LAYER_NOTES || layer == LAYER_LOCLABEL )
1965  {
1966  if( layer == LAYER_NOTES )
1967  {
1968  // For compatibility reasons, the text must be saved in only one text line
1969  // so replace all EOLs with \\n
1970  text.Replace( wxT( "\n" ), wxT( "\\n" ) );
1971 
1972  // Here we should have no CR or LF character in line
1973  // This is not always the case if a multiline text was copied (using a copy/paste
1974  // function) from a text that uses E.O.L characters that differs from the current
1975  // EOL format. This is mainly the case under Linux using LF symbol when copying
1976  // a text from Windows (using CRLF symbol) so we must just remove the extra CR left
1977  // (or LF left under MacOSX)
1978  for( unsigned ii = 0; ii < text.Len(); )
1979  {
1980  if( text[ii] == 0x0A || text[ii] == 0x0D )
1981  text.erase( ii, 1 );
1982  else
1983  ii++;
1984  }
1985  }
1986  else
1987  {
1988  textType = "Label";
1989  }
1990 
1991  m_out->Print( 0, "Text %s %-4d %-4d %-4d %-4d %s %d\n%s\n", textType,
1992  aText->GetPosition().x, aText->GetPosition().y,
1993  aText->GetLabelSpinStyle(),
1994  aText->GetTextWidth(),
1995  italics, aText->GetThickness(), TO_UTF8( text ) );
1996  }
1997  else if( layer == LAYER_GLOBLABEL || layer == LAYER_HIERLABEL )
1998  {
1999  textType = ( layer == LAYER_GLOBLABEL ) ? "GLabel" : "HLabel";
2000 
2001  m_out->Print( 0, "Text %s %-4d %-4d %-4d %-4d %s %s %d\n%s\n", textType,
2002  aText->GetPosition().x, aText->GetPosition().y,
2003  aText->GetLabelSpinStyle(),
2004  aText->GetTextWidth(),
2005  SheetLabelType[aText->GetShape()],
2006  italics,
2007  aText->GetThickness(), TO_UTF8( text ) );
2008  }
2009 }
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
const char * SheetLabelType[]
Definition: sch_text.cpp:57
int GetThickness() const
Function GetThickness returns pen width.
Definition: eda_text.h:154
LAYERSCH_ID
Definition: general.h:75
#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
virtual wxPoint GetPosition() const override
Function GetPosition.
Definition: sch_text.h:200
LAYERSCH_ID GetLayer() const
Function GetLayer returns the layer this item is on.
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

Function SymbolLibOptions.

appends 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 std::string that is assuredly encoded in UTF8, and supplies special conversion...
Definition: utf8.h:53
bool SCH_LEGACY_PLUGIN::writeDocFile ( const PROPERTIES aProperties)
private

Definition at line 3382 of file sch_legacy_plugin.cpp.

References PropNoDocFile.

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

3383 {
3384  std::string propName( SCH_LEGACY_PLUGIN::PropNoDocFile );
3385 
3386  if( aProperties && aProperties->find( propName ) != aProperties->end() )
3387  return false;
3388 
3389  return true;
3390 }
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(), 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: