KiCad PCB EDA Suite
SCH_SEXPR_PLUGIN Class Reference

A SCH_PLUGIN derivation for loading schematic files using the new s-expression file format. More...

#include <sch_sexpr_plugin.h>

Inheritance diagram for SCH_SEXPR_PLUGIN:
SCH_PLUGIN

Public Member Functions

 SCH_SEXPR_PLUGIN ()
 
virtual ~SCH_SEXPR_PLUGIN ()
 
const wxString GetName () const override
 Return a brief hard coded name for this SCH_PLUGIN. More...
 
const wxString GetFileExtension () const override
 Return the file extension for the SCH_PLUGIN. More...
 
const wxString GetLibraryFileExtension () const override
 Return the library file extension for the SCH_PLUGIN object. More...
 
void SetProgressReporter (PROGRESS_REPORTER *aReporter) override
 Set an optional progress reporter. More...
 
int GetModifyHash () const override
 Return the modification hash from the library cache. More...
 
SCH_SHEETLoad (const wxString &aFileName, SCHEMATIC *aSchematic, SCH_SHEET *aAppendToMe=nullptr, const STRING_UTF8_MAP *aProperties=nullptr) override
 Load information from some input file format that this SCH_PLUGIN implementation knows about, into either a new SCH_SHEET or an existing one. More...
 
void LoadContent (LINE_READER &aReader, SCH_SHEET *aSheet, int aVersion=SEXPR_SCHEMATIC_FILE_VERSION)
 
void Save (const wxString &aFileName, SCH_SHEET *aSheet, SCHEMATIC *aSchematic, const STRING_UTF8_MAP *aProperties=nullptr) override
 Write aSchematic to a storage file in a format that this SCH_PLUGIN implementation knows about, or it can be used to write a portion of aSchematic to a special kind of export file. More...
 
void Format (SCH_SHEET *aSheet)
 
void Format (EE_SELECTION *aSelection, SCH_SHEET_PATH *aSelectionPath, SCHEMATIC &aSchematic, OUTPUTFORMATTER *aFormatter, bool aForClipboard)
 
