88                if( !symbol || aProperty->
Name() != 
_HKI( 
"Text" ) )
 
   94                wxString newValue = aItem->
Get<wxString>( aProperty );
 
   98                    symbol->
SetRef( &sheetPath, newValue );
 
  106                wxString ref = symbol->
GetRef( &sheetPath );
 
  112                    std::vector<SCH_SYMBOL*> otherUnits;
 
  118                        switch( field->
GetId() )
 
  125                                aCommit->
Modify( otherUnit, sheet.LastScreen() );
 
  127                            otherUnit->GetField( field->
GetId() )->SetText( newValue );
 
 
  173        project.m_ErcSettings = 
nullptr;
 
  176        delete project.m_SchematicSettings;
 
  177        project.m_SchematicSettings = 
nullptr;
 
  188        project.m_SchematicSettings->LoadFromFile();
 
  189        project.m_SchematicSettings->m_NgspiceSettings->LoadFromFile();
 
  190        project.m_ErcSettings->LoadFromFile();
 
 
  202    std::shared_ptr<REFDES_TRACKER> refdesTracker = 
m_project->GetProjectFile().m_SchematicSettings->m_refDesTracker;
 
  211        refdesTracker->Insert( ref.GetFullRef( 
false ).ToStdString() );
 
 
  227    return std::any_of( references.
begin(), references.
end(),
 
  230                            return ref.GetFullRef( true ) == aRef.GetFullRef( true );
 
 
  237    wxCHECK_RET( aRootSheet, wxS( 
"Call to SetRoot with null SCH_SHEET!" ) );
 
  243                "SetRoot called: sheet='%s', UUID=%s, isVirtualRoot=%d, m_topLevelSheets.size()=%zu",
 
  246                isVirtualRoot ? 1 : 0,
 
  253                    "  m_topLevelSheets[%zu]: '%s' (UUID=%s, isVirtualRoot=%d)",
 
  255                    sheet ? sheet->
GetName() : wxString( 
"(null)" ),
 
  283                if( sheet && !
m_rootSheet->GetScreen()->Items().contains( sheet ) )
 
  297                        "SetRoot: Set current sheet to first top-level sheet '%s', path='%s', size=%zu",
 
  305                        "SetRoot: No top-level sheets, current sheet left empty" );
 
  344                    "SetRoot: Set current sheet to root sheet '%s', path='%s', size=%zu",
 
  362            m_variantNames.insert( variantNames.begin(), variantNames.end() );
 
 
  396            [&]( 
const wxString& aVar )
 
  399                    aVars->push_back( aVar );
 
  404    add( wxT( 
"SHEETPATH" ) );
 
  405    add( wxT( 
"SHEETNAME" ) );
 
  406    add( wxT( 
"FILENAME" ) );
 
  407    add( wxT( 
"FILEPATH" ) );
 
  408    add( wxT( 
"PROJECTNAME" ) );
 
  413    for( std::pair<wxString, wxString> entry : 
m_project->GetTextVars() )
 
 
  421    wxCHECK( aSheetPath, 
false );
 
  423    if( token->IsSameAs( wxT( 
"#" ) ) )
 
  428    else if( token->IsSameAs( wxT( 
"##" ) ) )
 
  430        *token = wxString::Format( 
"%i", 
Root().CountSheets() );
 
  433    else if( token->IsSameAs( wxT( 
"SHEETPATH" ) ) )
 
  438    else if( token->IsSameAs( wxT( 
"SHEETNAME" ) ) )
 
  443    else if( token->IsSameAs( wxT( 
"FILENAME" ) ) )
 
  446        *token = fn.GetFullName();
 
  449    else if( token->IsSameAs( wxT( 
"FILEPATH" ) ) )
 
  452        *token = fn.GetFullPath();
 
  455    else if( token->IsSameAs( wxT( 
"PROJECTNAME" ) ) )
 
  465    if( 
m_project->TextVarResolver( token ) )
 
 
  477        return wxString( wxEmptyString );
 
  482    return wxString( wxEmptyString );
 
 
  491        return defaultSettings;
 
  494    return *
m_project->GetProjectFile().m_SchematicSettings;
 
 
  501    return *
m_project->GetProjectFile().m_ErcSettings;
 
 
  515    std::set<wxString> migratedExclusions;
 
  531            if(    settingsKey != wxT( 
"pin_to_pin" )
 
  532                && settingsKey != wxT( 
"hier_label_mismatch" )
 
  533                && settingsKey != wxT( 
"different_unit_net" ) )
 
  548    settings.
m_ErcExclusions.insert( migratedExclusions.begin(), migratedExclusions.end() );
 
  558            std::set<wxString>::iterator it = settings.
m_ErcExclusions.find( serialized );
 
  568    std::vector<SCH_MARKER*> newMarkers;
 
  577            newMarkers.push_back( marker );
 
 
  589    for( 
const std::shared_ptr<BUS_ALIAS>& alias : 
m_busAliases )
 
  591        if( alias && alias->GetName() == aLabel )
 
 
  604    auto sameDefinition = [&]( 
const std::shared_ptr<BUS_ALIAS>& candidate ) -> 
bool 
  606        return candidate && candidate->GetName() == aAlias->GetName()
 
  607               && candidate->Members() == aAlias->Members();
 
 
  625    for( 
const std::shared_ptr<BUS_ALIAS>& alias : aAliases )
 
  630        std::shared_ptr<BUS_ALIAS> clone = alias->Clone();
 
  632        auto sameDefinition = [&]( 
const std::shared_ptr<BUS_ALIAS>& candidate ) -> 
bool 
  634            return candidate && candidate->GetName() == clone->GetName()
 
  635                   && candidate->Members() == clone->Members();
 
 
  655    const auto& projectAliases = 
