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.