59    std::string ret = 
TO_UTF8( txt );
 
   63        if( (
unsigned char) c <= 
' ' )
 
 
   89    std::unique_ptr< LIB_SYMBOL > part;
 
 
  118        SCH_SYMBOL( aSymbol, aSel.LibId, aSheet, aSel.Unit, aSel.
Convert, aPosition, aParent )
 
  121    for( 
const auto& [fieldId, fieldValue] : aSel.
Fields )
 
  123        if( fieldId == FIELD_T::REFERENCE )
 
  124            SetRef( aSheet, fieldValue );
 
  125        else if( SCH_FIELD* field = GetField( fieldId ) )
 
  126            field->SetText( fieldValue );
 
 
  151        field.SetParent( 
this );
 
  156    for( 
const std::unique_ptr<SCH_PIN>& 
pin : aSymbol.
m_pins )
 
  158        m_pins.emplace_back( std::make_unique<SCH_PIN>( *pin ) );
 
  159        m_pins.back()->SetParent( this );
 
 
  223    const int min_grid_size = 
schIUScale.MilsToIU( 25 );
 
  225    for( 
const std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
  227        if( ( ( 
pin->GetPosition().x - 
m_pos.x ) % min_grid_size ) != 0 )
 
  230        if( ( ( 
pin->GetPosition().y - 
m_pos.y ) % min_grid_size ) != 0 )
 
 
  255    wxCHECK2( !aLibSymbol || aLibSymbol->
IsRoot(), aLibSymbol = 
nullptr );
 
  257    m_part.reset( aLibSymbol );
 
  262        pin->SetLibPin( 
nullptr );
 
 
  271        return m_part->GetDescription();
 
  273    return wxEmptyString;
 
 
  280        return m_part->GetShownDescription( aDepth );
 
  282    return wxEmptyString;
 
 
  289        return m_part->GetKeyWords();
 
  291    return wxEmptyString;
 
 
  298        return m_part->GetShownKeyWords( aDepth );
 
  300    return wxEmptyString;
 
 
  307        return m_part->GetDatasheetField().GetText();
 
  309    return wxEmptyString;
 
 
  315    std::map<wxString, wxString>            altPinMap;
 
  316    std::map<wxString, SCH_PIN::ALT>        altPinDefs;
 
  317    std::map<wxString, std::set<SCH_PIN*>>  pinUuidMap;
 
  318    std::set<SCH_PIN*>                      unassignedSchPins;
 
  319    std::set<SCH_PIN*>                      unassignedLibPins;
 
  321    for( 
const std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
  323        pinUuidMap[ 
pin->GetNumber() ].insert( 
pin.get() );
 
  325        unassignedSchPins.insert( 
pin.get() );
 
  327        if( !
pin->GetAlt().IsEmpty() )
 
  329            altPinMap[ 
pin->GetNumber() ] = 
pin->GetAlt();
 
  330            auto altDefIt = 
pin->GetAlternates().find( 
pin->GetAlt() );
 
  332            if( altDefIt != 
pin->GetAlternates().end() )
 
  333                altPinDefs[ 
pin->GetNumber() ] = altDefIt->second;
 
  336        pin->SetLibPin( 
nullptr );
 
  353        auto ii = pinUuidMap.find( libPin->GetNumber() );
 
  355        if( ii == pinUuidMap.end() || ii->second.empty() )
 
  357            unassignedLibPins.insert( libPin );
 
  361        auto it = ii->second.begin();
 
  363        ii->second.erase( it );
 
  364        pin->GetAlternates() = libPin->GetAlternates();
 
  365        pin->SetLibPin( libPin );
 
  366        pin->SetPosition( libPin->GetPosition() );
 
  367        pin->SetUnit( libPin->GetUnit() );
 
  368        pin->SetBodyStyle( libPin->GetBodyStyle() );
 
  370        unassignedSchPins.erase( 
pin );
 
  372        auto iii = altPinMap.find( libPin->GetNumber() );
 
  374        if( iii != altPinMap.end() )
 
  376            wxString altName = iii->second;
 
  378            if( 
pin->GetAlternates().find( altName ) == 
pin->GetAlternates().end() )
 
  380                auto defIt = altPinDefs.find( libPin->GetNumber() );
 
  382                if( defIt != altPinDefs.end() )
 
  384                    for( 
const auto& [ 
name, alt ] : 
pin->GetAlternates() )
 
  386                        if( alt.m_Shape == defIt->second.m_Shape && alt.m_Type == defIt->second.m_Type )
 
  395            pin->SetAlt( altName );
 
  402    for( 
SCH_PIN* libPin : unassignedLibPins )
 
  407        if( !unassignedSchPins.empty() )
 
  409            auto it = unassignedSchPins.begin();
 
  411            unassignedSchPins.erase( it );
 
  416            pin = 
m_pins.emplace_back( std::make_unique<SCH_PIN>( 
SCH_PIN( 
this, libPin ) ) ).get();
 
  420        pin->GetAlternates() = libPin->GetAlternates();
 
  421        pin->SetLibPin( libPin );
 
  422        pin->SetPosition( libPin->GetPosition() );
 
  423        pin->SetUnit( libPin->GetUnit() );
 
  424        pin->SetBodyStyle( libPin->GetBodyStyle() );
 
  425        pin->SetNumber( libPin->GetNumber() );
 
  427        auto iii = altPinMap.find( libPin->GetNumber() );
 
  429        if( iii != altPinMap.end() )
 
  431            wxString altName = iii->second;
 
  433            if( 
pin->GetAlternates().find( altName ) == 
pin->GetAlternates().end() )
 
  435                auto defIt = altPinDefs.find( libPin->GetNumber() );
 
  437                if( defIt != altPinDefs.end() )
 
  439                    for( 
const auto& [ 
name, alt ] : 
pin->GetAlternates() )
 
  441                        if( alt.m_Shape == defIt->second.m_Shape && alt.m_Type == defIt->second.m_Type )
 
  450            pin->SetAlt( altName );
 
  455    for( 
auto it1 = 
m_pins.begin(); it1 != 
m_pins.end() && !unassignedSchPins.empty(); )
 
  457        auto it2 = unassignedSchPins.find( it1->get() );
 
  459        if( it2 != unassignedSchPins.end() )
 
  461            it1 = 
m_pins.erase( it1 );
 
  462            unassignedSchPins.erase( it2 );
 
  473        for( std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
 
  495        return m_part->GetUnitCount();
 
 
  504        return m_part->GetBodyStyleCount();
 
 
  513        return m_part->HasDeMorganBodyStyles();
 
 
  522        return m_part->GetUnitDisplayName( aUnit, aLabel );
 
  524        return wxString::Format( 
_( 
"Unit %s" ), 
SubReference( aUnit ) );
 
 
  533        return m_part->GetBodyStyleDescription( aBodyStyle, aLabel );
 
 
  540                              bool aTestFromEnd )
 const 
  546            if( instance.m_Path == aSheetPath )
 
  548                aInstance = instance;
 
  552        else if( instance.m_Path.EndsWith( aSheetPath ) )
 
  554            aInstance = instance;
 
 
  579                                                 "    reference %s, unit %d from symbol %s." ),
 
 
  636               "GetRef for symbol %s on path %s (sheet path has %zu sheets)",
 
  645                   instance.m_Path.AsString(), instance.m_Reference );
 
  647        if( instance.m_Path == 
path )
 
  649            ref = instance.m_Reference;
 
  663        wxLogTrace( 
traceSchSymbolRef, 
"  Using fallback from REFERENCE field: %s", ref );
 
 
  698        if( instance.m_Path == 
path )
 
  701            instance.m_Reference = ref;
 
  709    for( std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
  710        pin->ClearDefaultNetName( sheet );
 
 
  732        if( instance.m_Path == 
path )
 
  733            return !instance.m_Reference.IsEmpty() && instance.m_Reference.Last() != 
'?';
 
 
  744    refDesignator.Replace( 
"~", 
" " );
 
  746    wxString prefix = refDesignator;
 
  748    while( prefix.Length() )
 
  750        wxUniCharRef last = prefix.Last();
 
  752        if( ( last >= 
'0' && last <= 
'9' ) || last == 
'?' || last == 
'*' )
 
  760    prefix.Trim( 
false );
 
  762    if( !prefix.IsEmpty() )
 
 
  770        return schematic->Settings().SubReference( aUnit, aAddSeparator );
 
 
  782        if( instance.m_Path == 
path )
 
  783            return instance.m_Unit;
 
 
  799        if( instance.m_Path == 
path )
 
  801            instance.m_Unit = aUnitSelection;
 
 
  822                 wxString::Format( wxS( 
"Cannot get DNP attribute for invalid sheet path '%s'." ),
 
  825    if( aVariantName.IsEmpty() )
 
  827        instance.
m_DNP = aEnable;
 
  834        if( instance.
m_Variants.contains( aVariantName ) )
 
  836            instance.
m_Variants[aVariantName].m_DNP = aEnable;
 
  843            variant.
m_DNP = aEnable;
 
 
  858                 wxString::Format( wxS( 
"Cannot get DNP attribute for invalid sheet path '%s'." ),
 
  861    if( aVariantName.IsEmpty() )
 
  870        wxCHECK_MSG( instance.
m_Variants.contains( aVariantName ), 
false,
 
  871                     wxString::Format( wxS( 
"Cannot get DNP attribute for invalid sheet path '%s' for variant '%s'." ),
 
  874        return instance.
m_Variants[aVariantName].m_DNP;
 
 
  881    for( 
const wxString& variantName : aVariantNames )
 
  882        SetDNP( aEnable, &aInstance, variantName );
 
 
  887                                     const wxString& aVariantName )
 
  898                 wxString::Format( wxS( 
"Cannot get DNP attribute for invalid sheet path '%s'." ),
 
  901    if( aVariantName.IsEmpty() )
 
  910        if( instance.
m_Variants.contains( aVariantName ) )
 
  912            instance.
m_Variants[aVariantName].m_ExcludedFromBOM = aEnable;
 
 
  934                 wxString::Format( wxS( 
"Cannot get DNP attribute for invalid sheet path '%s'." ),
 
  937    if( aVariantName.IsEmpty() )
 
  945        wxCHECK_MSG( instance.
m_Variants.contains( aVariantName ), 
false,
 
  946                     wxString::Format( wxS( 
"Cannot get DNP attribute for invalid sheet path '%s' variant '%s'." ),
 
  949        return instance.
m_Variants[aVariantName].m_ExcludedFromBOM;
 
 
  955                                     const std::vector<wxString>& aVariantNames )
 
  957    for( 
const wxString& variantName : aVariantNames )
 
 
  973                 wxString::Format( wxS( 
"Cannot get DNP attribute for invalid sheet path '%s'." ),
 
  976    if( aVariantName.IsEmpty() )
 
  985        if( instance.
m_Variants.contains( aVariantName ) )
 
  987            instance.
m_Variants[aVariantName].m_ExcludedFromSim = aEnable;
 
 
 1009                 wxString::Format( wxS( 
"Cannot get DNP attribute for invalid sheet path '%s'." ),
 
 1012    if( aVariantName.IsEmpty() )
 
 1020        wxCHECK_MSG( instance.
m_Variants.contains( aVariantName ), 
false,
 
 1021                     wxString::Format( wxS( 
"Cannot get DNP attribute for invalid sheet path '%s' variant '%s'." ),
 
 1024        return instance.
m_Variants[aVariantName].m_ExcludedFromSim;
 
 
 1030                                     const std::vector<wxString>& aVariantNames )
 
 1032    for( 
const wxString& variantName : aVariantNames )
 
 
 1040        instance.m_Unit = aUnitSelection;
 
 
 1045                                     bool aAllowExtraText )
 const 
 
 1061                                                  bool aAllowExtraText )
 const 
 
 1081    m_fields.emplace_back( 
this, aFieldType );
 
 
 1110            if( !field.IsVisible() || field.GetText().IsEmpty() )
 
 1114        aVector.push_back( 
const_cast<SCH_FIELD*
>( &field ) );
 
 1117    std::sort( aVector.begin(), aVector.end(),
 
 1120                   return lhs->GetOrdinal() < rhs->GetOrdinal();
 
 
 1140    for( 
unsigned ii = 0; ii < 
m_fields.size(); ++ii )
 
 1145        if( aFieldName == 
m_fields[ii].GetName( 
false ) )
 
 
 1158        if( field.GetName().IsSameAs( aFieldName, 
false ) )
 
 
 1167                               bool aUpdateOtherFields, 
bool aResetRef, 
bool aResetOtherFields )
 
 1171        std::vector<SCH_FIELD*> fields;
 
 1172        m_part->GetFields( fields );
 
 1174        for( 
const SCH_FIELD* libField : fields )
 
 1179            if( libField->IsMandatory() )
 
 1181                fieldType = libField->GetId();
 
 1186                schField = 
GetField( libField->GetCanonicalName() );
 
 1196            schField->
SetPrivate( libField->IsPrivate() );
 
 1208                else if( aUpdateRef )
 
 1209                    SetRef( aPath, libField->GetText() );
 
 1217                if( aResetOtherFields )
 
 1219                else if( aUpdateOtherFields )
 
 1220                    schField->
SetText( libField->GetText() );
 
 1224                if( aResetOtherFields || aUpdateOtherFields )
 
 1225                    schField->
SetText( libField->GetText() );
 
 
 1235    bool updateValue = 
true;
 
 1236    bool updateExclFromBOM = 
true;
 
 1237    bool updateExclFromBoard = 
true;
 
 1238    bool updateDNP = 
true;
 
 1239    bool updateOtherFields = 
true;
 
 1240    bool updatePins = 
true;
 
 1244        updateValue = aProperty->
Name() == 
_HKI( 
"Value" );
 
 1245        updateExclFromBoard = aProperty->
Name() == 
_HKI( 
"Exclude From Board" );
 
 1246        updateExclFromBOM = aProperty->
Name() == 
_HKI( 
"Exclude From Bill of Materials" );
 
 1247        updateDNP = aProperty->
Name() == 
_HKI( 
"Do not Populate" );
 
 1248        updateOtherFields = 
false;
 
 1253            && !updateExclFromBOM
 
 1254            && !updateExclFromBoard
 
 1256            && !updateOtherFields
 
 1266        wxString ref = 
GetRef( &aSourceSheet );
 
 1271            std::vector<SCH_SYMBOL*> otherUnits;
 
 1277                aCommit.
Modify( otherUnit, screen );
 
 1282                if( updateOtherFields )
 
 1294                        if( field.IsMandatory() )
 
 1295                            otherField = otherUnit->GetField( field.GetId() );
 
 1297                            otherField = otherUnit->GetField( field.GetName() );
 
 1301                            otherField->
SetText( field.GetText() );
 
 1309                            newField.
Offset( otherUnit->GetPosition() );
 
 1312                            otherUnit->AddField( newField );
 
 1316                    for( 
int ii = (
int) otherUnit->GetFields().size() - 1; ii >= 0; ii-- )
 
 1318                        SCH_FIELD& otherField = otherUnit->GetFields()[ii];
 
 1321                            otherUnit->GetFields().erase( otherUnit->GetFields().begin() + ii );
 
 1325                if( updateExclFromBOM )
 
 1328                if( updateExclFromBoard )
 
 1332                    otherUnit->SetDNP( 
GetDNP( &aSourceSheet ), &sheet );
 
 1336                    for( 
const std::unique_ptr<SCH_PIN>& model_pin : 
m_pins )
 
 1338                        SCH_PIN* src_pin = otherUnit->GetPin( model_pin->GetNumber() );
 
 1341                            src_pin->
SetAlt( model_pin->GetAlt() );
 
 
 1352    for( 
const std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
 1353        aFunction( 
pin.get() );
 
 1356        aFunction( &field );
 
 
 1362    for( 
const std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
 1364        if( 
pin->GetNumber() == aNumber )
 
 
 1374    for( 
const std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
 1376        int pin_unit      = 
pin->GetLibPin() ? 
pin->GetLibPin()->GetUnit()
 
 1378        int pin_bodyStyle = 
pin->GetLibPin() ? 
pin->GetLibPin()->GetBodyStyle()
 
 1381        if( pin_unit > 0 && pin_unit != 
GetUnit() )
 
 1384        if( pin_bodyStyle > 0 && pin_bodyStyle != 
GetBodyStyle() )
 
 1387        if( 
pin->GetPosition() == aPos )
 
 
 1400    return std::vector<SCH_PIN*>();
 
 
 1407        return m_part->GetPins();
 
 1409    return std::vector<SCH_PIN*>();
 
 
 1421    auto it = 
m_pinMap.find( aLibPin );
 
 1426    wxFAIL_MSG_AT( 
"Pin not found", __FILE__, __LINE__, __FUNCTION__ );
 
 
 1433    std::vector<SCH_PIN*> pins;
 
 1442    for( 
const std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
 1444        if( unit && 
pin->GetUnit() && 
pin->GetUnit() != unit )
 
 1447        pins.push_back( 
pin.get() );
 
 
 1463                 wxT( 
"Cannot swap data with invalid symbol." ) );
 
 1471    for( std::unique_ptr<SCH_PIN>& 
pin : symbol->
m_pins )
 
 1472        pin->SetParent( symbol );
 
 1474    for( std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
 1475        pin->SetParent( 
this );
 
 1480    m_part.reset( libSymbol );
 
 
 1514        if( field.IsPrivate() )
 
 1517        if( field.IsMandatory() )
 
 1518            aVars->push_back( field.GetCanonicalName().Upper() );
 
 1520            aVars->push_back( field.GetName() );
 
 1523    aVars->push_back( wxT( 
"OP" ) );
 
 1524    aVars->push_back( wxT( 
"FOOTPRINT_LIBRARY" ) );
 
 1525    aVars->push_back( wxT( 
"FOOTPRINT_NAME" ) );
 
 1526    aVars->push_back( wxT( 
"UNIT" ) );
 
 1527    aVars->push_back( wxT( 
"SHORT_REFERENCE" ) );
 
 1528    aVars->push_back( wxT( 
"SYMBOL_LIBRARY" ) );
 
 1529    aVars->push_back( wxT( 
"SYMBOL_NAME" ) );
 
 1530    aVars->push_back( wxT( 
"SYMBOL_DESCRIPTION" ) );
 
 1531    aVars->push_back( wxT( 
"SYMBOL_KEYWORDS" ) );
 
 1532    aVars->push_back( wxT( 
"EXCLUDE_FROM_BOM" ) );
 
 1533    aVars->push_back( wxT( 
"EXCLUDE_FROM_BOARD" ) );
 
 1534    aVars->push_back( wxT( 
"EXCLUDE_FROM_SIM" ) );
 
 1535    aVars->push_back( wxT( 
"DNP" ) );
 
 1536    aVars->push_back( wxT( 
"SHORT_NET_NAME(<pin_number>)" ) );
 
 1537    aVars->push_back( wxT( 
"NET_NAME(<pin_number>)" ) );
 
 1538    aVars->push_back( wxT( 
"NET_CLASS(<pin_number>)" ) );
 
 1539    aVars->push_back( wxT( 
"PIN_NAME(<pin_number>)" ) );
 
 
 1545    static wxRegEx operatingPoint( wxT( 
"^" 
 1552    wxCHECK( aPath, 
false );
 
 1559    if( operatingPoint.Matches( *token ) )
 
 1561        wxString 
pin( operatingPoint.GetMatch( *token, 1 ).Lower() );
 
 1562        wxString precisionStr( operatingPoint.GetMatch( *token, 3 ) );
 
 1563        wxString rangeStr( operatingPoint.GetMatch( *token, 4 ) );
 
 1565        int      precision = precisionStr.IsEmpty() ? 3 : precisionStr[0] - 
'0';
 
 1566        wxString range = rangeStr.IsEmpty() ? wxString( wxS( 
"~A" ) ) : rangeStr;
 
 1570        std::vector<EMBEDDED_FILES*> embeddedFilesStack;
 
 1574            embeddedFilesStack.push_back( 
m_part->GetEmbeddedFiles() );
 
 1580                                                     true, aDepth + 1, devnull ).model;
 
 1585        spiceRef = spiceRef.Lower();
 
 1592        else if( 
pin == wxS( 
":power" ) )
 
 1594            if( rangeStr.IsEmpty() )
 
 1595                range = wxS( 
"~W" );
 
 1597            *token = schematic->
GetOperatingPoint( spiceRef + wxS( 
":power" ), precision, range );
 
 1602            pin = 
pin.SubString( 1, -1 );   
 
 1604            for( 
const std::reference_wrapper<const SIM_MODEL_PIN>& modelPin : model.
GetPins() )
 
 1606                SCH_PIN* symbolPin = 
GetPin( modelPin.get().symbolPinNumber );
 
 1610                    if( model.
GetPins().size() == 2 )
 
 1616                        wxString signalName = spiceRef + wxS( 
":" ) + modelPin.get().modelPinName;
 
 1625        *token = wxS( 
"?" );
 
 1629    if( token->Contains( 
':' ) )
 
 1637        wxString fieldName = field.IsMandatory() ? field.GetCanonicalName()
 
 1640        wxString textToken = field.GetText();
 
 1641        textToken.Replace( 
" ", wxEmptyString );
 
 1642        wxString tokenString = 
"${" + fieldName + 
"}";
 
 1645        if( textToken.IsSameAs( tokenString, 
false ) )
 
 1648        if( token->IsSameAs( fieldName, 
false ) )
 
 1651                *token = 
GetRef( aPath, 
true );
 
 1653                *token = field.GetShownText( aPath, 
false, aDepth + 1 );
 
 1660    if( token->IsSameAs( wxT( 
"SIM.DEVICE" ) )
 
 1661            || token->IsSameAs( wxT( 
"SIM.TYPE" ) )
 
 1662            || token->IsSameAs( wxT( 
"SIM.PINS" ) )
 
 1663            || token->IsSameAs( wxT( 
"SIM.PARAMS" ) )
 
 1664            || token->IsSameAs( wxT( 
"SIM.LIBRARY" ) )
 
 1665            || token->IsSameAs( wxT( 
"SIM.NAME" ) ) )
 
 1667        *token = wxEmptyString;
 
 1674        if( token->IsSameAs( templateFieldname.m_Name )
 
 1675            || token->IsSameAs( templateFieldname.m_Name.Upper() ) )
 
 1679            *token = wxEmptyString;
 
 1684    if( token->IsSameAs( wxT( 
"FOOTPRINT_LIBRARY" ) ) )
 
 1688        wxArrayString parts = wxSplit( footprint, 
':' );
 
 1690        if( parts.Count() > 0 )
 
 1691            *token = parts[ 0 ];
 
 1693            *token = wxEmptyString;
 
 1697    else if( token->IsSameAs( wxT( 
"FOOTPRINT_NAME" ) ) )
 
 1701        wxArrayString parts = wxSplit( footprint, 
':' );
 
 1703        if( parts.Count() > 1 )
 
 1704            *token = parts[ std::min( 1, (
int) parts.size() - 1 ) ];
 
 1706            *token = wxEmptyString;
 
 1710    else if( token->IsSameAs( wxT( 
"UNIT" ) ) )
 
 1715    else if( token->IsSameAs( wxT( 
"SHORT_REFERENCE" ) ) )
 
 1717        *token = 
GetRef( aPath, 
false );
 
 1720    else if( token->IsSameAs( wxT( 
"SYMBOL_LIBRARY" ) ) )
 
 1722        *token = 
m_lib_id.GetUniStringLibNickname();
 
 1725    else if( token->IsSameAs( wxT( 
"SYMBOL_NAME" ) ) )
 
 1727        *token = 
m_lib_id.GetUniStringLibItemName();
 
 1730    else if( token->IsSameAs( wxT( 
"SYMBOL_DESCRIPTION" ) ) )
 
 1735    else if( token->IsSameAs( wxT( 
"SYMBOL_KEYWORDS" ) ) )
 
 1740    else if( token->IsSameAs( wxT( 
"EXCLUDE_FROM_BOM" ) ) )
 
 1742        *token = wxEmptyString;
 
 1745            *token = 
_( 
"Excluded from BOM" );
 
 1749    else if( token->IsSameAs( wxT( 
"EXCLUDE_FROM_BOARD" ) ) )
 
 1751        *token = wxEmptyString;
 
 1754            *token = 
_( 
"Excluded from board" );
 
 1758    else if( token->IsSameAs( wxT( 
"EXCLUDE_FROM_SIM" ) ) )
 
 1760        *token = wxEmptyString;
 
 1763            *token = 
_( 
"Excluded from simulation" );
 
 1767    else if( token->IsSameAs( wxT( 
"DNP" ) ) )
 
 1769        *token = wxEmptyString;
 
 1771        if( aPath->
GetDNP() || this->ResolveDNP() )
 
 1772            *token = 
_( 
"DNP" );
 
 1776    else if( token->StartsWith( wxT( 
"SHORT_NET_NAME(" ) )
 
 1777                 || token->StartsWith( wxT( 
"NET_NAME(" ) )
 
 1778                 || token->StartsWith( wxT( 
"NET_CLASS(" ) )
 
 1779                 || token->StartsWith( wxT( 
"PIN_NAME(" ) ) )
 
 1781        wxString pinNumber = token->AfterFirst( 
'(' );
 
 1782        pinNumber = pinNumber.BeforeLast( 
')' );
 
 1786            if( 
pin->GetNumber() == pinNumber )
 
 1788                if( token->StartsWith( wxT( 
"PIN_NAME" ) ) )
 
 1790                    *token = 
pin->GetAlt().IsEmpty() ? 
pin->GetName() : 
pin->GetAlt();
 
 1797                    *token = wxEmptyString;
 
 1798                else if( token->StartsWith( wxT( 
"SHORT_NET_NAME" ) ) )
 
 1800                else if( token->StartsWith( wxT( 
"NET_NAME" ) ) )
 
 1801                    *token = conn->
Name();
 
 1802                else if( token->StartsWith( wxT( 
"NET_CLASS" ) ) )
 
 1803                    *token = 
pin->GetEffectiveNetClass( aPath )->GetName();
 
 
 1826            if( instance.m_Path == 
path )
 
 1828                if( instance.m_Reference.IsEmpty() || aResetPrefix )
 
 1839            if( instance.m_Reference.IsEmpty() || aResetPrefix)
 
 1846    for( std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
 1847        pin->ClearDefaultNetName( aSheetPath );
 
 1855    if( currentReference.IsEmpty() || aResetPrefix )
 
 
 1865    wxCHECK( aSheetPath.size() > 0, 
false );
 
 1870        if( instance.m_Path == aSheetPath )
 
 
 1883    bool transform = 
false;
 
 1885    switch( aOrientation )
 
 2006        wxFAIL_MSG( 
"Invalid schematic symbol orientation type." );
 
 
 2042    int rotate_values[] =
 
 2063    for( 
int type_rotate : rotate_values )
 
 2075    wxFAIL_MSG( 
"Schematic symbol orientation matrix internal error." );
 
 
 2083void SCH_SYMBOL::Show( 
int nestLevel, std::ostream& os )
 const 
 2086    NestedSpace( nestLevel, os ) << 
'<' << 
GetClass().Lower().mb_str()
 
 2088                                 << 
'"' << 
" chipName=\"" 
 2094    for( 
int i = 1; i < (int) 
GetFields().size();  ++i )
 
 2096        const wxString& value = 
GetFields()[i].GetText();
 
 2098        if( !value.IsEmpty() )
 
 2100            NestedSpace( nestLevel + 1, os ) << 
"<field" << 
" name=\"" 
 2102                                             << 
'"' << 
" value=\"" 
 2103                                             << 
TO_UTF8( value ) << 
"\"/>\n";
 
 2107    NestedSpace( nestLevel, os ) << 
"</" << 
TO_UTF8( 
GetClass().Lower() ) << 
">\n";
 
 2128    if( aIncludeFields )
 
 2132            if( field.IsVisible() )
 
 2133                bBox.
Merge( field.GetBoundingBox() );
 
 
 2147    catch( 
const boost::bad_pointer& e )
 
 2149        wxFAIL_MSG( wxString::Format( wxT( 
"Boost pointer exception occurred: %s" ), e.what() ) );
 
 
 2180                    msgs.Add( 
_( 
"Simulation" ) );
 
 2183                    msgs.Add( 
_( 
"BOM" ) );
 
 2186                    msgs.Add( 
_( 
"Board" ) );
 
 2188                if( 
GetDNP( currentSheet ) )
 
 2189                    msgs.Add( 
_( 
"DNP" ) );
 
 2191                msg = wxJoin( msgs, 
'|' );
 
 2192                msg.Replace( 
'|', wxS( 
", " ) );
 
 2195                    aList.emplace_back( 
_( 
"Exclude from" ), msg );
 
 2206                aList.emplace_back( 
_( 
"Power symbol" ),
 
 2211                aList.emplace_back( 
_( 
"Reference" ),
 
 2215                aList.emplace_back( 
_( 
"Value" ),
 
 2218                aList.emplace_back( 
_( 
"Name" ),
 
 2224            aList.emplace_back( 
_( 
"flags" ), wxString::Format( 
"%X", 
GetEditFlags() ) );
 
 2229                msg = 
_( 
"Missing parent" );
 
 2231                std::shared_ptr< LIB_SYMBOL > parent = 
m_part->GetParent().lock();
 
 2238            else if( !
m_lib_id.GetLibNickname().empty() )
 
 2240                aList.emplace_back( 
_( 
"Library" ), 
m_lib_id.GetLibNickname() );
 
 2244                aList.emplace_back( 
_( 
"Library" ), 
_( 
"Undefined!!!" ) );
 
 2252                msg = 
_( 
"<Unknown>" );
 
 2254            aList.emplace_back( 
_( 
"Footprint" ), msg );
 
 2257            aList.emplace_back( 
_( 
"Description" ) + wxT( 
": " )
 
 2259                                _( 
"Keywords" ) + wxT( 
": " ) + 
m_part->GetKeyWords() );
 
 2264        aList.emplace_back( 
_( 
"Reference" ), 
GetRef( currentSheet ) );
 
 2267        aList.emplace_back( 
_( 
"Value" ),
 
 2270        aList.emplace_back( 
_( 
"Name" ),
 
 2275        if( libNickname.empty() )
 
 2276            msg = 
_( 
"No library defined!" );
 
 2278            msg.Printf( 
_( 
"Symbol not found in %s!" ), libNickname );
 
 2280        aList.emplace_back( 
_( 
"Library" ), msg );
 
 
 2315        field.SetTextPos( pos );
 
 
 2333        field.SetTextPos( pos );
 
 
 2352        field.SetTextPos( pos );
 
 
 2373        if( drawItem.Matches( aSearchData, aAuxData ) )
 
 
 2384    for( std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
 2392        aItemList.push_back( item );
 
 
 2398                                      std::vector<DANGLING_END_ITEM>& aItemListByPos,
 
 2401    bool changed = 
false;
 
 2403    for( std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
 2405        bool previousState = 
pin->IsDangling();
 
 2406        pin->SetIsDangling( 
true );
 
 2411        bool do_break = 
false;
 
 2413        for( 
auto it = lower; it < aItemListByPos.end() && it->GetPosition() == pos; it++ )
 
 2432                pin->SetIsDangling( 
false );
 
 2444        changed = ( changed || ( previousState != 
pin->IsDangling() ) );
 
 
 2470    wxCHECK( symbol, 
false );
 
 2476    for( 
const std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
 2478        if( 
pin->IsDangling() )
 
 2491    if( 
GetRef( aInstance ) != symbol->
GetRef( aInstance ) )
 
 2496      && ( 
GetValue( 
true, aInstance, 
false ) != symbol->
GetValue( 
true, aInstance, 
false ) ) )
 
 2502    for( 
size_t i = 0; i < 
m_pins.size(); i++ )
 
 
 2514    std::vector<VECTOR2I> retval;
 
 2516    for( 
const std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
 2520        int pin_unit      = 
pin->GetLibPin() ? 
pin->GetLibPin()->GetUnit()
 
 2522        int pin_bodyStyle = 
pin->GetLibPin() ? 
pin->GetLibPin()->GetBodyStyle()
 
 2525        if( pin_unit > 0 && pin_unit != 
GetUnit() )
 
 2528        if( pin_bodyStyle > 0 && pin_bodyStyle != 
GetBodyStyle() )
 
 
 2554    return wxString::Format( 
_( 
"Symbol %s [%s]" ),
 
 
 2561                                  const std::vector<KICAD_T>& aScanTypes )
 
 2563    for( 
KICAD_T scanType : aScanTypes )
 
 2608            for( 
const std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
 2612                int pin_unit      = 
pin->GetLibPin() ? 
pin->GetLibPin()->GetUnit()
 
 2614                int pin_bodyStyle = 
pin->GetLibPin() ? 
pin->GetLibPin()->GetBodyStyle()
 
 2617                if( pin_unit > 0 && pin_unit != 
GetUnit() )
 
 2620                if( pin_bodyStyle > 0 && pin_bodyStyle != 
GetBodyStyle() )
 
 
 2657    std::vector<SCH_FIELD*> fields, otherFields;
 
 2660    aSymbol.
GetFields( otherFields, 
false );
 
 2662    if( fields.size() != otherFields.size() )
 
 2665    for( 
int ii = 0; ii < (int) fields.size(); ii++ )
 
 2670        if( fields[ii]->GetText().Cmp( otherFields[ii]->GetText() ) != 0 )
 
 
 2680    return !( *
this == aSymbol );
 
 
 2686    wxCHECK_MSG( 
Type() == aSymbol.
Type(), *
this,
 
 2687                 wxT( 
"Cannot assign object type " ) + aSymbol.
GetClass() + wxT( 
" to type " ) +
 
 2690    if( &aSymbol != 
this )
 
 2707            field.SetParent( 
this );
 
 
 2719    bBox.
Inflate( aAccuracy / 2 );
 
 
 2735    rect.
Inflate( aAccuracy / 2 );
 
 
 2757    for( 
const std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
 2770        if( 
pin->GetLocalPosition() == new_pos )
 
 
 2785                       int aUnit, 
int aBodyStyle, 
const VECTOR2I& aOffset, 
bool aDimmed )
 
 2799        for( 
unsigned i = 0; i < tempPins.size(); ++ i )
 
 2802            SCH_PIN* tempPin = tempPins[ i ];
 
 2819                text->SetText( 
dummy.GetShownText( 
false ) );
 
 2828        for( 
bool local_background : { 
true, 
false } )
 
 2835                field.ClearRenderCache();
 
 2840                    && ( field.IsVisible() || field.IsForceVisible() ) )
 
 2855            std::vector<wxString> properties;
 
 2859                wxString text_field = field.GetShownText( sheet, 
false);
 
 2861                if( text_field.IsEmpty() )
 
 2864                properties.emplace_back( wxString::Format( wxT( 
"!%s = %s" ),
 
 2865                                                           field.GetName(), text_field ) );
 
 2868            if( !
m_part->GetKeyWords().IsEmpty() )
 
 2870                properties.emplace_back( wxString::Format( wxT( 
"!%s = %s" ),
 
 2872                                                           m_part->GetKeyWords() ) );
 
 
 2893                             std::max( bbox.
GetY() - pins.
GetY(),
 
 2897    margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
 
 2898    margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
 
 2908                            strokeWidth, 
nullptr );
 
 
 2917                                const VECTOR2D& aPos, 
double aSize, 
bool aRotate )
 
 2919    double lineWidth = aSize / 10.0;
 
 2921    std::vector<SCH_SHAPE> shapeList;
 
 2923    int tolerance = 100;    
 
 2925    for( 
const SCH_SHAPE& shape : shapeList )
 
 2931             aPlotter->
BezierCurve( shape.GetStart(), shape.GetBezierC1(), shape.GetBezierC2(), shape.GetEnd(),
 
 2932                                   tolerance, lineWidth );
 
 2934            aPlotter->
Circle( shape.getCenter(), shape.GetRadius() * 2, filled, lineWidth );
 
 
 2996        for( 
unsigned i = 0; i < tempPins.size(); ++ i )
 
 2999            SCH_PIN* tempPin = tempPins[ i ];
 
 
 3014    for( 
const std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
 3016        if( 
pin->IsBrightened() )
 
 
 3026    for( std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
 3027        pin->ClearBrightened();
 
 
 3045        m_part->SetShowPinNames( aShow );
 
 
 3058        m_part->SetShowPinNumbers( aShow );
 
 
 3064    for( 
const std::unique_ptr<SCH_PIN>& 
pin : 
m_pins )
 
 3066        int pin_unit      = 
pin->GetLibPin() ? 
pin->GetLibPin()->GetUnit()
 
 3068        int pin_bodyStyle = 
pin->GetLibPin() ? 
pin->GetLibPin()->GetBodyStyle()
 
 3071        if( pin_unit > 0 && pin_unit != 
GetUnit() )
 
 3074        if( pin_bodyStyle > 0 && pin_bodyStyle != 
GetBodyStyle() )
 
 3077        if( 
pin->IsPointClickableAnchor( aPos ) )
 
 
 3096    if( pin_list.size() != 1 )
 
 
 3114    if( pin_list.size() != 1 )
 
 
 3126    return m_part->IsLocalPower();
 
 
 3135    return m_part->IsGlobalPower();
 
 
 3147    wxCHECK( 
m_part, 
false );
 
 3149    return m_part->IsNormal();
 
 
 3155    std::unordered_set<wxString> componentClass;
 
 3157    auto getComponentClassFields =
 
 3158            [&]( 
const std::vector<SCH_FIELD>& fields )
 
 3162                    if( field.GetCanonicalName() == wxT( 
"Component Class" ) )
 
 3164                        if( field.GetShownText( aPath, 
false ) != wxEmptyString )
 
 3165                            componentClass.insert( field.GetShownText( aPath, 
false ) );
 
 3171    getComponentClassFields( 
m_fields );
 
 3178            getComponentClassFields( label->GetFields() );
 
 3182    return componentClass;
 
 
 3187                                                          const wxString& aVariantName )
 const 
 3192        return std::nullopt;
 
 3194    return instance.
m_Variants.find( aVariantName )->second;
 
 
 3206    instance.
m_Variants.emplace( std::make_pair( aVariant.
m_Name, aVariant ) );
 
 
 3250    for( 
unsigned i = 0; i < 
m_pins.size(); ++i )
 
 
 3278                                           double aSize, 
double aLineWidth, 
bool aHorizontal )
 
 3282    double x_right = aSize / 1.6180339887;
 
 3283    double x_middle = x_right / 2.0;
 
 3296    aShapeList.back().SetStart( bottomPt );
 
 3297    aShapeList.back().SetBezierC1( bottomAnchorPt );
 
 3298    aShapeList.back().SetBezierC2( leftSideAnchorPt1 );
 
 3299    aShapeList.back().SetEnd( leftPt );
 
 3303    aShapeList.back().SetStart( leftPt );
 
 3304    aShapeList.back().SetBezierC1( leftSideAnchorPt2 );
 
 3305    aShapeList.back().SetBezierC2( rightSideAnchorPt2 );
 
 3306    aShapeList.back().SetEnd( rightPt );
 
 3309    aShapeList.back().SetStart( rightPt );
 
 3310    aShapeList.back().SetBezierC1( rightSideAnchorPt1 );
 
 3311    aShapeList.back().SetBezierC2( bottomAnchorPt );
 
 3312    aShapeList.back().SetEnd( bottomPt );
 
 3315    aShapeList.back().SetCenter( ( leftPt + rightPt ) / 2.0 );
 
 3316    aShapeList.back().SetRadius( aSize / 15.0 );
 
 3321            shape.Rotate( 
VECTOR2I( 0, 0), 
true );
 
 
 3360                        return symbol->GetLibSymbolRef() != 
nullptr;
 
 3373        const wxString groupFields = 
_HKI( 
"Fields" );
 
 3395                        return symbol->IsMultiUnit();
 
 3400        auto multiBodyStyle =
 
 3404                        return symbol->IsMultiBodyStyle();
 
 3414                                     wxPGChoices choices;
 
 3418                                         for( 
int ii = 1; ii <= symbol->GetUnitCount(); ii++ )
 
 3419                                             choices.Add( symbol->GetUnitDisplayName( ii, 
false ), ii );
 
 3430                                     wxPGChoices choices;
 
 3434                                         for( 
int ii = 1; ii <= symbol->GetBodyStyleCount(); ii++ )
 
 3435                                             choices.Add( symbol->GetBodyStyleDescription( ii, 
false ) );
 
 3441        const wxString groupAttributes = 
_HKI( 
"Attributes" );
 
 
 
constexpr EDA_IU_SCALE schIUScale
 
BITMAPS
A list of all bitmap identifiers.
 
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
 
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
 
constexpr const Vec GetEnd() const
 
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
 
constexpr coord_type GetY() const
 
constexpr size_type GetWidth() const
 
constexpr coord_type GetX() const
 
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
 
constexpr ecoord_type GetArea() const
Return the area of the rectangle.
 
constexpr size_type GetHeight() const
 
constexpr coord_type GetLeft() const
 
constexpr bool Contains(const Vec &aPoint) const
 
constexpr const Vec & GetOrigin() const
 
constexpr coord_type GetRight() const
 
constexpr void Offset(coord_type dx, coord_type dy)
 
constexpr bool Intersects(const BOX2< Vec > &aRect) const
 
constexpr coord_type GetBottom() const
 
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
 
static std::vector< DANGLING_END_ITEM >::iterator get_lower_pos(std::vector< DANGLING_END_ITEM > &aItemListByPos, const VECTOR2I &aPos)
 
Helper class used to store the state of schematic items that can be connected to other schematic item...
 
DANGLING_END_T GetType() const
 
const EDA_ITEM * GetParent() const
 
bool IsHorizontal() const
 
The base class for create windows for drawing purpose.
 
EDA_ITEM_FLAGS GetEditFlags() const
 
void SetFlags(EDA_ITEM_FLAGS aMask)
 
KICAD_T Type() const
Returns the type of object.
 
virtual bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const
Compare the item against the search criteria in aSearchData.
 
virtual void SetParentGroup(EDA_GROUP *aGroup)
 
virtual void SetParent(EDA_ITEM *aParent)
 
EDA_ITEM * m_parent
Owner.
 
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
 
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
 
const EDA_ANGLE & GetTextAngle() const
 
virtual const wxString & GetText() const
Return the string associated with the text object.
 
void SetTextPos(const VECTOR2I &aPoint)
 
void Offset(const VECTOR2I &aOffset)
 
static ENUM_MAP< T > & Instance()
 
A text control validator used for validating the text allowed in fields.
 
bool DoValidate(const wxString &aValue, wxWindow *aParent)
 
Class that other classes need to inherit from, in order to be inspectable.
 
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
 
wxString AsString() const
 
A logical library item identifier and consists of various portions much like a URI.
 
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
 
bool IsRoot() const override
For symbols derived from other symbols, IsRoot() indicates no derivation.
 
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
 
static wxString LetterSubReference(int aUnit, wxChar aInitialLetter)
 
static LIB_SYMBOL * GetDummy()
Returns a dummy LIB_SYMBOL, used when one is missing in the schematic.
 
LIB_ITEMS_CONTAINER & GetDrawItems()
Return a reference to the draw item list.
 
void SetParent(LIB_SYMBOL *aParent=nullptr)
 
wxString GetName() const override
 
std::vector< SCH_PIN * > GetGraphicalPins(int aUnit=0, int aBodyStyle=0) const
Graphical pins: Return schematic pin objects as drawn (unexpanded), filtered by unit/body.
 
const BOX2I GetBodyBoundingBox(int aUnit, int aBodyStyle, bool aIncludePins, bool aIncludePrivateItems) const
Get the symbol bounding box excluding fields.
 
EMBEDDED_FILES * GetEmbeddedFiles() override
 
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
 
A singleton reporter that reports to nowhere.
 
Base plotter engine class.
 
virtual void Circle(const VECTOR2I &pos, int diametre, FILL_T fill, int width)=0
 
virtual void Bookmark(const BOX2I &aBox, const wxString &aName, const wxString &aGroupName=wxEmptyString)
Create a bookmark to a symbol.
 
virtual void BezierCurve(const VECTOR2I &aStart, const VECTOR2I &aControl1, const VECTOR2I &aControl2, const VECTOR2I &aEnd, int aTolerance, int aLineThickness)
Generic fallback: Cubic Bezier curve rendered as a polyline.
 
virtual void StartBlock(void *aData)
calling this function allows one to define the beginning of a group of drawing items,...
 
virtual void ThickSegment(const VECTOR2I &start, const VECTOR2I &end, int width, void *aData)
 
virtual void HyperlinkMenu(const BOX2I &aBox, const std::vector< wxString > &aDestURLs)
Create a clickable hyperlink menu with a rectangular click area.
 
virtual void SetColor(const COLOR4D &color)=0
 
virtual void EndBlock(void *aData)
calling this function allows one to define the end of a group of drawing items for instance in SVG or...
 
PROPERTY_BASE & SetChoicesFunc(std::function< wxPGChoices(INSPECTABLE *)> aFunc)
 
PROPERTY_BASE & SetAvailableFunc(std::function< bool(INSPECTABLE *)> aFunc)
Set a callback function to determine whether an object provides this property.
 
const wxString & Name() const
 
Provide class metadata.Helper macro to map type hashes to names.
 
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
 
static PROPERTY_MANAGER & Instance()
 
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
 
TEMPLATES m_TemplateFieldNames
 
Holds all the data relating to one schematic.
 
wxString GetOperatingPoint(const wxString &aNetName, int aPrecision, const wxString &aRange)
 
SCHEMATIC_SETTINGS & Settings() const
 
PROJECT & Project() const
Return a reference to the project this schematic is part of.
 
EMBEDDED_FILES * GetEmbeddedFiles() override
 
SCH_SHEET_PATH & CurrentSheet() const
 
bool ResolveCrossReference(wxString *token, int aDepth) const
Resolves text vars that refer to other items.
 
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
 
wxString LocalName() const
 
wxString Name(bool aIgnoreSheet=false) const
 
Schematic editor (Eeschema) main window.
 
SCH_SHEET_PATH & GetCurrentSheet() const
 
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
 
void ImportValues(const SCH_FIELD &aSource)
Copy parameters from a SCH_FIELD source.
 
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
 
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
 
void SetText(const wxString &aText) override
 
SCH_RENDER_SETTINGS * getRenderSettings(PLOTTER *aPlotter) const
 
void SetPrivate(bool aPrivate)
 
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
 
AUTOPLACE_ALGO m_fieldsAutoplaced
 
std::unordered_set< SCH_RULE_AREA * > m_rule_areas_cache
Store pointers to rule areas which this item is contained within.
 
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
 
void SetAlt(const wxString &aAlt)
Set the name of the alternate pin.
 
void SetName(const wxString &aName)
 
const wxString & GetName() const
 
bool IsDangling() const override
 
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
 
void SetShape(GRAPHIC_PINSHAPE aShape)
 
VECTOR2I GetPosition() const override
 
wxString GetShownName() const
 
void SetType(ELECTRICAL_PINTYPE aType)
 
const wxString & GetNumber() const
 
GRAPHIC_PINSHAPE GetShape() const
 
ELECTRICAL_PINTYPE GetType() const
 
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
 
bool GetExcludedFromBOM() const
 
wxString PathHumanReadable(bool aUseShortRootName=true, bool aStripTrailingSeparator=false) const
Return the sheet path in a human readable form made from the sheet names.
 
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
 
bool GetExcludedFromSim() const
 
bool GetExcludedFromBoard() const
 
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
 
size_t size() const
Forwarded method from std::vector.
 
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the sheet.
 
Variant information for a schematic symbol.
 
void InitializeAttributes(const SCH_SYMBOL &aSymbol)
 
wxString GetUnitDisplayName(int aUnit, bool aLabel) const override
Return the display name for a given unit aUnit.
 
void SetValueProp(const wxString &aRef)
 
SCH_SYMBOL & operator=(const SCH_SYMBOL &aItem)
 
size_t GetFullPinCount() const
 
void UpdatePrefix()
Set the prefix based on the current reference designator.
 
wxString m_prefix
C, R, U, Q etc - the first character(s) which typically indicate what the symbol is.
 
wxString GetDescription() const override
 
std::unordered_map< SCH_PIN *, SCH_PIN * > m_pinMap
Library pin pointer : SCH_PIN indices.
 
void SetMirrorX(bool aMirror)
 
bool IsSymbolLikePowerGlobalLabel() const
 
EMBEDDED_FILES * GetEmbeddedFiles() override
SCH_SYMBOLs don't currently support embedded files, but their LIB_SYMBOL counterparts do.
 
wxString GetSymbolIDAsString() const
 
LIB_ID m_lib_id
Name and library the symbol was loaded from, i.e. 74xx:74LS00.
 
bool GetExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
 
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
 
bool GetShowPinNumbers() const override
 
wxString GetDatasheet() const
Return the documentation text for the given part alias.
 
double Similarity(const SCH_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
 
void SetLibId(const LIB_ID &aName)
 
std::vector< SCH_FIELD > & GetFields()
Return a reference to the vector holding the symbol's fields.
 
BOX2I GetBodyAndPinsBoundingBox() const override
Return a bounding box for the symbol body and pins but not the fields.
 
wxString GetBodyStyleProp() const override
 
void SetRefProp(const wxString &aRef)
 
INSPECT_RESULT Visit(INSPECTOR inspector, void *testData, const std::vector< KICAD_T > &aScanTypes) override
May be re-implemented for each derived class in order to handle all the types given by its member dat...
 
virtual void SetDNP(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
 
SCH_ITEM * GetDrawItem(const VECTOR2I &aPosition, KICAD_T aType=TYPE_NOT_INIT)
Return the symbol library item at aPosition that is part of this symbol.
 
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
 
void PlotDNP(PLOTTER *aPlotter) const
Plot the red 'X' over the symbol.
 
bool operator!=(const SCH_SYMBOL &aSymbol) const
 
void SetShowPinNumbers(bool aShow) override
Set or clear the pin number visibility flag.
 
SYMBOL_ORIENTATION_PROP GetOrientationProp() const
 
wxString SubReference(int aUnit, bool aAddSeparator=true) const
 
wxString GetClass() const override
Return the class name.
 
void RemoveInstance(const SCH_SHEET_PATH &aInstancePath)
 
bool IsAnnotated(const SCH_SHEET_PATH *aSheet) const
Check if the symbol has a valid annotation (reference) for the given sheet path.
 
void SetMirrorY(bool aMirror)
 
void PlotPins(PLOTTER *aPlotter) const
Plot just the symbol pins.
 
void SetBodyStyleProp(const wxString &aBodyStyle) override
 
void SetValueFieldText(const wxString &aValue)
 
std::vector< SCH_PIN * > GetPins() const override
 
void RemoveField(const wxString &aFieldName)
Remove a user field from the symbol.
 
void SetExcludedFromSim(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
Set or clear the exclude from simulation flag.
 
void SetExcludedFromSimProp(bool aEnable)
 
void SetBodyStyle(int aBodyStyle) override
 
void SetShowPinNames(bool aShow) override
Set or clear the pin name visibility flag.
 
wxString GetKeyWords() const override
 
wxString GetSchSymbolLibraryName() const
 
wxString GetShownKeyWords(int aDepth=0) const override
 
void DeleteVariant(const SCH_SHEET_PATH &aInstance, const wxString &aVariantName)
 
std::optional< SCH_SYMBOL_VARIANT > GetVariant(const SCH_SHEET_PATH &aInstance, const wxString &aVariantName) const
 
void ClearBrightenedPins()
 
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
 
bool HasConnectivityChanges(const SCH_ITEM *aItem, const SCH_SHEET_PATH *aInstance=nullptr) const override
Check if aItem has connectivity changes against this object.
 
bool GetExcludedFromSimProp() const
 
bool GetExcludedFromBOM(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
 
bool IsGlobalPower() const override
 
wxString GetRefProp() const
 
wxString GetBodyStyleDescription(int aBodyStyle, bool aLabel) const override
 
bool AddSheetPathReferenceEntryIfMissing(const KIID_PATH &aSheetPath)
Add an instance to the alternate references list (m_instanceReferences), if this entry does not alrea...
 
bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const override
Compare the item against the search criteria in aSearchData.
 
void SetExcludedFromBOMProp(bool aEnable)
 
static std::unordered_map< TRANSFORM, int > s_transformToOrientationCache
 
void UpdatePins()
Updates the cache of SCH_PIN objects for each pin.
 
std::vector< SCH_SYMBOL_INSTANCE > m_instanceReferences
Define the hierarchical path and reference of the symbol.
 
const wxString GetValue(bool aResolve, const SCH_SHEET_PATH *aPath, bool aAllowExtraText) const override
 
void SyncOtherUnits(const SCH_SHEET_PATH &aSourceSheet, SCH_COMMIT &aCommit, PROPERTY_BASE *aProperty)
Keep fields other than the reference, include/exclude flags, and alternate pin assignments in sync in...
 
SCH_FIELD * FindFieldCaseInsensitive(const wxString &aFieldName)
Search for a SCH_FIELD with aFieldName.
 
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
 
bool IsPointClickableAnchor(const VECTOR2I &aPos) const override
 
void UpdateFields(const SCH_SHEET_PATH *aPath, bool aUpdateStyle, bool aUpdateRef, bool aUpdateOtherFields, bool aResetRef, bool aResetOtherFields)
Restore fields to the original library values.
 
wxString m_schLibSymbolName
The name used to look up a symbol in the symbol library embedded in a schematic.
 
void SetRef(const SCH_SHEET_PATH *aSheet, const wxString &aReference)
Set the reference for the given sheet path for this symbol.
 
void ClearAnnotation(const SCH_SHEET_PATH *aSheetPath, bool aResetPrefix)
Clear exiting symbol annotation.
 
void SetOrientationProp(SYMBOL_ORIENTATION_PROP aAngle)
Orientation/mirroring access for property manager.
 
bool GetShowPinNames() const override
 
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
 
const wxString GetFootprintFieldText(bool aResolve, const SCH_SHEET_PATH *aPath, bool aAllowExtraText) const
 
bool HasDeMorganBodyStyles() const override
 
std::vector< SCH_FIELD > m_fields
Variable length list of fields.
 
std::vector< SCH_PIN * > GetAllLibPins() const
 
int GetBodyStyleCount() const override
Return the number of body styles of the symbol.
 
void SetOrientation(int aOrientation)
Compute the new transform matrix based on aOrientation for the symbol which is applied to the current...
 
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
 
void SetFootprintFieldText(const wxString &aFootprint)
 
bool doIsConnected(const VECTOR2I &aPosition) const override
Provide the object specific test to see if it is connected to aPosition.
 
void AddHierarchicalReference(const KIID_PATH &aPath, const wxString &aRef, int aUnit)
Add a full hierarchical reference to this symbol.
 
bool IsMissingLibSymbol() const
Check to see if the library symbol is set to the dummy library symbol.
 
VECTOR2I GetPosition() const override
 
std::unique_ptr< LIB_SYMBOL > m_part
A flattened copy of the LIB_SYMBOL from the PROJECT object's libraries.
 
int GetNextFieldOrdinal() const
Return the next ordinal for a user field for this symbol.
 
void swapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
 
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the symbol.
 
void Init(const VECTOR2I &pos=VECTOR2I(0, 0))
 
wxString GetShownDescription(int aDepth=0) const override
 
const LIB_ID & GetLibId() const override
 
bool operator<(const SCH_ITEM &aItem) const override
 
static void BuildLocalPowerIconShape(std::vector< SCH_SHAPE > &aShapeList, const VECTOR2D &aPos, double aSize, double aLineWidth, bool aHorizontal)
Build the local power pin indicator icon shape, at coordinate aPos.
 
void GetContextualTextVars(wxArrayString *aVars) const
Return the list of system text vars & fields for this symbol.
 
void SetUnitProp(int aUnit)
 
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
 
std::vector< SCH_PIN * > GetLibPins() const
Populate a vector with all the pins from the library object that match the current unit and bodyStyle...
 
bool UpdateDanglingState(std::vector< DANGLING_END_ITEM > &aItemListByType, std::vector< DANGLING_END_ITEM > &aItemListByPos, const SCH_SHEET_PATH *aPath=nullptr) override
Test if the symbol's dangling state has changed for all pins.
 
bool GetInstance(SCH_SYMBOL_INSTANCE &aInstance, const KIID_PATH &aSheetPath, bool aTestFromEnd=false) const
 
void AddVariant(const SCH_SHEET_PATH &aInstance, const SCH_SYMBOL_VARIANT &aVariant)
 
BOX2I doGetBoundingBox(bool aIncludePins, bool aIncludeFields) const
 
SCH_FIELD * AddField(const SCH_FIELD &aField)
Add a field to the symbol.
 
void SetDNPProp(bool aEnable)
 
void GetEndPoints(std::vector< DANGLING_END_ITEM > &aItemList) override
Add the schematic item end points to aItemList if the item has end points.
 
std::vector< VECTOR2I > GetConnectionPoints() const override
Add all the connection points for this item to aPoints.
 
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
 
bool m_isInNetlist
True if the symbol should appear in netlist.
 
int GetUnitSelection(const SCH_SHEET_PATH *aSheet) const
Return the instance-specific unit selection for the given sheet path.
 
SCH_PIN * GetPin(const wxString &number) const
Find a symbol pin by number.
 
wxString GetValueProp() const
 
bool IsLocalPower() const override
 
void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction, RECURSE_MODE aMode) override
 
int GetUnitCount() const override
Return the number of units per package of the symbol.
 
void SetPrefix(const wxString &aPrefix)
 
int GetOrientation() const override
Get the display symbol orientation.
 
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
 
bool IsSymbolLikePowerLocalLabel() const
 
bool GetExcludedFromBOMProp() const
 
void SetUnitSelection(const SCH_SHEET_PATH *aSheet, int aUnitSelection)
Set the selected unit of this symbol on one sheet.
 
void SetExcludedFromBOM(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
Set or clear the exclude from schematic bill of materials flag.
 
void PlotLocalPowerIconShape(PLOTTER *aPlotter) const
Plot the local power pin indicator icon shape.
 
bool IsNormal() const override
 
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
 
std::unordered_set< wxString > GetComponentClassNames(const SCH_SHEET_PATH *aPath) const
Return the component classes this symbol belongs in.
 
std::vector< std::unique_ptr< SCH_PIN > > m_pins
A SCH_PIN for every #LIB_PIN.
 
void SetLibSymbol(LIB_SYMBOL *aLibSymbol)
Set this schematic symbol library symbol reference to aLibSymbol.
 
VECTOR2I GetPinPhysicalPosition(const SCH_PIN *Pin) const
 
BOX2I GetBodyBoundingBox() const override
Return a bounding box for the symbol body but not the pins or fields.
 
virtual bool GetDNP(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
Set or clear the 'Do Not Populate' flag.
 
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
 
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
 
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
 
bool IsMovableFromAnchorPoint() const override
Return true for items which are moved with the anchor point at mouse cursor and false for items moved...
 
bool IsPower() const override
 
bool operator==(const SCH_SYMBOL &aSymbol) const
 
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this symbol.
 
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
 
SIM_MODEL & CreateModel(SIM_MODEL::TYPE aType, const std::vector< SCH_PIN * > &aPins, REPORTER &aReporter)
 
void SetFilesStack(std::vector< EMBEDDED_FILES * > aFilesStack)
 
const SPICE_GENERATOR & SpiceGenerator() const
 
std::vector< std::reference_wrapper< const SIM_MODEL_PIN > > GetPins() const
 
virtual std::string ItemName(const SPICE_ITEM &aItem) const
 
A base class for LIB_SYMBOL and SCH_SYMBOL.
 
bool m_DNP
True if symbol is set to 'Do Not Populate'.
 
void SetExcludedFromBoard(bool aExcludeFromBoard) override
Set or clear exclude from board netlist flag.
 
virtual void SetShowPinNumbers(bool aShow)
Set or clear the pin number visibility flag.
 
const TRANSFORM & GetTransform() const
 
virtual void SetShowPinNames(bool aShow)
Set or clear the pin name visibility flag.
 
bool GetExcludedFromBoard() const override
 
virtual bool GetShowPinNames() const
 
SYMBOL & operator=(const SYMBOL &aItem)
 
virtual bool GetShowPinNumbers() const
 
TRANSFORM m_transform
The rotation/mirror transformation.
 
const std::vector< TEMPLATE_FIELDNAME > & GetTemplateFieldNames()
Return a template field name list for read only access.
 
#define DEFAULT_LINE_WIDTH_MILS
The default wire width in mils. (can be changed in preference menu)
 
T Convert(const wxString &aValue)
Convert a wxString to a generic type T.
 
static constexpr EDA_ANGLE ANGLE_90
 
static constexpr EDA_ANGLE ANGLE_VERTICAL
 
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
 
static constexpr EDA_ANGLE ANGLE_270
 
const INSPECTOR_FUNC & INSPECTOR
std::function passed to nested users by ref, avoids copying std::function.
 
#define STRUCT_DELETED
flag indication structures to be erased
 
#define SKIP_STRUCT
flag indicating that the structure should be ignored
 
#define IS_DANGLING
indicates a pin is dangling
 
@ FILLED_SHAPE
Fill with object color.
 
a few functions useful in geometry calculations.
 
const wxChar *const traceSchSymbolRef
Flag to enable debug output of schematic symbol reference resolution.
 
const wxChar *const traceSchSheetPaths
Flag to enable debug output of schematic symbol sheet path manipulation code.
 
SCH_LAYER_ID
Eeschema drawing layers.
 
constexpr void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
 
Message panel definition file.
 
bool BoxHitTest(const VECTOR2I &aHitPoint, const BOX2I &aHittee, int aAccuracy)
Perform a point-to-box hit test.
 
KICOMMON_API wxString EllipsizeMenuText(const wxString &aString)
Ellipsize text (at the end) to be no more than 36 characters.
 
KICOMMON_API wxString EllipsizeStatusText(wxWindow *aWindow, const wxString &aString)
Ellipsize text (at the end) to be no more than 1/3 of the window width.
 
wxString GetRefDesPrefix(const wxString &aRefDes)
Get the (non-numeric) prefix from a refdes - e.g.
 
wxString GetRefDesUnannotated(const wxString &aSource)
Return an unannotated refdes from either a prefix or an existing refdes.
 
@ PT_NC
not connected (must be left open)
 
@ PT_POWER_IN
power input (GND, VCC for ICs). Must be connected to a power output.
 
#define NO_SETTER(owner, type)
 
#define ENUM_TO_WXANY(type)
Macro to define read-only fields (no setter method available)
 
@ PT_COORD
Coordinate expressed in distance units (mm/inch)
 
Collection of utility functions for component reference designators (refdes)
 
void CollectOtherUnits(const wxString &aRef, int aUnit, const LIB_ID &aLibId, SCH_SHEET_PATH &aSheet, std::vector< SCH_SYMBOL * > *otherUnits)
 
const SCH_FIELD * FindField(const std::vector< SCH_FIELD > &aFields, FIELD_T aFieldId)
 
int NextFieldOrdinal(const std::vector< SCH_FIELD > &aFields)
 
std::string toUTFTildaText(const wxString &txt)
Convert a wxString to UTF8 and replace any control characters with a ~, where a control character is ...
 
static void plotLocalPowerIcon(PLOTTER *aPlotter, const VECTOR2D &aPos, double aSize, bool aRotate)
plot a local power pin indicator icon.
 
static struct SCH_SYMBOL_DESC _SCH_SYMBOL_DESC
 
std::vector< FAB_LAYER_COLOR > dummy
 
wxString UnescapeString(const wxString &aSource)
 
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
 
std::vector< std::pair< FIELD_T, wxString > > Fields
 
A simple container for schematic symbol instance information.
 
std::map< wxString, SCH_SYMBOL_VARIANT > m_Variants
A list of symbol variants.
 
Hold a name of a symbol's field, field value, and default visibility.
 
@ SYM_ROTATE_COUNTERCLOCKWISE
 
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.
 
@ DESCRIPTION
Field Description of part, i.e. "1/4W 1% Metal Film Resistor".
 
@ 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)
 
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.
 
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
 
@ SCH_FIELD_LOCATE_REFERENCE_T
 
@ SCH_FIELD_LOCATE_FOOTPRINT_T
 
@ SCH_FIELD_LOCATE_VALUE_T
 
@ SCH_FIELD_LOCATE_DATASHEET_T
 
@ SCH_SYMBOL_LOCATE_POWER_T
 
Custom text control validator definitions.
 
VECTOR2< int32_t > VECTOR2I
 
VECTOR2< double > VECTOR2D