25#include <fmt/format.h>
28#include <wx/mstream.h>
38#include <schematic_lexer.h>
65using namespace TSCHEMATIC_T;
68#define SCH_PARSE_ERROR( text, reader, pos ) \
69 THROW_PARSE_ERROR( text, reader.GetSource(), reader.Line(), \
70 reader.LineNumber(), pos - reader.Line() )
86 const std::map<std::string, UTF8>* aProperties )
99 const std::map<std::string, UTF8>* aProperties )
101 wxASSERT( !aFileName || aSchematic !=
nullptr );
105 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() )
229 if( !
m_rootSheet->SearchHierarchy( fileName.GetFullPath(), &screen ) )
246 loadFile( fileName.GetFullPath(), aSheet );
261 if( fileName.FileExists() )
299 size_t lineCount = 0;
333 const std::map<std::string, UTF8>* aProperties )
335 wxCHECK_RET( aSheet !=
nullptr,
"NULL SCH_SHEET object." );
336 wxCHECK_RET( !aFileName.IsEmpty(),
"No schematic file name defined." );
343 wxString::Format(
_(
"Please report this bug. Error validating group "
344 "structure: %s\n\nSave anyway?" ),
346 _(
"Save Anyway" ) ) )
352 init( aSchematic, aProperties );
354 wxFileName fn = aFileName;
358 wxASSERT( fn.IsAbsolute() );
373 wxCHECK_RET( aSheet !=
nullptr,
"NULL SCH_SHEET* object." );
374 wxCHECK_RET(
m_schematic !=
nullptr,
"NULL SCHEMATIC* object." );
387 m_schematic->GetEmbeddedFiles()->ClearEmbeddedFonts();
389 m_out->Print(
"(kicad_sch (version %d) (generator \"eeschema\") (generator_version %s)",
399 m_out->Print(
"(lib_symbols" );
401 for(
const auto& [ libItemName, libSymbol ] : screen->
GetLibSymbols() )
406 for(
const std::shared_ptr<BUS_ALIAS>& alias : screen->
GetBusAliases() )
413 if( a->
Type() != b->Type() )
414 return a->
Type() < b->Type();
416 return a->
m_Uuid < b->m_Uuid;
419 std::multiset<
SCH_ITEM*,
decltype( cmp )> save_map( cmp );
425 save_map.insert( item );
430 switch( item->Type() )
490 wxASSERT(
"Unexpected schematic object type in SCH_IO_KICAD_SEXPR::Format()" );
496 std::vector< SCH_SHEET_INSTANCE> instances;
516 wxCHECK( aSelection && aSelectionPath && aFormatter, );
523 std::map<wxString, LIB_SYMBOL*> libSymbols;
525 std::set<SCH_TABLE*> promotedTables;
542 libSymbols[ libSymbolLookup ] = it->second;
545 if( !libSymbols.empty() )
547 m_out->Print(
"(lib_symbols" );
549 for(
const auto& [
name, libSymbol] : libSymbols )
555 for(
EDA_ITEM* edaItem : *aSelection )
557 if( !edaItem->IsSCH_ITEM() )
562 switch( item->
Type() )
565 saveSymbol(
static_cast<SCH_SYMBOL*
>( item ), aSchematic, sheets, aForClipboard, aSelectionPath );
617 if( promotedTables.count(
table ) )
623 promotedTables.insert(
table );
637 wxASSERT(
"Unexpected schematic object type in SCH_IO_KICAD_SEXPR::Format()" );
647 wxCHECK_RET( aSymbol !=
nullptr &&
m_out !=
nullptr,
"" );
653 if( symbol_name.size() )
659 libName =
"_NONAME_";
674 m_out->Print(
"(symbol" );
678 m_out->Print(
"(lib_name %s)",
682 m_out->Print(
"(lib_id %s) (at %s %s %s)",
693 if( mirrorX || mirrorY )
695 m_out->Print(
"(mirror %s %s)",
697 mirrorY ?
"y" :
"" );
708 wxASSERT( parentScreen );
712 std::optional<SCH_SHEET_PATH> ordinalPath =
713 m_schematic->Hierarchy().GetOrdinalPath( parentScreen );
720 aSymbol->
GetInstance( ordinalInstance, ordinalPath->Path() );
725 int unit = ordinalInstance.
m_Unit;
727 if( aForClipboard && aRelativePath )
732 unit = unitInstance.
m_Unit;
735 m_out->Print(
"(unit %d)", unit );
750 std::vector<SCH_FIELD*> orderedFields;
751 aSymbol->
GetFields( orderedFields,
false );
756 wxString value = field->GetText();
765 else if( aForClipboard && aSymbol->
GetInstances().size() && aRelativePath
782 field->SetText( value );
788 field->SetText( value );
791 for(
const std::unique_ptr<SCH_PIN>&
pin : aSymbol->
GetRawPins() )
796 if(
pin->GetAlt().IsEmpty() || (
pin->GetAlt() ==
pin->GetBaseName() ) )
798 m_out->Print(
"(pin %s",
m_out->Quotew(
pin->GetNumber() ).c_str() );
804 m_out->Print(
"(pin %s",
m_out->Quotew(
pin->GetNumber() ).c_str() );
806 m_out->Print(
"(alternate %s))",
m_out->Quotew(
pin->GetAlt() ).c_str() );
812 std::map<KIID, std::vector<SCH_SYMBOL_INSTANCE>> projectInstances;
814 m_out->Print(
"(instances" );
816 wxString projectName;
822 wxCHECK2( inst.m_Path.size(),
continue );
827 bool isOrphaned = ( inst.m_Path[0] == rootSheetUuid )
831 if( !aForClipboard && isOrphaned )
834 auto it = projectInstances.find( inst.m_Path[0] );
836 if( it == projectInstances.end() )
837 projectInstances[ inst.m_Path[0] ] = { inst };
839 it->second.emplace_back( inst );
842 for(
auto& [uuid, instances] : projectInstances )
844 wxCHECK2( instances.size(),
continue );
847 std::sort( instances.begin(), instances.end(),
850 return aLhs.m_Path < aRhs.m_Path;
853 projectName = instances[0].m_ProjectName;
855 m_out->Print(
"(project %s",
m_out->Quotew( projectName ).c_str() );
862 if( aForClipboard && aRelativePath )
867 m_out->Print(
"(path %s (reference %s) (unit %d))",
869 m_out->Quotew( instance.m_Reference ).c_str(),
885 wxCHECK_RET( aField !=
nullptr &&
m_out !=
nullptr,
"" );
894 m_out->Print(
"(property %s %s %s (at %s %s %s)",
896 m_out->Quotew( fieldName ).c_str(),
925 wxCHECK_RET(
m_out !=
nullptr,
"" );
932 wxCHECK_RET(
image !=
nullptr,
"wxImage* is NULL" );
934 m_out->Print(
"(image (at %s %s)",
952 wxMemoryOutputStream stream;
963 wxCHECK_RET( aSheet !=
nullptr &&
m_out !=
nullptr,
"" );
965 m_out->Print(
"(sheet (at %s %s) (size %s %s)",
990 m_out->Print(
"(fill (color %d %d %d %s))",
1003 m_out->Print(
"(pin %s %s (at %s %s %s)",
1007 pin->GetPosition().x ).c_str(),
1009 pin->GetPosition().y ).c_str(),
1016 m_out->Print(
")" );
1020 std::vector< SCH_SHEET_INSTANCE > sheetInstances = aSheet->
GetInstances();
1022 auto it = sheetInstances.begin();
1024 while( it != sheetInstances.end() )
1026 if( it->m_Path.size() == 0 )
1027 it = sheetInstances.erase( it );
1032 if( !sheetInstances.empty() )
1034 m_out->Print(
"(instances" );
1036 KIID lastProjectUuid;
1038 bool inProjectClause =
false;
1040 for(
size_t i = 0; i < sheetInstances.size(); i++ )
1047 if( ( sheetInstances[i].m_Path[0] == rootSheetUuid )
1050 if( inProjectClause && ( ( i + 1 == sheetInstances.size() )
1051 || lastProjectUuid != sheetInstances[i+1].m_Path[0] ) )
1053 m_out->Print(
")" );
1054 inProjectClause =
false;
1060 if( lastProjectUuid != sheetInstances[i].m_Path[0] )
1062 wxString projectName;
1064 if( sheetInstances[i].m_Path[0] == rootSheetUuid )
1065 projectName =
m_schematic->Project().GetProjectName();
1067 projectName = sheetInstances[i].m_ProjectName;
1069 lastProjectUuid = sheetInstances[i].m_Path[0];
1070 m_out->Print(
"(project %s",
m_out->Quotew( projectName ).c_str() );
1071 inProjectClause =
true;
1074 wxString
path = sheetInstances[i].m_Path.AsString();
1076 m_out->Print(
"(path %s (page %s))",
1078 m_out->Quotew( sheetInstances[i].m_PageNumber ).c_str() );
1080 if( inProjectClause && ( ( i + 1 == sheetInstances.size() )
1081 || lastProjectUuid != sheetInstances[i+1].m_Path[0] ) )
1083 m_out->Print(
")" );
1084 inProjectClause =
false;
1088 m_out->Print(
")" );
1091 m_out->Print(
")" );
1097 wxCHECK_RET( aJunction !=
nullptr &&
m_out !=
nullptr,
"" );
1099 m_out->Print(
"(junction (at %s %s) (diameter %s) (color %d %d %d %s)",
1112 m_out->Print(
")" );
1118 wxCHECK_RET( aNoConnect !=
nullptr &&
m_out !=
nullptr,
"" );
1120 m_out->Print(
"(no_connect (at %s %s)",
1127 m_out->Print(
")" );
1133 wxCHECK_RET( aBusEntry !=
nullptr &&
m_out !=
nullptr,
"" );
1136 if( aBusEntry->
GetClass() ==
"SCH_BUS_BUS_ENTRY" )
1145 m_out->Print(
"(bus_entry (at %s %s) (size %s %s)",
1153 aBusEntry->
GetSize().
y ).c_str() );
1157 m_out->Print(
")" );
1163 wxCHECK_RET( aShape !=
nullptr &&
m_out !=
nullptr,
"" );
1200 wxCHECK_RET( aRuleArea !=
nullptr &&
m_out !=
nullptr,
"" );
1202 m_out->Print(
"(rule_area " );
1211 m_out->Print(
")" );
1217 wxCHECK_RET( aLine !=
nullptr &&
m_out !=
nullptr,
"" );
1225 case LAYER_BUS: lineType =
"bus";
break;
1232 m_out->Print(
"(%s (pts (xy %s %s) (xy %s %s))",
1245 m_out->Print(
")" );
1251 wxCHECK_RET( aText !=
nullptr &&
m_out !=
nullptr,
"" );
1256 m_out->Print(
"(%s %s",
1267 m_out->Print(
"(length %s)",
1269 flag->GetPinLength() ).c_str() );
1295 m_out->Print(
"(at %s %s %s)",
1302 if( label && !label->
GetFields().empty() )
1310 aText->EDA_TEXT::Format(
m_out, 0 );
1319 m_out->Print(
")" );
1325 wxCHECK_RET( aTextBox !=
nullptr &&
m_out !=
nullptr,
"" );
1327 m_out->Print(
"(%s %s",
1336 m_out->Print(
"(at %s %s %s) (size %s %s) (margins %s %s %s %s)",
1348 m_out->Print(
"(span %d %d)", cell->GetColSpan(), cell->GetRowSpan() );
1354 aTextBox->EDA_TEXT::Format(
m_out, 0 );
1356 m_out->Print(
")" );
1371 for(
int row = 0; row < aTable->
GetRowCount(); ++row )
1373 for(
int col = 0; col < aTable->
GetColCount(); ++col )
1379 minRow = std::min( minRow, row );
1380 maxRow = std::max( maxRow, row );
1381 minCol = std::min( minCol, col );
1382 maxCol = std::max( maxCol, col );
1391 wxCHECK_MSG( maxCol >= minCol && maxRow >= minRow, , wxT(
"No selected cells!" ) );
1395 for(
int row = minRow; row <= maxRow; row++ )
1400 for(
int col = minCol; col <= maxCol; col++ )
1407 wxCHECK_RET( aTable !=
nullptr &&
m_out !=
nullptr,
"" );
1411 m_out->Print(
"(border" );
1418 m_out->Print(
")" );
1420 m_out->Print(
"(separators" );
1427 m_out->Print(
")" );
1429 m_out->Print(
"(column_widths" );
1431 for(
int col = 0; col < aTable->
GetColCount(); ++col )
1433 m_out->Print(
" %s",
1437 m_out->Print(
")" );
1439 m_out->Print(
"(row_heights" );
1441 for(
int row = 0; row < aTable->
GetRowCount(); ++row )
1443 m_out->Print(
" %s",
1447 m_out->Print(
")" );
1451 m_out->Print(
"(cells" );
1456 m_out->Print(
")" );
1457 m_out->Print(
")" );
1480 wxArrayString memberIds;
1483 memberIds.Add( member->m_Uuid.AsString() );
1487 m_out->Print(
"(members" );
1489 for(
const wxString& memberId : memberIds )
1490 m_out->Print(
" %s",
m_out->Quotew( memberId ).c_str() );
1492 m_out->Print(
")" );
1493 m_out->Print(
")" );
1499 wxCHECK_RET( aAlias !=
nullptr,
"BUS_ALIAS* is NULL" );
1503 for(
const wxString& member : aAlias->Members() )
1505 if( !members.IsEmpty() )
1506 members += wxS(
" " );
1508 members +=
m_out->Quotew( member );
1511 m_out->Print(
"(bus_alias %s (members %s))",
1512 m_out->Quotew( aAlias->GetName() ).c_str(),
1519 if( aInstances.size() )
1521 m_out->Print(
"(sheet_instances" );
1525 wxString
path = instance.m_Path.AsString();
1527 if(
path.IsEmpty() )
1530 m_out->Print(
"(path %s (page %s))",
1532 m_out->Quotew( instance.m_PageNumber ).c_str() );
1535 m_out->Print(
")" );
1541 const std::map<std::string, UTF8>* aProperties )
1567 return m_cache->GetModifyHash();
1575 const wxString& aLibraryPath,
1576 const std::map<std::string, UTF8>* aProperties )
1580 cacheLib( aLibraryPath, aProperties );
1584 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
1586 if( !powerSymbolsOnly || it->second->IsPower() )
1587 aSymbolNameList.Add( it->first );
1593 const wxString& aLibraryPath,
1594 const std::map<std::string, UTF8>* aProperties )
1598 cacheLib( aLibraryPath, aProperties );
1602 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
1604 if( !powerSymbolsOnly || it->second->IsPower() )
1605 aSymbolList.push_back( it->second );
1611 const wxString& aSymbolName,
1612 const std::map<std::string, UTF8>* aProperties )
1614 cacheLib( aLibraryPath, aProperties );
1616 LIB_SYMBOL_MAP::const_iterator it =
m_cache->m_symbols.find( aSymbolName );
1619 if( it ==
m_cache->m_symbols.end() && aSymbolName.Contains(
'/' ) )
1622 if( it ==
m_cache->m_symbols.end() && aSymbolName.Contains( wxT(
"{slash}" ) ) )
1624 wxString unescaped = aSymbolName;
1625 unescaped.Replace( wxT(
"{slash}" ), wxT(
"/" ) );
1626 it =
m_cache->m_symbols.find( unescaped );
1629 if( it ==
m_cache->m_symbols.end() )
1637 const std::map<std::string, UTF8>* aProperties )
1639 cacheLib( aLibraryPath, aProperties );
1641 m_cache->AddSymbol( aSymbol );
1649 const std::map<std::string, UTF8>* aProperties )
1651 cacheLib( aLibraryPath, aProperties );
1653 m_cache->DeleteSymbol( aSymbolName );
1661 const std::map<std::string, UTF8>* aProperties )
1663 if( wxFileExists( aLibraryPath ) )
1665 THROW_IO_ERROR( wxString::Format(
_(
"Symbol library '%s' already exists." ),
1666 aLibraryPath.GetData() ) );
1678 const std::map<std::string, UTF8>* aProperties )
1680 wxFileName fn = aLibraryPath;
1682 if( !fn.FileExists() )
1687 if( wxRemove( aLibraryPath ) )
1689 THROW_IO_ERROR( wxString::Format(
_(
"Symbol library '%s' cannot be deleted." ),
1690 aLibraryPath.GetData() ) );
1704 const std::map<std::string, UTF8>* aProperties )
1709 wxString oldFileName =
m_cache->GetFileName();
1711 if( !
m_cache->IsFile( aLibraryPath ) )
1712 m_cache->SetFileName( aLibraryPath );
1717 m_cache->SetFileName( oldFileName );
1728 wxFileName fn( aLibraryPath );
1729 return fn.IsOk() && fn.FileExists();
1735 wxFileName fn( aLibraryPath );
1737 if( fn.FileExists() )
1738 return fn.IsFileWritable();
1740 return fn.IsDirWritable();
1751 std::set<wxString> fieldNames;
1753 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
1755 std::vector<SCH_FIELD*> fields;
1756 it->second->GetFields( fields );
1760 if( field->IsMandatory() )
1765 fieldNames.insert( field->GetName() );
1769 std::copy( fieldNames.begin(), fieldNames.end(), std::back_inserter( aNames ) );
1780 std::string aSource,
1786 std::vector<LIB_SYMBOL*> newSymbols;
1787 std::unique_ptr<STRING_LINE_READER> reader = std::make_unique<STRING_LINE_READER>( aSymbolText,
1794 newSymbol = parser.
ParseSymbol( map, aFileVersion );
1797 newSymbols.emplace_back( newSymbol );
constexpr EDA_IU_SCALE schIUScale
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
wxString GetMajorMinorVersion()
Get only the major and minor version in a string major.minor.
This class handle bitmap images in KiCad.
bool SaveImageData(wxOutputStream &aOutStream) const
Write the bitmap data to aOutStream.
const LIB_ID & GetDesignBlockLibId() const
std::unordered_set< EDA_ITEM * > & GetItems()
bool HasDesignBlockLink() const
A base class for most all the KiCad significant classes used in schematics and boards.
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
virtual bool IsLocked() 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 bool IsVisible() const
virtual void Format(OUTPUTFORMATTER *aFormatter, 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.
virtual bool CanReadLibrary(const wxString &aFileName) const
Checks if this IO object can read the specified library file/directory.
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...
void Format(OUTPUTFORMATTER *aFormatter) const
Output the page class to aFormatter in s-expression form.
virtual const wxString GetProjectPath() const
Return the full path of the project.
A REFERENCE_IMAGE is a wrapper around a BITMAP_IMAGE that is displayed in an editor as a reference fo...
VECTOR2I GetPosition() const
const BITMAP_BASE & GetImage() const
Get the underlying image.
double GetImageScale() const
Holds all the data relating to one schematic.
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
PROJECT & Project() const
Return a reference to the project this schematic is part of.
bool IsValid() const
A simple test if the schematic is loaded, not a complete one.
Object to handle a bitmap image that can be inserted in a schematic.
REFERENCE_IMAGE & GetReferenceImage()
Base class for a bus or wire entry.
VECTOR2I GetPosition() const override
virtual STROKE_PARAMS GetStroke() const override
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 set of SCH_ITEMs (i.e., without duplicates).
A cache assistant for the KiCad s-expression symbol libraries.
static void SaveSymbol(LIB_SYMBOL *aSymbol, OUTPUTFORMATTER &aFormatter, const wxString &aLibName=wxEmptyString, bool aIncludeData=true)
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 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 saveShape(SCH_SHAPE *aShape)
void SaveSchematicFile(const wxString &aFileName, SCH_SHEET *aSheet, SCHEMATIC *aSchematic, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Write aSchematic to a storage file in a format that this SCH_IO implementation knows about,...
void SaveLibrary(const wxString &aLibraryPath, const std::map< std::string, UTF8 > *aProperties=nullptr) override
SCH_SHEET_PATH m_currentSheetPath
void saveGroup(SCH_GROUP *aGroup)
void LoadContent(LINE_READER &aReader, SCH_SHEET *aSheet, int aVersion=SEXPR_SCHEMATIC_FILE_VERSION)
void EnumerateSymbolLib(wxArrayString &aSymbolNameList, const wxString &aLibraryPath, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Populate a list of LIB_SYMBOL alias names contained within the library aLibraryPath.
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 DeleteSymbol(const wxString &aLibraryPath, const wxString &aSymbolName, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Delete the entire LIB_SYMBOL associated with aAliasName from the library aLibraryPath.
void loadHierarchy(const SCH_SHEET_PATH &aParentSheetPath, SCH_SHEET *aSheet)
void SaveSymbol(const wxString &aLibraryPath, const LIB_SYMBOL *aSymbol, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Write aSymbol to an existing library located at aLibraryPath.
static std::vector< LIB_SYMBOL * > ParseLibSymbols(std::string &aSymbolText, std::string aSource, int aFileVersion=SEXPR_SCHEMATIC_FILE_VERSION)
void saveBusAlias(std::shared_ptr< BUS_ALIAS > aAlias)
OUTPUTFORMATTER * m_out
The formatter for saving SCH_SCREEN objects.
SCH_SHEET * LoadSchematicFile(const wxString &aFileName, SCHEMATIC *aSchematic, SCH_SHEET *aAppendToMe=nullptr, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Load information from some input file format that this SCH_IO implementation knows about,...
LIB_SYMBOL * LoadSymbol(const wxString &aLibraryPath, const wxString &aAliasName, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Load a LIB_SYMBOL object having aPartName from the aLibraryPath containing a library format that this...
wxString m_error
For throwing exceptions or errors on partial loads.
void saveInstances(const std::vector< SCH_SHEET_INSTANCE > &aSheets)
bool isBuffering(const std::map< std::string, UTF8 > *aProperties)
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 cacheLib(const wxString &aLibraryFileName, const std::map< std::string, UTF8 > *aProperties)
void saveRuleArea(SCH_RULE_AREA *aRuleArea)
void saveField(SCH_FIELD *aField)
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 init(SCHEMATIC *aSchematic, const std::map< std::string, UTF8 > *aProperties=nullptr)
initialize PLUGIN like a constructor would.
bool DeleteLibrary(const wxString &aLibraryPath, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Delete an existing library and returns true, or if library does not exist returns false,...
void saveBitmap(const SCH_BITMAP &aBitmap)
void saveText(SCH_TEXT *aText)
void saveSheet(SCH_SHEET *aSheet, const SCH_SHEET_LIST &aSheetList)
int GetModifyHash() const override
Return the modification hash from the library cache.
bool CanReadLibrary(const wxString &aLibraryPath) const override
Checks if this IO object can read the specified library file/directory.
virtual ~SCH_IO_KICAD_SEXPR()
void saveLine(SCH_LINE *aLine)
void saveNoConnect(SCH_NO_CONNECT *aNoConnect)
void saveTable(SCH_TABLE *aTable)
std::stack< wxString > m_currentPath
Stack to maintain nested sheet paths.
void CreateLibrary(const wxString &aLibraryPath, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Create a new empty library at aLibraryPath empty.
void saveJunction(SCH_JUNCTION *aJunction)
std::function< bool(wxString aTitle, int aIcon, wxString aMsg, wxString aAction)> m_queryUserCallback
void saveTextBox(SCH_TEXTBOX *aText)
void saveSymbol(SCH_SYMBOL *aSymbol, const SCHEMATIC &aSchematic, const SCH_SHEET_LIST &aSheetList, bool aForClipboard, const SCH_SHEET_PATH *aRelativePath=nullptr)
void saveBusEntry(SCH_BUS_ENTRY_BASE *aBusEntry)
void GetAvailableSymbolFields(std::vector< wxString > &aNames) override
Retrieves a list of (custom) field names that are present on symbols in this library.
SCH_IO(const wxString &aName)
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.
AUTOPLACE_ALGO 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
bool GetExcludedFromSim() const override
bool GetExcludedFromBoard() const override
bool GetDNP() const override
Set or clear the 'Do Not Populate' flag.
bool GetExcludedFromBOM() 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()
Get the full RTree, usually for iterating.
const wxString & GetFileName() const
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
wxString GroupsSanityCheck(bool repair=false)
Consistency check of internal m_groups structure.
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()
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 GetExcludedFromBoard() const override
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()
Return a reference to the vector holding the sheet's fields.
bool GetExcludedFromBOM() const override
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()
bool GetDNP() const override
Set or clear the 'Do Not Populate' flags.
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
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
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 override
Get the display symbol orientation.
wxString GetPrefix() const
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
bool StrokeHeaderSeparator() 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.
int GetMarginBottom() const
int GetMarginLeft() const
bool GetExcludedFromSim() const override
int GetMarginRight() const
VECTOR2I GetPosition() const override
bool GetExcludedFromSim() const override
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
Simple container to manage line stroke parameters.
void SetWidth(int aWidth)
void Format(OUTPUTFORMATTER *out, const EDA_IU_SCALE &aIuScale) const
static const char * PropPowerSymsOnly
bool GetExcludedFromBoard() const override
bool GetDNP() const override
Set or clear the 'Do Not Populate' flag.
bool GetExcludedFromBOM() const override
bool GetExcludedFromSim() const override
virtual void Format(OUTPUTFORMATTER *aFormatter) const
Output the object to aFormatter in s-expression form.
const char * c_str() const
static REPORTER & GetInstance()
static void SetReporter(REPORTER *aReporter)
Set the reporter to use for reporting font substitution warnings.
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
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
#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)
macro which captures the "call site" values of FILE_, __FUNCTION & LINE
wxString LayerName(int aLayer)
Returns the default display name for a given layer.
#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)
Convert aAngle from board units to a string appropriate for writing to file.
#define SEXPR_SCHEMATIC_FILE_VERSION
Schematic file version.
Class to handle a set of SCH_ITEMs.
void formatArc(OUTPUTFORMATTER *aFormatter, EDA_SHAPE *aArc, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, bool aInvertY, const KIID &aUuid)
const char * getSheetPinShapeToken(LABEL_FLAG_SHAPE aShape)
void formatCircle(OUTPUTFORMATTER *aFormatter, EDA_SHAPE *aCircle, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, bool aInvertY, const KIID &aUuid)
const char * getTextTypeToken(KICAD_T aType)
void formatBezier(OUTPUTFORMATTER *aFormatter, EDA_SHAPE *aBezier, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, bool aInvertY, const KIID &aUuid)
void formatRect(OUTPUTFORMATTER *aFormatter, EDA_SHAPE *aRect, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, bool aInvertY, const KIID &aUuid)
void formatPoly(OUTPUTFORMATTER *aFormatter, 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)
void formatFill(OUTPUTFORMATTER *aFormatter, FILL_T aFillMode, const COLOR4D &aFillColor)
Fill token formatting helper.
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.
A simple container for sheet instance information.
A simple container for schematic symbol instance information.
std::map< wxString, LIB_SYMBOL *, LibSymbolMapSort > LIB_SYMBOL_MAP
FIELD_T
The set of all field indices assuming an array like sequence that a SCH_COMPONENT or LIB_PART can hol...
@ REFERENCE
Field Reference of part, i.e. "IC21".
wxLogTrace helper definitions.
VECTOR2< int32_t > VECTOR2I