24#include <boost/algorithm/string/join.hpp>
29#include <wx/mstream.h>
30#include <wx/filename.h>
32#include <wx/textfile.h>
33#include <wx/tokenzr.h>
68#define T_STYLE "style"
70#define T_COLORA "rgba"
71#define T_WIDTH "width"
76 m_progressReporter( nullptr ),
77 m_lineReader( nullptr ),
78 m_lastProgressLine( 0 ),
104 const unsigned PROGRESS_DELTA = 250;
127 wxASSERT( !aFileName || aSchematic !=
nullptr );
132 wxFileName fn = aFileName;
137 wxASSERT( fn.IsAbsolute() );
146 if( !normedFn.IsAbsolute() )
148 if( aFileName.Right( normedFn.GetFullPath().Length() ) == normedFn.GetFullPath() )
149 m_path = aFileName.Left( aFileName.Length() - normedFn.GetFullPath().Length() );
163 init( aSchematic, aProperties );
165 if( aAppendToMe ==
nullptr )
168 std::unique_ptr<SCH_SHEET> newSheet = std::make_unique<SCH_SHEET>( aSchematic );
169 newSheet->SetFileName( aFileName );
174 sheet = newSheet.release();
180 wxCHECK_MSG( aSchematic->
IsValid(),
nullptr,
"Can't append to a schematic with no root!" );
206 fileName.SetExt(
"sch" );
208 if( !fileName.IsAbsolute() )
257 wxCHECK2( aItem->Type() ==
SCH_SHEET_T,
continue );
258 auto sheet =
static_cast<SCH_SHEET*
>( aItem );
306 char* line = reader.
Line();
308 while( *line ==
' ' )
323 "Cannot call SCH_LEGACY_PLUGIN::LoadContent() without setting root sheet." );
329 char* line = aReader.
Line();
331 while( *line ==
' ' )
366 const char* line = aReader.
ReadLine();
368 if( !line || !
strCompare(
"Eeschema Schematic File Version", line, &line ) )
370 m_error.Printf(
_(
"'%s' does not appear to be an Eeschema file." ),
391 line = aReader.
Line();
393 while( *line ==
' ' )
406 wxASSERT( aScreen !=
nullptr );
409 const char* line = aReader.
Line();
414 wxCHECK_RET(
strCompare(
"$Descr", line, &line ),
"Invalid sheet description" );
421 int pagew =
parseInt( aReader, line, &line );
422 int pageh =
parseInt( aReader, line, &line );
431 wxString orientation;
437 if( orientation ==
"portrait" )
443 while( line !=
nullptr )
450 line = aReader.
Line();
477 else if(
strCompare(
"Comment1", line, &line ) )
482 else if(
strCompare(
"Comment2", line, &line ) )
487 else if(
strCompare(
"Comment3", line, &line ) )
492 else if(
strCompare(
"Comment4", line, &line ) )
497 else if(
strCompare(
"Comment5", line, &line ) )
502 else if(
strCompare(
"Comment6", line, &line ) )
507 else if(
strCompare(
"Comment7", line, &line ) )
512 else if(
strCompare(
"Comment8", line, &line ) )
517 else if(
strCompare(
"Comment9", line, &line ) )
535 std::unique_ptr<SCH_SHEET> sheet = std::make_unique<SCH_SHEET>();
537 const char* line = aReader.
ReadLine();
539 while( line !=
nullptr )
547 sheet->SetPosition( position );
553 sheet->SetSize( size );
560 if(
text !=
"00000000" )
563 else if( *line ==
'F' )
569 int fieldId =
parseInt( aReader, line, &line );
571 if( fieldId == 0 || fieldId == 1 )
576 SCH_FIELD& field = sheet->GetFields()[ fieldId ];
583 std::unique_ptr<SCH_SHEET_PIN> sheetPin = std::make_unique<SCH_SHEET_PIN>( sheet.get() );
585 sheetPin->SetNumber( fieldId );
592 if( line ==
nullptr )
595 switch(
parseChar( aReader, line, &line ) )
605 switch(
parseChar( aReader, line, &line ) )
619 sheetPin->SetPosition( position );
623 sheetPin->SetTextSize( wxSize( size, size ) );
625 sheet->AddPin( sheetPin.release() );
630 sheet->AutoplaceFields(
nullptr,
false );
631 return sheet.release();
645 std::unique_ptr<SCH_BITMAP> bitmap = std::make_unique<SCH_BITMAP>();
647 const char* line = aReader.
Line();
649 wxCHECK(
strCompare(
"$Bitmap", line, &line ),
nullptr );
653 while( line !=
nullptr )
661 bitmap->SetPosition( position );
665 auto scalefactor =
parseDouble( aReader, line, &line );
671 if( !std::isnormal( scalefactor ) )
674 bitmap->GetImage()->SetScale( scalefactor );
678 wxMemoryOutputStream stream;
685 line = aReader.
Line();
691 wxImage*
image =
new wxImage();
692 wxMemoryInputStream istream( stream );
693 image->LoadFile( istream, wxBITMAP_TYPE_PNG );
694 bitmap->GetImage()->SetImage(
image );
705 int len = strlen( line );
707 for( ; len > 0 && !isspace( *line ) &&
'$' != *line; len -= 3, line += 3 )
711 if( sscanf( line,
"%X", &value ) == 1 )
712 stream.PutC( (
char) value );
718 if( line ==
nullptr )
723 return bitmap.release();
735 std::unique_ptr<SCH_JUNCTION> junction = std::make_unique<SCH_JUNCTION>();
737 const char* line = aReader.
Line();
739 wxCHECK(
strCompare(
"Connection", line, &line ),
nullptr );
749 junction->SetPosition( position );
751 return junction.release();
757 std::unique_ptr<SCH_NO_CONNECT> no_connect = std::make_unique<SCH_NO_CONNECT>();
759 const char* line = aReader.
Line();
761 wxCHECK(
strCompare(
"NoConn", line, &line ),
nullptr );
771 no_connect->SetPosition( position );
773 return no_connect.release();
779 std::unique_ptr<SCH_LINE> wire = std::make_unique<SCH_LINE>();
781 const char* line = aReader.
Line();
783 wxCHECK(
strCompare(
"Wire", line, &line ),
nullptr );
811 wire->SetLineWidth( size );
817 if( buf == wxT(
"solid" ) )
819 else if( buf == wxT(
"dashed" ) )
821 else if( buf == wxT(
"dash_dot" ) )
823 else if( buf == wxT(
"dotted" ) )
832 wxString prm, keyword;
833 keyword = buf.BeforeLast(
'(', &prm );
837 long color[4] = { 0 };
843 prm.ToLong( &
color[ii] );
847 int prm_count = ( keyword ==
T_COLORA ) ? 4 : 3;
852 for(; ii < prm_count && !
is_eol( *line ); ii++ )
857 if( *line ==
',' || *line ==
' ')
876 wire->SetStartPoint( begin );
877 wire->SetEndPoint( end );
879 return wire.release();
885 const char* line = aReader.
Line();
887 wxCHECK(
strCompare(
"Entry", line, &line ),
nullptr );
889 std::unique_ptr<SCH_BUS_ENTRY_BASE> busEntry;
893 busEntry = std::make_unique<SCH_BUS_WIRE_ENTRY>();
896 SCH_PARSE_ERROR(
"invalid bus entry definition expected 'Line'", aReader, line );
900 busEntry = std::make_unique<SCH_BUS_BUS_ENTRY>();
903 SCH_PARSE_ERROR(
"invalid bus entry definition expected 'Bus'", aReader, line );
923 busEntry->SetPosition( pos );
924 busEntry->SetSize( size );
926 return busEntry.release();
944 const char* line = aReader.
Line();
947 wxCHECK(
strCompare(
"Text", line, &line ),
nullptr );
957 else if(
strCompare(
"HLabel", line, &line ) )
961 else if(
strCompare(
"GLabel", line, &line ) )
979 std::unique_ptr<SCH_TEXT>
text;
990 int spinStyle =
parseInt( aReader, line, &line );
1002 if( spinStyle == 0 )
1004 else if( spinStyle == 2 )
1012 text->SetTextSize( wxSize( size, size ) );
1018 [ &line ](
const auto& it )
1020 return strCompare( it.second, line, &line );
1024 text->SetShape( resultIt->first );
1038 text->SetItalic(
true );
1046 penWidth =
parseInt( aReader, line, &line );
1049 text->SetBold( penWidth != 0 );
1055 tmp = strtok( tmp,
"\r\n" );
1060 int i = val.find( wxT(
"\\n" ) );
1062 if( i == wxNOT_FOUND )
1066 val.insert( i, wxT(
"\n" ) );
1071 return text.release();
1077 const char* line = aReader.
Line();
1079 wxCHECK(
strCompare(
"$Comp", line, &line ),
nullptr );
1081 std::unique_ptr<SCH_SYMBOL> symbol = std::make_unique<SCH_SYMBOL>();
1085 while( line !=
nullptr )
1091 wxString utf8Line = wxString::FromUTF8( line );
1092 wxStringTokenizer tokens( utf8Line,
" \r\n\t" );
1094 if( tokens.CountTokens() < 2 )
1098 libName = tokens.GetNextToken();
1099 libName.Replace(
"~",
" " );
1107 libId.
Parse( libName,
true );
1111 symbol->SetLibId( libId );
1113 wxString refDesignator = tokens.GetNextToken();
1115 refDesignator.Replace(
"~",
" " );
1117 wxString prefix = refDesignator;
1119 while( prefix.Length() )
1121 if( ( prefix.Last() <
'0' || prefix.Last() >
'9') && prefix.Last() !=
'?' )
1124 prefix.RemoveLast();
1128 prefix.Trim(
true );
1129 prefix.Trim(
false );
1131 if( prefix.IsEmpty() )
1132 symbol->SetPrefix( wxString(
"U" ) );
1134 symbol->SetPrefix( prefix );
1140 int unit =
parseInt( aReader, line, &line );
1151 symbol->SetUnit( unit );
1165 symbol->SetConvert(
convert );
1170 if(
text !=
"00000000" )
1179 symbol->SetPosition( pos );
1186 if( strncasecmp(
strCompare, line, len ) != 0 )
1190 wxString pathStr, reference, unit;
1198 if(
path.size() > 0 )
1210 if( strncasecmp(
strCompare, line, len ) != 0 )
1219 if( strncasecmp(
strCompare, line, len ) != 0 )
1227 if( !unit.ToLong( &tmp, 10 ) )
1233 symbol->AddHierarchicalReference(
path, reference, (
int)tmp );
1238 int index =
parseInt( aReader, line, &line );
1244 char orientation =
parseChar( aReader, line, &line );
1249 int attributes =
parseHex( aReader, line, &line );
1251 if( index >= symbol->GetFieldCount() )
1261 index = symbol->GetFieldCount();
1264 symbol->AddField( field );
1267 SCH_FIELD& field = symbol->GetFields()[index];
1273 char hjustify =
parseChar( aReader, line, &line );
1280 if( hjustify ==
'L' )
1282 else if( hjustify ==
'R' )
1284 else if( hjustify !=
'C' )
1285 SCH_PARSE_ERROR(
"symbol field text horizontal justification must be "
1286 "L, R, or C", aReader, line );
1290 if( textAttrs[0] ==
'T' )
1292 else if( textAttrs[0] ==
'B' )
1294 else if( textAttrs[0] !=
'C' )
1296 "B, T, or C", aReader, line );
1299 if( textAttrs.Length() > 1 )
1301 if( textAttrs.Length() != 3 )
1303 SCH_PARSE_ERROR(
_(
"symbol field text attributes must be 3 characters wide" ),
1307 if( textAttrs[1] ==
'I' )
1311 else if( textAttrs[1] !=
'N' )
1313 SCH_PARSE_ERROR(
"symbol field text italics indicator must be I or N",
1317 if( textAttrs[2] ==
'B' )
1321 else if( textAttrs[2] !=
'N' )
1334 if( orientation ==
'H' )
1336 else if( orientation ==
'V' )
1339 SCH_PARSE_ERROR(
"symbol field orientation must be H or V", aReader, line );
1341 if(
name.IsEmpty() )
1358 instance.
m_Unit = symbol->GetUnit();
1359 symbol->AddHierarchicalReference( instance );
1366 symbol->AddHierarchicalReference( tmpInstance );
1372 symbol->ClearFlags();
1373 return symbol.release();
1390 transform.
x1 =
parseInt( aReader, line, &line );
1392 if( transform.
x1 < -1 || transform.
x1 > 1 )
1393 SCH_PARSE_ERROR(
"invalid symbol X1 transform value", aReader, line );
1395 transform.
y1 =
parseInt( aReader, line, &line );
1397 if( transform.
y1 < -1 || transform.
y1 > 1 )
1398 SCH_PARSE_ERROR(
"invalid symbol Y1 transform value", aReader, line );
1400 transform.
x2 =
parseInt( aReader, line, &line );
1402 if( transform.
x2 < -1 || transform.
x2 > 1 )
1403 SCH_PARSE_ERROR(
"invalid symbol X2 transform value", aReader, line );
1405 transform.
y2 =
parseInt( aReader, line, &line );
1407 if( transform.
y2 < -1 || transform.
y2 > 1 )
1408 SCH_PARSE_ERROR(
"invalid symbol Y2 transform value", aReader, line );
1410 symbol->SetTransform( transform );
1425 auto busAlias = std::make_shared<BUS_ALIAS>( aScreen );
1426 const char* line = aReader.
Line();
1428 wxCHECK(
strCompare(
"BusAlias", line, &line ),
nullptr );
1432 busAlias->SetName( buf );
1434 while( *line !=
'\0' )
1439 if( !buf.IsEmpty() )
1440 busAlias->Members().emplace_back( buf );
1450 wxCHECK_RET( aSheet !=
nullptr,
"NULL SCH_SHEET object." );
1451 wxCHECK_RET( !aFileName.IsEmpty(),
"No schematic file name defined." );
1455 init( aSchematic, aProperties );
1457 wxFileName fn = aFileName;
1461 wxASSERT( fn.IsAbsolute() );
1475 wxCHECK_RET( aSheet !=
nullptr,
"NULL SCH_SHEET* object." );
1476 wxCHECK_RET(
m_schematic !=
nullptr,
"NULL SCHEMATIC* object." );
1518 for(
const std::shared_ptr<BUS_ALIAS>& alias : screen->
GetBusAliases() )
1523 std::multiset<
SCH_ITEM*,
decltype( cmp )> save_map( cmp );
1526 save_map.insert( item );
1529 for(
auto& item : save_map )
1531 switch( item->Type() )
1562 wxASSERT(
"Unexpected schematic object type in SCH_LEGACY_PLUGIN::Format()" );
1574 for(
unsigned i = 0; i < aSelection->
GetSize(); ++i )
1578 switch( item->
Type() )
1609 wxASSERT(
"Unexpected schematic object type in SCH_LEGACY_PLUGIN::Format()" );
1620 static wxString delimiters( wxT(
" " ) );
1638 if( symbol_name.size() )
1648 m_out->
Print( 0,
"L %s %s\n", name2.c_str(), name1.c_str() );
1677 wxString
path =
"/";
1680 for(
int i = 1; i < (int) instance.m_Path.size(); ++i )
1681 path += instance.m_Path[i].AsLegacyTimestampString() +
"/";
1683 m_out->
Print( 0,
"AR Path=\"%s\" Ref=\"%s\" Part=\"%d\" \n",
1685 TO_UTF8( instance.m_Reference ),
1716 transform.
x1, transform.
y1, transform.
x2, transform.
y2 );
1723 char hjustify =
'C';
1730 char vjustify =
'C';
1737 m_out->
Print( 0,
"F %d %s %c %-3d %-3d %-3d %4.4X %c %c%c%c",
1747 aField->
IsBold() ?
'B' :
'N' );
1759 wxCHECK_RET( aBitmap !=
nullptr,
"SCH_BITMAP* is NULL" );
1763 wxCHECK_RET(
image !=
nullptr,
"wxImage* is NULL" );
1772 wxMemoryOutputStream stream;
1774 image->SaveFile( stream, wxBITMAP_TYPE_PNG );
1777 wxStreamBuffer* buffer = stream.GetOutputStreamBuffer();
1778 char* begin = (
char*) buffer->GetBufferStart();
1780 for(
int ii = 0; begin < buffer->GetBufferEnd(); begin++, ii++ )
1799 wxCHECK_RET( aSheet !=
nullptr,
"SCH_SHEET* is NULL" );
1813 if( !sheetName.
GetText().IsEmpty() )
1820 if( !fileName.
GetText().IsEmpty() )
1831 if(
pin->GetText().IsEmpty() )
1834 switch(
pin->GetSide() )
1843 switch(
pin->GetShape() )
1853 m_out->
Print( 0,
"F%d %s %c %c %-3d %-3d %-3d\n",
1867 wxCHECK_RET( aJunction !=
nullptr,
"SCH_JUNCTION* is NULL" );
1877 wxCHECK_RET( aNoConnect !=
nullptr,
"SCH_NOCONNECT* is NULL" );
1887 wxCHECK_RET( aBusEntry !=
nullptr,
"SCH_BUS_ENTRY_BASE* is NULL" );
1891 m_out->
Print( 0,
"Entry Wire Line\n\t%-4d %-4d %-4d %-4d\n",
1899 m_out->
Print( 0,
"Entry Bus Bus\n\t%-4d %-4d %-4d %-4d\n",
1910 wxCHECK_RET( aLine !=
nullptr,
"SCH_LINE* is NULL" );
1912 const char* layer =
"Notes";
1913 const char* width =
"Line";
1920 m_out->
Print( 0,
"Wire %s %s", layer, width );
1952 wxCHECK_RET( aText !=
nullptr,
"SCH_TEXT* is NULL" );
1954 const char* italics =
"~";
1955 const char* textType =
"Notes";
1970 text.Replace( wxT(
"\n" ), wxT(
"\\n" ) );
1978 for(
unsigned ii = 0; ii <
text.Len(); )
1980 if(
text[ii] == 0x0A ||
text[ii] == 0x0D )
1981 text.erase( ii, 1 );
1994 if( spinStyle == 0 )
1996 else if( spinStyle == 2 )
1999 m_out->
Print( 0,
"Text %s %-4d %-4d %-4d %-4d %s %d\n%s\n", textType,
2011 wxCHECK_RET( shapeLabelIt !=
sheetLabelNames.end(),
"Shape not found in names list" );
2013 m_out->
Print( 0,
"Text %s %-4d %-4d %-4d %-4d %s %s %d\n%s\n", textType,
2018 shapeLabelIt->second,
2027 wxCHECK_RET( aAlias !=
nullptr,
"BUS_ALIAS* is NULL" );
2029 wxString members = boost::algorithm::join( aAlias->Members(),
" " );
2054 if( aProperties && aProperties->find( propName ) != aProperties->end() )
2078 const wxString& aLibraryPath,
2083 bool powerSymbolsOnly = ( aProperties &&
2086 cacheLib( aLibraryPath, aProperties );
2090 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
2092 if( !powerSymbolsOnly || it->second->IsPower() )
2093 aSymbolNameList.Add( it->first );
2099 const wxString& aLibraryPath,
2104 bool powerSymbolsOnly = ( aProperties &&
2107 cacheLib( aLibraryPath, aProperties );
2111 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
2113 if( !powerSymbolsOnly || it->second->IsPower() )
2114 aSymbolList.push_back( it->second );
2120 const wxString& aSymbolName,
2125 cacheLib( aLibraryPath, aProperties );
2127 LIB_SYMBOL_MAP::const_iterator it =
m_cache->
m_symbols.find( aSymbolName );
2141 cacheLib( aLibraryPath, aProperties );
2155 cacheLib( aLibraryPath, aProperties );
2167 if( wxFileExists( aLibraryPath ) )
2170 aLibraryPath.GetData() ) );
2186 wxFileName fn = aLibraryPath;
2188 if( !fn.FileExists() )
2193 if( wxRemove( aLibraryPath ) )
2196 aLibraryPath.GetData() ) );
2231 wxTextFile tempFile;
2233 tempFile.Open( aFileName );
2236 firstline = tempFile.GetFirstLine();
2239 return firstline.StartsWith( wxS(
"EESchema" ) );
constexpr EDA_IU_SCALE schIUScale
void SetPageCount(int aPageCount)
int GetVirtualPageNumber() const
void SetVirtualPageNumber(int aPageNumber)
void SetContentModified(bool aModified=true)
bool IsHorizontal() const
KICAD_T Type() const
Returns the type of object.
virtual void SetParent(EDA_ITEM *aParent)
const EDA_ANGLE & GetTextAngle() const
virtual const wxString & GetText() const
Return the string associated with the text object.
virtual bool IsVisible() const
void SetTextPos(const VECTOR2I &aPoint)
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
GR_TEXT_H_ALIGN_T GetHorizJustify() const
virtual void SetVisible(bool aVisible)
GR_TEXT_V_ALIGN_T GetVertJustify() const
void SetTextSize(const VECTOR2I &aNewSize)
virtual void SetText(const wxString &aText)
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
int GetTextThickness() const
void SetItalic(bool aItalic)
VECTOR2I GetTextSize() const
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
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.
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()
wxString AsLegacyTimestampString() const
timestamp_t AsLegacyTimestamp() const
A logical library item identifier and consists of various portions much like a URI.
int Parse(const UTF8 &aId, bool aFix=false)
Parse LIB_ID with the information from aId.
int SetLibItemName(const UTF8 &aLibItemName)
Override the library item name portion of the LIB_ID to aLibItemName.
Define a library symbol object.
An abstract class from which implementation specific LINE_READERs may be derived to read single lines...
virtual char * ReadLine()=0
Read a line of text into the buffer and increments the line number counter.
virtual const wxString & GetSource() const
Returns the name of the source of the lines in an abstract sense.
virtual unsigned LineNumber() const
Return the line number of the last line read from this LINE_READER.
char * Line() const
Return a pointer to the last line that was read in.
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Describe the page size and margins of a paper page on which to eventually print or plot.
void SetWidthMils(int aWidthInMils)
void SetPortrait(bool aIsPortrait)
Rotate the paper page 90 degrees.
static const wxChar Custom[]
"User" defined page type
void SetHeightMils(int aHeightInMils)
int GetHeightMils() const
const wxString & GetType() const
bool SetType(const wxString &aStandardPageDescriptionName, bool aIsPortrait=false)
Set the name of the page type and also the sizes and margins commonly associated with that type name.
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 void SetCurrentProgress(double aProgress)=0
Set the progress value to aProgress (0..1).
virtual const wxString GetProjectPath() const
Return the full path of the project.
Holds all the data relating to one schematic.
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
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
VECTOR2I GetLibPosition() const
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
void SetName(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.
VECTOR2I GetPosition() const override
A cache assistant for KiCad legacy symbol libraries.
void Save(const std::optional< bool > &aOpt) override
Save the entire library to file m_libFileName;.
void DeleteSymbol(const wxString &aName) override
static void SaveSymbol(LIB_SYMBOL *aSymbol, OUTPUTFORMATTER &aFormatter, LIB_SYMBOL_MAP *aMap=nullptr)
static LIB_SYMBOL * LoadPart(LINE_READER &aReader, int aMajorVersion, int aMinorVersion, LIB_SYMBOL_MAP *aMap=nullptr)
void Save(const wxString &aFileName, SCH_SHEET *aScreen, SCHEMATIC *aSchematic, const STRING_UTF8_MAP *aProperties=nullptr) override
Write aSchematic to a storage file in a format that this SCH_PLUGIN implementation knows about,...
int m_version
Version of file being loaded.
void loadPageSettings(LINE_READER &aReader, SCH_SCREEN *aScreen)
unsigned m_lastProgressLine
SCH_LINE * loadWire(LINE_READER &aReader)
void saveSymbol(SCH_SYMBOL *aSymbol)
int GetModifyHash() const override
Return the modification hash from the library cache.
wxString m_error
For throwing exceptions or errors on partial schematic loads.
void SaveLibrary(const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
void saveSheet(SCH_SHEET *aSheet)
SCH_JUNCTION * loadJunction(LINE_READER &aReader)
wxString m_path
Root project path for loading child sheets.
void saveText(SCH_TEXT *aText)
static const char * PropNoDocFile
The property used internally by the plugin to disable writing the library documentation (....
SCH_NO_CONNECT * loadNoConnect(LINE_READER &aReader)
SCH_BITMAP * loadBitmap(LINE_READER &aReader)
bool writeDocFile(const STRING_UTF8_MAP *aProperties)
void loadHeader(LINE_READER &aReader, SCH_SCREEN *aScreen)
void Format(SCH_SHEET *aSheet)
void CreateSymbolLib(const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
Create a new empty symbol library at aLibraryPath.
void saveField(SCH_FIELD *aField)
void init(SCHEMATIC *aSchematic, const STRING_UTF8_MAP *aProperties=nullptr)
initialize PLUGIN like a constructor would.
void saveJunction(SCH_JUNCTION *aJunction)
void saveBusEntry(SCH_BUS_ENTRY_BASE *aBusEntry)
void saveLine(SCH_LINE *aLine)
SCH_SYMBOL * loadSymbol(LINE_READER &aReader)
OUTPUTFORMATTER * m_out
The formatter for saving SCH_SCREEN objects.
static const char * PropBuffering
The property used internally by the plugin to enable cache buffering which prevents the library file ...
bool DeleteSymbolLib(const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
Delete an existing symbol library and returns true if successful, or if library does not exist return...
std::stack< wxString > m_currentPath
Stack to maintain nested sheet paths.
void cacheLib(const wxString &aLibraryFileName, const STRING_UTF8_MAP *aProperties)
bool IsSymbolLibWritable(const wxString &aLibraryPath) override
Return true if the library at aLibraryPath is writable.
void saveBusAlias(std::shared_ptr< BUS_ALIAS > aAlias)
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.
SCH_SHEET * m_rootSheet
The root sheet of the schematic being loaded.
void saveNoConnect(SCH_NO_CONNECT *aNoConnect)
void loadFile(const wxString &aFileName, SCH_SCREEN *aScreen)
static LIB_SYMBOL * ParsePart(LINE_READER &aReader, int majorVersion=0, int minorVersion=0)
unsigned m_lineCount
for progress reporting
SCH_SHEET * loadSheet(LINE_READER &aReader)
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.
PROGRESS_REPORTER * m_progressReporter
optional; may be nullptr
static void FormatPart(LIB_SYMBOL *aSymbol, OUTPUTFORMATTER &aFormatter)
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.
SCH_SHEET * Load(const wxString &aFileName, SCHEMATIC *aSchematic, SCH_SHEET *aAppendToMe=nullptr, const STRING_UTF8_MAP *aProperties=nullptr) override
Load information from some input file format that this SCH_PLUGIN implementation knows about,...
std::shared_ptr< BUS_ALIAS > loadBusAlias(LINE_READER &aReader, SCH_SCREEN *aScreen)
SCH_TEXT * loadText(LINE_READER &aReader)
void saveBitmap(SCH_BITMAP *aBitmap)
void LoadContent(LINE_READER &aReader, SCH_SCREEN *aScreen, int version=EESCHEMA_VERSION)
virtual ~SCH_LEGACY_PLUGIN()
bool isBuffering(const STRING_UTF8_MAP *aProperties)
LINE_READER * m_lineReader
for progress reporting
bool CheckHeader(const wxString &aFileName) override
Return true if the first line in aFileName begins with the expected header.
SCH_BUS_ENTRY_BASE * loadBusEntry(LINE_READER &aReader)
void loadHierarchy(SCH_SHEET *aSheet)
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...
SCH_LEGACY_PLUGIN_CACHE * m_cache
SCH_SHEET * m_currentSheet
The sheet currently being loaded.
bool IsFile(const wxString &aFullPathAndFileName) const
wxString GetFileName() const
bool IsFileChanged() const
void SetFileName(const wxString &aFileName)
virtual void AddSymbol(const LIB_SYMBOL *aSymbol)
void SetModified(bool aModified=true)
Segment description base class to describe items which have 2 end points (track, wire,...
VECTOR2I GetEndPoint() const
VECTOR2I GetStartPoint() const
PLOT_DASH_TYPE GetLineStyle() const
bool IsGraphicLine() const
Return if the line is a graphic (non electrical line)
COLOR4D GetLineColor() const
Returns COLOR4D::UNSPECIFIED if a custom color hasn't been set for this line.
VECTOR2I GetPosition() const override
const PAGE_INFO & GetPageSettings() const
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
void AddBusAlias(std::shared_ptr< BUS_ALIAS > aAlias)
Add a bus alias definition (and transfers ownership of the pointer).
void SetPageSettings(const PAGE_INFO &aPageSettings)
EE_RTREE & Items()
Gets the full RTree, usually for iterating.
const wxString & GetFileName() const
const KIID & GetUuid() const
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
const TITLE_BLOCK & GetTitleBlock() const
void SetFileReadOnly(bool aIsReadOnly)
std::set< std::shared_ptr< BUS_ALIAS > > GetBusAliases() const
Return a list of bus aliases defined in this screen.
void SetFileExists(bool aFileExists)
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.
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.
std::vector< SCH_SHEET_PIN * > & GetPins()
int GetFieldCount() const
Return the number of fields in this symbol.
const std::vector< SCH_SYMBOL_INSTANCE > & GetInstanceReferences()
SCH_FIELD * GetField(MANDATORY_FIELD_T aFieldType)
Return a mandatory field in this symbol.
VECTOR2I GetPosition() const override
TRANSFORM & GetTransform()
const LIB_ID & GetLibId() const
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with SCH_FIELDs.
wxString GetPrefix() const
VECTOR2I GetPosition() const override
TEXT_SPIN_STYLE GetTextSpinStyle() const
virtual LABEL_FLAG_SHAPE GetShape() const
virtual KIGFX::VIEW_ITEM * GetItem(unsigned int aIdx) const override
virtual unsigned int GetSize() const override
Return the number of stored items.
A name/value tuple with unique names and optional values.
bool Exists(const std::string &aProperty) const
static wxString GetLineStyleToken(PLOT_DASH_TYPE aStyle)
static const char * PropPowerSymsOnly
Hold the information shown in the lower right corner of a plot, printout, or editing view.
const wxString & GetCompany() const
void SetRevision(const wxString &aRevision)
void SetComment(int aIdx, const wxString &aComment)
const wxString & GetRevision() const
void SetTitle(const wxString &aTitle)
const wxString & GetDate() const
const wxString & GetComment(int aIdx) const
void SetCompany(const wxString &aCompany)
const wxString & GetTitle() const
void SetDate(const wxString &aDate)
Set the date field, and defaults to the current time and date.
static constexpr EDA_ANGLE & ANGLE_HORIZONTAL
static constexpr EDA_ANGLE & ANGLE_VERTICAL
#define MAX_UNIT_COUNT_PER_PACKAGE
The maximum number of units per package.
#define SCHEMATIC_HEAD_STRING
int GetPenSizeForBold(int aTextSize)
const wxChar *const traceSchLegacyPlugin
Flag to enable legacy schematic plugin debug output.
#define THROW_IO_ERROR(msg)
#define THROW_PARSE_ERROR(aProblem, aSource, aInputLine, aLineNumber, aByteIndex)
#define SCH_LAYER_ID_COUNT
SCH_LAYER_ID
Eeschema drawing layers.
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
static wxString FROM_UTF8(const char *cstring)
Convert a UTF8 encoded C string to a wxString for all wxWidgets build modes.
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
const std::map< LABEL_FLAG_SHAPE, const char * > sheetLabelNames
int parseInt(LINE_READER &aReader, const char *aLine, const char **aOutput)
Parse an ASCII integer string with possible leading whitespace into an integer and updates the pointe...
bool strCompare(const char *aString, const char *aLine, const char **aOutput)
Compare aString to the string starting at aLine and advances the character point to the end of String...
void parseQuotedString(wxString &aString, LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken, bool aCanBeEmpty)
Parse an quoted ASCII utf8 and updates the pointer at aOutput if it is not NULL.
void parseUnquotedString(wxString &aString, LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken, bool aCanBeEmpty)
Parse an unquoted utf8 string and updates the pointer at aOutput if it is not NULL.
uint32_t parseHex(LINE_READER &aReader, const char *aLine, const char **aOutput)
Parse an ASCII hex integer string with possible leading whitespace into a long integer and updates th...
char parseChar(LINE_READER &aReader, const char *aCurrentToken, const char **aNextToken)
Parse a single ASCII character and updates the pointer at aOutput if it is not NULL.
double parseDouble(LINE_READER &aReader, const char *aLine, const char **aOutput)
Parses an ASCII point string with possible leading whitespace into a double precision floating point ...
#define SCH_PARSE_ERROR(text, reader, pos)
std::string toUTFTildaText(const wxString &txt)
Convert a wxString to UTF8 and replace any control characters with a ~, where a control character is ...
wxString ConvertToNewOverbarNotation(const wxString &aOldStr)
Convert the old ~...~ overbar notation to the new ~{...} one.
std::string EscapedUTF8(const wxString &aString)
Return an 8 bit UTF8 string given aString in Unicode form.
constexpr int IUToMils(int iu) const
constexpr int MilsToIU(int mils) const
A simple container for schematic symbol instance information.
static const wxString GetDefaultFieldName(int aFieldNdx, bool aTranslateForHI=false)
Return a default symbol field name for field aFieldNdx for all components.
Definition for symbol library class.
std::map< wxString, LIB_SYMBOL *, LibSymbolMapSort > LIB_SYMBOL_MAP
@ MANDATORY_FIELDS
The first 4 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors.
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".
wxLogTrace helper definitions.
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition of file extensions used in Kicad.