void EnumerateSymbolLib (wxArrayString &aSymbolNameList, const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
 Populate a list of LIB_SYMBOL alias names contained within the library aLibraryPath. More...
 
void EnumerateSymbolLib (std::vector< LIB_SYMBOL * > &aSymbolList, const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
 Populate a list of LIB_SYMBOL aliases contained within the library aLibraryPath. More...
 
LIB_SYMBOLLoadSymbol (const wxString &aLibraryPath, const wxString &aAliasName, const STRING_UTF8_MAP *aProperties=nullptr) override
 Load a LIB_SYMBOL object having aPartName from the aLibraryPath containing a library format that this SCH_PLUGIN knows about. More...
 
void SaveSymbol (const wxString &aLibraryPath, const LIB_SYMBOL *aSymbol, const STRING_UTF8_MAP *aProperties=nullptr) override
 Write aSymbol to an existing library located at aLibraryPath. More...
 
void DeleteSymbol (const wxString &aLibraryPath, const wxString &aSymbolName, const STRING_UTF8_MAP *aProperties=nullptr) override
 Delete the entire LIB_SYMBOL associated with aAliasName from the library aLibraryPath. More...
 
void CreateSymbolLib (const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
 Create a new empty symbol library at aLibraryPath. More...
 
bool DeleteSymbolLib (const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
 Delete an existing symbol library and returns true if successful, or if library does not exist returns false, or throws an exception if library exists but is read only or cannot be deleted for some other reason. More...
 
void SaveLibrary (const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
 
bool CheckHeader (const wxString &aFileName) override
 Return true if the first line in aFileName begins with the expected header. More...
 
bool IsSymbolLibWritable (const wxString &aLibraryPath) override
 Return true if the library at aLibraryPath is writable. More...
 
void GetAvailableSymbolFields (std::vector< wxString > &aNames) override
 Retrieves a list of (custom) field names that are present on symbols in this library. More...
 
void GetDefaultSymbolFields (std::vector< wxString > &aNames) override
 Retrieves a list of (custom) field names that should be shown by default for this library in the symbol chooser. More...
 
const wxString & GetError () const override
 Return an error string to the caller. More...
 
virtual void SetReporter (REPORTER *aReporter)
 Set an optional reporter for warnings/errors. More...
 
virtual void SymbolLibOptions (STRING_UTF8_MAP *aListToAppendTo) const
 Append supported SCH_PLUGIN options to aListToAppenTo along with internationalized descriptions. More...
 
virtual bool SupportsSubLibraries () const
 
virtual void GetSubLibraryNames (std::vector< wxString > &aNames)
 Retrieves a list of sub-libraries in this library. More...
 
virtual void SetLibTable (SYMBOL_LIB_TABLE *aTable)
 Some library plugins need to have access to their parent library table. More...
 

Static Public Member Functions

static LIB_SYMBOLParseLibSymbol (LINE_READER &aReader, int aVersion=SEXPR_SCHEMATIC_FILE_VERSION)
 
static void FormatLibSymbol (LIB_SYMBOL *aPart, OUTPUTFORMATTER &aFormatter)
 

Static Public Attributes

static const char * PropBuffering = "buffering"
 The property used internally by the plugin to enable cache buffering which prevents the library file from being written every time the cache is changed. More...
 

Protected Member Functions

void init (SCHEMATIC *aSchematic, const STRING_UTF8_MAP *aProperties=nullptr)
 initialize PLUGIN like a constructor would. More...
 

Protected Attributes

int m_version
 Version of file being loaded. More...
 
int m_nextFreeFieldId
 
bool m_appending
 Schematic load append status. More...
 
wxString m_error
 For throwing exceptions or errors on partial loads. More...
 
PROGRESS_REPORTERm_progressReporter
 
wxString m_path
 Root project path for loading child sheets. More...
 
std::stack< wxString > m_currentPath
 Stack to maintain nested sheet paths. More...
 
SCH_SHEETm_rootSheet
 The root sheet of the schematic being loaded. More...
 
SCH_SHEET_PATH m_currentSheetPath
 
SCHEMATICm_schematic
 
OUTPUTFORMATTERm_out
 The formatter for saving SCH_SCREEN objects. More...
 
SCH_SEXPR_PLUGIN_CACHEm_cache
 

Private Member Functions

void loadHierarchy (const SCH_SHEET_PATH &aParentSheetPath, SCH_SHEET *aSheet)
 
void loadFile (const wxString &aFileName, SCH_SHEET *aSheet)
 
void saveSymbol (SCH_SYMBOL *aSymbol, const SCHEMATIC &aSchematic, int aNestLevel, bool aForClipboard)
 
void saveField (SCH_FIELD *aField, int aNestLevel)
 
void saveBitmap (SCH_BITMAP *aBitmap, int aNestLevel)
 
void saveSheet (SCH_SHEET *aSheet, int aNestLevel)
 
void saveJunction (SCH_JUNCTION *aJunction, int aNestLevel)
 
void saveNoConnect (SCH_NO_CONNECT *aNoConnect, int aNestLevel)
 
void saveBusEntry (SCH_BUS_ENTRY_BASE *aBusEntry, int aNestLevel)
 
void saveLine (SCH_LINE *aLine, int aNestLevel)
 
void saveShape (SCH_SHAPE *aShape, int aNestLevel)
 
void saveText (SCH_TEXT *aText, int aNestLevel)
 
void saveTextBox (SCH_TEXTBOX *aText, int aNestLevel)
 
void saveBusAlias (std::shared_ptr< BUS_ALIAS > aAlias, int aNestLevel)
 
void saveInstances (const std::vector< SCH_SHEET_INSTANCE > &aSheets, int aNestLevel)
 
void cacheLib (const wxString &aLibraryFileName, const STRING_UTF8_MAP *aProperties)
 
bool isBuffering (const STRING_UTF8_MAP *aProperties)
 

Detailed Description

A SCH_PLUGIN derivation for loading schematic files using the new s-expression file format.

As with all SCH_PLUGINs there is no UI dependencies i.e. windowing calls allowed.

Definition at line 62 of file sch_sexpr_plugin.h.

Constructor & Destructor Documentation

◆ SCH_SEXPR_PLUGIN()

SCH_SEXPR_PLUGIN::SCH_SEXPR_PLUGIN ( )

Definition at line 75 of file sch_sexpr_plugin.cpp.

75 :
76 m_progressReporter( nullptr )
77{
78 init( nullptr );
79}
PROGRESS_REPORTER * m_progressReporter
void init(SCHEMATIC *aSchematic, const STRING_UTF8_MAP *aProperties=nullptr)
initialize PLUGIN like a constructor would.

References init().

◆ ~SCH_SEXPR_PLUGIN()

SCH_SEXPR_PLUGIN::~SCH_SEXPR_PLUGIN ( )
virtual

Definition at line 82 of file sch_sexpr_plugin.cpp.

83{
84 delete m_cache;
85}
SCH_SEXPR_PLUGIN_CACHE * m_cache

References m_cache.

Member Function Documentation

◆ cacheLib()

void SCH_SEXPR_PLUGIN::cacheLib ( const wxString &  aLibraryFileName,
const STRING_UTF8_MAP aProperties 
)
private

Definition at line 1408 of file sch_sexpr_plugin.cpp.

1410{
1411 if( !m_cache || !m_cache->IsFile( aLibraryFileName ) || m_cache->IsFileChanged() )
1412 {
1413 // a spectacular episode in memory management:
1414 delete m_cache;
1415 m_cache = new SCH_SEXPR_PLUGIN_CACHE( aLibraryFileName );
1416
1417 if( !isBuffering( aProperties ) )
1418 m_cache->Load();
1419 }
1420}
bool IsFile(const wxString &aFullPathAndFileName) const
A cache assistant for the KiCad s-expression symbol libraries.
bool isBuffering(const STRING_UTF8_MAP *aProperties)

References isBuffering(), SCH_LIB_PLUGIN_CACHE::IsFile(), SCH_LIB_PLUGIN_CACHE::IsFileChanged(), SCH_SEXPR_PLUGIN_CACHE::Load(), and m_cache.

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

◆ CheckHeader()

bool SCH_SEXPR_PLUGIN::CheckHeader ( const wxString &  aFileName)
overridevirtual

Return true if the first line in aFileName begins with the expected header.

Parameters
aFileNameis the name of the file to use as input

Reimplemented from SCH_PLUGIN.

Definition at line 1589 of file sch_sexpr_plugin.cpp.

1590{
1591 // Open file and check first line
1592 wxTextFile tempFile;
1593
1594 tempFile.Open( aFileName );
1595 wxString firstline;
1596 // read the first line
1597 firstline = tempFile.GetFirstLine();
1598 tempFile.Close();
1599
1600 return firstline.StartsWith( wxS( "EESchema" ) );
1601}

◆ CreateSymbolLib()

void SCH_SEXPR_PLUGIN::CreateSymbolLib ( const wxString &  aLibraryPath,
const STRING_UTF8_MAP aProperties = nullptr 
)
overridevirtual

Create a new empty symbol library at aLibraryPath.

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

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

Reimplemented from SCH_PLUGIN.

Definition at line 1525 of file sch_sexpr_plugin.cpp.

1527{
1528 if( wxFileExists( aLibraryPath ) )
1529 {
1530 THROW_IO_ERROR( wxString::Format( _( "Symbol library '%s' already exists." ),
1531 aLibraryPath.GetData() ) );
1532 }
1533
1534 LOCALE_IO toggle;
1535
1536 delete m_cache;
1537 m_cache = new SCH_SEXPR_PLUGIN_CACHE( aLibraryPath );
1539 m_cache->Save();
1540 m_cache->Load(); // update m_writable and m_mod_time
1541}
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: locale_io.h:41
void SetModified(bool aModified=true)
void Save(const std::optional< bool > &aOpt=std::nullopt) override
Save the entire library to file m_libFileName;.
#define _(s)
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200

References _, Format(), SCH_SEXPR_PLUGIN_CACHE::Load(), m_cache, SCH_SEXPR_PLUGIN_CACHE::Save(), SCH_LIB_PLUGIN_CACHE::SetModified(), and THROW_IO_ERROR.

◆ DeleteSymbol()

void SCH_SEXPR_PLUGIN::DeleteSymbol ( const wxString &  aLibraryPath,
const wxString &  aSymbolName,
const STRING_UTF8_MAP aProperties = nullptr 
)
overridevirtual

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

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several symbols.
aSymbolNameis the name of a LIB_SYMBOL associated with it's root LIB_SYMBOL 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 1511 of file sch_sexpr_plugin.cpp.

1513{
1514 LOCALE_IO toggle; // toggles on, then off, the C locale.
1515
1516 cacheLib( aLibraryPath, aProperties );
1517
1518 m_cache->DeleteSymbol( aSymbolName );
1519
1520 if( !isBuffering( aProperties ) )
1521 m_cache->Save();
1522}
void DeleteSymbol(const wxString &aName) override
void cacheLib(const wxString &aLibraryFileName, const STRING_UTF8_MAP *aProperties)

References cacheLib(), SCH_SEXPR_PLUGIN_CACHE::DeleteSymbol(), isBuffering(), m_cache, and SCH_SEXPR_PLUGIN_CACHE::Save().

◆ DeleteSymbolLib()

bool SCH_SEXPR_PLUGIN::DeleteSymbolLib ( const wxString &  aLibraryPath,
const STRING_UTF8_MAP aProperties = nullptr 
)
overridevirtual

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

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

Reimplemented from SCH_PLUGIN.

Definition at line 1544 of file sch_sexpr_plugin.cpp.

1546{
1547 wxFileName fn = aLibraryPath;
1548
1549 if( !fn.FileExists() )
1550 return false;
1551
1552 // Some of the more elaborate wxRemoveFile() crap puts up its own wxLog dialog
1553 // we don't want that. we want bare metal portability with no UI here.
1554 if( wxRemove( aLibraryPath ) )
1555 {
1556 THROW_IO_ERROR( wxString::Format( _( "Symbol library '%s' cannot be deleted." ),
1557 aLibraryPath.GetData() ) );
1558 }
1559
1560 if( m_cache && m_cache->IsFile( aLibraryPath ) )
1561 {
1562 delete m_cache;
1563 m_cache = nullptr;
1564 }
1565
1566 return true;
1567}

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

◆ EnumerateSymbolLib() [1/2]

void SCH_SEXPR_PLUGIN::EnumerateSymbolLib ( std::vector< LIB_SYMBOL * > &  aSymbolList,
const wxString &  aLibraryPath,
const STRING_UTF8_MAP aProperties = nullptr 
)
overridevirtual

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

Note
It is the responsibility of the caller to delete the returned object from the heap. Failure to do this will result in memory leaks.
Parameters
aSymbolListis an array to populate with the LIB_SYMBOL pointers associated with the library.
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing one or more LIB_SYMBOL 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 1460 of file sch_sexpr_plugin.cpp.

1463{
1464 LOCALE_IO toggle; // toggles on, then off, the C locale.
1465
1466 bool powerSymbolsOnly = ( aProperties &&
1467 aProperties->find( SYMBOL_LIB_TABLE::PropPowerSymsOnly ) != aProperties->end() );
1468
1469 cacheLib( aLibraryPath, aProperties );
1470
1471 const LIB_SYMBOL_MAP& symbols = m_cache->m_symbols;
1472
1473 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
1474 {
1475 if( !powerSymbolsOnly || it->second->IsPower() )
1476 aSymbolList.push_back( it->second );
1477 }
1478}
static const char * PropPowerSymsOnly
std::map< wxString, LIB_SYMBOL *, LibSymbolMapSort > LIB_SYMBOL_MAP

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

◆ EnumerateSymbolLib() [2/2]

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

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

Parameters
aSymbolNameListis an array to populate with the LIB_SYMBOL names associated with the library.
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing one or more LIB_SYMBOL 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 1439 of file sch_sexpr_plugin.cpp.

1442{
1443 LOCALE_IO toggle; // toggles on, then off, the C locale.
1444
1445 bool powerSymbolsOnly = ( aProperties &&
1446 aProperties->find( SYMBOL_LIB_TABLE::PropPowerSymsOnly ) != aProperties->end() );
1447
1448 cacheLib( aLibraryPath, aProperties );
1449
1450 const LIB_SYMBOL_MAP& symbols = m_cache->m_symbols;
1451
1452 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
1453 {
1454 if( !powerSymbolsOnly || it->second->IsPower() )
1455 aSymbolNameList.Add( it->first );
1456 }
1457}

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

◆ Format() [1/2]

void SCH_SEXPR_PLUGIN::Format ( EE_SELECTION aSelection,
SCH_SHEET_PATH aSelectionPath,
SCHEMATIC aSchematic,
OUTPUTFORMATTER aFormatter,
bool  aForClipboard 
)

Definition at line 498 of file sch_sexpr_plugin.cpp.

501{
502 wxCHECK( aSelection && aSelectionPath && aFormatter, /* void */ );
503
504 LOCALE_IO toggle;
505 SCH_SHEET_LIST fullHierarchy = aSchematic.GetSheets();
506
507 m_schematic = &aSchematic;
508 m_out = aFormatter;
509
510 size_t i;
511 SCH_ITEM* item;
512 std::map<wxString, LIB_SYMBOL*> libSymbols;
513 SCH_SCREEN* screen = aSelection->GetScreen();
514
515 for( i = 0; i < aSelection->GetSize(); ++i )
516 {
517 item = dynamic_cast<SCH_ITEM*>( aSelection->GetItem( i ) );
518
519 wxCHECK2( item, continue );
520
521 if( item->Type() != SCH_SYMBOL_T )
522 continue;
523
524 SCH_SYMBOL* symbol = dynamic_cast<SCH_SYMBOL*>( item );
525
526 wxCHECK2( symbol, continue );
527
528 wxString libSymbolLookup = symbol->GetLibId().Format().wx_str();
529
530 if( !symbol->UseLibIdLookup() )
531 libSymbolLookup = symbol->GetSchSymbolLibraryName();
532
533 auto it = screen->GetLibSymbols().find( libSymbolLookup );
534
535 if( it != screen->GetLibSymbols().end() )
536 libSymbols[ libSymbolLookup ] = it->second;
537 }
538
539 if( !libSymbols.empty() )
540 {
541 m_out->Print( 0, "(lib_symbols\n" );
542
543 for( const std::pair<const wxString, LIB_SYMBOL*>& libSymbol : libSymbols )
544 SCH_SEXPR_PLUGIN_CACHE::SaveSymbol( libSymbol.second, *m_out, 1, libSymbol.first );
545
546 m_out->Print( 0, ")\n\n" );
547 }
548
549 // Store the selected sheets instance information
550 SCH_SHEET_LIST selectedSheets;
551 SCH_REFERENCE_LIST selectedSymbols;
552
553 for( i = 0; i < aSelection->GetSize(); ++i )
554 {
555 item = (SCH_ITEM*) aSelection->GetItem( i );
556
557 switch( item->Type() )
558 {
559 case SCH_SYMBOL_T:
560 saveSymbol( static_cast<SCH_SYMBOL*>( item ), aSchematic, 0, aForClipboard );
561
562 aSelectionPath->AppendSymbol( selectedSymbols, static_cast<SCH_SYMBOL*>( item ),
563 true, true );
564 break;
565
566 case SCH_BITMAP_T:
567 saveBitmap( static_cast< SCH_BITMAP* >( item ), 0 );
568 break;
569
570 case SCH_SHEET_T:
571 saveSheet( static_cast< SCH_SHEET* >( item ), 0 );
572
573 {
574 SCH_SHEET_PATH subSheetPath = *aSelectionPath;
575 subSheetPath.push_back( static_cast<SCH_SHEET*>( item ) );
576
577 fullHierarchy.GetSheetsWithinPath( selectedSheets, subSheetPath );
578 fullHierarchy.GetSymbolsWithinPath( selectedSymbols, subSheetPath, true, true );
579 }
580
581 break;
582
583 case SCH_JUNCTION_T:
584 saveJunction( static_cast< SCH_JUNCTION* >( item ), 0 );
585 break;
586
587 case SCH_NO_CONNECT_T:
588 saveNoConnect( static_cast< SCH_NO_CONNECT* >( item ), 0 );
589 break;
590
593 saveBusEntry( static_cast< SCH_BUS_ENTRY_BASE* >( item ), 0 );
594 break;
595
596 case SCH_LINE_T:
597 saveLine( static_cast< SCH_LINE* >( item ), 0 );
598 break;
599
600 case SCH_SHAPE_T:
601 saveShape( static_cast<SCH_SHAPE*>( item ), 0 );
602 break;
603
604 case SCH_TEXT_T:
605 case SCH_LABEL_T:
607 case SCH_HIER_LABEL_T:
609 saveText( static_cast<SCH_TEXT*>( item ), 0 );
610 break;
611
612 case SCH_TEXTBOX_T:
613 saveTextBox( static_cast<SCH_TEXTBOX*>( item ), 0 );
614 break;
615
616 default:
617 wxASSERT( "Unexpected schematic object type in SCH_SEXPR_PLUGIN::Format()" );
618 }
619 }
620
621 // Make all instance information relative to the selection path
622 KIID_PATH selectionPath = aSelectionPath->Path();
623
624 selectedSheets.SortByPageNumbers();
625 std::vector<SCH_SHEET_INSTANCE> sheetinstances = selectedSheets.GetSheetInstances();
626
627 for( SCH_SHEET_INSTANCE& sheetInstance : sheetinstances )
628 {
629 wxASSERT_MSG( sheetInstance.m_Path.MakeRelativeTo( selectionPath ),
630 "Sheet is not inside the selection path?" );
631 }
632
633 selectionPath = aSelectionPath->Path();
634 selectedSymbols.SortByReferenceOnly();
635 std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = selectedSymbols.GetSymbolInstances();
636
637 for( SCH_SYMBOL_INSTANCE& symbolInstance : symbolInstances )
638 {
639 wxASSERT_MSG( symbolInstance.m_Path.MakeRelativeTo( selectionPath ),
640 "Symbol is not inside the selection path?" );
641 }
642}
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:97
SCH_SCREEN * GetScreen()
Definition: ee_selection.h:52
UTF8 Format() const
Definition: lib_id.cpp:117
int PRINTF_FUNC Print(int nestLevel, const char *fmt,...)
Format and write text to the output stream.
Definition: richio.cpp:433
SCH_SHEET_LIST GetSheets() const override
Builds and returns an updated schematic hierarchy TODO: can this be cached?
Definition: schematic.h:86
Object to handle a bitmap image that can be inserted in a schematic.
Definition: sch_bitmap.h:41
Base class for a bus or wire entry.
Definition: sch_bus_entry.h:38
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:147
Segment description base class to describe items which have 2 end points (track, wire,...
Definition: sch_line.h:40
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
void SortByReferenceOnly()
Sort the list of references by reference.
std::vector< SCH_SYMBOL_INSTANCE > GetSymbolInstances() const
std::map< wxString, LIB_SYMBOL * > & GetLibSymbols()
Fetch a list of unique LIB_SYMBOL object pointers required to properly render each SCH_SYMBOL in this...
Definition: sch_screen.h:481
static void SaveSymbol(LIB_SYMBOL *aSymbol, OUTPUTFORMATTER &aFormatter, int aNestLevel=0, const wxString &aLibName=wxEmptyString)
void saveTextBox(SCH_TEXTBOX *aText, int aNestLevel)
SCHEMATIC * m_schematic
OUTPUTFORMATTER * m_out
The formatter for saving SCH_SCREEN objects.
void saveLine(SCH_LINE *aLine, int aNestLevel)
void saveText(SCH_TEXT *aText, int aNestLevel)
void saveSymbol(SCH_SYMBOL *aSymbol, const SCHEMATIC &aSchematic, int aNestLevel, bool aForClipboard)
void saveSheet(SCH_SHEET *aSheet, int aNestLevel)
void saveShape(SCH_SHAPE *aShape, int aNestLevel)
void saveBitmap(SCH_BITMAP *aBitmap, int aNestLevel)
void saveBusEntry(SCH_BUS_ENTRY_BASE *aBusEntry, int aNestLevel)
void saveNoConnect(SCH_NO_CONNECT *aNoConnect, int aNestLevel)
void saveJunction(SCH_JUNCTION *aJunction, int aNestLevel)
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
void SortByPageNumbers(bool aUpdateVirtualPageNums=true)
Sort the list of sheets by page number.
std::vector< SCH_SHEET_INSTANCE > GetSheetInstances() const
Fetch the instance information for all of the sheets in the hiearchy.
void GetSymbolsWithinPath(SCH_REFERENCE_LIST &aReferences, const SCH_SHEET_PATH &aSheetPath, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanSymbols=false) const
Add a SCH_REFERENCE object to aReferences for each symbol in the list of sheets that are contained wi...
void GetSheetsWithinPath(SCH_SHEET_PATHS &aSheets, const SCH_SHEET_PATH &aSheetPath) const
Add a SCH_SHEET_PATH object to aSheets for each sheet in the list that are contained within aSheetPat...
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
void AppendSymbol(SCH_REFERENCE_LIST &aReferences, SCH_SYMBOL *aSymbol, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanSymbols=false) const
Append a SCH_REFERENCE object to aReferences based on aSymbol.
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:57
Schematic symbol object.
Definition: sch_symbol.h:81
bool UseLibIdLookup() const
Definition: sch_symbol.h:190
wxString GetSchSymbolLibraryName() const
Definition: sch_symbol.cpp:294
const LIB_ID & GetLibId() const
Definition: sch_symbol.h:175
virtual KIGFX::VIEW_ITEM * GetItem(unsigned int aIdx) const override
Definition: selection.cpp:75
virtual unsigned int GetSize() const override
Return the number of stored items.
Definition: selection.h:99
wxString wx_str() const
Definition: utf8.cpp:46
A simple container for sheet instance information.
A simple container for schematic symbol instance information.
@ SCH_LINE_T
Definition: typeinfo.h:146
@ SCH_NO_CONNECT_T
Definition: typeinfo.h:143
@ SCH_SYMBOL_T
Definition: typeinfo.h:156
@ SCH_DIRECTIVE_LABEL_T
Definition: typeinfo.h:154
@ SCH_LABEL_T
Definition: typeinfo.h:151
@ SCH_SHEET_T
Definition: typeinfo.h:158
@ SCH_SHAPE_T
Definition: typeinfo.h:147
@ SCH_HIER_LABEL_T
Definition: typeinfo.h:153
@ SCH_BUS_BUS_ENTRY_T
Definition: typeinfo.h:145
@ SCH_TEXT_T
Definition: typeinfo.h:150
@ SCH_BUS_WIRE_ENTRY_T
Definition: typeinfo.h:144
@ SCH_BITMAP_T
Definition: typeinfo.h:148
@ SCH_TEXTBOX_T
Definition: typeinfo.h:149
@ SCH_GLOBAL_LABEL_T
Definition: typeinfo.h:152
@ SCH_JUNCTION_T
Definition: typeinfo.h:142

References SCH_SHEET_PATH::AppendSymbol(), LIB_ID::Format(), SELECTION::GetItem(), SCH_SYMBOL::GetLibId(), SCH_SCREEN::GetLibSymbols(), SCH_SYMBOL::GetSchSymbolLibraryName(), EE_SELECTION::GetScreen(), SCH_SHEET_LIST::GetSheetInstances(), SCHEMATIC::GetSheets(), SCH_SHEET_LIST::GetSheetsWithinPath(), SELECTION::GetSize(), SCH_REFERENCE_LIST::GetSymbolInstances(), SCH_SHEET_LIST::GetSymbolsWithinPath(), m_out, m_schematic, SCH_SHEET_PATH::Path(), OUTPUTFORMATTER::Print(), SCH_SHEET_PATH::push_back(), saveBitmap(), saveBusEntry(), saveJunction(), saveLine(), saveNoConnect(), saveShape(), saveSheet(), SCH_SEXPR_PLUGIN_CACHE::SaveSymbol(), saveSymbol(), saveText(), saveTextBox(), SCH_BITMAP_T, SCH_BUS_BUS_ENTRY_T, SCH_BUS_WIRE_ENTRY_T, SCH_DIRECTIVE_LABEL_T, SCH_GLOBAL_LABEL_T, SCH_HIER_LABEL_T, SCH_JUNCTION_T, SCH_LABEL_T, SCH_LINE_T, SCH_NO_CONNECT_T, SCH_SHAPE_T, SCH_SHEET_T, SCH_SYMBOL_T, SCH_TEXT_T, SCH_TEXTBOX_T, SCH_SHEET_LIST::SortByPageNumbers(), SCH_REFERENCE_LIST::SortByReferenceOnly(), EDA_ITEM::Type(), SCH_SYMBOL::UseLibIdLookup(), and UTF8::wx_str().

◆ Format() [2/2]

void SCH_SEXPR_PLUGIN::Format ( SCH_SHEET aSheet)

Definition at line 358 of file sch_sexpr_plugin.cpp.

359{
360 wxCHECK_RET( aSheet != nullptr, "NULL SCH_SHEET* object." );
361 wxCHECK_RET( m_schematic != nullptr, "NULL SCHEMATIC* object." );
362
363 SCH_SCREEN* screen = aSheet->GetScreen();
364
365 wxCHECK( screen, /* void */ );
366
367 m_out->Print( 0, "(kicad_sch (version %d) (generator eeschema)\n\n",
369
370 m_out->Print( 1, "(uuid %s)\n\n", TO_UTF8( screen->m_uuid.AsString() ) );
371
372 screen->GetPageSettings().Format( m_out, 1, 0 );
373 m_out->Print( 0, "\n" );
374 screen->GetTitleBlock().Format( m_out, 1, 0 );
375
376 // Save cache library.
377 m_out->Print( 1, "(lib_symbols\n" );
378
379 for( std::pair<const wxString, LIB_SYMBOL*>& libSymbol : screen->GetLibSymbols() )
380 SCH_SEXPR_PLUGIN_CACHE::SaveSymbol( libSymbol.second, *m_out, 2, libSymbol.first );
381
382 m_out->Print( 1, ")\n\n" );
383
384 for( const std::shared_ptr<BUS_ALIAS>& alias : screen->GetBusAliases() )
385 saveBusAlias( alias, 1 );
386
387 // Enforce item ordering
388 auto cmp =
389 []( const SCH_ITEM* a, const SCH_ITEM* b )
390 {
391 if( a->Type() != b->Type() )
392 return a->Type() < b->Type();
393
394 return a->m_Uuid < b->m_Uuid;
395 };
396
397 std::multiset<SCH_ITEM*, decltype( cmp )> save_map( cmp );
398
399 for( SCH_ITEM* item : screen->Items() )
400 save_map.insert( item );
401
402 KICAD_T itemType = TYPE_NOT_INIT;
404
405 for( SCH_ITEM* item : save_map )
406 {
407 if( itemType != item->Type() )
408 {
409 itemType = item->Type();
410
411 if( itemType != SCH_SYMBOL_T
412 && itemType != SCH_JUNCTION_T
413 && itemType != SCH_SHEET_T )
414 {
415 m_out->Print( 0, "\n" );
416 }
417 }
418
419 switch( item->Type() )
420 {
421 case SCH_SYMBOL_T:
422 m_out->Print( 0, "\n" );
423 saveSymbol( static_cast<SCH_SYMBOL*>( item ), *m_schematic, 1, false );
424 break;
425
426 case SCH_BITMAP_T:
427 saveBitmap( static_cast<SCH_BITMAP*>( item ), 1 );
428 break;
429
430 case SCH_SHEET_T:
431 m_out->Print( 0, "\n" );
432 saveSheet( static_cast<SCH_SHEET*>( item ), 1 );
433 break;
434
435 case SCH_JUNCTION_T:
436 saveJunction( static_cast<SCH_JUNCTION*>( item ), 1 );
437 break;
438
439 case SCH_NO_CONNECT_T:
440 saveNoConnect( static_cast<SCH_NO_CONNECT*>( item ), 1 );
441 break;
442
445 saveBusEntry( static_cast<SCH_BUS_ENTRY_BASE*>( item ), 1 );
446 break;
447
448 case SCH_LINE_T:
449 if( layer != item->GetLayer() )
450 {
451 if( layer == SCH_LAYER_ID_START )
452 {
453 layer = item->GetLayer();
454 }
455 else
456 {
457 layer = item->GetLayer();
458 m_out->Print( 0, "\n" );
459 }
460 }
461
462 saveLine( static_cast<SCH_LINE*>( item ), 1 );
463 break;
464
465 case SCH_SHAPE_T:
466 saveShape( static_cast<SCH_SHAPE*>( item ), 1 );
467 break;
468
469 case SCH_TEXT_T:
470 case SCH_LABEL_T:
472 case SCH_HIER_LABEL_T:
474 saveText( static_cast<SCH_TEXT*>( item ), 1 );
475 break;
476
477 case SCH_TEXTBOX_T:
478 saveTextBox( static_cast<SCH_TEXTBOX*>( item ), 1 );
479 break;
480
481 default:
482 wxASSERT( "Unexpected schematic object type in SCH_SEXPR_PLUGIN::Format()" );
483 }
484 }
485
486 if( aSheet->HasRootInstance() )
487 {
488 std::vector< SCH_SHEET_INSTANCE> instances;
489
490 instances.emplace_back( aSheet->GetRootInstance() );
491 saveInstances( instances, 1 );
492 }
493
494 m_out->Print( 0, ")\n" );
495}
const KIID m_Uuid
Definition: eda_item.h:492
wxString AsString() const
Definition: kiid.cpp:257
void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Output the page class to aFormatter in s-expression form.
Definition: page_info.cpp:273
const PAGE_INFO & GetPageSettings() const
Definition: sch_screen.h:131
EE_RTREE & Items()
Gets the full RTree, usually for iterating.
Definition: sch_screen.h:109
const TITLE_BLOCK & GetTitleBlock() const
Definition: sch_screen.h:155
KIID m_uuid
A unique identifier for each schematic file.
Definition: sch_screen.h:648
std::set< std::shared_ptr< BUS_ALIAS > > GetBusAliases() const
Return a list of bus aliases defined in this screen.
Definition: sch_screen.h:511
void saveBusAlias(std::shared_ptr< BUS_ALIAS > aAlias, int aNestLevel)
void saveInstances(const std::vector< SCH_SHEET_INSTANCE > &aSheets, int aNestLevel)
bool HasRootInstance() const
Check to see if this sheet has a root sheet instance.
Definition: sch_sheet.cpp:1271
SCH_SCREEN * GetScreen() const
Definition: sch_sheet.h:106
const SCH_SHEET_INSTANCE & GetRootInstance() const
Return the root sheet instance data.
Definition: sch_sheet.cpp:1283
virtual void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Output the object to aFormatter in s-expression form.
Definition: title_block.cpp:30
SCH_LAYER_ID
Eeschema drawing layers.
Definition: layer_ids.h:341
@ SCH_LAYER_ID_START
Definition: layer_ids.h:342
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:96
#define SEXPR_SCHEMATIC_FILE_VERSION
Schematic file version.
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition: typeinfo.h:78
@ TYPE_NOT_INIT
Definition: typeinfo.h:81

References KIID::AsString(), PAGE_INFO::Format(), TITLE_BLOCK::Format(), SCH_SCREEN::GetBusAliases(), SCH_SCREEN::GetLibSymbols(), SCH_SCREEN::GetPageSettings(), SCH_SHEET::GetRootInstance(), SCH_SHEET::GetScreen(), SCH_SCREEN::GetTitleBlock(), SCH_SHEET::HasRootInstance(), SCH_SCREEN::Items(), m_out, m_schematic, SCH_SCREEN::m_uuid, EDA_ITEM::m_Uuid, OUTPUTFORMATTER::Print(), saveBitmap(), saveBusAlias(), saveBusEntry(), saveInstances(), saveJunction(), saveLine(), saveNoConnect(), saveShape(), saveSheet(), SCH_SEXPR_PLUGIN_CACHE::SaveSymbol(), saveSymbol(), saveText(), saveTextBox(), SCH_BITMAP_T, SCH_BUS_BUS_ENTRY_T, SCH_BUS_WIRE_ENTRY_T, SCH_DIRECTIVE_LABEL_T, SCH_GLOBAL_LABEL_T, SCH_HIER_LABEL_T, SCH_JUNCTION_T, SCH_LABEL_T, SCH_LAYER_ID_START, SCH_LINE_T, SCH_NO_CONNECT_T, SCH_SHAPE_T, SCH_SHEET_T, SCH_SYMBOL_T, SCH_TEXT_T, SCH_TEXTBOX_T, SEXPR_SCHEMATIC_FILE_VERSION, TO_UTF8, EDA_ITEM::Type(), and TYPE_NOT_INIT.

Referenced by SCH_EDITOR_CONTROL::doCopy(), and Save().

◆ FormatLibSymbol()

void SCH_SEXPR_PLUGIN::FormatLibSymbol ( LIB_SYMBOL aPart,
OUTPUTFORMATTER aFormatter 
)
static

Definition at line 1660 of file sch_sexpr_plugin.cpp.

1661{
1662
1663 LOCALE_IO toggle; // toggles on, then off, the C locale.
1664 SCH_SEXPR_PLUGIN_CACHE::SaveSymbol( symbol, formatter );
1665}

References SCH_SEXPR_PLUGIN_CACHE::SaveSymbol().

Referenced by SYMBOL_EDITOR_EDIT_TOOL::Copy(), and SYMBOL_EDIT_FRAME::CopySymbolToClipboard().

◆ GetAvailableSymbolFields()

void SCH_SEXPR_PLUGIN::GetAvailableSymbolFields ( std::vector< wxString > &  aNames)
overridevirtual

Retrieves a list of (custom) field names that are present on symbols in this library.

The plugin is responsible for guaranteeing that this list contains the set of unique custom field names present on any symbols contained in the library.

The required KiCad fields are not included in this list.

Parameters
aNameswill be filled with any custom fields present in this library.

Reimplemented from SCH_PLUGIN.

Definition at line 1612 of file sch_sexpr_plugin.cpp.

1613{
1614 if( !m_cache )
1615 return;
1616
1617 const LIB_SYMBOL_MAP& symbols = m_cache->m_symbols;
1618
1619 std::set<wxString> fieldNames;
1620
1621 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
1622 {
1623 std::vector<LIB_FIELD*> fields;
1624 it->second->GetFields( fields );
1625
1626 for( LIB_FIELD* field : fields )
1627 {
1628 if( field->IsMandatory() )
1629 continue;
1630
1631 // TODO(JE): enable configurability of this outside database libraries?
1632 // if( field->ShowInChooser() )
1633 fieldNames.insert( field->GetName() );
1634 }
1635 }
1636
1637 std::copy( fieldNames.begin(), fieldNames.end(), std::back_inserter( aNames ) );
1638}
Field object used in symbol libraries.
Definition: lib_field.h:61

References m_cache, and SCH_LIB_PLUGIN_CACHE::m_symbols.

Referenced by GetDefaultSymbolFields().

◆ GetDefaultSymbolFields()

void SCH_SEXPR_PLUGIN::GetDefaultSymbolFields ( std::vector< wxString > &  aNames)
overridevirtual

Retrieves a list of (custom) field names that should be shown by default for this library in the symbol chooser.

This list should be a subset of the result returned by GetAvailableSymbolFields().

The preference for which fields to hide and show for a given library is stored on a per-library basis in a user's preferences (or in the project local settings for a project- local library). The set of fields returned by GetDefaultSymbolFields() will be used if this preference is missing.

Parameters
aNameswill be filled with the custom field names that should be shown by default

Reimplemented from SCH_PLUGIN.

Definition at line 1641 of file sch_sexpr_plugin.cpp.

1642{
1643 GetAvailableSymbolFields( aNames );
1644}
void GetAvailableSymbolFields(std::vector< wxString > &aNames) override
Retrieves a list of (custom) field names that are present on symbols in this library.

References GetAvailableSymbolFields().

◆ GetError()

const wxString & SCH_SEXPR_PLUGIN::GetError ( ) const
inlineoverridevirtual

Return an error string to the caller.

This is useful for schematic loaders that can load partial schematics where throwing an exception would be problematic such as the KiCad legacy plugin.

Returns
an unformatted string containing errors if any.

Reimplemented from SCH_PLUGIN.

Definition at line 138 of file sch_sexpr_plugin.h.

138{ return m_error; }
wxString m_error
For throwing exceptions or errors on partial loads.

References m_error.

◆ GetFileExtension()

const wxString SCH_SEXPR_PLUGIN::GetFileExtension ( ) const
inlineoverridevirtual

Return the file extension for the SCH_PLUGIN.

Implements SCH_PLUGIN.

Definition at line 74 of file sch_sexpr_plugin.h.

75 {
76 return wxT( "kicad_sch" );
77 }

◆ GetLibraryFileExtension()

const wxString SCH_SEXPR_PLUGIN::GetLibraryFileExtension ( ) const
inlineoverridevirtual

Return the library file extension for the SCH_PLUGIN object.

Implements SCH_PLUGIN.

Definition at line 79 of file sch_sexpr_plugin.h.

80 {
81 return wxT( "kicad_sym" );
82 }

◆ GetModifyHash()

int SCH_SEXPR_PLUGIN::GetModifyHash ( ) const
overridevirtual

Return the modification hash from the library cache.

Note
This is temporary until the new s-expr file format is implement. The new file format will embed symbols instead of referencing them from the library. This function can be removed when the new file format is implemented.
Returns
the modification hash of the library cache.

Implements SCH_PLUGIN.

Definition at line 1429 of file sch_sexpr_plugin.cpp.

1430{
1431 if( m_cache )
1432 return m_cache->GetModifyHash();
1433
1434 // If the cache hasn't been loaded, it hasn't been modified.
1435 return 0;
1436}

References SCH_LIB_PLUGIN_CACHE::GetModifyHash(), and m_cache.

◆ GetName()

const wxString SCH_SEXPR_PLUGIN::GetName ( ) const
inlineoverridevirtual

Return a brief hard coded name for this SCH_PLUGIN.

Implements SCH_PLUGIN.

Definition at line 69 of file sch_sexpr_plugin.h.

70 {
71 return wxT( "Eeschema s-expression" );
72 }

◆ GetSubLibraryNames()

virtual void SCH_PLUGIN::GetSubLibraryNames ( std::vector< wxString > &  aNames)
inlinevirtualinherited

Retrieves a list of sub-libraries in this library.

Some types of symbol library support sub-libraries, which are a single-level organizational hierarchy that is implementation-defined per plugin. Most of KiCad ignores sub-libraries and treats the hierarchy between library and symbol as flat, but the sub-libraries are used for sorting and grouping symbols in the symbol chooser.

Has no effect if SupportsSubLibraries() returns false.

Parameters
aNameswill be filled with a list of sub-libraries within this symbol library

Reimplemented in SCH_DATABASE_PLUGIN.

Definition at line 463 of file sch_io_mgr.h.

463{}

Referenced by SYMBOL_LIB_TABLE_ROW::GetSubLibraryNames().

◆ init()

void SCH_SEXPR_PLUGIN::init ( SCHEMATIC aSchematic,
const STRING_UTF8_MAP aProperties = nullptr 
)
protected

initialize PLUGIN like a constructor would.

Definition at line 88 of file sch_sexpr_plugin.cpp.

89{
90 m_version = 0;
91 m_appending = false;
92 m_rootSheet = nullptr;
93 m_schematic = aSchematic;
94 m_cache = nullptr;
95 m_out = nullptr;
96 m_nextFreeFieldId = 100; // number arbitrarily > MANDATORY_FIELDS or SHEET_MANDATORY_FIELDS
97}
bool m_appending
Schematic load append status.
SCH_SHEET * m_rootSheet
The root sheet of the schematic being loaded.
int m_version
Version of file being loaded.

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

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

◆ isBuffering()

bool SCH_SEXPR_PLUGIN::isBuffering ( const STRING_UTF8_MAP aProperties)
private

Definition at line 1423 of file sch_sexpr_plugin.cpp.

1424{
1425 return ( aProperties && aProperties->Exists( SCH_SEXPR_PLUGIN::PropBuffering ) );
1426}
static const char * PropBuffering
The property used internally by the plugin to enable cache buffering which prevents the library file ...
bool Exists(const std::string &aProperty) const

References STRING_UTF8_MAP::Exists(), and PropBuffering.

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

◆ IsSymbolLibWritable()

bool SCH_SEXPR_PLUGIN::IsSymbolLibWritable ( const wxString &  aLibraryPath)
overridevirtual

Return true if the library at aLibraryPath is writable.

(Often system libraries are read only because of where they are installed.)

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several symbols.
Exceptions
IO_ERRORif no library at aLibraryPath exists.

Reimplemented from SCH_PLUGIN.

Definition at line 1604 of file sch_sexpr_plugin.cpp.

1605{
1606 wxFileName fn( aLibraryPath );
1607
1608 return ( fn.FileExists() && fn.IsFileWritable() ) || fn.IsDirWritable();
1609}

◆ Load()

SCH_SHEET * SCH_SEXPR_PLUGIN::Load ( const wxString &  aFileName,
SCHEMATIC aSchematic,
SCH_SHEET aAppendToMe = nullptr,
const STRING_UTF8_MAP aProperties = nullptr 
)
overridevirtual

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

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

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

Reimplemented from SCH_PLUGIN.

Definition at line 100 of file sch_sexpr_plugin.cpp.

102{
103 wxASSERT( !aFileName || aSchematic != nullptr );
104
105 LOCALE_IO toggle; // toggles on, then off, the C locale.
106 SCH_SHEET* sheet;
107
108 wxFileName fn = aFileName;
109
110 // Unfortunately child sheet file names the legacy schematic file format are not fully
111 // qualified and are always appended to the project path. The aFileName attribute must
112 // always be an absolute path so the project path can be used for load child sheet files.
113 wxASSERT( fn.IsAbsolute() );
114
115 if( aAppendToMe )
116 {
117 m_appending = true;
118 wxLogTrace( traceSchPlugin, "Append \"%s\" to sheet \"%s\".",
119 aFileName, aAppendToMe->GetFileName() );
120
121 wxFileName normedFn = aAppendToMe->GetFileName();
122
123 if( !normedFn.IsAbsolute() )
124 {
125 if( aFileName.Right( normedFn.GetFullPath().Length() ) == normedFn.GetFullPath() )
126 m_path = aFileName.Left( aFileName.Length() - normedFn.GetFullPath().Length() );
127 }
128
129 if( m_path.IsEmpty() )
130 m_path = aSchematic->Prj().GetProjectPath();
131
132 wxLogTrace( traceSchPlugin, "Normalized append path \"%s\".", m_path );
133 }
134 else
135 {
136 m_path = aSchematic->Prj().GetProjectPath();
137 }
138
139 m_currentPath.push( m_path );
140 init( aSchematic, aProperties );
141
142 if( aAppendToMe == nullptr )
143 {
144 // Clean up any allocated memory if an exception occurs loading the schematic.
145 std::unique_ptr<SCH_SHEET> newSheet = std::make_unique<SCH_SHEET>( aSchematic );
146
147 wxFileName relPath( aFileName );
148
149 // Do not use wxPATH_UNIX as option in MakeRelativeTo(). It can create incorrect
150 // relative paths on Windows, because paths have a disk identifier (C:, D: ...)
151 relPath.MakeRelativeTo( aSchematic->Prj().GetProjectPath() );
152
153 newSheet->SetFileName( relPath.GetFullPath() );
154 m_rootSheet = newSheet.get();
155 loadHierarchy( SCH_SHEET_PATH(), newSheet.get() );
156
157 // If we got here, the schematic loaded successfully.
158 sheet = newSheet.release();
159 m_rootSheet = nullptr; // Quiet Coverity warning.
160 }
161 else
162 {
163 wxCHECK_MSG( aSchematic->IsValid(), nullptr, "Can't append to a schematic with no root!" );
164 m_rootSheet = &aSchematic->Root();
165 sheet = aAppendToMe;
166 loadHierarchy( SCH_SHEET_PATH(), sheet );
167 }
168
169 wxASSERT( m_currentPath.size() == 1 ); // only the project path should remain
170
171 m_currentPath.pop(); // Clear the path stack for next call to Load
172
173 return sheet;
174}
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition: project.cpp:126
bool IsValid() const
A simple test if the schematic is loaded, not a complete one.
Definition: schematic.h:107
SCH_SHEET & Root() const
Definition: schematic.h:91
PROJECT & Prj() const override
Return a reference to the project this schematic is part of.
Definition: schematic.h:76
wxString m_path
Root project path for loading child sheets.
std::stack< wxString > m_currentPath
Stack to maintain nested sheet paths.
void loadHierarchy(const SCH_SHEET_PATH &aParentSheetPath, SCH_SHEET *aSheet)
wxString GetFileName() const
Return the filename corresponding to this sheet.
Definition: sch_sheet.h:302
const wxChar *const traceSchPlugin
Flag to enable legacy schematic plugin debug output.

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

◆ LoadContent()

void SCH_SEXPR_PLUGIN::LoadContent ( LINE_READER aReader,
SCH_SHEET aSheet,
int  aVersion = SEXPR_SCHEMATIC_FILE_VERSION 
)

Definition at line 320 of file sch_sexpr_plugin.cpp.

321{
322 wxCHECK( aSheet, /* void */ );
323
324 LOCALE_IO toggle;
325 SCH_SEXPR_PARSER parser( &aReader );
326
327 parser.ParseSchematic( aSheet, true, aFileVersion );
328}
Object to parser s-expression symbol library and schematic file formats.

References SCH_SEXPR_PARSER::ParseSchematic().

Referenced by SCH_EDITOR_CONTROL::Paste().

◆ loadFile()

void SCH_SEXPR_PLUGIN::loadFile ( const wxString &  aFileName,
SCH_SHEET aSheet 
)
private

Definition at line 295 of file sch_sexpr_plugin.cpp.

296{
297 FILE_LINE_READER reader( aFileName );
298
299 size_t lineCount = 0;
300
302 {
303 m_progressReporter->Report( wxString::Format( _( "Loading %s..." ), aFileName ) );
304
306 THROW_IO_ERROR( ( "Open cancelled by user." ) );
307
308 while( reader.ReadLine() )
309 lineCount++;
310
311 reader.Rewind();
312 }
313
314 SCH_SEXPR_PARSER parser( &reader, m_progressReporter, lineCount, m_rootSheet, m_appending );
315
316 parser.ParseSchematic( aSheet );
317}
A LINE_READER that reads from an open file.
Definition: richio.h:173
virtual bool KeepRefreshing(bool aWait=false)=0
Update the UI (if any).
virtual void Report(const wxString &aMessage)=0
Display aMessage in the progress bar dialog.

References _, Format(), PROGRESS_REPORTER::KeepRefreshing(), m_appending, m_progressReporter, m_rootSheet, SCH_SEXPR_PARSER::ParseSchematic(), FILE_LINE_READER::ReadLine(), PROGRESS_REPORTER::Report(), FILE_LINE_READER::Rewind(), and THROW_IO_ERROR.

Referenced by loadHierarchy().

◆ loadHierarchy()

void SCH_SEXPR_PLUGIN::loadHierarchy ( const SCH_SHEET_PATH aParentSheetPath,
SCH_SHEET aSheet 
)
private

Definition at line 179 of file sch_sexpr_plugin.cpp.

180{
182
183 SCH_SCREEN* screen = nullptr;
184
185 if( !aSheet->GetScreen() )
186 {
187 // SCH_SCREEN objects store the full path and file name where the SCH_SHEET object only
188 // stores the file name and extension. Add the project path to the file name and
189 // extension to compare when calling SCH_SHEET::SearchHierarchy().
190 wxFileName fileName = aSheet->GetFileName();
191
192 if( !fileName.IsAbsolute() )
193 fileName.MakeAbsolute( m_currentPath.top() );
194
195 // Save the current path so that it gets restored when descending and ascending the
196 // sheet hierarchy which allows for sheet schematic files to be nested in folders
197 // relative to the last path a schematic was loaded from.
198 wxLogTrace( traceSchPlugin, "Saving path '%s'", m_currentPath.top() );
199 m_currentPath.push( fileName.GetPath() );
200 wxLogTrace( traceSchPlugin, "Current path '%s'", m_currentPath.top() );
201 wxLogTrace( traceSchPlugin, "Loading '%s'", fileName.GetFullPath() );
202
203 SCH_SHEET_PATH ancestorSheetPath = aParentSheetPath;
204
205 while( !ancestorSheetPath.empty() )
206 {
207 if( ancestorSheetPath.LastScreen()->GetFileName() == fileName.GetFullPath() )
208 {
209 if( !m_error.IsEmpty() )
210 m_error += "\n";
211
212 m_error += wxString::Format( _( "Could not load sheet '%s' because it already "
213 "appears as a direct ancestor in the schematic "
214 "hierarchy." ),
215 fileName.GetFullPath() );
216
217 fileName = wxEmptyString;
218
219 break;
220 }
221
222 ancestorSheetPath.pop_back();
223 }
224
225 if( ancestorSheetPath.empty() )
226 {
227 // Existing schematics could be either in the root sheet path or the current sheet
228 // load path so we have to check both.
229 if( !m_rootSheet->SearchHierarchy( fileName.GetFullPath(), &screen ) )
230 m_currentSheetPath.at( 0 )->SearchHierarchy( fileName.GetFullPath(), &screen );
231 }
232
233 if( screen )
234 {
235 aSheet->SetScreen( screen );
236 aSheet->GetScreen()->SetParent( m_schematic );
237 // Do not need to load the sub-sheets - this has already been done.
238 }
239 else
240 {
241 aSheet->SetScreen( new SCH_SCREEN( m_schematic ) );
242 aSheet->GetScreen()->SetFileName( fileName.GetFullPath() );
243
244 try
245 {
246 loadFile( fileName.GetFullPath(), aSheet );
247 }
248 catch( const IO_ERROR& ioe )
249 {
250 // If there is a problem loading the root sheet, there is no recovery.
251 if( aSheet == m_rootSheet )
252 throw;
253
254 // For all subsheets, queue up the error message for the caller.
255 if( !m_error.IsEmpty() )
256 m_error += "\n";
257
258 m_error += ioe.What();
259 }
260
261 if( fileName.FileExists() )
262 {
263 aSheet->GetScreen()->SetFileReadOnly( !fileName.IsFileWritable() );
264 aSheet->GetScreen()->SetFileExists( true );
265 }
266 else
267 {
268 aSheet->GetScreen()->SetFileReadOnly( !fileName.IsDirWritable() );
269 aSheet->GetScreen()->SetFileExists( false );
270 }
271
272 SCH_SHEET_PATH currentSheetPath = aParentSheetPath;
273 currentSheetPath.push_back( aSheet );
274
275 // This was moved out of the try{} block so that any sheet definitions that
276 // the plugin fully parsed before the exception was raised will be loaded.
277 for( SCH_ITEM* aItem : aSheet->GetScreen()->Items().OfType( SCH_SHEET_T ) )
278 {
279 wxCHECK2( aItem->Type() == SCH_SHEET_T, /* do nothing */ );
280 SCH_SHEET* sheet = static_cast<SCH_SHEET*>( aItem );
281
282 // Recursion starts here.
283 loadHierarchy( currentSheetPath, sheet );
284 }
285 }
286
287 m_currentPath.pop();
288 wxLogTrace( traceSchPlugin, "Restoring path \"%s\"", m_currentPath.top() );
289 }
290
292}
virtual void SetParent(EDA_ITEM *aParent)
Definition: eda_item.h:100
EE_TYPE OfType(KICAD_T aType) const
Definition: sch_rtree.h:238
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Definition: ki_exception.h:76
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:30
const wxString & GetFileName() const
Definition: sch_screen.h:144
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
Definition: sch_screen.cpp:110
void SetFileReadOnly(bool aIsReadOnly)
Definition: sch_screen.h:146
void SetFileExists(bool aFileExists)
Definition: sch_screen.h:149
SCH_SHEET_PATH m_currentSheetPath
void loadFile(const wxString &aFileName, SCH_SHEET *aSheet)
bool empty() const
Forwarded method from std::vector.
SCH_SCREEN * LastScreen()
SCH_SHEET * at(size_t aIndex) const
Forwarded method from std::vector.
void pop_back()
Forwarded method from std::vector.
bool SearchHierarchy(const wxString &aFilename, SCH_SCREEN **aScreen)
Search the existing hierarchy for an instance of screen loaded from aFileName.
Definition: sch_sheet.cpp:723
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
Definition: sch_sheet.cpp:162

References _, SCH_SHEET_PATH::at(), SCH_SHEET_PATH::empty(), Format(), SCH_SCREEN::GetFileName(), SCH_SHEET::GetFileName(), SCH_SHEET::GetScreen(), SCH_SCREEN::Items(), SCH_SHEET_PATH::LastScreen(), loadFile(), loadHierarchy(), m_currentPath, m_currentSheetPath, m_error, m_rootSheet, m_schematic, EE_RTREE::OfType(), SCH_SHEET_PATH::pop_back(), SCH_SHEET_PATH::push_back(), SCH_SHEET_T, SCH_SHEET::SearchHierarchy(), SCH_SCREEN::SetFileExists(), SCH_SCREEN::SetFileName(), SCH_SCREEN::SetFileReadOnly(), EDA_ITEM::SetParent(), SCH_SHEET::SetScreen(), traceSchPlugin, and IO_ERROR::What().

Referenced by Load(), and loadHierarchy().

◆ LoadSymbol()

LIB_SYMBOL * SCH_SEXPR_PLUGIN::LoadSymbol ( const wxString &  aLibraryPath,
const wxString &  aPartName,
const STRING_UTF8_MAP aProperties = nullptr 
)
overridevirtual

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

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

Reimplemented from SCH_PLUGIN.

Definition at line 1481 of file sch_sexpr_plugin.cpp.

1483{
1484 LOCALE_IO toggle; // toggles on, then off, the C locale.
1485
1486 cacheLib( aLibraryPath, aProperties );
1487
1488 LIB_SYMBOL_MAP::const_iterator it = m_cache->m_symbols.find( aSymbolName );
1489
1490 if( it == m_cache->m_symbols.end() )
1491 return nullptr;
1492
1493 return it->second;
1494}

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

◆ ParseLibSymbol()

LIB_SYMBOL * SCH_SEXPR_PLUGIN::ParseLibSymbol ( LINE_READER aReader,
int  aVersion = SEXPR_SCHEMATIC_FILE_VERSION 
)
static

Definition at line 1647 of file sch_sexpr_plugin.cpp.

1648{
1649 LOCALE_IO toggle; // toggles on, then off, the C locale.
1650 LIB_SYMBOL_MAP map;
1651 SCH_SEXPR_PARSER parser( &aReader );
1652
1653 parser.NeedLEFT();
1654 parser.NextTok();
1655
1656 return parser.ParseSymbol( map, aFileVersion );
1657}

References SCH_SEXPR_PARSER::ParseSymbol().

Referenced by SYMBOL_EDIT_FRAME::DuplicateSymbol(), and SYMBOL_EDITOR_EDIT_TOOL::Paste().

◆ Save()

void SCH_SEXPR_PLUGIN::Save ( const wxString &  aFileName,
SCH_SHEET aSheet,
SCHEMATIC aSchematic,
const STRING_UTF8_MAP aProperties = nullptr 
)
overridevirtual

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

Parameters
aFileNameis the name of a file to save to on disk.
aSheetis the class SCH_SHEET in memory document tree from which to extract information when writing to aFileName. The caller continues to own the SCHEMATIC, and the plugin should refrain from modifying the SCHEMATIC if possible.
aSchematicis the SCHEMATIC object used to access any schematic-wide or project information needed to save the document.
aPropertiesis an associative array that can be used to tell the saver how to save the file, because it can take any number of additional named tuning arguments that the plugin is known to support. The caller continues to own this object (plugin may not delete it), and plugins should expect it to be optionally NULL. Set the #PropSaveCurrentSheetOnly property to only save the current sheet. Otherwise, all hierarchical sheets are saved.
Exceptions
IO_ERRORif there is a problem saving or exporting.

Reimplemented from SCH_PLUGIN.

Definition at line 331 of file sch_sexpr_plugin.cpp.

333{
334 wxCHECK_RET( aSheet != nullptr, "NULL SCH_SHEET object." );
335 wxCHECK_RET( !aFileName.IsEmpty(), "No schematic file name defined." );
336
337 LOCALE_IO toggle; // toggles on, then off, the C locale, to write floating point values.
338
339 init( aSchematic, aProperties );
340
341 wxFileName fn = aFileName;
342
343 // File names should be absolute. Don't assume everything relative to the project path
344 // works properly.
345 wxASSERT( fn.IsAbsolute() );
346
347 FILE_OUTPUTFORMATTER formatter( fn.GetFullPath() );
348
349 m_out = &formatter; // no ownership
350
351 Format( aSheet );
352
353 if( aSheet->GetScreen() )
354 aSheet->GetScreen()->SetFileExists( true );
355}
Used for text file output.
Definition: richio.h:457
void Format(SCH_SHEET *aSheet)

References Format(), SCH_SHEET::GetScreen(), init(), m_out, and SCH_SCREEN::SetFileExists().

Referenced by KI_TEST::DumpSchematicToFile().

◆ saveBitmap()

void SCH_SEXPR_PLUGIN::saveBitmap ( SCH_BITMAP aBitmap,
int  aNestLevel 
)
private

Definition at line 909 of file sch_sexpr_plugin.cpp.

910{
911 wxCHECK_RET( aBitmap != nullptr && m_out != nullptr, "" );
912
913 const wxImage* image = aBitmap->GetImage()->GetImageData();
914
915 wxCHECK_RET( image != nullptr, "wxImage* is NULL" );
916
917 m_out->Print( aNestLevel, "(image (at %s %s)",
919 aBitmap->GetPosition().x ).c_str(),
921 aBitmap->GetPosition().y ).c_str() );
922
923 double scale = aBitmap->GetImage()->GetScale();
924
925 // 20230121 or older file format versions assumed 300 image PPI at load/save.
926 // Let's keep compatibility by changing image scale.
927 if( SEXPR_SCHEMATIC_FILE_VERSION <= 20230121 )
928 {
929 BITMAP_BASE* bm_image = aBitmap->GetImage();
930 scale = scale * 300.0 / bm_image->GetPPI();
931 }
932
933 if( scale != 1.0 )
934 m_out->Print( 0, " (scale %g)", scale );
935
936 m_out->Print( 0, "\n" );
937
938 m_out->Print( aNestLevel + 1, "(uuid %s)\n", TO_UTF8( aBitmap->m_Uuid.AsString() ) );
939
940 m_out->Print( aNestLevel + 1, "(data" );
941
942 wxMemoryOutputStream stream;
943
944 image->SaveFile( stream, wxBITMAP_TYPE_PNG );
945
946 // Write binary data in hexadecimal form (ASCII)
947 wxStreamBuffer* buffer = stream.GetOutputStreamBuffer();
948 wxString out = wxBase64Encode( buffer->GetBufferStart(), buffer->GetBufferSize() );
949
950 // Apparently the MIME standard character width for base64 encoding is 76 (unconfirmed)
951 // so use it in a vein attempt to be standard like.
952#define MIME_BASE64_LENGTH 76
953
954 size_t first = 0;
955
956 while( first < out.Length() )
957 {
958 m_out->Print( 0, "\n" );
959 m_out->Print( aNestLevel + 2, "%s", TO_UTF8( out( first, MIME_BASE64_LENGTH ) ) );
960 first += MIME_BASE64_LENGTH;
961 }
962
963 m_out->Print( 0, "\n" );
964 m_out->Print( aNestLevel + 1, ")\n" ); // Closes data token.
965 m_out->Print( aNestLevel, ")\n" ); // Closes image token.
966}
constexpr EDA_IU_SCALE schIUScale
Definition: base_units.h:111
This class handle bitmap images in KiCad.
Definition: bitmap_base.h:52
double GetScale() const
Definition: bitmap_base.h:78
int GetPPI() const
Definition: bitmap_base.h:123
wxImage * GetImageData()
Definition: bitmap_base.h:71
VECTOR2I GetPosition() const override
Definition: sch_bitmap.h:138
BITMAP_BASE * GetImage() const
Definition: sch_bitmap.h:54
std::string FormatInternalUnits(const EDA_IU_SCALE &aIuScale, int aValue)
Converts aValue from internal units to a string appropriate for writing to file.
Definition: eda_units.cpp:142
#define MIME_BASE64_LENGTH
const int scale

References KIID::AsString(), EDA_UNIT_UTILS::FormatInternalUnits(), SCH_BITMAP::GetImage(), BITMAP_BASE::GetImageData(), SCH_BITMAP::GetPosition(), BITMAP_BASE::GetPPI(), BITMAP_BASE::GetScale(), image, m_out, EDA_ITEM::m_Uuid, MIME_BASE64_LENGTH, OUTPUTFORMATTER::Print(), scale, schIUScale, SEXPR_SCHEMATIC_FILE_VERSION, TO_UTF8, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by Format().

◆ saveBusAlias()

void SCH_SEXPR_PLUGIN::saveBusAlias ( std::shared_ptr< BUS_ALIAS aAlias,
int  aNestLevel 
)
private

Definition at line 1363 of file sch_sexpr_plugin.cpp.

1364{
1365 wxCHECK_RET( aAlias != nullptr, "BUS_ALIAS* is NULL" );
1366
1367 wxString members;
1368
1369 for( const wxString& member : aAlias->Members() )
1370 {
1371 if( !members.IsEmpty() )
1372 members += wxS( " " );
1373
1374 members += m_out->Quotew( member );
1375 }
1376
1377 m_out->Print( aNestLevel, "(bus_alias %s (members %s))\n",
1378 m_out->Quotew( aAlias->GetName() ).c_str(),
1379 TO_UTF8( members ) );
1380}
std::string Quotew(const wxString &aWrapee) const
Definition: richio.cpp:501

References m_out, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), and TO_UTF8.

Referenced by Format().

◆ saveBusEntry()

void SCH_SEXPR_PLUGIN::saveBusEntry ( SCH_BUS_ENTRY_BASE aBusEntry,
int  aNestLevel 
)
private

Definition at line 1142 of file sch_sexpr_plugin.cpp.

1143{
1144 wxCHECK_RET( aBusEntry != nullptr && m_out != nullptr, "" );
1145
1146 // Bus to bus entries are converted to bus line segments.
1147 if( aBusEntry->GetClass() == "SCH_BUS_BUS_ENTRY" )
1148 {
1149 SCH_LINE busEntryLine( aBusEntry->GetPosition(), LAYER_BUS );
1150
1151 busEntryLine.SetEndPoint( aBusEntry->GetEnd() );
1152 saveLine( &busEntryLine, aNestLevel );
1153 }
1154 else
1155 {
1156 m_out->Print( aNestLevel, "(bus_entry (at %s %s) (size %s %s)\n",
1158 aBusEntry->GetPosition().x ).c_str(),
1160 aBusEntry->GetPosition().y ).c_str(),
1162 aBusEntry->GetSize().x ).c_str(),
1164 aBusEntry->GetSize().y ).c_str() );
1165
1166 aBusEntry->GetStroke().Format( m_out, schIUScale, aNestLevel + 1 );
1167
1168 m_out->Print( 0, "\n" );
1169
1170 m_out->Print( aNestLevel + 1, "(uuid %s)\n", TO_UTF8( aBusEntry->m_Uuid.AsString() ) );
1171
1172 m_out->Print( aNestLevel, ")\n" );
1173 }
1174}
VECTOR2I GetSize() const
Definition: sch_bus_entry.h:71
VECTOR2I GetPosition() const override
virtual STROKE_PARAMS GetStroke() const override
Definition: sch_bus_entry.h:77
VECTOR2I GetEnd() const
virtual wxString GetClass() const override
Return the class name.
Definition: sch_item.h:157
void Format(OUTPUTFORMATTER *out, const EDA_IU_SCALE &aIuScale, int nestLevel) const
@ LAYER_BUS
Definition: layer_ids.h:345

