111                 wxT( 
"SCH_SCREEN must have a SCHEMATIC parent!" ) );
 
 
  119    for( 
const std::pair<const wxString, LIB_SYMBOL*>& libSymbol : 
m_libSymbols )
 
  120        delete libSymbol.second;
 
 
  144    wxCHECK_RET( 
m_refCount != 0, wxT( 
"Screen reference count already zero.  Bad programmer!" ) );
 
 
  153    return sheets.
begin() != sheets.
end();
 
 
  198                        std::vector<wxString> matches;
 
  201                        foundSymbol = 
nullptr;
 
  203                        for( 
const wxString& libSymbolName : matches )
 
  210                            foundSymbol = it->second;
 
  212                            wxCHECK2( foundSymbol, 
continue );
 
  222                                newName = libSymbolName;
 
  228                            foundSymbol = 
nullptr;
 
  235                            newName.Printf( wxT( 
"%s_%d" ),
 
  242                                newName.Printf( wxT( 
"%s_%d" ),
 
  256                            LIB_ID newLibId( wxEmptyString, newName );
 
  260                            newLibSymbol->
SetName( newName );
 
 
  277    wxCHECK_RET( aScreen, 
"Invalid screen object." );
 
  284    aScreen->
Clear( 
false );
 
 
  311    std::vector<SCH_ITEM*> delete_list;
 
  313    std::copy_if( 
m_rtree.begin(), 
m_rtree.end(), std::back_inserter( delete_list ),
 
  316                return ( aItem->Type() != SCH_SHEET_PIN_T && aItem->Type() != SCH_FIELD_T );
 
 
  328    if( 
Remove( aItem, aUpdateLibSymbol ) )
 
  329        Append( aItem, aUpdateLibSymbol );
 
 
  335    bool retv = 
m_rtree.remove( aItem );
 
  342        bool removeUnusedLibSymbol = 
true;
 
  350                removeUnusedLibSymbol = 
false;
 
  355        if( removeUnusedLibSymbol )
 
 
  373    wxCHECK_RET( aItem, wxT( 
"Cannot delete invalid item from screen." ) );
 
  387        wxCHECK_RET( sheet, wxT( 
"Sheet pin parent not properly set, bad programmer!" ) );
 
 
  398    return m_rtree.contains( aItem, 
true );
 
 
  410        if( item->HitTest( aPosition, aAccuracy ) )
 
 
  420#define PROCESSED CANDIDATE      
  422    std::set<SCH_ITEM*>   retval;
 
  423    std::stack<SCH_ITEM*> toSearch;
 
  425    auto getItemEndpoints = []( 
SCH_ITEM* aCandidate ) -> std::vector<VECTOR2I>
 
  453    if( !aItem || getItemEndpoints( aItem ).
empty() )
 
  456    toSearch.push( aItem );
 
  458    while( !toSearch.empty() )
 
  472            for( 
SCH_ITEM* candidate : 
Items().Overlapping( type, bbox ) )
 
  477                std::vector<VECTOR2I> endpoints = getItemEndpoints( candidate );
 
  479                if( endpoints.empty() )
 
  483                if( item->
GetLayer() != candidate->GetLayer() )
 
  486                bool sharesEndpoint = 
false;
 
  488                for( 
const VECTOR2I& pt : endpoints )
 
  492                        sharesEndpoint = 
true;
 
  499                                retval.insert( junction );
 
  504                if( !sharesEndpoint )
 
  507                toSearch.push( candidate );
 
  508                retval.insert( candidate );
 
  514        item->ClearTempFlags();
 
 
  524    return info.isJunction;
 
 
  533    return info.isJunction && ( !
info.hasBusEntry || 
info.hasBusEntryToMultipleWires );
 
 
  542    return info.isJunction && ( !
info.hasBusEntry || 
info.hasBusEntryToMultipleWires )
 
  543           && !
info.hasExplicitJunctionDot;
 
 
  552    return info.isJunction && (!
info.hasBusEntry || 
info.hasBusEntryToMultipleWires );
 
 
  560    auto ret = aDefaultOrientation;
 
  567        switch( item->Type() )
 
  572            if( busEntry->m_connected_bus_item )
 
  576                auto bus = 
static_cast<const SCH_LINE*
>( busEntry->m_connected_bus_item );
 
  577                if( bus->Angle().AsDegrees() == 90.0 )
 
  581                    if( aPosition.
x < bus->GetPosition().x )
 
  583                    else if( aPosition.
x > bus->GetPosition().x )
 
  586                else if( bus->Angle().AsDegrees() == 0.0 )
 
  590                    if( aPosition.
y < bus->GetPosition().y )
 
  592                    else if( aPosition.
y > bus->GetPosition().y )
 
  601            auto line = 
static_cast<const SCH_LINE*
>( item );
 
  605            if( -45 < angle && angle <= 45 )
 
  607                if( line->GetStartPoint().x <= line->GetEndPoint().x )
 
  614                if( line->GetStartPoint().y <= line->GetEndPoint().y )
 
  628                if( 
pin->GetPosition() == aPosition )
 
 
  648                 wxT( 
"Invalid layer type passed to SCH_SCREEN::IsTerminalPoint()." ) );
 
  661        if( sheetPin && sheetPin->
IsConnected( aPosition ) )
 
  684        if( 
GetPin( aPosition, 
nullptr, 
true ) )
 
  697        if( sheetPin && sheetPin->
IsConnected( aPosition ) )
 
 
  712    wxCHECK_RET( 
Schematic(), 
"Cannot call SCH_SCREEN::UpdateSymbolLinks with no SCHEMATIC" );
 
  715    std::vector<SCH_SYMBOL*> symbols;
 
  722        symbols.push_back( 
static_cast<SCH_SYMBOL*
>( item ) );
 
  736        auto it = 
m_libSymbols.find( symbol->GetSchSymbolLibraryName() );
 
  742                msg.Printf( 
_( 
"Setting schematic symbol '%s %s' library identifier to '%s'." ),
 
  750            symbol->SetLibSymbol( 
new LIB_SYMBOL( *it->second ) );
 
  754        if( !symbol->GetLibId().IsValid() )
 
  758                msg.Printf( 
_( 
"Schematic symbol reference '%s' library identifier is not valid. " 
  759                               "Unable to link library symbol." ),
 
  770        if( !libs->
HasLibrary( symbol->GetLibId().GetLibNickname() ) && !legacyLibs )
 
  774                msg.Printf( 
_( 
"Symbol library '%s' not found and no fallback cache library " 
  775                               "available.  Unable to link library symbol." ),
 
  776                            symbol->GetLibId().GetLibNickname().wx_str() );
 
  783        if( libs->
HasLibrary( symbol->GetLibId().GetLibNickname() ) )
 
  793                    msg.Printf( 
_( 
"I/O error %s resolving library symbol %s" ), ioe.
What(),
 
  805            wxCHECK2( legacyCacheLib.
IsCache(), 
continue );
 
  807            wxString 
id = symbol->GetLibId().Format();
 
  809            id.Replace( 
':', 
'_' );
 
  813                msg.Printf( 
_( 
"Falling back to cache to set symbol '%s:%s' link '%s'." ),
 
  826            std::unique_ptr<LIB_SYMBOL> libSymbol = tmp->
Flatten();
 
  827            libSymbol->SetParent();
 
  829            m_libSymbols.insert( { symbol->GetSchSymbolLibraryName(),
 
  834                msg.Printf( 
_( 
"Setting schematic symbol '%s %s' library identifier to '%s'." ),
 
  841            symbol->SetLibSymbol( libSymbol.release() );
 
  847                msg.Printf( 
_( 
"No library symbol found for schematic symbol '%s %s'." ),
 
 
  864    std::vector<SCH_SYMBOL*> symbols;
 
  867        symbols.push_back( 
static_cast<SCH_SYMBOL*
>( item ) );
 
  874        auto it = 
m_libSymbols.find( symbol->GetSchSymbolLibraryName() );
 
  877            symbol->SetLibSymbol( 
new LIB_SYMBOL( *it->second ) );
 
  879            symbol->SetLibSymbol( 
nullptr );
 
 
  889        item->SetConnectivityDirty( 
true );
 
 
  896    std::vector<SCH_ITEM*>   junctions;
 
  897    std::vector<SCH_ITEM*>   bitmaps;
 
  898    std::vector<SCH_SYMBOL*> symbols;
 
  899    std::vector<SCH_ITEM*>   other;
 
  903        if( item->IsMoving() )
 
  907            junctions.push_back( item );
 
  909            bitmaps.push_back( item );
 
  911            other.push_back( item );
 
  922                    symbols.push_back( 
static_cast<SCH_SYMBOL*
>( item ) );
 
  930    std::sort( other.begin(), other.end(),
 
  933                    if( a->Type() == b->Type() )
 
  934                        return a->GetLayer() > b->GetLayer();
 
  936                    return a->Type() > b->Type();
 
  940    constexpr bool background = 
true;
 
  948        item->Plot( aPlotter, background, aPlotOpts, 0, 0, { 0, 0 }, false );
 
  955        item->Plot( aPlotter, background, aPlotOpts, 0, 0, { 0, 0 }, false );
 
  961        double   lineWidth = item->GetEffectivePenWidth( renderSettings );
 
  965            item->Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
 
  972                item->Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
 
  979                for( 
size_t ii = 1; ii < curr_wire_shape.size(); ii++ )
 
  981                    VECTOR2I start( curr_wire_shape[ii-1].x, curr_wire_shape[ii-1].y );
 
  983                    if( curr_wire_shape[ii-1].z == 0 )  
 
  986                        VECTOR2I end( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
 
  991                        curr_line.
Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
 
  995                        VECTOR2I arc_middle( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
 
  997                        VECTOR2I arc_end( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
 
 1005                        arc.
Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
 
 1014    TRANSFORM savedTransform = renderSettings->m_Transform;
 
 1018        renderSettings->m_Transform = sym->GetTransform();
 
 1021        for( 
SCH_FIELD field : sym->GetFields() )
 
 1023            field.ClearRenderCache();
 
 1024            field.Plot( aPlotter, 
false, aPlotOpts, sym->GetUnit(), sym->GetBodyStyle(), { 0, 0 },
 
 1027            if( sym->IsSymbolLikePowerLocalLabel() && field.GetId() == 
FIELD_T::VALUE 
 1028                && ( field.IsVisible() || field.IsForceVisible() ) )
 
 1030                sym->PlotLocalPowerIconShape( aPlotter );
 
 1034        sym->PlotPins( aPlotter );
 
 1036        if( 
static_cast<const SYMBOL*
>( sym )->GetDNP() )
 
 1037            sym->PlotDNP( aPlotter );
 
 1040    renderSettings->m_Transform = savedTransform;
 
 1045        item->Plot( aPlotter, !background, aPlotOpts, 0, 0, { 0, 0 }, false );
 
 
 1053        item->ClearTempFlags();
 
 
 1058                             bool aEndPointOnly )
 const 
 1065        candidate = 
static_cast<SCH_SYMBOL*
>( item );
 
 1095    if( 
pin && aSymbol )
 
 1096        *aSymbol = candidate;
 
 
 1110        sheetPin = sheet->
GetPin( aPosition );
 
 
 1126        if( ( item->Type() != 
SCH_JUNCTION_T || aTestJunctions ) && item->IsConnected( aPos ) )
 
 
 1164    static const std::vector<KICAD_T> hierarchicalTypes = { 
SCH_SYMBOL_T,
 
 1170        if( item->IsType( hierarchicalTypes ) )
 
 1171            aItems->push_back( item );
 
 
 1179        aItems->push_back( item );
 
 1181    std::sort( aItems->begin(), aItems->end(),
 
 1184                   if( a->GetPosition().x == b->GetPosition().x )
 
 1187                       if( a->GetPosition().y == b->GetPosition().y )
 
 1188                           return a->m_Uuid < b->m_Uuid;
 
 1190                       return a->GetPosition().y < b->GetPosition().y;
 
 1194                       return a->GetPosition().x < b->GetPosition().x;
 
 
 1201                                   std::function<
void( 
SCH_ITEM* )>* aChangedHandler )
 const 
 1205    std::vector<DANGLING_END_ITEM> endPointsByPos;
 
 1206    std::vector<DANGLING_END_ITEM> endPointsByType;
 
 1211                if( item->IsConnectable() )
 
 1212                    item->GetEndPoints( endPointsByType );
 
 1218                if( item->UpdateDanglingState( endPointsByType, endPointsByPos, aPath ) )
 
 1220                    if( aChangedHandler )
 
 1221                        ( *aChangedHandler )( item );
 
 1231    PROF_TIMER sortTimer( 
"SCH_SCREEN::TestDanglingEnds pre-sort" );
 
 1232    endPointsByPos = endPointsByType;
 
 1241        update_state( item );
 
 
 1254    aAccuracy = std::max( aAccuracy, 1 );
 
 1256    for( 
SCH_ITEM* item : 
Items().Overlapping( aPosition, aAccuracy ) )
 
 1261        if( item->GetLayer() != aLayer )
 
 1264        if( !item->HitTest( aPosition, aAccuracy ) )
 
 1267        switch( aSearchType )
 
 1273            if( !( (
SCH_LINE*) item )->IsEndPoint( aPosition ) )
 
 1278            if( ( (
SCH_LINE*) item )->IsEndPoint( aPosition ) )
 
 
 1288                                                     bool            aIgnoreEndpoints )
 const 
 1290    std::vector<SCH_LINE*> retVal;
 
 1294        if( item->IsType( { SCH_ITEM_LOCATE_WIRE_T, SCH_ITEM_LOCATE_BUS_T } ) )
 
 1298            if( aIgnoreEndpoints && wire->
IsEndPoint( aPosition ) )
 
 1302                retVal.push_back( wire );
 
 
 1312    std::vector<VECTOR2I> retval;
 
 1319            std::vector<VECTOR2I> pts = item->GetConnectionPoints();
 
 1320            retval.insert( retval.end(), pts.begin(), pts.end() );
 
 1325    std::sort( retval.begin(), retval.end(),
 
 1328                   return a.x < b.x || ( a.x == b.x && a.y < b.y );
 
 1331    retval.erase( std::unique( retval.begin(), retval.end() ), retval.end() );
 
 
 1339    std::vector<VECTOR2I> pts;
 
 1342    for( 
const EDA_ITEM* edaItem : aItems )
 
 1350        pts.insert( pts.end(), new_pts.begin(), new_pts.end() );
 
 1358            for( 
const VECTOR2I& pt : connections )
 
 1361                    pts.push_back( pt );
 
 1367    std::sort( pts.begin(), pts.end(),
 
 1370                   return a.x < b.x || ( a.x == b.x && a.y < b.y );
 
 1373    pts.erase( unique( pts.begin(), pts.end() ), pts.end() );
 
 1376    pts.erase( std::remove_if( pts.begin(), pts.end(),
 
 1377                               [
this]( 
const VECTOR2I& a ) -> 
bool 
 1379                                   return !IsExplicitJunctionNeeded( a );
 
 
 1389    for( 
SCH_ITEM* item : 
Items().Overlapping( aPosition, aAccuracy ) )
 
 1391        switch( item->Type() )
 
 1397            if( item->HitTest( aPosition, aAccuracy ) )
 
 
 1413    wxCHECK( aLibSymbol,  );
 
 
 1437        for( 
auto& [filename, embeddedFile] : libSym->EmbeddedFileMap() )
 
 1445                embeddedFile->data_hash = file->
data_hash;
 
 1446                embeddedFile->is_valid = file->
is_valid;
 
 1450        libSym->RunOnChildren(
 
 1454                        textItem->ResolveFont( embeddedFonts );
 
 1459    std::vector<SCH_ITEM*> items_to_update;
 
 1463        bool update = 
false;
 
 1466            update |= textItem->ResolveFont( embeddedFonts );
 
 1468        item->RunOnChildren(
 
 1472                        update |= textItem->ResolveFont( embeddedFonts );
 
 1477            items_to_update.push_back( item );
 
 1480    for( 
SCH_ITEM* item : items_to_update )
 
 
 1488        schematic->AddBusAlias( aAlias );
 
 
 1529                                            std::vector<wxString>& aMatches )
 
 1534        aMatches.emplace_back( searchName );
 
 1543        if( pair.first.StartsWith( searchName, &suffix ) && suffix.ToLong( &tmp ) )
 
 1544            aMatches.emplace_back( pair.first );
 
 1547    return aMatches.size();
 
 
 1559    if( aProjectName.IsEmpty() )
 
 1566        wxCHECK2( symbol, 
continue );
 
 1568        std::set<KIID_PATH> pathsToPrune;
 
 1569        const std::vector<SCH_SYMBOL_INSTANCE> instances = symbol->
GetInstances();
 
 1574            if( aProjectName != instance.m_ProjectName )
 
 1577            std::optional<SCH_SHEET_PATH> pathFound =
 
 1583                pathsToPrune.emplace( instance.m_Path );
 
 1584            else if( pathFound.value().LastScreen() != 
this )
 
 1585                pathsToPrune.emplace( pathFound.value().Path() );
 
 1588        for( 
const KIID_PATH& sheetPath : pathsToPrune )
 
 1591                        aProjectName, sheetPath.AsString() );
 
 
 1606    if( aProjectName.IsEmpty() )
 
 1613        wxCHECK2( sheet, 
continue );
 
 1615        std::set<KIID_PATH> pathsToPrune;
 
 1616        const std::vector<SCH_SHEET_INSTANCE> instances = sheet->
GetInstances();
 
 1621            if( aProjectName != instance.m_ProjectName )
 
 1624            std::optional<SCH_SHEET_PATH> pathFound =
 
 1630                pathsToPrune.emplace( instance.m_Path );
 
 1631            else if( pathFound.value().LastScreen() != 
this )
 
 1632                pathsToPrune.emplace( pathFound.value().Path() );
 
 1635        for( 
const KIID_PATH& sheetPath : pathsToPrune )
 
 1638                        aProjectName, sheetPath.AsString() );
 
 
 1647    wxString trimmedFieldName;
 
 1653        wxCHECK2( symbol, 
continue );
 
 1657            trimmedFieldName = field.GetName();
 
 1658            trimmedFieldName.Trim();
 
 1659            trimmedFieldName.Trim( 
false );
 
 1661            if( field.GetName() != trimmedFieldName )
 
 
 1672    std::set<wxString> retv;
 
 1678        wxCHECK2( sheet, 
continue );
 
 1680        retv.emplace( sheet->
GetName() );
 
 
 1697        const std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = symbol->
GetInstances();
 
 1701            if( !hierarchy.
HasPath( instance.m_Path ) )
 
 
 1718        return wxEmptyString;
 
 
 1737    std::unordered_set<EDA_GROUP*> knownCycleFreeGroups;
 
 1739    std::unordered_set<EDA_GROUP*> currentChainGroups;
 
 1741    std::unordered_set<EDA_GROUP*> toCheckGroups;
 
 1745        toCheckGroups.insert( 
static_cast<SCH_GROUP*
>( item ) );
 
 1747    while( !toCheckGroups.empty() )
 
 1749        currentChainGroups.clear();
 
 1754            if( currentChainGroups.find( 
group ) != currentChainGroups.end() )
 
 1759                return "Cycle detected in group membership";
 
 1761            else if( knownCycleFreeGroups.find( 
group ) != knownCycleFreeGroups.end() )
 
 1767            currentChainGroups.insert( 
group );
 
 1769            toCheckGroups.erase( 
group );
 
 1771            group = 
group->AsEdaItem()->GetParentGroup();
 
 1782        knownCycleFreeGroups.insert( currentChainGroups.begin(), currentChainGroups.end() );
 
 
 1795    wxFileName thisProjectFn( 
Schematic()->Project().GetProjectFullName() );
 
 1797    wxCHECK( thisProjectFn.IsAbsolute(), 
false );
 
 1799    if( thisScreenFn.GetDirCount() < thisProjectFn.GetDirCount() )
 
 1802    while( thisProjectFn.GetDirCount() != thisScreenFn.GetDirCount() )
 
 1803        thisScreenFn.RemoveLastDir();
 
 1805    return thisScreenFn.GetPath() == thisProjectFn.GetPath();
 
 
 1811    std::set<wxString> variantNames;
 
 1817        wxCHECK2( symbol, 
continue );
 
 1819        const std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = symbol->
GetInstances();
 
 1823            for( 
const auto& [
name, variant] : instance.m_Variants )
 
 1824                variantNames.emplace( 
name );
 
 1832        wxCHECK2( sheet, 
continue );
 
 1834        const std::vector<SCH_SHEET_INSTANCE> sheetInstances = sheet->
GetInstances();
 
 1838            for( 
const auto& [
name, variant] : instance.m_Variants )
 
 1839                variantNames.emplace( 
name );
 
 1843    return variantNames;
 
 
 1849    wxCHECK( !aVariantName.IsEmpty(),  );
 
 1855        wxCHECK2( symbol, 
continue );
 
 1857        std::vector<SCH_SYMBOL_INSTANCE> symbolInstances = symbol->
GetInstances();
 
 1861            if( instance.m_Variants.contains( aVariantName ) )
 
 1862                instance.m_Variants.erase( aVariantName );
 
 1870        wxCHECK2( sheet, 
continue );
 
 1872        std::vector<SCH_SHEET_INSTANCE> sheetInstances = sheet->
GetInstances();
 
 1876            if( instance.m_Variants.contains( aVariantName ) )
 
 1877                instance.m_Variants.erase( aVariantName );
 
 
 1884void SCH_SCREEN::Show( 
int nestLevel, std::ostream& os )
 const 
 1887    NestedSpace( nestLevel, os ) << 
'<' << 
GetClass().Lower().mb_str() << 
">\n";
 
 1890        item->Show( nestLevel + 1, os );
 
 1892    NestedSpace( nestLevel, os ) << 
"</" << 
GetClass().Lower().mb_str() << 
">\n";
 
 1949    if( aScreen == 
nullptr )
 
 1954        if( screen == aScreen )
 
 
 1989    wxCHECK_RET( sch, 
"Null schematic in SCH_SCREENS::ClearAnnotationOfNewSheetPaths" );
 
 1999        bool path_exists = 
false;
 
 2001        for( 
const SCH_SHEET_PATH& existing_sheetpath: aInitialSheetPathList )
 
 2003            if( existing_sheetpath.Path() == sheetpath.Path() )
 
 2013            SCH_SCREEN* curr_screen = sheetpath.LastScreen();
 
 
 2028    std::vector<SCH_ITEM*> items;
 
 2033                             return a->
m_Uuid < b->m_Uuid;
 
 2036    std::set<
EDA_ITEM*, 
decltype( timestamp_cmp )> unique_stamps( timestamp_cmp );
 
 2039        screen->GetHierarchicalItems( &items );
 
 2041    if( items.size() < 2 )
 
 2046        if( !unique_stamps.insert( item ).second )
 
 2051            const_cast<KIID&
>( item->m_Uuid ) = 
KIID();
 
 
 2068        for( 
SCH_ITEM* item : screen->Items() )
 
 2069            item->ClearEditFlags();
 
 
 2080            if( item == aMarker )
 
 2082                screen->DeleteItem( item );
 
 
 2091                                 bool aIncludeExclusions )
 
 2095        std::vector<SCH_ITEM*> markers;
 
 2100            std::shared_ptr<RC_ITEM>rcItem = marker->
GetRCItem();
 
 2103                    && ( aErrorCode == 
ERCE_UNSPECIFIED || rcItem->GetErrorCode() == aErrorCode )
 
 2104                    && ( !marker->
IsExcluded() || aIncludeExclusions ) )
 
 2106                markers.push_back( item );
 
 2111            screen->DeleteItem( marker );
 
 
 2117                                    bool aIncludeExclusions )
 
 
 2126        screen->UpdateSymbolLinks( aReporter );
 
 2135    wxCHECK_RET( sch, 
"Null schematic in SCH_SCREENS::UpdateSymbolLinks" );
 
 
 2148    bool has_symbols = 
false;
 
 2163    return has_symbols ? true : 
false;
 
 
 2176            if( !nickname.
empty() && ( aLibNicknames.Index( nickname ) == wxNOT_FOUND ) )
 
 2177                aLibNicknames.Add( nickname );
 
 2181    return aLibNicknames.GetCount();
 
 
 2214        if( screen->GetFileName() == aSchematicFileName )
 
 
 2231    wxCHECK_RET( sch, 
"Null schematic in SCH_SCREENS::BuildClientSheetPathList" );
 
 2234        curr_screen->GetClientSheetPaths().clear();
 
 2238        SCH_SCREEN* used_screen = sheetpath.LastScreen();
 
 2243            if( used_screen == curr_screen )
 
 2245                curr_screen->GetClientSheetPaths().push_back( sheetpath );
 
 
 2256        screen->SetLegacySymbolInstanceData();
 
 
 2263        screen->FixLegacyPowerSymbolMismatches();
 
 
 2285    if( aProjectName.IsEmpty() )
 
 2289        screen->PruneOrphanedSymbolInstances( aProjectName, aValidSheetPaths );
 
 
 2296    if( aProjectName.IsEmpty() )
 
 2300        screen->PruneOrphanedSheetInstances( aProjectName, aValidSheetPaths );
 
 
 2308        if( screen->HasSymbolFieldNamesWithWhiteSpace() )
 
 
 2318    std::set<wxString> variantNames;
 
 2322        for( 
const wxString& variantName : screen->GetVariantNames() )
 
 2323            variantNames.emplace( variantName );
 
 2326    return variantNames;
 
 
 2332    wxCHECK( !aVariantName.IsEmpty(),  );
 
 2335        screen->DeleteVariant( aVariantName );
 
 
constexpr EDA_IU_SCALE schIUScale
 
int m_virtualPageNumber
An integer based page number used for printing a range of pages.
 
bool m_Center
Center on screen.
 
int m_pageCount
The number of BASE_SCREEN objects in this design.
 
BASE_SCREEN(EDA_ITEM *aParent, KICAD_T aType=SCREEN_T)
 
void SetContentModified(bool aModified=true)
 
void InitDataPoints(const VECTOR2I &aPageSizeInternalUnits)
 
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
 
constexpr void SetOrigin(const Vec &pos)
 
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.
 
static void sort_dangling_end_items(std::vector< DANGLING_END_ITEM > &aItemListByType, std::vector< DANGLING_END_ITEM > &aItemListByPos)
Both contain the same information.
 
A set of EDA_ITEMs (i.e., without duplicates).
 
A base class for most all the KiCad significant classes used in schematics and boards.
 
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
 
void SetFlags(EDA_ITEM_FLAGS aMask)
 
KICAD_T Type() const
Returns the type of object.
 
virtual void SetParent(EDA_ITEM *aParent)
 
EDA_ITEM * GetParent() const
 
bool HasFlag(EDA_ITEM_FLAGS aFlag) const
 
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
 
std::vector< VECTOR2I > GetPolyPoints() const
Duplicate the polygon outlines into a flat list of VECTOR2I points.
 
void SetLineStyle(const LINE_STYLE aStyle)
 
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
 
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
 
std::vector< VECTOR2I > GetRectCorners() const
 
void SetArcGeometry(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Set the three controlling points for an arc.
 
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
 
EE_TYPE OfType(KICAD_T aType) const
 
EMBEDDED_FILE * GetEmbeddedFile(const wxString &aName) const
Returns the embedded file with the given name or nullptr if it does not exist.
 
const std::vector< wxString > * UpdateFontFiles()
Helper function to get a list of fonts for fontconfig to add to the library.
 
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()
 
A collection of #SYMBOL_LIB objects.
 
Object used to load, save, search, and otherwise manipulate symbol library files.
 
LIB_SYMBOL * FindSymbol(const wxString &aName) const
Find LIB_SYMBOL by aName.
 
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library tables.
 
A logical library item identifier and consists of various portions much like a URI.
 
int SetLibNickname(const UTF8 &aLibNickname)
Override the logical library name portion of the LIB_ID to aLibNickname.
 
wxString GetUniStringLibId() const
 
const wxString GetUniStringLibItemName() const
Get strings for display messages in dialogs.
 
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
 
Define a library symbol object.
 
const LIB_ID & GetLibId() const override
 
LIB_ITEMS_CONTAINER & GetDrawItems()
Return a reference to the draw item list.
 
wxString GetName() const override
 
bool IsGlobalPower() const override
 
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
 
void SetLibId(const LIB_ID &aLibId)
 
virtual void SetName(const wxString &aName)
 
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
 
std::shared_ptr< RC_ITEM > GetRCItem() const
 
enum MARKER_T GetMarkerType() const
 
Base plotter engine class.
 
RENDER_SETTINGS * RenderSettings()
 
virtual void SetCurrentLineWidth(int width, void *aData=nullptr)=0
Set the line width for the next drawing.
 
A small class to help profiling.
 
void Show(std::ostream &aStream=std::cerr)
Print the elapsed time (in a suitable unit) to a stream.
 
void Stop()
Save the time when this function was called, and set the counter stane to stop.
 
static SYMBOL_LIBRARY_ADAPTER * SymbolLibAdapter(PROJECT *aProject)
Accessor for project symbol library manager adapter.
 
static LEGACY_SYMBOL_LIBS * LegacySchLibs(PROJECT *aProject)
Returns the list of symbol libraries from a legacy (pre-5.x) design This is only used from the remapp...
 
A pure virtual class used to derive REPORTER objects from.
 
virtual REPORTER & ReportTail(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)
Places the report at the end of the list, for objects that support report ordering.
 
Holds all the data relating to one schematic.
 
SCHEMATIC_SETTINGS & Settings() const
 
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
 
EMBEDDED_FILES * GetEmbeddedFiles() override
 
CONNECTION_GRAPH * ConnectionGraph() const
 
Class for a wire to bus entry.
 
A set of SCH_ITEMs (i.e., without duplicates).
 
Base class for any item which can be embedded within the SCHEMATIC container class,...
 
virtual bool IsEndPoint(const VECTOR2I &aPt) const
Test if aPt is an end point of this schematic object.
 
virtual bool IsConnectable() const
 
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
 
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
 
bool IsConnected(const VECTOR2I &aPoint) const
Test the item to see if it is connected to aPoint.
 
virtual std::vector< VECTOR2I > GetConnectionPoints() const
Add all the connection points for this item to aPoints.
 
Segment description base class to describe items which have 2 end points (track, wire,...
 
void SetStartPoint(const VECTOR2I &aPosition)
 
std::vector< VECTOR3I > BuildWireWithHopShape(const SCH_SCREEN *aScreen, double aArcRadius) const
For wires only: build the list of points to draw the shape using segments and 180 deg arcs Points are...
 
bool IsWire() const
Return true if the line is a wire.
 
EDA_ANGLE Angle() const
Get the angle between the start and end lines.
 
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.
 
VECTOR2I GetEndPoint() const
 
VECTOR2I GetStartPoint() const
 
bool IsEndPoint(const VECTOR2I &aPoint) const override
Test if aPt is an end point of this schematic object.
 
void SetEndPoint(const VECTOR2I &aPosition)
 
std::vector< SCH_SHEET * > m_sheets
 
SCH_SCREEN * GetScreen(unsigned int aIndex) const
 
void UpdateSymbolLinks(REPORTER *aReporter=nullptr)
Initialize the LIB_SYMBOL reference for each SCH_SYMBOL found in the full schematic.
 
void DeleteMarker(SCH_MARKER *aMarker)
Delete a specific marker.
 
void DeleteMarkers(enum MARKER_BASE::MARKER_T aMarkerTyp, int aErrorCode, bool aIncludeExclusions=true)
Delete all markers of a particular type and error code.
 
void buildScreenList(SCH_SHEET *aSheet)
 
void FixLegacyPowerSymbolMismatches()
Fix legacy power symbols that have mismatched value text fields and invisible power pin names.
 
void DeleteAllMarkers(enum MARKER_BASE::MARKER_T aMarkerType, bool aIncludeExclusions)
Delete all electronic rules check markers of aMarkerType from all the screens in the list.
 
void PruneOrphanedSheetInstances(const wxString &aProjectName, const SCH_SHEET_LIST &aValidSheetPaths)
 
int ChangeSymbolLibNickname(const wxString &aFrom, const wxString &aTo)
Change all of the symbol library nicknames.
 
SCH_SCREENS(SCH_SHEET *aSheet)
 
void BuildClientSheetPathList()
Build the list of sheet paths sharing a screen for each screen in use.
 
bool HasSymbolFieldNamesWithWhiteSpace() const
 
void ClearAnnotationOfNewSheetPaths(SCH_SHEET_LIST &aInitialSheetPathList)
Clear the annotation for the symbols inside new sheetpaths when a complex hierarchy is modified and n...
 
void DeleteVariant(const wxString &aVariantName)
 
void PruneOrphanedSymbolInstances(const wxString &aProjectName, const SCH_SHEET_LIST &aValidSheetPaths)
 
bool HasNoFullyDefinedLibIds()
Test all of the schematic symbols to see if all LIB_ID objects library nickname is not set.
 
SCH_SHEET * GetSheet(unsigned int aIndex) const
 
int ReplaceDuplicateTimeStamps()
Test all sheet and symbol objects in the schematic for duplicate time stamps and replaces them as nec...
 
std::set< wxString > GetVariantNames() const
 
std::vector< SCH_SCREEN * > m_screens
 
bool HasSchematic(const wxString &aSchematicFileName)
Check if one of the schematics in the list of screens is aSchematicFileName.
 
size_t GetLibNicknames(wxArrayString &aLibNicknames)
Fetch all of the symbol library nicknames into aLibNicknames.
 
void SetLegacySymbolInstanceData()
Update the symbol value and footprint instance data for legacy designs.
 
void addScreenToList(SCH_SCREEN *aScreen, SCH_SHEET *aSheet)
 
std::set< wxString > GetVariantNames() const
 
std::map< wxString, LIB_SYMBOL * > m_libSymbols
Library symbols required for this schematic.
 
SCH_PIN * GetPin(const VECTOR2I &aPosition, SCH_SYMBOL **aSymbol=nullptr, bool aEndPointOnly=false) const
Test the screen for a symbol pin item at aPosition.
 
bool m_fileExists
Flag to indicate the file associated with this screen has been created.
 
void ClearDrawingState()
Clear the state flags of all the items in the screen.
 
SCH_LINE * GetLine(const VECTOR2I &aPosition, int aAccuracy=0, int aLayer=LAYER_NOTES, SCH_LINE_TEST_T aSearchType=ENTIRE_LENGTH_T) const
Return a line item located at aPosition.
 
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
 
void AddLibSymbol(LIB_SYMBOL *aLibSymbol)
Add aLibSymbol to the library symbol map.
 
bool HasSymbolFieldNamesWithWhiteSpace() const
 
void AddBusAlias(std::shared_ptr< BUS_ALIAS > aAlias)
Add a bus alias definition.
 
void FixLegacyPowerSymbolMismatches()
Fix legacy power symbols that have mismatched value text fields and invisible power pin names.
 
bool HasItems(KICAD_T aItemType) const
 
void Clear(bool aFree=true)
Delete all draw items and clears the project settings.
 
bool HasInstanceDataFromOtherProjects() const
Check symbols for instance data from other projects.
 
void PruneOrphanedSymbolInstances(const wxString &aProjectName, const SCH_SHEET_LIST &aValidSheetPaths)
Remove all invalid symbol instance data in this screen object for the project defined by aProjectName...
 
std::vector< SCH_SHEET_PATH > & GetClientSheetPaths()
Return the number of times this screen is used.
 
void UpdateSymbolLinks(REPORTER *aReporter=nullptr)
Initialize the LIB_SYMBOL reference for each SCH_SYMBOL found in this schematic from the project #SYM...
 
SCH_LINE * GetWire(const VECTOR2I &aPosition, int aAccuracy=0, SCH_LINE_TEST_T aSearchType=ENTIRE_LENGTH_T) const
 
std::set< SCH_ITEM * > MarkConnections(SCH_ITEM *aItem, bool aSecondPass)
Return all wires and junctions connected to aItem which are not connected any symbol pin or all graph...
 
std::set< wxString > GetSheetNames() const
 
void TestDanglingEnds(const SCH_SHEET_PATH *aPath=nullptr, std::function< void(SCH_ITEM *)> *aChangedHandler=nullptr) const
Test all of the connectable objects in the schematic for unused connection points.
 
void EnsureAlternateReferencesExist()
For screens shared by many sheetpaths (complex hierarchies): to be able to clear or modify any refere...
 
void PruneOrphanedSheetInstances(const wxString &aProjectName, const SCH_SHEET_LIST &aValidSheetPaths)
Remove all invalid sheet instance data in this screen object for the project defined by aProjectName ...
 
std::vector< SCH_LINE * > GetBusesAndWires(const VECTOR2I &aPosition, bool aIgnoreEndpoints=false) const
Return buses and wires passing through aPosition.
 
wxString GroupsSanityCheckInternal(bool repair)
 
double m_LastZoomLevel
last value for the zoom level, useful in Eeschema when changing the current displayed sheet to reuse ...
 
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.
 
int m_fileFormatVersionAtLoad
 
SCH_ITEM * GetItem(const VECTOR2I &aPosition, int aAccuracy=0, KICAD_T aType=SCH_LOCATE_ANY_T) const
Check aPosition within a distance of aAccuracy for items of type aFilter.
 
bool IsExplicitJunctionAllowed(const VECTOR2I &aPosition) const
Indicate that a junction dot may be placed at the given location.
 
bool IsTerminalPoint(const VECTOR2I &aPosition, int aLayer) const
Test if aPosition is a connection point on aLayer.
 
void UpdateLocalLibSymbolLinks()
Initialize the LIB_SYMBOL reference for each SCH_SYMBOL found in this schematic with the local projec...
 
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
 
static bool ClassOf(const EDA_ITEM *aItem)
 
void SetLegacySymbolInstanceData()
Update the symbol value and footprint instance data for legacy designs.
 
void DeleteVariant(const wxString &aVariantName)
 
SCH_LINE * GetBus(const VECTOR2I &aPosition, int aAccuracy=0, SCH_LINE_TEST_T aSearchType=ENTIRE_LENGTH_T) const
 
bool Remove(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Remove aItem from the schematic associated with this screen.
 
SCH_SCREEN(EDA_ITEM *aParent=nullptr)
 
SCHEMATIC * Schematic() const
 
void FixupEmbeddedData()
After loading a file from disk, the library symbols do not yet contain the full data for their embedd...
 
void GetHierarchicalItems(std::vector< SCH_ITEM * > *aItems) const
Add all schematic sheet and symbol objects in the screen to aItems.
 
bool IsExplicitJunctionNeeded(const VECTOR2I &aPosition) const
Indicate that a junction dot is necessary at the given location, and does not yet exist.
 
SCH_SHEET_PIN * GetSheetPin(const VECTOR2I &aPosition) const
Test the screen if aPosition is a sheet label object.
 
wxString GroupsSanityCheck(bool repair=false)
Consistency check of internal m_groups structure.
 
bool InProjectPath() const
Check if the schematic file is in the current project path.
 
void FreeDrawList()
Free all the items from the schematic associated with the screen.
 
void Plot(PLOTTER *aPlotter, const SCH_PLOT_OPTS &aPlotOpts) const
Plot all the schematic objects to aPlotter.
 
virtual wxString GetClass() const override
Return the class name.
 
void Update(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Update aItem's bounding box in the tree.
 
void SetConnectivityDirty()
 
std::vector< VECTOR2I > GetNeededJunctions(const std::deque< EDA_ITEM * > &aItems) const
Return the unique set of points belonging to aItems where a junction is needed.
 
bool IsJunction(const VECTOR2I &aPosition) const
Test if a junction is required for the items at aPosition on the screen.
 
bool m_isReadOnly
Read only status of the screen file.
 
void GetSheets(std::vector< SCH_ITEM * > *aItems) const
Similar to Items().OfType( SCH_SHEET_T ), but return the sheets in a deterministic order (L-R,...
 
bool CheckIfOnDrawList(const SCH_ITEM *aItem) const
 
std::vector< VECTOR2I > GetConnections() const
Collect a unique list of all possible connection points in the schematic.
 
SPIN_STYLE GetLabelOrientationForPoint(const VECTOR2I &aPosition, SPIN_STYLE aDefaultOrientation, const SCH_SHEET_PATH *aSheet) const
 
void ClearAnnotation(SCH_SHEET_PATH *aSheetPath, bool aResetPrefix)
Clear the annotation for the symbols in aSheetPath on the screen.
 
size_t CountConnectedItems(const VECTOR2I &aPos, bool aTestJunctions) const
 
void MigrateSimModels()
Migrate any symbols having V6 simulation models to their V7 equivalents.
 
void DeleteItem(SCH_ITEM *aItem)
Remove aItem from the linked list and deletes the object.
 
size_t getLibSymbolNameMatches(const SCH_SYMBOL &aSymbol, std::vector< wxString > &aMatches)
Return a list of potential library symbol matches for aSymbol.
 
SCH_LABEL_BASE * GetLabel(const VECTOR2I &aPosition, int aAccuracy=0) const
Return a label item located at aPosition.
 
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.
 
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.
 
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...
 
Define a sheet pin (label) used in sheets to create hierarchical schematics.
 
SCH_SHEET * GetParent() const
Get the parent sheet object of this sheet pin.
 
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
 
void RemoveInstance(const KIID_PATH &aInstancePath)
 
SCH_SHEET_PIN * GetPin(const VECTOR2I &aPosition)
Return the sheet pin item found at aPosition in the sheet.
 
void RemovePin(const SCH_SHEET_PIN *aSheetPin)
Remove aSheetPin from the sheet.
 
SCH_SCREEN * GetScreen() const
 
const std::vector< SCH_SHEET_INSTANCE > & GetInstances() const
 
void SetLibId(const LIB_ID &aName)
 
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.
 
const std::vector< SCH_SYMBOL_INSTANCE > & GetInstances() const
 
void RemoveInstance(const SCH_SHEET_PATH &aInstancePath)
 
void SetValueFieldText(const wxString &aValue)
 
wxString GetSchSymbolLibraryName() const
 
bool AddSheetPathReferenceEntryIfMissing(const KIID_PATH &aSheetPath)
Add an instance to the alternate references list (m_instanceReferences), if this entry does not alrea...
 
void ClearAnnotation(const SCH_SHEET_PATH *aSheetPath, bool aResetPrefix)
Clear exiting symbol annotation.
 
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
 
std::vector< SCH_PIN * > GetAllLibPins() const
 
void AddHierarchicalReference(const KIID_PATH &aPath, const wxString &aRef, int aUnit)
Add a full hierarchical reference to this 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
 
void SetSchSymbolLibraryName(const wxString &aName)
The name of the symbol in the schematic library symbol list.
 
std::vector< SCH_PIN * > GetLibPins() const
Populate a vector with all the pins from the library object that match the current unit and bodyStyle...
 
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
 
void SetLibSymbol(LIB_SYMBOL *aLibSymbol)
Set this schematic symbol library symbol reference to aLibSymbol.
 
VECTOR2I GetPinPhysicalPosition(const SCH_PIN *Pin) const
 
static void MigrateSimModel(T &aSymbol, const PROJECT *aProject)
 
An interface to the global shared library manager that is schematic-specific and linked to one projec...
 
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
 
A base class for LIB_SYMBOL and SCH_SYMBOL.
 
virtual bool GetDNP(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
Set or clear the 'Do Not Populate' flag.
 
An 8 bit string that is assuredly encoded in UTF8, and supplies special conversion support to and fro...
 
static bool empty(const wxTextEntryBase *aCtrl)
 
#define STRUCT_DELETED
flag indication structures to be erased
 
#define IS_MOVING
Item being moved.
 
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
 
static const wxChar DanglingProfileMask[]
Flag to enable connectivity profiling.
 
const wxChar *const traceSchSheetPaths
Flag to enable debug output of schematic symbol sheet path manipulation code.
 
POINT_INFO AnalyzePoint(const EE_RTREE &aItem, const VECTOR2I &aPosition, bool aBreakCrossings)
Check a tree of items for a confluence at a given point and work out what kind of junction it is,...
 
Class to handle a set of SCH_ITEMs.
 
wxString UnescapeString(const wxString &aSource)
 
The EE_TYPE struct provides a type-specific auto-range iterator to the RTree.
 
std::vector< char > decompressedData
 
std::string compressedEncodedData
 
A selection of information about a point in the schematic that might be eligible for turning into a j...
 
A simple container for sheet instance information.
 
A simple container for schematic symbol instance information.
 
@ REFERENCE
Field Reference of part, i.e. "IC21".
 
@ VALUE
Field Value of part, i.e. "3.3K".
 
wxLogTrace helper definitions.
 
bool IsPointOnSegment(const VECTOR2I &aSegStart, const VECTOR2I &aSegEnd, const VECTOR2I &aTestPoint)
Test if aTestPoint is on line defined by aSegStart and aSegEnd.
 
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
 
VECTOR2< int32_t > VECTOR2I