m_project->GetProjectFile().m_BusAliases;
 
  657    for( 
const auto& alias : projectAliases )
 
  659        std::shared_ptr<BUS_ALIAS> busAlias = std::make_shared<BUS_ALIAS>();
 
  661        busAlias->SetName( alias.first );
 
  662        busAlias->Members() = alias.second;
 
 
  674    auto& projectAliases = 
m_project->GetProjectFile().m_BusAliases;
 
  676    projectAliases.clear();
 
  678    std::set<wxString> seen;
 
  680    for( 
const std::shared_ptr<BUS_ALIAS>& alias : 
m_busAliases )
 
  685        if( !seen.insert( alias->GetName() ).second )
 
  688        projectAliases.emplace( alias->GetName(), alias->Members() );
 
 
  695    std::set<wxString> names;
 
  704            names.insert( key.Name );
 
 
  715    wxString       ref = token->BeforeFirst( 
':', &remainder );
 
  721    if( 
path.size() > 1 )
 
  731        if( refSymbol->
ResolveTextVar( &sheetPath, &remainder, aDepth + 1 ) )
 
  732            *token = std::move( remainder );
 
  734            *token = refSymbol->
GetRef( &sheetPath, 
true ) + wxS( 
":" ) + remainder;
 
  744        if( refSheet->
ResolveTextVar( &sheetPath, &remainder, aDepth + 1 ) )
 
  745            *token = std::move( remainder );
 
 
  756    std::map<int, wxString> namesMap;
 
  760        if( sheet.size() == 1 )
 
  761            namesMap[sheet.GetVirtualPageNumber()] = 
_( 
"<root sheet>" );
 
  763            namesMap[sheet.GetVirtualPageNumber()] = sheet.Last()->GetName();
 
 
  772    std::map<int, wxString> pagesMap;
 
  775        pagesMap[sheet.GetVirtualPageNumber()] = sheet.GetPageNumber();
 
 
  784    size_t   sourceLen = aSource.length();
 
  786    for( 
size_t i = 0; i < sourceLen; ++i )
 
  788        if( aSource[i] == 
'$' && i + 1 < sourceLen && aSource[i+1] == 
'{' )
 
  791            bool     isCrossRef = 
false;
 
  794            for( i = i + 2; i < sourceLen; ++i )
 
  796                if( aSource[i] == 
'{' 
  797                        && ( aSource[i-1] == 
'_' || aSource[i-1] == 
'^' || aSource[i-1] == 
'~' ) )
 
  802                if( aSource[i] == 
'}' )
 
  810                if( aSource[i] == 
':' )
 
  813                token.append( aSource[i] );
 
  819                wxString           ref = token.BeforeFirst( 
':', &remainder );
 
  824                for( 
size_t jj = 0; jj < references.
GetCount(); jj++ )
 
  826                    SCH_SYMBOL* refSymbol = references[ jj ].GetSymbol();
 
  828                    if( ref == refSymbol->
GetRef( &references[ jj ].GetSheetPath(), 
true ) )
 
  833                        token = 
path.AsString() + wxS( 
":" ) + remainder;
 
  839            newbuf.append( wxS( 
"${" ) + token + wxS( 
"}" ) );
 
  843            newbuf.append( aSource[i] );
 
 
  854    size_t   sourceLen = aSource.length();
 
  856    for( 
size_t i = 0; i < sourceLen; ++i )
 
  858        if( aSource[i] == 
'$' && i + 1 < sourceLen && aSource[i+1] == 
'{' )
 
  861            bool     isCrossRef = 
false;
 
  863            for( i = i + 2; i < sourceLen; ++i )
 
  865                if( aSource[i] == 
'}' )
 
  868                if( aSource[i] == 
':' )
 
  871                token.append( aSource[i] );
 
  877                wxString       ref = token.BeforeFirst( 
':', &remainder );
 
  883                if( 
path.size() > 1 )
 
  892                    token = refSymbol->
GetRef( &sheetPath, 
true ) + wxS( 
":" ) + remainder;
 
  896            newbuf.append( wxS( 
"${" ) + token + wxS( 
"}" ) );
 
  900            newbuf.append( aSource[i] );
 
 
  929        return wxEmptyString;
 
  932    wxString   filename = rootFn.GetName();
 
 
  958                sheet_count += topSheet->CountSheets();
 
  967    int              sheet_number = 1;
 
  974        if( sheet.Path() == current_sheetpath ) 
 
  980    for( screen = s_list.
GetFirst(); screen != 
nullptr; screen = s_list.
GetNext() )
 
 
  991    std::map<wxString, std::set<int>>& pageRefsMap = 
GetPageRefsMap();
 
 1000            wxString         resolvedLabel = global->