References KIID::AsString(), STROKE_PARAMS::Format(), EDA_UNIT_UTILS::FormatInternalUnits(), SCH_ITEM::GetClass(), SCH_BUS_ENTRY_BASE::GetEnd(), SCH_BUS_ENTRY_BASE::GetPosition(), SCH_BUS_ENTRY_BASE::GetSize(), SCH_BUS_ENTRY_BASE::GetStroke(), LAYER_BUS, m_out, EDA_ITEM::m_Uuid, OUTPUTFORMATTER::Print(), saveLine(), schIUScale, SCH_LINE::SetEndPoint(), TO_UTF8, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by Format().

◆ saveField()

void SCH_SEXPR_PLUGIN::saveField ( SCH_FIELD aField,
int  aNestLevel 
)
private

Definition at line 862 of file sch_sexpr_plugin.cpp.

863{
864 wxCHECK_RET( aField != nullptr && m_out != nullptr, "" );
865
866 wxString fieldName = aField->GetCanonicalName();
867 // For some reason (bug in legacy parser?) the field ID for non-mandatory fields is -1 so
868 // check for this in order to correctly use the field name.
869
870 if( aField->GetId() == -1 /* undefined ID */ )
871 {
872 aField->SetId( m_nextFreeFieldId );
874 }
875 else if( aField->GetId() >= m_nextFreeFieldId )
876 {
877 m_nextFreeFieldId = aField->GetId() + 1;
878 }
879
880 m_out->Print( aNestLevel, "(property %s %s (at %s %s %s)",
881 m_out->Quotew( fieldName ).c_str(),
882 m_out->Quotew( aField->GetText() ).c_str(),
884 aField->GetPosition().x ).c_str(),
886 aField->GetPosition().y ).c_str(),
887 EDA_UNIT_UTILS::FormatAngle( aField->GetTextAngle() ).c_str() );
888
889 if( aField->IsNameShown() )
890 m_out->Print( 0, " (show_name)" );
891
892 if( !aField->CanAutoplace() )
893 m_out->Print( 0, " (do_not_autoplace)" );
894
895 if( !aField->IsDefaultFormatting()
896 || ( aField->GetTextHeight() != schIUScale.MilsToIU( DEFAULT_SIZE_TEXT ) ) )
897 {
898 m_out->Print( 0, "\n" );
899 aField->Format( m_out, aNestLevel, 0 );
900 m_out->Print( aNestLevel, ")\n" ); // Closes property token with font effects.
901 }
902 else
903 {
904 m_out->Print( 0, ")\n" ); // Closes property token without font effects.
905 }
906}
int GetTextHeight() const
Definition: eda_text.h:202
bool IsDefaultFormatting() const
Definition: eda_text.cpp:768
const EDA_ANGLE & GetTextAngle() const
Definition: eda_text.h:120
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:87
virtual void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Output the object to aFormatter in s-expression form.
Definition: eda_text.cpp:783
VECTOR2I GetPosition() const override
Definition: sch_field.cpp:1068
bool IsNameShown() const
Definition: sch_field.h:158
wxString GetCanonicalName() const
Get a non-language-specific name for a field which can be used for storage, variable look-up,...
Definition: sch_field.cpp:836
int GetId() const
Definition: sch_field.h:125
bool CanAutoplace() const
Definition: sch_field.h:161
void SetId(int aId)
Definition: sch_field.cpp:138
#define DEFAULT_SIZE_TEXT
This is the "default-of-the-default" hardcoded text size; individual application define their own def...
Definition: eda_text.h:61
std::string FormatAngle(const EDA_ANGLE &aAngle)
Converts aAngle from board units to a string appropriate for writing to file.
Definition: eda_units.cpp:134
constexpr int MilsToIU(int mils) const
Definition: base_units.h:94

