20#include <magic_enum.hpp>
40#define LIB_VERSION_MAJOR 2
41#define LIB_VERSION_MINOR 4
43#define LIB_VERSION( major, minor ) ( major * 100 + minor )
46#define LIBFILE_IDENT "EESchema-LIBRARY Version"
49#define DOCFILE_IDENT "EESchema-DOCLIB Version 2.0"
57#define USE_OLD_DOC_FILE_FORMAT( major, minor ) \
58 ( LIB_VERSION( major, minor ) <= LIB_VERSION( 2, 4 ) )
81 wxString::Format(
"Cannot use relative file paths in legacy plugin to "
92 const char* line = reader.
Line();
94 if( !
strCompare(
"EESchema-LIBRARY Version", line, &line ) )
98 if( !
strCompare(
"EESchema-LIB Version", line, &line ) )
99 SCH_PARSE_ERROR(
"file is not a valid symbol or symbol library file", reader, line );
115 SCH_PARSE_ERROR(
"invalid file version formatting in header", reader, line );
141 line = reader.
Line();
143 if( *line ==
'#' || isspace( *line ) )
182 if( !fn.FileExists() )
185 if( !fn.IsFileReadable() )
187 THROW_IO_ERROR( wxString::Format(
_(
"Insufficient permissions to read library '%s'." ),
188 fn.GetFullPath() ) );
199 SCH_PARSE_ERROR(
"invalid document library file version formatting in header", reader, line );
203 line = reader.
Line();
211 aliasName = wxString::FromUTF8( line );
214 LIB_SYMBOL_MAP::iterator it =
m_symbols.find( aliasName );
218 wxLogWarning(
"Symbol '%s' not found in library:\n\n"
219 "'%s'\n\nat line %d offset %d",
223 (
int) (line - reader.
Line() ) );
235 line = reader.
Line();
272 SCH_PARSE_ERROR(
"expected token in symbol definition", reader, line );
281 const char* line = aReader.
Line();
283 wxASSERT(
strCompare(
"$HEADER", line, &line ) );
287 line = (
char*) aReader;
293 else if(
strCompare(
"$ENDHEADER", line, &line ) )
304 const char* line = aReader.
Line();
306 while( *line ==
'#' )
314 wxString utf8Line = wxString::FromUTF8( line );
315 wxStringTokenizer tokens( utf8Line,
" \t\r\n" );
317 if( tokens.CountTokens() < 8 )
321 std::unique_ptr<LIB_SYMBOL> symbol = std::make_unique<LIB_SYMBOL>( wxEmptyString );
323 wxString
name, prefix, tmp;
325 name = tokens.GetNextToken();
332 pos +=
name.size() + 1;
334 prefix = tokens.GetNextToken();
335 pos += prefix.size() + 1;
337 tmp = tokens.GetNextToken();
338 pos += tmp.size() + 1;
340 tmp = tokens.GetNextToken();
342 if( !tmp.ToLong( &num ) )
348 pos += tmp.size() + 1;
349 symbol->SetPinNameOffset(
schIUScale.MilsToIU( (
int)num ) );
351 tmp = tokens.GetNextToken();
353 if( !( tmp ==
"Y" || tmp ==
"N") )
359 pos += tmp.size() + 1;
360 symbol->SetShowPinNumbers( ( tmp ==
"N" ) ?
false :
true );
362 tmp = tokens.GetNextToken();
364 if( !( tmp ==
"Y" || tmp ==
"N") )
370 pos += tmp.size() + 1;
371 symbol->SetShowPinNames( ( tmp ==
"N" ) ?
false :
true );
373 tmp = tokens.GetNextToken();
375 if( !tmp.ToLong( &num ) )
378 pos += tmp.size() + 1;
379 symbol->SetUnitCount( (
int)num,
true );
382 if( symbol->GetUnitCount() < 1 )
383 symbol->SetUnitCount( 1,
true );
390 symbol->SetName(
"~" );
392 else if(
name[0] !=
'~' )
394 symbol->SetName(
name );
398 symbol->SetName(
name.Right(
name.Length() - 1 ) );
399 symbol->GetValueField().SetVisible(
false );
403 symbol->SetLibId(
LIB_ID( wxEmptyString, symbol->GetName() ) );
405 SCH_FIELD& reference = symbol->GetReferenceField();
419 if(
LIB_VERSION( aMajorVersion, aMinorVersion ) > 0
424 tmp = tokens.GetNextToken();
425 pos += tmp.size() + 1;
429 tmp = tokens.GetNextToken();
432 symbol->LockUnits(
true );
433 else if( tmp ==
"F" || tmp ==
"0" )
434 symbol->LockUnits(
false );
439 pos += tmp.size() + 1;
443 if( tokens.HasMoreTokens() )
445 tmp = tokens.GetNextToken();
448 symbol->SetGlobalPower();
449 else if( tmp ==
"N" )
467 else if( *line ==
'F' )
471 else if(
strCompare(
"$FPLIST", line, &line ) )
473 else if(
strCompare(
"ENDDEF", line, &line ) )
475 symbol->SetHasDeMorganBodyStyles( symbol->HasLegacyAlternateBodyStyle() );
476 return symbol.release();
490 wxString newAliasName;
491 const char* line = aReader.
Line();
493 wxCHECK_RET(
strCompare(
"ALIAS", line, &line ),
"Invalid ALIAS section" );
495 wxString utf8Line = wxString::FromUTF8( line );
496 wxStringTokenizer tokens( utf8Line,
" \t\r\n" );
499 while( tokens.HasMoreTokens() )
501 newAliasName = tokens.GetNextToken();
511 SCH_FIELD* parentField = aSymbol->GetField( fieldId );
513 *field = *parentField;
516 field->
SetText( newAliasName );
525 (*aMap)[ newSymbol->
GetName() ] = newSymbol;
534 const char* line = aReader.
Line();
536 wxCHECK_RET( *line ==
'F',
"Invalid field line" );
541 if( sscanf( line + 1,
"%d", &legacy_field_id ) != 1 || legacy_field_id < 0 )
548 switch( legacy_field_id )
558 field = aSymbol->GetField(
id );
562 field =
new SCH_FIELD( aSymbol.get(),
id );
563 aSymbol->AddDrawItem( field,
false );
567 while( *line !=
'"' && *line != 0 )
582 if(
text.size() == 1 &&
text[0] ==
'~' )
583 field->
SetText( wxEmptyString );
598 char textOrient =
parseChar( aReader, line, &line );
600 if( textOrient ==
'H' )
602 else if( textOrient ==
'V' )
605 SCH_PARSE_ERROR(
"invalid field text orientation parameter", aReader, line );
607 char textVisible =
parseChar( aReader, line, &line );
609 if( textVisible ==
'V' )
611 else if ( textVisible ==
'I' )
614 SCH_PARSE_ERROR(
"invalid field text visibility parameter", aReader, line );
620 if( *line != 0 && *line !=
'"' )
622 char textHJustify =
parseChar( aReader, line, &line );
624 if( textHJustify ==
'C' )
626 else if( textHJustify ==
'L' )
628 else if( textHJustify ==
'R' )
631 SCH_PARSE_ERROR(
"invalid field text horizontal justification", aReader, line );
637 size_t attrSize = attributes.size();
639 if( !(attrSize == 3 || attrSize == 1 ) )
640 SCH_PARSE_ERROR(
"invalid field text attributes size", aReader, line );
642 switch( (wxChar) attributes[0] )
647 default:
SCH_PARSE_ERROR(
"invalid field text vertical justification", aReader, line );
652 wxChar attr_1 = attributes[1];
653 wxChar attr_2 = attributes[2];
657 else if( attr_1 !=
'N' )
658 SCH_PARSE_ERROR(
"invalid field text italic parameter", aReader, line );
662 else if( attr_2 !=
'N' )
678 field->
SetText( aSymbol->GetName() );
682 wxString fieldName = wxEmptyString;
685 if( fieldName.IsEmpty() )
688 wxString candidateFieldName = fieldName;
692 while( aSymbol->GetField( candidateFieldName ) !=
nullptr )
693 candidateFieldName = wxString::Format(
"%s_%d", fieldName, ++suffix );
695 field->
SetName( candidateFieldName );
705 const char* line = aReader.
Line();
707 wxCHECK_RET(
strCompare(
"DRAW", line, &line ),
"Invalid DRAW section" );
715 aSymbol->GetDrawItems().sort();
722 aSymbol->AddDrawItem(
loadArc( aReader ),
false );
726 aSymbol->AddDrawItem(
loadCircle( aReader ),
false );
730 aSymbol->AddDrawItem(
loadText( aReader, aMajorVersion, aMinorVersion ),
false );
734 aSymbol->AddDrawItem(
loadRect( aReader ),
false );
738 aSymbol->AddDrawItem(
loadPin( aSymbol, aReader ),
false );
746 aSymbol->AddDrawItem(
loadBezier( aReader ),
false );
762 SCH_PARSE_ERROR(
"File ended prematurely loading symbol draw element.", aReader, line );
767 const char** aOutput )
769 switch (
parseChar( aReader, aLine, aOutput ) )
777 SCH_PARSE_ERROR(
"invalid fill type, expected f, F, or N", aReader, aLine );
787 auto DECIDEG2RAD = [](
double deg ) ->
double
789 return deg *
M_PI / 1800.0;
796 delta = *aAngle2 - *aAngle1;
804 x = cos( DECIDEG2RAD( *aAngle1 ) );
805 y = -sin( DECIDEG2RAD( *aAngle1 ) );
808 x = cos( DECIDEG2RAD( *aAngle2 ) );
809 y = -sin( DECIDEG2RAD( *aAngle2 ) );
815 if( *aAngle2 < *aAngle1 )
818 if( *aAngle2 - *aAngle1 > 1800 )
820 angle = ( *aAngle1 );
821 *aAngle1 = ( *aAngle2 );
827 if( *aAngle2 < *aAngle1 )
845 const char* line = aReader.
Line();
847 wxCHECK_MSG(
strCompare(
"A", line, &line ),
nullptr,
"Invalid arc definition" );
859 int angle1 =
parseInt( aReader, line, &line );
860 int angle2 =
parseInt( aReader, line, &line );
926 const char* line = aReader.
Line();
928 wxCHECK_MSG(
strCompare(
"C", line, &line ),
nullptr,
"Invalid circle definition" );
947 circle->SetStroke( stroke );
957 int aMajorVersion,
int aMinorVersion )
959 const char* line = aReader.
Line();
961 wxCHECK_MSG(
strCompare(
"T", line, &line ),
nullptr,
"Invalid SCH_TEXT definition" );
963 double angleInTenths;
971 angleInTenths =
parseInt( aReader, line, &line );
976 visible = !
parseInt( aReader, line, &line );
977 unit =
parseInt( aReader, line, &line );
978 bodyStyle =
parseInt( aReader, line, &line );
992 str.Replace(
"~",
" " );
998 str.Replace(
"''",
"\"" );
1013 sch_item = sch_text;
1014 eda_text = sch_text;
1031 if(
LIB_VERSION( aMajorVersion, aMinorVersion ) > 0
1037 else if( !
strCompare(
"Normal", line, &line ) )
1038 SCH_PARSE_ERROR(
"invalid eda_text stype, expected 'Normal' or 'Italic'", aReader, line );
1040 if(
parseInt( aReader, line, &line ) > 0 )
1046 switch(
parseChar( aReader, line, &line ) )
1051 default:
SCH_PARSE_ERROR(
"invalid horizontal eda_text justication; expected L, C, or R",
1055 switch(
parseChar( aReader, line, &line ) )
1060 default:
SCH_PARSE_ERROR(
"invalid vertical eda_text justication; expected T, C, or B",
1072 const char* line = aReader.
Line();
1074 wxCHECK_MSG(
strCompare(
"S", line, &line ),
nullptr,
"Invalid rectangle definition" );
1109 const char* line = aReader.
Line();
1111 wxCHECK_MSG(
strCompare(
"X", line, &line ),
nullptr,
"Invalid SCH_PIN definition" );
1118 wxString utf8Line = wxString::FromUTF8( line );
1119 wxStringTokenizer tokens( utf8Line,
" \t\r\n" );
1121 if( tokens.CountTokens() < 11 )
1124 tmp = tokens.GetNextToken();
1126 pos += tmp.size() + 1;
1128 tmp = tokens.GetNextToken();
1130 pos += tmp.size() + 1;
1135 tmp = tokens.GetNextToken();
1137 if( !tmp.ToLong( &num ) )
1143 pos += tmp.size() + 1;
1146 tmp = tokens.GetNextToken();
1148 if( !tmp.ToLong( &num ) )
1154 pos += tmp.size() + 1;
1157 tmp = tokens.GetNextToken();
1159 if( !tmp.ToLong( &num ) )
1165 pos += tmp.size() + 1;
1166 int length =
schIUScale.MilsToIU( (
int) num );
1169 tmp = tokens.GetNextToken();
1171 if( tmp.size() > 1 )
1177 pos += tmp.size() + 1;
1181 switch(
static_cast<char>( tmp[0] ) )
1190 tmp = tokens.GetNextToken();
1192 if( !tmp.ToLong( &num ) )
1198 pos += tmp.size() + 1;
1199 int numberTextSize =
schIUScale.MilsToIU( (
int) num );
1201 tmp = tokens.GetNextToken();
1203 if( !tmp.ToLong( &num ) )
1209 pos += tmp.size() + 1;
1210 int nameTextSize =
schIUScale.MilsToIU( (
int) num );
1212 tmp = tokens.GetNextToken();
1214 if( !tmp.ToLong( &num ) )
1220 pos += tmp.size() + 1;
1221 int unit = (int) num;
1223 tmp = tokens.GetNextToken();
1225 if( !tmp.ToLong( &num ) )
1231 pos += tmp.size() + 1;
1232 int bodyStyle = (int) num;
1234 tmp = tokens.GetNextToken();
1236 if( tmp.size() != 1 )
1242 pos += tmp.size() + 1;
1277 if( tokens.HasMoreTokens() )
1279 tmp = tokens.GetNextToken();
1285 LOWLEVEL_IN = 1 << 2,
1286 LOWLEVEL_OUT = 1 << 3,
1287 FALLING_EDGE = 1 << 4,
1293 for(
int j = (
int) tmp.size(); j > 0; )
1295 switch( tmp[--j].GetValue() )
1298 case 'N':
pin->SetVisible(
false );
break;
1299 case 'I': flags |=
INVERTED;
break;
1300 case 'C': flags |=
CLOCK;
break;
1301 case 'L': flags |= LOWLEVEL_IN;
break;
1302 case 'V': flags |= LOWLEVEL_OUT;
break;
1303 case 'F': flags |= FALLING_EDGE;
break;
1304 case 'X': flags |=
NONLOGIC;
break;
1323 default:
SCH_PARSE_ERROR(
"pin attributes do not define a valid pin shape", aReader, line );
1333 const char* line = aReader.
Line();
1335 wxCHECK_MSG(
strCompare(
"P", line, &line ),
nullptr,
"Invalid poly definition" );
1339 int points =
parseInt( aReader, line, &line );
1349 for(
int i = 0; i < points; i++ )
1365 const char* line = aReader.
Line();
1367 wxCHECK_MSG(
strCompare(
"B", line, &line ),
nullptr,
"Invalid Bezier definition" );
1369 int points =
parseInt( aReader, line, &line );
1371 wxCHECK_MSG( points == 4, NULL,
"Invalid Bezier curve definition" );
1412 const char* line = aReader.
Line();
1414 wxCHECK_RET(
strCompare(
"$FPLIST", line, &line ),
"Invalid footprint filter list" );
1418 wxArrayString footprintFilters;
1422 if(
strCompare(
"$ENDFPLIST", line, &line ) )
1424 aSymbol->SetFPFilters( footprintFilters );
1431 footprintFilters.Add( footprint );
1435 SCH_PARSE_ERROR(
"File ended prematurely while loading footprint filters.", aReader, line );
1443 bool doSaveDocFile = *aOpt;
1451 auto formatter = std::make_unique<FILE_OUTPUTFORMATTER>( fn.GetFullPath() );
1453 formatter->Print( 0,
"#encoding utf-8\n");
1457 if( !it->second->IsRoot() )
1463 formatter->Print( 0,
"#\n#End Library\n" );
1483 wxCHECK_RET( aSymbol && aSymbol->
IsRoot(),
"Invalid LIB_SYMBOL pointer." );
1487 wxArrayString aliasNames;
1491 for(
auto& entry : *aMap )
1496 aliasNames.Add( symbol->
GetName() );
1506 aFormatter.
Print( 0,
"DEF" );
1511 if( !reference.
GetText().IsEmpty() )
1514 aFormatter.
Print( 0,
" ~" );
1516 aFormatter.
Print( 0,
" %d %d %c %c %d %c %c\n",
1525 if( dateModified != 0 )
1527 int sec = dateModified & 63;
1528 int min = ( dateModified >> 6 ) & 63;
1529 int hour = ( dateModified >> 12 ) & 31;
1530 int day = ( dateModified >> 17 ) & 31;
1531 int mon = ( dateModified >> 22 ) & 15;
1532 int year = ( dateModified >> 26 ) + 1990;
1534 aFormatter.
Print( 0,
"Ti %d/%d/%d %d:%d:%d\n", year, mon, day, hour, min, sec );
1537 std::vector<SCH_FIELD*> orderedFields;
1541 int legacy_field_id = 0;
1544 saveField( field, legacy_field_id++, aFormatter );
1547 if( !aliasNames.IsEmpty() )
1549 aFormatter.
Print( 0,
"ALIAS" );
1551 for(
unsigned i = 0; i < aliasNames.GetCount(); i++ )
1552 aFormatter.
Print( 0,
" %s",
TO_UTF8( aliasNames[i] ) );
1554 aFormatter.
Print( 0,
"\n" );
1560 if( footprints.GetCount() != 0 )
1562 aFormatter.
Print( 0,
"$FPLIST\n" );
1564 for(
unsigned i = 0; i < footprints.GetCount(); i++ )
1565 aFormatter.
Print( 0,
" %s\n",
TO_UTF8( footprints[i] ) );
1567 aFormatter.
Print( 0,
"$ENDFPLIST\n" );
1576 aFormatter.
Print( 0,
"DRAW\n" );
1580 switch( item.Type() )
1612 aFormatter.
Print( 0,
"ENDDRAW\n" );
1615 aFormatter.
Print( 0,
"ENDDEF\n" );
1629 aFormatter.
Print( 0,
"A %d %d %d %d %d %d %d %d %c %d %d %d %d\n",
1650 aFormatter.
Print( 0,
"B 4 %d %d %d",
1655 aFormatter.
Print( 0,
" %d %d %d %d %d %d %d %d",
1673 aFormatter.
Print( 0,
"C %d %d %d %d %d %d %c\n",
1687 wxCHECK_RET( aField && aField->
Type() ==
SCH_FIELD_T,
"Invalid SCH_FIELD object." );
1689 int hjustify, vjustify;
1706 aFormatter.
Print( 0,
"F%d %s %d %d %d %c %c %c %c%c%c",
1716 aField->
IsBold() ?
'B' :
'N' );
1721 && !aField->
GetName().IsEmpty()
1727 aFormatter.
Print( 0,
"\n" );
1733 wxCHECK_RET( aPin && aPin->
Type() ==
SCH_PIN_T,
"Invalid SCH_PIN object." );
1753 if( !aPin->
GetName().IsEmpty() )
1756 aFormatter.
Print( 0,
"X ~" );
1758 int pin_orient =
'L';
1769 aFormatter.
Print( 0,
" %s %d %d %d %c %d %d %d %d %c",
1782 aFormatter.
Print( 0,
" " );
1785 aFormatter.
Print( 0,
"N" );
1798 default: wxFAIL_MSG(
"Invalid pin shape" );
1801 aFormatter.
Print( 0,
"\n" );
1812 aFormatter.
Print( 0,
"P %d %d %d %d",
1829 "Invalid RECT object." );
1831 aFormatter.
Print( 0,
"S %d %d %d %d %d %d %d %c\n",
1845 wxCHECK_RET( aText && aText->
Type() ==
SCH_TEXT_T,
"Invalid SCH_TEXT object." );
1849 if(
text.Contains( wxT(
" " ) ) ||
text.Contains( wxT(
"~" ) ) ||
text.Contains( wxT(
"\"" ) ) )
1852 text.Replace( wxT(
"\"" ), wxT(
"''" ) );
1853 text = wxT(
"\"" ) +
text + wxT(
"\"" );
1856 aFormatter.
Print( 0,
"T %d %d %d %d %d %d %d %s",
1866 aFormatter.
Print( 0,
" %s %d", aText->
IsItalic() ?
"Italic" :
"Normal", aText->
IsBold() );
1868 char hjustify =
'C';
1875 char vjustify =
'C';
1882 aFormatter.
Print( 0,
" %c %c\n", hjustify, vjustify );
1903 wxString description = it->second->GetDescription();
1904 wxString keyWords = it->second->GetKeyWords();
1905 wxString docFileName = it->second->GetDatasheetField().GetText();
1907 if( description.IsEmpty() && keyWords.IsEmpty() && docFileName.IsEmpty() )
1910 formatter.
Print( 0,
"#\n$CMP %s\n",
TO_UTF8( it->second->GetName() ) );
1912 if( !description.IsEmpty() )
1913 formatter.
Print( 0,
"D %s\n",
TO_UTF8( description ) );
1915 if( !keyWords.IsEmpty() )
1918 if( !docFileName.IsEmpty() )
1919 formatter.
Print( 0,
"F %s\n",
TO_UTF8( docFileName ) );
1921 formatter.
Print( 0,
"$ENDCMP\n" );
1924 formatter.
Print( 0,
"#\n#End Doc Library\n" );
1930 LIB_SYMBOL_MAP::iterator it =
m_symbols.find( aSymbolName );
1933 THROW_IO_ERROR( wxString::Format(
_(
"library %s does not contain a symbol named %s" ),
1945 LIB_SYMBOL_MAP::iterator it1 =
m_symbols.begin();
1949 if( it1->second->IsDerived()
1950 && 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.