GetShownText( &sheet, 
false );
 
 1002            pageRefsMap[ resolvedLabel ].insert( sheet.GetVirtualPageNumber() );
 
 1011    std::vector<SCH_GLOBALLABEL*> currentSheetGlobalLabels;
 
 1014        currentSheetGlobalLabels.push_back( 
static_cast<SCH_GLOBALLABEL*
>( item ) );
 
 1018        std::vector<SCH_FIELD>& fields = globalLabel->GetFields();
 
 1020        fields[0].SetVisible( show );
 
 1024            if( fields.size() == 1 && fields[0].GetTextPos() == globalLabel->GetPosition() )
 
 1029            for( 
SCH_FIELD& field : globalLabel->GetFields() )
 
 1030                field.ClearBoundingBoxCache();
 
 1032            globalLabel->ClearBoundingBoxCache();
 
 
 1042                                       const wxString& aRange )
 
 1044    wxString spiceNetName( aNetName.Lower() );
 
 1047    if( spiceNetName == wxS( 
"gnd" ) || spiceNetName == wxS( 
"0" ) )
 
 1048        return wxEmptyString;
 
 
 1067        std::deque<EDA_ITEM*> allItems;
 
 1069        for( 
SCH_ITEM* item : screen->Items() )
 
 1070            allItems.push_back( item );
 
 1073        for( 
const VECTOR2I& point : screen->GetNeededJunctions( allItems ) )
 
 1076            screen->Append( junction );
 
 1079            for( 
SCH_LINE* wire : screen->GetBusesAndWires( point, 
true ) )
 
 1082                screen->Append( newSegment );
 
 
 1147    for( 
unsigned i = 0; i < sheetList.size(); i++ )
 
 
 1203        for( 
auto& [
name, libSym] : screen->GetLibSymbols() )
 
 1204            aFunction( libSym->GetEmbeddedFiles() );
 
 
 1211    std::set<KIFONT::OUTLINE_FONT*> 
fonts;
 
 1217        for( 
SCH_ITEM* item : sheet.LastScreen()->Items() )
 
 1229                if( outline->GetEmbeddingPermission() == EMBEDDING_PERMISSION::EDITABLE
 
 1230                    || outline->GetEmbeddingPermission() == EMBEDDING_PERMISSION::INSTALLABLE )
 
 1232                    fonts.insert( outline );
 
 
 1252            wxLogTrace( 
"EMBED", 
"Failed to add font file: %s", font->GetFileName() );
 
 
 1263    std::set<const SCH_SCREEN*> retv;
 
 1276            const std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = symbol->
GetInstances();
 
 1280                if( !hierarchy.
HasPath( instance.m_Path ) )
 
 1282                    retv.insert( screen );
 
 1287            if( retv.count( screen ) )
 
 
 1304        wxCHECK2( screen, 
continue );
 
 1306        if( screen->GetRefCount() > 1 )
 
 
 1317    std::vector<SCH_LINE*>       lines;
 
 1318    std::vector<SCH_JUNCTION*>   junctions;
 
 1319    std::vector<SCH_NO_CONNECT*> ncs;
 
 1320    std::vector<SCH_ITEM*>       items_to_remove;
 
 1321    bool                         changed = 
true;
 
 1323    if( aScreen == 
nullptr )
 
 1326    auto remove_item = [&]( 
SCH_ITEM* aItem ) -> 
void 
 1334                               if( aItem->IsSelected() && selectionTool )
 
 1341                               aCommit->
