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)
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)
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)
VECTOR2I GetArcMid() const
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.