20#include <magic_enum.hpp>
22#include <wx/tokenzr.h>
41#define LIB_VERSION_MAJOR 2
42#define LIB_VERSION_MINOR 4
44#define LIB_VERSION( major, minor ) ( major * 100 + minor )
47#define LIBFILE_IDENT "EESchema-LIBRARY Version"
50#define DOCFILE_IDENT "EESchema-DOCLIB Version 2.0"
58#define USE_OLD_DOC_FILE_FORMAT( major, minor ) \
59 ( LIB_VERSION( major, minor ) <= LIB_VERSION( 2, 4 ) )
82 wxString::Format(
"Cannot use relative file paths in legacy plugin to "
93 const char* line = reader.
Line();
95 if( !
strCompare(
"EESchema-LIBRARY Version", line, &line ) )
99 if( !
strCompare(
"EESchema-LIB Version", line, &line ) )
100 SCH_PARSE_ERROR(
"file is not a valid symbol or symbol library file", reader, line );
116 SCH_PARSE_ERROR(
"invalid file version formatting in header", reader, line );
142 line = reader.
Line();
144 if( *line ==
'#' || isspace( *line ) )
183 if( !fn.FileExists() )
186 if( !fn.IsFileReadable() )
188 THROW_IO_ERROR( wxString::Format(
_(
"Insufficient permissions to read library '%s'." ),
189 fn.GetFullPath() ) );
200 SCH_PARSE_ERROR(
"invalid document library file version formatting in header", reader, line );
204 line = reader.
Line();
212 aliasName = wxString::FromUTF8( line );
215 LIB_SYMBOL_MAP::iterator it =
m_symbols.find( aliasName );
219 wxLogWarning(
"Symbol '%s' not found in library:\n\n"
220 "'%s'\n\nat line %d offset %d",
224 (
int) (line - reader.
Line() ) );
236 line = reader.
Line();
273 SCH_PARSE_ERROR(
"expected token in symbol definition", reader, line );
282 const char* line = aReader.
Line();
284 wxASSERT(
strCompare(
"$HEADER", line, &line ) );
288 line = (
char*) aReader;
294 else if(
strCompare(
"$ENDHEADER", line, &line ) )
305 const char* line = aReader.
Line();
307 while( *line ==
'#' )
315 wxString utf8Line = wxString::FromUTF8( line );
316 wxStringTokenizer tokens( utf8Line,
" \t\r\n" );
318 if( tokens.CountTokens() < 8 )
322 std::unique_ptr<LIB_SYMBOL> symbol = std::make_unique<LIB_SYMBOL>( wxEmptyString );
324 wxString
name, prefix, tmp;
326 name = tokens.GetNextToken();
333 pos +=
name.size() + 1;
335 prefix = tokens.GetNextToken();
336 pos += prefix.size() + 1;
338 tmp = tokens.GetNextToken();
339 pos += tmp.size() + 1;
341 tmp = tokens.GetNextToken();
343 if( !tmp.ToLong( &num ) )
349 pos += tmp.size() + 1;
350 symbol->SetPinNameOffset(
schIUScale.MilsToIU( (
int)num ) );
352 tmp = tokens.GetNextToken();
354 if( !( tmp ==
"Y" || tmp ==
"N") )
360 pos += tmp.size() + 1;
361 symbol->SetShowPinNumbers( ( tmp ==
"N" ) ?
false :
true );
363 tmp = tokens.GetNextToken();
365 if( !( tmp ==
"Y" || tmp ==
"N") )
371 pos += tmp.size() + 1;
372 symbol->SetShowPinNames( ( tmp ==
"N" ) ?
false :
true );
374 tmp = tokens.GetNextToken();
376 if( !tmp.ToLong( &num ) )
379 pos += tmp.size() + 1;
380 symbol->SetUnitCount( (
int)num,
true );
383 if( symbol->GetUnitCount() < 1 )
384 symbol->SetUnitCount( 1,
true );
391 symbol->SetName(
"~" );
393 else if(
name[0] !=
'~' )
395 symbol->SetName(
name );
399 symbol->SetName(
name.Right(
name.Length() - 1 ) );
400 symbol->GetValueField().SetVisible(
false );
404 symbol->SetLibId(
LIB_ID( wxEmptyString, symbol->GetName() ) );
406 SCH_FIELD& reference = symbol->GetReferenceField();
420 if(
LIB_VERSION( aMajorVersion, aMinorVersion ) > 0
425 tmp = tokens.GetNextToken();
426 pos += tmp.size() + 1;
430 tmp = tokens.GetNextToken();
433 symbol->LockUnits(
true );
434 else if( tmp ==
"F" || tmp ==
"0" )
435 symbol->LockUnits(
false );
440 pos += tmp.size() + 1;
444 if( tokens.HasMoreTokens() )
446 tmp = tokens.GetNextToken();
449 symbol->SetGlobalPower();
450 else if( tmp ==
"N" )
468 else if( *line ==
'F' )
472 else if(
strCompare(
"$FPLIST", line, &line ) )
474 else if(
strCompare(
"ENDDEF", line, &line ) )
476 symbol->SetHasDeMorganBodyStyles( symbol->HasLegacyAlternateBodyStyle() );
477 return symbol.release();
491 wxString newAliasName;
492 const char* line = aReader.
Line();
494 wxCHECK_RET(
strCompare(
"ALIAS", line, &line ),
"Invalid ALIAS section" );
496 wxString utf8Line = wxString::FromUTF8( line );
497 wxStringTokenizer tokens( utf8Line,
" \t\r\n" );
500 while( tokens.HasMoreTokens() )
502 newAliasName = tokens.GetNextToken();
512 SCH_FIELD* parentField = aSymbol->GetField( fieldId );
514 *field = *parentField;
517 field->
SetText( newAliasName );
526 (*aMap)[ newSymbol->
GetName() ] = newSymbol;
535 const char* line = aReader.
Line();
537 wxCHECK_RET( *line ==
'F',
"Invalid field line" );
542 if( sscanf( line + 1,
"%d", &legacy_field_id ) != 1 || legacy_field_id < 0 )
549 switch( legacy_field_id )
559 field = aSymbol->GetField(
id );
563 field =
new SCH_FIELD( aSymbol.get(),
id );
564 aSymbol->AddDrawItem( field,
false );
568 while( *line !=
'"' && *line != 0 )
583 if(
text.size() == 1 &&
text[0] ==
'~' )
584 field->
SetText( wxEmptyString );
599 char textOrient =
parseChar( aReader, line, &line );
601 if( textOrient ==
'H' )
603 else if( textOrient ==
'V' )
606 SCH_PARSE_ERROR(
"invalid field text orientation parameter", aReader, line );
608 char textVisible =
parseChar( aReader, line, &line );
610 if( textVisible ==
'V' )
612 else if ( textVisible ==
'I' )
615 SCH_PARSE_ERROR(
"invalid field text visibility parameter", aReader, line );
621 if( *line != 0 && *line !=
'"' )
623 char textHJustify =
parseChar( aReader, line, &line );
625 if( textHJustify ==
'C' )
627 else if( textHJustify ==
'L' )
629 else if( textHJustify ==
'R' )
632 SCH_PARSE_ERROR(
"invalid field text horizontal justification", aReader, line );
638 size_t attrSize = attributes.size();
640 if( !(attrSize == 3 || attrSize == 1 ) )
641 SCH_PARSE_ERROR(
"invalid field text attributes size", aReader, line );
643 switch( (wxChar) attributes[0] )
648 default:
SCH_PARSE_ERROR(
"invalid field text vertical justification", aReader, line );
653 wxChar attr_1 = attributes[1];
654 wxChar attr_2 = attributes[2];
658 else if( attr_1 !=
'N' )
659 SCH_PARSE_ERROR(
"invalid field text italic parameter", aReader, line );
663 else if( attr_2 !=
'N' )
679 field->
SetText( aSymbol->GetName() );
683 wxString fieldName = wxEmptyString;
686 if( fieldName.IsEmpty() )
689 wxString candidateFieldName = fieldName;
693 while( aSymbol->GetField( candidateFieldName ) !=
nullptr )
694 candidateFieldName = wxString::Format(
"%s_%d", fieldName, ++suffix );
696 field->
SetName( candidateFieldName );
706 const char* line = aReader.
Line();
708 wxCHECK_RET(
strCompare(
"DRAW", line, &line ),
"Invalid DRAW section" );
716 aSymbol->GetDrawItems().sort();
723 aSymbol->AddDrawItem(
loadArc( aReader ),
false );
727 aSymbol->AddDrawItem(
loadCircle( aReader ),
false );
731 aSymbol->AddDrawItem(
loadText( aReader, aMajorVersion, aMinorVersion ),
false );
735 aSymbol->AddDrawItem(
loadRect( aReader ),
false );
739 aSymbol->AddDrawItem(
loadPin( aSymbol, aReader ),
false );
747 aSymbol->AddDrawItem(
loadBezier( aReader ),
false );
763 SCH_PARSE_ERROR(
"File ended prematurely loading symbol draw element.", aReader, line );
768 const char** aOutput )
770 switch (
parseChar( aReader, aLine, aOutput ) )
778 SCH_PARSE_ERROR(
"invalid fill type, expected f, F, or N", aReader, aLine );
788 auto DECIDEG2RAD = [](
double deg ) ->
double
790 return deg *
M_PI / 1800.0;
797 delta = *aAngle2 - *aAngle1;
805 x = cos( DECIDEG2RAD( *aAngle1 ) );
806 y = -sin( DECIDEG2RAD( *aAngle1 ) );
809 x = cos( DECIDEG2RAD( *aAngle2 ) );
810 y = -sin( DECIDEG2RAD( *aAngle2 ) );
816 if( *aAngle2 < *aAngle1 )
819 if( *aAngle2 - *aAngle1 > 1800 )
821 angle = ( *aAngle1 );
822 *aAngle1 = ( *aAngle2 );
828 if( *aAngle2 < *aAngle1 )
846 const char* line = aReader.
Line();
848 wxCHECK_MSG(
strCompare(
"A", line, &line ),
nullptr,
"Invalid arc definition" );
860 int angle1 =
parseInt( aReader, line, &line );
861 int angle2 =
parseInt( aReader, line, &line );
927 const char* line = aReader.
Line();
929 wxCHECK_MSG(
strCompare(
"C", line, &line ),
nullptr,
"Invalid circle definition" );
948 circle->SetStroke( stroke );
958 int aMajorVersion,
int aMinorVersion )
960 const char* line = aReader.
Line();
962 wxCHECK_MSG(
strCompare(
"T", line, &line ),
nullptr,
"Invalid SCH_TEXT definition" );
964 double angleInTenths;
972 angleInTenths =
parseInt( aReader, line, &line );
977 visible = !
parseInt( aReader, line, &line );
978 unit =
parseInt( aReader, line, &line );
979 bodyStyle =
parseInt( aReader, line, &line );
993 str.Replace(
"~",
" " );
999 str.Replace(
"''",
"\"" );
1014 sch_item = sch_text;
1015 eda_text = sch_text;
1032 if(
LIB_VERSION( aMajorVersion, aMinorVersion ) > 0
1038 else if( !
strCompare(
"Normal", line, &line ) )
1039 SCH_PARSE_ERROR(
"invalid eda_text stype, expected 'Normal' or 'Italic'", aReader, line );
1041 if(
parseInt( aReader, line, &line ) > 0 )
1047 switch(
parseChar( aReader, line, &line ) )
1052 default:
SCH_PARSE_ERROR(
"invalid horizontal eda_text justication; expected L, C, or R",
1056 switch(
parseChar( aReader, line, &line ) )
1061 default:
SCH_PARSE_ERROR(
"invalid vertical eda_text justication; expected T, C, or B",
1073 const char* line = aReader.
Line();
1075 wxCHECK_MSG(
strCompare(
"S", line, &line ),
nullptr,
"Invalid rectangle definition" );
1110 const char* line = aReader.
Line();
1112 wxCHECK_MSG(
strCompare(
"X", line, &line ),
nullptr,
"Invalid SCH_PIN definition" );
1119 wxString utf8Line = wxString::FromUTF8( line );
1120 wxStringTokenizer tokens( utf8Line,
" \t\r\n" );
1122 if( tokens.CountTokens() < 11 )
1125 tmp = tokens.GetNextToken();
1127 pos += tmp.size() + 1;
1129 tmp = tokens.GetNextToken();
1131 pos += tmp.size() + 1;
1136 tmp = tokens.GetNextToken();
1138 if( !tmp.ToLong( &num ) )
1144 pos += tmp.size() + 1;
1147 tmp = tokens.GetNextToken();
1149 if( !tmp.ToLong( &num ) )
1155 pos += tmp.size() + 1;
1158 tmp = tokens.GetNextToken();
1160 if( !tmp.ToLong( &num ) )
1166 pos += tmp.size() + 1;
1167 int length =
schIUScale.MilsToIU( (
int) num );
1170 tmp = tokens.GetNextToken();
1172 if( tmp.size() > 1 )
1178 pos += tmp.size() + 1;
1182 switch(
static_cast<char>( tmp[0] ) )
1191 tmp = tokens.GetNextToken();
1193 if( !tmp.ToLong( &num ) )
1199 pos += tmp.size() + 1;
1200 int numberTextSize =
schIUScale.MilsToIU( (
int) num );
1202 tmp = tokens.GetNextToken();
1204 if( !tmp.ToLong( &num ) )
1210 pos += tmp.size() + 1;
1211 int nameTextSize =
schIUScale.MilsToIU( (
int) num );
1213 tmp = tokens.GetNextToken();
1215 if( !tmp.ToLong( &num ) )
1221 pos += tmp.size() + 1;
1222 int unit = (int) num;
1224 tmp = tokens.GetNextToken();
1226 if( !tmp.ToLong( &num ) )
1232 pos += tmp.size() + 1;
1233 int bodyStyle = (int) num;
1235 tmp = tokens.GetNextToken();
1237 if( tmp.size() != 1 )
1243 pos += tmp.size() + 1;
1278 if( tokens.HasMoreTokens() )
1280 tmp = tokens.GetNextToken();
1286 LOWLEVEL_IN = 1 << 2,
1287 LOWLEVEL_OUT = 1 << 3,
1288 FALLING_EDGE = 1 << 4,
1294 for(
int j = (
int) tmp.size(); j > 0; )
1296 switch( tmp[--j].GetValue() )
1299 case 'N':
pin->SetVisible(
false );
break;
1300 case 'I': flags |=
INVERTED;
break;
1301 case 'C': flags |=
CLOCK;
break;
1302 case 'L': flags |= LOWLEVEL_IN;
break;
1303 case 'V': flags |= LOWLEVEL_OUT;
break;
1304 case 'F': flags |= FALLING_EDGE;
break;
1305 case 'X': flags |=
NONLOGIC;
break;
1324 default:
SCH_PARSE_ERROR(
"pin attributes do not define a valid pin shape", aReader, line );
1334 const char* line = aReader.
Line();
1336 wxCHECK_MSG(
strCompare(
"P", line, &line ),
nullptr,
"Invalid poly definition" );
1340 int points =
parseInt( aReader, line, &line );
1350 for(
int i = 0; i < points; i++ )
1366 const char* line = aReader.
Line();
1368 wxCHECK_MSG(
strCompare(
"B", line, &line ),
nullptr,
"Invalid Bezier definition" );
1370 int points =
parseInt( aReader, line, &line );
1372 wxCHECK_MSG( points == 4, NULL,
"Invalid Bezier curve definition" );
1413 const char* line = aReader.
Line();
1415 wxCHECK_RET(
strCompare(
"$FPLIST", line, &line ),
"Invalid footprint filter list" );
1419 wxArrayString footprintFilters;
1423 if(
strCompare(
"$ENDFPLIST", line, &line ) )
1425 aSymbol->SetFPFilters( footprintFilters );
1432 footprintFilters.Add( footprint );
1436 SCH_PARSE_ERROR(
"File ended prematurely while loading footprint filters.", aReader, line );
1444 bool doSaveDocFile = *aOpt;
1452 auto formatter = std::make_unique<FILE_OUTPUTFORMATTER>( fn.GetFullPath() );
1454 formatter->Print( 0,
"#encoding utf-8\n");
1458 if( !it->second->IsRoot() )
1464 formatter->Print( 0,
"#\n#End Library\n" );
1484 wxCHECK_RET( aSymbol && aSymbol->
IsRoot(),
"Invalid LIB_SYMBOL pointer." );
1488 wxArrayString aliasNames;
1492 for(
auto& entry : *aMap )
1497 aliasNames.Add( symbol->
GetName() );
1507 aFormatter.
Print( 0,
"DEF" );
1512 if( !reference.
GetText().IsEmpty() )
1515 aFormatter.
Print( 0,
" ~" );
1517 aFormatter.
Print( 0,
" %d %d %c %c %d %c %c\n",
1526 if( dateModified != 0 )
1528 int sec = dateModified & 63;
1529 int min = ( dateModified >> 6 ) & 63;
1530 int hour = ( dateModified >> 12 ) & 31;
1531 int day = ( dateModified >> 17 ) & 31;
1532 int mon = ( dateModified >> 22 ) & 15;
1533 int year = ( dateModified >> 26 ) + 1990;
1535 aFormatter.
Print( 0,
"Ti %d/%d/%d %d:%d:%d\n", year, mon, day, hour, min, sec );
1538 std::vector<SCH_FIELD*> orderedFields;
1542 int legacy_field_id = 0;
1545 saveField( field, legacy_field_id++, aFormatter );
1548 if( !aliasNames.IsEmpty() )
1550 aFormatter.
Print( 0,
"ALIAS" );
1552 for(
unsigned i = 0; i < aliasNames.GetCount(); i++ )
1553 aFormatter.
Print( 0,
" %s",
TO_UTF8( aliasNames[i] ) );
1555 aFormatter.
Print( 0,
"\n" );
1561 if( footprints.GetCount() != 0 )
1563 aFormatter.
Print( 0,
"$FPLIST\n" );
1565 for(
unsigned i = 0; i < footprints.GetCount(); i++ )
1566 aFormatter.
Print( 0,
" %s\n",
TO_UTF8( footprints[i] ) );
1568 aFormatter.
Print( 0,
"$ENDFPLIST\n" );
1577 aFormatter.
Print( 0,
"DRAW\n" );
1581 switch( item.Type() )
1613 aFormatter.
Print( 0,
"ENDDRAW\n" );
1616 aFormatter.
Print( 0,
"ENDDEF\n" );
1630 aFormatter.
Print( 0,
"A %d %d %d %d %d %d %d %d %c %d %d %d %d\n",
1651 aFormatter.
Print( 0,
"B 4 %d %d %d",
1656 aFormatter.
Print( 0,
" %d %d %d %d %d %d %d %d",
1674 aFormatter.
Print( 0,
"C %d %d %d %d %d %d %c\n",
1688 wxCHECK_RET( aField && aField->
Type() ==
SCH_FIELD_T,
"Invalid SCH_FIELD object." );
1690 int hjustify, vjustify;
1707 aFormatter.
Print( 0,
"F%d %s %d %d %d %c %c %c %c%c%c",
1717 aField->
IsBold() ?
'B' :
'N' );
1722 && !aField->
GetName().IsEmpty()
1728 aFormatter.
Print( 0,
"\n" );
1734 wxCHECK_RET( aPin && aPin->
Type() ==
SCH_PIN_T,
"Invalid SCH_PIN object." );
1754 if( !aPin->
GetName().IsEmpty() )
1757 aFormatter.
Print( 0,
"X ~" );
1759 int pin_orient =
'L';
1770 aFormatter.
Print( 0,
" %s %d %d %d %c %d %d %d %d %c",
1783 aFormatter.
Print( 0,
" " );
1786 aFormatter.
Print( 0,
"N" );
1799 default: wxFAIL_MSG(
"Invalid pin shape" );
1802 aFormatter.
Print( 0,
"\n" );
1813 aFormatter.
Print( 0,
"P %d %d %d %d",
1830 "Invalid RECT object." );
1832 aFormatter.
Print( 0,
"S %d %d %d %d %d %d %d %c\n",
1846 wxCHECK_RET( aText && aText->
Type() ==
SCH_TEXT_T,
"Invalid SCH_TEXT object." );
1850 if(
text.Contains( wxT(
" " ) ) ||
text.Contains( wxT(
"~" ) ) ||
text.Contains( wxT(
"\"" ) ) )
1853 text.Replace( wxT(
"\"" ), wxT(
"''" ) );
1854 text = wxT(
"\"" ) +
text + wxT(
"\"" );
1857 aFormatter.
Print( 0,
"T %d %d %d %d %d %d %d %s",
1867 aFormatter.
Print( 0,
" %s %d", aText->
IsItalic() ?
"Italic" :
"Normal", aText->
IsBold() );
1869 char hjustify =
'C';
1876 char vjustify =
'C';
1883 aFormatter.
Print( 0,
" %c %c\n", hjustify, vjustify );
1904 wxString description = it->second->GetDescription();
1905 wxString keyWords = it->second->GetKeyWords();
1906 wxString docFileName = it->second->GetDatasheetField().GetText();
1908 if( description.IsEmpty() && keyWords.IsEmpty() && docFileName.IsEmpty() )
1911 formatter.
Print( 0,
"#\n$CMP %s\n",
TO_UTF8( it->second->GetName() ) );
1913 if( !description.IsEmpty() )
1914 formatter.
Print( 0,
"D %s\n",
TO_UTF8( description ) );
1916 if( !keyWords.IsEmpty() )
1919 if( !docFileName.IsEmpty() )
1920 formatter.
Print( 0,
"F %s\n",
TO_UTF8( docFileName ) );
1922 formatter.
Print( 0,
"$ENDCMP\n" );
1925 formatter.
Print( 0,
"#\n#End Doc Library\n" );
1931 LIB_SYMBOL_MAP::iterator it =
m_symbols.find( aSymbolName );
1934 THROW_IO_ERROR( wxString::Format(
_(
"library %s does not contain a symbol named %s" ),
1946 LIB_SYMBOL_MAP::iterator it1 =
m_symbols.begin();
1950 if( it1->second->IsDerived()
1951 && it1->second->GetParent().lock() == rootSymbol->
SharedPtr() )
constexpr EDA_IU_SCALE schIUScale
constexpr double ARC_LOW_DEF_MM
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
int AsTenthsOfADegree() const
bool IsHorizontal() const
KICAD_T Type() const
Returns the type of object.
virtual void SetParent(EDA_ITEM *aParent)
const VECTOR2I & GetBezierC2() const
void SetBezierC2(const VECTOR2I &aPt)
FILL_T GetFillMode() const
SHAPE_POLY_SET & GetPolyShape()
void CalcArcAngles(EDA_ANGLE &aStartAngle, EDA_ANGLE &aEndAngle) const
Calc arc start and end angles such that aStartAngle < aEndAngle.
void RebuildBezierToSegmentsPointsList(int aMaxError)
Rebuild the m_bezierPoints vertex list that approximate the Bezier curve by a list of segments.
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
void SetStart(const VECTOR2I &aStart)
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
void SetEnd(const VECTOR2I &aEnd)
void SetBezierC1(const VECTOR2I &aPt)
const VECTOR2I & GetBezierC1() const
virtual int GetWidth() const
void SetFillMode(FILL_T aFill)
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
const VECTOR2I & GetTextPos() const
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)
Set only the bold flag, without changing the font.
virtual void SetVisible(bool aVisible)
void SetItalicFlag(bool aItalic)
Set only the italic flag, without changing the font.
GR_TEXT_V_ALIGN_T GetVertJustify() const
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
A LINE_READER that reads from an open file.
char * ReadLine() override
Read a line of text into the buffer and increments the line number counter.
A logical library item identifier and consists of various portions much like a URI.
Define a library symbol object.
std::weak_ptr< LIB_SYMBOL > & GetParent()
void GetFields(std::vector< SCH_FIELD * > &aList, bool aVisibleOnly=false) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
bool UnitsLocked() const
Check whether symbol units are interchangeable.
bool IsRoot() const override
For symbols derived from other symbols, IsRoot() indicates no derivation.
timestamp_t GetLastModDate() const
SCH_FIELD * GetField(const wxString &aFieldName)
Find a field within this symbol matching aFieldName; return nullptr if not found.
LIB_ITEMS_CONTAINER & GetDrawItems()
Return a reference to the draw item list.
void SetParent(LIB_SYMBOL *aParent=nullptr)
wxString GetName() const override
void SetDescription(const wxString &aDescription)
Gets the Description field text value */.
void SetKeyWords(const wxString &aKeyWords)
SCH_FIELD & GetValueField()
Return reference to the value field.
wxArrayString GetFPFilters() const
bool HasLegacyAlternateBodyStyle() const
Before V10 we didn't store the number of body styles in a symbol – we just looked through all its dra...
std::shared_ptr< LIB_SYMBOL > SharedPtr() const
http://www.boost.org/doc/libs/1_55_0/libs/smart_ptr/sp_techniques.html#weak_without_shared.
void SetHasDeMorganBodyStyles(bool aFlag)
bool IsGlobalPower() const override
int GetUnitCount() const override
SCH_FIELD & GetReferenceField()
Return reference to the reference designator field.
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.
bool empty(int aType=UNDEFINED_TYPE) const
virtual const wxString & GetText() const override
Return the string associated with the text object.
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
void SetPosition(const VECTOR2I &aPosition) override
void SetName(const wxString &aName)
void SetText(const wxString &aText) override
SCH_IO_KICAD_LEGACY_LIB_CACHE(const wxString &aLibraryPath)
static void loadDrawEntries(std::unique_ptr< LIB_SYMBOL > &aSymbol, LINE_READER &aReader, int aMajorVersion, int aMinorVersion)
void loadHeader(FILE_LINE_READER &aReader)
static SCH_SHAPE * loadBezier(LINE_READER &aReader)
static void saveField(const SCH_FIELD *aField, int aLegacyFieldIdx, OUTPUTFORMATTER &aFormatter)
static void saveArc(SCH_SHAPE *aArc, OUTPUTFORMATTER &aFormatter)
static void saveCircle(SCH_SHAPE *aCircle, OUTPUTFORMATTER &aFormatter)
static SCH_SHAPE * loadArc(LINE_READER &aReader)
static void loadField(std::unique_ptr< LIB_SYMBOL > &aSymbol, LINE_READER &aReader)
static LIB_SYMBOL * LoadPart(LINE_READER &aReader, int aMajorVersion, int aMinorVersion, LIB_SYMBOL_MAP *aMap=nullptr)
static void savePolyLine(SCH_SHAPE *aPolyLine, OUTPUTFORMATTER &aFormatter)
static SCH_SHAPE * loadPolyLine(LINE_READER &aReader)
static void saveBezier(SCH_SHAPE *aBezier, OUTPUTFORMATTER &aFormatter)
static SCH_SHAPE * loadCircle(LINE_READER &aReader)
static SCH_ITEM * loadText(LINE_READER &aReader, int aMajorVersion, int aMinorVersion)
void Save(const std::optional< bool > &aOpt) override
Save the entire library to file m_libFileName;.
static SCH_SHAPE * loadRect(LINE_READER &aReader)
static void loadAliases(std::unique_ptr< LIB_SYMBOL > &aSymbol, LINE_READER &aReader, LIB_SYMBOL_MAP *aMap=nullptr)
static void loadFootprintFilters(std::unique_ptr< LIB_SYMBOL > &aSymbol, LINE_READER &aReader)
void DeleteSymbol(const wxString &aName) override
static void savePin(const SCH_PIN *aPin, OUTPUTFORMATTER &aFormatter)
static SCH_PIN * loadPin(std::unique_ptr< LIB_SYMBOL > &aSymbol, LINE_READER &aReader)
static FILL_T parseFillMode(LINE_READER &aReader, const char *aLine, const char **aOutput)
static void saveRectangle(SCH_SHAPE *aRectangle, OUTPUTFORMATTER &aFormatter)
static void SaveSymbol(LIB_SYMBOL *aSymbol, OUTPUTFORMATTER &aFormatter, LIB_SYMBOL_MAP *aMap=nullptr)
static void saveText(const SCH_TEXT *aText, OUTPUTFORMATTER &aFormatter)
wxFileName GetRealFile() const
long long GetLibModificationTime()
SCH_IO_LIB_CACHE(const wxString &aLibraryPath)
void IncrementModifyHash()
Base class for any item which can be embedded within the SCHEMATIC container class,...
virtual void SetBodyStyle(int aBodyStyle)
virtual void SetUnit(int aUnit)
int GetNumberTextSize() const
const wxString & GetName() const
PIN_ORIENTATION GetOrientation() const
VECTOR2I GetPosition() const override
int GetNameTextSize() const
const wxString & GetNumber() const
GRAPHIC_PINSHAPE GetShape() const
ELECTRICAL_PINTYPE GetType() const
void SetPosition(const VECTOR2I &aPos) override
void SetStroke(const STROKE_PARAMS &aStroke) override
VECTOR2I GetCenter() const
void AddPoint(const VECTOR2I &aPosition)
VECTOR2I GetPosition() const override
virtual size_t GetPointCount() const override
const std::vector< VECTOR2I > & CPoints() const
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
Simple container to manage line stroke parameters.
int GetPinNameOffset() const
virtual bool GetShowPinNames() const
virtual bool GetShowPinNumbers() const
static constexpr EDA_ANGLE ANGLE_VERTICAL
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
#define IS_CHANGED
Item was edited, and modified.
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
@ FILLED_WITH_BG_BODYCOLOR
@ FILLED_SHAPE
Fill with object color.
static const std::string LegacySymbolDocumentFileExtension
const wxChar *const traceSchLegacyPlugin
Flag to enable legacy schematic plugin debug output.
std::chrono::steady_clock CLOCK
#define THROW_IO_ERROR(msg)
macro which captures the "call site" values of FILE_, __FUNCTION & LINE
#define THROW_PARSE_ERROR(aProblem, aSource, aInputLine, aLineNumber, aByteIndex)
uint32_t timestamp_t
timestamp_t is our type to represent unique IDs for all kinds of elements; historically simply the ti...
This file contains miscellaneous commonly used macros and functions.
ELECTRICAL_PINTYPE
The symbol library pin object electrical types used in ERC tests.
@ PT_INPUT
usual pin input: must be connected
@ PT_NC
not connected (must be left open)
@ PT_TRISTATE
tri state bus pin
@ PT_BIDI
input or output (like port for a microprocessor)
@ PT_OPENEMITTER
pin type open emitter
@ PT_POWER_OUT
output of a regulator: intended to be connected to power input pins
@ PT_OPENCOLLECTOR
pin type open collector
@ PT_POWER_IN
power input (GND, VCC for ICs). Must be connected to a power output.
@ PT_UNSPECIFIED
unknown electrical properties: creates always a warning when connected
@ PT_PASSIVE
pin for passive symbols: must be connected, and can be connected to any pin.
PIN_ORIENTATION
The symbol library pin object orientations.
@ PIN_UP
The pin extends upwards from the connection point: Probably on the bottom side of the symbol.
@ PIN_RIGHT
The pin extends rightwards from the connection point.
@ PIN_LEFT
The pin extends leftwards from the connection point: Probably on the right side of the symbol.
@ PIN_DOWN
The pin extends downwards from the connection: Probably on the top side of the symbol.
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.
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.
#define SCH_PARSE_ERROR(text, reader, pos)
static bool MapAnglesV6(int *aAngle1, int *aAngle2)
This function based on version 6.0 is required for reading legacy arcs.
#define LIB_VERSION_MINOR
Legacy symbol library minor version.
#define LIBFILE_IDENT
Legacy symbol library (.lib) file header.
#define USE_OLD_DOC_FILE_FORMAT(major, minor)
Library versions 2.4 and lower use the old separate library (.lib) and document (....
#define LIB_VERSION(major, minor)
#define DOCFILE_IDENT
Legacy symbol library document (.dcm) file header.
#define LIB_VERSION_MAJOR
Legacy symbol library major version.
wxString ConvertToNewOverbarNotation(const wxString &aOldStr)
Convert the old ~...~ overbar notation to the new ~{...} one.
wxString UnescapeString(const wxString &aSource)
wxString From_UTF8(const char *cstring)
std::string EscapedUTF8(const wxString &aString)
Return an 8 bit UTF8 string given aString in Unicode form.
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
std::map< wxString, LIB_SYMBOL *, LibSymbolMapSort > LIB_SYMBOL_MAP
wxString GetUserFieldName(int aFieldNdx, bool aTranslateForHI)
FIELD_T
The set of all field indices assuming an array like sequence that a SCH_COMPONENT or LIB_PART can hol...
@ USER
The field ID hasn't been set yet; field is invalid.
@ FOOTPRINT
Field Name Module PCB, i.e. "16DIP300".
@ DATASHEET
name of datasheet
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
wxString GetCanonicalFieldName(FIELD_T aFieldType)
SHAPE_CIRCLE circle(c.m_circle_center, c.m_circle_radius)
wxLogTrace helper definitions.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
void NORMALIZE_ANGLE_POS(T &Angle)
double RAD2DECIDEG(double rad)
VECTOR2< int32_t > VECTOR2I
Definition of file extensions used in Kicad.