References SCH_FIELD::CanAutoplace(), DEFAULT_SIZE_TEXT, EDA_TEXT::Format(), EDA_UNIT_UTILS::FormatAngle(), EDA_UNIT_UTILS::FormatInternalUnits(), SCH_FIELD::GetCanonicalName(), SCH_FIELD::GetId(), SCH_FIELD::GetPosition(), EDA_TEXT::GetText(), EDA_TEXT::GetTextAngle(), EDA_TEXT::GetTextHeight(), EDA_TEXT::IsDefaultFormatting(), SCH_FIELD::IsNameShown(), m_nextFreeFieldId, m_out, EDA_IU_SCALE::MilsToIU(), OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), schIUScale, SCH_FIELD::SetId(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by saveSheet(), saveSymbol(), and saveText().

◆ saveInstances()

void SCH_SEXPR_PLUGIN::saveInstances ( const std::vector< SCH_SHEET_INSTANCE > &  aSheets,
int  aNestLevel 
)
private

Definition at line 1383 of file sch_sexpr_plugin.cpp.

1385{
1386 if( aInstances.size() )
1387 {
1388 m_out->Print( 0, "\n" );
1389 m_out->Print( aNestLevel, "(sheet_instances\n" );
1390
1391 for( const SCH_SHEET_INSTANCE& instance : aInstances )
1392 {
1393 wxString path = instance.m_Path.AsString();
1394
1395 if( path.IsEmpty() )
1396 path = wxT( "/" ); // Root path
1397
1398 m_out->Print( aNestLevel + 1, "(path %s (page %s))\n",
1399 m_out->Quotew( path ).c_str(),
1400 m_out->Quotew( instance.m_PageNumber ).c_str() );
1401 }
1402
1403 m_out->Print( aNestLevel, ")\n" ); // Close sheet instances token.
1404 }
1405}

References m_out, path, OUTPUTFORMATTER::Print(), and OUTPUTFORMATTER::Quotew().

Referenced by Format().

◆ saveJunction()

void SCH_SEXPR_PLUGIN::saveJunction ( SCH_JUNCTION aJunction,
int  aNestLevel 
)
private

Definition at line 1107 of file sch_sexpr_plugin.cpp.

1108{
1109 wxCHECK_RET( aJunction != nullptr && m_out != nullptr, "" );
1110
1111 m_out->Print( aNestLevel, "(junction (at %s %s) (diameter %s) (color %d %d %d %s)\n",
1113 aJunction->GetPosition().x ).c_str(),
1115 aJunction->GetPosition().y ).c_str(),
1117 aJunction->GetDiameter() ).c_str(),
1118 KiROUND( aJunction->GetColor().r * 255.0 ),
1119 KiROUND( aJunction->GetColor().g * 255.0 ),
1120 KiROUND( aJunction->GetColor().b * 255.0 ),
1121 FormatDouble2Str( aJunction->GetColor().a ).c_str() );
1122
1123 m_out->Print( aNestLevel + 1, "(uuid %s)\n", TO_UTF8( aJunction->m_Uuid.AsString() ) );
1124
1125 m_out->Print( aNestLevel, ")\n" );
1126}
double r
Red component.
Definition: color4d.h:372
double g
Green component.
Definition: color4d.h:373
double a
Alpha component.
Definition: color4d.h:375
double b
Blue component.
Definition: color4d.h:374
COLOR4D GetColor() const
Definition: sch_junction.h:114
int GetDiameter() const
Definition: sch_junction.h:109
VECTOR2I GetPosition() const override
Definition: sch_junction.h:102
std::string FormatDouble2Str(double aValue)
Print a float number without using scientific notation and no trailing 0 This function is intended in...
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:85