Removed( aItem, aScreen );
 
 1349            items_to_remove.push_back( item );
 
 1351            junctions.push_back( 
static_cast<SCH_JUNCTION*
>( item ) );
 
 1354    for( 
SCH_ITEM* item : items_to_remove )
 
 1355        remove_item( item );
 
 1363                if( ( aFirst->GetEditFlags() & STRUCT_DELETED )
 
 1364                        || ( aSecond->GetEditFlags() & STRUCT_DELETED ) )
 
 1370                    remove_item( aSecond );
 
 1376                if( ( aFirst->GetEditFlags() & STRUCT_DELETED )
 
 1377                        || ( aSecond->GetEditFlags() & STRUCT_DELETED ) )
 
 1383                    remove_item( aSecond );
 
 1387    auto minX = []( 
const SCH_LINE* l )
 
 1389                    return std::min( l->GetStartPoint().x, l->GetEndPoint().x );
 
 1392    auto maxX = []( 
const SCH_LINE* l )
 
 1394                    return std::max( l->GetStartPoint().x, l->GetEndPoint().x );
 
 1397    auto minY = []( 
const SCH_LINE* l )
 
 1399                    return std::min( l->GetStartPoint().y, l->GetEndPoint().y );
 
 1402    auto maxY = []( 
const SCH_LINE* l )
 
 1404                    return std::max( l->GetStartPoint().y, l->GetEndPoint().y );
 
 1417                lines.push_back( 
static_cast<SCH_LINE*
>( item ) );
 
 1421        std::sort( lines.begin(), lines.end(),
 
 1424                       return minX( a ) < minX( b );
 
 1427        for( 
auto it1 = lines.begin(); it1 != lines.end(); ++it1 )
 
 1434            if( firstLine->
IsNull() )
 
 1436                remove_item( firstLine );
 
 1440            int  firstRightXEdge = maxX( firstLine );
 
 1443            for( ++it2; it2 != lines.end(); ++it2 )
 
 1446                int       secondLeftXEdge = minX( secondLine );
 
 1449                if( secondLeftXEdge > firstRightXEdge )
 
 1453                if( !( std::max( minY( firstLine ), minY( secondLine ) )
 
 1454                       <= std::min( maxY( firstLine ), maxY( secondLine ) ) ) )
 
 1473                    remove_item( secondLine );
 
 1481                if( mergedLine != 
nullptr )
 
 1483                    remove_item( firstLine );
 
 1484                    remove_item( secondLine );
 
 1486                    if( m_schematicHolder )
 
 1488                        m_schematicHolder->AddToScreen( mergedLine, aScreen );
 
 1491                    aCommit->Added( mergedLine, aScreen );
 
 1494                        selectionTool->AddItemToSel( mergedLine, 
true  );
 
 
 1508                                        std::function<
void( 
SCH_ITEM* )>* aChangedItemHandler,
 
 1517        aCommit = &localCommit;
 
 1529            CleanUp( aCommit, sheet.LastScreen() );
 
 1533    wxLogTrace( 
"CONN_PROFILE", 
"SchematicCleanUp() %0.4f ms", timer.
msecs() );
 
 1540            || aLastChangeList == 
nullptr 
 1544        m_project->GetProjectFile().NetSettings()->ClearAllCaches();
 
 1547        std::unordered_set<SCH_SCREEN*> all_screens;
 
 1550            all_screens.insert( 
path.LastScreen() );
 
 1567        std::set<SCH_ITEM*>                            changed_items;
 
 1568        std::set<VECTOR2I>                             pts;
 
 1569        std::set<std::pair<SCH_SHEET_PATH, SCH_ITEM*>> item_paths;
 
 1572        std::unordered_set<SCH_SCREEN*>                  changed_screens;
 
 1573        std::set<std::pair<SCH_RULE_AREA*, SCH_SCREEN*>> changed_rule_areas;
 
 1574        std::vector<CHANGED_ITEM>                        changed_connectable_items;
 
 1577        auto addItemToChangeSet = [&changed_items, &pts, &item_paths]( CHANGED_ITEM itemData )
 
 1579            std::vector<SCH_SHEET_PATH>& paths = itemData.screen->GetClientSheetPaths();
 
 1581            std::vector<VECTOR2I> tmp_pts = itemData.item->GetConnectionPoints();
 
 1582            pts.insert( tmp_pts.begin(), tmp_pts.end() );
 
 1583            changed_items.insert( itemData.item );
 
 1586                item_paths.insert( std::make_pair( 
path, itemData.item ) );
 
 1588            if( !itemData.linked_item || !itemData.linked_item->IsConnectable() )
 
 1591            tmp_pts = itemData.linked_item->GetConnectionPoints();
 
 1592            pts.insert( tmp_pts.begin(), tmp_pts.end() );
 
 1593            changed_items.insert( itemData.linked_item );
 
 1599                std::vector<SCH_PIN*> pins = symbol->GetPins();
 
 1600                changed_items.insert( pins.begin(), pins.end() );
 
 1604                item_paths.insert( std::make_pair( 
path, itemData.linked_item ) );
 
 1608        for( 
unsigned ii = 0; ii < aLastChangeList->
GetCount(); ++ii )
 
 1628                changed_screens.insert( screen );
 
 1633                    changed_rule_areas.insert( { ruleArea, screen } );
 
 1638                    changed_connectable_items.push_back( { item, linked_item, screen } );
 
 1644        std::vector<std::pair<SCH_RULE_AREA*, SCH_SCREEN*>> forceUpdateRuleAreas =
 
 1647        std::for_each( forceUpdateRuleAreas.begin(), forceUpdateRuleAreas.end(),
 
 1648                       [&]( std::pair<SCH_RULE_AREA*, SCH_SCREEN*>& updatedRuleArea )
 
 1650                           changed_rule_areas.insert( updatedRuleArea );
 
 1655        std::map<KIID, EDA_ITEM*> itemMap;
 
 1656        list.FillItemMap( itemMap );
 
 1658        auto addPastAndPresentContainedItems =
 
 1663                        if( itemMap.contains( pastItem ) )
 
 1664                            addItemToChangeSet( { 
static_cast<SCH_ITEM*
>( itemMap[pastItem] ), 
nullptr, screen } );
 
 1668                        addItemToChangeSet( { containedItem, 
nullptr, screen } );
 
 1671        for( 
const auto& [changedRuleArea, screen] : changed_rule_areas )
 
 1672            addPastAndPresentContainedItems( changedRuleArea, screen );
 
 1675        for( CHANGED_ITEM& changed_item_data : changed_connectable_items )
 
 1677            addItemToChangeSet( changed_item_data );
 
 1683                const std::vector<VECTOR2I> labelConnectionPoints =
 
 1684                        changed_item_data.item->GetConnectionPoints();
 
 1686                auto candidateRuleAreas =
 
 1688                                                                       changed_item_data.item->GetBoundingBox() );
 
 1690                for( 
SCH_ITEM* candidateRuleArea : candidateRuleAreas )
 
 1696                        addPastAndPresentContainedItems( ruleArea, changed_item_data.screen );
 
 1706                if( !item->IsConnectable() )
 
 1711                    if( item->HitTest( pt ) )
 
 1712                        changed_items.insert( item );
 
 1714                else if( item->Type() == 
SCH_SYMBOL_T && item->IsConnected( pt ) )
 
 1717                    std::vector<SCH_PIN*> pins = symbol->
GetPins();
 
 1719                    changed_items.insert( pins.begin(), pins.end() );
 
 1725                    wxCHECK2( sheet, 
continue );
 
 1727                    std::vector<SCH_SHEET_PIN*> sheetPins = sheet->
GetPins();
 
 1728                    changed_items.insert( sheetPins.begin(), sheetPins.end() );
 
 1732                    if( item->IsConnected( pt ) )
 
 1733                        changed_items.insert( item );
 
 1738        std::set<std::pair<SCH_SHEET_PATH, SCH_ITEM*>> all_items =
 
 1741        all_items.insert( item_paths.begin(), item_paths.end() );
 
 1747        std::shared_ptr<NET_SETTINGS> netSettings = 
m_project->GetProjectFile().NetSettings();
 
 1749        std::set<wxString> affectedNets;
 
 1751        for( 
auto&[ 
path, item ] : all_items )
 
 1753            wxCHECK2( item, 
continue );
 
 1754            item->SetConnectivityDirty();
 
 1758                affectedNets.insert( conn->
Name() );
 
 1762        for( 
const wxString& netName : affectedNets )
 
 1763            netSettings->ClearCacheForNet( netName );
 
 1765        new_graph.
Recalculate( list, 
false, aChangedItemHandler, aProgressReporter );
 
 1769    if( !localCommit.
Empty() )
 
 1770        localCommit.
Push( 
_( 
"Schematic Cleanup" ) );
 
 
 1824    wxCHECK_RET( aSheet, wxS( 
"Cannot add null sheet!" ) );
 
 1825    wxCHECK_RET( aSheet->
GetScreen(), wxS( 
"Cannot add virtual root as top-level sheet!" ) );
 
 
 1898               "BuildSheetListSortedByPageNumbers: %zu top-level sheets",
 
 1911                       "  Top-level sheet: '%s' (UUID=%s, isVirtualRoot=%d)",
 
 1913                       sheet->m_Uuid.AsString(),
 
 1914                       sheet->m_Uuid == 
niluuid ? 1 : 0 );
 
 1923                hierarchy.push_back( 
path );
 
 
 1949                sheets.push_back( 
path );
 
 
 1960    wxArrayString variantNames;
 
 1966        variantNames.Add( 
name );
 
 1968    return variantNames;
 
 
 1975        return wxEmptyString;
 
 
 2003    wxString projPath = 
