20#include <magic_enum.hpp>
39#define LIB_VERSION_MAJOR 2
40#define LIB_VERSION_MINOR 4
42#define LIB_VERSION( major, minor ) ( major * 100 + minor )
45#define LIBFILE_IDENT "EESchema-LIBRARY Version"
48#define DOCFILE_IDENT "EESchema-DOCLIB Version 2.0"
56#define USE_OLD_DOC_FILE_FORMAT( major, minor ) \
57 ( LIB_VERSION( major, minor ) <= LIB_VERSION( 2, 4 ) )
80 wxString::Format(
"Cannot use relative file paths in legacy plugin to "
91 const char* line = reader.
Line();
93 if( !
strCompare(
"EESchema-LIBRARY Version", line, &line ) )
97 if( !
strCompare(
"EESchema-LIB Version", line, &line ) )
98 SCH_PARSE_ERROR(
"file is not a valid symbol or symbol library file", reader, line );
114 SCH_PARSE_ERROR(
"invalid file version formatting in header", reader, line );
140 line = reader.
Line();
142 if( *line ==
'#' || isspace( *line ) )
181 if( !fn.FileExists() )
184 if( !fn.IsFileReadable() )
186 THROW_IO_ERROR( wxString::Format(
_(
"Insufficient permissions to read library '%s'." ),
187 fn.GetFullPath() ) );
198 SCH_PARSE_ERROR(
"invalid document library file version formatting in header", reader, line );
202 line = reader.
Line();
210 aliasName = wxString::FromUTF8( line );
213 LIB_SYMBOL_MAP::iterator it =
m_symbols.find( aliasName );
217 wxLogWarning(
"Symbol '%s' not found in library:\n\n"
218 "'%s'\n\nat line %d offset %d",
222 (
int) (line - reader.
Line() ) );
234 line = reader.
Line();
271 SCH_PARSE_ERROR(
"expected token in symbol definition", reader, line );
280 const char* line = aReader.
Line();
282 wxASSERT(
strCompare(
"$HEADER", line, &line ) );
286 line = (
char*) aReader;
292 else if(
strCompare(
"$ENDHEADER", line, &line ) )
303 const char* line = aReader.
Line();
305 while( *line ==
'#' )
313 wxString utf8Line = wxString::FromUTF8( line );
314 wxStringTokenizer tokens( utf8Line,
" \t\r\n" );
316 if( tokens.CountTokens() < 8 )
320 std::unique_ptr<LIB_SYMBOL> symbol = std::make_unique<LIB_SYMBOL>( wxEmptyString );
322 wxString
name, prefix, tmp;
324 name = tokens.GetNextToken();
331 pos +=
name.size() + 1;
333 prefix = tokens.GetNextToken();
334 pos += prefix.size() + 1;
336 tmp = tokens.GetNextToken();
337 pos += tmp.size() + 1;
339 tmp = tokens.GetNextToken();
341 if( !tmp.ToLong( &num ) )
347 pos += tmp.size() + 1;
348 symbol->SetPinNameOffset(
schIUScale.MilsToIU( (
int)num ) );
350 tmp = tokens.GetNextToken();
352 if( !( tmp ==
"Y" || tmp ==
"N") )
358 pos += tmp.size() + 1;
359 symbol->SetShowPinNumbers( ( tmp ==
"N" ) ?
false :
true );
361 tmp = tokens.GetNextToken();
363 if( !( tmp ==
"Y" || tmp ==
"N") )
369 pos += tmp.size() + 1;
370 symbol->SetShowPinNames( ( tmp ==
"N" ) ?
false :
true );
372 tmp = tokens.GetNextToken();
374 if( !tmp.ToLong( &num ) )
377 pos += tmp.size() + 1;
378 symbol->SetUnitCount( (
int)num,
true );
381 if( symbol->GetUnitCount() < 1 )
382 symbol->SetUnitCount( 1,
true );
389 symbol->SetName(
"~" );
391 else if(
name[0] !=
'~' )
393 symbol->SetName(
name );
397 symbol->SetName(
name.Right(
name.Length() - 1 ) );
398 symbol->GetValueField().SetVisible(
false );
402 symbol->SetLibId(
LIB_ID( wxEmptyString, symbol->GetName() ) );
404 SCH_FIELD& reference = symbol->GetReferenceField();
418 if(
LIB_VERSION( aMajorVersion, aMinorVersion ) > 0
423 tmp = tokens.GetNextToken();
424 pos += tmp.size() + 1;
428 tmp = tokens.GetNextToken();
431 symbol->LockUnits(
true );
432 else if( tmp ==
"F" || tmp ==
"0" )
433 symbol->LockUnits(
false );
438 pos += tmp.size() + 1;
442 if( tokens.HasMoreTokens() )
444 tmp = tokens.GetNextToken();
447 symbol->SetGlobalPower();
448 else if( tmp ==
"N" )
466 else if( *line ==
'F' )
470 else if(
strCompare(
"$FPLIST", line, &line ) )
472 else if(
strCompare(
"ENDDEF", line, &line ) )
474 symbol->SetHasDeMorganBodyStyles( symbol->HasLegacyAlternateBodyStyle() );
475 return symbol.release();
489 wxString newAliasName;
490 const char* line = aReader.
Line();
492 wxCHECK_RET(
strCompare(
"ALIAS", line, &line ),
"Invalid ALIAS section" );
494 wxString utf8Line = wxString::FromUTF8( line );
495 wxStringTokenizer tokens( utf8Line,
" \t\r\n" );
498 while( tokens.HasMoreTokens() )
500 newAliasName = tokens.GetNextToken();
510 SCH_FIELD* parentField = aSymbol->GetField( fieldId );
512 *field = *parentField;
515 field->
SetText( newAliasName );
524 (*aMap)[ newSymbol->
GetName() ] = newSymbol;
533 const char* line = aReader.
Line();
535 wxCHECK_RET( *line ==
'F',
"Invalid field line" );
540 if( sscanf( line + 1,
"%d", &legacy_field_id ) != 1 || legacy_field_id < 0 )
547 switch( legacy_field_id )
557 field = aSymbol->GetField(
id );
561 field =
new SCH_FIELD( aSymbol.get(),
id );
562 aSymbol->AddDrawItem( field,
false );
566 while( *line !=
'"' && *line != 0 )
581 if(
text.size() == 1 &&
text[0] ==
'~' )
582 field->
SetText( wxEmptyString );
597 char textOrient =
parseChar( aReader, line, &line );
599 if( textOrient ==
'H' )
601 else if( textOrient ==
'V' )
604 SCH_PARSE_ERROR(
"invalid field text orientation parameter", aReader, line );
606 char textVisible =
parseChar( aReader, line, &line );
608 if( textVisible ==
'V' )
610 else if ( textVisible ==
'I' )
613 SCH_PARSE_ERROR(
"invalid field text visibility parameter", aReader, line );
619 if( *line != 0 && *line !=
'"' )
621 char textHJustify =
parseChar( aReader, line, &line );
623 if( textHJustify ==
'C' )
625 else if( textHJustify ==
'L' )
627 else if( textHJustify ==
'R' )
630 SCH_PARSE_ERROR(
"invalid field text horizontal justification", aReader, line );
636 size_t attrSize = attributes.size();
638 if( !(attrSize == 3 || attrSize == 1 ) )
639 SCH_PARSE_ERROR(
"invalid field text attributes size", aReader, line );
641 switch( (wxChar) attributes[0] )
646 default:
SCH_PARSE_ERROR(
"invalid field text vertical justification", aReader, line );
651 wxChar attr_1 = attributes[1];
652 wxChar attr_2 = attributes[2];
656 else if( attr_1 !=
'N' )
657 SCH_PARSE_ERROR(
"invalid field text italic parameter", aReader, line );
661 else if( attr_2 !=
'N' )
677 field->
SetText( aSymbol->GetName() );
681 wxString fieldName = wxEmptyString;
684 if( fieldName.IsEmpty() )
687 wxString candidateFieldName = fieldName;
691 while( aSymbol->GetField( candidateFieldName ) !=
nullptr )
692 candidateFieldName = wxString::Format(
"%s_%d", fieldName, ++suffix );
694 field->
SetName( candidateFieldName );
704 const char* line = aReader.
Line();
706 wxCHECK_RET(
strCompare(
"DRAW", line, &line ),
"Invalid DRAW section" );
714 aSymbol->GetDrawItems().sort();
721 aSymbol->AddDrawItem(
loadArc( aReader ),
false );
725 aSymbol->AddDrawItem(
loadCircle( aReader ),
false );
729 aSymbol->AddDrawItem(
loadText( aReader, aMajorVersion, aMinorVersion ),
false );
733 aSymbol->AddDrawItem(
loadRect( aReader ),
false );
737 aSymbol->AddDrawItem(
loadPin( aSymbol, aReader ),
false );
745 aSymbol->AddDrawItem(
loadBezier( aReader ),
false );
761 SCH_PARSE_ERROR(
"File ended prematurely loading symbol draw element.", aReader, line );
766 const char** aOutput )
768 switch (
parseChar( aReader, aLine, aOutput ) )
776 SCH_PARSE_ERROR(
"invalid fill type, expected f, F, or N", aReader, aLine );
786 auto DECIDEG2RAD = [](
double deg ) ->
double
788 return deg *
M_PI / 1800.0;
795 delta = *aAngle2 - *aAngle1;
803 x = cos( DECIDEG2RAD( *aAngle1 ) );
804 y = -sin( DECIDEG2RAD( *aAngle1 ) );
807 x = cos( DECIDEG2RAD( *aAngle2 ) );
808 y = -sin( DECIDEG2RAD( *aAngle2 ) );
814 if( *aAngle2 < *aAngle1 )
817 if( *aAngle2 - *aAngle1 > 1800 )
819 angle = ( *aAngle1 );
820 *aAngle1 = ( *aAngle2 );
826 if( *aAngle2 < *aAngle1 )
844 const char* line = aReader.
Line();
846 wxCHECK_MSG(
strCompare(
"A", line, &line ),
nullptr,
"Invalid arc definition" );
858 int angle1 =
parseInt( aReader, line, &line );
859 int angle2 =
parseInt( aReader, line, &line );
925 const char* line = aReader.
Line();
927 wxCHECK_MSG(
strCompare(
"C", line, &line ),
nullptr,
"Invalid circle definition" );
946 circle->SetStroke( stroke );
956 int aMajorVersion,
int aMinorVersion )
958 const char* line = aReader.
Line();
960 wxCHECK_MSG(
strCompare(
"T", line, &line ),
nullptr,
"Invalid SCH_TEXT definition" );
962 double angleInTenths;
970 angleInTenths =
parseInt( aReader, line, &line );
975 visible = !
parseInt( aReader, line, &line );
976 unit =
parseInt( aReader, line, &line );
977 bodyStyle =
parseInt( aReader, line, &line );
991 str.Replace(
"~",
" " );
997 str.Replace(
"''",
"\"" );
1012 sch_item = sch_text;
1013 eda_text = sch_text;
1030 if(
LIB_VERSION( aMajorVersion, aMinorVersion ) > 0
1036 else if( !
strCompare(
"Normal", line, &line ) )
1037 SCH_PARSE_ERROR(
"invalid eda_text stype, expected 'Normal' or 'Italic'", aReader, line );
1039 if(
parseInt( aReader, line, &line ) > 0 )
1045 switch(
parseChar( aReader, line, &line ) )
1050 default:
SCH_PARSE_ERROR(
"invalid horizontal eda_text justication; expected L, C, or R",
1054 switch(
parseChar( aReader, line, &line ) )
1059 default:
SCH_PARSE_ERROR(
"invalid vertical eda_text justication; expected T, C, or B",
1071 const char* line = aReader.
Line();
1073 wxCHECK_MSG(
strCompare(
"S", line, &line ),
nullptr,
"Invalid rectangle definition" );
1108 const char* line = aReader.
Line();
1110 wxCHECK_MSG(
strCompare(
"X", line, &line ),
nullptr,
"Invalid SCH_PIN definition" );
1117 wxString utf8Line = wxString::FromUTF8( line );
1118 wxStringTokenizer tokens( utf8Line,
" \t\r\n" );
1120 if( tokens.CountTokens() < 11 )
1123 tmp = tokens.GetNextToken();
1125 pos += tmp.size() + 1;
1127 tmp = tokens.GetNextToken();
1129 pos += tmp.size() + 1;
1134 tmp = tokens.GetNextToken();
1136 if( !tmp.ToLong( &num ) )
1142 pos += tmp.size() + 1;
1145 tmp = tokens.GetNextToken();
1147 if( !tmp.ToLong( &num ) )
1153 pos += tmp.size() + 1;
1156 tmp = tokens.GetNextToken();
1158 if( !tmp.ToLong( &num ) )
1164 pos += tmp.size() + 1;
1165 int length =
schIUScale.MilsToIU( (
int) num );
1168 tmp = tokens.GetNextToken();
1170 if( tmp.size() > 1 )
1176 pos += tmp.size() + 1;
1180 switch(
static_cast<char>( tmp[0] ) )
1189 tmp = tokens.GetNextToken();
1191 if( !tmp.ToLong( &num ) )
1197 pos += tmp.size() + 1;
1198 int numberTextSize =
schIUScale.MilsToIU( (
int) num );
1200 tmp = tokens.GetNextToken();
1202 if( !tmp.ToLong( &num ) )
1208 pos += tmp.size() + 1;
1209 int nameTextSize =
schIUScale.MilsToIU( (
int) num );
1211 tmp = tokens.GetNextToken();
1213 if( !tmp.ToLong( &num ) )
1219 pos += tmp.size() + 1;
1220 int unit = (int) num;
1222 tmp = tokens.GetNextToken();
1224 if( !tmp.ToLong( &num ) )
1230 pos += tmp.size() + 1;
1231 int bodyStyle = (int) num;
1233 tmp = tokens.GetNextToken();
1235 if( tmp.size() != 1 )
1241 pos += tmp.size() + 1;
1276 if( tokens.HasMoreTokens() )
1278 tmp = tokens.GetNextToken();
1284 LOWLEVEL_IN = 1 << 2,
1285 LOWLEVEL_OUT = 1 << 3,
1286 FALLING_EDGE = 1 << 4,
1292 for(
int j = (
int) tmp.size(); j > 0; )
1294 switch( tmp[--j].GetValue() )
1297 case 'N':
pin->SetVisible(
false );
break;
1298 case 'I': flags |=
INVERTED;
break;
1299 case 'C': flags |=
CLOCK;
break;
1300 case 'L': flags |= LOWLEVEL_IN;
break;
1301 case 'V': flags |= LOWLEVEL_OUT;
break;
1302 case 'F': flags |= FALLING_EDGE;
break;
1303 case 'X': flags |=
NONLOGIC;
break;
1322 default:
SCH_PARSE_ERROR(
"pin attributes do not define a valid pin shape", aReader, line );
1332 const char* line = aReader.
Line();
1334 wxCHECK_MSG(
strCompare(
"P", line, &line ),
nullptr,
"Invalid poly definition" );
1338 int points =
parseInt( aReader, line, &line );
1348 for(
int i = 0; i < points; i++ )
1364 const char* line = aReader.
Line();
1366 wxCHECK_MSG(
strCompare(
"B", line, &line ),
nullptr,
"Invalid Bezier definition" );
1368 int points =
parseInt( aReader, line, &line );
1370 wxCHECK_MSG( points == 4, NULL,
"Invalid Bezier curve definition" );
1411 const char* line = aReader.
Line();
1413 wxCHECK_RET(
strCompare(
"$FPLIST", line, &line ),
"Invalid footprint filter list" );
1417 wxArrayString footprintFilters;
1421 if(
strCompare(
"$ENDFPLIST", line, &line ) )
1423 aSymbol->SetFPFilters( footprintFilters );
1430 footprintFilters.Add( footprint );
1434 SCH_PARSE_ERROR(
"File ended prematurely while loading footprint filters.", aReader, line );
1442 bool doSaveDocFile = *aOpt;
1450 auto formatter = std::make_unique<FILE_OUTPUTFORMATTER>( fn.GetFullPath() );
1452 formatter->Print( 0,
"#encoding utf-8\n");
1456 if( !it->second->IsRoot() )
1462 formatter->Print( 0,
"#\n#End Library\n" );
1482 wxCHECK_RET( aSymbol && aSymbol->
IsRoot(),
"Invalid LIB_SYMBOL pointer." );
1486 wxArrayString aliasNames;
1490 for(
auto& entry : *aMap )
1495 aliasNames.Add( symbol->
GetName() );
1505 aFormatter.
Print( 0,
"DEF" );
1510 if( !reference.
GetText().IsEmpty() )
1513 aFormatter.
Print( 0,
" ~" );
1515 aFormatter.
Print( 0,
" %d %d %c %c %d %c %c\n",
1524 if( dateModified != 0 )
1526 int sec = dateModified & 63;
1527 int min = ( dateModified >> 6 ) & 63;
1528 int hour = ( dateModified >> 12 ) & 31;
1529 int day = ( dateModified >> 17 ) & 31;
1530 int mon = ( dateModified >> 22 ) & 15;
1531 int year = ( dateModified >> 26 ) + 1990;
1533 aFormatter.
Print( 0,
"Ti %d/%d/%d %d:%d:%d\n", year, mon, day, hour, min, sec );
1536 std::vector<SCH_FIELD*> orderedFields;
1540 int legacy_field_id = 0;
1543 saveField( field, legacy_field_id++, aFormatter );
1546 if( !aliasNames.IsEmpty() )
1548 aFormatter.
Print( 0,
"ALIAS" );
1550 for(
unsigned i = 0; i < aliasNames.GetCount(); i++ )
1551 aFormatter.
Print( 0,
" %s",
TO_UTF8( aliasNames[i] ) );
1553 aFormatter.
Print( 0,
"\n" );
1559 if( footprints.GetCount() != 0 )
1561 aFormatter.
Print( 0,
"$FPLIST\n" );
1563 for(
unsigned i = 0; i < footprints.GetCount(); i++ )
1564 aFormatter.
Print( 0,
" %s\n",
TO_UTF8( footprints[i] ) );
1566 aFormatter.
Print( 0,
"$ENDFPLIST\n" );
1575 aFormatter.
Print( 0,
"DRAW\n" );
1579 switch( item.Type() )
1611 aFormatter.
Print( 0,
"ENDDRAW\n" );
1614 aFormatter.
Print( 0,
"ENDDEF\n" );
1628 aFormatter.
Print( 0,
"A %d %d %d %d %d %d %d %d %c %d %d %d %d\n",
1649 aFormatter.
Print( 0,
"B 4 %d %d %d",
1654 aFormatter.
Print( 0,
" %d %d %d %d %d %d %d %d",
1672 aFormatter.
Print( 0,
"C %d %d %d %d %d %d %c\n",
1686 wxCHECK_RET( aField && aField->
Type() ==
SCH_FIELD_T,
"Invalid SCH_FIELD object." );
1688 int hjustify, vjustify;
1705 aFormatter.
Print( 0,
"F%d %s %d %d %d %c %c %c %c%c%c",
1715 aField->
IsBold() ?
'B' :
'N' );
1720 && !aField->
GetName().IsEmpty()
1726 aFormatter.
Print( 0,
"\n" );
1732 wxCHECK_RET( aPin && aPin->
Type() ==
SCH_PIN_T,
"Invalid SCH_PIN object." );
1752 if( !aPin->
GetName().IsEmpty() )
1755 aFormatter.
Print( 0,
"X ~" );
1757 int pin_orient =
'L';
1768 aFormatter.
Print( 0,
" %s %d %d %d %c %d %d %d %d %c",
1781 aFormatter.
Print( 0,
" " );
1784 aFormatter.
Print( 0,
"N" );
1797 default: wxFAIL_MSG(
"Invalid pin shape" );
1800 aFormatter.
Print( 0,
"\n" );
1811 aFormatter.
Print( 0,
"P %d %d %d %d",
1828 "Invalid RECT object." );
1830 aFormatter.
Print( 0,
"S %d %d %d %d %d %d %d %c\n",
1844 wxCHECK_RET( aText && aText->
Type() ==
SCH_TEXT_T,
"Invalid SCH_TEXT object." );
1848 if(
text.Contains( wxT(
" " ) ) ||
text.Contains( wxT(
"~" ) ) ||
text.Contains( wxT(
"\"" ) ) )
1851 text.Replace( wxT(
"\"" ), wxT(
"''" ) );
1852 text = wxT(
"\"" ) +
text + wxT(
"\"" );
1855 aFormatter.
Print( 0,
"T %d %d %d %d %d %d %d %s",
1865 aFormatter.
Print( 0,
" %s %d", aText->
IsItalic() ?
"Italic" :
"Normal", aText->
IsBold() );
1867 char hjustify =
'C';
1874 char vjustify =
'C';
1881 aFormatter.
Print( 0,
" %c %c\n", hjustify, vjustify );
1902 wxString description = it->second->GetDescription();
1903 wxString keyWords = it->second->GetKeyWords();
1904 wxString docFileName = it->second->GetDatasheetField().GetText();
1906 if( description.IsEmpty() && keyWords.IsEmpty() && docFileName.IsEmpty() )
1909 formatter.
Print( 0,
"#\n$CMP %s\n",
TO_UTF8( it->second->GetName() ) );
1911 if( !description.IsEmpty() )
1912 formatter.
Print( 0,
"D %s\n",
TO_UTF8( description ) );
1914 if( !keyWords.IsEmpty() )
1917 if( !docFileName.IsEmpty() )
1918 formatter.
Print( 0,
"F %s\n",
TO_UTF8( docFileName ) );
1920 formatter.
Print( 0,
"$ENDCMP\n" );
1923 formatter.
Print( 0,
"#\n#End Doc Library\n" );
1929 LIB_SYMBOL_MAP::iterator it =
m_symbols.find( aSymbolName );
1932 THROW_IO_ERROR( wxString::Format(
_(
"library %s does not contain a symbol named %s" ),
1944 LIB_SYMBOL_MAP::iterator it1 =
m_symbols.begin();
1948 if( it1->second->IsDerived()
1949 && 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
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
long long TimestampDir(const wxString &aDirPath, const wxString &aFilespec)
A copy of ConvertFileTimeToWx() because wxWidgets left it as a static function private to src/common/...
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.