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

3382 {
3383  if( !m_cache || !m_cache->IsFile( aLibraryFileName ) || m_cache->IsFileChanged() )
3384  {
3385  // a spectacular episode in memory management:
3386  delete m_cache;
3387  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryFileName );
3388 
3389  if( !isBuffering( m_props ) )
3390  m_cache->Load();
3391  }
3392 }
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 3529 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().

3531 {
3532  if( wxFileExists( aLibraryPath ) )
3533  {
3535  _( "symbol library '%s' already exists, cannot create a new library" ),
3536  aLibraryPath.GetData() ) );
3537  }
3538 
3539  LOCALE_IO toggle;
3540 
3541  m_props = aProperties;
3542 
3543  delete m_cache;
3544  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryPath );
3545  m_cache->SetModified();
3546  m_cache->Save( writeDocFile( aProperties ) );
3547  m_cache->Load(); // update m_writable and m_mod_time
3548 }
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 3501 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().

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

3517 {
3518  m_props = aProperties;
3519 
3520  cacheLib( aLibraryPath );
3521 
3522  m_cache->DeleteSymbol( aAliasName );
3523 
3524  if( !isBuffering( aProperties ) )
3525  m_cache->Save( writeDocFile( aProperties ) );
3526 }
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 3551 of file sch_legacy_plugin.cpp.

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

3553 {
3554  wxFileName fn = aLibraryPath;
3555 
3556  if( !fn.FileExists() )
3557  return false;
3558 
3559  // Some of the more elaborate wxRemoveFile() crap puts up its own wxLog dialog
3560  // we don't want that. we want bare metal portability with no UI here.
3561  if( wxRemove( aLibraryPath ) )
3562  {
3563  THROW_IO_ERROR( wxString::Format( _( "library '%s' cannot be deleted" ),
3564  aLibraryPath.GetData() ) );
3565  }
3566 
3567  if( m_cache && m_cache->IsFile( aLibraryPath ) )
3568  {
3569  delete m_cache;
3570  m_cache = 0;
3571  }
3572 
3573  return true;
3574 }
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 3435 of file sch_legacy_plugin.cpp.

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

3438 {
3439  LOCALE_IO toggle; // toggles on, then off, the C locale.
3440 
3441  m_props = aProperties;
3442 
3443  cacheLib( aLibraryPath );
3444 
3445  const LIB_ALIAS_MAP& aliases = m_cache->m_aliases;
3446 
3447  for( LIB_ALIAS_MAP::const_iterator it = aliases.begin(); it != aliases.end(); ++it )
3448  aAliasNameList.Add( it->first );
3449 }
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 3452 of file sch_legacy_plugin.cpp.

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

3455 {
3456  LOCALE_IO toggle; // toggles on, then off, the C locale.
3457 
3458  m_props = aProperties;
3459 
3460  cacheLib( aLibraryPath );
3461 
3462  const LIB_ALIAS_MAP& aliases = m_cache->m_aliases;
3463 
3464  for( LIB_ALIAS_MAP::const_iterator it = aliases.begin(); it != aliases.end(); ++it )
3465  aAliasList.push_back( it->second );
3466 }
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 1581 of file sch_legacy_plugin.cpp.

References EESCHEMA_VERSION, EscapedUTF8(), TITLE_BLOCK::GetComment1(), TITLE_BLOCK::GetComment2(), TITLE_BLOCK::GetComment3(), TITLE_BLOCK::GetComment4(), TITLE_BLOCK::GetCompany(), TITLE_BLOCK::GetDate(), SCH_SCREEN::GetDrawItems(), PAGE_INFO::GetHeightMils(), SCH_SCREEN::GetPageSettings(), TITLE_BLOCK::GetRevision(), TITLE_BLOCK::GetTitle(), SCH_SCREEN::GetTitleBlock(), PAGE_INFO::GetType(), PAGE_INFO::GetWidthMils(), PAGE_INFO::IsCustom(), PAGE_INFO::IsPortrait(), m_kiway, BASE_SCREEN::m_NumberOfScreens, m_out, BASE_SCREEN::m_ScreenNumber, SCH_ITEM::Next(), OUTPUTFORMATTER::Print(), KIWAY::Prj(), saveBitmap(), saveBusEntry(), saveComponent(), saveJunction(), saveLine(), saveNoConnect(), saveSheet(), saveText(), SCH_BITMAP_T, SCH_BUS_BUS_ENTRY_T, SCH_BUS_WIRE_ENTRY_T, SCH_COMPONENT_T, SCH_GLOBAL_LABEL_T, SCH_HIERARCHICAL_LABEL_T, SCH_JUNCTION_T, SCH_LABEL_T, SCH_LAYER_ID_COUNT, SCH_LINE_T, SCH_NO_CONNECT_T, SCH_SHEET_T, SCH_TEXT_T, SCHEMATIC_HEAD_STRING, and TO_UTF8.