m_project->GetProjectPath();
 
 2005    if( projPath.IsEmpty() )
 
 2009    if( !projPath.IsSameAs( aProjectPath ) )
 
 2011        wxLogTrace( 
traceAutoSave, wxS(
"[history] sch saver skipping - project path mismatch: %s vs %s"),
 
 2012                   projPath, aProjectPath );
 
 2017    if( !projPath.EndsWith( wxFILE_SEP_PATH ) )
 
 2018        projPath += wxFILE_SEP_PATH;
 
 2020    wxFileName historyRoot( projPath, wxEmptyString );
 
 2021    historyRoot.AppendDir( wxS( 
".history" ) );
 
 2022    wxString historyRootPath = historyRoot.GetPath();
 
 2035        if( !sheet || !screen )
 
 2043        wxString absPath = abs.GetFullPath();
 
 2045        if( absPath.IsEmpty() || !absPath.StartsWith( projPath ) )
 
 2048        wxString rel = absPath.Mid( projPath.length() );
 
 2051        wxFileName dst( historyRootPath, rel );
 
 2054        wxFileName dstDir( dst );
 
 2055        dstDir.SetFullName( wxEmptyString );
 
 2057        if( !dstDir.DirExists() )
 
 2058            wxFileName::Mkdir( dstDir.GetPath(), 0777, wxPATH_MKDIR_FULL );
 
 2062            pi->SaveSchematicFile( dst.GetFullPath(), sheet, 
this );
 
 2063            aFiles.push_back( dst.GetFullPath() );
 
 2064            wxLogTrace( 
traceAutoSave, wxS(
"[history] sch saver exported sheet '%s' -> '%s'"),
 
 2065                        absPath, dst.GetFullPath() );
 
 2069            wxLogTrace( 
traceAutoSave, wxS(
"[history] sch saver export failed for '%s': %s"),
 
 2070                        absPath, wxString::FromUTF8( ioe.
What() ) );
 
 
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
 
void SetPageCount(int aPageCount)
 
void SetPageNumber(const wxString &aPageNumber)
 
void SetVirtualPageNumber(int aPageNumber)
 
