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 );
933 const char* line = aReader.
Line();
935 wxCHECK_MSG(
strCompare(
"C", line, &line ),
nullptr,
"Invalid circle definition" );
954 circle->SetStroke( stroke );
964 int aMajorVersion,
int aMinorVersion )
966 const char* line = aReader.
Line();
968 wxCHECK_MSG(
strCompare(
"T", line, &line ),
nullptr,
"Invalid SCH_TEXT definition" );
970 double angleInTenths;
978 angleInTenths =
parseInt( aReader, line, &line );
983 visible = !
parseInt( aReader, line, &line );
984 unit =
parseInt( aReader, line, &line );
985 bodyStyle =
parseInt( aReader, line, &line );
999 str.Replace(
"~",
" " );
1002 if( !str.IsEmpty() )
1005 str.Replace(
"''",
"\"" );
1020 sch_item = sch_text;
1021 eda_text = sch_text;
1038 if(
LIB_VERSION( aMajorVersion, aMinorVersion ) > 0
1044 else if( !
strCompare(
"Normal", line, &line ) )
1045 SCH_PARSE_ERROR(
"invalid eda_text stype, expected 'Normal' or 'Italic'", aReader, line );
1047 if(
parseInt( aReader, line, &line ) > 0 )
1053 switch(
parseChar( aReader, line, &line ) )
1058 default:
SCH_PARSE_ERROR(
"invalid horizontal eda_text justication; expected L, C, or R",
1062 switch(
parseChar( aReader, line, &line ) )
1067 default:
SCH_PARSE_ERROR(
"invalid vertical eda_text justication; expected T, C, or B",
1079 const char* line = aReader.
Line();
1081 wxCHECK_MSG(
strCompare(
"S", line, &line ),
nullptr,
"Invalid rectangle definition" );
1116 const char* line = aReader.
Line();
1118 wxCHECK_MSG(
strCompare(
"X", line, &line ),
nullptr,
"Invalid SCH_PIN definition" );
1125 wxString utf8Line = wxString::FromUTF8( line );
1126 wxStringTokenizer tokens( utf8Line,
" \t\r\n" );
1128 if( tokens.CountTokens() < 11 )
1131 tmp = tokens.GetNextToken();
1133 pos += tmp.size() + 1;
1135 tmp = tokens.GetNextToken();
1137 pos += tmp.size() + 1;
1142 tmp = tokens.GetNextToken();
1144 if( !tmp.ToLong( &num ) )
1150 pos += tmp.size() + 1;
1153 tmp = tokens.GetNextToken();
1155 if( !tmp.ToLong( &num ) )
1161 pos += tmp.size() + 1;
1164 tmp = tokens.GetNextToken();
1166 if( !tmp.ToLong( &num ) )
1172 pos += tmp.size() + 1;
1173 int length =
schIUScale.MilsToIU( (
int) num );
1176 tmp = tokens.GetNextToken();
1178 if( tmp.size() > 1 )
1184 pos += tmp.size() + 1;
1188 switch(
static_cast<char>( tmp[0] ) )
1197 tmp = tokens.GetNextToken();
1199 if( !tmp.ToLong( &num ) )
1205 pos += tmp.size() + 1;
1206 int numberTextSize =
schIUScale.MilsToIU( (
int) num );
1208 tmp = tokens.GetNextToken();
1210 if( !tmp.ToLong( &num ) )
1216 pos += tmp.size() + 1;
1217 int nameTextSize =
schIUScale.MilsToIU( (
int) num );
1219 tmp = tokens.GetNextToken();
1221 if( !tmp.ToLong( &num ) )
1227 pos += tmp.size() + 1;
1228 int unit = (int) num;
1230 tmp = tokens.GetNextToken();
1232 if( !tmp.ToLong( &num ) )
1238 pos += tmp.size() + 1;
1239 int bodyStyle = (int) num;
1241 tmp = tokens.GetNextToken();
1243 if( tmp.size() != 1 )
1249 pos += tmp.size() + 1;
1284 if( tokens.HasMoreTokens() )
1286 tmp = tokens.GetNextToken();
1292 LOWLEVEL_IN = 1 << 2,
1293 LOWLEVEL_OUT = 1 << 3,
1294 FALLING_EDGE = 1 << 4,
1300 for(
int j = (
int) tmp.size(); j > 0; )
1302 switch( tmp[--j].GetValue() )
1305 case 'N':
pin->SetVisible(
false );
break;
1306 case 'I': flags |=
INVERTED;
break;
1307 case 'C': flags |=
CLOCK;
break;
1308 case 'L': flags |= LOWLEVEL_IN;
break;
1309 case 'V': flags |= LOWLEVEL_OUT;
break;
1310 case 'F': flags |= FALLING_EDGE;
break;
1311 case 'X': flags |=
NONLOGIC;
break;
1330 default:
SCH_PARSE_ERROR(
"pin attributes do not define a valid pin shape", aReader, line );
1340 const char* line = aReader.
Line();
1342 wxCHECK_MSG(
strCompare(
"P", line, &line ),
nullptr,
"Invalid poly definition" );
1346 int points =
parseInt( aReader, line, &line );
1356 for(
int i = 0; i < points; i++ )
1372 const char* line = aReader.
Line();
1374 wxCHECK_MSG(
strCompare(
"B", line, &line ),
nullptr,
"Invalid Bezier definition" );
1376 int points =
parseInt( aReader, line, &line );
1378 wxCHECK_MSG( points == 4, NULL,
"Invalid Bezier curve definition" );
1419 const char* line = aReader.
Line();
1421 wxCHECK_RET(
strCompare(
"$FPLIST", line, &line ),
"Invalid footprint filter list" );
1425 wxArrayString footprintFilters;
1429 if(
strCompare(
"$ENDFPLIST", line, &line ) )
1431 aSymbol->SetFPFilters( footprintFilters );
1438 footprintFilters.Add( footprint );
1442 SCH_PARSE_ERROR(
"File ended prematurely while loading footprint filters.", aReader, line );
1450 bool doSaveDocFile = *aOpt;
1458 auto formatter = std::make_unique<FILE_OUTPUTFORMATTER>( fn.GetFullPath() );
1460 formatter->Print( 0,
"#encoding utf-8\n");
1464 if( !it->second->IsRoot() )
1470 formatter->Print( 0,
"#\n#End Library\n" );
1471 formatter->Finish();
1491 wxCHECK_RET( aSymbol && aSymbol->
IsRoot(),
"Invalid LIB_SYMBOL pointer." );
1495 wxArrayString aliasNames;
1499 for(
auto& entry : *aMap )
1504 aliasNames.Add( symbol->
GetName() );
1514 aFormatter.
Print( 0,
"DEF" );
1519 if( !reference.
GetText().IsEmpty() )
1522 aFormatter.
Print( 0,
" ~" );
1524 aFormatter.
Print( 0,
" %d %d %c %c %d %c %c\n",
1533 if( dateModified != 0 )
1535 int sec = dateModified & 63;
1536 int min = ( dateModified >> 6 ) & 63;
1537 int hour = ( dateModified >> 12 ) & 31;
1538 int day = ( dateModified >> 17 ) & 31;
1539 int mon = ( dateModified >> 22 ) & 15;
1540 int year = ( dateModified >> 26 ) + 1990;
1542 aFormatter.
Print( 0,
"Ti %d/%d/%d %d:%d:%d\n", year, mon, day, hour, min, sec );
1545 std::vector<SCH_FIELD*> orderedFields;
1549 int legacy_field_id = 0;
1552 saveField( field, legacy_field_id++, aFormatter );
1555 if( !aliasNames.IsEmpty() )
1557 aFormatter.
Print( 0,
"ALIAS" );
1559 for(
unsigned i = 0; i < aliasNames.GetCount(); i++ )
1560 aFormatter.
Print( 0,
" %s",
TO_UTF8( aliasNames[i] ) );
1562 aFormatter.
Print( 0,
"\n" );
1568 if( footprints.GetCount() != 0 )
1570 aFormatter.
Print( 0,
"$FPLIST\n" );
1572 for(
unsigned i = 0; i < footprints.GetCount(); i++ )
1573 aFormatter.
Print( 0,
" %s\n",
TO_UTF8( footprints[i] ) );
1575 aFormatter.
Print( 0,
"$ENDFPLIST\n" );
1584 aFormatter.
Print( 0,
"DRAW\n" );
1588 switch( item.Type() )
1620 aFormatter.
Print( 0,
"ENDDRAW\n" );
1623 aFormatter.
Print( 0,
"ENDDEF\n" );
1637 aFormatter.
Print( 0,
"A %d %d %d %d %d %d %d %d %c %d %d %d %d\n",
1658 aFormatter.
Print( 0,
"B 4 %d %d %d",
1663 aFormatter.
Print( 0,
" %d %d %d %d %d %d %d %d",
1681 aFormatter.
Print( 0,
"C %d %d %d %d %d %d %c\n",
1695 wxCHECK_RET( aField && aField->
Type() ==
SCH_FIELD_T,
"Invalid SCH_FIELD object." );
1697 int hjustify, vjustify;
1714 aFormatter.
Print( 0,
"F%d %s %d %d %d %c %c %c %c%c%c",
1724 aField->
IsBold() ?
'B' :
'N' );
1729 && !aField->
GetName().IsEmpty()
1735 aFormatter.
Print( 0,
"\n" );
1741 wxCHECK_RET( aPin && aPin->
Type() ==
SCH_PIN_T,
"Invalid SCH_PIN object." );
1761 if( !aPin->
GetName().IsEmpty() )
1764 aFormatter.
Print( 0,
"X ~" );
1766 int pin_orient =
'L';
1777 aFormatter.
Print( 0,
" %s %d %d %d %c %d %d %d %d %c",
1790 aFormatter.
Print( 0,
" " );
1793 aFormatter.
Print( 0,
"N" );
1806 default: wxFAIL_MSG(
"Invalid pin shape" );
1809 aFormatter.
Print( 0,
"\n" );
1820 aFormatter.
Print( 0,
"P %d %d %d %d",
1837 "Invalid RECT object." );
1839 aFormatter.
Print( 0,
"S %d %d %d %d %d %d %d %c\n",
1853 wxCHECK_RET( aText && aText->
Type() ==
SCH_TEXT_T,
"Invalid SCH_TEXT object." );
1857 if(
text.Contains( wxT(
" " ) ) ||
text.Contains( wxT(
"~" ) ) ||
text.Contains( wxT(
"\"" ) ) )
1860 text.Replace( wxT(
"\"" ), wxT(
"''" ) );
1861 text = wxT(
"\"" ) +
text + wxT(
"\"" );
1864 aFormatter.
Print( 0,
"T %d %d %d %d %d %d %d %s",
1874 aFormatter.
Print( 0,
" %s %d", aText->
IsItalic() ?
"Italic" :
"Normal", aText->
IsBold() );
1876 char hjustify =
'C';
1883 char vjustify =
'C';
1890 aFormatter.
Print( 0,
" %c %c\n", hjustify, vjustify );
1911 wxString description = it->second->GetDescription();
1912 wxString keyWords = it->second->GetKeyWords();
1913 wxString docFileName = it->second->GetDatasheetField().GetText();
1915 if( description.IsEmpty() && keyWords.IsEmpty() && docFileName.IsEmpty() )
1918 formatter.
Print( 0,
"#\n$CMP %s\n",
TO_UTF8( it->second->GetName() ) );
1920 if( !description.IsEmpty() )
1921 formatter.
Print( 0,
"D %s\n",
TO_UTF8( description ) );
1923 if( !keyWords.IsEmpty() )
1926 if( !docFileName.IsEmpty() )
1927 formatter.
Print( 0,
"F %s\n",
TO_UTF8( docFileName ) );
1929 formatter.
Print( 0,
"$ENDCMP\n" );
1932 formatter.
Print( 0,
"#\n#End Doc Library\n" );
1939 LIB_SYMBOL_MAP::iterator it =
m_symbols.find( aSymbolName );
1942 THROW_IO_ERROR( wxString::Format(
_(
"library %s does not contain a symbol named %s" ),
1954 LIB_SYMBOL_MAP::iterator it1 =
m_symbols.begin();
1958 if( it1->second->IsDerived()
1959 && 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)
virtual void SetEnd(const VECTOR2I &aEnd)
const VECTOR2I & GetBezierC2() const
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.
virtual void SetBezierC2(const VECTOR2I &aPt)
virtual void SetBezierC1(const VECTOR2I &aPt)
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.
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
void SetArcGeometry(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Set the three controlling points for an arc.
const VECTOR2I & GetBezierC1() const
virtual int GetWidth() const
void SetFillMode(FILL_T aFill)
virtual void SetStart(const VECTOR2I &aStart)
VECTOR2I GetArcMid() const
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
virtual VECTOR2I GetTextPos() const
virtual void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
virtual const wxString & GetText() const
Return the string associated with the text object.
virtual bool IsVisible() const
virtual void SetTextPos(const VECTOR2I &aPoint)
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
virtual int GetTextWidth() const
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)
virtual EDA_ANGLE GetTextAngle() const
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.