Referenced by Save().

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

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

References SCH_LEGACY_PLUGIN_CACHE::GetModifyHash(), and m_cache.

3413 {
3414  if( m_cache )
3415  return m_cache->GetModifyHash();
3416 
3417  // If the cache hasn't been loaded, it hasn't been modified.
3418  return 0;
3419 }
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 3422 of file sch_legacy_plugin.cpp.

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

3424 {
3425  LOCALE_IO toggle;
3426 
3427  m_props = aProperties;
3428 
3429  cacheLib( aLibraryPath );
3430 
3431  return m_cache->m_aliases.size();
3432 }
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 3406 of file sch_legacy_plugin.cpp.

References PROPERTIES::Exists(), and PropBuffering.

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

3407 {
3408  return ( aProperties && aProperties->Exists( SCH_LEGACY_PLUGIN::PropBuffering ) );
3409 }
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(), SCH_SHEET::GetScreen(), GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_HJUSTIFY_RIGHT, GR_TEXT_VJUSTIFY_BOTTOM, GR_TEXT_VJUSTIFY_TOP, LINE_READER::Line(), m_rootSheet, m_version, MANDATORY_FIELDS, name, parseChar(), parseHex(), parseInt(), parseQuotedString(), parseUnquotedString(), FILE_LINE_READER::ReadLine(), REFERENCE, SCH_PARSE_ERROR, BASE_SCREEN::SetModify(), strCompare(), TEXT_ANGLE_HORIZ, TEXT_ANGLE_VERT, wxPoint::x, TRANSFORM::x1, TRANSFORM::x2, wxPoint::y, TRANSFORM::y1, and TRANSFORM::y2.

Referenced by loadFile().

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

Definition at line 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(), name, 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.
const char * name
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(), name, 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.
const char * name
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 3469 of file sch_legacy_plugin.cpp.

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

3471 {
3472  LOCALE_IO toggle; // toggles on, then off, the C locale.
3473 
3474  m_props = aProperties;
3475 
3476  cacheLib( aLibraryPath );
3477 
3478  LIB_ALIAS_MAP::const_iterator it = m_cache->m_aliases.find( aAliasName );
3479 
3480  if( it == m_cache->m_aliases.end() )
3481  return NULL;
3482 
3483  return it->second;
3484 }
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 1559 of file sch_legacy_plugin.cpp.

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

1561 {
1562  wxCHECK_RET( aScreen != NULL, "NULL SCH_SCREEN object." );
1563  wxCHECK_RET( !aFileName.IsEmpty(), "No schematic file name defined." );
1564 
1565  init( aKiway, aProperties );
1566 
1567  wxFileName fn = aFileName;
1568 
1569  // File names should be absolute. Don't assume everything relative to the project path
1570  // works properly.
1571  wxASSERT( fn.IsAbsolute() );
1572 
1573  FILE_OUTPUTFORMATTER formatter( fn.GetFullPath() );
1574 
1575  m_out = &formatter; // no ownership
1576 
1577  Format( aScreen );
1578 }
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 1799 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().

