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>
69#define T_STYLE "style"
71#define T_COLORA "rgba"
72#define T_WIDTH "width"
77 m_lineReader( nullptr ),
78 m_lastProgressLine( 0 ),
104 const unsigned PROGRESS_DELTA = 250;
128 wxASSERT( !aFileName || aSchematic !=
nullptr );
133 wxFileName fn = aFileName;
138 wxASSERT( fn.IsAbsolute() );
147 if( !normedFn.IsAbsolute() )
149 if( aFileName.Right( normedFn.GetFullPath().Length() ) == normedFn.GetFullPath() )
150 m_path = aFileName.Left( aFileName.Length() - normedFn.GetFullPath().Length() );
164 init( aSchematic, aProperties );
166 if( aAppendToMe ==
nullptr )
169 std::unique_ptr<SCH_SHEET> newSheet = std::make_unique<SCH_SHEET>( aSchematic );
170 newSheet->SetFileName( aFileName );
175 sheet = newSheet.release();
181 wxCHECK_MSG( aSchematic->
IsValid(),
nullptr,
"Can't append to a schematic with no root!" );
207 fileName.SetExt(
"sch" );
209 if( !fileName.IsAbsolute() )
258 wxCHECK2( aItem->Type() ==
SCH_SHEET_T,
continue );
259 auto sheet =
static_cast<SCH_SHEET*
>( aItem );
307 char* line = reader.
Line();
309 while( *line ==
' ' )
324 "Cannot call SCH_IO_KICAD_LEGACY::LoadContent() without setting root sheet." );
330 char* line = aReader.
Line();
332 while( *line ==
' ' )
369 const char* line = aReader.
ReadLine();
371 if( !line || !
strCompare(
"Eeschema Schematic File Version", line, &line ) )
373 m_error.Printf(
_(
"'%s' does not appear to be an Eeschema file." ),
394 line = aReader.
Line();
396 while( *line ==
' ' )
409 wxASSERT( aScreen !=
nullptr );
412 const char* line = aReader.
Line();
417 wxCHECK_RET(
strCompare(
"$Descr", line, &line ),
"Invalid sheet description" );
424 int pagew =
parseInt( aReader, line, &line );
425 int pageh =
parseInt( aReader, line, &line );
434 wxString orientation;
440 if( orientation ==
"portrait" )
446 while( line !=
nullptr )
453 line = aReader.
Line();
480 else if(
strCompare(
"Comment1", line, &line ) )
485 else if(
strCompare(
"Comment2", line, &line ) )
490 else if(
strCompare(
"Comment3", line, &line ) )
495 else if(
strCompare(
"Comment4", line, &line ) )
500 else if(
strCompare(
"Comment5", line, &line ) )
505 else if(
strCompare(
"Comment6", line, &line ) )
510 else if(
strCompare(
"Comment7", line, &line ) )
515 else if(
strCompare(
"Comment8", line, &line ) )
520 else if(
strCompare(
"Comment9", line, &line ) )
538 std::unique_ptr<SCH_SHEET> sheet = std::make_unique<SCH_SHEET>();
540 const char* line = aReader.
ReadLine();
542 while( line !=
nullptr )
550 sheet->SetPosition( position );
556 sheet->SetSize( size );
563 if(
text !=
"00000000" )
566 else if( *line ==
'F' )
572 int fieldId =
parseInt( aReader, line, &line );
574 if( fieldId == 0 || fieldId == 1 )
579 SCH_FIELD& field = sheet->GetFields()[ fieldId ];
586 std::unique_ptr<SCH_SHEET_PIN> sheetPin = std::make_unique<SCH_SHEET_PIN>( sheet.get() );
588 sheetPin->SetNumber( fieldId );
595 if( line ==
nullptr )
598 switch(
parseChar( aReader, line, &line ) )
600 case 'I': sheetPin->SetShape( LABEL_FLAG_SHAPE::L_INPUT );
break;
601 case 'O': sheetPin->SetShape( LABEL_FLAG_SHAPE::L_OUTPUT );
break;
602 case 'B': sheetPin->SetShape( LABEL_FLAG_SHAPE::L_BIDI );
break;
603 case 'T': sheetPin->SetShape( LABEL_FLAG_SHAPE::L_TRISTATE );
break;
604 case 'U': sheetPin->SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED );
break;
608 switch(
parseChar( aReader, line, &line ) )
610 case 'R': sheetPin->SetSide( SHEET_SIDE::RIGHT );
break;
611 case 'T': sheetPin->SetSide( SHEET_SIDE::TOP );
break;
612 case 'B': sheetPin->SetSide( SHEET_SIDE::BOTTOM );
break;
613 case 'L': sheetPin->SetSide( SHEET_SIDE::LEFT );
break;
622 sheetPin->SetPosition( position );
626 sheetPin->SetTextSize(
VECTOR2I( size, size ) );
628 sheet->AddPin( sheetPin.release() );
633 sheet->AutoplaceFields(
nullptr,
false );
634 return sheet.release();
648 std::unique_ptr<SCH_BITMAP> bitmap = std::make_unique<SCH_BITMAP>();
650 const char* line = aReader.
Line();
652 wxCHECK(
strCompare(
"$Bitmap", line, &line ),
nullptr );
656 while( line !=
nullptr )
664 bitmap->SetPosition( position );
668 auto scalefactor =
parseDouble( aReader, line, &line );
674 if( !std::isnormal( scalefactor ) )
677 bitmap->GetImage()->SetScale( scalefactor );
681 wxMemoryBuffer buffer;
688 line = aReader.
Line();
693 bitmap->GetImage()->ReadImageFile( buffer );
709 int len = strlen( line );
711 for( ; len > 0 && !isspace( *line ) &&
'$' != *line; len -= 3, line += 3 )
715 if( sscanf( line,
"%X", &value ) == 1 )
716 buffer.AppendByte( (
char) value );
722 if( line ==
nullptr )
727 return bitmap.release();
739 std::unique_ptr<SCH_JUNCTION> junction = std::make_unique<SCH_JUNCTION>();
741 const char* line = aReader.
Line();
743 wxCHECK(
strCompare(
"Connection", line, &line ),
nullptr );
753 junction->SetPosition( position );
755 return junction.release();
761 std::unique_ptr<SCH_NO_CONNECT> no_connect = std::make_unique<SCH_NO_CONNECT>();
763 const char* line = aReader.
Line();
765 wxCHECK(
strCompare(
"NoConn", line, &line ),
nullptr );
775 no_connect->SetPosition( position );
777 return no_connect.release();
783 std::unique_ptr<SCH_LINE> wire = std::make_unique<SCH_LINE>();
785 const char* line = aReader.
Line();
787 wxCHECK(
strCompare(
"Wire", line, &line ),
nullptr );
803 wire->SetLineStyle( LINE_STYLE::DASH );
819 wire->SetLineWidth( size );
825 if( buf == wxT(
"solid" ) )
826 wire->SetLineStyle( LINE_STYLE::SOLID );
827 else if( buf == wxT(
"dashed" ) )
828 wire->SetLineStyle( LINE_STYLE::DASH );
829 else if( buf == wxT(
"dash_dot" ) )
830 wire->SetLineStyle( LINE_STYLE::DASHDOT );
831 else if( buf == wxT(
"dotted" ) )
832 wire->SetLineStyle( LINE_STYLE::DOT );
840 wxString prm, keyword;
841 keyword = buf.BeforeLast(
'(', &prm );
845 long color[4] = { 0 };
851 prm.ToLong( &
color[ii] );
855 int prm_count = ( keyword ==
T_COLORA ) ? 4 : 3;
860 for(; ii < prm_count && !
is_eol( *line ); ii++ )
865 if( *line ==
',' || *line ==
' ')
884 wire->SetStartPoint( begin );
885 wire->SetEndPoint( end );
887 return wire.release();
893 const char* line = aReader.
Line();
895 wxCHECK(
strCompare(
"Entry", line, &line ),
nullptr );
897 std::unique_ptr<SCH_BUS_ENTRY_BASE> busEntry;
901 busEntry = std::make_unique<SCH_BUS_WIRE_ENTRY>();
904 SCH_PARSE_ERROR(
"invalid bus entry definition expected 'Line'", aReader, line );
908 busEntry = std::make_unique<SCH_BUS_BUS_ENTRY>();
911 SCH_PARSE_ERROR(
"invalid bus entry definition expected 'Bus'", aReader, line );
931 busEntry->SetPosition( pos );
932 busEntry->SetSize( size );
934 return busEntry.release();
952 const char* line = aReader.
Line();
955 wxCHECK(
strCompare(
"Text", line, &line ),
nullptr );
965 else if(
strCompare(
"HLabel", line, &line ) )
969 else if(
strCompare(
"GLabel", line, &line ) )
987 std::unique_ptr<SCH_TEXT>
text;
998 int spinStyle =
parseInt( aReader, line, &line );
1010 if( spinStyle == 0 )
1012 else if( spinStyle == 2 )
1030 [ &line ](
const auto& it )
1032 return strCompare( it.second, line, &line );
1036 label->
SetShape( resultIt->first );
1078 text->SetItalic(
true );
1086 penWidth =
parseInt( aReader, line, &line );
1089 text->SetBoldFlag( penWidth != 0 );
1095 tmp = strtok( tmp,
"\r\n" );
1100 int i = val.find( wxT(
"\\n" ) );
1102 if( i == wxNOT_FOUND )
1106 val.insert( i, wxT(
"\n" ) );
1111 return text.release();
1117 const char* line = aReader.
Line();
1119 wxCHECK(
strCompare(
"$Comp", line, &line ),
nullptr );
1121 std::unique_ptr<SCH_SYMBOL> symbol = std::make_unique<SCH_SYMBOL>();
1125 while( line !=
nullptr )
1131 wxString utf8Line = wxString::FromUTF8( line );
1132 wxStringTokenizer tokens( utf8Line,
" \r\n\t" );
1134 if( tokens.CountTokens() < 2 )
1138 libName = tokens.GetNextToken();
1139 libName.Replace(
"~",
" " );
1147 libId.
Parse( libName,
true );
1151 symbol->SetLibId( libId );
1153 wxString refDesignator = tokens.GetNextToken();
1155 refDesignator.Replace(
"~",
" " );
1157 wxString prefix = refDesignator;
1159 while( prefix.Length() )
1161 if( ( prefix.Last() <
'0' || prefix.Last() >
'9') && prefix.Last() !=
'?' )
1164 prefix.RemoveLast();
1168 prefix.Trim(
true );
1169 prefix.Trim(
false );
1171 if( prefix.IsEmpty() )
1172 symbol->SetPrefix( wxString(
"U" ) );
1174 symbol->SetPrefix( prefix );
1180 int unit =
parseInt( aReader, line, &line );
1191 symbol->SetUnit( unit );
1194 int bodyStyle =
parseInt( aReader, line, &line );
1196 if( bodyStyle == 0 )
1205 symbol->SetBodyStyle( bodyStyle );
1210 if(
text !=
"00000000" )
1219 symbol->SetPosition( pos );
1226 if( strncasecmp(
strCompare, line, len ) != 0 )
1230 wxString pathStr, reference, unit;
1238 if(
path.size() > 0 )
1250 if( strncasecmp(
strCompare, line, len ) != 0 )
1259 if( strncasecmp(
strCompare, line, len ) != 0 )
1267 if( !unit.ToLong( &tmp, 10 ) )
1273 symbol->AddHierarchicalReference(
path, reference, (
int)tmp );
1278 int index =
parseInt( aReader, line, &line );
1284 char orientation =
parseChar( aReader, line, &line );
1289 int attributes =
parseHex( aReader, line, &line );
1306 if( !existingField )
1311 index = symbol->GetFieldCount();
1314 symbol->AddField( field );
1317 index = existingField->
GetId();
1320 SCH_FIELD& field = symbol->GetFields()[index];
1326 char hjustify =
parseChar( aReader, line, &line );
1333 if( hjustify ==
'L' )
1335 else if( hjustify ==
'R' )
1337 else if( hjustify !=
'C' )
1338 SCH_PARSE_ERROR(
"symbol field text horizontal justification must be "
1339 "L, R, or C", aReader, line );
1343 if( textAttrs[0] ==
'T' )
1345 else if( textAttrs[0] ==
'B' )
1347 else if( textAttrs[0] !=
'C' )
1349 "B, T, or C", aReader, line );
1352 if( textAttrs.Length() > 1 )
1354 if( textAttrs.Length() != 3 )
1356 SCH_PARSE_ERROR(
_(
"symbol field text attributes must be 3 characters wide" ),
1360 if( textAttrs[1] ==
'I' )
1364 else if( textAttrs[1] !=
'N' )
1366 SCH_PARSE_ERROR(
"symbol field text italics indicator must be I or N",
1370 if( textAttrs[2] ==
'B' )
1374 else if( textAttrs[2] !=
'N' )
1387 if( orientation ==
'H' )
1389 else if( orientation ==
'V' )
1392 SCH_PARSE_ERROR(
"symbol field orientation must be H or V", aReader, line );
1394 if(
name.IsEmpty() )
1411 instance.
m_Unit = symbol->GetUnit();
1412 symbol->AddHierarchicalReference( instance );
1419 symbol->AddHierarchicalReference( tmpInstance );
1425 symbol->ClearFlags();
1426 return symbol.release();
1443 transform.
x1 =
parseInt( aReader, line, &line );
1445 if( transform.
x1 < -1 || transform.
x1 > 1 )
1446 SCH_PARSE_ERROR(
"invalid symbol X1 transform value", aReader, line );
1448 transform.
y1 =
parseInt( aReader, line, &line );
1450 if( transform.
y1 < -1 || transform.
y1 > 1 )
1451 SCH_PARSE_ERROR(
"invalid symbol Y1 transform value", aReader, line );
1453 transform.
x2 =
parseInt( aReader, line, &line );
1455 if( transform.
x2 < -1 || transform.
x2 > 1 )
1456 SCH_PARSE_ERROR(
"invalid symbol X2 transform value", aReader, line );
1458 transform.
y2 =
parseInt( aReader, line, &line );
1460 if( transform.
y2 < -1 || transform.
y2 > 1 )
1461 SCH_PARSE_ERROR(
"invalid symbol Y2 transform value", aReader, line );
1463 symbol->SetTransform( transform );
1478 auto busAlias = std::make_shared<BUS_ALIAS>( aScreen );
1479 const char* line = aReader.
Line();
1481 wxCHECK(
strCompare(
"BusAlias", line, &line ),
nullptr );
1485 busAlias->SetName( buf );
1487 while( *line !=
'\0' )
1492 if( !buf.IsEmpty() )
1493 busAlias->Members().emplace_back( buf );
1504 wxCHECK_RET( aSheet !=
nullptr,
"NULL SCH_SHEET object." );
1505 wxCHECK_RET( !aFileName.IsEmpty(),
"No schematic file name defined." );
1509 init( aSchematic, aProperties );
1511 wxFileName fn = aFileName;
1515 wxASSERT( fn.IsAbsolute() );
1529 wxCHECK_RET( aSheet !=
nullptr,
"NULL SCH_SHEET* object." );
1530 wxCHECK_RET(
m_schematic !=
nullptr,
"NULL SCHEMATIC* object." );
1572 for(
const std::shared_ptr<BUS_ALIAS>& alias : screen->
GetBusAliases() )
1577 std::multiset<
SCH_ITEM*,
decltype( cmp )> save_map( cmp );
1580 save_map.insert( item );
1583 for(
auto& item : save_map )
1585 switch( item->Type() )
1616 wxASSERT(
"Unexpected schematic object type in SCH_IO_KICAD_LEGACY::Format()" );
1628 for(
unsigned i = 0; i < aSelection->
GetSize(); ++i )
1632 switch( item->
Type() )
1663 wxASSERT(
"Unexpected schematic object type in SCH_IO_KICAD_LEGACY::Format()" );
1674 static wxString delimiters( wxT(
" " ) );
1692 if( symbol_name.size() )
1702 m_out->
Print( 0,
"L %s %s\n", name2.c_str(), name1.c_str() );
1731 wxString
path =
"/";
1734 for(
int i = 1; i < (int) instance.m_Path.size(); ++i )
1735 path += instance.m_Path[i].AsLegacyTimestampString() +
"/";
1737 m_out->
Print( 0,
"AR Path=\"%s\" Ref=\"%s\" Part=\"%d\" \n",
1739 TO_UTF8( instance.m_Reference ),
1770 transform.
x1, transform.
y1, transform.
x2, transform.
y2 );
1777 char hjustify =
'C';
1784 char vjustify =
'C';
1791 m_out->
Print( 0,
"F %d %s %c %-3d %-3d %-3d %4.4X %c %c%c%c",
1801 aField->
IsBold() ?
'B' :
'N' );
1813 wxCHECK_RET( aBitmap !=
nullptr,
"SCH_BITMAP* is NULL" );
1817 wxCHECK_RET(
image !=
nullptr,
"wxImage* is NULL" );
1826 wxMemoryOutputStream stream;
1828 image->SaveFile( stream, wxBITMAP_TYPE_PNG );
1831 wxStreamBuffer* buffer = stream.GetOutputStreamBuffer();
1832 char* begin = (
char*) buffer->GetBufferStart();
1834 for(
int ii = 0; begin < buffer->GetBufferEnd(); begin++, ii++ )
1853 wxCHECK_RET( aSheet !=
nullptr,
"SCH_SHEET* is NULL" );
1867 if( !sheetName.
GetText().IsEmpty() )
1874 if( !fileName.
GetText().IsEmpty() )
1885 if(
pin->GetText().IsEmpty() )
1888 switch(
pin->GetSide() )
1891 case SHEET_SIDE::LEFT: side =
'L';
break;
1892 case SHEET_SIDE::RIGHT: side =
'R';
break;
1893 case SHEET_SIDE::TOP: side =
'T';
break;
1894 case SHEET_SIDE::BOTTOM: side =
'B';
break;
1897 switch(
pin->GetShape() )
1900 case LABEL_FLAG_SHAPE::L_UNSPECIFIED: type =
'U';
break;
1901 case LABEL_FLAG_SHAPE::L_INPUT: type =
'I';
break;
1902 case LABEL_FLAG_SHAPE::L_OUTPUT: type =
'O';
break;
1903 case LABEL_FLAG_SHAPE::L_BIDI: type =
'B';
break;
1904 case LABEL_FLAG_SHAPE::L_TRISTATE: type =
'T';
break;
1907 m_out->
Print( 0,
"F%d %s %c %c %-3d %-3d %-3d\n",
1921 wxCHECK_RET( aJunction !=
nullptr,
"SCH_JUNCTION* is NULL" );
1931 wxCHECK_RET( aNoConnect !=
nullptr,
"SCH_NOCONNECT* is NULL" );
1941 wxCHECK_RET( aBusEntry !=
nullptr,
"SCH_BUS_ENTRY_BASE* is NULL" );
1945 m_out->
Print( 0,
"Entry Wire Line\n\t%-4d %-4d %-4d %-4d\n",
1953 m_out->
Print( 0,
"Entry Bus Bus\n\t%-4d %-4d %-4d %-4d\n",
1964 wxCHECK_RET( aLine !=
nullptr,
"SCH_LINE* is NULL" );
1966 const char* layer =
"Notes";
1967 const char* width =
"Line";
1974 m_out->
Print( 0,
"Wire %s %s", layer, width );
2006 wxCHECK_RET( aText !=
nullptr,
"SCH_TEXT* is NULL" );
2008 const char* italics =
"~";
2009 const char* textType =
"Notes";
2024 text.Replace( wxT(
"\n" ), wxT(
"\\n" ) );
2032 for(
unsigned ii = 0; ii <
text.Len(); )
2034 if(
text[ii] == 0x0A ||
text[ii] == 0x0D )
2035 text.erase( ii, 1 );
2050 spinStyle =
static_cast<int>( label->GetSpinStyle() );
2052 if( spinStyle == 0 )
2054 else if( spinStyle == 2 )
2058 m_out->
Print( 0,
"Text %s %-4d %-4d %-4d %-4d %s %d\n%s\n", textType,
2071 wxCHECK_RET( shapeLabelIt !=
sheetLabelNames.end(),
"Shape not found in names list" );
2073 m_out->
Print( 0,
"Text %s %-4d %-4d %-4d %-4d %s %s %d\n%s\n", textType,
2078 shapeLabelIt->second,
2087 wxCHECK_RET( aAlias !=
nullptr,
"BUS_ALIAS* is NULL" );
2089 wxString members = boost::algorithm::join( aAlias->Members(),
" " );
2115 if( aProperties && aProperties->find( propName ) != aProperties->end() )
2139 const wxString& aLibraryPath,
2144 bool powerSymbolsOnly = ( aProperties &&
2147 cacheLib( aLibraryPath, aProperties );
2151 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
2153 if( !powerSymbolsOnly || it->second->IsPower() )
2154 aSymbolNameList.Add( it->first );
2160 const wxString& aLibraryPath,
2165 bool powerSymbolsOnly = ( aProperties &&
2168 cacheLib( aLibraryPath, aProperties );
2172 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
2174 if( !powerSymbolsOnly || it->second->IsPower() )
2175 aSymbolList.push_back( it->second );
2181 const wxString& aSymbolName,
2186 cacheLib( aLibraryPath, aProperties );
2188 LIB_SYMBOL_MAP::const_iterator it =
m_cache->
m_symbols.find( aSymbolName );
2202 cacheLib( aLibraryPath, aProperties );
2216 cacheLib( aLibraryPath, aProperties );
2228 if( wxFileExists( aLibraryPath ) )
2230 THROW_IO_ERROR( wxString::Format(
_(
"Symbol library '%s' already exists." ),
2231 aLibraryPath.GetData() ) );
2247 wxFileName fn = aLibraryPath;
2249 if( !fn.FileExists() )
2254 if( wxRemove( aLibraryPath ) )
2256 THROW_IO_ERROR( wxString::Format(
_(
"Symbol library '%s' cannot be deleted." ),
2257 aLibraryPath.GetData() ) );
constexpr EDA_IU_SCALE schIUScale
void SetPageCount(int aPageCount)
int GetVirtualPageNumber() const
void SetVirtualPageNumber(int aPageNumber)
void SetContentModified(bool aModified=true)
This class handle bitmap images in KiCad.
void SetScale(double aScale)
bool IsHorizontal() const
KICAD_T Type() const
Returns the type of object.
virtual void SetParent(EDA_ITEM *aParent)
const EDA_ANGLE & GetTextAngle() const
void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
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
void SetBoldFlag(bool aBold)
virtual void SetVisible(bool aVisible)
GR_TEXT_V_ALIGN_T GetVertJustify() const
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.
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()
wxString ToCSSString() const
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 SetPortrait(bool aIsPortrait)
Rotate the paper page 90 degrees.
static const wxChar Custom[]
"User" defined page type
void SetHeightMils(double aHeightInMils)
double GetHeightMils() const
const wxString & GetType() const
double GetWidthMils() const
void SetWidthMils(double aWidthInMils)
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)
void SetText(const wxString &aText) override
A cache assistant for KiCad legacy symbol libraries.
static LIB_SYMBOL * LoadPart(LINE_READER &aReader, int aMajorVersion, int aMinorVersion, LIB_SYMBOL_MAP *aMap=nullptr)
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)
wxString m_error
For throwing exceptions or errors on partial schematic loads.
SCH_SHEET * m_currentSheet
The sheet currently being loaded.
void loadFile(const wxString &aFileName, SCH_SCREEN *aScreen)
void saveBusAlias(std::shared_ptr< BUS_ALIAS > aAlias)
void saveText(SCH_TEXT *aText)
void cacheLib(const wxString &aLibraryFileName, const STRING_UTF8_MAP *aProperties)
void saveJunction(SCH_JUNCTION *aJunction)
virtual ~SCH_IO_KICAD_LEGACY()
void loadPageSettings(LINE_READER &aReader, SCH_SCREEN *aScreen)
OUTPUTFORMATTER * m_out
The formatter for saving SCH_SCREEN objects.
void Format(SCH_SHEET *aSheet)
void loadHierarchy(SCH_SHEET *aSheet)
void saveBusEntry(SCH_BUS_ENTRY_BASE *aBusEntry)
void SaveSymbol(const wxString &aLibraryPath, const LIB_SYMBOL *aSymbol, const STRING_UTF8_MAP *aProperties=nullptr) override
Write aSymbol to an existing library located at aLibraryPath.
void 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.
bool DeleteLibrary(const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
Delete an existing library and returns true, or if library does not exist returns false,...
SCH_SYMBOL * loadSymbol(LINE_READER &aReader)
std::stack< wxString > m_currentPath
Stack to maintain nested sheet paths.
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...
int GetModifyHash() const override
Return the modification hash from the library cache.
void init(SCHEMATIC *aSchematic, const STRING_UTF8_MAP *aProperties=nullptr)
initialize PLUGIN like a constructor would.
void DeleteSymbol(const wxString &aLibraryPath, const wxString &aSymbolName, const STRING_UTF8_MAP *aProperties=nullptr) override
Delete the entire LIB_SYMBOL associated with aAliasName from the library aLibraryPath.
void CreateLibrary(const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
Create a new empty library at aLibraryPath empty.
wxString m_path
Root project path for loading child sheets.
void LoadContent(LINE_READER &aReader, SCH_SCREEN *aScreen, int version=EESCHEMA_VERSION)
void loadHeader(LINE_READER &aReader, SCH_SCREEN *aScreen)
SCH_TEXT * loadText(LINE_READER &aReader)
static const char * PropBuffering
The property used internally by the plugin to enable cache buffering which prevents the library file ...
static void FormatPart(LIB_SYMBOL *aSymbol, OUTPUTFORMATTER &aFormatter)
SCH_NO_CONNECT * loadNoConnect(LINE_READER &aReader)
int m_version
Version of file being loaded.
SCH_SHEET * LoadSchematicFile(const wxString &aFileName, SCHEMATIC *aSchematic, SCH_SHEET *aAppendToMe=nullptr, const STRING_UTF8_MAP *aProperties=nullptr) override
Load information from some input file format that this SCH_IO implementation knows about,...
bool CanReadSchematicFile(const wxString &aFileName) const override
Checks if this SCH_IO can read the specified schematic file.
void saveLine(SCH_LINE *aLine)
SCH_BUS_ENTRY_BASE * loadBusEntry(LINE_READER &aReader)
void saveSymbol(SCH_SYMBOL *aSymbol)
void saveField(SCH_FIELD *aField)
SCH_SHEET * loadSheet(LINE_READER &aReader)
SCH_LINE * loadWire(LINE_READER &aReader)
void saveNoConnect(SCH_NO_CONNECT *aNoConnect)
void SaveSchematicFile(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_IO implementation knows about,...
unsigned m_lineCount
for progress reporting
std::shared_ptr< BUS_ALIAS > loadBusAlias(LINE_READER &aReader, SCH_SCREEN *aScreen)
SCH_IO_KICAD_LEGACY_LIB_CACHE * m_cache
void SaveLibrary(const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
unsigned m_lastProgressLine
SCH_BITMAP * loadBitmap(LINE_READER &aReader)
static LIB_SYMBOL * ParsePart(LINE_READER &aReader, int majorVersion=0, int minorVersion=0)
SCH_SHEET * m_rootSheet
The root sheet of the schematic being loaded.
static const char * PropNoDocFile
The property used internally by the plugin to disable writing the library documentation (....
SCH_JUNCTION * loadJunction(LINE_READER &aReader)
void saveSheet(SCH_SHEET *aSheet)
bool writeDocFile(const STRING_UTF8_MAP *aProperties)
bool IsLibraryWritable(const wxString &aLibraryPath) override
Return true if the library at aLibraryPath is writable.
bool CanReadLibrary(const wxString &aFileName) const override
Checks if this IO object can read the specified library file/directory.
bool isBuffering(const STRING_UTF8_MAP *aProperties)
LINE_READER * m_lineReader
for progress reporting
void saveBitmap(SCH_BITMAP *aBitmap)
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.
virtual bool CanReadSchematicFile(const wxString &aFileName) const
Checks if this SCH_IO can read the specified schematic file.
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
SPIN_STYLE GetSpinStyle() const
void SetShape(LABEL_FLAG_SHAPE aShape)
LABEL_FLAG_SHAPE GetShape() const
virtual void SetSpinStyle(SPIN_STYLE aSpinStyle)
Segment description base class to describe items which have 2 end points (track, wire,...
VECTOR2I GetEndPoint() const
VECTOR2I GetStartPoint() const
LINE_STYLE 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
auto & GetBusAliases() const
Return a set of bus aliases defined in this screen.
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)
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()
const std::vector< SCH_SYMBOL_INSTANCE > & GetInstances() const
int GetFieldCount() const
Return the number of fields in this symbol.
SCH_FIELD * GetField(MANDATORY_FIELD_T aFieldType)
Return a mandatory field in this symbol.
VECTOR2I GetPosition() const override
const LIB_ID & GetLibId() const override
TRANSFORM & GetTransform()
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with SCH_FIELDs.
wxString GetPrefix() const
VECTOR2I GetPosition() const override
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(LINE_STYLE 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_VERTICAL
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
#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.
bool fileStartsWithPrefix(const wxString &aFilePath, const wxString &aPrefix, bool aIgnoreWhitespace)
Check if a file starts with a defined string.
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.
wxString From_UTF8(const char *cstring)
std::string EscapedUTF8(const wxString &aString)
Return an 8 bit UTF8 string given aString in Unicode form.
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
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
@ DATASHEET_FIELD
name of datasheet
@ MANDATORY_FIELDS
The first 5 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors.
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".
wxLogTrace helper definitions.
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition of file extensions used in Kicad.