41#include <unordered_set>
76 if( aSel.GetSize() == 1 )
90 return aSel.GetSize() == 1 && aSel.Front()->Type() ==
SCH_SYMBOL_T;
96 if( aSel.GetSize() == 1 )
110 if( aSel.GetSize() == 1 )
124 if( aSel.GetSize() == 1 )
128 if(
pin &&
pin->GetLibPin() )
129 return !
pin->GetLibPin()->GetAlternates().empty();
147 return aSel.GetSize() > 1 && aSel.OnlyContains( {
SCH_SYMBOL_T } );
153 return aSel.GetSize() >= 1 && aSel.OnlyContains( {
SCH_PIN_T } );
198 if( !
pin || !frame || !
pin->Connection() )
207 m_oldA = sig->GetTerminalPinA();
208 m_oldB = sig->GetTerminalPinB();
215 itemA->Enable(
false );
218 itemB->Enable(
false );
266 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] update() invoked" );
273 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] defer: toolMgr not yet available" );
279 if( !selTool || !frame )
281 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] abort: selTool=%p frame=%p", (
void*) selTool, (
void*) frame );
288 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] abort: empty selection" );
292 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] selection size=%u", sel.
GetSize() );
297 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] abort: no connection graph" );
304 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] added createNetChain" );
308 auto pinFrom = [&](
int idx ) ->
SCH_PIN*
310 if( idx >= (
int) sel.
GetSize() )
316 bool singlePin = sel.
GetSize() == 1 && pinFrom( 0 ) && pinFrom( 0 )->Connection();
317 bool inSignal =
false;
318 bool canName =
false;
319 bool canRemove =
false;
322 for(
size_t i = 0; i < sel.
GetSize(); ++i )
327 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] sel[%zu]: not a pin or no connection", i );
333 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] sel[%zu]: pin uuid=%s net=%s committedSignal=%d", i,
344 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] flags: singlePin=%d inSignal=%d canName=%d canRemove=%d", singlePin, inSignal, canName, canRemove );
350 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] added highlightNetChain" );
357 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] added removeFromNetChain" );
361 if( singlePin && inSignal )
364 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] added replaceTerminalPin submenu" );
371 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] added nameNetChain" );
378 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] createNetChainBetweenPins attempted added=%d", added );
392 if( isConnectedPin || isConnectedWireOrBus )
395 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] added createNetChain for single connected item" );
404 wxMenuItem* placeholder = Append( wxID_ANY,
_(
"(No net chain actions)" ) );
405 placeholder->Enable(
false );
428 wxString label = wxString::Format(
_(
"Create Net Chain between %s:%s and %s:%s" ),
440 for(
EDA_ITEM* item : aSel.Items() )
444 if( schItem->IsLocked() )
455 for(
EDA_ITEM* item : aSel.Items() )
459 if( !schItem->IsLocked() )
470 for(
int i = 0; aAllowedActions[i]; ++i )
472 if( aEvent->
IsAction( aAllowedActions[i] ) )
481#define HITTEST_THRESHOLD_PIXELS 5
568 if( symbolEditorFrame )
583 auto expandableSelection =
591 auto schEditSheetPageNumberCondition =
601 auto schEditCondition =
607 auto belowRootSheetCondition =
631 auto groupEnterCondition =
634 auto inGroupCondition =
640 auto multipleUnitsSelection = [](
const SELECTION& aSel )
649 m_frame->eeconfig()->m_Input.allow_unconstrained_pin_swaps;
653 auto& menu =
m_menu->GetMenu();
660 return aSel.GetSize() >= 1 && aSel.OnlyContains( {
SCH_PIN_T } );
667 if( aSel.GetSize() != 1 )
677 if( !schItem->
IsType( { SCH_ITEM_LOCATE_WIRE_T, SCH_ITEM_LOCATE_BUS_T } ) )
688 return aSel.GetSize() >= 1 && aSel.OnlyContains( {
SCH_SYMBOL_T } );
691 std::shared_ptr<NET_CHAIN_MENU> netChainMenu = std::make_shared<NET_CHAIN_MENU>();
692 netChainMenu->SetTool(
this );
693 m_menu->RegisterSubMenu( netChainMenu );
708 menu.AddSeparator( 100 );
712 menu.AddSeparator( 100 );
719 menu.AddSeparator( 200 );
737 menu.AddSeparator( 400 );
740 menu.AddMenu( netChainMenu.get(), ( pinSelection || wireOrBusInSignal || symbolSelection ) &&
SCH_CONDITIONS::Idle, 400 );
742 menu.AddSeparator( 1000 );
778 if( symbolEditFrame )
805 auto pinOrientation =
815 return pin->GetOrientation();
820 return dummy.GetOrientation();
844 bool selCancelled =
false;
845 bool displayWireCursor =
false;
846 bool displayBusCursor =
false;
847 bool displayLineCursor =
false;
848 KIID rolloverItemId = lastRolloverItemId;
852 evt->Modifier(
MD_ALT ) );
858 if( !
m_frame->ToolStackIsEmpty() )
892 schframe->ClearFocus();
899 size_t preFilterCount = collector.
GetCount();
901 narrowSelection( collector, evt->Position(),
false,
false, &rejected );
908 bool allCellsFromSameTable =
true;
920 allCellsFromSameTable =
false;
940 VECTOR2D bottomRight( std::max( start.
x,
end.x ), std::max( start.
y,
end.y ) );
963 else if( collector[0]->HasHoveredHypertext() )
965 collector[ 0 ]->DoHypertextAction(
m_frame, evt->Position() );
968 else if( collector[0]->IsBrightened() )
974 schframe->SelectNetNavigatorItem( &itemData );
981 if( collector.
GetCount() == 0 && preFilterCount > 0 )
984 frame->HighlightSelectionFilter( rejected );
999 SelectPoint( evt->Position(), { SCH_LOCATE_ANY_T },
nullptr, &selCancelled );
1008 .Contains( evt->Position() ) )
1012 if(
CollectHits( collector, evt->Position(), { SCH_LOCATE_ANY_T } ) )
1016 SelectPoint( evt->Position(), { SCH_LOCATE_ANY_T },
nullptr, &selCancelled );
1024 else if( evt->IsDblClick(
BUT_LEFT ) )
1030 schframe->ClearFocus();
1049 if( evt->Modifier(
MD_CTRL ) )
1061 evt->SetPassEvent();
1068 schframe->ClearFocus();
1078 else if(
CollectHits( collector, evt->DragOrigin(), { SCH_TABLECELL_T } )
1079 && ( collector[0]->GetParent()->GetParentGroup() ==
nullptr
1080 || collector[0]->GetParent()->GetParentGroup() ==
m_enteredGroup ) )
1143 else if( evt->IsMouseDown(
BUT_AUX1 ) )
1147 else if( evt->IsMouseDown(
BUT_AUX2 ) )
1163 const int delta = evt->Parameter<
int>();
1206 wxString alt = *evt->Parameter<wxString*>();
1230 newItems.push_back( nc );
1233 if( !commit.
Empty() )
1235 commit.
Push( wxS(
"No Connect Pins" ) );
1254 switch( pinOrientation( item ) )
1275 newItems.push_back( wire );
1278 if( !commit.
Empty() )
1296 commit.
Push( wxS(
"Wire Pins" ) );
1316 labelText =
pin->GetShownName();
1318 if( labelText.IsEmpty() )
1320 labelText.Printf(
"%s_%s",
1321 pin->GetParentSymbol()->GetRef( &sheetPath ),
1327 labelText = sheetPin->
GetShownText( &sheetPath,
false );
1334 switch( *evt->GetCommandId() )
1337 label =
new SCH_LABEL( item->GetPosition(), labelText );
1340 label =
new SCH_HIERLABEL( item->GetPosition(), labelText );
1349 switch( pinOrientation( item ) )
1370 pinType =
pin->GetType();
1406 newItems.push_back( label );
1409 if( !commit.
Empty() )
1411 commit.
Push( wxS(
"Label Pins" ) );
1423 wxString* net =
new wxString( *evt->Parameter<wxString*>() );
1427 else if( evt->IsCancelInteractive() )
1437 schframe->ClearFocus();
1443 else if( evt->FirstResponder() ==
this && evt->GetCommandId() == (
int) WXK_ESCAPE )
1453 if(
editor &&
m_frame->eeconfig()->m_Input.esc_clears_net_highlight )
1454 editor->ClearHighlight( *evt );
1461 schframe->ClearFocus();
1463 else if( evt->IsMotion() && !
m_isSymbolEditor && evt->FirstResponder() ==
this )
1482 displayBusCursor =
true;
1484 displayWireCursor =
true;
1486 displayLineCursor =
true;
1488 else if( collector[0]->HasHypertext() && !collector[0]->IsSelected() )
1490 rolloverItemId = collector[0]->m_Uuid;
1497 evt->SetPassEvent();
1500 if( lastRolloverItemId !=
niluuid && lastRolloverItemId != rolloverItemId )
1509 m_frame->GetCanvas()->GetView()->Update( item );
1514 if( rolloverItemId !=
niluuid )
1516 rolloverItem =
static_cast<SCH_ITEM*
>(
m_frame->ResolveItem( rolloverItemId ) );
1523 m_frame->GetCanvas()->GetView()->Update( rolloverItem );
1526 lastRolloverItemId = rolloverItemId;
1528 if(
m_frame->ToolStackIsEmpty() )
1530 if( displayWireCursor )
1534 else if( displayBusCursor )
1538 else if( displayLineCursor )
1548 && evt->HasPosition()
1573 wxT(
"EnterGroup called when selection is not a single group" ) );
1627 if(
m_frame->eeconfig()->m_Drawing.auto_start_wires
1660 if( possibleConnection.
IsBus() )
1668 if( !
pin || !
pin->IsPointClickableAnchor( pos ) )
1671 if( !
pin->IsVisible()
1672 && !(
m_frame->eeconfig()->m_Appearance.show_hidden_pins
1673 ||
m_frame->GetRenderSettings()->m_ShowHiddenPins ) )
1679 newEvt->SetMousePosition( pos );
1680 newEvt->SetHasPosition(
true );
1681 newEvt->SetForceImmediate(
true );
1694 wxMouseState keyboardState = wxGetMouseState();
1697 keyboardState.AltDown() );
1712 wxMouseState keyboardState = wxGetMouseState();
1715 keyboardState.AltDown() );
1736 const std::vector<KICAD_T>& aScanTypes )
1739 int gridThreshold =
KiROUND(
getView()->GetGAL()->GetGridSize().EuclideanNorm() / 2.0 );
1740 aCollector.
m_Threshold = std::max( pixelThreshold, gridThreshold );
1760 int originalCount = aCollector.
GetCount();
1762 for(
int ii = 0; ii < originalCount; ++ii )
1764 if( aCollector[ii]->Type() ==
SCH_PIN_T )
1768 if( !aCollector.
HasItem(
pin->GetParentSymbol() ) )
1769 aCollector.
Append(
pin->GetParentSymbol() );
1780 bool aCheckLocked,
bool aSelectedOnly,
1785 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
1787 if( symbolEditorFrame )
1794 if( !
static_cast<SCH_FIELD*
>( item )->IsVisible()
1803 if( !
static_cast<SCH_PIN*
>( item )->IsVisible()
1818 if( aCheckLocked && collector[i]->IsLocked() )
1832 if( aSelectedOnly && !collector[i]->IsSelected() )
1848 EDA_ITEM** aItem,
bool* aSelectionCancelledFlag,
bool aAdd,
1849 bool aSubtract,
bool aExclusiveOr )
1867 if( aSelectionCancelledFlag )
1868 *aSelectionCancelledFlag =
true;
1874 if( !aAdd && !aSubtract && !aExclusiveOr )
1882 bool foundEnteredGroup =
false;
1887 foundEnteredGroup =
true;
1892 if( !foundEnteredGroup )
1899 bool anySubtracted =
false;
1903 for(
int i = 0; i < aCollector.
GetCount(); ++i )
1906 bool isLine = aCollector[i]->Type() ==
SCH_LINE_T;
1922 || ( aExclusiveOr && aCollector[i]->IsSelected()
1923 && ( !isLine || ( isLine && aCollector[i]->HasFlag( flags ) ) ) ) )
1925 aCollector[i]->ClearFlags( flags );
1935 anySubtracted =
true;
1940 aCollector[i]->SetFlags( flags );
1947 if( addedCount == 1 )
1951 if( aItem && aCollector.
GetCount() == 1 )
1952 *aItem = aCollector[0];
1956 else if( addedCount > 1 )
1961 else if( anySubtracted )
1967 m_frame->GetCanvas()->ForceRefresh();
1973 const std::vector<KICAD_T>& aScanTypes,
1974 EDA_ITEM** aItem,
bool* aSelectionCancelledFlag,
1975 bool aCheckLocked,
bool aAdd,
bool aSubtract,
1980 if( !
CollectHits( collector, aWhere, aScanTypes ) )
1983 size_t preFilterCount = collector.
GetCount();
1985 rejected.
SetAll(
false );
1986 narrowSelection( collector, aWhere, aCheckLocked, aSubtract, &rejected );
1988 if( collector.
GetCount() == 0 && preFilterCount > 0 )
1991 frame->HighlightSelectionFilter( rejected );
1993 if( !aAdd && !aSubtract && !aExclusiveOr &&
m_selection.GetSize() > 0 )
2002 return selectPoint( collector, aWhere, aItem, aSelectionCancelledFlag, aAdd, aSubtract,
2013 std::vector<EDA_ITEM*> sheetPins;
2019 view->
Query( selectionBox,
2027 collection.
Append( item );
2041 sheetPins.emplace_back(
pin );
2062 m_frame->GetCanvas()->ForceRefresh();
2072 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> selectedItems;
2078 view->
Query( selectionBox, selectedItems );
2105 m_frame->GetCanvas()->ForceRefresh();
2113 std::set<EDA_ITEM*> exactHits;
2115 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
2128 if( item->
HitTest( aPos, pixelThreshold ) )
2129 exactHits.insert( item );
2138 if(
m_frame->GetRenderSettings()->m_ShowPinsElectricalType )
2141 if( item->
HitTest( aPos, 0 ) )
2142 exactHits.insert( item );
2148 if( exactHits.size() > 0 && exactHits.size() < (
unsigned) collector.
GetCount() )
2150 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
2154 if( !exactHits.contains( item ) )
2160 SEG poss( aPos, aPos );
2162 int closestDist = INT_MAX / 4;
2166 BOX2I bbox = item->GetBoundingBox();
2167 int dist = INT_MAX / 4;
2172 bool dominating =
false;
2174 if( exactHits.contains( item ) )
2212 text->GetEffectiveTextShape(
false )->Collide( poss, INT_MAX / 4, &dist );
2218 shapes->Collide( poss, INT_MAX / 4, &dist );
2232 rect.
Collide( poss, closestDist, &dist );
2250 if( dist == closestDist )
2252 if( item->GetParent() == closest )
2255 else if( dist < closestDist )
2271 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
2275 if( item == closest )
2278 if( !item->
HitTest( tightBox,
true ) )
2286 bool aPromoteCellSelections,
2287 bool aPromoteGroups )
2289 bool anyUnselected =
false;
2290 bool anySelected =
false;
2303 bool isMoving =
false;
2305 for(
int i = (
int)
m_selection.GetSize() - 1; i >= 0; --i )
2308 isMoving |=
static_cast<SCH_ITEM*
>( item )->IsMoving();
2310 if( !item->
IsType( aScanTypes ) )
2313 anyUnselected =
true;
2321 if( aPromoteGroups )
2323 for(
int i = (
int)
m_selection.GetSize() - 1; i >= 0; --i )
2327 std::set<EDA_ITEM*> selectedChildren;
2333 if( aChild->
IsType( aScanTypes ) )
2334 selectedChildren.insert( aChild );
2338 anyUnselected =
true;
2341 for(
EDA_ITEM* child : selectedChildren )
2343 if( !child->IsSelected() )
2355 if( aPromoteCellSelections )
2357 std::set<EDA_ITEM*> parents;
2359 for(
int i = (
int)
m_selection.GetSize() - 1; i >= 0; --i )
2367 anyUnselected =
true;
2373 if( !parent->IsSelected() )
2396 std::set<EDA_ITEM*> rejected;
2401 rejected.insert( item );
2405 aCollector.
Remove( item );
2416 if( schItem->IsLocked() && !
m_filter.lockedItems )
2425 switch( aItem->
Type() )
2443 aRejected->
pins =
true;
2453 aRejected->
wires =
true;
2461 switch(
static_cast<SCH_LINE*
>( aItem )->GetLayer() )
2468 aRejected->
wires =
true;
2504 aRejected->
text =
true;
2516 aRejected->
labels =
true;
2526 aRejected->
images =
true;
2606 bool cancelled =
false;
2622 isGreedy = !isGreedy;
2627 if( evt->IsCancelInteractive() || evt->IsActivate() )
2640 area.
SetEnd( evt->Position() );
2657 evt->SetPassEvent(
false );
2679 bool cancelled =
false;
2695 bool isClockwise = shapeArea > 0 ? true :
false;
2697 if(
getView()->IsMirroredX() && shapeArea != 0 )
2698 isClockwise = !isClockwise;
2711 if( evt->IsCancelInteractive() || evt->IsActivate() )
2720 points.
Append( evt->Position() );
2722 else if( evt->IsDblClick(
BUT_LEFT )
2761 area.
SetMode( selectionMode );
2788 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> candidates;
2790 view->
Query( selectionRect, candidates );
2792 std::set<SCH_ITEM*> uniqueCandidates;
2794 for(
const auto& [viewItem, layer] : candidates )
2796 if( viewItem->IsSCH_ITEM() )
2797 uniqueCandidates.insert(
static_cast<SCH_ITEM*
>( viewItem ) );
2806 if( boxMode ? selectionRect.
Intersects(
pin->GetBoundingBox() )
2808 uniqueCandidates.insert(
pin );
2815 if( boxMode ? selectionRect.
Intersects(
pin->GetBoundingBox() )
2817 uniqueCandidates.insert(
pin );
2822 if( field.IsVisible()
2823 && ( boxMode ? selectionRect.
Intersects( field.GetBoundingBox() )
2826 uniqueCandidates.insert( &field );
2834 std::set<EDA_ITEM*> group_items;
2843 std::unordered_set<EDA_ITEM*>& newset =
group->GetItems();
2846 [&](
const BOX2I& aBox )
2848 return boxMode ? selectionRect.
Contains( aBox )
2852 if( containedMode && boxContained(
group->GetBoundingBox() ) && newset.size() )
2854 for(
EDA_ITEM* group_item : newset )
2856 if( !group_item->IsSCH_ITEM() )
2860 collector.
Append( group_item );
2864 for(
EDA_ITEM* group_item : newset )
2865 group_items.emplace( group_item );
2871 return boxMode ? aItem->HitTest( selectionRect, containedMode )
2872 : aItem->HitTest( aArea.
GetPoly(), containedMode );
2875 for(
SCH_ITEM* item : uniqueCandidates )
2878 && ( !containedMode || !group_items.count( item ) ) )
2881 pinsCollector.
Append( item );
2883 collector.
Append( item );
2892 collector = pinsCollector;
2897 std::sort( collector.
begin(), collector.
end(),
2900 VECTOR2I aPos = a->GetPosition();
2901 VECTOR2I bPos = b->GetPosition();
2903 if( aPos.y == bPos.y )
2904 return aPos.x < bPos.x;
2906 return aPos.y < bPos.y;
2909 bool anyAdded =
false;
2910 bool anySubtracted =
false;
2915 if( aSubtractive || ( aExclusiveOr && aItem->
IsSelected() ) )
2925 anySubtracted =
true;
2928 if( flags && !anySubtracted )
2939 std::vector<EDA_ITEM*> flaggedItems;
2941 auto shapeContains =
2944 return boxMode ? selectionRect.
Contains( aPoint )
2953 flaggedItems.push_back( item );
2955 if(
m_frame->GetRenderSettings()->m_ShowPinsElectricalType )
2964 hits = line->
HitTest( selectionRect,
false );
2968 if( ( !containedMode && hits )
2973 else if( containedMode )
2983 selectItem( item, flags );
2986 selectItem( item, flags );
2991 for(
EDA_ITEM* item : pinsCollector )
2993 if(
m_frame->GetRenderSettings()->m_ShowPinsElectricalType )
3010 selectItem( item, 0 );
3016 for(
EDA_ITEM* item : flaggedItems )
3023 else if( anySubtracted )
3029 bool aMultiselect )
const
3031 std::unordered_set<EDA_ITEM*> toAdd;
3035 for(
int j = 0; j < aCollector.
GetCount(); j++ )
3037 if( aCollector[j]->GetParent() )
3040 if( aCollector[j]->GetParentSymbol() )
3046 for(
int j = 0; j < aCollector.
GetCount(); j++ )
3050 for(
int j = 0; j < aCollector.
GetCount(); )
3062 aCollector.
Remove( item );
3070 if(
top->AsEdaItem() != item )
3072 toAdd.insert(
top->AsEdaItem() );
3075 aCollector.
Remove( item );
3084 aCollector.
Remove( item );
3093 if( !aCollector.
HasItem( item ) )
3094 aCollector.
Append( item );
3104 std::vector<EDA_ITEM*> toRemove;
3110 bool lockedDescendant =
false;
3112 schItem->RunOnChildren(
3116 lockedDescendant =
true;
3120 if( schItem->IsLocked() || lockedDescendant )
3121 toRemove.push_back( item );
3143 if( cell->IsSelected() )
3155 auto wasSelected = [](
EDA_ITEM* aItem )
3162 bool doSelect =
false;
3164 if( cell->HitTest( selectionRect,
false ) )
3169 doSelect = !wasSelected( cell );
3173 else if( wasSelected( cell ) )
3178 if( doSelect && !cell->IsSelected() )
3180 else if( !doSelect && cell->IsSelected() )
3187 bool cancelled =
false;
3194 if( evt->IsCancelInteractive() || evt->IsActivate() )
3202 SelectCellsBetween( evt->DragOrigin(), evt->Position() - evt->DragOrigin(), aTable );
3204 else if( evt->IsMouseUp(
BUT_LEFT ) )
3208 bool anyAdded =
false;
3209 bool anySubtracted =
false;
3216 anySubtracted =
true;
3232 evt->SetPassEvent();
3256 int gridThreshold =
KiROUND(
getView()->GetGAL()->GetGridSize().EuclideanNorm() );
3257 int thresholdMax = std::max( pixelThreshold, gridThreshold );
3259 for(
int threshold : { 0, thresholdMax/4, thresholdMax/2, thresholdMax } )
3268 return collector.
GetCount() ? collector[ 0 ] :
nullptr;
3297 std::vector<SCH_ITEM*> startItems;
3298 std::set<SCH_ITEM*> added;
3300 for(
auto item : aItems )
3302 if( !item->IsSCH_ITEM() )
3312 startItems.push_back(
pin );
3317 startItems.push_back( schItem );
3321 if( startItems.empty() )
3326 std::unordered_set<SCH_SYMBOL*> startSymbols;
3333 startSymbols.insert( parent );
3339 std::set<VECTOR2I> pinPositions;
3346 pinPositions.insert(
pin->GetPosition() );
3350 auto isStopPoint = [&](
const VECTOR2I& aPoint ) ->
bool
3355 if( pinPositions.count( aPoint ) )
3366 switch( it->Type() )
3374 if( it->IsConnected( aPoint ) )
3389 auto shouldPullInSymbol = [&]()
3394 std::deque<SCH_ITEM*> queue;
3395 std::unordered_set<SCH_ITEM*> visited;
3397 auto enqueue = [&](
SCH_ITEM* aItem )
3402 if( visited.insert( aItem ).second )
3403 queue.push_back( aItem );
3409 while( !queue.empty() )
3418 if( shouldPullInSymbol() && symbol &&
Selectable( symbol )
3421 added.insert( symbol );
3426 std::vector<VECTOR2I> openPoints;
3432 if( !isStopPoint( pt ) )
3433 openPoints.push_back( pt );
3439 for(
SCH_ITEM* neighbor : neighbors )
3451 added.insert( symbol );
3460 bool sharesOpenPoint =
false;
3462 for(
const VECTOR2I& pt : openPoints )
3464 if( neighbor->IsConnected( pt ) )
3466 sharesOpenPoint =
true;
3471 if( !sharesOpenPoint )
3475 enqueue( neighbor );
3481 added.insert( item );
3490 std::set<SCH_ITEM*> added;
3492 for(
auto item : aItems )
3494 if( !item->IsSCH_ITEM() )
3499 std::set<SCH_ITEM*> conns =
m_frame->GetScreen()->MarkConnections( schItem, schItem->
IsConnectable() );
3507 added.insert( connItem );
3530 if( !selItem->IsSCH_ITEM() )
3536 graphicalSelection.
Add( item );
3538 graphicalSelection.
Add( item );
3540 connectableSelection.
Add( item );
3545 std::unordered_set<const SCH_ITEM*> originalConnectableSet;
3548 originalConnectableSet.insert(
static_cast<const SCH_ITEM*
>( selItem ) );
3552 std::set<SCH_ITEM*> graphAdded;
3553 std::set<SCH_ITEM*> graphicalAdded;
3555 if( !connectableSelection.
Empty() )
3563 bool grew = std::any_of( graphAdded.begin(), graphAdded.end(),
3566 return !originalConnectableSet.count( c );
3574 if( !graphicalSelection.
Empty() )
3579 if( graphAdded.empty() && !connectableSelection.
Empty() )
3584 combinedSelection.
Add( selItem );
3586 graphicalSelection = combinedSelection;
3591 auto smartAddToSel = [&](
EDA_ITEM* aItem )
3600 for(
auto item : graphAdded )
3601 smartAddToSel( item );
3603 for(
auto item : graphicalAdded )
3604 smartAddToSel( item );
3606 for(
auto item : originalSelection )
3607 smartAddToSel( item );
3626 std::set<std::pair<SCH_TABLE*, int>> columns;
3634 columns.insert( std::make_pair(
table, cell->GetColumn() ) );
3638 for(
auto& [
table, col ] : columns )
3640 for(
int row = 0; row <
table->GetRowCount(); ++row )
3661 std::set<std::pair<SCH_TABLE*, int>> rows;
3669 rows.insert( std::make_pair(
table, cell->GetRow() ) );
3673 for(
auto& [
table, row ] : rows )
3675 for(
int col = 0; col <
table->GetColCount(); ++col )
3696 std::set<SCH_TABLE*> tables;
3702 tables.insert(
static_cast<SCH_TABLE*
>( cell->GetParent() ) );
3709 if( !
table->IsSelected() )
3752 double compRatio = bbSize.
y / currTextHeight;
3753 double compRatioBent = 1.0;
3759 std::vector<std::pair<double, double>> lut{ { 1.25, 16 },
3768 std::vector<std::pair<double, double>>::iterator it;
3771 compRatioBent = lut.back().second;
3775 if( compRatio >= lut.front().first )
3777 for( it = lut.begin(); it < lut.end() - 1; ++it )
3779 if( it->first <= compRatio &&
next( it )->first >= compRatio )
3781 double diffx = compRatio - it->first;
3782 double diffn =
next( it )->first - it->first;
3784 compRatioBent = it->second + (
next( it )->second - it->second ) * diffx / diffn;
3791 compRatioBent = lut.front().second;
3800 screenSize.
x = std::max( 10.0, screenSize.
x );
3801 screenSize.
y = std::max( 10.0, screenSize.
y );
3802 double ratio = std::max( -1.0, fabs( bbSize.
y / screenSize.
y ) );
3805 double kicadRatio = std::max( fabs( bbSize.
x / screenSize.
x ),
3806 fabs( bbSize.
y / screenSize.
y ) );
3811 if( bbSize.
x > screenSize.
x * ratio * compRatioBent )
3815 compRatioBent = 1.0;
3816 wxLogTrace(
"CROSS_PROBE_SCALE",
3817 "Part TOO WIDE for screen. Using normal KiCad zoom ratio: %1.5f", ratio );
3822 ratio *= compRatioBent;
3824 bool alwaysZoom =
false;
3827 if( ( ratio < 0.5 || ratio > 1.0 ) || alwaysZoom )
3833 SCH_ITEM* focusItem,
const std::vector<SCH_ITEM*>& items )
3840 double targetZoom = 0.0;
3842 bool targetZoomValid =
false;
3843 bool changedSheet =
false;
3845 if( targetSheetPath )
3851 targetZoom = screen->m_LastZoomLevel;
3852 targetCenter = screen->m_ScrollCenter;
3853 targetZoomValid = screen->IsZoomInitialized();
3859 changedSheet =
true;
3863 if( changedSheet && targetZoomValid && !
m_frame->eeconfig()->m_CrossProbing.zoom_to_fit )
3877 if(
m_frame->GetScreen()->CheckIfOnDrawList( item )
3878 || ( parent &&
m_frame->GetScreen()->CheckIfOnDrawList( parent ) ) )
3888 if(
m_frame->eeconfig()->m_CrossProbing.center_on_items )
3890 if(
m_frame->eeconfig()->m_CrossProbing.zoom_to_fit )
3909 bool enteredGroupFound =
false;
3917 if( item.IsSelected() )
3925 enteredGroupFound =
true;
3939 if( item->IsSelected() )
3945 item->RunOnChildren(
3959 enteredGroupFound =
true;
3971 if( !enteredGroupFound )
3983 bool checkVisibilityOnly )
const
3994 switch( aItem->
Type() )
4002 if(
pin->GetUnit() &&
pin->GetUnit() != symEditFrame->
GetUnit() )
4009 if( !
pin->IsVisible() && !
m_frame->GetShowAllPins() )
4020 if(
pin->IsPointClickableAnchor(
grid.BestSnapAnchor( *aPos, pinGrid ) ) )
4031 if( !
m_frame->eeconfig()->m_Appearance.show_directive_labels )
4136 aGroup->
Add( aItem );
4146 sch_item->RunOnChildren(
4197 sch_item->RunOnChildren(
4211 aGroup->
Remove( aChild );
4225 const unsigned GRIP_MARGIN = 20;
4231 BOX2I itemBox = item->ViewBBox();
constexpr EDA_IU_SCALE schIUScale
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
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 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 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.
constexpr const Vec & GetPosition() const
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 const Vec GetCenter() const
constexpr size_type GetHeight() const
constexpr bool Contains(const Vec &aPoint) const
constexpr const SizeVec & GetSize() const
constexpr bool Intersects(const BOX2< Vec > &aRect) const
An abstract class that will find and hold all the objects according to an inspection done by the Insp...
void Transfer(int aIndex)
Move the item at aIndex (first position is 0) to the backup 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 & Added(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Notify observers that aItem has been added.
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Add a new item to the model.
Calculate the connectivity of a schematic and generates netlists.
SCH_NETCHAIN * GetNetChainForNet(const wxString &aNet)
SCH_NETCHAIN * FindPotentialNetChainBetweenPins(SCH_PIN *aPinA, SCH_PIN *aPinB)
Locate a potential net chain that contains both pins (by subgraph net membership).
bool IsHorizontal() const
void FocusOnLocation(const VECTOR2I &aPos, bool aAllowScroll=true)
Useful to focus on a particular location, in find functions.
A set of EDA_ITEMs (i.e., without duplicates).
A base class for most all the KiCad significant classes used in schematics and boards.
virtual VECTOR2I GetPosition() const
void SetIsRollover(bool aIsRollover, const VECTOR2I &aMousePos)
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
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
void XorFlags(EDA_ITEM_FLAGS aMask)
EDA_ITEM_FLAGS GetFlags() const
virtual bool IsFilledForHitTesting() const
virtual std::vector< SHAPE * > MakeEffectiveShapesForHitTesting() const
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
const EDA_ANGLE & GetTextAngle() 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.
GRID_HELPER_GRIDS GetItemGrid(const EDA_ITEM *aItem) const override
Get the coarsest grid that applies to an item.
VECTOR2I BestSnapAnchor(const VECTOR2I &aOrigin, GRID_HELPER_GRIDS aGrid, SCH_ITEM *aSkip)
EE_TYPE Overlapping(const BOX2I &aRect) const
EE_TYPE OfType(KICAD_T aType) const
static const TOOL_EVENT DisambiguatePoint
Used for hotkey feedback.
static const TOOL_EVENT ClearedEvent
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 PointSelectedEvent
static const TOOL_EVENT SelectedItemsMoved
Used to inform tools that the selection should temporarily be non-editable.
static const TOOL_EVENT UnselectedEvent
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
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.
void SetHighlight(bool aEnabled, int aNetcode=-1, bool aMulti=false)
Turns on/off highlighting.
An interface for classes handling user events controlling the view behavior such as zooming,...
virtual void CaptureCursor(bool aEnabled)
Force the cursor to stay within the drawing panel area.
virtual void ForceCursorPosition(bool aEnabled, const VECTOR2D &aPosition=VECTOR2D(0, 0))
Place the cursor immediately at a given point.
virtual void WarpMouseCursor(const VECTOR2D &aPosition, bool aWorldCoordinates=false, bool aWarpView=false)=0
If enabled (.
virtual void SetCrossHairCursorPosition(const VECTOR2D &aPosition, bool aWarpView=true)=0
Move the graphic crosshair cursor to the requested position expressed in world coordinates.
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
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.
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.
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...
bool IsMirroredX() const
Return true if view is flipped across the X axis.
std::pair< VIEW_ITEM *, int > LAYER_ITEM_PAIR
void Hide(VIEW_ITEM *aItem, bool aHide=true, bool aHideOverlay=false)
Temporarily hide the item in the view (e.g.
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
void SetCenter(const VECTOR2D &aCenter)
Set the center point of the VIEW (i.e.
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Set the item visibility.
wxString AsString() const
Define a library symbol object.
bool IsPower() const override
bool IsMultiBodyStyle() const override
LIB_ITEMS_CONTAINER & GetDrawItems()
Return a reference to the draw item list.
int GetUnitCount() const override
Tree view item data for the net navigator.
CONNECTION_GRAPH * ConnectionGraph() const
SCH_SHEET_PATH & CurrentSheet() const
static TOOL_ACTION placeClassLabel
static TOOL_ACTION placeSheetPin
static TOOL_ACTION createNetChain
static TOOL_ACTION placeNextSymbolUnit
static TOOL_ACTION swapPins
static TOOL_ACTION saveToLinkedDesignBlock
static TOOL_ACTION clearHighlight
static TOOL_ACTION placeGlobalLabel
static TOOL_ACTION pinTable
static TOOL_ACTION navigateBack
static TOOL_ACTION properties
static TOOL_ACTION leaveSheet
static TOOL_ACTION breakWire
static TOOL_ACTION removeFromNetChain
static TOOL_ACTION findNetInInspector
static TOOL_ACTION autoplaceAllSheetPins
static TOOL_ACTION drawLines
static TOOL_ACTION placeHierLabel
static TOOL_ACTION selectConnection
If current selection is a wire or bus, expand to entire connection.
static TOOL_ACTION placeLabel
static TOOL_ACTION nextNetItem
static TOOL_ACTION drawWire
static TOOL_ACTION highlightNetChain
static TOOL_ACTION placeJunction
static TOOL_ACTION previousNetItem
static TOOL_ACTION swapUnitLabels
static TOOL_ACTION navigateForward
static TOOL_ACTION placeLinkedDesignBlock
static TOOL_ACTION selectNode
Select the junction, wire or bus segment under the cursor.
static TOOL_ACTION unfoldBus
static TOOL_ACTION drawBus
static TOOL_ACTION symbolProperties
static TOOL_ACTION changeSheet
static TOOL_ACTION assignNetclass
static TOOL_ACTION swapPinLabels
static TOOL_ACTION enterSheet
static TOOL_ACTION replaceTerminalPin
static TOOL_ACTION createNetChainBetweenPins
static TOOL_ACTION editPageNumber
static TOOL_ACTION selectOnPCB
static TOOL_ACTION syncSheetPins
static TOOL_ACTION nameNetChain
A shim class between EDA_DRAW_FRAME and several derived classes: SYMBOL_EDIT_FRAME,...
Class for a wire to bus entry.
SCH_ITEM * m_connected_bus_item
Pointer to the bus item (usually a bus wire) connected to this bus-wire entry, if it is connected to ...
void Collect(SCH_SCREEN *aScreen, const std::vector< KICAD_T > &aScanTypes, const VECTOR2I &aPos, int aUnit=0, int aBodyStyle=0)
Scan a EDA_ITEM using this class's Inspector method which does the collection.
bool m_ShowPinElectricalTypes
static const std::vector< KICAD_T > MovableItems
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Execute the changes.
virtual void Revert() override
Revert the commit by restoring the modified items state.
static SELECTION_CONDITION SingleMultiFunctionPin
static SELECTION_CONDITION SingleSymbol
static SELECTION_CONDITION MultipleSymbolsOrPower
static SELECTION_CONDITION HasLockedItems
static SELECTION_CONDITION AllPinsOrSheetPins
static SELECTION_CONDITION SingleSymbolOrPower
static SELECTION_CONDITION HasUnlockedItems
static SELECTION_CONDITION SingleNonExcludedMarker
static SELECTION_CONDITION SingleMultiUnitSymbol
static SELECTION_CONDITION SingleMultiBodyStyleSymbol
static SELECTION_CONDITION AllPins
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
void ConfigureFromLabel(const wxString &aLabel)
Configures the connection given a label.
wxString Name(bool aIgnoreSheet=false) const
Handle actions specific to the schematic editor.
Schematic editor (Eeschema) main window.
void FocusOnItem(EDA_ITEM *aItem, bool aAllowScroll=true) override
Focus on a particular canvas item.
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
SCH_SHEET_PATH & GetCurrentSheet() const
SCHEMATIC & Schematic() const
const SCH_ITEM * SelectNextPrevNetNavigatorItem(bool aNext)
const wxString & GetHighlightedConnection() const
wxGenericTreeCtrl * GetNetNavigator()
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
A set of SCH_ITEMs (i.e., without duplicates).
static bool WithinScope(SCH_ITEM *aItem, SCH_GROUP *aScope, bool isSymbolEditor)
static EDA_GROUP * TopLevelGroup(SCH_ITEM *aItem, EDA_GROUP *aScope, bool isSymbolEditor)
Base class for any item which can be embedded within the SCHEMATIC container class,...
virtual bool IsConnectable() const
virtual bool HasHoveredHypertext() const
Indicates that a hypertext link is currently active.
const SCH_ITEM_VEC & ConnectedItems(const SCH_SHEET_PATH &aPath)
Retrieve the set of items connected to this item on the given sheet.
const SYMBOL * GetParentSymbol() const
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
virtual bool IsPointClickableAnchor(const VECTOR2I &aPos) const
bool IsLocked() const override
SCH_CONNECTION * Connection(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve the connection associated with this object in the given sheet.
bool IsType(const std::vector< KICAD_T > &aScanTypes) const override
Check whether the item is one of the listed types.
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const override
void SetShape(LABEL_FLAG_SHAPE aShape)
LABEL_SHAPE GetLabelShape() const
virtual void SetSpinStyle(SPIN_STYLE aSpinStyle)
Segment description base class to describe items which have 2 end points (track, wire,...
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
bool IsStartDangling() const
VECTOR2I GetEndPoint() const
VECTOR2I GetStartPoint() const
SEG GetSeg() const
Get the geometric aspect of the wire as a SEG.
bool IsEndDangling() const
bool IsBus() const
Return true if the line is a bus.
bool IsGraphicLine() const
Return if the line is a graphic (non electrical line)
void SetEndPoint(const VECTOR2I &aPosition)
A net chain is a collection of nets that are connected together through passive components.
const wxString & GetNumber() const
Tool that displays edit points allowing to modify items by dragging the points.
bool HasPoint()
Indicate the cursor is over an edit point.
bool IsExplicitJunction(const VECTOR2I &aPosition) const
Indicate that a junction dot is necessary at the given location.
EE_RTREE & Items()
Get the full RTree, usually for iterating.
bool IsJunction(const VECTOR2I &aPosition) const
Test if a junction is required for the items at aPosition on the screen.
VECTOR2I GetCenter() const
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
Define a sheet pin (label) used in sheets to create hierarchical schematics.
SHEET_SIDE GetSide() const
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
std::vector< SCH_SHEET_PIN * > & GetPins()
std::vector< const SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet) const
Retrieve a list of the SCH_PINs for the given sheet path.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
SCH_PIN * GetPin(const wxString &number) const
Find a symbol pin by number.
int GetOrientation() const override
Get the display symbol orientation.
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
BOX2I GetBodyBoundingBox() const override
Return a bounding box for the symbol body but not the pins or fields.
std::vector< SCH_TABLECELL * > GetCells() const
int Distance(const SEG &aSeg) const
Compute minimum Euclidean distance to segment aSeg.
static SELECTION_CONDITION HasTypes(std::vector< KICAD_T > aTypes)
Create a functor that tests if among the selected items there is at least one of a given types.
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 Empty(const SELECTION &aSelection)
Test if there are no 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 bool Idle(const SELECTION &aSelection)
Test if there no items selected or being edited.
static SELECTION_CONDITION LessThan(int aNumber)
Create a functor that tests if the number of selected items is smaller 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)
const std::deque< EDA_ITEM * > GetItems() const
VECTOR2I GetReferencePoint() const
virtual void Remove(EDA_ITEM *aItem)
virtual unsigned int GetSize() const override
Return the number of stored items.
bool OnlyContains(std::vector< KICAD_T > aList) const
Checks if all items in the selection have a type in aList.
bool Empty() const
Checks if there is anything selected.
bool HasReferencePoint() const
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
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.
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 PointInside(const VECTOR2I &aPt, int aAccuracy=0, bool aUseBBoxCache=false) const override
Check if point aP lies inside a closed shape.
bool Collide(const SHAPE *aShape, int aClearance, VECTOR2I *aMTV) const override
Check if the boundary of shape (this) lies closer to the shape aShape than aClearance,...
The symbol library editor main window.
bool GetShowInvisibleFields()
bool IsSymbolAlias() const
Return true if aLibId is an alias for the editor screen symbol.
bool GetShowInvisiblePins()
Symbol library viewer main window.
A base class for LIB_SYMBOL and SCH_SYMBOL.
virtual const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const =0
const TRANSFORM & GetTransform() const
double Distance(const VECTOR2< extended_type > &aVector) const
Compute the distance between two vectors.
#define DEFAULT_TEXT_SIZE
Ratio of the font height to the baseline of the text above the wire.
static constexpr EDA_ANGLE ANGLE_VERTICAL
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
#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 SELECTION_CANDIDATE
indicates an item is a candidate for selection
#define ENTERED
indicates a group has been entered
#define ENDPOINT
ends. (Used to support dragging.)
std::uint32_t EDA_ITEM_FLAGS
#define IS_MOVING
Item being moved.
#define SHOW_ELEC_TYPE
Show pin electrical type.
#define STARTPOINT
When a line is selected, these flags indicate which.
@ ID_POPUP_SCH_PIN_TRICKS_START
@ ID_POPUP_SCH_PIN_TRICKS_HIER_LABEL
@ ID_POPUP_SCH_PIN_TRICKS_WIRE
@ ID_POPUP_SCH_PLACE_UNIT_END
@ ID_POPUP_SCH_ALT_PIN_FUNCTION
@ ID_POPUP_SCH_UNFOLD_BUS_END
@ ID_POPUP_SCH_SELECT_UNIT
@ ID_POPUP_SCH_SELECT_BODY_STYLE
@ ID_POPUP_SCH_PIN_TRICKS_NET_LABEL
@ ID_POPUP_SCH_SELECT_BODY_STYLE_END
@ ID_POPUP_SCH_PIN_TRICKS_NO_CONNECT
@ ID_POPUP_SCH_UNFOLD_BUS
@ ID_POPUP_SCH_SELECT_UNIT_END
@ ID_POPUP_SCH_ALT_PIN_FUNCTION_END
@ ID_POPUP_SCH_PLACE_UNIT
@ ID_POPUP_SCH_PIN_TRICKS_GLOBAL_LABEL
@ ID_POPUP_SCH_PIN_TRICKS_END
a few functions useful in geometry calculations.
bool BoxHitTest(const VECTOR2I &aHitPoint, const BOX2I &aHittee, int aAccuracy)
Perform a point-to-box hit test.
@ REPAINT
Item needs to be redrawn.
ELECTRICAL_PINTYPE
The symbol library pin object electrical types used in ERC tests.
@ PT_INPUT
usual pin input: must be connected
@ PT_TRISTATE
tri state bus pin
@ PT_BIDI
input or output (like port for a microprocessor)
@ PT_UNSPECIFIED
unknown electrical properties: creates always a warning when connected
@ PT_PASSIVE
pin for passive symbols: must be connected, and can be connected to any pin.
@ PIN_UP
The pin extends upwards from the connection point: Probably on the bottom side of the symbol.
@ PIN_RIGHT
The pin extends rightwards from the connection point.
@ PIN_LEFT
The pin extends leftwards from the connection point: Probably on the right side of the symbol.
@ PIN_DOWN
The pin extends downwards from the connection: Probably on the top side of the symbol.
#define HITTEST_THRESHOLD_PIXELS
Class to handle a set of SCH_ITEMs.
std::vector< SCH_ITEM * > SCH_ITEM_VEC
std::vector< EDA_ITEM * > EDA_ITEMS
std::function< bool(const SELECTION &)> SELECTION_CONDITION
Functor type that checks a specific condition for selected items.
std::vector< FAB_LAYER_COLOR > dummy
bool text
Text and fields.
bool symbols
Allow selecting symbols and sheet symbols.
bool labels
Net and bus labels.
bool pins
Symbol and sheet pins.
bool graphics
Graphic lines, shapes, polygons.
bool lockedItems
Allow selecting locked items.
bool images
Bitmap/vector images.
bool otherItems
Anything not fitting one of the above categories.
bool ruleAreas
Rule areas.
bool wires
Net and bus wires and junctions.
KIBIS top(path, &reporter)
std::vector< std::vector< std::string > > table
@ NOT_USED
the 3d code uses this value
@ SCH_ITEM_LOCATE_GRAPHIC_LINE_T
@ SCH_SYMBOL_LOCATE_POWER_T
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D