1800 {
1801  wxCHECK_RET( aBitmap != NULL, "SCH_BITMAP* is NULL" );
1802 
1803  wxImage* image = aBitmap->GetImage()->GetImageData();
1804 
1805  wxCHECK_RET( image != NULL, "wxImage* is NULL" );
1806 
1807  m_out->Print( 0, "$Bitmap\n" );
1808  m_out->Print( 0, "Pos %-4d %-4d\n", aBitmap->GetPosition().x, aBitmap->GetPosition().y );
1809  m_out->Print( 0, "Scale %f\n", aBitmap->GetImage()->GetScale() );
1810  m_out->Print( 0, "Data\n" );
1811 
1812  wxMemoryOutputStream stream;
1813 
1814  image->SaveFile( stream, wxBITMAP_TYPE_PNG );
1815 
1816  // Write binary data in hexadecimal form (ASCII)
1817  wxStreamBuffer* buffer = stream.GetOutputStreamBuffer();
1818  char* begin = (char*) buffer->GetBufferStart();
1819 
1820  for( int ii = 0; begin < buffer->GetBufferEnd(); begin++, ii++ )
1821  {
1822  if( ii >= 32 )
1823  {
1824  ii = 0;
1825 
1826  m_out->Print( 0, "\n" );
1827  }
1828 
1829  m_out->Print( 0, "%2.2X ", *begin & 0xFF );
1830  }
1831 
1832  m_out->Print( 0, "\nEndData\n" );
1833  m_out->Print( 0, "$EndBitmap\n" );
1834 }
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 1930 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().

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

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

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

1763 {
1764  char hjustify = 'C';
1765 
1766  if( aField->GetHorizJustify() == GR_TEXT_HJUSTIFY_LEFT )
1767  hjustify = 'L';
1768  else if( aField->GetHorizJustify() == GR_TEXT_HJUSTIFY_RIGHT )
1769  hjustify = 'R';
1770 
1771  char vjustify = 'C';
1772 
1773  if( aField->GetVertJustify() == GR_TEXT_VJUSTIFY_BOTTOM )
1774  vjustify = 'B';
1775  else if( aField->GetVertJustify() == GR_TEXT_VJUSTIFY_TOP )
1776  vjustify = 'T';
1777 
1778  m_out->Print( 0, "F %d %s %c %-3d %-3d %-3d %4.4X %c %c%c%c",
1779  aField->GetId(),
1780  EscapedUTF8( aField->GetText() ).c_str(), // wraps in quotes too
1781  aField->GetTextAngle() == TEXT_ANGLE_HORIZ ? 'H' : 'V',
1782  aField->GetLibPosition().x, aField->GetLibPosition().y,
1783  aField->GetTextWidth(),
1784  !aField->IsVisible(),
1785  hjustify, vjustify,
1786  aField->IsItalic() ? 'I' : 'N',
1787  aField->IsBold() ? 'B' : 'N' );
1788 
1789  // Save field name, if the name is user definable
1790  if( aField->GetId() >= FIELD1 )
1791  {
1792  m_out->Print( 0, " %s", EscapedUTF8( aField->GetName() ).c_str() );
1793  }
1794 
1795  m_out->Print( 0, "\n" );
1796 }
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 1912 of file sch_legacy_plugin.cpp.

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

Referenced by Format().

1913 {
1914  wxCHECK_RET( aJunction != NULL, "SCH_JUNCTION* is NULL" );
1915 
1916  m_out->Print( 0, "Connection ~ %-4d %-4d\n",
1917  aJunction->GetPosition().x, aJunction->GetPosition().y );
1918 }
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 3577 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().

3578 {
3579  if( !m_cache )
3580  m_cache = new SCH_LEGACY_PLUGIN_CACHE( aLibraryPath );
3581 
3582  wxString oldFileName = m_cache->GetFileName();
3583 
3584  if( !m_cache->IsFile( aLibraryPath ) )
3585  {
3586  m_cache->SetFileName( aLibraryPath );
3587  }
3588 
3589  // This is a forced save.
3590  m_cache->SetModified();
3591  m_cache->Save( writeDocFile( aProperties ) );
3592  m_cache->SetFileName( oldFileName );
3593 }
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 1945 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().

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

Definition at line 1921 of file sch_legacy_plugin.cpp.

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

Referenced by Format().

1922 {
1923  wxCHECK_RET( aNoConnect != NULL, "SCH_NOCONNECT* is NULL" );
1924 
1925  m_out->Print( 0, "NoConn ~ %-4d %-4d\n", aNoConnect->GetPosition().x,
1926  aNoConnect->GetPosition().y );
1927 }
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 1837 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().