References KIGFX::COLOR4D::a, KIID::AsString(), KIGFX::COLOR4D::b, FormatDouble2Str(), EDA_UNIT_UTILS::FormatInternalUnits(), KIGFX::COLOR4D::g, SCH_JUNCTION::GetColor(), SCH_JUNCTION::GetDiameter(), SCH_JUNCTION::GetPosition(), KiROUND(), m_out, EDA_ITEM::m_Uuid, OUTPUTFORMATTER::Print(), KIGFX::COLOR4D::r, schIUScale, TO_UTF8, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by Format().

◆ SaveLibrary()

void SCH_SEXPR_PLUGIN::SaveLibrary ( const wxString &  aLibraryPath,
const STRING_UTF8_MAP aProperties = nullptr 
)
overridevirtual

Reimplemented from SCH_PLUGIN.

Definition at line 1570 of file sch_sexpr_plugin.cpp.

1571{
1572 if( !m_cache )
1573 m_cache = new SCH_SEXPR_PLUGIN_CACHE( aLibraryPath );
1574
1575 wxString oldFileName = m_cache->GetFileName();
1576
1577 if( !m_cache->IsFile( aLibraryPath ) )
1578 {
1579 m_cache->SetFileName( aLibraryPath );
1580 }
1581
1582 // This is a forced save.
1584 m_cache->Save();
1585 m_cache->SetFileName( oldFileName );
1586}
wxString GetFileName() const
void SetFileName(const wxString &aFileName)