Represent a set of changes (additions, deletions or modifications) of a data model (e....
 
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
 
COMMIT & Removed(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
 
Calculate the connectivity of a schematic and generates netlists.
 
void Recalculate(const SCH_SHEET_LIST &aSheetList, bool aUnconditional=false, std::function< void(SCH_ITEM *)> *aChangedItemHandler=nullptr, PROGRESS_REPORTER *aProgressReporter=nullptr)
Update the connection graph for the given list of sheets.
 
std::set< std::pair< SCH_SHEET_PATH, SCH_ITEM * > > ExtractAffectedItems(const std::set< SCH_ITEM * > &aItems)
For a set of items, this will remove the connected items and their associated data including subgraph...
 
void SetLastCodes(const CONNECTION_GRAPH *aOther)
 
void Merge(CONNECTION_GRAPH &aGraph)
Combine the input graph contents into the current graph.
 
A subgraph is a set of items that are electrically connected on a single sheet.
 
static PRIORITY GetDriverPriority(SCH_ITEM *aDriver)
Return the priority (higher is more important) of a candidate driver.
 
const SCH_CONNECTION * GetDriverConnection() const
 
EDA_ITEM_FLAGS GetEditFlags() const
 
KICAD_T Type() const
Returns the type of object.
 
virtual void SetParent(EDA_ITEM *aParent)
 
EDA_ITEM * GetParent() const
 
EDA_ITEM_FLAGS GetFlags() const
 
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
 
SHAPE_POLY_SET & GetPolyShape()
 
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
 
EE_TYPE OfType(KICAD_T aType) const
 
EMBEDDED_FILE * AddFile(const wxFileName &aName, bool aOverwrite)
Load a file from disk and adds it to the collection.
 
Container for ERC settings.
 
std::map< wxString, wxString > m_ErcExclusionComments
 
std::set< wxString > m_ErcExclusions
 
Class that other classes need to inherit from, in order to be inspectable.
 
wxAny Get(PROPERTY_BASE *aProperty) const
 
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
 
virtual const wxString What() const
A composite of Problem() and Where()
 
FONT is an abstract base class for both outline and stroke fonts.
 
virtual bool IsStroke() const
 
Class OUTLINE_FONT implements outline font drawing.
 
wxString AsString() const
 
A logical library item identifier and consists of various portions much like a URI.
 
std::shared_ptr< RC_ITEM > GetRCItem() const
 
void SetExcluded(bool aExcluded, const wxString &aComment=wxEmptyString)
 
wxString GetComment() const
 
static void ConvertToSpiceMarkup(wxString *aNetName)
Remove formatting wrappers and replace illegal spice net name characters with underscores.
 
A holder to handle information on schematic or board items.
 
UNDO_REDO GetPickedItemStatus(unsigned int aIdx) const
 
EDA_ITEM * GetPickedItemLink(unsigned int aIdx) const
 
unsigned GetCount() const
 
BASE_SCREEN * GetScreenForItem(unsigned int aIdx) const
 
EDA_ITEM * GetPickedItem(unsigned int aIdx) const
 
A small class to help profiling.
 
void Stop()
Save the time when this function was called, and set the counter stane to stop.
 
double msecs(bool aSinceLast=false)
 
A progress reporter interface for use in multi-threaded environments.
 
The backing store for a PROJECT, in JSON format.
 
Container for project specific data.
 
const wxString & Name() const
 
static PROPERTY_MANAGER & Instance()
 
void UnregisterListeners(TYPE_ID aType)
 
void RegisterListener(TYPE_ID aType, PROPERTY_LISTENER aListenerFunc)
Registers a listener for the given type.
 
wxString GetSettingsKey() const
 
virtual void OnSchItemsRemoved(SCHEMATIC &aSch, std::vector< SCH_ITEM * > &aSchItem)
 
virtual void OnSchItemsChanged(SCHEMATIC &aSch, std::vector< SCH_ITEM * > &aSchItem)
 
virtual void OnSchSheetChanged(SCHEMATIC &aSch)
 
virtual void OnSchItemsAdded(SCHEMATIC &aSch, std::vector< SCH_ITEM * > &aSchItem)
 
These are loaded from Eeschema settings but then overwritten by the project settings.
 
bool m_IntersheetRefsShow
 
void SetCurrentVariant(const wxString &aVariantName)
 
void Reset()
Initialize this schematic to a blank one, unloading anything existing.
 
std::set< const SCH_SCREEN * > GetSchematicsSharedByMultipleProjects() const
Return a list of schematic files in the current project that contain instance data for multiple proje...
 
void CreateDefaultScreens()
 
void SetLegacySymbolInstanceData()
Update the symbol value and footprint instance data for legacy designs.
 
void OnItemsAdded(std::vector< SCH_ITEM * > &aNewItems)
Must be used if Add() is used using a BULK_x ADD_MODE to generate a change event for listeners.
 
CONNECTION_GRAPH * m_connectionGraph
Hold and calculate connectivity information of this schematic.
 
bool IsTopLevelSheet(const SCH_SHEET *aSheet) const
Check if a sheet is a top-level sheet (direct child of virtual root).
 
void loadBusAliasesFromProject()
 
void AddTopLevelSheet(SCH_SHEET *aSheet)
Add a new top-level sheet to the schematic.
 
SCH_SHEET_LIST m_hierarchy
Cache of the entire schematic hierarchy sorted by sheet page number.
 
void ResolveERCExclusionsPostUpdate()
Update markers to match recorded exclusions.
 
void RecomputeIntersheetRefs()
Update the schematic's page reference map for all global labels, and refresh the labels so that they ...
 
void CacheExistingAnnotation()
Store all existing annotations in the REFDES_TRACKER.
 
SCH_SHEET_LIST BuildSheetListSortedByPageNumbers() const
 
void RemoveListener(SCHEMATIC_LISTENER *aListener)
Remove the specified listener.
 
bool IsComplexHierarchy() const
Test if the schematic is a complex hierarchy.
 
void OnSchSheetChanged()
Notify the schematic and its listeners that the current sheet has been changed.
 
wxString GetFileName() const
Helper to retrieve the filename from the root sheet screen.
 
SCH_SHEET_PATH * m_currentSheet
The sheet path of the sheet currently being edited or displayed.
 
std::vector< SCH_SHEET * > m_topLevelSheets
List of top-level sheets (direct children of virtual root)
 
wxString GetOperatingPoint(const wxString &aNetName, int aPrecision, const wxString &aRange)
 
void CleanUp(SCH_COMMIT *aCommit, SCH_SCREEN *aScreen=nullptr)
Perform routine schematic cleaning including breaking wire and buses and deleting identical objects s...
 
void OnItemsRemoved(std::vector< SCH_ITEM * > &aRemovedItems)
Must be used if Remove() is used using a BULK_x REMOVE_MODE to generate a change event for listeners.
 
std::shared_ptr< BUS_ALIAS > GetBusAlias(const wxString &aLabel) const
Return a pointer to a bus alias object for the given label, or null if one doesn't exist.
 
std::vector< SCH_MARKER * > ResolveERCExclusions()
 
void EmbedFonts() override
Embed fonts in the schematic.
 
SCHEMATIC_SETTINGS & Settings() const
 
SCH_SCREEN * GetCurrentScreen() const
 
wxString ConvertKIIDsToRefs(const wxString &aSource) const
 
SCH_ITEM * ResolveItem(const KIID &aID, SCH_SHEET_PATH *aPathOut=nullptr, bool aAllowNullptrReturn=false) const
 
void RecordERCExclusions()
Scan existing markers and record data from any that are Excluded.
 
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
 
wxString m_currentVariant
 
std::map< wxString, std::set< int > > & GetPageRefsMap()
 
SCH_SHEET_LIST BuildUnorderedSheetList() const
 
void DeleteVariant(const wxString &aVariantName)
Delete all information for aVariantName.
 
void FixupJunctionsAfterImport()
Add junctions to this schematic where required.
 
std::set< KIFONT::OUTLINE_FONT * > GetFonts() const override
Get a set of fonts used in the schematic.
 
bool RemoveTopLevelSheet(SCH_SHEET *aSheet)
Remove a top-level sheet from the schematic.
 
bool Contains(const SCH_REFERENCE &aRef) const
Check if the schematic contains the specified reference.
 
wxString ConvertRefsToKIIDs(const wxString &aSource) const
 
void SetRoot(SCH_SHEET *aRootSheet)
Initialize the schematic with a new root sheet.
 
void SetProject(PROJECT *aPrj)
 
wxString GetCurrentVariant() const
Return the current variant being edited.
 
void AddListener(SCHEMATIC_LISTENER *aListener)
Add a listener to the schematic to receive calls whenever something on the schematic has been modifie...
 
std::map< int, wxString > GetVirtualPageToSheetPagesMap() const
 
EMBEDDED_FILES * GetEmbeddedFiles() override
 
CONNECTION_GRAPH * ConnectionGraph() const
 
SCH_SCREEN * RootScreen() const
Helper to retrieve the screen of the root sheet.
 
bool ResolveTextVar(const SCH_SHEET_PATH *aSheetPath, wxString *token, int aDepth) const
 
std::set< wxString > GetNetClassAssignmentCandidates()
Return the set of netname candidates for netclass assignment.
 
std::vector< std::shared_ptr< BUS_ALIAS > > m_busAliases
 
void InvokeListeners(Func &&aFunc, Args &&... args)
 
bool IsValid() const
A simple test if the schematic is loaded, not a complete one.
 
void updateProjectBusAliases()
 
static bool m_IsSchematicExists
True if a SCHEMATIC exists, false if not.
 
void RemoveAllListeners()
Remove all listeners.
 
void GetContextualTextVars(wxArrayString *aVars) const
 
std::map< int, wxString > GetVirtualPageToSheetNamesMap() const
 
void AddBusAlias(std::shared_ptr< BUS_ALIAS > aAlias)
 
std::vector< SCH_SHEET * > GetTopLevelSheets() const
Get the list of top-level sheets.
 
wxArrayString GetVariantNamesForUI() const
Return an array of variant names for using in wxWidgets UI controls.
 
void RunOnNestedEmbeddedFiles(const std::function< void(EMBEDDED_FILES *)> &aFunction) override
Provide access to nested embedded files, such as symbols in schematics and footprints in boards.
 
SCHEMATIC_HOLDER * m_schematicHolder
What currently "Holds" the schematic, i.e.
 
wxString GetUniqueFilenameForCurrentSheet()
Get the unique file name for the current sheet.
 
void SetSheetNumberAndCount()
Set the m_ScreenNumber and m_NumberOfScreens members for screens.
 
void SetBusAliases(const std::vector< std::shared_ptr< BUS_ALIAS > > &aAliases)
 
std::vector< SCHEMATIC_LISTENER * > m_listeners
Currently installed listeners.
 
SCH_SHEET_PATH & CurrentSheet() const
 
bool ResolveCrossReference(wxString *token, int aDepth) const
Resolves text vars that refer to other items.
 
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags, TOOL_MANAGER *aToolManager, PROGRESS_REPORTER *aProgressReporter=nullptr, KIGFX::SCH_VIEW *aSchView=nullptr, std::function< void(SCH_ITEM *)> *aChangedItemHandler=nullptr, PICKED_ITEMS_LIST *aLastChangeList=nullptr)
Generate the connection data for the entire schematic hierarchy.
 
void SaveToHistory(const wxString &aProjectPath, std::vector< wxString > &aFiles)
Save schematic files to the .history directory.
 
std::map< wxString, double > m_operatingPoints
Simulation operating points for text variable substitution.
 
ERC_SETTINGS & ErcSettings() const
 
std::set< wxString > m_variantNames
 
void OnItemsChanged(std::vector< SCH_ITEM * > &aItems)
Notify the schematic and its listeners that an item on the schematic has been modified in some way.
 
SCH_SHEET * m_rootSheet
The virtual root sheet (has no screen, contains all top-level sheets)
 
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Execute the changes.
 
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
 
wxString Name(bool aIgnoreSheet=false) const
 
Base class for any item which can be embedded within the SCHEMATIC container class,...
 
virtual bool IsConnectable() const
 
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
 
VECTOR2I GetPosition() const override
 
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const override
 
Segment description base class to describe items which have 2 end points (track, wire,...
 
SCH_LINE * NonGroupAware_BreakAt(const VECTOR2I &aPoint)
This version should only be used when importing files.
 
bool IsParallel(const SCH_LINE *aLine) const
 
VECTOR2I GetEndPoint() const
 
VECTOR2I GetStartPoint() const
 
SCH_LINE * MergeOverlap(SCH_SCREEN *aScreen, SCH_LINE *aLine, bool aCheckJunctions)
Check line against aLine to see if it overlaps and merge if it does.
 
bool IsStrokeEquivalent(const SCH_LINE *aLine)
 
bool IsEndPoint(const VECTOR2I &aPoint) const override
Test if aPt is an end point of this schematic object.
 
static SCH_MARKER * DeserializeFromString(const SCH_SHEET_LIST &aSheetList, const wxString &data)
 
wxString SerializeToString() const
 
bool IsLegacyMarker() const
Determine if this marker is legacy (i.e.
 
VECTOR2I GetPosition() const override
 
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
 
A helper to define a symbol's reference designator in a schematic.
 
virtual std::vector< SHAPE * > MakeEffectiveShapes(bool aEdgeOnly=false) const override
Make a set of SHAPE objects representing the EDA_SHAPE.
 
const std::unordered_set< SCH_ITEM * > & GetContainedItems() const
Return a set of all items contained within the rule area.
 
static std::vector< std::pair< SCH_RULE_AREA *, SCH_SCREEN * > > UpdateRuleAreasInScreens(std::unordered_set< SCH_SCREEN * > &screens, KIGFX::SCH_VIEW *view)
Update all rule area connectvity / caches in the given sheet paths.
 
const std::unordered_set< KIID > & GetPastContainedItems() const
 
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
 
void DeleteVariant(const wxString &aVariantName)
 
std::set< wxString > GetVariantNames() const
 
void SetLegacySymbolInstanceData()
Update the symbol value and footprint instance data for legacy designs.
 
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
 
bool IsExplicitJunction(const VECTOR2I &aPosition) const
Indicate that a junction dot is necessary at the given location.
 
EE_RTREE & Items()
Get the full RTree, usually for iterating.
 
const wxString & GetFileName() const
 
const KIID & GetUuid() const
 
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
 
const TITLE_BLOCK & GetTitleBlock() const
 
void Update(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Update aItem's bounding box in the tree.
 
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
 
std::optional< SCH_SHEET_PATH > GetSheetPathByKIIDPath(const KIID_PATH &aPath, bool aIncludeLastSheet=true) const
Finds a SCH_SHEET_PATH that matches the provided KIID_PATH.
 
SCH_ITEM * ResolveItem(const KIID &aID, SCH_SHEET_PATH *aPathOut=nullptr, bool aAllowNullptrReturn=false) const
Fetch a SCH_ITEM by ID.
 
void SortByPageNumbers(bool aUpdateVirtualPageNums=true)
Sort the list of sheets by page number.
 
void GetSymbols(SCH_REFERENCE_LIST &aReferences, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanSymbols=false) const
Add a SCH_REFERENCE object to aReferences for each symbol in the list of sheets.
 
void BuildSheetList(SCH_SHEET *aSheet, bool aCheckIntegrity)
Build the list of sheets and their sheet path from aSheet.
 
bool HasPath(const KIID_PATH &aPath) const
 
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
 
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.
 
SCH_SCREEN * LastScreen()
 
wxString GetPageNumber() const
 
SCH_SHEET * at(size_t aIndex) const
Forwarded method from std::vector.
 
void SetVirtualPageNumber(int aPageNumber)
Set the sheet instance virtual page number.
 
void SetPageNumber(const wxString &aPageNumber)
Set the sheet instance user definable page number.
 
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
 
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
 
size_t size() const
Forwarded method from std::vector.
 
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
 
int CountSheets() const
Count the number of sheets found in "this" sheet including all of the subsheets.
 
SCH_SCREEN * GetScreen() const
 
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
 
std::vector< SCH_SHEET_PIN * > & GetPins()
 
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the sheet.
 
const std::vector< SCH_SYMBOL_INSTANCE > & GetInstances() const
 
void SetRef(const SCH_SHEET_PATH *aSheet, const wxString &aReference)
Set the reference for the given sheet path for this symbol.
 
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the symbol.
 
std::vector< SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet) const
Retrieve a list of the SCH_PINs for the given sheet path.
 
const LIB_ID & GetLibId() const override
 
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
 
bool CollideEdge(const VECTOR2I &aPoint, VERTEX_INDEX *aClosestVertex=nullptr, int aClearance=0) const
Check whether aPoint collides with any edge of any of the contours of the polygon.
 
Helper class to recognize Spice formatted values.
 
wxString ToString() const
Return string value as when converting double to string (e.g.
 
bool TextVarResolver(wxString *aToken, const PROJECT *aProject, int aFlags=0) const
 
static void GetContextualTextVars(wxArrayString *aVars)
 
static bool empty(const wxTextEntryBase *aCtrl)
 
#define STRUCT_DELETED
flag indication structures to be erased
 
const wxChar *const traceSchCurrentSheet
Flag to enable debug output of current sheet tracking in the schematic editor.
 
const wxChar *const traceAutoSave
Flag to enable auto save feature debug tracing.
 
const wxChar *const traceSchSheetPaths
Flag to enable debug output of schematic symbol sheet path manipulation code.
 
void ignore_unused(const T &)
 
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
 
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
 
void for_all_pairs(_InputIterator __first, _InputIterator __last, _Function __f)
Apply a function to every possible pair of elements of a sequence.
 
void CollectOtherUnits(const wxString &aRef, int aUnit, const LIB_ID &aLibId, SCH_SHEET_PATH &aSheet, std::vector< SCH_SYMBOL * > *otherUnits)
 
wxString GetDefaultVariantName()
 
A simple container for schematic symbol instance information.
 
@ 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".
 
wxLogTrace helper definitions.
 
VECTOR2< int32_t > VECTOR2I