30using namespace std::placeholders;
160 if( oldA && oldA->
m_Uuid == newId )
161 itemA->Enable(
false );
163 if( oldB && oldB->
m_Uuid == newId )
164 itemB->Enable(
false );
268 std::shared_ptr<SELECT_MENU> selectMenu = std::make_shared<SELECT_MENU>();
269 selectMenu->SetTool(
this );
270 m_menu->RegisterSubMenu( selectMenu );
272 std::shared_ptr<NET_CHAINS_MENU> netChainsMenu = std::make_shared<NET_CHAINS_MENU>();
273 netChainsMenu->SetTool(
this );
274 m_menu->RegisterSubMenu( netChainsMenu );
278 auto& menu =
m_menu->GetMenu();
280 auto activeToolCondition =
295 auto groupEnterCondition =
298 auto inGroupCondition =
309 if( aSel.GetSize() != 1 )
319 menu.AddMenu( netChainsMenu.get(), netItemSelection );
320 menu.AddSeparator( 1000 );
331 menu.AddSeparator( haveHighlight, 1 );
337 menu.AddSeparator( 1 );
381 wxMouseState keyboardState = wxGetMouseState();
383 setModifiersState( keyboardState.ShiftDown(), keyboardState.ControlDown(), keyboardState.AltDown() );
406 trackDragAction = cfg->m_TrackDragAction;
420 else if( evt->IsMouseDown(
BUT_LEFT ) )
458 bool selectionCancelled =
false;
462 selectPoint( evt->Position(),
false, &selectionCancelled );
467 m_frame->GetCanvas()->ForceRefresh();
469 if( !selectionCancelled )
475 else if( evt->IsDblClick(
BUT_LEFT ) )
517 const int delta = evt->Parameter<
int>();
577 wxASSERT_MSG(
false, wxT(
"Unknown selection mode" ) );
584 auto zoneFilledAreaFilter =
587 int accuracy = aCollector.GetGuide()->Accuracy();
588 std::set<EDA_ITEM*> remove;
594 ZONE* zone =
static_cast<ZONE*
>( item );
599 remove.insert( zone );
605 aCollector.Remove( item );
611 if( evt->HasPosition() )
614 &&
selectPoint( evt->DragOrigin(),
false,
nullptr, zoneFilledAreaFilter ) )
632 bool routable = ( segs >= 1 || arcs >= 1 || vias == 1 )
633 && ( segs + arcs + vias ==
m_selection.GetSize() );
657 else if( evt->IsCancel() )
666 else if( evt->FirstResponder() ==
this && evt->GetCommandId() == (
int) WXK_ESCAPE )
678 if( controller &&
m_frame->GetPcbNewSettings()->m_ESCClearsNetHighlight )
681 catch(
const std::runtime_error& e )
683 wxCHECK_MSG(
false, 0, e.what() );
694 if(
m_frame->ToolStackIsEmpty() )
700 && evt->HasPosition()
723 wxT(
"EnterGroup called when selection is not a single group" ) );
786 enum DISPOSITION { BEFORE = 1, AFTER,
BOTH };
788 std::map<EDA_ITEM*, DISPOSITION> itemDispositions;
797 itemDispositions[ item ] = BEFORE;
800 aClientFilter(
VECTOR2I(), collector,
this );
804 if( itemDispositions.count( item ) )
805 itemDispositions[ item ] =
BOTH;
807 itemDispositions[ item ] = AFTER;
815 for( std::pair<EDA_ITEM* const, DISPOSITION> itemDisposition : itemDispositions )
817 EDA_ITEM* item = itemDisposition.first;
818 DISPOSITION disposition = itemDisposition.second;
820 if( disposition == BEFORE )
824 for( std::pair<EDA_ITEM* const, DISPOSITION> itemDisposition : itemDispositions )
826 EDA_ITEM* item = itemDisposition.first;
827 DISPOSITION disposition = itemDisposition.second;
831 if( disposition == AFTER || disposition ==
BOTH )
835 m_frame->GetCanvas()->ForceRefresh();
891 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
893 if( !
Selectable( collector[ i ] ) || ( aOnDrag && collector[i]->IsLocked() ) )
899 size_t preFilterCount = collector.
GetCount();
906 if( collector.
GetCount() == 0 && preFilterCount > 0 )
909 editFrame->HighlightSelectionFilter( rejected );
924 aClientFilter( aWhere, collector,
this );
933 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
935 if( !collector[i]->IsSelected() )
947 catch(
const std::exception& exc )
949 wxLogWarning( wxS(
"Exception '%s' occurred attempting to guess selection candidates." ),
963 if( aSelectionCancelledFlag )
964 *aSelectionCancelledFlag =
true;
971 bool anySubtracted =
false;
978 anySubtracted =
true;
984 for(
int i = 0; i < collector.
GetCount(); ++i )
989 anySubtracted =
true;
999 if( addedCount == 1 )
1004 else if( addedCount > 1 )
1009 else if( anySubtracted )
1046 for(
int i = 0; aAllowedActions[i]; ++i )
1048 if( aEvent->
IsAction( aAllowedActions[i] ) )
1059 bool cancelled =
false;
1064 if( cell->IsSelected() )
1073 return ( aItem->GetFlags() &
CANDIDATE ) > 0;
1078 if( evt->IsCancelInteractive() || evt->IsActivate() )
1087 BOX2I selectionRect( evt->DragOrigin(), evt->Position() - evt->DragOrigin() );
1092 bool doSelect =
false;
1094 if( cell->HitTest( selectionRect,
false ) )
1099 doSelect = !wasSelected( cell );
1103 else if( wasSelected( cell ) )
1108 if( doSelect && !cell->IsSelected() )
1110 else if( !doSelect && cell->IsSelected() )
1114 else if( evt->IsMouseUp(
BUT_LEFT ) )
1118 bool anyAdded =
false;
1119 bool anySubtracted =
false;
1123 if( cell->IsSelected() && !wasSelected( cell ) )
1125 else if( wasSelected( cell ) && !cell->IsSelected() )
1126 anySubtracted =
true;
1158 bool cancelled =
false;
1173 if(
view->IsMirroredX() )
1174 greedySelection = !greedySelection;
1179 if( evt->IsCancelInteractive() || evt->IsActivate() )
1198 area.
SetEnd( evt->Position() );
1204 view->SetVisible( &area,
true );
1205 view->Update( &area );
1214 view->SetVisible( &area,
false );
1228 view->Remove( &area );
1260 bool cancelled =
false;
1278 bool isClockwise = shapeArea > 0 ? true :
false;
1280 if(
getView()->IsMirroredX() && shapeArea != 0 )
1281 isClockwise = !isClockwise;
1285 if( evt->IsCancelInteractive() || evt->IsActivate() )
1288 evt->SetPassEvent(
false );
1295 points.
Append( evt->Position() );
1297 else if( evt->IsDblClick(
BUT_LEFT )
1303 evt->SetPassEvent(
false );
1339 area.
SetMode( selectionMode );
1362 bool anyAdded =
false;
1363 bool anySubtracted =
false;
1371 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> candidates;
1373 view->Query( selectionBox, candidates );
1377 std::set<EDA_ITEM*> group_items;
1385 std::unordered_set<EDA_ITEM*>& newset =
group->GetItems();
1388 [&](
const BOX2I& aBox )
1390 return boxMode ? selectionBox.
Contains( aBox )
1396 if( containedMode && boxContained(
group->GetBoundingBox() ) && newset.size() )
1398 for(
EDA_ITEM* group_item : newset )
1400 if( !group_item->IsBOARD_ITEM() )
1404 collector.
Append( *newset.begin() );
1408 for(
EDA_ITEM* group_item : newset )
1409 group_items.emplace( group_item );
1415 return boxMode ? aItem->HitTest( selectionBox, containedMode )
1416 : aItem->HitTest( aArea.
GetPoly(), containedMode );
1419 for(
const auto& [item, layer] : candidates )
1421 if( !item->IsBOARD_ITEM() )
1426 if(
Selectable( boardItem ) && hitTest( boardItem )
1427 && ( !containedMode || !group_items.count( boardItem ) ) )
1430 padsCollector.
Append( boardItem );
1432 collector.
Append( boardItem );
1444 collector = padsCollector;
1451 std::sort( collector.
begin(), collector.
end(),
1454 VECTOR2I aPos = a->GetPosition();
1455 VECTOR2I bPos = b->GetPosition();
1457 if( aPos.y == bPos.y )
1458 return aPos.x < bPos.x;
1460 return aPos.y < bPos.y;
1465 if( !i->IsBOARD_ITEM() )
1470 if( aSubtractive || ( aExclusiveOr && item->
IsSelected() ) )
1473 anySubtracted =
true;
1487 else if( anySubtracted )
1494 wxMouseState keyboardState = wxGetMouseState();
1496 setModifiersState( keyboardState.ShiftDown(), keyboardState.ControlDown(), keyboardState.AltDown() );
1540 collection.
Append( item );
1553 m_frame->GetCanvas()->ForceRefresh();
1581 m_frame->GetCanvas()->ForceRefresh();
1591 std::set<int> representedNets;
1593 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
1599 else if ( representedNets.count( item->
GetNetCode() ) )
1602 representedNets.insert( item->
GetNetCode() );
1609 std::deque<EDA_ITEM*> selectedItems =
m_selection.GetItems();
1612 std::vector<BOARD_CONNECTED_ITEM*> toUnroute;
1613 std::set<EDA_ITEM*> toDelete;
1615 for(
EDA_ITEM* item : selectedItems )
1620 toUnroute.push_back(
pad );
1624 toDelete.insert( item );
1640 std::set<int> selectedNets;
1643 if( item->GetNetCode() > 0 )
1644 selectedNets.insert( item->GetNetCode() );
1646 std::set<VECTOR2I> endpointSet;
1652 endpointSet.insert( track->GetStart() );
1653 endpointSet.insert( track->GetEnd() );
1657 endpointSet.insert( item->GetPosition() );
1661 endpointSet.insert( item->GetPosition() );
1665 bool expanded =
true;
1673 if( toDelete.count( gen ) )
1677 std::map<VECTOR2I, int> epCount;
1679 for(
BOARD_ITEM* child : gen->GetBoardItems() )
1683 if( track && selectedNets.count( track->
GetNetCode() ) )
1686 epCount[track->
GetEnd()]++;
1691 bool connected =
false;
1693 for(
auto& [pt, count] : epCount )
1695 if( count == 1 && endpointSet.count( pt ) )
1704 toDelete.insert( gen );
1718 endpointSet.insert( track->GetStart() );
1719 endpointSet.insert( track->GetEnd() );
1742 std::set<BOARD_ITEM*> removed;
1746 if( !item->IsBOARD_ITEM() )
1752 toDelete.insert( bi );
1755 removed.insert( bi );
1761 for(
BOARD_ITEM* child : gen->GetBoardItems() )
1763 if( removed.count( child ) )
1765 toDelete.insert( gen );
1773 if( !item->IsBOARD_ITEM() )
1781 if( removed.find( aItem ) == removed.end() )
1784 removed.insert( aItem );
1789 if( removed.find( boardItem ) == removed.end() )
1790 commit.
Remove( boardItem );
1794 commit.
Push(
_(
"Unroute Selected" ) );
1799 for(
EDA_ITEM* item : selectedItems )
1811 std::deque<EDA_ITEM*> selectedItems =
m_selection.GetItems();
1814 std::vector<BOARD_CONNECTED_ITEM*> toUnroute;
1816 std::set<EDA_ITEM*> toDelete;
1818 for(
EDA_ITEM* item : selectedItems )
1829 if( !toDelete.count( gen ) )
1831 toDelete.insert( gen );
1835 toDelete.insert( generatedItem );
1845 toDelete.insert( item );
1850 toDelete.insert( item );
1854 toDelete.insert( generatedItem );
1865 std::deque<EDA_ITEM*> toSelectAfter;
1869 if( !item->IsBOARD_ITEM() )
1872 if( toDelete.find( item ) == toDelete.end() )
1873 toSelectAfter.push_back( item );
1877 std::set<BOARD_ITEM*> removed;
1881 if( !item->IsBOARD_ITEM() )
1891 if( removed.insert( aItem ).second )
1896 if( removed.insert( boardItem ).second )
1897 commit.
Remove( boardItem );
1901 if( removed.insert( boardItem ).second )
1902 commit.
Remove( boardItem );
1906 commit.
Push(
_(
"Unroute Segment" ) );
1911 for(
EDA_ITEM* item : toSelectAfter )
1913 if( !toDelete.count( item ) )
1926 unsigned initialCount = 0;
1938 if( initialCount == 0 )
1941 std::vector<PCB_SHAPE*> startShapes;
1946 startShapes.push_back(
static_cast<PCB_SHAPE*
>( item ) );
1950 if( !startShapes.empty() )
1956 m_frame->SetStatusText(
_(
"Select/Expand Connection..." ) );
1960 std::deque<EDA_ITEM*> selectedItems =
m_selection.GetItems();
1962 for(
EDA_ITEM* item : selectedItems )
1963 item->ClearTempFlags();
1965 std::vector<BOARD_CONNECTED_ITEM*> startItems;
1967 for(
EDA_ITEM* item : selectedItems )
1974 startItems.push_back(
pad );
1992 if(
m_selection.GetItems().size() > initialCount )
1996 m_frame->SetStatusText( wxEmptyString );
2009 double refreshIntervalMs = 500;
2010 int lastSelectionSize = (int)
m_selection.GetSize();
2014 std::set<PAD*> startPadSet;
2015 std::vector<BOARD_CONNECTED_ITEM*> cleanupItems;
2021 startPadSet.insert(
static_cast<PAD*
>( startItem ) );
2024 if( startItem->IsType( { PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T } ) )
2033 std::map<VECTOR2I, std::vector<PCB_TRACK*>> trackMap;
2034 std::map<VECTOR2I, PCB_VIA*> viaMap;
2035 std::map<VECTOR2I, PAD*> padMap;
2036 std::map<VECTOR2I, std::vector<PCB_SHAPE*>> shapeMap;
2037 std::vector<std::pair<VECTOR2I, LSET>> activePts;
2047 switch( item->Type() )
2053 trackMap[track->
GetStart()].push_back( track );
2054 trackMap[track->
GetEnd()].push_back( track );
2061 viaMap[
via->GetStart()] =
via;
2068 padMap[
pad->GetPosition()] =
pad;
2077 shapeMap[point].push_back( shape );
2088 switch( startItem->Type() )
2101 activePts.push_back( { startItem->GetPosition(), startItem->GetLayerSet() } );
2105 activePts.push_back( { startItem->GetPosition(), startItem->GetLayerSet() } );
2113 activePts.push_back( { point, startItem->GetLayerSet() } );
2126 while( expand && failSafe++ < 100000 )
2130 for(
int i = (
int) activePts.size() - 1; i >= 0; --i )
2138 auto exactIt = viaMap.find( pt );
2140 if( exactIt != viaMap.end() && ( exactIt->second->GetLayerSet() & layerSetCu ).any() )
2142 hitVia = exactIt->second;
2147 for(
auto& [pos,
via] : viaMap )
2149 if( !(
via->GetLayerSet() & layerSetCu ).any() )
2156 int radius =
via->GetWidth( layer ) / 2;
2157 int64_t radiusSq =
static_cast<int64_t
>(
radius ) *
radius;
2159 if( ( pt - pos ).SquaredEuclideanNorm() <= radiusSq )
2174 auto padIt = padMap.find( pt );
2176 bool gotVia = hitVia !=
nullptr;
2177 bool gotPad = padIt != padMap.end() && ( padIt->second->GetLayerSet() & layerSetCu ).any();
2178 bool gotNonStartPad = gotPad && ( startPadSet.find( padIt->second ) == startPadSet.end() );
2182 activePts.erase( activePts.begin() + i );
2188 activePts.erase( activePts.begin() + i );
2194 size_t pt_count = 0;
2198 if( track->GetStart() != track->GetEnd() && layerSetCu.
Contains( track->GetLayer() ) )
2202 if( pt_count > 2 || gotVia || gotNonStartPad )
2204 activePts.erase( activePts.begin() + i );
2210 if( gotNonStartPad )
2212 activePts.erase( activePts.begin() + i );
2219 PAD*
pad = padIt->second;
2224 cleanupItems.push_back(
pad );
2226 activePts.push_back( {
pad->GetPosition(),
pad->GetLayerSet() } );
2233 if( !layerSetCu.
Contains( track->GetLayer() ) )
2239 if( !track->IsSelected() )
2245 cleanupItems.push_back( track );
2247 if( track->GetStart() == pt )
2248 activePts.push_back( { track->GetEnd(), track->GetLayerSet() } );
2250 activePts.push_back( { track->GetStart(), track->GetLayerSet() } );
2259 if( !layerSetCu.
Contains( shape->GetLayer() ) )
2265 if( !shape->IsSelected() )
2271 cleanupItems.push_back( shape );
2273 for(
const VECTOR2I& newPoint : shape->GetConnectionPoints() )
2275 if( newPoint == pt )
2278 activePts.push_back( { newPoint, shape->GetLayerSet() } );
2294 cleanupItems.push_back( hitVia );
2301 maxRadius = std::max( maxRadius, hitVia->
GetWidth( layer ) / 2 );
2303 int64_t maxRadiusSq =
static_cast<int64_t
>( maxRadius ) * maxRadius;
2305 for(
auto& [trkPt, tracks] : trackMap )
2307 if( ( trkPt - viaPos ).SquaredEuclideanNorm() > maxRadiusSq )
2311 bool inside =
false;
2320 int r = hitVia->
GetWidth( trkLayer ) / 2;
2321 int64_t rSq =
static_cast<int64_t
>( r ) * r;
2323 if( ( trkPt - viaPos ).SquaredEuclideanNorm() <= rSq )
2331 activePts.push_back( { trkPt, hitVia->
GetLayerSet() } );
2339 activePts.erase( activePts.begin() + i );
2343 if( refreshTimer.
msecs() >= refreshIntervalMs )
2347 m_frame->GetCanvas()->ForceRefresh();
2351 refreshTimer.
Start();
2356 std::set<EDA_ITEM*> toDeselect;
2357 std::set<EDA_ITEM*> toSelect;
2362 if( !item->IsBOARD_ITEM() )
2370 toDeselect.insert( item );
2415 std::stack<PCB_SHAPE*> toSearch;
2416 std::set<PCB_SHAPE*> toCleanup;
2418 for(
PCB_SHAPE* startItem : aStartItems )
2419 toSearch.push( startItem );
2432 toSearch.push(
static_cast<PCB_SHAPE*
>( item ) );
2436 while( !toSearch.empty() )
2445 toCleanup.insert( shape );
2454 searchPoint( shape->
GetEnd() );
2465 std::vector<PAD*> pads;
2472 pads.push_back(
pad );
2476 pads.push_back(
static_cast<PAD*
>( item ) );
2485 for(
const CN_EDGE& edge : conn->GetRatsnestForPad(
pad ) )
2487 wxCHECK2( edge.GetSourceNode() && !edge.GetSourceNode()->Dirty(),
continue );
2488 wxCHECK2( edge.GetTargetNode() && !edge.GetTargetNode()->Dirty(),
continue );
2493 if( sourceParent ==
pad )
2496 select(
static_cast<PAD*
>( targetParent )->GetParent() );
2498 else if( targetParent ==
pad )
2501 select(
static_cast<PAD*
>( sourceParent )->GetParent() );
2515 std::vector<PAD*> pads;
2522 pads.push_back(
pad );
2526 pads.push_back(
static_cast<PAD*
>( item ) );
2537 const std::vector<CN_EDGE> edges = conn->GetRatsnestForPad(
pad );
2540 if( edges.size() == 0 )
2543 double currentDistance = DBL_MAX;
2547 for(
const CN_EDGE& edge : edges )
2549 if( edge.GetSourceNode()->Parent()->GetParentFootprint()
2550 == edge.GetTargetNode()->Parent()->GetParentFootprint() )
2556 const CN_ANCHOR* other = edge.GetSourceNode()->
Parent() ==
pad ? edge.GetTargetNode().get()
2557 : edge.GetSourceNode().get();
2559 wxCHECK2( other && !other->
Dirty(),
continue );
2565 if( edge.GetLength() < currentDistance )
2567 currentDistance = edge.GetLength();
2572 if( nearest !=
nullptr )
2586 for(
BOARD_ITEM* item : conn->GetNetItems( aNetCode, { PCB_TRACE_T,
2660 const wxString& chainName = netInfo->
GetNetChain();
2662 if( chainName.IsEmpty() )
2671 if( candidate && candidate->GetNetChain() == chainName )
2687 std::vector<BOARD_ITEM*> footprints;
2692 if( footprint ==
nullptr )
2695 wxString footprint_path = footprint->GetPath().AsString().BeforeLast(
'/' );
2697 if( footprint_path.IsEmpty() )
2698 footprint_path +=
'/';
2700 if( footprint_path == aSheetPath )
2701 footprints.push_back( footprint );
2717 std::list<int> netcodeList;
2718 std::vector<BOARD_CONNECTED_ITEM*> padList;
2722 switch( item->Type() )
2728 if(
pad->IsConnected() )
2730 netcodeList.push_back(
pad->GetNetCode() );
2731 padList.push_back(
pad );
2742 if(
pad->IsConnected() )
2744 netcodeList.push_back(
pad->GetNetCode() );
2745 padList.push_back(
pad );
2757 std::sort( padList.begin(), padList.end() );
2761 netcodeList.unique();
2767 std::vector<int> removeCodeList;
2770 for(
int netCode : netcodeList )
2774 if( !std::binary_search( padList.begin(), padList.end(),
pad ) )
2778 removeCodeList.push_back( netCode );
2784 for(
int removeCode : removeCodeList )
2785 netcodeList.remove( removeCode );
2787 std::unordered_set<BOARD_ITEM*> localConnectionList;
2789 for(
int netCode : netcodeList )
2791 for(
BOARD_ITEM* item : conn->GetNetItems( netCode, { PCB_TRACE_T,
2796 localConnectionList.insert( item );
2800 for(
BOARD_ITEM* item : localConnectionList )
2807 std::vector<BOARD_ITEM*>* items = aEvent.
Parameter<std::vector<BOARD_ITEM*>*>();
2818 std::vector<BOARD_ITEM*>* items = aEvent.
Parameter<std::vector<BOARD_ITEM*>*>();
2836 if( item->IsMoving() )
2853 if(
m_frame->GetPcbNewSettings()->m_CrossProbing.center_on_items )
2855 if(
m_frame->GetPcbNewSettings()->m_CrossProbing.zoom_to_fit )
2864 m_frame->GetCanvas()->ForceRefresh();
2874 wxString sheetPath = *aEvent.
Parameter<wxString*>();
2900 if( !footprint || footprint->
GetPath().empty() )
2906 wxString sheetPath = footprint->
GetPath().
AsString().BeforeLast(
'/' );
2908 if( sheetPath.IsEmpty() )
2929 screenSize.
x = std::max( 10.0, screenSize.
x );
2930 screenSize.
y = std::max( 10.0, screenSize.
y );
2935 double scale =
view->GetScale() / std::max( fabs( vsize.
x / screenSize.
x ),
2936 fabs( vsize.
y / screenSize.
y ) );
2942 m_frame->GetCanvas()->ForceRefresh();
2958#ifdef DEFAULT_PCBNEW_CODE
2960 auto screenSize =
view->ToWorld( GetCanvas()->GetClientSize(),
false );
2963 screenSize.x = std::max( 10.0, fabs( screenSize.x ) );
2964 screenSize.y = std::max( 10.0, screenSize.y );
2965 double ratio = std::max( fabs( bbSize.x / screenSize.x ), fabs( bbSize.y / screenSize.y ) );
2968 if( crossProbingSettings.zoom_to_fit && ( ratio < 0.5 || ratio > 1.0 ) )
2969 view->SetScale(
view->GetScale() / ratio );
2972#ifndef DEFAULT_PCBNEW_CODE
2989 double compRatio = bbSize.y / currTextHeight;
2992 double compRatioBent = 1.0;
3003 screenSize.
x = std::max( 10.0, fabs( screenSize.
x ) );
3004 screenSize.
y = std::max( 10.0, screenSize.
y );
3005 double ratio = std::max( -1.0, fabs( bbSize.y / screenSize.
y ) );
3008 double kicadRatio = std::max( fabs( bbSize.x / screenSize.
x ),
3009 fabs( bbSize.y / screenSize.
y ) );
3017 std::vector<std::pair<double, double>> lut {
3030 std::vector<std::pair<double, double>>::iterator it;
3032 compRatioBent = lut.back().second;
3034 if( compRatio >= lut.front().first )
3040 for( it = lut.begin(); it < lut.end() - 1; it++ )
3042 if( it->first <= compRatio &&
next( it )->first >= compRatio )
3044 double diffx = compRatio - it->first;
3045 double diffn =
next( it )->first - it->first;
3047 compRatioBent = it->second + (
next( it )->second - it->second ) * diffx / diffn;
3054 compRatioBent = lut.front().second;
3062 if( bbSize.x > screenSize.
x * ratio * compRatioBent )
3066 compRatioBent = 1.0;
3067 wxLogTrace(
"CROSS_PROBE_SCALE",
"Part TOO WIDE for screen. Using normal KiCad zoom ratio: %1.5f", ratio );
3072 ratio *= compRatioBent;
3074 bool alwaysZoom =
false;
3077 if( ( ratio < 0.5 || ratio > 1.0 ) || alwaysZoom )
3078 view->SetScale(
view->GetScale() / ratio );
3085 bool cleared =
false;
3097 switch( aItem->
Type() )
3101 int netCode =
static_cast<NETINFO_ITEM*
>( aItem )->GetNetCode();
3120 double marginFactor = 2;
3129 double scaleX = screenSize.
x /
static_cast<double>( aItem->
GetBoundingBox().GetWidth() );
3130 double scaleY = screenSize.
y /
static_cast<double>( aItem->
GetBoundingBox().GetHeight() );
3132 scaleX /= marginFactor;
3133 scaleY /= marginFactor;
3135 double scale = scaleX > scaleY ? scaleY : scaleX;
3154 m_frame->GetCanvas()->ForceRefresh();
3166 switch( aItem.
Type() )
3221 if( cmd != wxID_OK )
3232 if( !i->IsBOARD_ITEM() )
3254 std::set<BOARD_ITEM*> rejected;
3258 if( !i->IsBOARD_ITEM() )
3264 rejected.insert( item );
3268 aCollector.
Remove( item );
3333 aRejected->
pads =
true;
3345 aRejected->
tracks =
true;
3356 aRejected->
vias =
true;
3365 ZONE* zone =
static_cast<ZONE*
>( aItem );
3375 aRejected->
zones =
true;
3384 if( zone ==
m_frame->GetBoard()->m_SolderMaskBridges )
3415 aRejected->
text =
true;
3451 aRejected->
points =
true;
3499 bool enteredGroupFound =
false;
3502 [&](
EDA_ITEM* item,
void* testData )
3520 enteredGroupFound =
true;
3534 if( !enteredGroupFound )
3547 auto visibleLayers =
3555 set.
set( layer,
view()->IsLayerVisible( layer ) );
3577 bool onActiveLayer =
false;
3579 for(
int layer : activeLayers )
3582 if( layer < PCB_LAYER_ID_COUNT && aItem->IsOnLayer(
ToLAYER_ID( layer ) ) )
3584 onActiveLayer =
true;
3607 && footprint->
Pads().empty()
3608 && footprint->
Zones().empty() )
3625 for(
const ZONE* zone : footprint->
Zones() )
3657 const ZONE* zone =
nullptr;
3659 const PAD*
pad =
nullptr;
3672 switch( aItem->
Type() )
3678 zone =
static_cast<const ZONE*
>( aItem );
3696 if( !layerVisible( aItem->
GetLayer() ) )
3708 if( !( visibleLayers() &
via->GetLayerSet() ).any() )
3714 field =
static_cast<const PCB_FIELD*
>( aItem );
3730 if( !layerVisible(
text->GetLayer() ) )
3741 if(
text->GetText() == wxT(
"${REFERENCE}" ) )
3743 else if(
text->GetText() == wxT(
"${VALUE}" ) )
3746 if( !
view()->IsLayerVisible( controlLayer ) )
3760 if( !layerVisible( aItem->
GetLayer() ) )
3769 if( !layerVisible( aItem->
GetLayer() ) )
3775 if( !layerVisible( aItem->
GetLayer() ) )
3782 if( !layerVisible( aItem->
GetLayer() ) )
3790 if( !layerVisible( aItem->
GetLayer() ) )
3803 if( !layerVisible( aItem->
GetLayer() ) )
3812 pad =
static_cast<const PAD*
>( aItem );
3823 if( !(
pad->GetLayerSet() & visibleLayers() ).
any() )
3830 marker =
static_cast<const PCB_MARKER*
>( aItem );
3838 if( !layerVisible( aItem->
GetLayer() ) )
3892 aGroup->
Add( aItem );
3961 const unsigned GRIP_MARGIN = 20;
3967 if( !item->IsBOARD_ITEM() )
3970 BOX2I itemBox = item->ViewBBox();
3975 if( item->HitTest( aPoint, margin ) )
3982 group->RunOnChildren(
3985 if( aItem->
HitTest( aPoint, margin ) )
4005 SEG loc( aWhere, aWhere );
4007 switch( aItem->
Type() )
4015 if(
text->GetEffectiveTextShape()->Collide( loc, aMaxDistance, &
distance ) )
4037 shape->Collide( loc, aMaxDistance, &
distance );
4057 ZONE* zone =
static_cast<ZONE*
>( aItem );
4079 catch(
const std::exception& e )
4081 wxFAIL_MSG( wxString::Format( wxT(
"Clipper exception occurred: %s" ), e.what() ) );
4115 static_cast<PAD*
>( aItem )->Padstack().ForEachUniqueLayer(
4118 int layerDistance = INT_MAX;
4144 wxCHECK( settings, );
4147 LSET visibleLayers =
m_frame->GetBoard()->GetVisibleLayers();
4148 LSET enabledLayers =
m_frame->GetBoard()->GetEnabledLayers();
4151 wxCHECK( !enabledLayerStack.empty(), );
4153 auto isZoneFillKeepout =
4158 const ZONE* zone =
static_cast<const ZONE*
>( aItem );
4167 std::vector<LAYER_OPACITY_ITEM> opacityStackup;
4169 for(
int i = 0; i < aCollector.
GetCount(); i++ )
4173 LSET itemLayers = item->
GetLayerSet() & enabledLayers & visibleLayers;
4174 LSEQ itemLayerSeq = itemLayers.
Seq( enabledLayerStack );
4187 opacityItem.
m_Item = item;
4189 if( isZoneFillKeepout( item ) )
4192 opacityStackup.emplace_back( opacityItem );
4196 std::sort( opacityStackup.begin(), opacityStackup.end(),
4199 int retv = enabledLayerStack.TestLayers( aLhs.m_Layer, aRhs.m_Layer );
4204 return aLhs.m_Opacity > aRhs.m_Opacity;
4207 std::set<const BOARD_ITEM*> visibleItems;
4208 std::set<const BOARD_ITEM*> itemsToRemove;
4210 double currentStackupOpacity = 0.0;
4217 currentStackupOpacity = opacityItem.m_Opacity;
4218 lastVisibleLayer = opacityItem.m_Layer;
4219 visibleItems.emplace( opacityItem.m_Item );
4229 wxCHECK( item,
false );
4232 if( visibleItems.count( item ) )
4238 && visibleItems.count( item->
GetParent() ) )
4245 if( isZoneFillKeepout( item ) )
4252 if( opacityItem.m_Layer == enabledLayerStack[0] )
4254 visibleItems.emplace( opacityItem.m_Item );
4258 double itemVisibility = opacityItem.m_Opacity * ( 1.0 - currentStackupOpacity );
4260 if( ( itemVisibility <= minAlphaLimit ) && !ignoreItem() )
4261 itemsToRemove.emplace( opacityItem.m_Item );
4263 visibleItems.emplace( opacityItem.m_Item );
4266 if( opacityItem.m_Layer != lastVisibleLayer )
4268 currentStackupOpacity += opacityItem.m_Opacity * ( 1.0 - currentStackupOpacity );
4269 currentStackupOpacity = std::min( currentStackupOpacity, 1.0 );
4270 lastVisibleLayer = opacityItem.m_Layer;
4274 for(
const BOARD_ITEM* itemToRemove : itemsToRemove )
4276 wxCHECK( aCollector.
GetCount() > 1, );
4277 aCollector.
Remove( itemToRemove );
4300 static std::vector<KICAD_T> singleLayerSilkTypes = {
PCB_FIELD_T,
4312 std::set<BOARD_ITEM*> preferred;
4313 std::set<BOARD_ITEM*> rejected;
4320 if( silkLayers[activeLayer] )
4322 for(
int i = 0; i < aCollector.
GetCount(); ++i )
4326 if( item->
IsType( singleLayerSilkTypes ) && silkLayers[ item->
GetLayer() ] )
4327 preferred.insert( item );
4332 else if( courtyardLayers[activeLayer] && settings->
GetHighContrast() )
4334 for(
int i = 0; i < aCollector.
GetCount(); ++i )
4339 preferred.insert( item );
4343 if( preferred.size() > 0 )
4348 aCollector.
Append( item );
4350 if( preferred.size() == 1 )
4355 constexpr int MAX_SLOP = 5;
4359 int minSlop = INT_MAX;
4361 std::map<BOARD_ITEM*, int> itemsBySloppiness;
4363 for(
int i = 0; i < aCollector.
GetCount(); ++i )
4368 itemsBySloppiness[ item ] = itemSlop;
4370 if( itemSlop < minSlop )
4375 if( minSlop < INT_MAX )
4377 for( std::pair<BOARD_ITEM*, int> pair : itemsBySloppiness )
4379 if( pair.second > minSlop + singlePixel )
4386 constexpr double sizeRatio = 1.5;
4388 std::vector<std::pair<BOARD_ITEM*, double>> itemsByArea;
4390 for(
int i = 0; i < aCollector.
GetCount(); ++i )
4399 area = (double)
SEG::Square( singlePixel ) * MAX_SLOP;
4418 catch(
const std::exception& e )
4420 wxFAIL_MSG( wxString::Format( wxT(
"Clipper exception occurred: %s" ), e.what() ) );
4424 itemsByArea.emplace_back( item, area );
4427 std::sort( itemsByArea.begin(), itemsByArea.end(),
4428 [](
const std::pair<BOARD_ITEM*, double>& lhs,
4429 const std::pair<BOARD_ITEM*, double>& rhs ) ->
bool
4431 return lhs.second < rhs.second;
4434 bool rejecting =
false;
4436 for(
int i = 1; i < (int) itemsByArea.size(); ++i )
4438 if( itemsByArea[i].second > itemsByArea[i-1].second * sizeRatio )
4442 rejected.insert( itemsByArea[i].first );
4447 constexpr double maxCoverRatio = 0.70;
4449 for(
int i = 0; i < aCollector.
GetCount(); ++i )
4453 if( footprint->CoverageRatio( aCollector ) > maxCoverRatio )
4454 rejected.erase( footprint );
4459 if( (
unsigned) aCollector.
GetCount() > rejected.size() )
4471 bool haveItemOnActive =
false;
4474 for(
int i = 0; i < aCollector.
GetCount(); ++i )
4476 if( !aCollector[i]->IsOnLayer( activeLayer ) )
4477 rejected.insert( aCollector[i] );
4479 haveItemOnActive =
true;
4482 if( haveItemOnActive )
4495 m_frame->ShowInfoBarWarning(
_(
"Selection contains locked items. "
4496 "Enable 'Override locks' to operate on them." ),
4509 for(
int i = (
int) aCollector.
GetCount() - 1; i >= 0; --i )
4512 bool lockedDescendant =
false;
4518 lockedDescendant =
true;
4522 if( item->
IsLocked() || lockedDescendant )
4524 aCollector.
Remove( item );
4534 std::unordered_set<EDA_ITEM*> toAdd;
4538 for(
int j = 0; j < aCollector.
GetCount(); j++ )
4540 if( aCollector[j]->GetParent() )
4541 aCollector[j]->GetParent()->ClearFlags(
CANDIDATE );
4543 if( aCollector[j]->GetParentFootprint() )
4544 aCollector[j]->GetParentFootprint()->ClearFlags(
CANDIDATE );
4549 for(
int j = 0; j < aCollector.
GetCount(); j++ )
4553 for(
int j = 0; j < aCollector.
GetCount(); )
4565 aCollector.
Remove( item );
4573 if(
top->AsEdaItem() != item )
4575 toAdd.insert(
top->AsEdaItem() );
4578 aCollector.
Remove( item );
4587 aCollector.
Remove( item );
4596 if( !aCollector.
HasItem( item ) )
4597 aCollector.
Append( item );
4604 std::set<BOARD_ITEM*> to_add;
4607 for(
int i = (
int) aCollector.
GetCount() - 1; i >= 0; --i )
4616 aCollector.
Remove( item );
4621 aCollector.
Append( item );
4626 bool aForcePromotion )
const
4628 std::set<BOARD_ITEM*> to_add;
4631 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
4636 && ( !
frame()->GetPcbNewSettings()->m_AllowFreePads || aForcePromotion ) )
4641 aCollector.
Remove( item );
4646 aCollector.
Append( item );
4653 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
4658 aCollector.
Remove( item );
4670 bool need_direct_hit =
false;
4678 need_direct_hit =
true;
4686 else if( item->IsBOARD_ITEM() )
4687 fp =
static_cast<BOARD_ITEM*
>( item )->GetParentFootprint();
4693 single_fp =
nullptr;
4696 else if( !single_fp )
4702 else if( single_fp != fp )
4704 single_fp =
nullptr;
4710 auto visibleLayers =
4718 set.
set( layer,
view()->IsLayerVisible( layer ) );
4728 LSET layers = visibleLayers();
4736 for(
int layer : activeLayers )
4739 layers.
set( layer );
4744 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
4760 aCollector.
Remove( item );
4762 bool has_hit =
false;
4776 aCollector.
Remove( item );
4781 else if( single_fp )
4783 if( fp == single_fp )
4786 else if( need_direct_hit )
4800 aCollector.
Remove( item );
4817 std::set<std::pair<PCB_TABLE*, int>> columns;
4825 columns.insert( std::make_pair(
table, cell->GetColumn() ) );
4829 for(
auto& [
table, col ] : columns )
4831 for(
int row = 0; row <
table->GetRowCount(); ++row )
4852 std::set<std::pair<PCB_TABLE*, int>> rows;
4860 rows.insert( std::make_pair(
table, cell->GetRow() ) );
4864 for(
auto& [
table, row ] : rows )
4866 for(
int col = 0; col <
table->GetColCount(); ++col )
4887 std::set<PCB_TABLE*> tables;
4893 tables.insert(
static_cast<PCB_TABLE*
>( cell->GetParent() ) );
4900 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)
virtual void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Execute the changes.
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.
NETINFO_ITEM * GetNet() const
Return #NET_INFO object for a given 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.
COMMIT & Remove(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Remove a new item from the model.
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 & AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
LSEQ CuStack() const
Return a sequence of copper layers in starting from the front/top and extending to the back/bottom.
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 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.
const wxString & GetNetChain() const
PAD * GetTerminalPad(int aIndex) const
static TOOL_ACTION deleteLastPoint
static TOOL_ACTION drag45Degree
static TOOL_ACTION selectNetChain
Select all connections belonging to every net in the current item's net chain.
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 setTerminalPad
static TOOL_ACTION highlightNet
static TOOL_ACTION hideLocalRatsnest
static TOOL_ACTION properties
Activation of the edit tool.
static TOOL_ACTION highlightNetChain
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.
The main frame for Pcbnew.
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)
std::unordered_set< BOARD_ITEM * > GetBoardItems() const
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
VECTOR2I GetPosition() const override
int GetWidth() const override
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
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()
bool Empty() const
Checks if there is anything selected.
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)
std::function< bool(const SELECTION &)> SELECTION_CONDITION
Functor type that checks a specific condition for selected items.
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.
KIBIS top(path, &reporter)
std::vector< std::vector< std::string > > table
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)