References SCH_LIB_PLUGIN_CACHE::GetFileName(), SCH_LIB_PLUGIN_CACHE::IsFile(), m_cache, SCH_SEXPR_PLUGIN_CACHE::Save(), SCH_LIB_PLUGIN_CACHE::SetFileName(), and SCH_LIB_PLUGIN_CACHE::SetModified().

◆ saveLine()

void SCH_SEXPR_PLUGIN::saveLine ( SCH_LINE aLine,
int  aNestLevel 
)
private

Definition at line 1214 of file sch_sexpr_plugin.cpp.

1215{
1216 wxCHECK_RET( aLine != nullptr && m_out != nullptr, "" );
1217
1218 wxString lineType;
1219
1220 STROKE_PARAMS line_stroke = aLine->GetStroke();
1221
1222 switch( aLine->GetLayer() )
1223 {
1224 case LAYER_BUS: lineType = "bus"; break;
1225 case LAYER_WIRE: lineType = "wire"; break;
1226 case LAYER_NOTES: lineType = "polyline"; break;
1227 default:
1228 UNIMPLEMENTED_FOR( LayerName( aLine->GetLayer() ) );
1229 }
1230
1231 m_out->Print( aNestLevel, "(%s (pts (xy %s %s) (xy %s %s))\n",
1232 TO_UTF8( lineType ),
1234 aLine->GetStartPoint().x ).c_str(),
1236 aLine->GetStartPoint().y ).c_str(),
1238 aLine->GetEndPoint().x ).c_str(),
1240 aLine->GetEndPoint().y ).c_str() );
1241
1242 line_stroke.Format( m_out, schIUScale, aNestLevel + 1 );
1243 m_out->Print( 0, "\n" );
1244
1245 m_out->Print( aNestLevel + 1, "(uuid %s)\n", TO_UTF8( aLine->m_Uuid.AsString() ) );
1246
1247 m_out->Print( aNestLevel, ")\n" );
1248}
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition: sch_item.h:246
virtual STROKE_PARAMS GetStroke() const override
Definition: sch_line.h:177
VECTOR2I GetEndPoint() const
Definition: sch_line.h:143
VECTOR2I GetStartPoint() const
Definition: sch_line.h:138
Simple container to manage line stroke parameters.
Definition: stroke_params.h:88
wxString LayerName(int aLayer)
Returns the default display name for a given layer.
Definition: layer_id.cpp:30
@ LAYER_WIRE
Definition: layer_ids.h:344
@ LAYER_NOTES
Definition: layer_ids.h:358
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:120

References KIID::AsString(), STROKE_PARAMS::Format(), EDA_UNIT_UTILS::FormatInternalUnits(), SCH_LINE::GetEndPoint(), SCH_ITEM::GetLayer(), SCH_LINE::GetStartPoint(), SCH_LINE::GetStroke(), LAYER_BUS, LAYER_NOTES, LAYER_WIRE, LayerName(), m_out, EDA_ITEM::m_Uuid, OUTPUTFORMATTER::Print(), schIUScale, TO_UTF8, UNIMPLEMENTED_FOR, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by Format(), and saveBusEntry().

◆ saveNoConnect()

void SCH_SEXPR_PLUGIN::saveNoConnect ( SCH_NO_CONNECT aNoConnect,
int  aNestLevel 
)
private

Definition at line 1129 of file sch_sexpr_plugin.cpp.

1130{
1131 wxCHECK_RET( aNoConnect != nullptr && m_out != nullptr, "" );
1132
1133 m_out->Print( aNestLevel, "(no_connect (at %s %s) (uuid %s))\n",
1135 aNoConnect->GetPosition().x ).c_str(),
1137 aNoConnect->GetPosition().y ).c_str(),
1138 TO_UTF8( aNoConnect->m_Uuid.AsString() ) );
1139}
VECTOR2I GetPosition() const override

References KIID::AsString(), EDA_UNIT_UTILS::FormatInternalUnits(), SCH_NO_CONNECT::GetPosition(), m_out, EDA_ITEM::m_Uuid, OUTPUTFORMATTER::Print(), schIUScale, TO_UTF8, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by Format().

◆ saveShape()

void SCH_SEXPR_PLUGIN::saveShape ( SCH_SHAPE aShape,
int  aNestLevel 
)
private

Definition at line 1177 of file sch_sexpr_plugin.cpp.

1178{
1179 wxCHECK_RET( aShape != nullptr && m_out != nullptr, "" );
1180
1181 switch( aShape->GetShape() )
1182 {
1183 case SHAPE_T::ARC:
1184 formatArc( m_out, aNestLevel, aShape, false, aShape->GetStroke(), aShape->GetFillMode(),
1185 aShape->GetFillColor(), aShape->m_Uuid );
1186 break;
1187
1188 case SHAPE_T::CIRCLE:
1189 formatCircle( m_out, aNestLevel, aShape, false, aShape->GetStroke(), aShape->GetFillMode(),
1190 aShape->GetFillColor(), aShape->m_Uuid );
1191 break;
1192
1193 case SHAPE_T::RECT:
1194 formatRect( m_out, aNestLevel, aShape, false, aShape->GetStroke(), aShape->GetFillMode(),
1195 aShape->GetFillColor(), aShape->m_Uuid );
1196 break;
1197
1198 case SHAPE_T::BEZIER:
1199 formatBezier( m_out, aNestLevel, aShape, false, aShape->GetStroke(), aShape->GetFillMode(),
1200 aShape->GetFillColor(), aShape->m_Uuid );
1201 break;
1202
1203 case SHAPE_T::POLY:
1204 formatPoly( m_out, aNestLevel, aShape, false, aShape->GetStroke(), aShape->GetFillMode(),
1205 aShape->GetFillColor(), aShape->m_Uuid );
1206 break;
1207
1208 default:
1210 }
1211}
FILL_T GetFillMode() const
Definition: eda_shape.h:101
SHAPE_T GetShape() const
Definition: eda_shape.h:113
COLOR4D GetFillColor() const
Definition: eda_shape.h:105
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:75
STROKE_PARAMS GetStroke() const override
Definition: sch_shape.h:64
void formatCircle(OUTPUTFORMATTER *aFormatter, int aNestLevel, EDA_SHAPE *aCircle, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, const KIID &aUuid)
void formatArc(OUTPUTFORMATTER *aFormatter, int aNestLevel, EDA_SHAPE *aArc, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, const KIID &aUuid)
void formatRect(OUTPUTFORMATTER *aFormatter, int aNestLevel, EDA_SHAPE *aRect, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, const KIID &aUuid)
void formatBezier(OUTPUTFORMATTER *aFormatter, int aNestLevel, EDA_SHAPE *aBezier, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, const KIID &aUuid)
void formatPoly(OUTPUTFORMATTER *aFormatter, int aNestLevel, EDA_SHAPE *aPolyLine, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, const KIID &aUuid)

References ARC, BEZIER, CIRCLE, formatArc(), formatBezier(), formatCircle(), formatPoly(), formatRect(), EDA_SHAPE::GetFillColor(), EDA_SHAPE::GetFillMode(), EDA_SHAPE::GetShape(), SCH_SHAPE::GetStroke(), m_out, EDA_ITEM::m_Uuid, POLY, RECT, EDA_SHAPE::SHAPE_T_asString(), and UNIMPLEMENTED_FOR.

Referenced by Format().

◆ saveSheet()

void SCH_SEXPR_PLUGIN::saveSheet ( SCH_SHEET aSheet,
int  aNestLevel 
)
private

Definition at line 969 of file sch_sexpr_plugin.cpp.

970{
971 wxCHECK_RET( aSheet != nullptr && m_out != nullptr, "" );
972
973 m_out->Print( aNestLevel, "(sheet (at %s %s) (size %s %s)",
975 aSheet->GetPosition().x ).c_str(),
977 aSheet->GetPosition().y ).c_str(),
979 aSheet->GetSize().x ).c_str(),
981 aSheet->GetSize().y ).c_str() );
982
984 m_out->Print( 0, " (fields_autoplaced)" );
985
986 m_out->Print( 0, "\n" );
987
989 aSheet->GetBorderColor() );
990
991 stroke.SetWidth( aSheet->GetBorderWidth() );
992 stroke.Format( m_out, schIUScale, aNestLevel + 1 );
993
994 m_out->Print( 0, "\n" );
995
996 m_out->Print( aNestLevel + 1, "(fill (color %d %d %d %0.4f))\n",
997 KiROUND( aSheet->GetBackgroundColor().r * 255.0 ),
998 KiROUND( aSheet->GetBackgroundColor().g * 255.0 ),
999 KiROUND( aSheet->GetBackgroundColor().b * 255.0 ),
1000 aSheet->GetBackgroundColor().a );
1001
1002 m_out->Print( aNestLevel + 1, "(uuid %s)\n", TO_UTF8( aSheet->m_Uuid.AsString() ) );
1003
1005
1006 for( SCH_FIELD& field : aSheet->GetFields() )
1007 {
1008 saveField( &field, aNestLevel + 1 );
1009 }
1010
1011 for( const SCH_SHEET_PIN* pin : aSheet->GetPins() )
1012 {
1013 m_out->Print( aNestLevel + 1, "(pin %s %s (at %s %s %s)\n",
1014 EscapedUTF8( pin->GetText() ).c_str(),
1015 getSheetPinShapeToken( pin->GetShape() ),
1017 pin->GetPosition().x ).c_str(),
1019 pin->GetPosition().y ).c_str(),
1020 EDA_UNIT_UTILS::FormatAngle( getSheetPinAngle( pin->GetSide() ) ).c_str() );
1021
1022 pin->Format( m_out, aNestLevel + 1, 0 );
1023
1024 m_out->Print( aNestLevel + 2, "(uuid %s)\n", TO_UTF8( pin->m_Uuid.AsString() ) );
1025
1026 m_out->Print( aNestLevel + 1, ")\n" ); // Closes pin token.
1027 }
1028
1029 // Save all sheet instances here except the root sheet instance.
1030 std::vector< SCH_SHEET_INSTANCE > sheetInstances = aSheet->GetInstances();
1031
1032 auto it = sheetInstances.begin();
1033
1034 while( it != sheetInstances.end() )
1035 {
1036 if( it->m_Path.size() == 0 )
1037 it = sheetInstances.erase( it );
1038 else
1039 it++;
1040 }
1041
1042 if( !sheetInstances.empty() )
1043 {
1044 m_out->Print( aNestLevel + 1, "(instances\n" );
1045
1046 KIID lastProjectUuid;
1047 KIID rootSheetUuid = m_schematic->Root().m_Uuid;
1048 SCH_SHEET_LIST fullHierarchy = m_schematic->GetSheets();
1049 bool project_open = false;
1050
1051 for( size_t i = 0; i < sheetInstances.size(); i++ )
1052 {
1053 // If the instance data is part of this design but no longer has an associated sheet
1054 // path, don't save it. This prevents large amounts of orphaned instance data for the
1055 // current project from accumulating in the schematic files.
1056 //
1057 // Keep all instance data when copying to the clipboard. It may be needed on paste.
1058 if( ( sheetInstances[i].m_Path[0] == rootSheetUuid )
1059 && !fullHierarchy.GetSheetPathByKIIDPath( sheetInstances[i].m_Path, false ) )
1060 {
1061 if( project_open && ( ( i + 1 == sheetInstances.size() )
1062 || lastProjectUuid != sheetInstances[i+1].m_Path[0] ) )
1063 {
1064 m_out->Print( aNestLevel + 2, ")\n" ); // Closes `project` token.
1065 project_open = false;
1066 }
1067
1068 continue;
1069 }
1070
1071 if( lastProjectUuid != sheetInstances[i].m_Path[0] )
1072 {
1073 wxString projectName;
1074
1075 if( sheetInstances[i].m_Path[0] == rootSheetUuid )
1076 projectName = m_schematic->Prj().GetProjectName();
1077 else
1078 projectName = sheetInstances[i].m_ProjectName;
1079
1080 lastProjectUuid = sheetInstances[i].m_Path[0];
1081 m_out->Print( aNestLevel + 2, "(project %s\n",
1082 m_out->Quotew( projectName ).c_str() );
1083 project_open = true;
1084 }
1085
1086 wxString path = sheetInstances[i].m_Path.AsString();
1087
1088 m_out->Print( aNestLevel + 3, "(path %s (page %s))\n",
1089 m_out->Quotew( path ).c_str(),
1090 m_out->Quotew( sheetInstances[i].m_PageNumber ).c_str() );
1091
1092 if( project_open && ( ( i + 1 == sheetInstances.size() )
1093 || lastProjectUuid != sheetInstances[i+1].m_Path[0] ) )
1094 {
1095 m_out->Print( aNestLevel + 2, ")\n" ); // Closes `project` token.
1096 project_open = false;
1097 }
1098 }
1099
1100 m_out->Print( aNestLevel + 1, ")\n" ); // Closes `instances` token.
1101 }
1102
1103 m_out->Print( aNestLevel, ")\n" ); // Closes sheet token.
1104}
Definition: kiid.h:48
virtual const wxString GetProjectName() const
Return the short name of the project.
Definition: project.cpp:132
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
Definition: sch_field.h:51
FIELDS_AUTOPLACED GetFieldsAutoplaced() const
Return whether the fields have been automatically placed.
Definition: sch_item.h:424
void saveField(SCH_FIELD *aField, int aNestLevel)
std::optional< SCH_SHEET_PATH > GetSheetPathByKIIDPath(const KIID_PATH &aPath, bool aIncludeLastSheet=true) const
Finds a SCH_SHEET_PATH that matches the provided KIID_PATH.
Define a sheet pin (label) used in sheets to create hierarchical schematics.
Definition: sch_sheet_pin.h:66
std::vector< SCH_FIELD > & GetFields()
Definition: sch_sheet.h:93
VECTOR2I GetSize() const
Definition: sch_sheet.h:108
VECTOR2I GetPosition() const override
Definition: sch_sheet.h:368
KIGFX::COLOR4D GetBorderColor() const
Definition: sch_sheet.h:114
int GetBorderWidth() const
Definition: sch_sheet.h:111
std::vector< SCH_SHEET_PIN * > & GetPins()
Definition: sch_sheet.h:175
const std::vector< SCH_SHEET_INSTANCE > & GetInstances() const
Definition: sch_sheet.h:381
KIGFX::COLOR4D GetBackgroundColor() const
Definition: sch_sheet.h:117
@ FIELDS_AUTOPLACED_NO
Definition: sch_item.h:56
const char * getSheetPinShapeToken(LABEL_FLAG_SHAPE aShape)
EDA_ANGLE getSheetPinAngle(SHEET_SIDE aSide)
@ SHEET_MANDATORY_FIELDS
The first 2 are mandatory, and must be instantiated in SCH_SHEET.
Definition: sch_sheet.h:49
std::string EscapedUTF8(const wxString &aString)
Return an 8 bit UTF8 string given aString in Unicode form.

