30#include <wx/mstream.h>
31#include <boost/algorithm/string/join.hpp>
42#include <schematic_lexer.h>
69using namespace TSCHEMATIC_T;
72#define SCH_PARSE_ERROR( text, reader, pos ) \
73 THROW_PARSE_ERROR( text, reader.GetSource(), reader.Line(), \
74 reader.LineNumber(), pos - reader.Line() )
105 wxASSERT( !aFileName || aSchematic !=
nullptr );
110 wxFileName fn = aFileName;
118 wxASSERT( fn.IsAbsolute() );
128 if( !normedFn.IsAbsolute() )
130 if( aFileName.Right( normedFn.GetFullPath().Length() ) == normedFn.GetFullPath() )
131 m_path = aFileName.Left( aFileName.Length() - normedFn.GetFullPath().Length() );
145 init( aSchematic, aProperties );
147 if( aAppendToMe ==
nullptr )
150 std::unique_ptr<SCH_SHEET> newSheet = std::make_unique<SCH_SHEET>( aSchematic );
152 wxFileName relPath( aFileName );
158 newSheet->SetFileName( relPath.GetFullPath() );
163 sheet = newSheet.release();
168 wxCHECK_MSG( aSchematic->
IsValid(),
nullptr,
"Can't append to a schematic with no root!" );
197 if( !fileName.IsAbsolute() )
206 wxLogTrace(
traceSchPlugin,
"Loading '%s'", fileName.GetFullPath() );
210 while( !ancestorSheetPath.
empty() )
217 m_error += wxString::Format(
_(
"Could not load sheet '%s' because it already "
218 "appears as a direct ancestor in the schematic "
220 fileName.GetFullPath() );
222 fileName = wxEmptyString;
230 if( ancestorSheetPath.
empty() )
251 loadFile( fileName.GetFullPath(), aSheet );
266 if( fileName.FileExists() )
304 size_t lineCount = 0;
341 wxCHECK_RET( aSheet !=
nullptr,
"NULL SCH_SHEET object." );
342 wxCHECK_RET( !aFileName.IsEmpty(),
"No schematic file name defined." );
346 init( aSchematic, aProperties );
348 wxFileName fn = aFileName;
352 wxASSERT( fn.IsAbsolute() );
367 wxCHECK_RET( aSheet !=
nullptr,
"NULL SCH_SHEET* object." );
368 wxCHECK_RET(
m_schematic !=
nullptr,
"NULL SCHEMATIC* object." );
383 m_out->
Print( 0,
"(kicad_sch (version %d) (generator \"eeschema\") (generator_version \"%s\")\n\n",
395 for(
const auto& [ libItemName, libSymbol ] : screen->
GetLibSymbols() )
400 for(
const std::shared_ptr<BUS_ALIAS>& alias : screen->
GetBusAliases() )
407 if( a->
Type() != b->Type() )
408 return a->
Type() < b->Type();
410 return a->
m_Uuid < b->m_Uuid;
413 std::multiset<
SCH_ITEM*,
decltype( cmp )> save_map( cmp );
419 save_map.insert( item );
427 if( itemType != item->Type() )
429 itemType = item->Type();
439 switch( item->Type() )
469 if( layer != item->GetLayer() )
473 layer = item->GetLayer();
477 layer = item->GetLayer();
510 wxASSERT(
"Unexpected schematic object type in SCH_IO_KICAD_SEXPR::Format()" );
516 std::vector< SCH_SHEET_INSTANCE> instances;
537 wxCHECK( aSelection && aSelectionPath && aFormatter, );
547 std::map<wxString, LIB_SYMBOL*> libSymbols;
549 std::set<SCH_TABLE*> promotedTables;
551 for( i = 0; i < aSelection->
GetSize(); ++i )
555 wxCHECK2( item,
continue );
562 wxCHECK2( symbol,
continue );
572 libSymbols[ libSymbolLookup ] = it->second;
575 if( !libSymbols.empty() )
579 for(
const std::pair<const wxString, LIB_SYMBOL*>& libSymbol : libSymbols )
582 libSymbol.first,
false );
588 for( i = 0; i < aSelection->
GetSize(); ++i )
592 switch( item->
Type() )
648 if( promotedTables.count( table ) )
654 promotedTables.insert( table );
664 wxASSERT(
"Unexpected schematic object type in SCH_IO_KICAD_SEXPR::Format()" );
672 int aNestLevel,
bool aForClipboard,
675 wxCHECK_RET( aSymbol !=
nullptr &&
m_out !=
nullptr,
"" );
681 if( symbol_name.size() )
687 libName =
"_NONAME_";
710 m_out->
Print( 0,
" (lib_id %s) (at %s %s %s)",
721 if( mirrorX || mirrorY )
739 if( aForClipboard && aRelativePath )
744 unit = unitInstance.
m_Unit;
754 m_out->
Print( aNestLevel + 1,
"(exclude_from_sim %s)",
761 m_out->
Print( 0,
" (fields_autoplaced yes)" );
771 int id = field.GetId();
772 wxString value = field.GetText();
780 field.SetText( aSymbol->
GetInstances()[0].m_Reference );
791 else if( aForClipboard && aSymbol->
GetInstances().size() && aRelativePath
808 field.SetText( value );
814 field.SetText( value );
817 for(
const std::unique_ptr<SCH_PIN>&
pin : aSymbol->
GetRawPins() )
819 if(
pin->GetAlt().IsEmpty() )
829 m_out->
Print( aNestLevel + 1,
" (alternate %s))\n",
836 std::map<KIID, std::vector<SCH_SYMBOL_INSTANCE>> projectInstances;
838 m_out->
Print( aNestLevel + 1,
"(instances\n" );
840 wxString projectName;
841 KIID lastProjectUuid;
847 wxCHECK2( inst.m_Path.size(),
continue );
852 bool isOrphaned = ( inst.m_Path[0] == rootSheetUuid )
856 if( !aForClipboard && isOrphaned )
859 auto it = projectInstances.find( inst.m_Path[0] );
861 if( it == projectInstances.end() )
863 projectInstances[ inst.m_Path[0] ] = { inst };
867 it->second.emplace_back( inst );
871 for(
auto& [uuid, instances] : projectInstances )
873 wxCHECK2( instances.size(),
continue );
876 std::sort( instances.begin(), instances.end(),
879 return aLhs.m_Path < aRhs.m_Path;
882 projectName = instances[0].m_ProjectName;
884 m_out->
Print( aNestLevel + 2,
"(project %s\n",
892 if( aForClipboard && aRelativePath )
899 m_out->
Print( aNestLevel + 4,
"(reference %s) (unit %d)\n",
917 wxCHECK_RET( aField !=
nullptr &&
m_out !=
nullptr,
"" );
923 if( aField->
GetId() == -1 )
927 if( !aField->
GetName().IsEmpty() )
938 m_out->
Print( aNestLevel,
"(property %s %s (at %s %s %s)",
969 wxCHECK_RET( aBitmap !=
nullptr &&
m_out !=
nullptr,
"" );
973 wxCHECK_RET(
image !=
nullptr,
"wxImage* is NULL" );
975 m_out->
Print( aNestLevel,
"(image (at %s %s)",
1004#define MIME_BASE64_LENGTH 76
1008 while( first < out.Length() )
1024 wxCHECK_RET( aSheet !=
nullptr &&
m_out !=
nullptr,
"" );
1026 m_out->
Print( aNestLevel,
"(sheet (at %s %s) (size %s %s)",
1042 m_out->
Print( 0,
" (fields_autoplaced yes)" );
1053 m_out->
Print( aNestLevel + 1,
"(fill (color %d %d %d %0.4f))\n",
1070 m_out->
Print( aNestLevel + 1,
"(pin %s %s (at %s %s %s)\n",
1074 pin->GetPosition().x ).c_str(),
1076 pin->GetPosition().y ).c_str(),
1079 pin->Format(
m_out, aNestLevel + 1, 0 );
1087 std::vector< SCH_SHEET_INSTANCE > sheetInstances = aSheet->
GetInstances();
1089 auto it = sheetInstances.begin();
1091 while( it != sheetInstances.end() )
1093 if( it->m_Path.size() == 0 )
1094 it = sheetInstances.erase( it );
1099 if( !sheetInstances.empty() )
1101 m_out->
Print( aNestLevel + 1,
"(instances\n" );
1103 KIID lastProjectUuid;
1105 bool project_open =
false;
1107 for(
size_t i = 0; i < sheetInstances.size(); i++ )
1114 if( ( sheetInstances[i].m_Path[0] == rootSheetUuid )
1117 if( project_open && ( ( i + 1 == sheetInstances.size() )
1118 || lastProjectUuid != sheetInstances[i+1].m_Path[0] ) )
1121 project_open =
false;
1127 if( lastProjectUuid != sheetInstances[i].m_Path[0] )
1129 wxString projectName;
1131 if( sheetInstances[i].m_Path[0] == rootSheetUuid )
1134 projectName = sheetInstances[i].m_ProjectName;
1136 lastProjectUuid = sheetInstances[i].m_Path[0];
1137 m_out->
Print( aNestLevel + 2,
"(project %s\n",
1139 project_open =
true;
1142 wxString
path = sheetInstances[i].m_Path.AsString();
1144 m_out->
Print( aNestLevel + 3,
"(path %s (page %s))\n",
1146 m_out->
Quotew( sheetInstances[i].m_PageNumber ).c_str() );
1148 if( project_open && ( ( i + 1 == sheetInstances.size() )
1149 || lastProjectUuid != sheetInstances[i+1].m_Path[0] ) )
1152 project_open =
false;
1165 wxCHECK_RET( aJunction !=
nullptr &&
m_out !=
nullptr,
"" );
1167 m_out->
Print( aNestLevel,
"(junction (at %s %s) (diameter %s) (color %d %d %d %s)\n",
1187 wxCHECK_RET( aNoConnect !=
nullptr &&
m_out !=
nullptr,
"" );
1189 m_out->
Print( aNestLevel,
"(no_connect (at %s %s)",
1201 wxCHECK_RET( aBusEntry !=
nullptr &&
m_out !=
nullptr,
"" );
1204 if( aBusEntry->
GetClass() ==
"SCH_BUS_BUS_ENTRY" )
1209 saveLine( &busEntryLine, aNestLevel );
1213 m_out->
Print( aNestLevel,
"(bus_entry (at %s %s) (size %s %s)\n",
1221 aBusEntry->
GetSize().
y ).c_str() );
1236 wxCHECK_RET( aShape !=
nullptr &&
m_out !=
nullptr,
"" );
1245 case SHAPE_T::CIRCLE:
1250 case SHAPE_T::RECTANGLE:
1255 case SHAPE_T::BEZIER:
1273 wxCHECK_RET( aRuleArea !=
nullptr &&
m_out !=
nullptr,
"" );
1283 wxCHECK_RET( aLine !=
nullptr &&
m_out !=
nullptr,
"" );
1291 case LAYER_BUS: lineType =
"bus";
break;
1298 m_out->
Print( aNestLevel,
"(%s (pts (xy %s %s) (xy %s %s))\n",
1320 wxCHECK_RET( aText !=
nullptr &&
m_out !=
nullptr,
"" );
1339 flag->GetPinLength() ).c_str() );
1365 if( aText->
GetText().Length() < 50 )
1377 m_out->
Print( aNestLevel + 1,
"(at %s %s %s)",
1386 m_out->
Print( 0,
" (fields_autoplaced yes)" );
1389 aText->EDA_TEXT::Format(
m_out, aNestLevel, 0 );
1405 wxCHECK_RET( aTextBox !=
nullptr &&
m_out !=
nullptr,
"" );
1414 m_out->
Print( aNestLevel + 1,
"(exclude_from_sim %s) (at %s %s %s) (size %s %s) (margins %s %s %s %s)",
1427 m_out->
Print( 0,
" (span %d %d)", cell->GetColSpan(), cell->GetRowSpan() );
1440 aTextBox->EDA_TEXT::Format(
m_out, aNestLevel, 0 );
1460 for(
int row = 0; row < aTable->
GetRowCount(); ++row )
1462 for(
int col = 0; col < aTable->
GetColCount(); ++col )
1468 minRow = std::min( minRow, row );
1469 maxRow = std::max( maxRow, row );
1470 minCol = std::min( minCol, col );
1471 maxCol = std::max( maxCol, col );
1480 wxCHECK_MSG( maxCol >= minCol && maxRow >= minRow, , wxT(
"No selected cells!" ) );
1484 for(
int row = minRow; row <= maxRow; row++ )
1489 for(
int col = minCol; col <= maxCol; col++ )
1496 wxCHECK_RET( aTable !=
nullptr &&
m_out !=
nullptr,
"" );
1498 m_out->
Print( aNestLevel,
"(table (column_count %d)\n",
1501 m_out->
Print( aNestLevel + 1,
"(border (external %s) (header %s)",
1513 m_out->
Print( aNestLevel + 1,
"(separators (rows %s) (cols %s)",
1525 m_out->
Print( aNestLevel + 1,
"(column_widths" );
1527 for(
int col = 0; col < aTable->
GetColCount(); ++col )
1536 m_out->
Print( aNestLevel + 1,
"(row_heights" );
1538 for(
int row = 0; row < aTable->
GetRowCount(); ++row )
1562 wxCHECK_RET( aAlias !=
nullptr,
"BUS_ALIAS* is NULL" );
1566 for(
const wxString& member : aAlias->Members() )
1568 if( !members.IsEmpty() )
1569 members += wxS(
" " );
1574 m_out->
Print( aNestLevel,
"(bus_alias %s (members %s))\n",
1583 if( aInstances.size() )
1586 m_out->
Print( aNestLevel,
"(sheet_instances\n" );
1590 wxString
path = instance.m_Path.AsString();
1592 if(
path.IsEmpty() )
1595 m_out->
Print( aNestLevel + 1,
"(path %s (page %s))\n",
1640 const wxString& aLibraryPath,
1645 bool powerSymbolsOnly = ( aProperties &&
1648 cacheLib( aLibraryPath, aProperties );
1652 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
1654 if( !powerSymbolsOnly || it->second->IsPower() )
1655 aSymbolNameList.Add( it->first );
1661 const wxString& aLibraryPath,
1666 bool powerSymbolsOnly = ( aProperties &&
1669 cacheLib( aLibraryPath, aProperties );
1673 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
1675 if( !powerSymbolsOnly || it->second->IsPower() )
1676 aSymbolList.push_back( it->second );
1682 const wxString& aSymbolName,
1687 cacheLib( aLibraryPath, aProperties );
1689 LIB_SYMBOL_MAP::const_iterator it =
m_cache->
m_symbols.find( aSymbolName );
1695 if( it ==
m_cache->
m_symbols.end() && aSymbolName.Contains( wxT(
"{slash}" ) ) )
1697 wxString unescaped = aSymbolName;
1698 unescaped.Replace( wxT(
"{slash}" ), wxT(
"/" ) );
1714 cacheLib( aLibraryPath, aProperties );
1728 cacheLib( aLibraryPath, aProperties );
1740 if( wxFileExists( aLibraryPath ) )
1742 THROW_IO_ERROR( wxString::Format(
_(
"Symbol library '%s' already exists." ),
1743 aLibraryPath.GetData() ) );
1759 wxFileName fn = aLibraryPath;
1761 if( !fn.FileExists() )
1766 if( wxRemove( aLibraryPath ) )
1768 THROW_IO_ERROR( wxString::Format(
_(
"Symbol library '%s' cannot be deleted." ),
1769 aLibraryPath.GetData() ) );
1804 wxFileName fn( aLibraryPath );
1806 return ( fn.FileExists() && fn.IsFileWritable() ) || fn.IsDirWritable();
1817 std::set<wxString> fieldNames;
1819 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
1821 std::vector<SCH_FIELD*> fields;
1822 it->second->GetFields( fields );
1826 if( field->IsMandatory() )
1831 fieldNames.insert( field->GetName() );
1835 std::copy( fieldNames.begin(), fieldNames.end(), std::back_inserter( aNames ) );
1846 std::string aSource,
1853 std::vector<LIB_SYMBOL*> newSymbols;
1854 std::unique_ptr<STRING_LINE_READER> reader = std::make_unique<STRING_LINE_READER>( aSymbolText,
1861 newSymbol = parser.
ParseSymbol( map, aFileVersion );
1864 newSymbols.emplace_back( newSymbol );
constexpr EDA_IU_SCALE schIUScale
wxString GetMajorMinorVersion()
Get only the major and minor version in a string major.minor.
This class handle bitmap images in KiCad.
const wxMemoryBuffer & GetImageDataBuffer() const
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
virtual void SetParent(EDA_ITEM *aParent)
EDA_ITEM * GetParent() const
EDA_ITEM_FLAGS GetFlags() const
FILL_T GetFillMode() const
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
COLOR4D GetFillColor() const
wxString SHAPE_T_asString() const
int GetTextHeight() const
bool IsDefaultFormatting() const
const EDA_ANGLE & GetTextAngle() const
virtual const wxString & GetText() const
Return the string associated with the text object.
virtual void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Output the object to aFormatter in s-expression form.
EE_TYPE OfType(KICAD_T aType) const
void WriteEmbeddedFiles(OUTPUTFORMATTER &aOut, int aNestLevel, bool aWriteData) const
Output formatter for the embedded files.
void ClearEmbeddedFonts()
Removes all embedded fonts from the collection.
bool GetAreFontsEmbedded() const
A LINE_READER that reads from an open file.
void Rewind()
Rewind the file and resets the line number back to zero.
char * ReadLine() override
Read a line of text into the buffer and increments the line number counter.
PROGRESS_REPORTER * m_progressReporter
Progress reporter to track the progress of the operation, may be nullptr.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
bool MakeRelativeTo(const KIID_PATH &aPath)
wxString AsString() const
Define a library symbol object.
An abstract class from which implementation specific LINE_READERs may be derived to read single lines...
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Output the page class to aFormatter in s-expression form.
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.
virtual const wxString GetProjectPath() const
Return the full path of the project.
virtual const wxString GetProjectName() const
Return the short name of the project.
Holds all the data relating to one schematic.
void EmbedFonts() override
Embed fonts in the schematic.
EMBEDDED_FILES * GetEmbeddedFiles() override
bool IsValid() const
A simple test if the schematic is loaded, not a complete one.
SCH_SHEET_LIST BuildSheetListSortedByPageNumbers() const override
PROJECT & Prj() const override
Return a reference to the project this schematic is part of.
Object to handle a bitmap image that can be inserted in a schematic.
VECTOR2I GetPosition() const override
BITMAP_BASE * GetImage() const
Base class for a bus or wire entry.
VECTOR2I GetPosition() const override
virtual STROKE_PARAMS GetStroke() const override
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
VECTOR2I GetPosition() const override
wxString GetCanonicalName() const
Get a non-language-specific name for a field which can be used for storage, variable look-up,...
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
bool CanAutoplace() const
A cache assistant for the KiCad s-expression symbol libraries.
static void SaveSymbol(LIB_SYMBOL *aSymbol, OUTPUTFORMATTER &aFormatter, int aNestLevel=0, const wxString &aLibName=wxEmptyString, bool aIncludeData=true)
void DeleteSymbol(const wxString &aName) override
void Save(const std::optional< bool > &aOpt=std::nullopt) override
Save the entire library to file m_libFileName;.
Object to parser s-expression symbol library and schematic file formats.
void ParseSchematic(SCH_SHEET *aSheet, bool aIsCopyablyOnly=false, int aFileVersion=SEXPR_SCHEMATIC_FILE_VERSION)
Parse the internal LINE_READER object into aSheet.
LIB_SYMBOL * ParseSymbol(LIB_SYMBOL_MAP &aSymbolLibMap, int aFileVersion=SEXPR_SYMBOL_LIB_FILE_VERSION)
Parse internal LINE_READER object into symbols and return all found.
wxString m_path
Root project path for loading child sheets.
void SaveSchematicFile(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_IO implementation knows about,...
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 symb...
void saveBusEntry(SCH_BUS_ENTRY_BASE *aBusEntry, int aNestLevel)
void SaveLibrary(const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
SCH_SHEET * LoadSchematicFile(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_IO implementation knows about,...
SCH_SHEET_PATH m_currentSheetPath
void saveRuleArea(SCH_RULE_AREA *aRuleArea, int aNestLevel)
void LoadContent(LINE_READER &aReader, SCH_SHEET *aSheet, int aVersion=SEXPR_SCHEMATIC_FILE_VERSION)
void saveBitmap(SCH_BITMAP *aBitmap, int aNestLevel)
void saveText(SCH_TEXT *aText, int aNestLevel)
bool m_appending
Schematic load append status.
int m_version
Version of file being loaded.
void loadFile(const wxString &aFileName, SCH_SHEET *aSheet)
static void FormatLibSymbol(LIB_SYMBOL *aPart, OUTPUTFORMATTER &aFormatter)
void cacheLib(const wxString &aLibraryFileName, const STRING_UTF8_MAP *aProperties)
void loadHierarchy(const SCH_SHEET_PATH &aParentSheetPath, SCH_SHEET *aSheet)
static std::vector< LIB_SYMBOL * > ParseLibSymbols(std::string &aSymbolText, std::string aSource, int aFileVersion=SEXPR_SCHEMATIC_FILE_VERSION)
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.
void saveField(SCH_FIELD *aField, int aNestLevel)
OUTPUTFORMATTER * m_out
The formatter for saving SCH_SCREEN objects.
void saveBusAlias(std::shared_ptr< BUS_ALIAS > aAlias, int aNestLevel)
bool isBuffering(const STRING_UTF8_MAP *aProperties)
wxString m_error
For throwing exceptions or errors on partial loads.
static const char * PropBuffering
The property used internally by the plugin to enable cache buffering which prevents the library file ...
SCH_SHEET * m_rootSheet
The root sheet of the schematic being loaded.
void init(SCHEMATIC *aSchematic, const STRING_UTF8_MAP *aProperties=nullptr)
initialize PLUGIN like a constructor would.
SCH_IO_KICAD_SEXPR_LIB_CACHE * m_cache
void Format(SCH_SHEET *aSheet)
bool IsLibraryWritable(const wxString &aLibraryPath) override
Return true if the library at aLibraryPath is writable.
void saveSymbol(SCH_SYMBOL *aSymbol, const SCHEMATIC &aSchematic, const SCH_SHEET_LIST &aSheetList, int aNestLevel, bool aForClipboard, const SCH_SHEET_PATH *aRelativePath=nullptr)
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.
void saveNoConnect(SCH_NO_CONNECT *aNoConnect, int aNestLevel)
void saveShape(SCH_SHAPE *aShape, int aNestLevel)
int GetModifyHash() const override
Return the modification hash from the library cache.
void saveJunction(SCH_JUNCTION *aJunction, int aNestLevel)
void saveTextBox(SCH_TEXTBOX *aText, int aNestLevel)
LIB_SYMBOL * LoadSymbol(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...
void saveInstances(const std::vector< SCH_SHEET_INSTANCE > &aSheets, int aNestLevel)
void saveSheet(SCH_SHEET *aSheet, const SCH_SHEET_LIST &aSheetList, int aNestLevel)
bool DeleteLibrary(const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
Delete an existing library and returns true, or if library does not exist returns false,...
void CreateLibrary(const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
Create a new empty library at aLibraryPath empty.
virtual ~SCH_IO_KICAD_SEXPR()
void saveLine(SCH_LINE *aLine, int aNestLevel)
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.
std::stack< wxString > m_currentPath
Stack to maintain nested sheet paths.
void saveTable(SCH_TABLE *aTable, int aNestLevel)
void GetAvailableSymbolFields(std::vector< wxString > &aNames) override
Retrieves a list of (custom) field names that are present on symbols in this library.
bool IsFile(const wxString &aFullPathAndFileName) const
void SetFileName(const wxString &aFileName)
virtual void AddSymbol(const LIB_SYMBOL *aSymbol)
bool IsFileChanged() const
wxString GetFileName() const
void SetModified(bool aModified=true)
Base class that schematic file and library loading and saving plugins should derive from.
Base class for any item which can be embedded within the SCHEMATIC container class,...
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
FIELDS_AUTOPLACED GetFieldsAutoplaced() const
Return whether the fields have been automatically placed.
wxString GetClass() const override
Return the class name.
VECTOR2I GetPosition() const override
SPIN_STYLE GetSpinStyle() const
LABEL_FLAG_SHAPE GetShape() const
std::vector< SCH_FIELD > & GetFields()
Segment description base class to describe items which have 2 end points (track, wire,...
virtual STROKE_PARAMS GetStroke() const override
VECTOR2I GetEndPoint() const
VECTOR2I GetStartPoint() const
void SetEndPoint(const VECTOR2I &aPosition)
VECTOR2I GetPosition() const override
const PAGE_INFO & GetPageSettings() const
auto & GetBusAliases() const
Return a set of bus aliases defined in this screen.
const std::map< wxString, LIB_SYMBOL * > & GetLibSymbols() const
Fetch a list of unique LIB_SYMBOL object pointers required to properly render each SCH_SYMBOL in this...
EE_RTREE & Items()
Gets the full RTree, usually for iterating.
const wxString & GetFileName() const
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
const TITLE_BLOCK & GetTitleBlock() const
KIID m_uuid
A unique identifier for each schematic file.
void SetFileReadOnly(bool aIsReadOnly)
void SetFileExists(bool aFileExists)
STROKE_PARAMS GetStroke() const override
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
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.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
bool empty() const
Forwarded method from std::vector.
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
SCH_SCREEN * LastScreen()
SCH_SHEET * at(size_t aIndex) const
Forwarded method from std::vector.
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
void pop_back()
Forwarded method from std::vector.
Define a sheet pin (label) used in sheets to create hierarchical schematics.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
bool GetExcludedFromBOM() const
wxString GetFileName() const
Return the filename corresponding to this sheet.
bool HasRootInstance() const
Check to see if this sheet has a root sheet instance.
std::vector< SCH_FIELD > & GetFields()
bool GetExcludedFromBoard() const
bool SearchHierarchy(const wxString &aFilename, SCH_SCREEN **aScreen)
Search the existing hierarchy for an instance of screen loaded from aFileName.
SCH_SCREEN * GetScreen() const
VECTOR2I GetPosition() const override
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
const SCH_SHEET_INSTANCE & GetRootInstance() const
Return the root sheet instance data.
KIGFX::COLOR4D GetBorderColor() const
bool GetExcludedFromSim() const override
int GetBorderWidth() const
std::vector< SCH_SHEET_PIN * > & GetPins()
const std::vector< SCH_SHEET_INSTANCE > & GetInstances() const
bool GetDNP() const
Set or clear the 'Do Not Populate' flaga.
KIGFX::COLOR4D GetBackgroundColor() const
std::vector< std::unique_ptr< SCH_PIN > > & GetRawPins()
const std::vector< SCH_SYMBOL_INSTANCE > & GetInstances() const
bool UseLibIdLookup() const
wxString GetSchSymbolLibraryName() const
SCH_FIELD * GetField(MANDATORY_FIELD_T aFieldType)
Return a mandatory field in this symbol.
VECTOR2I GetPosition() const override
const LIB_ID & GetLibId() const override
bool GetInstance(SCH_SYMBOL_INSTANCE &aInstance, const KIID_PATH &aSheetPath, bool aTestFromEnd=false) const
int GetOrientation() const
Get the display symbol orientation.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with SCH_FIELDs.
void SetRowHeight(int aRow, int aHeight)
const STROKE_PARAMS & GetSeparatorsStroke() const
void SetColCount(int aCount)
bool StrokeExternal() const
int GetRowHeight(int aRow) const
void SetColWidth(int aCol, int aWidth)
std::vector< SCH_TABLECELL * > GetCells() const
int GetColWidth(int aCol) const
const STROKE_PARAMS & GetBorderStroke() const
SCH_TABLECELL * GetCell(int aRow, int aCol) const
bool StrokeColumns() const
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
bool StrokeHeader() const
int GetMarginBottom() const
int GetMarginLeft() const
bool GetExcludedFromSim() const override
int GetMarginRight() const
VECTOR2I GetPosition() const override
bool GetExcludedFromSim() const override
virtual KIGFX::VIEW_ITEM * GetItem(unsigned int aIdx) const override
virtual unsigned int GetSize() const override
Return the number of stored items.
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
A name/value tuple with unique names and optional values.
bool Exists(const std::string &aProperty) const
Simple container to manage line stroke parameters.
void SetWidth(int aWidth)
void Format(OUTPUTFORMATTER *out, const EDA_IU_SCALE &aIuScale, int nestLevel) const
static const char * PropPowerSymsOnly
bool GetExcludedFromBoard() const
bool GetExcludedFromBOM() const
bool GetDNP() const
Set or clear the 'Do Not Populate' flaga.
bool GetExcludedFromSim() const override
virtual void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Output the object to aFormatter in s-expression form.
static REPORTER & GetInstance()
static void SetReporter(REPORTER *aReporter)
Set the reporter to use for reporting font substitution warnings.
#define MIME_BASE64_LENGTH
static constexpr EDA_ANGLE ANGLE_0
static constexpr EDA_ANGLE ANGLE_90
static constexpr EDA_ANGLE ANGLE_270
static constexpr EDA_ANGLE ANGLE_180
#define STRUCT_DELETED
flag indication structures to be erased
#define SKIP_STRUCT
flag indicating that the structure should be ignored
#define DEFAULT_SIZE_TEXT
This is the "default-of-the-default" hardcoded text size; individual application define their own def...
const wxChar *const traceSchPlugin
Flag to enable legacy schematic plugin debug output.
#define THROW_IO_ERROR(msg)
wxString LayerName(int aLayer)
Returns the default display name for a given layer.
SCH_LAYER_ID
Eeschema drawing layers.
#define UNIMPLEMENTED_FOR(type)
KICOMMON_API std::string FormatInternalUnits(const EDA_IU_SCALE &aIuScale, int aValue)
Converts aValue from internal units to a string appropriate for writing to file.
KICOMMON_API std::string FormatAngle(const EDA_ANGLE &aAngle)
Converts aAngle from board units to a string appropriate for writing to file.
#define SEXPR_SCHEMATIC_FILE_VERSION
Schematic file version.
const char * getSheetPinShapeToken(LABEL_FLAG_SHAPE aShape)
void formatArc(OUTPUTFORMATTER *aFormatter, int aNestLevel, EDA_SHAPE *aArc, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, bool aInvertY, const KIID &aUuid)
void formatFill(OUTPUTFORMATTER *aFormatter, int aNestLevel, FILL_T aFillMode, const COLOR4D &aFillColor)
Fill token formatting helper.
const char * getTextTypeToken(KICAD_T aType)
void formatCircle(OUTPUTFORMATTER *aFormatter, int aNestLevel, EDA_SHAPE *aCircle, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, bool aInvertY, const KIID &aUuid)
void formatBezier(OUTPUTFORMATTER *aFormatter, int aNestLevel, EDA_SHAPE *aBezier, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, bool aInvertY, const KIID &aUuid)
void formatRect(OUTPUTFORMATTER *aFormatter, int aNestLevel, EDA_SHAPE *aRect, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, bool aInvertY, const KIID &aUuid)
void formatPoly(OUTPUTFORMATTER *aFormatter, int aNestLevel, EDA_SHAPE *aPolyLine, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, bool aInvertY, const KIID &aUuid)
EDA_ANGLE getSheetPinAngle(SHEET_SIDE aSide)
@ SHEET_MANDATORY_FIELDS
The first 2 are mandatory, and must be instantiated in SCH_SHEET.
std::string toUTFTildaText(const wxString &txt)
Convert a wxString to UTF8 and replace any control characters with a ~, where a control character is ...
std::string FormatDouble2Str(double aValue)
Print a float number without using scientific notation and no trailing 0 This function is intended in...
std::string EscapedUTF8(const wxString &aString)
Return an 8 bit UTF8 string given aString in Unicode form.
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
constexpr int MilsToIU(int mils) const
A simple container for sheet instance information.
A simple container for schematic symbol instance information.
std::map< wxString, LIB_SYMBOL *, LibSymbolMapSort > LIB_SYMBOL_MAP
@ FOOTPRINT_FIELD
Field Name Module PCB, i.e. "16DIP300".
@ VALUE_FIELD
Field Value of part, i.e. "3.3K".
@ MANDATORY_FIELDS
The first 5 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors.
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".
wxLogTrace helper definitions.
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".