1838 {
1839  wxCHECK_RET( aSheet != NULL, "SCH_SHEET* is NULL" );
1840 
1841  m_out->Print( 0, "$Sheet\n" );
1842  m_out->Print( 0, "S %-4d %-4d %-4d %-4d\n",
1843  aSheet->GetPosition().x, aSheet->GetPosition().y,
1844  aSheet->GetSize().x, aSheet->GetSize().y );
1845 
1846  m_out->Print( 0, "U %8.8lX\n", (unsigned long) aSheet->GetTimeStamp() );
1847 
1848  if( !aSheet->GetName().IsEmpty() )
1849  m_out->Print( 0, "F0 %s %d\n", EscapedUTF8( aSheet->GetName() ).c_str(),
1850  aSheet->GetSheetNameSize() );
1851 
1852  if( !aSheet->GetFileName().IsEmpty() )
1853  m_out->Print( 0, "F1 %s %d\n", EscapedUTF8( aSheet->GetFileName() ).c_str(),
1854  aSheet->GetFileNameSize() );
1855 
1856  for( const SCH_SHEET_PIN& pin : aSheet->GetPins() )
1857  {
1858  int type, side;
1859 
1860  if( pin.GetText().IsEmpty() )
1861  break;
1862 
1863  switch( pin.GetEdge() )
1864  {
1865  default:
1867  side = 'L';
1868  break;
1869 
1871  side = 'R';
1872  break;
1873 
1875  side = 'T';
1876  break;
1877 
1879  side = 'B';
1880  break;
1881  }
1882 
1883  switch( pin.GetShape() )
1884  {
1885  case NET_INPUT:
1886  type = 'I'; break;
1887 
1888  case NET_OUTPUT:
1889  type = 'O'; break;
1890 
1891  case NET_BIDI:
1892  type = 'B'; break;
1893 
1894  case NET_TRISTATE:
1895  type = 'T'; break;
1896 
1897  default:
1898  case NET_UNSPECIFIED:
1899  type = 'U'; break;
1900  }
1901 
1902  m_out->Print( 0, "F%d %s %c %c %-3d %-3d %-3d\n", pin.GetNumber(),
1903  EscapedUTF8( pin.GetText() ).c_str(), // supplies wrapping quotes
1904  type, side, pin.GetPosition().x, pin.GetPosition().y,
1905  pin.GetTextWidth() );
1906  }
1907 
1908  m_out->Print( 0, "$EndSheet\n" );
1909 }
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 3487 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().

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

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

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

References PropNoDocFile.

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

3396 {
3397  std::string propName( SCH_LEGACY_PLUGIN::PropNoDocFile );
3398 
3399  if( aProperties && aProperties->find( propName ) != aProperties->end() )
3400  return false;
3401 
3402  return true;
3403 }
static const char * PropNoDocFile
const char* PropBuffering

Member Data Documentation

wxString SCH_LEGACY_PLUGIN::m_error
protected

For throwing exceptions.

Definition at line 157 of file sch_legacy_plugin.h.

Referenced by loadHeader().

KIWAY* SCH_LEGACY_PLUGIN::m_kiway
protected

Required for path to legacy component libraries.

Definition at line 160 of file sch_legacy_plugin.h.

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

FILE_OUTPUTFORMATTER* SCH_LEGACY_PLUGIN::m_out
protected

The output formatter for saving SCH_SCREEN objects.

Definition at line 162 of file sch_legacy_plugin.h.

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

wxString SCH_LEGACY_PLUGIN::m_path
protected

Root project path for loading child sheets.

Definition at line 158 of file sch_legacy_plugin.h.

Referenced by Load(), and loadHierarchy().

const PROPERTIES* SCH_LEGACY_PLUGIN::m_props
protected

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

Definition at line 159 of file sch_legacy_plugin.h.

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

SCH_SHEET* SCH_LEGACY_PLUGIN::m_rootSheet
protected

The root sheet of the schematic being loaded..

Definition at line 161 of file sch_legacy_plugin.h.

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

int SCH_LEGACY_PLUGIN::m_version
protected

Version of file being loaded.

Definition at line 156 of file sch_legacy_plugin.h.

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

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

const char* PropBuffering

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

Definition at line 85 of file sch_legacy_plugin.h.

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

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

const char* PropBuffering

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

Definition at line 93 of file sch_legacy_plugin.h.

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


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