References KIGFX::COLOR4D::a, KIID::AsString(), KIGFX::COLOR4D::b, EscapedUTF8(), FIELDS_AUTOPLACED_NO, STROKE_PARAMS::Format(), EDA_UNIT_UTILS::FormatAngle(), EDA_UNIT_UTILS::FormatInternalUnits(), KIGFX::COLOR4D::g, SCH_SHEET::GetBackgroundColor(), SCH_SHEET::GetBorderColor(), SCH_SHEET::GetBorderWidth(), SCH_SHEET::GetFields(), SCH_ITEM::GetFieldsAutoplaced(), SCH_SHEET::GetInstances(), SCH_SHEET::GetPins(), SCH_SHEET::GetPosition(), PROJECT::GetProjectName(), SCH_SHEET_LIST::GetSheetPathByKIIDPath(), getSheetPinAngle(), getSheetPinShapeToken(), SCHEMATIC::GetSheets(), SCH_SHEET::GetSize(), KiROUND(), m_nextFreeFieldId, m_out, m_schematic, EDA_ITEM::m_Uuid, path, pin, OUTPUTFORMATTER::Print(), SCHEMATIC::Prj(), OUTPUTFORMATTER::Quotew(), KIGFX::COLOR4D::r, SCHEMATIC::Root(), saveField(), schIUScale, STROKE_PARAMS::SetWidth(), SHEET_MANDATORY_FIELDS, SOLID, TO_UTF8, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by Format().

◆ SaveSymbol()

void SCH_SEXPR_PLUGIN::SaveSymbol ( const wxString &  aLibraryPath,
const LIB_SYMBOL aSymbol,
const STRING_UTF8_MAP aProperties = nullptr 
)
overridevirtual

Write aSymbol to an existing library located at aLibraryPath.

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

Parameters
aLibraryPathis a locator for the "library", usually a directory, file, or URL containing several symbols.
aSymbolis what to store in the library. The library is refreshed and the caller must update any LIB_SYMBOL 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 1497 of file sch_sexpr_plugin.cpp.

1499{
1500 LOCALE_IO toggle; // toggles on, then off, the C locale.
1501
1502 cacheLib( aLibraryPath, aProperties );
1503
1504 m_cache->AddSymbol( aSymbol );
1505
1506 if( !isBuffering( aProperties ) )
1507 m_cache->Save();
1508}
virtual void AddSymbol(const LIB_SYMBOL *aSymbol)

References SCH_LIB_PLUGIN_CACHE::AddSymbol(), cacheLib(), isBuffering(), m_cache, and SCH_SEXPR_PLUGIN_CACHE::Save().

◆ saveSymbol()

void SCH_SEXPR_PLUGIN::saveSymbol ( SCH_SYMBOL aSymbol,
const SCHEMATIC aSchematic,
int  aNestLevel,
bool  aForClipboard 
)
private

Definition at line 645 of file sch_sexpr_plugin.cpp.

647{
648 wxCHECK_RET( aSymbol != nullptr && m_out != nullptr, "" );
649
650 // Sort symbol instance data to minimize file churn.
652
653 std::string libName;
654
655 wxString symbol_name = aSymbol->GetLibId().Format();
656
657 if( symbol_name.size() )
658 {
659 libName = toUTFTildaText( symbol_name );
660 }
661 else
662 {
663 libName = "_NONAME_";
664 }
665
667 int orientation = aSymbol->GetOrientation() & ~( SYM_MIRROR_X | SYM_MIRROR_Y );
668
669 if( orientation == SYM_ORIENT_90 )
670 angle = ANGLE_90;
671 else if( orientation == SYM_ORIENT_180 )
673 else if( orientation == SYM_ORIENT_270 )
675 else
676 angle = ANGLE_0;
677
678 m_out->Print( aNestLevel, "(symbol" );
679
680 if( !aSymbol->UseLibIdLookup() )
681 {
682 m_out->Print( 0, " (lib_name %s)",
683 m_out->Quotew( aSymbol->GetSchSymbolLibraryName() ).c_str() );
684 }
685
686 m_out->Print( 0, " (lib_id %s) (at %s %s %s)",
687 m_out->Quotew( aSymbol->GetLibId().Format().wx_str() ).c_str(),
689 aSymbol->GetPosition().x ).c_str(),
691 aSymbol->GetPosition().y ).c_str(),
693
694 bool mirrorX = aSymbol->GetOrientation() & SYM_MIRROR_X;
695 bool mirrorY = aSymbol->GetOrientation() & SYM_MIRROR_Y;
696
697 if( mirrorX || mirrorY )
698 {
699 m_out->Print( 0, " (mirror" );
700
701 if( mirrorX )
702 m_out->Print( 0, " x" );
703
704 if( mirrorY )
705 m_out->Print( 0, " y" );
706
707 m_out->Print( 0, ")" );
708 }
709
710 // The symbol unit is always set to the first instance regardless of the current sheet
711 // instance to prevent file churn.
712 int unit = ( aSymbol->GetInstanceReferences().size() == 0 ) ?
713 aSymbol->GetUnit() :
714 aSymbol->GetInstanceReferences()[0].m_Unit;
715
716 m_out->Print( 0, " (unit %d)", unit );
717
718 if( aSymbol->GetConvert() == LIB_ITEM::LIB_CONVERT::DEMORGAN )
719 m_out->Print( 0, " (convert %d)", aSymbol->GetConvert() );
720
721 m_out->Print( 0, "\n" );
722
723 m_out->Print( aNestLevel + 1, "(in_bom %s)", ( aSymbol->GetIncludeInBom() ) ? "yes" : "no" );
724 m_out->Print( 0, " (on_board %s)", ( aSymbol->GetIncludeOnBoard() ) ? "yes" : "no" );
725 m_out->Print( 0, " (dnp %s)", ( aSymbol->GetDNP() ) ? "yes" : "no" );
726
727 if( aSymbol->GetFieldsAutoplaced() != FIELDS_AUTOPLACED_NO )
728 m_out->Print( 0, " (fields_autoplaced)" );
729
730 m_out->Print( 0, "\n" );
731
732 m_out->Print( aNestLevel + 1, "(uuid %s)\n", TO_UTF8( aSymbol->m_Uuid.AsString() ) );
733
735
736 for( SCH_FIELD& field : aSymbol->GetFields() )
737 {
738 int id = field.GetId();
739 wxString value = field.GetText();
740
741 if( !aForClipboard && aSymbol->GetInstanceReferences().size() )
742 {
743 // The instance fields are always set to the default instance regardless of the
744 // sheet instance to prevent file churn.
745 if( id == REFERENCE_FIELD )
746 {
747 field.SetText( aSymbol->GetInstanceReferences()[0].m_Reference );
748 }
749 else if( id == VALUE_FIELD )
750 {
751 field.SetText( aSymbol->GetValueFieldText( false ) );
752 }
753 else if( id == FOOTPRINT_FIELD )
754 {
755 field.SetText( aSymbol->GetFootprintFieldText( false ) );
756 }
757 }
758
759 try
760 {
761 saveField( &field, aNestLevel + 1 );
762 }
763 catch( ... )
764 {
765 // Restore the changed field text on write error.
766 if( id == REFERENCE_FIELD || id == VALUE_FIELD || id == FOOTPRINT_FIELD )
767 field.SetText( value );
768
769 throw;
770 }
771
772 if( id == REFERENCE_FIELD || id == VALUE_FIELD || id == FOOTPRINT_FIELD )
773 field.SetText( value );
774 }
775
776 for( const std::unique_ptr<SCH_PIN>& pin : aSymbol->GetRawPins() )
777 {
778 if( pin->GetAlt().IsEmpty() )
779 {
780 m_out->Print( aNestLevel + 1, "(pin %s (uuid %s))\n",
781 m_out->Quotew( pin->GetNumber() ).c_str(),
782 TO_UTF8( pin->m_Uuid.AsString() ) );
783 }
784 else
785 {
786 m_out->Print( aNestLevel + 1, "(pin %s (uuid %s) (alternate %s))\n",
787 m_out->Quotew( pin->GetNumber() ).c_str(),
788 TO_UTF8( pin->m_Uuid.AsString() ),
789 m_out->Quotew( pin->GetAlt() ).c_str() );
790 }
791 }
792
793 if( !aSymbol->GetInstanceReferences().empty() )
794 {
795 m_out->Print( aNestLevel + 1, "(instances\n" );
796
797 KIID lastProjectUuid;
798 KIID rootSheetUuid = aSchematic.Root().m_Uuid;
799 SCH_SHEET_LIST fullHierarchy = aSchematic.GetSheets();
800 bool project_open = false;
801
802 for( size_t i = 0; i < aSymbol->GetInstanceReferences().size(); i++ )
803 {
804 // If the instance data is part of this design but no longer has an associated sheet
805 // path, don't save it. This prevents large amounts of orphaned instance data for the
806 // current project from accumulating in the schematic files.
807 //
808 // Keep all instance data when copying to the clipboard. It may be needed on paste.
809 if( !aForClipboard
810 && ( aSymbol->GetInstanceReferences()[i].m_Path[0] == rootSheetUuid )
811 && !fullHierarchy.GetSheetPathByKIIDPath( aSymbol->GetInstanceReferences()[i].m_Path ) )
812 {
813 if( project_open && ( ( i + 1 == aSymbol->GetInstanceReferences().size() )
814 || lastProjectUuid != aSymbol->GetInstanceReferences()[i+1].m_Path[0] ) )
815 {
816 m_out->Print( aNestLevel + 2, ")\n" ); // Closes `project`.
817 project_open = false;
818 }
819
820 continue;
821 }
822
823 if( lastProjectUuid != aSymbol->GetInstanceReferences()[i].m_Path[0] )
824 {
825 wxString projectName;
826
827 if( aSymbol->GetInstanceReferences()[i].m_Path[0] == rootSheetUuid )
828 projectName = aSchematic.Prj().GetProjectName();
829 else
830 projectName = aSymbol->GetInstanceReferences()[i].m_ProjectName;
831
832 lastProjectUuid = aSymbol->GetInstanceReferences()[i].m_Path[0];
833 m_out->Print( aNestLevel + 2, "(project %s\n",
834 m_out->Quotew( projectName ).c_str() );
835 project_open = true;
836 }
837
838 wxString path = aSymbol->GetInstanceReferences()[i].m_Path.AsString();
839
840 m_out->Print( aNestLevel + 3, "(path %s\n",
841 m_out->Quotew( path ).c_str() );
842 m_out->Print( aNestLevel + 4, "(reference %s) (unit %d)\n",
843 m_out->Quotew( aSymbol->GetInstanceReferences()[i].m_Reference ).c_str(),
844 aSymbol->GetInstanceReferences()[i].m_Unit );
845 m_out->Print( aNestLevel + 3, ")\n" );
846
847 if( project_open && ( ( i + 1 == aSymbol->GetInstanceReferences().size() )
848 || lastProjectUuid != aSymbol->GetInstanceReferences()[i+1].m_Path[0] ) )
849 {
850 m_out->Print( aNestLevel + 2, ")\n" ); // Closes `project`.
851 project_open = false;
852 }
853 }
854
855 m_out->Print( aNestLevel + 1, ")\n" ); // Closes `instances`.
856 }
857
858 m_out->Print( aNestLevel, ")\n" ); // Closes `symbol`.
859}
std::vector< std::unique_ptr< SCH_PIN > > & GetRawPins()
Definition: sch_symbol.h:547
int GetUnit() const
Definition: sch_symbol.h:228
const std::vector< SCH_SYMBOL_INSTANCE > & GetInstanceReferences()
Definition: sch_symbol.h:140
bool GetIncludeOnBoard() const
Definition: sch_symbol.h:750
bool GetIncludeInBom() const
Definition: sch_symbol.h:747
int GetConvert() const
Definition: sch_symbol.h:270
const wxString GetFootprintFieldText(bool aResolve) const
Definition: sch_symbol.cpp:850
VECTOR2I GetPosition() const override
Definition: sch_symbol.h:712
const wxString GetValueFieldText(bool aResolve) const
Definition: sch_symbol.cpp:835
int GetOrientation() const
Get the display symbol orientation.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with SCH_FIELDs.
Definition: sch_symbol.cpp:901
void SortInstances(bool(*aSortFunction)(const SCH_SYMBOL_INSTANCE &aLhs, const SCH_SYMBOL_INSTANCE &aRhs))
Definition: sch_symbol.cpp:565
bool GetDNP() const
Definition: sch_symbol.h:753
static constexpr EDA_ANGLE & ANGLE_180
Definition: eda_angle.h:433
static constexpr EDA_ANGLE & ANGLE_90
Definition: eda_angle.h:431
static constexpr EDA_ANGLE & ANGLE_0
Definition: eda_angle.h:429
static constexpr EDA_ANGLE & ANGLE_270
Definition: eda_angle.h:434
static DIRECTION_45::AngleType angle(const VECTOR2I &a, const VECTOR2I &b)
@ SYM_ORIENT_270
@ SYM_MIRROR_Y
@ SYM_ORIENT_180
@ SYM_MIRROR_X
@ SYM_ORIENT_90
bool SortSymbolInstancesByProjectUuid(const SCH_SYMBOL_INSTANCE &aLhs, const SCH_SYMBOL_INSTANCE &aRhs)
std::string toUTFTildaText(const wxString &txt)
Convert a wxString to UTF8 and replace any control characters with a ~, where a control character is ...
Definition: sch_symbol.cpp:54
@ FOOTPRINT_FIELD
Field Name Module PCB, i.e. "16DIP300".
@ VALUE_FIELD
Field Value of part, i.e. "3.3K".
@ MANDATORY_FIELDS
The first 4 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors.
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".

