26#include <wx/mstream.h>
37#include <schematic_lexer.h>
63using namespace TSCHEMATIC_T;
66#define SCH_PARSE_ERROR( text, reader, pos ) \
67 THROW_PARSE_ERROR( text, reader.GetSource(), reader.Line(), \
68 reader.LineNumber(), pos - reader.Line() )
97 const std::map<std::string, UTF8>* aProperties )
99 wxASSERT( !aFileName || aSchematic !=
nullptr );
104 wxFileName fn = aFileName;
112 wxASSERT( fn.IsAbsolute() );
122 if( !normedFn.IsAbsolute() )
124 if( aFileName.Right( normedFn.GetFullPath().Length() ) == normedFn.GetFullPath() )
125 m_path = aFileName.Left( aFileName.Length() - normedFn.GetFullPath().Length() );
139 init( aSchematic, aProperties );
141 if( aAppendToMe ==
nullptr )
144 std::unique_ptr<SCH_SHEET> newSheet = std::make_unique<SCH_SHEET>( aSchematic );
146 wxFileName relPath( aFileName );
152 newSheet->SetFileName( relPath.GetFullPath() );
157 sheet = newSheet.release();
162 wxCHECK_MSG( aSchematic->
IsValid(),
nullptr,
"Can't append to a schematic with no root!" );
191 if( !fileName.IsAbsolute() )
200 wxLogTrace(
traceSchPlugin,
"Loading '%s'", fileName.GetFullPath() );
204 while( !ancestorSheetPath.
empty() )
211 m_error += wxString::Format(
_(
"Could not load sheet '%s' because it already "
212 "appears as a direct ancestor in the schematic "
214 fileName.GetFullPath() );
216 fileName = wxEmptyString;
224 if( ancestorSheetPath.
empty() )
245 loadFile( fileName.GetFullPath(), aSheet );
260 if( fileName.FileExists() )
298 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." );
340 init( aSchematic, aProperties );
342 wxFileName fn = aFileName;
346 wxASSERT( fn.IsAbsolute() );
361 wxCHECK_RET( aSheet !=
nullptr,
"NULL SCH_SHEET* object." );
362 wxCHECK_RET(
m_schematic !=
nullptr,
"NULL SCHEMATIC* object." );
377 m_out->
Print(
"(kicad_sch (version %d) (generator \"eeschema\") (generator_version %s)",
389 for(
const auto& [ libItemName, libSymbol ] : screen->
GetLibSymbols() )
394 for(
const std::shared_ptr<BUS_ALIAS>& alias : screen->
GetBusAliases() )
401 if( a->
Type() != b->Type() )
402 return a->
Type() < b->Type();
404 return a->
m_Uuid < b->m_Uuid;
407 std::multiset<
SCH_ITEM*,
decltype( cmp )> save_map( cmp );
413 save_map.insert( item );
418 switch( item->Type() )
474 wxASSERT(
"Unexpected schematic object type in SCH_IO_KICAD_SEXPR::Format()" );
480 std::vector< SCH_SHEET_INSTANCE> instances;
500 wxCHECK( aSelection && aSelectionPath && aFormatter, );
510 std::map<wxString, LIB_SYMBOL*> libSymbols;
512 std::set<SCH_TABLE*> promotedTables;
514 for( i = 0; i < aSelection->
GetSize(); ++i )
518 wxCHECK2( item,
continue );
525 wxCHECK2( symbol,
continue );
535 libSymbols[ libSymbolLookup ] = it->second;
538 if( !libSymbols.empty() )
542 for(
const std::pair<const wxString, LIB_SYMBOL*>& libSymbol : libSymbols )
551 for( i = 0; i < aSelection->
GetSize(); ++i )
555 switch( item->
Type() )
611 if( promotedTables.count(
table ) )
617 promotedTables.insert(
table );
627 wxASSERT(
"Unexpected schematic object type in SCH_IO_KICAD_SEXPR::Format()" );
637 wxCHECK_RET( aSymbol !=
nullptr &&
m_out !=
nullptr,
"" );
643 if( symbol_name.size() )
649 libName =
"_NONAME_";
683 if( mirrorX || mirrorY )
687 mirrorY ?
"y" :
"" );
698 wxASSERT( parentScreen );
702 std::optional<SCH_SHEET_PATH> ordinalPath =
710 aSymbol->
GetInstance( ordinalInstance, ordinalPath->Path() );
715 int unit = ordinalInstance.
m_Unit;
717 if( aForClipboard && aRelativePath )
722 unit = unitInstance.
m_Unit;
746 int id = field.GetId();
747 wxString value = field.GetText();
766 else if( aForClipboard && aSymbol->
GetInstances().size() && aRelativePath
783 field.SetText( value );
789 field.SetText( value );
792 for(
const std::unique_ptr<SCH_PIN>&
pin : aSymbol->
GetRawPins() )
794 if(
pin->GetAlt().IsEmpty() )
810 std::map<KIID, std::vector<SCH_SYMBOL_INSTANCE>> projectInstances;
814 wxString projectName;
820 wxCHECK2( inst.m_Path.size(),
continue );
825 bool isOrphaned = ( inst.m_Path[0] == rootSheetUuid )
829 if( !aForClipboard && isOrphaned )
832 auto it = projectInstances.find( inst.m_Path[0] );
834 if( it == projectInstances.end() )
835 projectInstances[ inst.m_Path[0] ] = { inst };
837 it->second.emplace_back( inst );
840 for(
auto& [uuid, instances] : projectInstances )
842 wxCHECK2( instances.size(),
continue );
845 std::sort( instances.begin(), instances.end(),
848 return aLhs.m_Path < aRhs.m_Path;
851 projectName = instances[0].m_ProjectName;
860 if( aForClipboard && aRelativePath )
865 m_out->
Print(
"(path %s (reference %s) (unit %d))",
883 wxCHECK_RET( aField !=
nullptr &&
m_out !=
nullptr,
"" );
889 if( aField->
GetId() == -1 )
893 if( !aField->
GetName().IsEmpty() )
904 m_out->
Print(
"(property %s %s %s (at %s %s %s)",
935 wxCHECK_RET(
m_out !=
nullptr,
"" );
942 wxCHECK_RET(
image !=
nullptr,
"wxImage* is NULL" );
962 wxMemoryOutputStream stream;
973 wxCHECK_RET( aSheet !=
nullptr &&
m_out !=
nullptr,
"" );
975 m_out->
Print(
"(sheet (at %s %s) (size %s %s)",
1000 m_out->
Print(
"(fill (color %d %d %d %0.4f))",
1019 pin->GetPosition().x ).c_str(),
1021 pin->GetPosition().y ).c_str(),
1032 std::vector< SCH_SHEET_INSTANCE > sheetInstances = aSheet->
GetInstances();
1034 auto it = sheetInstances.begin();
1036 while( it != sheetInstances.end() )
1038 if( it->m_Path.size() == 0 )
1039 it = sheetInstances.erase( it );
1044 if( !sheetInstances.empty() )
1048 KIID lastProjectUuid;
1050 bool inProjectClause =
false;
1052 for(
size_t i = 0; i < sheetInstances.size(); i++ )
1059 if( ( sheetInstances[i].m_Path[0] == rootSheetUuid )
1062 if( inProjectClause && ( ( i + 1 == sheetInstances.size() )
1063 || lastProjectUuid != sheetInstances[i+1].m_Path[0] ) )
1066 inProjectClause =
false;
1072 if( lastProjectUuid != sheetInstances[i].m_Path[0] )
1074 wxString projectName;
1076 if( sheetInstances[i].m_Path[0] == rootSheetUuid )
1079 projectName = sheetInstances[i].m_ProjectName;
1081 lastProjectUuid = sheetInstances[i].m_Path[0];
1083 inProjectClause =
true;
1086 wxString
path = sheetInstances[i].m_Path.AsString();
1090 m_out->
Quotew( sheetInstances[i].m_PageNumber ).c_str() );
1092 if( inProjectClause && ( ( i + 1 == sheetInstances.size() )
1093 || lastProjectUuid != sheetInstances[i+1].m_Path[0] ) )
1096 inProjectClause =
false;
1109 wxCHECK_RET( aJunction !=
nullptr &&
m_out !=
nullptr,
"" );
1111 m_out->
Print(
"(junction (at %s %s) (diameter %s) (color %d %d %d %s)",
1130 wxCHECK_RET( aNoConnect !=
nullptr &&
m_out !=
nullptr,
"" );
1145 wxCHECK_RET( aBusEntry !=
nullptr &&
m_out !=
nullptr,
"" );
1148 if( aBusEntry->
GetClass() ==
"SCH_BUS_BUS_ENTRY" )
1157 m_out->
Print(
"(bus_entry (at %s %s) (size %s %s)",
1165 aBusEntry->
GetSize().
y ).c_str() );
1175 wxCHECK_RET( aShape !=
nullptr &&
m_out !=
nullptr,
"" );
1184 case SHAPE_T::CIRCLE:
1189 case SHAPE_T::RECTANGLE:
1194 case SHAPE_T::BEZIER:
1212 wxCHECK_RET( aRuleArea !=
nullptr &&
m_out !=
nullptr,
"" );
1222 wxCHECK_RET( aLine !=
nullptr &&
m_out !=
nullptr,
"" );
1230 case LAYER_BUS: lineType =
"bus";
break;
1237 m_out->
Print(
"(%s (pts (xy %s %s) (xy %s %s))",
1256 wxCHECK_RET( aText !=
nullptr &&
m_out !=
nullptr,
"" );
1274 flag->GetPinLength() ).c_str() );
1307 if( label && !label->
GetFields().empty() )
1315 aText->EDA_TEXT::Format(
m_out, 0 );
1335 wxCHECK_RET( aTextBox !=
nullptr &&
m_out !=
nullptr,
"" );
1346 m_out->
Print(
"(at %s %s %s) (size %s %s) (margins %s %s %s %s)",
1358 m_out->
Print(
"(span %d %d)", cell->GetColSpan(), cell->GetRowSpan() );
1364 aTextBox->EDA_TEXT::Format(
m_out, 0 );
1381 for(
int row = 0; row < aTable->
GetRowCount(); ++row )
1383 for(
int col = 0; col < aTable->
GetColCount(); ++col )
1389 minRow = std::min( minRow, row );
1390 maxRow = std::max( maxRow, row );
1391 minCol = std::min( minCol, col );
1392 maxCol = std::max( maxCol, col );
1401 wxCHECK_MSG( maxCol >= minCol && maxRow >= minRow, , wxT(
"No selected cells!" ) );
1405 for(
int row = minRow; row <= maxRow; row++ )
1410 for(
int col = minCol; col <= maxCol; col++ )
1417 wxCHECK_RET( aTable !=
nullptr &&
m_out !=
nullptr,
"" );
1441 for(
int col = 0; col < aTable->
GetColCount(); ++col )
1452 for(
int row = 0; row < aTable->
GetRowCount(); ++row )
1476 wxCHECK_RET( aAlias !=
nullptr,
"BUS_ALIAS* is NULL" );
1480 for(
const wxString& member : aAlias->Members() )
1482 if( !members.IsEmpty() )
1483 members += wxS(
" " );
1496 if( aInstances.size() )
1502 wxString
path = instance.m_Path.AsString();
1504 if(
path.IsEmpty() )
1518 const std::map<std::string, UTF8>* aProperties )
1552 const wxString& aLibraryPath,
1553 const std::map<std::string, UTF8>* aProperties )
1557 bool powerSymbolsOnly = ( aProperties &&
1560 cacheLib( aLibraryPath, aProperties );
1564 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
1566 if( !powerSymbolsOnly || it->second->IsPower() )
1567 aSymbolNameList.Add( it->first );
1573 const wxString& aLibraryPath,
1574 const std::map<std::string, UTF8>* aProperties )
1578 bool powerSymbolsOnly = ( aProperties &&
1581 cacheLib( aLibraryPath, aProperties );
1585 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
1587 if( !powerSymbolsOnly || it->second->IsPower() )
1588 aSymbolList.push_back( it->second );
1594 const wxString& aSymbolName,
1595 const std::map<std::string, UTF8>* aProperties )
1599 cacheLib( aLibraryPath, aProperties );
1601 LIB_SYMBOL_MAP::const_iterator it =
m_cache->
m_symbols.find( aSymbolName );
1607 if( it ==
m_cache->
m_symbols.end() && aSymbolName.Contains( wxT(
"{slash}" ) ) )
1609 wxString unescaped = aSymbolName;
1610 unescaped.Replace( wxT(
"{slash}" ), wxT(
"/" ) );
1622 const std::map<std::string, UTF8>* aProperties )
1626 cacheLib( aLibraryPath, aProperties );
1636 const std::map<std::string, UTF8>* aProperties )
1640 cacheLib( aLibraryPath, aProperties );
1650 const std::map<std::string, UTF8>* aProperties )
1652 if( wxFileExists( aLibraryPath ) )
1654 THROW_IO_ERROR( wxString::Format(
_(
"Symbol library '%s' already exists." ),
1655 aLibraryPath.GetData() ) );
1669 const std::map<std::string, UTF8>* aProperties )
1671 wxFileName fn = aLibraryPath;
1673 if( !fn.FileExists() )
1678 if( wxRemove( aLibraryPath ) )
1680 THROW_IO_ERROR( wxString::Format(
_(
"Symbol library '%s' cannot be deleted." ),
1681 aLibraryPath.GetData() ) );
1695 const std::map<std::string, UTF8>* aProperties )
1719 wxFileName fn( aLibraryPath );
1720 return fn.IsOk() && fn.FileExists();
1726 wxFileName fn( aLibraryPath );
1728 if( fn.FileExists() )
1729 return fn.IsFileWritable();
1731 return fn.IsDirWritable();
1742 std::set<wxString> fieldNames;
1744 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
1746 std::vector<SCH_FIELD*> fields;
1747 it->second->GetFields( fields );
1751 if( field->IsMandatory() )
1756 fieldNames.insert( field->GetName() );
1760 std::copy( fieldNames.begin(), fieldNames.end(), std::back_inserter( aNames ) );
1771 std::string aSource,
1778 std::vector<LIB_SYMBOL*> newSymbols;
1779 std::unique_ptr<STRING_LINE_READER> reader = std::make_unique<STRING_LINE_READER>( aSymbolText,
1786 newSymbol = parser.
ParseSymbol( map, aFileVersion );
1789 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.
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 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
void WriteEmbeddedFiles(OUTPUTFORMATTER &aOut, bool aWriteData) const
Output formatter for the embedded files.
void ClearEmbeddedFonts()
Remove 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.
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...
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
void Format(OUTPUTFORMATTER *aFormatter) 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.
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.
void EmbedFonts() override
Embed fonts in the schematic.
SCH_SHEET_LIST Hierarchy() const override
Return the full schematic flattened hierarchical sheet list.
EMBEDDED_FILES * GetEmbeddedFiles() override
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.
REFERENCE_IMAGE & GetReferenceImage()
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, 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 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 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)
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.
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.
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
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.
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.
std::optional< SCH_SHEET_PATH > GetOrdinalPath(const SCH_SCREEN *aScreen) const
Return the ordinal sheet path of aScreen.
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' flags.
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) override
Populate a std::vector with SCH_FIELDs.
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 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
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.
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
bool GetExcludedFromBOM() const
bool GetDNP() const
Set or clear the 'Do Not Populate' flag.
bool GetExcludedFromSim() const override
virtual void Format(OUTPUTFORMATTER *aFormatter) 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.
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.
#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.
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.
@ GLOBALLABEL_MANDATORY_FIELD_COUNT
The first 2 are mandatory, and must be instantiated in SCH_SHEET.
@ SHEET_MANDATORY_FIELD_COUNT
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_FIELD_COUNT
The first 5 are mandatory, and must be instantiated in SCH_COMPONENT, LIB_PART, and FOOTPRINT constru...
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".
wxLogTrace helper definitions.