30#include <wx/mstream.h>
55#include <schematic_lexer.h>
65#include <boost/algorithm/string/join.hpp>
67using namespace TSCHEMATIC_T;
70#define SCH_PARSE_ERROR( text, reader, pos ) \
71 THROW_PARSE_ERROR( text, reader.GetSource(), reader.Line(), \
72 reader.LineNumber(), pos - reader.Line() )
103 wxASSERT( !aFileName || aSchematic !=
nullptr );
108 wxFileName fn = aFileName;
113 wxASSERT( fn.IsAbsolute() );
123 if( !normedFn.IsAbsolute() )
125 if( aFileName.Right( normedFn.GetFullPath().Length() ) == normedFn.GetFullPath() )
126 m_path = aFileName.Left( aFileName.Length() - normedFn.GetFullPath().Length() );
140 init( aSchematic, aProperties );
142 if( aAppendToMe ==
nullptr )
145 std::unique_ptr<SCH_SHEET> newSheet = std::make_unique<SCH_SHEET>( aSchematic );
147 wxFileName relPath( aFileName );
153 newSheet->SetFileName( relPath.GetFullPath() );
158 sheet = newSheet.release();
163 wxCHECK_MSG( aSchematic->
IsValid(),
nullptr,
"Can't append to a schematic with no root!" );
192 if( !fileName.IsAbsolute() )
201 wxLogTrace(
traceSchPlugin,
"Loading '%s'", fileName.GetFullPath() );
205 while( !ancestorSheetPath.
empty() )
212 m_error += wxString::Format(
_(
"Could not load sheet '%s' because it already "
213 "appears as a direct ancestor in the schematic "
215 fileName.GetFullPath() );
217 fileName = wxEmptyString;
225 if( ancestorSheetPath.
empty() )
246 loadFile( fileName.GetFullPath(), aSheet );
261 if( fileName.FileExists() )
299 size_t lineCount = 0;
336 wxCHECK_RET( aSheet !=
nullptr,
"NULL SCH_SHEET object." );
337 wxCHECK_RET( !aFileName.IsEmpty(),
"No schematic file name defined." );
341 init( aSchematic, aProperties );
343 wxFileName fn = aFileName;
347 wxASSERT( fn.IsAbsolute() );
362 wxCHECK_RET( aSheet !=
nullptr,
"NULL SCH_SHEET* object." );
363 wxCHECK_RET(
m_schematic !=
nullptr,
"NULL SCHEMATIC* object." );
369 m_out->
Print( 0,
"(kicad_sch (version %d) (generator \"eeschema\") (generator_version \"%s\")\n\n",
381 for(
const auto& [ libItemName, libSymbol ] : screen->
GetLibSymbols() )
386 for(
const std::shared_ptr<BUS_ALIAS>& alias : screen->
GetBusAliases() )
393 if( a->
Type() != b->Type() )
394 return a->
Type() < b->Type();
396 return a->
m_Uuid < b->m_Uuid;
399 std::multiset<
SCH_ITEM*,
decltype( cmp )> save_map( cmp );
405 save_map.insert( item );
413 if( itemType != item->Type() )
415 itemType = item->Type();
425 switch( item->Type() )
455 if( layer != item->GetLayer() )
459 layer = item->GetLayer();
463 layer = item->GetLayer();
496 wxASSERT(
"Unexpected schematic object type in SCH_IO_KICAD_SEXPR::Format()" );
502 std::vector< SCH_SHEET_INSTANCE> instances;
516 wxCHECK( aSelection && aSelectionPath && aFormatter, );
526 std::map<wxString, LIB_SYMBOL*> libSymbols;
528 std::set<SCH_TABLE*> promotedTables;
530 for( i = 0; i < aSelection->
GetSize(); ++i )
534 wxCHECK2( item,
continue );
541 wxCHECK2( symbol,
continue );
551 libSymbols[ libSymbolLookup ] = it->second;
554 if( !libSymbols.empty() )
558 for(
const std::pair<const wxString, LIB_SYMBOL*>& libSymbol : libSymbols )
567 for( i = 0; i < aSelection->
GetSize(); ++i )
571 switch( item->
Type() )
627 if( promotedTables.count( table ) )
633 promotedTables.insert( table );
643 wxASSERT(
"Unexpected schematic object type in SCH_IO_KICAD_SEXPR::Format()" );
650 int aNestLevel,
bool aForClipboard,
653 wxCHECK_RET( aSymbol !=
nullptr &&
m_out !=
nullptr,
"" );
659 if( symbol_name.size() )
665 libName =
"_NONAME_";
688 m_out->
Print( 0,
" (lib_id %s) (at %s %s %s)",
699 if( mirrorX || mirrorY )
718 if( aForClipboard && aRelativePath )
723 unit = unitInstance.
m_Unit;
733 m_out->
Print( aNestLevel + 1,
"(exclude_from_sim %s)",
740 m_out->
Print( 0,
" (fields_autoplaced yes)" );
750 int id = field.GetId();
751 wxString value = field.GetText();
759 field.SetText( aSymbol->
GetInstances()[0].m_Reference );
770 else if( aForClipboard && aSymbol->
GetInstances().size() && aRelativePath
787 field.SetText( value );
793 field.SetText( value );
796 for(
const std::unique_ptr<SCH_PIN>&
pin : aSymbol->
GetRawPins() )
798 if(
pin->GetAlt().IsEmpty() )
808 m_out->
Print( aNestLevel + 1,
" (alternate %s))\n",
815 std::map<KIID, std::vector<SCH_SYMBOL_INSTANCE>> projectInstances;
817 m_out->
Print( aNestLevel + 1,
"(instances\n" );
819 wxString projectName;
820 KIID lastProjectUuid;
827 wxCHECK2( inst.m_Path.size(),
continue );
832 bool isOrphaned = ( inst.m_Path[0] == rootSheetUuid )
836 if( !aForClipboard && isOrphaned )
839 auto it = projectInstances.find( inst.m_Path[0] );
841 if( it == projectInstances.end() )
843 projectInstances[ inst.m_Path[0] ] = { inst };
847 it->second.emplace_back( inst );
851 for(
auto& [uuid, instances] : projectInstances )
853 wxCHECK2( instances.size(),
continue );
856 std::sort( instances.begin(), instances.end(),
859 return aLhs.m_Path < aRhs.m_Path;
862 projectName = instances[0].m_ProjectName;
864 m_out->
Print( aNestLevel + 2,
"(project %s\n",
872 if( aForClipboard && aRelativePath )
879 m_out->
Print( aNestLevel + 4,
"(reference %s) (unit %d)\n",
897 wxCHECK_RET( aField !=
nullptr &&
m_out !=
nullptr,
"" );
903 if( aField->
GetId() == -1 )
907 if( !aField->
GetName().IsEmpty() )
918 m_out->
Print( aNestLevel,
"(property %s %s (at %s %s %s)",
949 wxCHECK_RET( aBitmap !=
nullptr &&
m_out !=
nullptr,
"" );
953 wxCHECK_RET(
image !=
nullptr,
"wxImage* is NULL" );
955 m_out->
Print( aNestLevel,
"(image (at %s %s)",
984#define MIME_BASE64_LENGTH 76
988 while( first < out.Length() )
1003 wxCHECK_RET( aSheet !=
nullptr &&
m_out !=
nullptr,
"" );
1005 m_out->
Print( aNestLevel,
"(sheet (at %s %s) (size %s %s)",
1016 m_out->
Print( 0,
" (fields_autoplaced yes)" );
1027 m_out->
Print( aNestLevel + 1,
"(fill (color %d %d %d %0.4f))\n",
1044 m_out->
Print( aNestLevel + 1,
"(pin %s %s (at %s %s %s)\n",
1048 pin->GetPosition().x ).c_str(),
1050 pin->GetPosition().y ).c_str(),
1053 pin->Format(
m_out, aNestLevel + 1, 0 );
1061 std::vector< SCH_SHEET_INSTANCE > sheetInstances = aSheet->
GetInstances();
1063 auto it = sheetInstances.begin();
1065 while( it != sheetInstances.end() )
1067 if( it->m_Path.size() == 0 )
1068 it = sheetInstances.erase( it );
1073 if( !sheetInstances.empty() )
1075 m_out->
Print( aNestLevel + 1,
"(instances\n" );
1077 KIID lastProjectUuid;
1080 bool project_open =
false;
1082 for(
size_t i = 0; i < sheetInstances.size(); i++ )
1089 if( ( sheetInstances[i].m_Path[0] == rootSheetUuid )
1092 if( project_open && ( ( i + 1 == sheetInstances.size() )
1093 || lastProjectUuid != sheetInstances[i+1].m_Path[0] ) )
1096 project_open =
false;
1102 if( lastProjectUuid != sheetInstances[i].m_Path[0] )
1104 wxString projectName;
1106 if( sheetInstances[i].m_Path[0] == rootSheetUuid )
1109 projectName = sheetInstances[i].m_ProjectName;
1111 lastProjectUuid = sheetInstances[i].m_Path[0];
1112 m_out->
Print( aNestLevel + 2,
"(project %s\n",
1114 project_open =
true;
1117 wxString
path = sheetInstances[i].m_Path.AsString();
1119 m_out->
Print( aNestLevel + 3,
"(path %s (page %s))\n",
1121 m_out->
Quotew( sheetInstances[i].m_PageNumber ).c_str() );
1123 if( project_open && ( ( i + 1 == sheetInstances.size() )
1124 || lastProjectUuid != sheetInstances[i+1].m_Path[0] ) )
1127 project_open =
false;
1140 wxCHECK_RET( aJunction !=
nullptr &&
m_out !=
nullptr,
"" );
1142 m_out->
Print( aNestLevel,
"(junction (at %s %s) (diameter %s) (color %d %d %d %s)\n",
1162 wxCHECK_RET( aNoConnect !=
nullptr &&
m_out !=
nullptr,
"" );
1164 m_out->
Print( aNestLevel,
"(no_connect (at %s %s)",
1176 wxCHECK_RET( aBusEntry !=
nullptr &&
m_out !=
nullptr,
"" );
1179 if( aBusEntry->
GetClass() ==
"SCH_BUS_BUS_ENTRY" )
1184 saveLine( &busEntryLine, aNestLevel );
1188 m_out->
Print( aNestLevel,
"(bus_entry (at %s %s) (size %s %s)\n",
1196 aBusEntry->
GetSize().
y ).c_str() );
1211 wxCHECK_RET( aShape !=
nullptr &&
m_out !=
nullptr,
"" );
1220 case SHAPE_T::CIRCLE:
1225 case SHAPE_T::RECTANGLE:
1230 case SHAPE_T::BEZIER:
1248 wxCHECK_RET( aRuleArea !=
nullptr &&
m_out !=
nullptr,
"" );
1258 wxCHECK_RET( aLine !=
nullptr &&
m_out !=
nullptr,
"" );
1266 case LAYER_BUS: lineType =
"bus";
break;
1273 m_out->
Print( aNestLevel,
"(%s (pts (xy %s %s) (xy %s %s))\n",
1295 wxCHECK_RET( aText !=
nullptr &&
m_out !=
nullptr,
"" );
1314 flag->GetPinLength() ).c_str() );
1340 if( aText->
GetText().Length() < 50 )
1352 m_out->
Print( aNestLevel + 1,
"(at %s %s %s)",
1361 m_out->
Print( 0,
" (fields_autoplaced yes)" );
1364 aText->EDA_TEXT::Format(
m_out, aNestLevel, 0 );
1380 wxCHECK_RET( aTextBox !=
nullptr &&
m_out !=
nullptr,
"" );
1389 m_out->
Print( aNestLevel + 1,
"(exclude_from_sim %s) (at %s %s %s) (size %s %s) (margins %s %s %s %s)",
1402 m_out->
Print( 0,
" (span %d %d)", cell->GetColSpan(), cell->GetRowSpan() );
1415 aTextBox->EDA_TEXT::Format(
m_out, aNestLevel, 0 );
1435 for(
int row = 0; row < aTable->
GetRowCount(); ++row )
1437 for(
int col = 0; col < aTable->
GetColCount(); ++col )
1443 minRow = std::min( minRow, row );
1444 maxRow = std::max( maxRow, row );
1445 minCol = std::min( minCol, col );
1446 maxCol = std::max( maxCol, col );
1455 wxCHECK_MSG( maxCol >= minCol && maxRow >= minRow, , wxT(
"No selected cells!" ) );
1459 for(
int row = minRow; row <= maxRow; row++ )
1464 for(
int col = minCol; col <= maxCol; col++ )
1471 wxCHECK_RET( aTable !=
nullptr &&
m_out !=
nullptr,
"" );
1473 m_out->
Print( aNestLevel,
"(table (column_count %d)\n",
1476 m_out->
Print( aNestLevel + 1,
"(border (external %s) (header %s)",
1488 m_out->
Print( aNestLevel + 1,
"(separators (rows %s) (cols %s)",
1500 m_out->
Print( aNestLevel + 1,
"(column_widths" );
1502 for(
int col = 0; col < aTable->
GetColCount(); ++col )
1511 m_out->
Print( aNestLevel + 1,
"(row_heights" );
1513 for(
int row = 0; row < aTable->
GetRowCount(); ++row )
1537 wxCHECK_RET( aAlias !=
nullptr,
"BUS_ALIAS* is NULL" );
1541 for(
const wxString& member : aAlias->Members() )
1543 if( !members.IsEmpty() )
1544 members += wxS(
" " );
1549 m_out->
Print( aNestLevel,
"(bus_alias %s (members %s))\n",
1558 if( aInstances.size() )
1561 m_out->
Print( aNestLevel,
"(sheet_instances\n" );
1565 wxString
path = instance.m_Path.AsString();
1567 if(
path.IsEmpty() )
1570 m_out->
Print( aNestLevel + 1,
"(path %s (page %s))\n",
1612 const wxString& aLibraryPath,
1617 bool powerSymbolsOnly = ( aProperties &&
1620 cacheLib( aLibraryPath, aProperties );
1624 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
1626 if( !powerSymbolsOnly || it->second->IsPower() )
1627 aSymbolNameList.Add( it->first );
1633 const wxString& aLibraryPath,
1638 bool powerSymbolsOnly = ( aProperties &&
1641 cacheLib( aLibraryPath, aProperties );
1645 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
1647 if( !powerSymbolsOnly || it->second->IsPower() )
1648 aSymbolList.push_back( it->second );
1654 const wxString& aSymbolName,
1659 cacheLib( aLibraryPath, aProperties );
1661 LIB_SYMBOL_MAP::const_iterator it =
m_cache->
m_symbols.find( aSymbolName );
1667 if( it ==
m_cache->
m_symbols.end() && aSymbolName.Contains( wxT(
"{slash}" ) ) )
1669 wxString unescaped = aSymbolName;
1670 unescaped.Replace( wxT(
"{slash}" ), wxT(
"/" ) );
1686 cacheLib( aLibraryPath, aProperties );
1700 cacheLib( aLibraryPath, aProperties );
1712 if( wxFileExists( aLibraryPath ) )
1714 THROW_IO_ERROR( wxString::Format(
_(
"Symbol library '%s' already exists." ),
1715 aLibraryPath.GetData() ) );
1731 wxFileName fn = aLibraryPath;
1733 if( !fn.FileExists() )
1738 if( wxRemove( aLibraryPath ) )
1740 THROW_IO_ERROR( wxString::Format(
_(
"Symbol library '%s' cannot be deleted." ),
1741 aLibraryPath.GetData() ) );
1776 wxFileName fn( aLibraryPath );
1778 return ( fn.FileExists() && fn.IsFileWritable() ) || fn.IsDirWritable();
1789 std::set<wxString> fieldNames;
1791 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
1793 std::vector<SCH_FIELD*> fields;
1794 it->second->GetFields( fields );
1798 if( field->IsMandatory() )
1803 fieldNames.insert( field->GetName() );
1807 std::copy( fieldNames.begin(), fieldNames.end(), std::back_inserter( aNames ) );
1818 std::string aSource,
1825 std::vector<LIB_SYMBOL*> newSymbols;
1826 std::unique_ptr<STRING_LINE_READER> reader = std::make_unique<STRING_LINE_READER>( aSymbolText,
1833 newSymbol = parser.
ParseSymbol( map, aFileVersion );
1836 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
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.
SCH_SHEET_LIST GetSheets() const override
Builds and returns an updated schematic hierarchy TODO: can this be cached?
bool IsValid() const
A simple test if the schematic is loaded, not a complete one.
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)
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 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)
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.
void saveSymbol(SCH_SYMBOL *aSymbol, const SCHEMATIC &aSchematic, int aNestLevel, bool aForClipboard, const SCH_SHEET_PATH *aRelativePath=nullptr)
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 saveSheet(SCH_SHEET *aSheet, int aNestLevel)
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.
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 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
int GetBorderWidth() const
std::vector< SCH_SHEET_PIN * > & GetPins()
const std::vector< SCH_SHEET_INSTANCE > & GetInstances() const
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.
#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.
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)
const char * getSheetPinShapeToken(LABEL_FLAG_SHAPE aShape)
void formatFill(OUTPUTFORMATTER *aFormatter, int aNestLevel, FILL_T aFillMode, const COLOR4D &aFillColor)
Fill token formatting helper.
const char * getTextTypeToken(KICAD_T aType)
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)
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".