References PNS::angle(), ANGLE_0, ANGLE_180, ANGLE_270, ANGLE_90, KIID::AsString(), FIELDS_AUTOPLACED_NO, FOOTPRINT_FIELD, LIB_ID::Format(), EDA_UNIT_UTILS::FormatAngle(), EDA_UNIT_UTILS::FormatInternalUnits(), SCH_SYMBOL::GetConvert(), SCH_SYMBOL::GetDNP(), SCH_SYMBOL::GetFields(), SCH_ITEM::GetFieldsAutoplaced(), SCH_SYMBOL::GetFootprintFieldText(), SCH_SYMBOL::GetIncludeInBom(), SCH_SYMBOL::GetIncludeOnBoard(), SCH_SYMBOL::GetInstanceReferences(), SCH_SYMBOL::GetLibId(), SCH_SYMBOL::GetOrientation(), SCH_SYMBOL::GetPosition(), PROJECT::GetProjectName(), SCH_SYMBOL::GetRawPins(), SCH_SYMBOL::GetSchSymbolLibraryName(), SCH_SHEET_LIST::GetSheetPathByKIIDPath(), SCHEMATIC::GetSheets(), SCH_SYMBOL::GetUnit(), SCH_SYMBOL::GetValueFieldText(), m_nextFreeFieldId, m_out, EDA_ITEM::m_Uuid, MANDATORY_FIELDS, path, pin, OUTPUTFORMATTER::Print(), SCHEMATIC::Prj(), OUTPUTFORMATTER::Quotew(), REFERENCE_FIELD, SCHEMATIC::Root(), saveField(), schIUScale, SCH_SYMBOL::SortInstances(), SortSymbolInstancesByProjectUuid(), SYM_MIRROR_X, SYM_MIRROR_Y, SYM_ORIENT_180, SYM_ORIENT_270, SYM_ORIENT_90, TO_UTF8, toUTFTildaText(), SCH_SYMBOL::UseLibIdLookup(), VALUE_FIELD, UTF8::wx_str(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by Format().

◆ saveText()

void SCH_SEXPR_PLUGIN::saveText ( SCH_TEXT aText,
int  aNestLevel 
)
private

Definition at line 1251 of file sch_sexpr_plugin.cpp.

1252{
1253 wxCHECK_RET( aText != nullptr && m_out != nullptr, "" );
1254
1255 // Note: label is nullptr SCH_TEXT, but not for SCH_LABEL_XXX,
1256 SCH_LABEL_BASE* label = dynamic_cast<SCH_LABEL_BASE*>( aText );
1257
1258 m_out->Print( aNestLevel, "(%s %s",
1259 getTextTypeToken( aText->Type() ),
1260 m_out->Quotew( aText->GetText() ).c_str() );
1261
1262 if( aText->Type() == SCH_DIRECTIVE_LABEL_T )
1263 {
1264 SCH_DIRECTIVE_LABEL* flag = static_cast<SCH_DIRECTIVE_LABEL*>( aText );
1265
1266 m_out->Print( 0, " (length %s)",
1268 flag->GetPinLength() ).c_str() );
1269 }
1270
1271 EDA_ANGLE angle = aText->GetTextAngle();
1272
1273 if( label )
1274 {
1275 if( aText->Type() == SCH_GLOBAL_LABEL_T
1276 || aText->Type() == SCH_HIER_LABEL_T
1277 || aText->Type() == SCH_DIRECTIVE_LABEL_T )
1278 {
1279 m_out->Print( 0, " (shape %s)", getSheetPinShapeToken( label->GetShape() ) );
1280 }
1281
1282 // The angle of the text is always 0 or 90 degrees for readibility reasons,
1283 // but the item itself can have more rotation (-90 and 180 deg)
1284 switch( aText->GetTextSpinStyle() )
1285 {
1286 default:
1287 case TEXT_SPIN_STYLE::LEFT: angle += ANGLE_180; break;
1288 case TEXT_SPIN_STYLE::UP: break;
1289 case TEXT_SPIN_STYLE::RIGHT: break;
1290 case TEXT_SPIN_STYLE::BOTTOM: angle += ANGLE_180; break;
1291 }
1292 }
1293
1294 if( aText->GetText().Length() < 50 )
1295 {
1296 m_out->Print( 0, " (at %s %s %s)",
1298 aText->GetPosition().x ).c_str(),
1300 aText->GetPosition().y ).c_str(),
1302 }
1303 else
1304 {
1305 m_out->Print( 0, "\n" );
1306 m_out->Print( aNestLevel + 1, "(at %s %s %s)",
1308 aText->GetPosition().x ).c_str(),
1310 aText->GetPosition().y ).c_str(),
1312 }
1313
1315 m_out->Print( 0, " (fields_autoplaced)" );
1316
1317 m_out->Print( 0, "\n" );
1318 aText->EDA_TEXT::Format( m_out, aNestLevel, 0 );
1319
1320 m_out->Print( aNestLevel + 1, "(uuid %s)\n", TO_UTF8( aText->m_Uuid.AsString() ) );
1321
1322 if( label )
1323 {
1324 for( SCH_FIELD& field : label->GetFields() )
1325 saveField( &field, aNestLevel + 1 );
1326 }
1327
1328 m_out->Print( aNestLevel, ")\n" ); // Closes text token.
1329}
LABEL_FLAG_SHAPE GetShape() const override
Definition: sch_label.h:73
std::vector< SCH_FIELD > & GetFields()
Definition: sch_label.h:90
VECTOR2I GetPosition() const override
Definition: sch_text.h:203
TEXT_SPIN_STYLE GetTextSpinStyle() const
Definition: sch_text.h:148
const char * getTextTypeToken(KICAD_T aType)

References PNS::angle(), ANGLE_180, KIID::AsString(), TEXT_SPIN_STYLE::BOTTOM, FIELDS_AUTOPLACED_NO, flag, EDA_UNIT_UTILS::FormatAngle(), EDA_UNIT_UTILS::FormatInternalUnits(), SCH_LABEL_BASE::GetFields(), SCH_ITEM::GetFieldsAutoplaced(), SCH_TEXT::GetPosition(), SCH_LABEL_BASE::GetShape(), getSheetPinShapeToken(), EDA_TEXT::GetText(), EDA_TEXT::GetTextAngle(), SCH_TEXT::GetTextSpinStyle(), getTextTypeToken(), TEXT_SPIN_STYLE::LEFT, m_out, EDA_ITEM::m_Uuid, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), TEXT_SPIN_STYLE::RIGHT, saveField(), SCH_DIRECTIVE_LABEL_T, SCH_GLOBAL_LABEL_T, SCH_HIER_LABEL_T, schIUScale, TO_UTF8, EDA_ITEM::Type(), TEXT_SPIN_STYLE::UP, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by Format().

◆ saveTextBox()

void SCH_SEXPR_PLUGIN::saveTextBox ( SCH_TEXTBOX aText,
int  aNestLevel 
)
private

Definition at line 1332 of file sch_sexpr_plugin.cpp.

1333{
1334 wxCHECK_RET( aTextBox != nullptr && m_out != nullptr, "" );
1335
1336 m_out->Print( aNestLevel, "(text_box %s\n",
1337 m_out->Quotew( aTextBox->GetText() ).c_str() );
1338
1339 VECTOR2I pos = aTextBox->GetStart();
1340 VECTOR2I size = aTextBox->GetEnd() - pos;
1341
1342 m_out->Print( aNestLevel + 1, "(at %s %s %s) (size %s %s)\n",
1345 EDA_UNIT_UTILS::FormatAngle( aTextBox->GetTextAngle() ).c_str(),
1348
1349 aTextBox->GetStroke().Format( m_out, schIUScale, aNestLevel + 1 );
1350 m_out->Print( 0, "\n" );
1351 formatFill( m_out, aNestLevel + 1, aTextBox->GetFillMode(), aTextBox->GetFillColor() );
1352 m_out->Print( 0, "\n" );
1353
1354 aTextBox->EDA_TEXT::Format( m_out, aNestLevel, 0 );
1355
1356 if( aTextBox->m_Uuid != niluuid )
1357 m_out->Print( aNestLevel + 1, "(uuid %s)\n", TO_UTF8( aTextBox->m_Uuid.AsString() ) );
1358
1359 m_out->Print( aNestLevel, ")\n" );
1360}
KIID niluuid(0)
void formatFill(OUTPUTFORMATTER *aFormatter, int aNestLevel, FILL_T aFillMode, const COLOR4D &aFillColor)
Fill token formatting helper.

References KIID::AsString(), STROKE_PARAMS::Format(), EDA_UNIT_UTILS::FormatAngle(), formatFill(), EDA_UNIT_UTILS::FormatInternalUnits(), EDA_SHAPE::GetEnd(), EDA_SHAPE::GetFillColor(), EDA_SHAPE::GetFillMode(), EDA_SHAPE::GetStart(), SCH_SHAPE::GetStroke(), EDA_TEXT::GetText(), EDA_TEXT::GetTextAngle(), m_out, EDA_ITEM::m_Uuid, niluuid, OUTPUTFORMATTER::Print(), OUTPUTFORMATTER::Quotew(), schIUScale, TO_UTF8, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by Format().

◆ SetLibTable()

virtual void SCH_PLUGIN::SetLibTable ( SYMBOL_LIB_TABLE aTable)
inlinevirtualinherited

Some library plugins need to have access to their parent library table.

Parameters
aTableis the table this plugin is registered within.

Reimplemented in SCH_DATABASE_PLUGIN.

Definition at line 515 of file sch_io_mgr.h.

515{}

Referenced by SYMBOL_LIB_TABLE::FindRow(), SYMBOL_LIB_TABLE::LoadSymbolLib(), and SYMBOL_LIB_TABLE_ROW::Refresh().

◆ SetProgressReporter()

void SCH_SEXPR_PLUGIN::SetProgressReporter ( PROGRESS_REPORTER aReporter)
inlineoverridevirtual

Set an optional progress reporter.

Reimplemented from SCH_PLUGIN.

Definition at line 84 of file sch_sexpr_plugin.h.

85 {
86 m_progressReporter = aReporter;
87 }

References m_progressReporter.

◆ SetReporter()

virtual void SCH_PLUGIN::SetReporter ( REPORTER aReporter)
inlinevirtualinherited

Set an optional reporter for warnings/errors.

Reimplemented in SCH_ALTIUM_PLUGIN, CADSTAR_SCH_ARCHIVE_PLUGIN, and SCH_EAGLE_PLUGIN.

Definition at line 168 of file sch_io_mgr.h.

168{}

Referenced by SCH_EDIT_FRAME::importFile().

◆ SupportsSubLibraries()

virtual bool SCH_PLUGIN::SupportsSubLibraries ( ) const
inlinevirtualinherited
Returns
true if this plugin supports libraries that contain sub-libraries.

Reimplemented in SCH_DATABASE_PLUGIN.

Definition at line 449 of file sch_io_mgr.h.

449{ return false; }

Referenced by SYMBOL_LIB_TABLE_ROW::SupportsSubLibraries().

◆ SymbolLibOptions()

void SCH_PLUGIN::SymbolLibOptions ( STRING_UTF8_MAP aListToAppendTo) const
virtualinherited

Append supported SCH_PLUGIN options to aListToAppenTo along with internationalized descriptions.

Options are typically appended so that a derived SCH_PLUGIN can call its base class function by the same name first, thus inheriting options declared there. (Some base class options could pertain to all Symbol*() functions in all derived SCH_PLUGINs.) Note that since aListToAppendTo is a PROPERTIES object, all options will be unique and last guy wins.

Parameters
aListToAppendToholds a tuple of
option
This eventually is what shows up into the fp-lib-table "options" field, possibly combined with others.
internationalized description
The internationalized description is displayed in DIALOG_FP_SCH_PLUGIN_OPTIONS. It may be multi-line and be quite explanatory of the option.

In the future perhaps aListToAppendTo evolves to something capable of also holding a wxValidator for the cells in said dialog: http://forums.wxwidgets.org/viewtopic.php?t=23277&p=104180. This would require a 3 column list, and introducing wx GUI knowledge to SCH_PLUGIN, which has been avoided to date.

Definition at line 133 of file sch_plugin.cpp.

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

References _.

Member Data Documentation

◆ m_appending

bool SCH_SEXPR_PLUGIN::m_appending
protected

Schematic load append status.

Definition at line 169 of file sch_sexpr_plugin.h.

Referenced by init(), Load(), and loadFile().

◆ m_cache

◆ m_currentPath

std::stack<wxString> SCH_SEXPR_PLUGIN::m_currentPath
protected

Stack to maintain nested sheet paths.

Definition at line 175 of file sch_sexpr_plugin.h.

Referenced by Load(), and loadHierarchy().

◆ m_currentSheetPath

SCH_SHEET_PATH SCH_SEXPR_PLUGIN::m_currentSheetPath
protected

Definition at line 177 of file sch_sexpr_plugin.h.

Referenced by loadHierarchy().

◆ m_error

wxString SCH_SEXPR_PLUGIN::m_error
protected

For throwing exceptions or errors on partial loads.

Definition at line 170 of file sch_sexpr_plugin.h.

Referenced by GetError(), and loadHierarchy().

◆ m_nextFreeFieldId

int SCH_SEXPR_PLUGIN::m_nextFreeFieldId
protected

Definition at line 168 of file sch_sexpr_plugin.h.

Referenced by init(), saveField(), saveSheet(), and saveSymbol().

◆ m_out

OUTPUTFORMATTER* SCH_SEXPR_PLUGIN::m_out
protected

◆ m_path

wxString SCH_SEXPR_PLUGIN::m_path
protected

Root project path for loading child sheets.

Definition at line 174 of file sch_sexpr_plugin.h.

Referenced by Load().

◆ m_progressReporter

PROGRESS_REPORTER* SCH_SEXPR_PLUGIN::m_progressReporter
protected

Definition at line 172 of file sch_sexpr_plugin.h.

Referenced by loadFile(), and SetProgressReporter().

◆ m_rootSheet

SCH_SHEET* SCH_SEXPR_PLUGIN::m_rootSheet
protected

The root sheet of the schematic being loaded.

Definition at line 176 of file sch_sexpr_plugin.h.

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

◆ m_schematic

SCHEMATIC* SCH_SEXPR_PLUGIN::m_schematic
protected

Definition at line 178 of file sch_sexpr_plugin.h.

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

◆ m_version

int SCH_SEXPR_PLUGIN::m_version
protected

Version of file being loaded.

Definition at line 167 of file sch_sexpr_plugin.h.

Referenced by init().

◆ PropBuffering

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

The property used internally by the plugin to enable cache buffering which prevents the library file from being written every time the cache is changed.

This is useful when writing the schematic cache library file or saving a library to a new file name.

Definition at line 94 of file sch_sexpr_plugin.h.

Referenced by isBuffering().


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