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 ) )
597 case 'I': sheetPin->SetShape( LABEL_FLAG_SHAPE::L_INPUT );
break;
598 case 'O': sheetPin->SetShape( LABEL_FLAG_SHAPE::L_OUTPUT );
break;
599 case 'B': sheetPin->SetShape( LABEL_FLAG_SHAPE::L_BIDI );
break;
600 case 'T': sheetPin->SetShape( LABEL_FLAG_SHAPE::L_TRISTATE );
break;
601 case 'U': sheetPin->SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED );
break;
605 switch(
parseChar( aReader, line, &line ) )
607 case 'R': sheetPin->SetSide( SHEET_SIDE::RIGHT );
break;
608 case 'T': sheetPin->SetSide( SHEET_SIDE::TOP );
break;
609 case 'B': sheetPin->SetSide( SHEET_SIDE::BOTTOM );
break;
610 case 'L': sheetPin->SetSide( SHEET_SIDE::LEFT );
break;
619 sheetPin->SetPosition( position );
623 sheetPin->SetTextSize(
VECTOR2I( 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 );
695 bitmap->SetImage(
image );
711 int len = strlen( line );
713 for( ; len > 0 && !isspace( *line ) &&
'$' != *line; len -= 3, line += 3 )
717 if( sscanf( line,
"%X", &value ) == 1 )
718 stream.PutC( (
char) value );
724 if( line ==
nullptr )
729 return bitmap.release();
741 std::unique_ptr<SCH_JUNCTION> junction = std::make_unique<SCH_JUNCTION>();
743 const char* line = aReader.
Line();
745 wxCHECK(
strCompare(
"Connection", line, &line ),
nullptr );
755 junction->SetPosition( position );
757 return junction.release();
763 std::unique_ptr<SCH_NO_CONNECT> no_connect = std::make_unique<SCH_NO_CONNECT>();
765 const char* line = aReader.
Line();
767 wxCHECK(
strCompare(
"NoConn", line, &line ),
nullptr );
777 no_connect->SetPosition( position );
779 return no_connect.release();
785 std::unique_ptr<SCH_LINE> wire = std::make_unique<SCH_LINE>();
787 const char* line = aReader.
Line();
789 wxCHECK(
strCompare(
"Wire", line, &line ),
nullptr );
817 wire->SetLineWidth( size );
823 if( buf == wxT(
"solid" ) )
824 wire->SetLineStyle( PLOT_DASH_TYPE::SOLID );
825 else if( buf == wxT(
"dashed" ) )
826 wire->SetLineStyle( PLOT_DASH_TYPE::DASH );
827 else if( buf == wxT(
"dash_dot" ) )
828 wire->SetLineStyle( PLOT_DASH_TYPE::DASHDOT );
829 else if( buf == wxT(
"dotted" ) )
830 wire->SetLineStyle( PLOT_DASH_TYPE::DOT );
838 wxString prm, keyword;
839 keyword = buf.BeforeLast(
'(', &prm );
843 long color[4] = { 0 };
849 prm.ToLong( &
color[ii] );
853 int prm_count = ( keyword ==
T_COLORA ) ? 4 : 3;
858 for(; ii < prm_count && !
is_eol( *line ); ii++ )
863 if( *line ==
',' || *line ==
' ')
882 wire->SetStartPoint( begin );
883 wire->SetEndPoint( end );
885 return wire.release();
891 const char* line = aReader.
Line();
893 wxCHECK(
strCompare(
"Entry", line, &line ),
nullptr );
895 std::unique_ptr<SCH_BUS_ENTRY_BASE> busEntry;
899 busEntry = std::make_unique<SCH_BUS_WIRE_ENTRY>();
902 SCH_PARSE_ERROR(
"invalid bus entry definition expected 'Line'", aReader, line );
906 busEntry = std::make_unique<SCH_BUS_BUS_ENTRY>();
909 SCH_PARSE_ERROR(
"invalid bus entry definition expected 'Bus'", aReader, line );
929 busEntry->SetPosition( pos );
930 busEntry->SetSize( size );
932 return busEntry.release();
950 const char* line = aReader.
Line();
953 wxCHECK(
strCompare(
"Text", line, &line ),
nullptr );
963 else if(
strCompare(
"HLabel", line, &line ) )
967 else if(
strCompare(
"GLabel", line, &line ) )
985 std::unique_ptr<SCH_TEXT>
text;
996 int spinStyle =
parseInt( aReader, line, &line );
1008 if( spinStyle == 0 )
1010 else if( spinStyle == 2 )
1024 [ &line ](
const auto& it )
1026 return strCompare( it.second, line, &line );
1030 text->SetShape( resultIt->first );
1044 text->SetItalic(
true );
1052 penWidth =
parseInt( aReader, line, &line );
1055 text->SetBold( penWidth != 0 );
1061 tmp = strtok( tmp,
"\r\n" );
1066 int i = val.find( wxT(
"\\n" ) );
1068 if( i == wxNOT_FOUND )
1072 val.insert( i, wxT(
"\n" ) );
1077 return text.release();
1083 const char* line = aReader.
Line();
1085 wxCHECK(
strCompare(
"$Comp", line, &line ),
nullptr );
1087 std::unique_ptr<SCH_SYMBOL> symbol = std::make_unique<SCH_SYMBOL>();
1091 while( line !=
nullptr )
1097 wxString utf8Line = wxString::FromUTF8( line );
1098 wxStringTokenizer tokens( utf8Line,
" \r\n\t" );
1100 if( tokens.CountTokens() < 2 )
1104 libName = tokens.GetNextToken();
1105 libName.Replace(
"~",
" " );
1113 libId.
Parse( libName,
true );
1117 symbol->SetLibId( libId );
1119 wxString refDesignator = tokens.GetNextToken();
1121 refDesignator.Replace(
"~",
" " );
1123 wxString prefix = refDesignator;
1125 while( prefix.Length() )
1127 if( ( prefix.Last() <
'0' || prefix.Last() >
'9') && prefix.Last() !=
'?' )
1130 prefix.RemoveLast();
1134 prefix.Trim(
true );
1135 prefix.Trim(
false );
1137 if( prefix.IsEmpty() )
1138 symbol->SetPrefix( wxString(
"U" ) );
1140 symbol->SetPrefix( prefix );
1146 int unit =
parseInt( aReader, line, &line );
1157 symbol->SetUnit( unit );
1171 symbol->SetConvert(
convert );
1176 if(
text !=
"00000000" )
1185 symbol->SetPosition( pos );
1192 if( strncasecmp(
strCompare, line, len ) != 0 )
1196 wxString pathStr, reference, unit;
1204 if(
path.size() > 0 )
1216 if( strncasecmp(
strCompare, line, len ) != 0 )
1225 if( strncasecmp(
strCompare, line, len ) != 0 )
1233 if( !unit.ToLong( &tmp, 10 ) )
1239 symbol->AddHierarchicalReference(
path, reference, (
int)tmp );
1244 int index =
parseInt( aReader, line, &line );
1250 char orientation =
parseChar( aReader, line, &line );
1255 int attributes =
parseHex( aReader, line, &line );
1257 if( index >= symbol->GetFieldCount() )
1267 index = symbol->GetFieldCount();
1270 symbol->AddField( field );
1273 SCH_FIELD& field = symbol->GetFields()[index];
1279 char hjustify =
parseChar( aReader, line, &line );
1286 if( hjustify ==
'L' )
1288 else if( hjustify ==
'R' )
1290 else if( hjustify !=
'C' )
1291 SCH_PARSE_ERROR(
"symbol field text horizontal justification must be "
1292 "L, R, or C", aReader, line );
1296 if( textAttrs[0] ==
'T' )
1298 else if( textAttrs[0] ==
'B' )
1300 else if( textAttrs[0] !=
'C' )
1302 "B, T, or C", aReader, line );
1305 if( textAttrs.Length() > 1 )
1307 if( textAttrs.Length() != 3 )
1309 SCH_PARSE_ERROR(
_(
"symbol field text attributes must be 3 characters wide" ),
1313 if( textAttrs[1] ==
'I' )
1317 else if( textAttrs[1] !=
'N' )
1319 SCH_PARSE_ERROR(
"symbol field text italics indicator must be I or N",
1323 if( textAttrs[2] ==
'B' )
1327 else if( textAttrs[2] !=
'N' )
1340 if( orientation ==
'H' )
1342 else if( orientation ==
'V' )
1345 SCH_PARSE_ERROR(
"symbol field orientation must be H or V", aReader, line );
1347 if(
name.IsEmpty() )
1364 instance.
m_Unit = symbol->GetUnit();
1365 symbol->AddHierarchicalReference( instance );
1372 symbol->AddHierarchicalReference( tmpInstance );
1378 symbol->ClearFlags();
1379 return symbol.release();
1396 transform.
x1 =
parseInt( aReader, line, &line );
1398 if( transform.
x1 < -1 || transform.
x1 > 1 )
1399 SCH_PARSE_ERROR(
"invalid symbol X1 transform value", aReader, line );
1401 transform.
y1 =
parseInt( aReader, line, &line );
1403 if( transform.
y1 < -1 || transform.
y1 > 1 )
1404 SCH_PARSE_ERROR(
"invalid symbol Y1 transform value", aReader, line );
1406 transform.
x2 =
parseInt( aReader, line, &line );
1408 if( transform.
x2 < -1 || transform.
x2 > 1 )
1409 SCH_PARSE_ERROR(
"invalid symbol X2 transform value", aReader, line );
1411 transform.
y2 =
parseInt( aReader, line, &line );
1413 if( transform.
y2 < -1 || transform.
y2 > 1 )
1414 SCH_PARSE_ERROR(
"invalid symbol Y2 transform value", aReader, line );
1416 symbol->SetTransform( transform );
1431 auto busAlias = std::make_shared<BUS_ALIAS>( aScreen );
1432 const char* line = aReader.
Line();
1434 wxCHECK(
strCompare(
"BusAlias", line, &line ),
nullptr );
1438 busAlias->SetName( buf );
1440 while( *line !=
'\0' )
1445 if( !buf.IsEmpty() )
1446 busAlias->Members().emplace_back( buf );
1456 wxCHECK_RET( aSheet !=
nullptr,
"NULL SCH_SHEET object." );
1457 wxCHECK_RET( !aFileName.IsEmpty(),
"No schematic file name defined." );
1461 init( aSchematic, aProperties );
1463 wxFileName fn = aFileName;
1467 wxASSERT( fn.IsAbsolute() );
1481 wxCHECK_RET( aSheet !=
nullptr,
"NULL SCH_SHEET* object." );
1482 wxCHECK_RET(
m_schematic !=
nullptr,
"NULL SCHEMATIC* object." );
1524 for(
const std::shared_ptr<BUS_ALIAS>& alias : screen->
GetBusAliases() )
1529 std::multiset<
SCH_ITEM*,
decltype( cmp )> save_map( cmp );
1532 save_map.insert( item );
1535 for(
auto& item : save_map )
1537 switch( item->Type() )
1568 wxASSERT(
"Unexpected schematic object type in SCH_LEGACY_PLUGIN::Format()" );
1580 for(
unsigned i = 0; i < aSelection->
GetSize(); ++i )
1584 switch( item->
Type() )
1615 wxASSERT(
"Unexpected schematic object type in SCH_LEGACY_PLUGIN::Format()" );
1626 static wxString delimiters( wxT(
" " ) );
1644 if( symbol_name.size() )
1654 m_out->
Print( 0,
"L %s %s\n", name2.c_str(), name1.c_str() );
1683 wxString
path =
"/";
1686 for(
int i = 1; i < (int) instance.m_Path.size(); ++i )
1687 path += instance.m_Path[i].AsLegacyTimestampString() +
"/";
1689 m_out->
Print( 0,
"AR Path=\"%s\" Ref=\"%s\" Part=\"%d\" \n",
1691 TO_UTF8( instance.m_Reference ),
1722 transform.
x1, transform.
y1, transform.
x2, transform.
y2 );
1729 char hjustify =
'C';
1736 char vjustify =
'C';
1743 m_out->
Print( 0,
"F %d %s %c %-3d %-3d %-3d %4.4X %c %c%c%c",
1753 aField->
IsBold() ?
'B' :
'N' );
1765 wxCHECK_RET( aBitmap !=
nullptr,
"SCH_BITMAP* is NULL" );
1769 wxCHECK_RET(
image !=
nullptr,
"wxImage* is NULL" );
1778 wxMemoryOutputStream stream;
1780 image->SaveFile( stream, wxBITMAP_TYPE_PNG );
1783 wxStreamBuffer* buffer = stream.GetOutputStreamBuffer();
1784 char* begin = (
char*) buffer->GetBufferStart();
1786 for(
int ii = 0; begin < buffer->GetBufferEnd(); begin++, ii++ )
1805 wxCHECK_RET( aSheet !=
nullptr,
"SCH_SHEET* is NULL" );
1819 if( !sheetName.
GetText().IsEmpty() )
1826 if( !fileName.
GetText().IsEmpty() )
1837 if(
pin->GetText().IsEmpty() )
1840 switch(
pin->GetSide() )
1843 case SHEET_SIDE::LEFT: side =
'L';
break;
1844 case SHEET_SIDE::RIGHT: side =
'R';
break;
1845 case SHEET_SIDE::TOP: side =
'T';
break;
1846 case SHEET_SIDE::BOTTOM: side =
'B';
break;
1849 switch(
pin->GetShape() )
1852 case LABEL_FLAG_SHAPE::L_UNSPECIFIED: type =
'U';
break;
1853 case LABEL_FLAG_SHAPE::L_INPUT: type =
'I';
break;
1854 case LABEL_FLAG_SHAPE::L_OUTPUT: type =
'O';
break;
1855 case LABEL_FLAG_SHAPE::L_BIDI: type =
'B';
break;
1856 case LABEL_FLAG_SHAPE::L_TRISTATE: type =
'T';
break;
1859 m_out->
Print( 0,
"F%d %s %c %c %-3d %-3d %-3d\n",
1873 wxCHECK_RET( aJunction !=
nullptr,
"SCH_JUNCTION* is NULL" );
1883 wxCHECK_RET( aNoConnect !=
nullptr,
"SCH_NOCONNECT* is NULL" );
1893 wxCHECK_RET( aBusEntry !=
nullptr,
"SCH_BUS_ENTRY_BASE* is NULL" );
1897 m_out->
Print( 0,
"Entry Wire Line\n\t%-4d %-4d %-4d %-4d\n",
1905 m_out->
Print( 0,
"Entry Bus Bus\n\t%-4d %-4d %-4d %-4d\n",
1916 wxCHECK_RET( aLine !=
nullptr,
"SCH_LINE* is NULL" );
1918 const char* layer =
"Notes";
1919 const char* width =
"Line";
1926 m_out->
Print( 0,
"Wire %s %s", layer, width );
1958 wxCHECK_RET( aText !=
nullptr,
"SCH_TEXT* is NULL" );
1960 const char* italics =
"~";
1961 const char* textType =
"Notes";
1976 text.Replace( wxT(
"\n" ), wxT(
"\\n" ) );
1984 for(
unsigned ii = 0; ii <
text.Len(); )
1986 if(
text[ii] == 0x0A ||
text[ii] == 0x0D )
1987 text.erase( ii, 1 );
2000 if( spinStyle == 0 )
2002 else if( spinStyle == 2 )
2005 m_out->
Print( 0,
"Text %s %-4d %-4d %-4d %-4d %s %d\n%s\n", textType,
2017 wxCHECK_RET( shapeLabelIt !=
sheetLabelNames.end(),
"Shape not found in names list" );
2019 m_out->
Print( 0,
"Text %s %-4d %-4d %-4d %-4d %s %s %d\n%s\n", textType,
2024 shapeLabelIt->second,
2033 wxCHECK_RET( aAlias !=
nullptr,
"BUS_ALIAS* is NULL" );
2035 wxString members = boost::algorithm::join( aAlias->Members(),
" " );
2060 if( aProperties && aProperties->find( propName ) != aProperties->end() )
2084 const wxString& aLibraryPath,
2089 bool powerSymbolsOnly = ( aProperties &&
2092 cacheLib( aLibraryPath, aProperties );
2096 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
2098 if( !powerSymbolsOnly || it->second->IsPower() )
2099 aSymbolNameList.Add( it->first );
2105 const wxString& aLibraryPath,
2110 bool powerSymbolsOnly = ( aProperties &&
2113 cacheLib( aLibraryPath, aProperties );
2117 for( LIB_SYMBOL_MAP::const_iterator it = symbols.begin(); it != symbols.end(); ++it )
2119 if( !powerSymbolsOnly || it->second->IsPower() )
2120 aSymbolList.push_back( it->second );
2126 const wxString& aSymbolName,
2131 cacheLib( aLibraryPath, aProperties );
2133 LIB_SYMBOL_MAP::const_iterator it =
m_cache->
m_symbols.find( aSymbolName );
2147 cacheLib( aLibraryPath, aProperties );
2161 cacheLib( aLibraryPath, aProperties );
2173 if( wxFileExists( aLibraryPath ) )
2175 THROW_IO_ERROR( wxString::Format(
_(
"Symbol library '%s' already exists." ),
2176 aLibraryPath.GetData() ) );
2192 wxFileName fn = aLibraryPath;
2194 if( !fn.FileExists() )
2199 if( wxRemove( aLibraryPath ) )
2201 THROW_IO_ERROR( wxString::Format(
_(
"Symbol library '%s' cannot be deleted." ),
2202 aLibraryPath.GetData() ) );
2237 wxTextFile tempFile;
2239 tempFile.Open( aFileName );
2242 firstline = tempFile.GetFirstLine();
2245 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)
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
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 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 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.
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.