31using namespace std::placeholders;
 
  160    std::shared_ptr<SELECT_MENU> selectMenu = std::make_shared<SELECT_MENU>();
 
  161    selectMenu->SetTool( 
this );
 
  162    m_menu->RegisterSubMenu( selectMenu );
 
  166    auto& menu = 
m_menu->GetMenu();
 
  168    auto activeToolCondition =
 
  183    auto groupEnterCondition =
 
  186    auto inGroupCondition =
 
  198        menu.AddSeparator( 1000 );
 
  209    menu.AddSeparator(                                  haveHighlight,       1 );
 
  215    menu.AddSeparator( 1 );
 
 
  259        wxMouseState keyboardState = wxGetMouseState();
 
  261        setModifiersState( keyboardState.ShiftDown(), keyboardState.ControlDown(), keyboardState.AltDown() );
 
 
  284            trackDragAction = cfg->m_TrackDragAction;
 
  298        else if( evt->IsMouseDown( 
BUT_LEFT ) )
 
  336            bool selectionCancelled = 
false;
 
  340                selectPoint( evt->Position(), 
false, &selectionCancelled );
 
  345            m_frame->GetCanvas()->ForceRefresh();
 
  347            if( !selectionCancelled )
 
  353        else if( evt->IsDblClick( 
BUT_LEFT ) )
 
  395                const int          delta = evt->Parameter<
int>();
 
  455                    wxASSERT_MSG( 
false, wxT( 
"Unknown selection mode" ) );
 
  462                auto zoneFilledAreaFilter =
 
  465                            int accuracy = aCollector.GetGuide()->Accuracy();
 
  466                            std::set<EDA_ITEM*> remove;
 
  472                                    ZONE* zone = 
static_cast<ZONE*
>( item );
 
  477                                        remove.insert( zone );
 
  483                                aCollector.Remove( item );
 
  489                if( evt->HasPosition() )
 
  492                        && 
selectPoint( evt->DragOrigin(), 
false, 
nullptr, zoneFilledAreaFilter ) )
 
  510                    bool   routable = ( segs >= 1 || arcs >= 1 || vias == 1 )
 
  511                                        && ( segs + arcs + vias == 
m_selection.GetSize() );
 
  535        else if( evt->IsCancel() )
 
  544            else if( evt->FirstResponder() == 
this && evt->GetCommandId() == (
int) WXK_ESCAPE )
 
  556                        if( controller && 
m_frame->GetPcbNewSettings()->m_ESCClearsNetHighlight )
 
  559                    catch( 
const std::runtime_error& e )
 
  561                        wxCHECK_MSG( 
false, 0, e.what() );
 
  572        if( 
m_frame->ToolStackIsEmpty() )
 
  578                    && evt->HasPosition()
 
 
  601                 wxT( 
"EnterGroup called when selection is not a single group" ) );
 
 
  663        enum DISPOSITION { BEFORE = 1, AFTER, 
BOTH };
 
  665        std::map<EDA_ITEM*, DISPOSITION> itemDispositions;
 
  674            itemDispositions[ item ] = BEFORE;
 
  677        aClientFilter( 
VECTOR2I(), collector, 
this );
 
  681            if( itemDispositions.count( item ) )
 
  682                itemDispositions[ item ] = 
BOTH;
 
  684                itemDispositions[ item ] = AFTER;
 
  692        for( std::pair<EDA_ITEM* const, DISPOSITION> itemDisposition : itemDispositions )
 
  694            EDA_ITEM*   item = itemDisposition.first;
 
  695            DISPOSITION disposition = itemDisposition.second;
 
  697            if( disposition == BEFORE )
 
  701        for( std::pair<EDA_ITEM* const, DISPOSITION> itemDisposition : itemDispositions )
 
  703            EDA_ITEM*   item = itemDisposition.first;
 
  704            DISPOSITION disposition = itemDisposition.second;
 
  708            if( disposition == AFTER || disposition == 
BOTH )
 
  712        m_frame->GetCanvas()->ForceRefresh();
 
 
  768    for( 
int i = collector.
GetCount() - 1; i >= 0; --i )
 
  770        if( !
Selectable( collector[ i ] ) || ( aOnDrag && collector[i]->IsLocked() ) )
 
  776    size_t preFilterCount = collector.
GetCount();
 
  783    if( collector.
GetCount() == 0 && preFilterCount > 0 )
 
  786            editFrame->HighlightSelectionFilter( rejected );
 
  794        aClientFilter( aWhere, collector, 
this );
 
  803        for( 
int i = collector.
GetCount() - 1; i >= 0; --i )
 
  805            if( !collector[i]->IsSelected() )
 
  817        catch( 
const std::exception& exc )
 
  819            wxLogWarning( wxS( 
"Exception '%s' occurred attempting to guess selection candidates." ),
 
  833            if( aSelectionCancelledFlag )
 
  834                *aSelectionCancelledFlag = 
true;
 
  841    bool anySubtracted = 
false;
 
  848            anySubtracted = 
true;
 
  854        for( 
int i = 0; i < collector.
GetCount(); ++i )
 
  859                anySubtracted = 
true;
 
  869    if( addedCount == 1 )
 
  874    else if( addedCount > 1 )
 
  879    else if( anySubtracted )
 
 
  916    for( 
int i = 0; aAllowedActions[i]; ++i )
 
  918        if( aEvent->
IsAction( aAllowedActions[i] ) )
 
 
  929    bool cancelled = 
false;     
 
  934        if( cell->IsSelected() )
 
  943                return ( aItem->GetFlags() & 
CANDIDATE ) > 0;
 
  948        if( evt->IsCancelInteractive() || evt->IsActivate() )
 
  957            BOX2I selectionRect( evt->DragOrigin(), evt->Position() - evt->DragOrigin() );
 
  962                bool doSelect = 
false;
 
  964                if( cell->HitTest( selectionRect, 
false ) )
 
  969                        doSelect = !wasSelected( cell );
 
  973                else if( wasSelected( cell ) )
 
  978                if( doSelect && !cell->IsSelected() )
 
  980                else if( !doSelect && cell->IsSelected() )
 
  984        else if( evt->IsMouseUp( 
BUT_LEFT ) )
 
  988            bool anyAdded = 
false;
 
  989            bool anySubtracted = 
false;
 
  993                if( cell->IsSelected() && !wasSelected( cell ) )
 
  995                else if( wasSelected( cell ) && !cell->IsSelected() )
 
  996                    anySubtracted = 
true;
 
 
 1028    bool cancelled = 
false;     
 
 1043        if( 
view->IsMirroredX() )
 
 1044            greedySelection = !greedySelection;
 
 1049        if( evt->IsCancelInteractive() || evt->IsActivate() )
 
 1068            area.
SetEnd( evt->Position() );
 
 1074            view->SetVisible( &area, 
true );
 
 1075            view->Update( &area );
 
 1084            view->SetVisible( &area, 
false );
 
 1098    view->Remove( &area );
 
 
 1130    bool cancelled = 
false;    
 
 1148        bool   isClockwise = shapeArea > 0 ? true : 
false;
 
 1150        if( 
getView()->IsMirroredX() && shapeArea != 0 )
 
 1151            isClockwise = !isClockwise;
 
 1155        if( evt->IsCancelInteractive() || evt->IsActivate() )
 
 1158            evt->SetPassEvent( 
false );
 
 1165            points.
Append( evt->Position() );
 
 1167        else if(   evt->IsDblClick( 
BUT_LEFT )
 
 1173            evt->SetPassEvent( 
false );
 
 1209        area.
SetMode( selectionMode );
 
 
 1232    bool anyAdded = 
false;
 
 1233    bool anySubtracted = 
false;
 
 1241    std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> candidates;
 
 1243    view->Query( selectionBox, candidates ); 
 
 1247    std::set<EDA_ITEM*> group_items;
 
 1255        std::unordered_set<EDA_ITEM*>& newset = 
group->GetItems();
 
 1258                [&]( 
const BOX2I& aBox )
 
 1260                    return boxMode ? selectionBox.
Contains( aBox )
 
 1266        if( containedMode && boxContained( 
group->GetBoundingBox() ) && newset.size() )
 
 1268            for( 
EDA_ITEM* group_item : newset )
 
 1270                if( !group_item->IsBOARD_ITEM() )
 
 1274                    collector.
Append( *newset.begin() );
 
 1278        for( 
EDA_ITEM* group_item : newset )
 
 1279            group_items.emplace( group_item );
 
 1285                return boxMode ? aItem->HitTest( selectionBox, containedMode )
 
 1286                               : aItem->HitTest( aArea.
GetPoly(), containedMode );
 
 1289    for( 
const auto& [item, layer] : candidates )
 
 1291        if( !item->IsBOARD_ITEM() )
 
 1296        if( 
Selectable( boardItem ) && hitTest( boardItem )
 
 1297                && ( !containedMode || !group_items.count( boardItem ) ) )
 
 1300                padsCollector.
Append( boardItem );
 
 1302                collector.
Append( boardItem );
 
 1314        collector = padsCollector;
 
 1321    std::sort( collector.
begin(), collector.
end(),
 
 1324                   VECTOR2I aPos = a->GetPosition();
 
 1325                   VECTOR2I bPos = b->GetPosition();
 
 1327                   if( aPos.y == bPos.y )
 
 1328                       return aPos.x < bPos.x;
 
 1330                   return aPos.y < bPos.y;
 
 1335        if( !i->IsBOARD_ITEM() )
 
 1340        if( aSubtractive || ( aExclusiveOr && item->
IsSelected() ) )
 
 1343            anySubtracted = 
true;
 
 1357    else if( anySubtracted )
 
 
 1364    wxMouseState keyboardState = wxGetMouseState();
 
 1366    setModifiersState( keyboardState.ShiftDown(), keyboardState.ControlDown(), keyboardState.AltDown() );
 
 
 1410                        collection.
Append( item );
 
 1423    m_frame->GetCanvas()->ForceRefresh();
 
 
 1451    m_frame->GetCanvas()->ForceRefresh();
 
 
 1461    std::set<int> representedNets;
 
 1463    for( 
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
 
 1469        else if ( representedNets.count( item->
GetNetCode() ) )
 
 1472            representedNets.insert( item->
GetNetCode() );
 
 
 1479    std::deque<EDA_ITEM*> selectedItems = 
m_selection.GetItems();
 
 1482    std::vector<BOARD_CONNECTED_ITEM*> toUnroute;
 
 1484    for( 
EDA_ITEM* item : selectedItems )
 
 1489                toUnroute.push_back( 
pad );
 
 1515    for( 
EDA_ITEM* item : selectedItems )
 
 
 1527    std::deque<EDA_ITEM*> selectedItems = 
m_selection.GetItems();
 
 1530    std::vector<BOARD_CONNECTED_ITEM*> toUnroute;
 
 1532    for( 
EDA_ITEM* item : selectedItems )
 
 1541    std::deque<EDA_ITEM*> toSelectAfter;
 
 1545        if( !item->IsBOARD_ITEM() )
 
 1548        if( std::find( toUnroute.begin(), toUnroute.end(), item ) == toUnroute.end() )
 
 1549            toSelectAfter.push_back( item );
 
 1562    for( 
EDA_ITEM* item : toSelectAfter )
 
 
 1574    unsigned initialCount = 0;
 
 1586    if( initialCount == 0 )
 
 1589        std::vector<PCB_SHAPE*> startShapes;
 
 1594                startShapes.push_back( 
static_cast<PCB_SHAPE*
>( item ) );
 
 1598        if( !startShapes.empty() )
 
 1604    m_frame->SetStatusText( 
_( 
"Select/Expand Connection..." ) );
 
 1608        std::deque<EDA_ITEM*> selectedItems = 
m_selection.GetItems();
 
 1610        for( 
EDA_ITEM* item : selectedItems )
 
 1611            item->ClearTempFlags();
 
 1613        std::vector<BOARD_CONNECTED_ITEM*> startItems;
 
 1615        for( 
EDA_ITEM* item : selectedItems )
 
 1622                    startItems.push_back( 
pad );
 
 1640        if( 
m_selection.GetItems().size() > initialCount )
 
 1644    m_frame->SetStatusText( wxEmptyString );
 
 
 1657    double     refreshIntervalMs = 500; 
 
 1658    int        lastSelectionSize = (int) 
m_selection.GetSize();
 
 1662    std::set<PAD*>                     startPadSet;
 
 1663    std::vector<BOARD_CONNECTED_ITEM*> cleanupItems;
 
 1669            startPadSet.insert( 
static_cast<PAD*
>( startItem ) );
 
 1672        if( startItem->IsType( { PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T } ) )
 
 1681        std::map<VECTOR2I, std::vector<PCB_TRACK*>> trackMap;
 
 1682        std::map<VECTOR2I, PCB_VIA*>                viaMap;
 
 1683        std::map<VECTOR2I, PAD*>                    padMap;
 
 1684        std::map<VECTOR2I, std::vector<PCB_SHAPE*>> shapeMap;
 
 1685        std::vector<std::pair<VECTOR2I, LSET>>      activePts;
 
 1695            switch( item->Type() )
 
 1701                trackMap[track->
GetStart()].push_back( track );
 
 1702                trackMap[track->
GetEnd()].push_back( track );
 
 1709                viaMap[
via->GetStart()] = 
via;
 
 1716                padMap[
pad->GetPosition()] = 
pad;
 
 1725                    shapeMap[point].push_back( shape );
 
 1736        switch( startItem->Type() )
 
 1749            activePts.push_back( { startItem->GetPosition(), startItem->GetLayerSet() } );
 
 1753            activePts.push_back( { startItem->GetPosition(), startItem->GetLayerSet() } );
 
 1761                activePts.push_back( { point, startItem->GetLayerSet() } );
 
 1774        while( expand && failSafe++ < 100000 )
 
 1778            for( 
int i = (
int) activePts.size() - 1; i >= 0; --i )
 
 1783                auto viaIt = viaMap.find( pt );
 
 1784                auto padIt = padMap.find( pt );
 
 1786                bool gotVia = viaIt != viaMap.end() && ( viaIt->second->GetLayerSet() & layerSetCu ).any();
 
 1787                bool gotPad = padIt != padMap.end() && ( padIt->second->GetLayerSet() & layerSetCu ).any();
 
 1788                bool gotNonStartPad = gotPad && ( startPadSet.find( padIt->second ) == startPadSet.end() );
 
 1792                    activePts.erase( activePts.begin() + i );
 
 1798                    activePts.erase( activePts.begin() + i );
 
 1804                    size_t pt_count = 0;
 
 1808                        if( track->GetStart() != track->GetEnd() && layerSetCu.
Contains( track->GetLayer() ) )
 
 1812                    if( pt_count > 2 || gotVia || gotNonStartPad )
 
 1814                        activePts.erase( activePts.begin() + i );
 
 1820                    if( gotNonStartPad )
 
 1822                        activePts.erase( activePts.begin() + i );
 
 1829                    PAD* 
pad = padIt->second;
 
 1834                        cleanupItems.push_back( 
pad );
 
 1836                        activePts.push_back( { 
pad->GetPosition(), 
pad->GetLayerSet() } );
 
 1843                    if( !layerSetCu.
Contains( track->GetLayer() ) )
 
 1849                    if( !track->IsSelected() )
 
 1855                        cleanupItems.push_back( track );
 
 1857                        if( track->GetStart() == pt )
 
 1858                            activePts.push_back( { track->GetEnd(), track->GetLayerSet() } );
 
 1860                            activePts.push_back( { track->GetStart(), track->GetLayerSet() } );
 
 1869                    if( !layerSetCu.
Contains( shape->GetLayer() ) )
 
 1875                    if( !shape->IsSelected() )
 
 1881                        cleanupItems.push_back( shape );
 
 1883                        for( 
const VECTOR2I& newPoint : shape->GetConnectionPoints() )
 
 1885                            if( newPoint == pt )
 
 1888                            activePts.push_back( { newPoint, shape->GetLayerSet() } );
 
 1896                if( viaMap.count( pt ) )
 
 1902                        activePts.erase( activePts.begin() + i );
 
 1906                    if( !
via->IsSelected() )
 
 1912                        cleanupItems.push_back( 
via );
 
 1914                        activePts.push_back( { 
via->GetPosition(), 
via->GetLayerSet() } );
 
 1921                activePts.erase( activePts.begin() + i );
 
 1925            if( refreshTimer.
msecs() >= refreshIntervalMs )
 
 1929                    m_frame->GetCanvas()->ForceRefresh();
 
 1933                refreshTimer.
Start();
 
 1938    std::set<EDA_ITEM*> toDeselect;
 
 1939    std::set<EDA_ITEM*> toSelect;
 
 1944        if( !item->IsBOARD_ITEM() )
 
 1952            toDeselect.insert( item );
 
 
 1997    std::stack<PCB_SHAPE*> toSearch;
 
 1998    std::set<PCB_SHAPE*> toCleanup;
 
 2000    for( 
PCB_SHAPE* startItem : aStartItems )
 
 2001        toSearch.push( startItem );
 
 2014                        toSearch.push( 
static_cast<PCB_SHAPE*
>( item ) );
 
 2018    while( !toSearch.empty() )
 
 2027        toCleanup.insert( shape );
 
 2036        searchPoint( shape->
GetEnd() );
 
 
 2047    std::vector<PAD*> pads;
 
 2054                pads.push_back( 
pad );
 
 2058            pads.push_back( 
static_cast<PAD*
>( item ) );
 
 2067        for( 
const CN_EDGE& edge : conn->GetRatsnestForPad( 
pad ) )
 
 2069            wxCHECK2( edge.GetSourceNode() && !edge.GetSourceNode()->Dirty(), 
continue );
 
 2070            wxCHECK2( edge.GetTargetNode() && !edge.GetTargetNode()->Dirty(), 
continue );
 
 2075            if( sourceParent == 
pad )
 
 2078                    select( 
static_cast<PAD*
>( targetParent )->GetParent() );
 
 2080            else if( targetParent == 
pad )
 
 2083                    select( 
static_cast<PAD*
>( sourceParent )->GetParent() );
 
 
 2097    std::vector<PAD*> pads;
 
 2104                pads.push_back( 
pad );
 
 2108            pads.push_back( 
static_cast<PAD*
>( item ) );
 
 2119        const std::vector<CN_EDGE> edges = conn->GetRatsnestForPad( 
pad );
 
 2122        if( edges.size() == 0 )
 
 2125        double     currentDistance = DBL_MAX;
 
 2129        for( 
const CN_EDGE& edge : edges )
 
 2131            if( edge.GetSourceNode()->Parent()->GetParentFootprint()
 
 2132                == edge.GetTargetNode()->Parent()->GetParentFootprint() )
 
 2138            const CN_ANCHOR* other = edge.GetSourceNode()->
Parent() == 
pad ? edge.GetTargetNode().get()
 
 2139                                                                           : edge.GetSourceNode().get();
 
 2141            wxCHECK2( other && !other->
Dirty(), 
continue );
 
 2147            if( edge.GetLength() < currentDistance )
 
 2149                currentDistance = edge.GetLength();
 
 2154        if( nearest != 
nullptr )
 
 
 2168    for( 
BOARD_ITEM* item : conn->GetNetItems( aNetCode, { PCB_TRACE_T,
 
 
 2225    std::vector<BOARD_ITEM*> footprints;
 
 2230        if( footprint == 
nullptr )
 
 2233        wxString footprint_path = footprint->GetPath().AsString().BeforeLast( 
'/' );
 
 2235        if( footprint_path.IsEmpty() )
 
 2236            footprint_path += 
'/';
 
 2238        if( footprint_path == aSheetPath )
 
 2239            footprints.push_back( footprint );
 
 
 2255    std::list<int>                     netcodeList;
 
 2256    std::vector<BOARD_CONNECTED_ITEM*> padList;
 
 2260        switch( item->Type() )
 
 2266                if( 
pad->IsConnected() )
 
 2268                    netcodeList.push_back( 
pad->GetNetCode() );
 
 2269                    padList.push_back( 
pad );
 
 2280            if( 
pad->IsConnected() )
 
 2282                netcodeList.push_back( 
pad->GetNetCode() );
 
 2283                padList.push_back( 
pad );
 
 2295    std::sort( padList.begin(), padList.end() );
 
 2299    netcodeList.unique();
 
 2305    std::vector<int>                   removeCodeList;
 
 2308    for( 
int netCode : netcodeList )
 
 2312            if( !std::binary_search( padList.begin(), padList.end(), 
pad ) )
 
 2316                removeCodeList.push_back( netCode );
 
 2322    for( 
int removeCode : removeCodeList )
 
 2323        netcodeList.remove( removeCode );
 
 2325    std::unordered_set<BOARD_ITEM*> localConnectionList;
 
 2327    for( 
int netCode : netcodeList )
 
 2329        for( 
BOARD_ITEM* item : conn->GetNetItems( netCode, { PCB_TRACE_T,
 
 2334            localConnectionList.insert( item );
 
 2338    for( 
BOARD_ITEM* item : localConnectionList )
 
 
 2345    std::vector<BOARD_ITEM*>* items = aEvent.
Parameter<std::vector<BOARD_ITEM*>*>();
 
 
 2356    std::vector<BOARD_ITEM*>* items = aEvent.
Parameter<std::vector<BOARD_ITEM*>*>();
 
 
 2383        if( 
m_frame->GetPcbNewSettings()->m_CrossProbing.center_on_items )
 
 2385            if( 
m_frame->GetPcbNewSettings()->m_CrossProbing.zoom_to_fit )
 
 2394    m_frame->GetCanvas()->ForceRefresh();
 
 
 2404    wxString sheetPath = *aEvent.
Parameter<wxString*>();
 
 
 2430    if( !footprint || footprint->
GetPath().empty() )
 
 2436    wxString sheetPath = footprint->
GetPath().
AsString().BeforeLast( 
'/' );
 
 2438    if( sheetPath.IsEmpty() )
 
 
 2459    screenSize.
x = std::max( 10.0, screenSize.
x );
 
 2460    screenSize.
y = std::max( 10.0, screenSize.
y );
 
 2465        double   scale = 
view->GetScale() / std::max( fabs( vsize.
x / screenSize.
x ),
 
 2466                                                      fabs( vsize.
y / screenSize.
y ) );
 
 2472    m_frame->GetCanvas()->ForceRefresh();
 
 
 2488#ifdef DEFAULT_PCBNEW_CODE 
 2490    auto screenSize = 
view->ToWorld( GetCanvas()->GetClientSize(), 
false );
 
 2493    screenSize.x = std::max( 10.0, fabs( screenSize.x ) );
 
 2494    screenSize.y = std::max( 10.0, screenSize.y );
 
 2495    double ratio = std::max( fabs( bbSize.x / screenSize.x ), fabs( bbSize.y / screenSize.y ) );
 
 2498    if( crossProbingSettings.zoom_to_fit && ( ratio < 0.5 || ratio > 1.0 ) )
 
 2499        view->SetScale( 
view->GetScale() / ratio );
 
 2502#ifndef DEFAULT_PCBNEW_CODE  
 2519    double compRatio = bbSize.y / currTextHeight; 
 
 2522    double compRatioBent = 1.0;
 
 2533    screenSize.
x = std::max( 10.0, fabs( screenSize.
x ) );
 
 2534    screenSize.
y = std::max( 10.0, screenSize.
y );
 
 2535    double ratio = std::max( -1.0, fabs( bbSize.y / screenSize.
y ) );
 
 2538    double kicadRatio = std::max( fabs( bbSize.x / screenSize.
x ),
 
 2539                                  fabs( bbSize.y / screenSize.
y ) );
 
 2547    std::vector<std::pair<double, double>> lut {
 
 2560    std::vector<std::pair<double, double>>::iterator it;
 
 2562    compRatioBent = lut.back().second; 
 
 2564    if( compRatio >= lut.front().first )
 
 2570        for( it = lut.begin(); it < lut.end() - 1; it++ )
 
 2572            if( it->first <= compRatio && 
next( it )->first >= compRatio )
 
 2574                double diffx = compRatio - it->first;
 
 2575                double diffn = 
next( it )->first - it->first;
 
 2577                compRatioBent = it->second + ( 
next( it )->second - it->second ) * diffx / diffn;
 
 2584        compRatioBent = lut.front().second; 
 
 2592    if( bbSize.x > screenSize.
x * ratio * compRatioBent )
 
 2596        compRatioBent = 1.0; 
 
 2597        wxLogTrace( 
"CROSS_PROBE_SCALE", 
"Part TOO WIDE for screen.  Using normal KiCad zoom ratio: %1.5f", ratio );
 
 2602    ratio *= compRatioBent;
 
 2604    bool alwaysZoom = 
false; 
 
 2607    if( ( ratio < 0.5 || ratio > 1.0 ) || alwaysZoom )
 
 2608        view->SetScale( 
view->GetScale() / ratio );
 
 
 2615    bool cleared = 
false;
 
 2627        switch( aItem->
Type() )
 
 2631            int netCode = 
static_cast<NETINFO_ITEM*
>( aItem )->GetNetCode();
 
 2650            double marginFactor = 2;
 
 2659                double scaleX = screenSize.
x / 
static_cast<double>( aItem->
GetBoundingBox().GetWidth() );
 
 2660                double scaleY = screenSize.
y / 
static_cast<double>( aItem->
GetBoundingBox().GetHeight() );
 
 2662                scaleX /= marginFactor;
 
 2663                scaleY /= marginFactor;
 
 2665                double scale = scaleX > scaleY ? scaleY : scaleX;
 
 2684    m_frame->GetCanvas()->ForceRefresh();
 
 
 2696    switch( aItem.
Type() )
 
 
 2751    if( cmd != wxID_OK )
 
 2762        if( !i->IsBOARD_ITEM() )
 
 
 2784    std::set<BOARD_ITEM*> rejected;
 
 2788        if( !i->IsBOARD_ITEM() )
 
 2794            rejected.insert( item );
 
 2798        aCollector.
Remove( item );
 
 
 2863                aRejected->
pads = 
true;
 
 2875                aRejected->
tracks = 
true;
 
 2886                aRejected->
vias = 
true;
 
 2895        ZONE* zone = 
static_cast<ZONE*
>( aItem );
 
 2905                    aRejected->
zones = 
true;
 
 2914        if( zone == 
m_frame->GetBoard()->m_SolderMaskBridges )
 
 2945                aRejected->
text = 
true;
 
 2981                aRejected->
points = 
true;
 
 
 3029    bool enteredGroupFound = 
false;
 
 3032            [&]( 
EDA_ITEM* item, 
void* testData )
 
 3050                        enteredGroupFound = 
true;
 
 3064    if( !enteredGroupFound )
 
 
 3077    auto visibleLayers =
 
 3085                        set.
set( layer, 
view()->IsLayerVisible( layer ) );
 
 3107        bool                onActiveLayer = 
false;
 
 3109        for( 
int layer : activeLayers )
 
 3112            if( layer < PCB_LAYER_ID_COUNT && aItem->IsOnLayer( 
ToLAYER_ID( layer ) ) )
 
 3114                onActiveLayer = 
true;
 
 3139            if( !( visibleLayers() & boardSide ).
any() )
 
 3146                && footprint->
Pads().empty()
 
 3147                && footprint->
Zones().empty() )
 
 3164        for( 
const ZONE* zone : footprint->
Zones() )
 
 3196    const ZONE*          zone = 
nullptr;
 
 3198    const PAD*           
pad = 
nullptr;
 
 3211    switch( aItem->
Type() )
 
 3217        zone = 
static_cast<const ZONE*
>( aItem );
 
 3235        if( !layerVisible( aItem->
GetLayer() ) )
 
 3247        if( !( visibleLayers() & 
via->GetLayerSet() ).any() )
 
 3253        field = 
static_cast<const PCB_FIELD*
>( aItem );
 
 3269        if( !layerVisible( 
text->GetLayer() ) )
 
 3280            if( 
text->GetText() == wxT( 
"${REFERENCE}" ) )
 
 3282            else if( 
text->GetText() == wxT( 
"${VALUE}" ) )
 
 3285            if( !
view()->IsLayerVisible( controlLayer ) )
 
 3299        if( !layerVisible( aItem->
GetLayer() ) )
 
 3308        if( !layerVisible( aItem->
GetLayer() ) )
 
 3314        if( !layerVisible( aItem->
GetLayer() ) )
 
 3321        if( !layerVisible( aItem->
GetLayer() ) )
 
 3329        if( !layerVisible( aItem->
GetLayer() ) )
 
 3342        if( !layerVisible( aItem->
GetLayer() ) )
 
 3351        pad = 
static_cast<const PAD*
>( aItem );
 
 3362            if( !( 
pad->GetLayerSet() & visibleLayers() ).
any() )
 
 3369        marker = 
static_cast<const PCB_MARKER*
>( aItem );
 
 3377        if( !layerVisible( aItem->
GetLayer() ) )
 
 
 3431        aGroup->
Add( aItem );
 
 
 3500    const unsigned GRIP_MARGIN = 20;
 
 3506        if( !item->IsBOARD_ITEM() )
 
 3509        BOX2I itemBox = item->ViewBBox();
 
 3514            if( item->HitTest( aPoint, margin ) )
 
 3521                group->RunOnChildren(
 
 3524                            if( aItem->
HitTest( aPoint, margin ) )
 
 
 3544    SEG   loc( aWhere, aWhere );
 
 3546    switch( aItem->
Type() )
 
 3554        if( 
text->GetEffectiveTextShape()->Collide( loc, aMaxDistance, &
distance ) )
 
 3576        shape->Collide( loc, aMaxDistance, &
distance );
 
 3596        ZONE* zone = 
static_cast<ZONE*
>( aItem );
 
 3618        catch( 
const std::exception& e )
 
 3620            wxFAIL_MSG( wxString::Format( wxT( 
"Clipper exception occurred: %s" ), e.what() ) );
 
 3654        static_cast<PAD*
>( aItem )->Padstack().ForEachUniqueLayer(
 
 3657                    int layerDistance = INT_MAX;
 
 
 3683    wxCHECK( settings,  );
 
 3686    LSET visibleLayers = 
m_frame->GetBoard()->GetVisibleLayers();
 
 3687    LSET enabledLayers = 
m_frame->GetBoard()->GetEnabledLayers();
 
 3690    wxCHECK( !enabledLayerStack.empty(),  );
 
 3692    auto isZoneFillKeepout =
 
 3697                    const ZONE* zone = 
static_cast<const ZONE*
>( aItem );
 
 3706    std::vector<LAYER_OPACITY_ITEM> opacityStackup;
 
 3708    for( 
int i = 0; i < aCollector.
GetCount(); i++ )
 
 3712        LSET itemLayers = item->
GetLayerSet() & enabledLayers & visibleLayers;
 
 3713        LSEQ itemLayerSeq = itemLayers.
Seq( enabledLayerStack );
 
 3726            opacityItem.
m_Item = item;
 
 3728            if( isZoneFillKeepout( item ) )
 
 3731            opacityStackup.emplace_back( opacityItem );
 
 3735    std::sort( opacityStackup.begin(), opacityStackup.end(),
 
 3738                   int retv = enabledLayerStack.TestLayers( aLhs.m_Layer, aRhs.m_Layer );
 
 3743                   return aLhs.m_Opacity > aRhs.m_Opacity;
 
 3746    std::set<const BOARD_ITEM*> visibleItems;
 
 3747    std::set<const BOARD_ITEM*> itemsToRemove;
 
 3749    double currentStackupOpacity = 0.0;
 
 3756            currentStackupOpacity = opacityItem.m_Opacity;
 
 3757            lastVisibleLayer = opacityItem.m_Layer;
 
 3758            visibleItems.emplace( opacityItem.m_Item );
 
 3768                    wxCHECK( item, 
false );
 
 3771                    if( visibleItems.count( item ) )
 
 3777                            && visibleItems.count( item->
GetParent() ) )
 
 3784                    if( isZoneFillKeepout( item ) )
 
 3791        if( opacityItem.m_Layer == enabledLayerStack[0] )
 
 3793            visibleItems.emplace( opacityItem.m_Item );
 
 3797            double itemVisibility = opacityItem.m_Opacity * ( 1.0 - currentStackupOpacity );
 
 3799            if( ( itemVisibility <= minAlphaLimit ) && !ignoreItem() )
 
 3800                itemsToRemove.emplace( opacityItem.m_Item );
 
 3802                visibleItems.emplace( opacityItem.m_Item );
 
 3805        if( opacityItem.m_Layer != lastVisibleLayer )
 
 3807            currentStackupOpacity += opacityItem.m_Opacity * ( 1.0 - currentStackupOpacity );
 
 3808            currentStackupOpacity = std::min( currentStackupOpacity, 1.0 );
 
 3809            lastVisibleLayer = opacityItem.m_Layer;
 
 3813    for( 
const BOARD_ITEM* itemToRemove : itemsToRemove )
 
 3815        wxCHECK( aCollector.
GetCount() > 1,  );
 
 3816        aCollector.
Remove( itemToRemove );
 
 
 3839    static std::vector<KICAD_T> singleLayerSilkTypes = { 
PCB_FIELD_T,
 
 3851    std::set<BOARD_ITEM*>  preferred;
 
 3852    std::set<BOARD_ITEM*>  rejected;
 
 3859    if( silkLayers[activeLayer] )
 
 3861        for( 
int i = 0; i < aCollector.
GetCount(); ++i )
 
 3865            if( item->
IsType( singleLayerSilkTypes ) && silkLayers[ item->
GetLayer() ] )
 
 3866                preferred.insert( item );
 
 3871    else if( courtyardLayers[activeLayer] && settings->
GetHighContrast() )
 
 3873        for( 
int i = 0; i < aCollector.
GetCount(); ++i )
 
 3878                preferred.insert( item );
 
 3882    if( preferred.size() > 0 )
 
 3887            aCollector.
Append( item );
 
 3889        if( preferred.size() == 1 )
 
 3894    constexpr int MAX_SLOP = 5;
 
 3898    int minSlop = INT_MAX;
 
 3900    std::map<BOARD_ITEM*, int> itemsBySloppiness;
 
 3902    for( 
int i = 0; i < aCollector.
GetCount(); ++i )
 
 3907        itemsBySloppiness[ item ] = itemSlop;
 
 3909        if( itemSlop < minSlop )
 
 3914    if( minSlop < INT_MAX )
 
 3916        for( std::pair<BOARD_ITEM*, int> pair : itemsBySloppiness )
 
 3918            if( pair.second > minSlop + singlePixel )
 
 3925    constexpr double sizeRatio = 1.5;
 
 3927    std::vector<std::pair<BOARD_ITEM*, double>> itemsByArea;
 
 3929    for( 
int i = 0; i < aCollector.
GetCount(); ++i )
 
 3938            area = (double) 
SEG::Square( singlePixel ) * MAX_SLOP;
 
 3957            catch( 
const std::exception& e )
 
 3959                wxFAIL_MSG( wxString::Format( wxT( 
"Clipper exception occurred: %s" ), e.what() ) );
 
 3963        itemsByArea.emplace_back( item, area );
 
 3966    std::sort( itemsByArea.begin(), itemsByArea.end(),
 
 3967               []( 
const std::pair<BOARD_ITEM*, double>& lhs,
 
 3968                   const std::pair<BOARD_ITEM*, double>& rhs ) -> 
bool 
 3970                   return lhs.second < rhs.second;
 
 3973    bool rejecting = 
false;
 
 3975    for( 
int i = 1; i < (int) itemsByArea.size(); ++i )
 
 3977        if( itemsByArea[i].second > itemsByArea[i-1].second * sizeRatio )
 
 3981            rejected.insert( itemsByArea[i].first );
 
 3986    constexpr double maxCoverRatio = 0.70;
 
 3988    for( 
int i = 0; i < aCollector.
GetCount(); ++i )
 
 3992            if( footprint->CoverageRatio( aCollector ) > maxCoverRatio )
 
 3993                rejected.erase( footprint );
 
 3998    if( (
unsigned) aCollector.
GetCount() > rejected.size() )  
 
 4010        bool haveItemOnActive = 
false;
 
 4013        for( 
int i = 0; i < aCollector.
GetCount(); ++i )
 
 4015            if( !aCollector[i]->IsOnLayer( activeLayer ) )
 
 4016                rejected.insert( aCollector[i] );
 
 4018                haveItemOnActive = 
true;
 
 4021        if( haveItemOnActive )
 
 
 4035        for( 
int i = (
int) aCollector.
GetCount() - 1; i >= 0; --i )
 
 4038            bool        lockedDescendant = 
false;
 
 4044                            lockedDescendant = 
true;
 
 4048            if( item->
IsLocked() || lockedDescendant )
 
 4049                aCollector.
Remove( item );
 
 
 4057    std::unordered_set<EDA_ITEM*> toAdd;
 
 4061    for( 
int j = 0; j < aCollector.
GetCount(); j++ )
 
 4063        if( aCollector[j]->GetParent() )
 
 4064            aCollector[j]->GetParent()->ClearFlags( 
CANDIDATE );
 
 4066        if( aCollector[j]->GetParentFootprint() )
 
 4067            aCollector[j]->GetParentFootprint()->ClearFlags( 
CANDIDATE );
 
 4072        for( 
int j = 0; j < aCollector.
GetCount(); j++ )
 
 4076    for( 
int j = 0; j < aCollector.
GetCount(); )
 
 4088            aCollector.
Remove( item );
 
 4096            if( top->AsEdaItem() != item )
 
 4098                toAdd.insert( top->AsEdaItem() );
 
 4099                top->AsEdaItem()->SetFlags( 
CANDIDATE );
 
 4101                aCollector.
Remove( item );
 
 4110            aCollector.
Remove( item );
 
 4119        if( !aCollector.
HasItem( item ) )
 
 4120            aCollector.
Append( item );
 
 
 4127    std::set<BOARD_ITEM*> to_add;
 
 4130    for( 
int i = (
int) aCollector.
GetCount() - 1; i >= 0; --i )
 
 4139            aCollector.
Remove( item );
 
 4144        aCollector.
Append( item );
 
 
 4149                                                     bool aForcePromotion )
 const 
 4151    std::set<BOARD_ITEM*> to_add;
 
 4154    for( 
int i = aCollector.
GetCount() - 1; i >= 0; --i )
 
 4159            && ( !
frame()->GetPcbNewSettings()->m_AllowFreePads || aForcePromotion ) )
 
 4164            aCollector.
Remove( item );
 
 4169        aCollector.
Append( item );
 
 
 4176    for( 
int i = aCollector.
GetCount() - 1; i >= 0; --i )
 
 4181            aCollector.
Remove( item );
 
 
 4193    bool need_direct_hit = 
false;
 
 4201        need_direct_hit = 
true;
 
 4209            else if( item->IsBOARD_ITEM() )
 
 4210                fp = 
static_cast<BOARD_ITEM*
>( item )->GetParentFootprint();
 
 4216                single_fp = 
nullptr;
 
 4219            else if( !single_fp )
 
 4225            else if( single_fp != fp )
 
 4227                single_fp = 
nullptr;
 
 4233    auto visibleLayers =
 
 4241                        set.
set( layer, 
view()->IsLayerVisible( layer ) );
 
 4251    LSET layers = visibleLayers();
 
 4259        for( 
int layer : activeLayers )
 
 4262                layers.
set( layer );
 
 4267    for( 
int i = aCollector.
GetCount() - 1; i >= 0; --i )
 
 4283            aCollector.
Remove( item );
 
 4285        bool has_hit = 
false;
 
 4299            aCollector.
Remove( item );
 
 4304        else if( single_fp )
 
 4306            if( fp == single_fp )
 
 4309        else if( need_direct_hit )
 
 4323                aCollector.
Remove( item );
 
 
 4340    std::set<std::pair<PCB_TABLE*, int>> columns;
 
 4348            columns.insert( std::make_pair( 
table, cell->GetColumn() ) );
 
 4352    for( 
auto& [ 
table, col ] : columns )
 
 4354        for( 
int row = 0; row < 
table->GetRowCount(); ++row )
 
 
 4375    std::set<std::pair<PCB_TABLE*, int>> rows;
 
 4383            rows.insert( std::make_pair( 
table, cell->GetRow() ) );
 
 4387    for( 
auto& [ 
table, row ] : rows )
 
 4389        for( 
int col = 0; col < 
table->GetColCount(); ++col )
 
 
 4410    std::set<PCB_TABLE*> tables;
 
 4416            tables.insert( 
static_cast<PCB_TABLE*
>( cell->GetParent() ) );
 
 4423        if( !
table->IsSelected() )
 
 
std::function< void(const VECTOR2I &, GENERAL_COLLECTOR &, PCB_SELECTION_TOOL *)> CLIENT_SELECTION_FILTER
 
constexpr EDA_IU_SCALE pcbIUScale
 
constexpr BOX2I BOX2ISafe(const BOX2D &aInput)
 
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
 
static TOOL_ACTION cancelInteractive
 
static TOOL_ACTION unselectAll
 
static TOOL_ACTION selectItem
Select an item (specified as the event parameter).
 
static TOOL_ACTION cursorLeft
 
static TOOL_ACTION zoomOutCenter
 
static TOOL_ACTION unselectItem
 
static TOOL_ACTION zoomIn
 
static TOOL_ACTION cursorLeftFast
 
static TOOL_ACTION selectionCursor
Select a single item under the cursor position.
 
static TOOL_ACTION selectSetLasso
 
static TOOL_ACTION selectSetRect
Set lasso selection mode.
 
static TOOL_ACTION groupEnter
 
static TOOL_ACTION selectColumns
 
static TOOL_ACTION cursorDown
 
static TOOL_ACTION zoomOut
 
static TOOL_ACTION cursorRightFast
 
static TOOL_ACTION zoomCenter
 
static TOOL_ACTION panDown
 
static TOOL_ACTION cursorDblClick
 
static TOOL_ACTION selectionActivate
Activation of the selection tool.
 
static TOOL_ACTION cursorDownFast
 
static TOOL_ACTION selectionMenu
Run a selection menu to select from a list of items.
 
static TOOL_ACTION reselectItem
 
static TOOL_ACTION selectRows
 
static TOOL_ACTION cursorUpFast
 
static TOOL_ACTION panLeft
 
static TOOL_ACTION updateMenu
 
static TOOL_ACTION doDelete
 
static TOOL_ACTION selectionTool
 
static TOOL_ACTION cursorClick
 
static TOOL_ACTION zoomFitScreen
 
static TOOL_ACTION increment
 
static TOOL_ACTION selectionClear
Clear the current selection.
 
static TOOL_ACTION zoomFitObjects
 
static TOOL_ACTION zoomInCenter
 
static TOOL_ACTION panRight
 
static TOOL_ACTION selectTable
 
static TOOL_ACTION cursorUp
Cursor control with keyboard.
 
static TOOL_ACTION groupLeave
 
static TOOL_ACTION finishInteractive
 
static TOOL_ACTION cursorRight
 
static TOOL_ACTION selectAll
 
static TOOL_ACTION unselectItems
 
static TOOL_ACTION selectItems
Select a list of items (specified as the event parameter)
 
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
 
BASE_SET & reset(size_t pos)
 
BASE_SET & set(size_t pos)
 
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
 
static bool ClassOf(const EDA_ITEM *aItem)
Returns information if the object is derived from BOARD_CONNECTED_ITEM.
 
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
 
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
 
virtual bool IsConnected() const
Returns information if the object is derived from BOARD_CONNECTED_ITEM.
 
bool IsLocked() const override
 
virtual VECTOR2I GetCenter() const
This defaults to the center of the bounding box if not overridden.
 
virtual std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
 
FOOTPRINT * GetParentFootprint() const
 
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
 
virtual void RunOnChildren(const std::function< void(BOARD_ITEM *)> &aFunction, RECURSE_MODE aMode) const
Invoke a function on all children.
 
BOARD_ITEM_CONTAINER * GetParent() const
 
virtual bool IsOnCopperLayer() const
 
Information pertinent to a Pcbnew printed circuit board.
 
INSPECT_RESULT Visit(INSPECTOR inspector, void *testData, const std::vector< KICAD_T > &scanTypes) override
May be re-implemented for each derived class in order to handle all the types given by its member dat...
 
bool IsElementVisible(GAL_LAYER_ID aLayer) const
Test whether a given element category is visible.
 
const LSET & GetVisibleLayers() const
A proxy function that calls the correspondent function in m_BoardSettings.
 
bool IsLayerVisible(PCB_LAYER_ID aLayer) const
A proxy function that calls the correspondent function in m_BoardSettings tests whether a given layer...
 
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
 
constexpr void SetMaximum()
 
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
 
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
 
constexpr size_type GetWidth() const
 
constexpr Vec Centre() const
 
constexpr size_type GetHeight() const
 
constexpr bool Contains(const Vec &aPoint) const
 
constexpr const Vec & GetOrigin() const
 
constexpr const SizeVec & GetSize() const
 
CN_ANCHOR represents a physical location that can be connected: a pad or a track/arc/via endpoint.
 
BOARD_CONNECTED_ITEM * Parent() const
 
CN_EDGE represents a point-to-point connection, whether realized or unrealized (ie: tracks etc.
 
virtual double OnePixelInIU() const =0
 
void Transfer(int aIndex)
Move the item at aIndex (first position is 0) to the backup list.
 
void Empty()
Clear the list.
 
int GetCount() const
Return the number of objects in the list.
 
bool HasItem(const EDA_ITEM *aItem) const
Tests if aItem has already been collected.
 
void Remove(int aIndex)
Remove the item at aIndex (first position is 0).
 
void Append(EDA_ITEM *item)
Add an item to the end of the list.
 
A set of EDA_ITEMs (i.e., without duplicates).
 
std::unordered_set< EDA_ITEM * > & GetItems()
 
virtual EDA_ITEM * AsEdaItem()=0
 
A base class for most all the KiCad significant classes used in schematics and boards.
 
virtual VECTOR2I GetPosition() const
 
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
 
void SetFlags(EDA_ITEM_FLAGS aMask)
 
virtual EDA_GROUP * GetParentGroup() const
 
KICAD_T Type() const
Returns the type of object.
 
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
 
virtual bool IsType(const std::vector< KICAD_T > &aScanTypes) const
Check whether the item is one of the listed types.
 
virtual bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const
Test if aPosition is inside or on the boundary of this item.
 
EDA_ITEM * GetParent() const
 
bool HasFlag(EDA_ITEM_FLAGS aFlag) const
 
EDA_ITEM_FLAGS GetFlags() const
 
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
 
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
 
virtual std::vector< SHAPE * > MakeEffectiveShapesForHitTesting() const
 
virtual bool IsVisible() const
 
std::shared_ptr< SHAPE_COMPOUND > GetEffectiveTextShape(bool aTriangulate=true, const BOX2I &aBBox=BOX2I(), const EDA_ANGLE &aAngle=ANGLE_0) const
build a list of segments (SHAPE_SEGMENT) to describe a text shape.
 
static const TOOL_EVENT DisambiguatePoint
Used for hotkey feedback.
 
static const TOOL_EVENT ClearedEvent
 
static const TOOL_EVENT InhibitSelectionEditing
 
static const TOOL_EVENT SelectedEvent
 
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
 
static const TOOL_EVENT UninhibitSelectionEditing
Used to inform tool that it should display the disambiguation menu.
 
static const TOOL_EVENT PointSelectedEvent
 
static const TOOL_EVENT SelectedItemsMoved
Used to inform tools that the selection should temporarily be non-editable.
 
static const TOOL_EVENT UnselectedEvent
 
A general implementation of a COLLECTORS_GUIDE.
 
void SetIgnoreBlindBuriedVias(bool ignore)
 
void SetIgnoreTracks(bool ignore)
 
void SetIgnoreFootprintsOnFront(bool ignore)
 
void SetIgnoreFPTextOnFront(bool ignore)
 
void SetIgnoreMicroVias(bool ignore)
 
void SetIgnoreZoneFills(bool ignore)
 
void SetIgnorePadsOnBack(bool ignore)
 
void SetIgnoreFPTextOnBack(bool ignore)
 
void SetLayerVisibleBits(const LSET &aLayerBits)
 
void SetIgnoreThroughVias(bool ignore)
 
void SetIgnoreThroughHolePads(bool ignore)
 
void SetIgnoreFPReferences(bool ignore)
 
void SetIgnoreFPValues(bool ignore)
 
void SetIgnorePadsOnFront(bool ignore)
 
void SetIgnoreFootprintsOnBack(bool ignore)
 
Used when the right click button is pressed, or when the select tool is in effect.
 
void SetGuide(const COLLECTORS_GUIDE *aGuide)
Record which COLLECTORS_GUIDE to use.
 
const COLLECTORS_GUIDE * GetGuide() const
 
static const std::vector< KICAD_T > AllBoardItems
A scan list for all editable board items.
 
void Collect(BOARD_ITEM *aItem, const std::vector< KICAD_T > &aScanList, const VECTOR2I &aRefPos, const COLLECTORS_GUIDE &aGuide)
Scan a BOARD_ITEM using this class's Inspector method, which does the collection.
 
static const std::vector< KICAD_T > FootprintItems
A scan list for primary footprint items.
 
A color representation with 4 components: red, green, blue, alpha.
 
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
 
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const override
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
 
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1) override
Add a VIEW_ITEM to the view.
 
virtual void Remove(VIEW_ITEM *aItem) override
Remove a VIEW_ITEM from the view.
 
Represent a selection area (currently a rectangle) in a VIEW, drawn corner-to-corner between two poin...
 
VECTOR2I GetOrigin() const
 
void SetMode(SELECTION_MODE aMode)
 
void SetSubtractive(bool aSubtractive)
 
SELECTION_MODE GetMode() const
 
void SetAdditive(bool aAdditive)
 
void SetPoly(SHAPE_LINE_CHAIN &aPoly)
 
void SetOrigin(const VECTOR2I &aOrigin)
 
const BOX2I ViewBBox() const override
Set the origin of the rectangle (the fixed corner)
 
SHAPE_LINE_CHAIN & GetPoly()
 
void SetExclusiveOr(bool aExclusiveOr)
 
void SetEnd(const VECTOR2I &aEnd)
Set the current end of the rectangle (the corner that moves with the cursor.
 
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
 
const std::set< int > & GetHighlightNetCodes() const
Return the netcode of currently highlighted net.
 
const std::set< int > GetHighContrastLayers() const
Returns the set of currently high-contrast layers.
 
virtual COLOR4D GetColor(const VIEW_ITEM *aItem, int aLayer) const =0
Returns the color that should be used to draw the specific VIEW_ITEM on the specific layer using curr...
 
bool GetHighContrast() const
 
void SetHighlight(bool aEnabled, int aNetcode=-1, bool aMulti=false)
Turns on/off highlighting.
 
virtual void SetCursorPosition(const VECTOR2D &aPosition, bool aWarpView=true, bool aTriggeredByArrows=false, long aArrowCommand=0)=0
Move cursor to the requested position expressed in world coordinates.
 
virtual void SetAutoPan(bool aEnabled)
Turn on/off auto panning (this feature is used when there is a tool active (eg.
 
An abstract base class for deriving all objects that can be added to a VIEW.
 
bool IsBOARD_ITEM() const
 
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
 
BOX2D GetViewport() const
Return the current viewport visible area rectangle.
 
virtual void SetScale(double aScale, VECTOR2D aAnchor={ 0, 0 })
Set the scaling factor, zooming around a given anchor point.
 
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
 
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
 
void UpdateAllLayersColor()
Apply the new coloring scheme to all layers.
 
int Query(const BOX2I &aRect, std::vector< LAYER_ITEM_PAIR > &aResult) const
Find all visible items that touch or are within the rectangle aRect.
 
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
 
void Hide(VIEW_ITEM *aItem, bool aHide=true, bool aHideOverlay=false)
Temporarily hide the item in the view (e.g.
 
bool IsLayerVisible(int aLayer) const
Return information about visibility of a particular layer.
 
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
 
void MarkTargetDirty(int aTarget)
Set or clear target 'dirty' flag.
 
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Set the item visibility.
 
wxString AsString() const
 
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
 
LSET is a set of PCB_LAYER_IDs.
 
static const LSET & FrontMask()
Return a mask holding all technical layers and the external CU layer on front side.
 
static const LSET & BackMask()
Return a mask holding all technical layers and the external CU layer on back side.
 
LSEQ Seq(const LSEQ &aSequence) const
Return an LSEQ from the union of this LSET and a desired sequence.
 
LSEQ SeqStackupTop2Bottom(PCB_LAYER_ID aSelectedLayer=UNDEFINED_LAYER) const
Generate a sequence of layers that represent a top to bottom stack of this set of layers.
 
static const LSET & AllLayersMask()
 
static LSET AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
 
static const LSET & PhysicalLayersMask()
Return a mask holding all layers which are physically realized.
 
bool Contains(PCB_LAYER_ID aLayer) const
See if the layer set contains a PCB layer.
 
const VECTOR2I & GetPos() const
 
void ShapeToPolygon(SHAPE_LINE_CHAIN &aPolygon, int aScale=-1) const
Return the shape polygon in internal units in a SHAPE_LINE_CHAIN the coordinates are relatives to the...
 
Handle the data for a net.
 
static TOOL_ACTION deleteLastPoint
 
static TOOL_ACTION drag45Degree
 
static TOOL_ACTION unrouteSelected
Removes all tracks from the selected items to the first pad.
 
static TOOL_ACTION saveToLinkedDesignBlock
 
static TOOL_ACTION grabUnconnected
Select and move nearest unconnected footprint from ratsnest of selection.
 
static TOOL_ACTION filterSelection
Filter the items in the current selection (invokes dialog)
 
static TOOL_ACTION highlightNet
 
static TOOL_ACTION hideLocalRatsnest
 
static TOOL_ACTION properties
Activation of the edit tool.
 
static TOOL_ACTION selectOnSheetFromEeschema
Select all components on sheet from Eeschema crossprobing.
 
static TOOL_ACTION selectConnection
Select tracks between junctions or expands an existing selection to pads or the entire connection.
 
static TOOL_ACTION applyDesignBlockLayout
 
static TOOL_ACTION dragFreeAngle
 
static TOOL_ACTION clearHighlight
 
static TOOL_ACTION selectUnconnected
Select unconnected footprints from ratsnest of selection.
 
static TOOL_ACTION unrouteSegment
Removes track segment from the selected item to the next segment.
 
static TOOL_ACTION moveIndividually
move items one-by-one
 
static TOOL_ACTION syncSelection
Sets selection to specified items, zooms to fit, if enabled.
 
static TOOL_ACTION selectSameSheet
Select all components on the same sheet as the selected footprint.
 
static TOOL_ACTION selectNet
Select all connections belonging to a single net.
 
static TOOL_ACTION move
move or drag an item
 
static TOOL_ACTION syncSelectionWithNets
Sets selection to specified items with connected nets, zooms to fit, if enabled.
 
static TOOL_ACTION deselectNet
Remove all connections belonging to a single net from the active selection.
 
static TOOL_ACTION placeLinkedDesignBlock
 
static TOOL_ACTION selectOnSchematic
Select symbols/pins on schematic corresponding to selected footprints/pads.
 
Common, abstract interface for edit frames.
 
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
 
const PCB_DISPLAY_OPTIONS & GetDisplayOptions() const
Display options control the way tracks, vias, outlines and other things are shown (for instance solid...
 
double m_TrackOpacity
Opacity override for all tracks.
 
double m_FilledShapeOpacity
Opacity override for graphic shapes.
 
double m_ZoneOpacity
Opacity override for filled zone areas.
 
double m_ImageOpacity
Opacity override for user images.
 
double m_PadOpacity
Opacity override for SMD pads and PTHs.
 
double m_ViaOpacity
Opacity override for all types of via.
 
ZONE_DISPLAY_MODE m_ZoneDisplayMode
 
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
 
A set of BOARD_ITEMs (i.e., without duplicates).
 
static bool WithinScope(BOARD_ITEM *aItem, PCB_GROUP *aScope, bool isFootprintEditor)
 
static EDA_GROUP * TopLevelGroup(BOARD_ITEM *aItem, EDA_GROUP *aScope, bool isFootprintEditor)
 
Tool that displays edit points allowing to modify items by dragging the points.
 
bool HasPoint()
Indicate the cursor is over an edit point.
 
A PCB_POINT is a 0-dimensional point that is used to mark a position on a PCB, or more usually a foot...
 
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
 
std::vector< VECTOR2I > GetConnectionPoints() const
 
std::vector< PCB_TABLECELL * > GetCells() const
 
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
 
const VECTOR2I & GetStart() const
 
const VECTOR2I & GetEnd() const
 
A small class to help profiling.
 
void Start()
Start or restart the counter.
 
double msecs(bool aSinceLast=false)
 
static SEG::ecoord Square(int a)
 
static SELECTION_CONDITION HasType(KICAD_T aType)
Create a functor that tests if among the selected items there is at least one of a given type.
 
static bool NotEmpty(const SELECTION &aSelection)
Test if there are any items selected.
 
static SELECTION_CONDITION MoreThan(int aNumber)
Create a functor that tests if the number of selected items is greater than the value given as parame...
 
static SELECTION_CONDITION Count(int aNumber)
Create a functor that tests if the number of selected items is equal to the value given as parameter.
 
static SELECTION_CONDITION OnlyTypes(std::vector< KICAD_T > aTypes)
Create a functor that tests if the selected items are only of given types.
 
virtual void Add(EDA_ITEM *aItem)
 
virtual void Remove(EDA_ITEM *aItem)
 
void ClearReferencePoint()
 
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
 
void Move(const VECTOR2I &aVector) override
 
void GenerateBBoxCache() const
 
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
 
int PointCount() const
Return the number of points (vertices) in this line chain.
 
virtual bool Collide(const VECTOR2I &aP, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const override
Check if point aP lies closer to us than aClearance.
 
double Area(bool aAbsolute=true) const
Return the area of this chain.
 
virtual size_t GetPointCount() const override
 
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
 
const VECTOR2I & CLastPoint() const
Return the last point in the line chain.
 
void Remove(int aStartIndex, int aEndIndex)
Remove the range of points [start_index, end_index] from the line chain.
 
bool Collide(const SHAPE *aShape, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const override
Check if the boundary of shape (this) lies closer to the shape aShape than aClearance,...
 
virtual bool Collide(const VECTOR2I &aP, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const
Check if the boundary of shape (this) lies closer to the point aP than aClearance,...
 
Handle a list of polygons defining a copper zone.
 
bool GetIsRuleArea() const
Accessors to parameters used in Rule Area zones:
 
bool HitTestForCorner(const VECTOR2I &refPos, int aAccuracy, SHAPE_POLY_SET::VERTEX_INDEX *aCornerHit=nullptr) const
Test if the given VECTOR2I is near a corner.
 
bool HitTestForEdge(const VECTOR2I &refPos, int aAccuracy, SHAPE_POLY_SET::VERTEX_INDEX *aCornerHit=nullptr) const
Test if the given VECTOR2I is near a segment defined by 2 corners.
 
bool IsTeardropArea() const
 
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
 
bool GetDoNotAllowZoneFills() const
 
A type-safe container of any type.
 
#define IGNORE_NETS
Function GetConnectedItems() Returns a list of items connected to a source item aItem.
 
#define DEFAULT_TEXT_SIZE
Ratio of the font height to the baseline of the text above the wire.
 
static bool empty(const wxTextEntryBase *aCtrl)
 
std::function< INSPECT_RESULT(EDA_ITEM *aItem, void *aTestData) > INSPECTOR_FUNC
Used to inspect and possibly collect the (search) results of iterating over a list or tree of KICAD_T...
 
#define BRIGHTENED
item is drawn with a bright contour
 
#define IS_NEW
New item, just created.
 
#define SELECTED
Item was manually selected by the user.
 
#define ENTERED
indicates a group has been entered
 
#define SKIP_STRUCT
flag indicating that the structure should be ignored
 
#define CANDIDATE
flag indicating that the structure is connected
 
#define IS_MOVING
Item being moved.
 
a few functions useful in geometry calculations.
 
double m_PcbSelectionVisibilityRatio
Board object selection visibility limit.
 
@ LAYER_POINTS
PCB reference/manual snap points visibility.
 
@ LAYER_FOOTPRINTS_FR
Show footprints on front.
 
@ LAYER_DRAW_BITMAPS
Draw images.
 
@ LAYER_FP_REFERENCES
Show footprints references (when texts are visible).
 
@ LAYER_DRC_EXCLUSION
Layer for DRC markers which have been individually excluded.
 
@ LAYER_ZONES
Control for copper zone opacity/visibility (color ignored).
 
@ LAYER_PADS
Meta control for all pads opacity/visibility (color ignored).
 
@ LAYER_FOOTPRINTS_BK
Show footprints on back.
 
@ LAYER_FP_VALUES
Show footprints values (when texts are visible).
 
@ LAYER_VIAS
Meta control for all vias opacity/visibility.
 
PCB_LAYER_ID
A quick note on layer IDs:
 
PCB_LAYER_ID ToLAYER_ID(int aLayer)
 
This file contains miscellaneous commonly used macros and functions.
 
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
 
bool BoxHitTest(const VECTOR2I &aHitPoint, const BOX2I &aHittee, int aAccuracy)
Perform a point-to-box hit test.
 
@ REPAINT
Item needs to be redrawn.
 
@ TARGET_OVERLAY
Items that may change while the view stays the same (noncached)
 
@ NPTH
like PAD_PTH, but not plated mechanical use only, no connection allowed
 
@ PTH
Plated through hole pad.
 
Class that computes missing connections on a PCB.
 
static float distance(const SFVEC2UI &a, const SFVEC2UI &b)
 
Struct that will be set with the result of the user choices in the dialog.
 
bool includeLockedFootprints
 
bool includeItemsOnTechLayers
 
bool includeBoardOutlineLayer
 
const BOARD_ITEM * m_Item
 
This file contains data structures that are saved in the project file or project local settings file ...
 
bool otherItems
Anything not fitting one of the above categories.
 
bool vias
Vias (all types>
 
bool keepouts
Keepout zones.
 
bool graphics
Graphic lines, shapes, polygons.
 
bool footprints
Allow selecting entire footprints.
 
bool text
Text (free or attached to a footprint)
 
bool lockedItems
Allow selecting locked items.
 
bool tracks
Copper tracks.
 
bool dimensions
Dimension items.
 
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
 
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
 
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
 
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
 
@ PCB_GENERATOR_T
class PCB_GENERATOR, generator on a layer
 
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
 
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
 
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
 
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
 
@ PCB_ZONE_T
class ZONE, a copper pour area
 
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
 
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
 
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
 
@ NOT_USED
the 3d code uses this value
 
@ PCB_MARKER_T
class PCB_MARKER, a marker used to show something
 
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
 
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
 
@ PCB_TABLECELL_T
class PCB_TABLECELL, PCB_TEXTBOX for use in tables
 
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
 
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
 
@ PCB_PAD_T
class PAD, a pad in a footprint
 
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
 
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
 
@ PCB_NETINFO_T
class NETINFO_ITEM, a description of a net
 
@ PCB_POINT_T
class PCB_POINT, a 0-dimensional point
 
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
 
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
 
Casted dyn_cast(From aObject)
A lightweight dynamic downcast.
 
VECTOR2< int32_t > VECTOR2I
 
VECTOR2< double > VECTOR2D
 
VECTOR2D ToVECTOR2D(const wxPoint &aPoint)