39#include <unordered_set>
75 if( aSel.GetSize() == 1 )
89 return aSel.GetSize() == 1 && aSel.Front()->Type() ==
SCH_SYMBOL_T;
95 if( aSel.GetSize() == 1 )
109 if( aSel.GetSize() == 1 )
123 if( aSel.GetSize() == 1 )
127 if(
pin &&
pin->GetLibPin() )
128 return !
pin->GetLibPin()->GetAlternates().empty();
146 return aSel.GetSize() > 1 && aSel.OnlyContains( {
SCH_SYMBOL_T } );
152 return aSel.GetSize() >= 1 && aSel.OnlyContains( {
SCH_PIN_T } );
208 itemA->Enable( !isEndpoint );
209 itemB->Enable( !isEndpoint );
257 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] update() invoked" );
265 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] defer: toolMgr not yet available" );
274 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] abort: selTool=%p baseFrame=%p", (
void*) selTool,
285 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] abort: empty selection" );
289 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] selection size=%u", sel.
GetSize() );
298 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] added createNetChain" );
302 auto pinFrom = [&](
int idx ) ->
SCH_PIN*
304 if( idx >= (
int) sel.
GetSize() )
311 bool singlePin = sel.
GetSize() == 1 && pinFrom( 0 ) && pinFrom( 0 )->GetConnectionName( &
path );
312 bool inSignal =
false;
313 bool canName =
false;
314 bool canRemove =
false;
317 for(
size_t i = 0; i < sel.
GetSize(); ++i )
325 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] sel[%zu]: not a pin or no connection", i );
329 bool hasSignal = chains.GetNetChainForNet( *netName );
330 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] sel[%zu]: pin uuid=%s net=%s committedSignal=%d", i,
343 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] flags: singlePin=%d inSignal=%d canName=%d canRemove=%d",
344 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 replaceMenu->SetTool(
m_tool );
366 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] added replaceTerminalPin submenu" );
373 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] added nameNetChain" );
380 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] createNetChainBetweenPins attempted added=%d", added );
394 if( isConnectedPin || isConnectedWireOrBus )
397 wxLogTrace(
"KICAD_NET_CHAIN_MENU",
"[NetChainMenu] added createNetChain for single connected item" );
406 wxMenuItem* placeholder = Append( wxID_ANY,
_(
"(No net chain actions)" ) );
407 placeholder->Enable(
false );
430 wxString label = wxString::Format(
_(
"Create Net Chain between %s:%s and %s:%s" ),
442 for(
EDA_ITEM* item : aSel.Items() )
446 if( schItem->IsLocked() )
457 for(
EDA_ITEM* item : aSel.Items() )
461 if( !schItem->IsLocked() )
472 for(
int i = 0; aAllowedActions[i]; ++i )
474 if( aEvent->
IsAction( aAllowedActions[i] ) )
483#define HITTEST_THRESHOLD_PIXELS 5
570 if( symbolEditorFrame )
585 auto expandableSelection =
593 auto schEditSheetPageNumberCondition =
602 auto schEditCondition =
608 auto belowRootSheetCondition =
630 auto groupEnterCondition =
633 auto inGroupCondition =
639 auto multipleUnitsSelection =
648 return m_frame->eeconfig() &&
m_frame->eeconfig()->m_Input.allow_unconstrained_pin_swaps;
651 auto& menu =
m_menu->GetMenu();
659 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 } ) )
689 return aSel.GetSize() >= 1 && aSel.OnlyContains( {
SCH_SYMBOL_T } );
692 std::shared_ptr<NET_CHAIN_MENU> netChainMenu = std::make_shared<NET_CHAIN_MENU>();
693 netChainMenu->SetTool(
this );
694 m_menu->RegisterSubMenu( netChainMenu );
709 menu.AddSeparator( 100 );
713 menu.AddSeparator( 100 );
720 menu.AddSeparator( 200 );
738 menu.AddSeparator( 400 );
741 menu.AddMenu( netChainMenu.get(), ( pinSelection || wireOrBusInSignal || symbolSelection ) &&
SCH_CONDITIONS::Idle, 400 );
743 menu.AddSeparator( 1000 );
779 if( symbolEditFrame )
806 auto pinOrientation =
816 return pin->GetOrientation();
821 return dummy.GetOrientation();
845 bool selCancelled =
false;
846 bool displayWireCursor =
false;
847 bool displayBusCursor =
false;
848 bool displayLineCursor =
false;
849 KIID rolloverItemId = lastRolloverItemId;
858 if( !
m_frame->ToolStackIsEmpty() )
892 schframe->ClearFocus();
899 size_t preFilterCount = collector.
GetCount();
901 narrowSelection( collector, evt->Position(),
false,
false, &rejected );
911 bool allCellsFromSameTable =
true;
921 allCellsFromSameTable =
false;
941 VECTOR2D bottomRight( std::max( start.
x,
end.x ), std::max( start.
y,
end.y ) );
964 else if( collector[0]->HasHoveredHypertext() )
966 collector[ 0 ]->DoHypertextAction(
m_frame, evt->Position() );
969 else if( collector[0]->IsNetHighlighted() )
975 schframe->SelectNetNavigatorItem( &itemData );
982 if( collector.
GetCount() == 0 && preFilterCount > 0 )
983 m_frame->HighlightSelectionFilter( rejected );
997 SelectPoint( evt->Position(), { SCH_LOCATE_ANY_T },
nullptr, &selCancelled );
1006 .Contains( evt->Position() ) )
1010 if(
CollectHits( collector, evt->Position(), { SCH_LOCATE_ANY_T } ) )
1014 SelectPoint( evt->Position(), { SCH_LOCATE_ANY_T },
nullptr, &selCancelled );
1022 else if( evt->IsDblClick(
BUT_LEFT ) )
1028 schframe->ClearFocus();
1047 if( evt->Modifier(
MD_CTRL ) )
1059 evt->SetPassEvent();
1066 schframe->ClearFocus();
1072 && evt->HasPosition()
1079 else if(
CollectHits( collector, evt->DragOrigin(), { SCH_TABLECELL_T } )
1080 && !collector[0]->GetParent()->IsSelected()
1081 && ( collector[0]->GetParent()->GetParentGroup() ==
nullptr
1082 || collector[0]->GetParent()->GetParentGroup() ==
m_enteredGroup ) )
1139 std::vector<SCH_PIN*> pins;
1142 pins.push_back(
static_cast<SCH_PIN*
>( item ) );
1179 else if( evt->IsMouseDown(
BUT_AUX1 ) )
1183 else if( evt->IsMouseDown(
BUT_AUX2 ) )
1199 const int delta = evt->Parameter<
int>();
1244 wxString alt = *evt->Parameter<wxString*>();
1269 newItems.push_back( nc );
1272 if( !commit.
Empty() )
1274 commit.
Push( wxS(
"No Connect Pins" ) );
1293 switch( pinOrientation( item ) )
1306 newItems.push_back( wire );
1309 if( !commit.
Empty() )
1327 commit.
Push( wxS(
"Wire Pins" ) );
1347 labelText =
pin->GetShownName();
1349 if( labelText.IsEmpty() )
1351 labelText.Printf(
"%s_%s",
1352 pin->GetParentSymbol()->GetRef( &sheetPath ),
1365 switch( *evt->GetCommandId() )
1368 label =
new SCH_LABEL( item->GetPosition(), labelText );
1371 label =
new SCH_HIERLABEL( item->GetPosition(), labelText );
1380 switch( pinOrientation( item ) )
1393 pinType =
pin->GetType();
1429 newItems.push_back( label );
1432 if( !commit.
Empty() )
1434 commit.
Push( wxS(
"Label Pins" ) );
1446 wxString* net =
new wxString( *evt->Parameter<wxString*>() );
1450 else if( evt->IsCancelInteractive() )
1460 schframe->ClearFocus();
1466 else if( evt->FirstResponder() ==
this && evt->GetCommandId() == (
int) WXK_ESCAPE )
1476 if(
editor &&
m_frame->eeconfig()->m_Input.esc_clears_net_highlight )
1477 editor->ClearHighlight( *evt );
1484 evt->SetPassEvent(
false );
1490 schframe->ClearFocus();
1492 else if( evt->IsMotion() && !
m_isSymbolEditor && evt->FirstResponder() ==
this )
1511 displayBusCursor =
true;
1513 displayWireCursor =
true;
1515 displayLineCursor =
true;
1517 else if( collector[0]->HasHypertext() && !collector[0]->IsSelected() )
1519 rolloverItemId = collector[0]->m_Uuid;
1526 evt->SetPassEvent();
1529 if( lastRolloverItemId !=
niluuid && lastRolloverItemId != rolloverItemId )
1538 m_frame->GetCanvas()->GetView()->Update( item );
1543 if( rolloverItemId !=
niluuid )
1545 rolloverItem =
static_cast<SCH_ITEM*
>(
m_frame->ResolveItem( rolloverItemId ) );
1552 m_frame->GetCanvas()->GetView()->Update( rolloverItem );
1555 lastRolloverItemId = rolloverItemId;
1557 if(
m_frame->ToolStackIsEmpty() )
1559 if( displayWireCursor )
1563 else if( displayBusCursor )
1567 else if( displayLineCursor )
1577 && evt->HasPosition()
1602 wxT(
"EnterGroup called when selection is not a single group" ) );
1661 if(
m_frame->eeconfig()->m_Drawing.auto_start_wires
1696 if( possibleConnection.
IsBus() )
1704 if( !
pin || !
pin->IsPointClickableAnchor( pos ) )
1707 if( !
pin->IsVisible() && !(
m_frame->eeconfig()->m_Appearance.show_hidden_pins
1708 ||
m_frame->GetRenderSettings()->m_ShowHiddenPins ) )
1714 newEvt->SetMousePosition( pos );
1715 newEvt->SetHasPosition(
true );
1716 newEvt->SetForceImmediate(
true );
1729 wxMouseState keyboardState = wxGetMouseState();
1731 setModifiersState( keyboardState.ShiftDown(), keyboardState.ControlDown(), keyboardState.AltDown() );
1746 wxMouseState keyboardState = wxGetMouseState();
1748 setModifiersState( keyboardState.ShiftDown(), keyboardState.ControlDown(), keyboardState.AltDown() );
1769 const std::vector<KICAD_T>& aScanTypes )
1772 int gridThreshold =
KiROUND(
getView()->GetGAL()->GetGridSize().EuclideanNorm() / 2.0 );
1773 aCollector.
m_Threshold = std::max( pixelThreshold, gridThreshold );
1791 if( (
m_frame->eeconfig() &&
m_frame->eeconfig()->m_Selection.select_pin_selects_symbol ) || !
m_filter.pins )
1793 int originalCount = aCollector.
GetCount();
1795 for(
int ii = 0; ii < originalCount; ++ii )
1797 if( aCollector[ii]->Type() ==
SCH_PIN_T )
1801 if( !aCollector.
HasItem(
pin->GetParentSymbol() ) )
1802 aCollector.
Append(
pin->GetParentSymbol() );
1817 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
1819 if( symbolEditorFrame )
1848 if( aCheckLocked && collector[i]->IsLocked() )
1863 if( aSelectedOnly && !collector[i]->IsSelected() )
1879 bool* aSelectionCancelledFlag,
bool aAdd,
bool aSubtract,
bool aExclusiveOr )
1897 if( aSelectionCancelledFlag )
1898 *aSelectionCancelledFlag =
true;
1904 if( !aAdd && !aSubtract && !aExclusiveOr )
1912 bool foundEnteredGroup =
false;
1918 foundEnteredGroup =
true;
1923 if( !foundEnteredGroup )
1930 bool anySubtracted =
false;
1934 for(
int i = 0; i < aCollector.
GetCount(); ++i )
1937 bool isLine = aCollector[i]->Type() ==
SCH_LINE_T;
1953 || ( aExclusiveOr && aCollector[i]->IsSelected()
1954 && ( !isLine || ( isLine && aCollector[i]->HasFlag( flags ) ) ) ) )
1956 aCollector[i]->ClearFlags( flags );
1966 anySubtracted =
true;
1971 aCollector[i]->SetFlags( flags );
1978 if( addedCount == 1 )
1982 if( aItem && aCollector.
GetCount() == 1 )
1983 *aItem = aCollector[0];
1987 else if( addedCount > 1 )
1992 else if( anySubtracted )
1998 m_frame->GetCanvas()->ForceRefresh();
2004 EDA_ITEM** aItem,
bool* aSelectionCancelledFlag,
bool aCheckLocked,
2005 bool aAdd,
bool aSubtract,
bool aExclusiveOr )
2009 if( !
CollectHits( collector, aWhere, aScanTypes ) )
2012 size_t preFilterCount = collector.
GetCount();
2014 rejected.
SetAll(
false );
2015 narrowSelection( collector, aWhere, aCheckLocked, aSubtract, &rejected );
2017 if( collector.
GetCount() == 0 && preFilterCount > 0 )
2020 frame->HighlightSelectionFilter( rejected );
2022 if( !aAdd && !aSubtract && !aExclusiveOr &&
m_selection.GetSize() > 0 )
2031 return selectPoint( collector, aWhere, aItem, aSelectionCancelledFlag, aAdd, aSubtract, aExclusiveOr );
2041 std::vector<EDA_ITEM*> sheetPins;
2047 view->
Query( selectionBox,
2055 collection.
Append( item );
2069 sheetPins.emplace_back(
pin );
2090 m_frame->GetCanvas()->ForceRefresh();
2100 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> selectedItems;
2106 view->
Query( selectionBox, selectedItems );
2131 m_frame->GetCanvas()->ForceRefresh();
2139 std::set<EDA_ITEM*> exactHits;
2141 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
2155 if( item->
HitTest( aPos, pixelThreshold ) )
2156 exactHits.insert( item );
2158 else if( symbol &&
m_frame->eeconfig()->m_Selection.select_pin_selects_symbol )
2161 exactHits.insert( item );
2170 if(
m_frame->GetRenderSettings()->m_ShowPinsElectricalType )
2173 if( item->
HitTest( aPos, 0 ) )
2174 exactHits.insert( item );
2180 if( exactHits.size() > 0 && exactHits.size() < (
unsigned) collector.
GetCount() )
2182 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
2186 if( !exactHits.contains( item ) )
2192 SEG poss( aPos, aPos );
2194 int closestDist = INT_MAX / 4;
2198 BOX2I bbox = item->GetBoundingBox();
2199 int dist = INT_MAX / 4;
2204 bool dominating =
false;
2206 if( exactHits.contains( item ) )
2244 text->GetEffectiveTextShape(
false )->Collide( poss, INT_MAX / 4, &dist );
2250 shapes->Collide( poss, INT_MAX / 4, &dist );
2264 rect.
Collide( poss, closestDist, &dist );
2282 if( dist == closestDist )
2284 if( item->GetParent() == closest )
2287 else if( dist < closestDist )
2303 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
2307 if( item == closest )
2310 if( !item->
HitTest( tightBox,
true ) )
2318 bool aPromoteCellSelections,
bool aPromoteGroups )
2320 bool anyUnselected =
false;
2321 bool anySelected =
false;
2334 bool isMoving =
false;
2336 for(
int i = (
int)
m_selection.GetSize() - 1; i >= 0; --i )
2341 if( !item->
IsType( aScanTypes ) )
2344 anyUnselected =
true;
2352 if( aPromoteGroups )
2354 for(
int i = (
int)
m_selection.GetSize() - 1; i >= 0; --i )
2358 std::set<EDA_ITEM*> selectedChildren;
2362 static_cast<SCH_ITEM*
>(item)->RunOnChildren(
2365 if( aChild->
IsType( aScanTypes ) )
2366 selectedChildren.insert( aChild );
2370 anyUnselected =
true;
2373 for(
EDA_ITEM* child : selectedChildren )
2375 if( !child->IsSelected() )
2387 if( aPromoteCellSelections )
2389 std::set<EDA_ITEM*> parents;
2391 for(
int i = (
int)
m_selection.GetSize() - 1; i >= 0; --i )
2399 anyUnselected =
true;
2405 if( !parent->IsSelected() )
2428 std::set<EDA_ITEM*> rejected;
2433 rejected.insert( item );
2437 aCollector.
Remove( item );
2448 if( schItem->IsLocked() && !
m_filter.lockedItems )
2457 switch( aItem->
Type() )
2476 aRejected->
pins =
true;
2487 aRejected->
wires =
true;
2496 switch(
static_cast<SCH_LINE*
>( aItem )->GetLayer() )
2503 aRejected->
wires =
true;
2542 aRejected->
text =
true;
2555 aRejected->
labels =
true;
2566 aRejected->
images =
true;
2649 bool cancelled =
false;
2665 isGreedy = !isGreedy;
2670 if( evt->IsCancelInteractive() || evt->IsActivate() )
2683 area.
SetEnd( evt->Position() );
2700 evt->SetPassEvent(
false );
2722 bool cancelled =
false;
2738 bool isClockwise = shapeArea > 0 ? true :
false;
2740 if(
getView()->IsMirroredX() && shapeArea != 0 )
2741 isClockwise = !isClockwise;
2754 if( evt->IsCancelInteractive() || evt->IsActivate() )
2763 points.
Append( evt->Position() );
2765 else if( evt->IsDblClick(
BUT_LEFT )
2804 area.
SetMode( selectionMode );
2831 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> candidates;
2833 view->
Query( selectionRect, candidates );
2835 std::set<SCH_ITEM*> uniqueCandidates;
2837 for(
const auto& [viewItem, layer] : candidates )
2839 if( viewItem->IsSCH_ITEM() )
2840 uniqueCandidates.insert(
static_cast<SCH_ITEM*
>( viewItem ) );
2849 if( boxMode ? selectionRect.
Intersects(
pin->GetBoundingBox() )
2852 uniqueCandidates.insert(
pin );
2860 if( boxMode ? selectionRect.
Intersects(
pin->GetBoundingBox() )
2863 uniqueCandidates.insert(
pin );
2869 if( field.IsVisible()
2870 && ( boxMode ? selectionRect.
Intersects( field.GetBoundingBox() )
2873 uniqueCandidates.insert( &field );
2881 std::set<EDA_ITEM*> group_items;
2890 std::unordered_set<EDA_ITEM*>& newset =
group->GetItems();
2893 [&](
const BOX2I& aBox )
2895 return boxMode ? selectionRect.
Contains( aBox )
2899 if( containedMode && boxContained(
group->GetBoundingBox() ) && newset.size() )
2901 for(
EDA_ITEM* group_item : newset )
2903 if( !group_item->IsSCH_ITEM() )
2907 collector.
Append( group_item );
2911 for(
EDA_ITEM* group_item : newset )
2912 group_items.emplace( group_item );
2918 return boxMode ? aItem->HitTest( selectionRect, containedMode )
2919 : aItem->HitTest( aArea.
GetPoly(), containedMode );
2922 for(
SCH_ITEM* item : uniqueCandidates )
2925 && ( hitTest( item ) || item->Type() ==
SCH_LINE_T )
2926 && ( !containedMode || !group_items.count( item ) ) )
2929 pinsCollector.
Append( item );
2931 collector.
Append( item );
2940 collector = pinsCollector;
2945 std::sort( collector.
begin(), collector.
end(),
2948 VECTOR2I aPos = a->GetPosition();
2949 VECTOR2I bPos = b->GetPosition();
2951 if( aPos.y == bPos.y )
2952 return aPos.x < bPos.x;
2954 return aPos.y < bPos.y;
2957 bool anyAdded =
false;
2958 bool anySubtracted =
false;
2963 if( aSubtractive || ( aExclusiveOr && aItem->
IsSelected() ) )
2973 anySubtracted =
true;
2976 if( flags && !anySubtracted )
2987 std::vector<EDA_ITEM*> flaggedItems;
2989 auto shapeContains =
2992 return boxMode ? selectionRect.
Contains( aPoint )
3001 flaggedItems.push_back( item );
3003 if(
m_frame->GetRenderSettings()->m_ShowPinsElectricalType )
3012 hits = line->
HitTest( selectionRect,
false );
3016 if( ( !containedMode && hits )
3021 else if( containedMode )
3031 selectItem( item, flags );
3034 selectItem( item, flags );
3039 for(
EDA_ITEM* item : pinsCollector )
3041 if(
m_frame->GetRenderSettings()->m_ShowPinsElectricalType )
3058 && hitTest(
static_cast<SCH_ITEM*
>( item ) ) )
3060 selectItem( item, 0 );
3066 for(
EDA_ITEM* item : flaggedItems )
3073 else if( anySubtracted )
3080 std::unordered_set<EDA_ITEM*> toAdd;
3084 for(
int j = 0; j < aCollector.
GetCount(); j++ )
3086 if( aCollector[j]->GetParent() )
3089 if( aCollector[j]->GetParentSymbol() )
3095 for(
int j = 0; j < aCollector.
GetCount(); j++ )
3100 const std::vector<KICAD_T>& scanTypes = aCollector.
GetScanTypes();
3101 bool promoteToGroups = scanTypes.empty()
3105 for(
int j = 0; j < aCollector.
GetCount(); )
3117 aCollector.
Remove( item );
3126 if(
top->AsEdaItem() != item )
3128 toAdd.insert(
top->AsEdaItem() );
3131 aCollector.
Remove( item );
3140 aCollector.
Remove( item );
3149 if( !aCollector.
HasItem( item ) )
3150 aCollector.
Append( item );
3160 std::vector<EDA_ITEM*> toRemove;
3166 bool lockedDescendant =
false;
3168 schItem->RunOnChildren(
3172 lockedDescendant =
true;
3176 if( schItem->IsLocked() || lockedDescendant )
3177 toRemove.push_back( item );
3199 if( cell->IsSelected() )
3211 auto wasSelected = [](
EDA_ITEM* aItem )
3218 bool doSelect =
false;
3220 if( cell->HitTest( selectionRect,
false ) )
3225 doSelect = !wasSelected( cell );
3229 else if( wasSelected( cell ) )
3234 if( doSelect && !cell->IsSelected() )
3236 else if( !doSelect && cell->IsSelected() )
3243 bool cancelled =
false;
3250 if( evt->IsCancelInteractive() || evt->IsActivate() )
3258 SelectCellsBetween( evt->DragOrigin(), evt->Position() - evt->DragOrigin(), aTable );
3260 else if( evt->IsMouseUp(
BUT_LEFT ) )
3264 bool anyAdded =
false;
3265 bool anySubtracted =
false;
3272 anySubtracted =
true;
3288 evt->SetPassEvent();
3312 int gridThreshold =
KiROUND(
getView()->GetGAL()->GetGridSize().EuclideanNorm() );
3313 int thresholdMax = std::max( pixelThreshold, gridThreshold );
3315 for(
int threshold : { 0, thresholdMax/4, thresholdMax/2, thresholdMax } )
3324 return collector.
GetCount() ? collector[ 0 ] :
nullptr;
3353 std::vector<SCH_ITEM*> startItems;
3354 std::set<SCH_ITEM*> added;
3356 for(
auto item : aItems )
3358 if( !item->IsSCH_ITEM() )
3368 startItems.push_back(
pin );
3373 startItems.push_back( schItem );
3377 if( startItems.empty() )
3382 std::unordered_set<SCH_SYMBOL*> startSymbols;
3389 startSymbols.insert( parent );
3395 std::set<VECTOR2I> pinPositions;
3402 pinPositions.insert(
pin->GetPosition() );
3406 auto isStopPoint = [&](
const VECTOR2I& aPoint ) ->
bool
3411 if( pinPositions.count( aPoint ) )
3422 switch( it->Type() )
3430 if( it->IsConnected( aPoint ) )
3445 auto shouldPullInSymbol = [&]()
3450 std::deque<SCH_ITEM*> queue;
3451 std::unordered_set<SCH_ITEM*> visited;
3453 auto enqueue = [&](
SCH_ITEM* aItem )
3458 if( visited.insert( aItem ).second )
3459 queue.push_back( aItem );
3473 while( !queue.empty() )
3482 if( shouldPullInSymbol() && symbol &&
Selectable( symbol )
3485 added.insert( symbol );
3490 std::vector<VECTOR2I> openPoints;
3496 if( !isStopPoint( pt ) )
3497 openPoints.push_back( pt );
3513 added.insert( symbol );
3522 bool sharesOpenPoint =
false;
3524 for(
const VECTOR2I& pt : openPoints )
3526 if( neighbor->IsConnected( pt ) )
3528 sharesOpenPoint =
true;
3533 if( !sharesOpenPoint )
3537 enqueue( neighbor );
3543 added.insert( item );
3552 std::set<SCH_ITEM*> added;
3554 for(
auto item : aItems )
3556 if( !item->IsSCH_ITEM() )
3561 std::set<SCH_ITEM*> conns =
m_frame->GetScreen()->MarkConnections( schItem, schItem->
IsConnectable() );
3569 added.insert( connItem );
3592 if( !selItem->IsSCH_ITEM() )
3598 graphicalSelection.
Add( item );
3600 graphicalSelection.
Add( item );
3602 connectableSelection.
Add( item );
3607 std::unordered_set<const SCH_ITEM*> originalConnectableSet;
3610 originalConnectableSet.insert(
static_cast<const SCH_ITEM*
>( selItem ) );
3614 std::set<SCH_ITEM*> graphAdded;
3615 std::set<SCH_ITEM*> graphicalAdded;
3617 if( !connectableSelection.
Empty() )
3625 bool grew = std::any_of( graphAdded.begin(), graphAdded.end(),
3628 return !originalConnectableSet.count( c );
3638 if( graphAdded.empty() && !connectableSelection.
Empty() )
3643 combinedSelection.
Add( selItem );
3645 graphicalSelection = combinedSelection;
3650 auto smartAddToSel = [&](
EDA_ITEM* aItem )
3659 for(
auto item : graphAdded )
3660 smartAddToSel( item );
3662 for(
auto item : graphicalAdded )
3663 smartAddToSel( item );
3665 for(
auto item : originalSelection )
3666 smartAddToSel( item );
3685 std::set<std::pair<SCH_TABLE*, int>> columns;
3693 columns.insert( std::make_pair(
table, cell->GetColumn() ) );
3697 for(
auto& [
table, col ] : columns )
3699 for(
int row = 0; row <
table->GetRowCount(); ++row )
3720 std::set<std::pair<SCH_TABLE*, int>> rows;
3728 rows.insert( std::make_pair(
table, cell->GetRow() ) );
3732 for(
auto& [
table, row ] : rows )
3734 for(
int col = 0; col <
table->GetColCount(); ++col )
3755 std::set<SCH_TABLE*> tables;
3761 tables.insert(
static_cast<SCH_TABLE*
>( cell->GetParent() ) );
3768 if( !
table->IsSelected() )
3811 double compRatio = bbSize.
y / currTextHeight;
3812 double compRatioBent = 1.0;
3818 std::vector<std::pair<double, double>> lut{ { 1.25, 16 },
3827 std::vector<std::pair<double, double>>::iterator it;
3830 compRatioBent = lut.back().second;
3834 if( compRatio >= lut.front().first )
3836 for( it = lut.begin(); it < lut.end() - 1; ++it )
3838 if( it->first <= compRatio &&
next( it )->first >= compRatio )
3840 double diffx = compRatio - it->first;
3841 double diffn =
next( it )->first - it->first;
3843 compRatioBent = it->second + (
next( it )->second - it->second ) * diffx / diffn;
3850 compRatioBent = lut.front().second;
3859 screenSize.
x = std::max( 10.0, screenSize.
x );
3860 screenSize.
y = std::max( 10.0, screenSize.
y );
3861 double ratio = std::max( -1.0, fabs( bbSize.
y / screenSize.
y ) );
3864 double kicadRatio = std::max( fabs( bbSize.
x / screenSize.
x ),
3865 fabs( bbSize.
y / screenSize.
y ) );
3870 if( bbSize.
x > screenSize.
x * ratio * compRatioBent )
3874 compRatioBent = 1.0;
3875 wxLogTrace(
"CROSS_PROBE_SCALE",
3876 "Part TOO WIDE for screen. Using normal KiCad zoom ratio: %1.5f", ratio );
3881 ratio *= compRatioBent;
3883 bool alwaysZoom =
false;
3886 if( ( ratio < 0.5 || ratio > 1.0 ) || alwaysZoom )
3892 SCH_ITEM* focusItem,
const std::vector<SCH_ITEM*>& items )
3899 double targetZoom = 0.0;
3901 bool targetZoomValid =
false;
3902 bool changedSheet =
false;
3904 if( targetSheetPath )
3910 targetZoom = screen->m_LastZoomLevel;
3911 targetCenter = screen->m_ScrollCenter;
3912 targetZoomValid = screen->IsZoomInitialized();
3918 changedSheet =
true;
3922 if( changedSheet && targetZoomValid && !
m_frame->eeconfig()->m_CrossProbing.zoom_to_fit )
3936 if(
m_frame->GetScreen()->CheckIfOnDrawList( item )
3937 || ( parent &&
m_frame->GetScreen()->CheckIfOnDrawList( parent ) ) )
3947 if(
m_frame->eeconfig()->m_CrossProbing.center_on_items )
3949 if(
m_frame->eeconfig()->m_CrossProbing.zoom_to_fit )
3968 bool enteredGroupFound =
false;
3976 if( item.IsSelected() )
3984 enteredGroupFound =
true;
3998 if( item->IsSelected() )
4004 item->RunOnChildren(
4018 enteredGroupFound =
true;
4030 if( !enteredGroupFound )
4052 switch( aItem->
Type() )
4060 if(
pin->GetUnit() &&
pin->GetUnit() != symEditFrame->
GetUnit() )
4067 if( !
pin->IsVisible() && !
m_frame->GetShowAllPins() )
4070 if( (
m_frame->eeconfig() &&
m_frame->eeconfig()->m_Selection.select_pin_selects_symbol ) || !
m_filter.pins )
4078 if(
pin->IsPointClickableAnchor(
grid.ResolveSnap( *aPos, pinGrid ).position ) )
4089 if( !
m_frame->eeconfig()->m_Appearance.show_directive_labels )
4097 if( !
m_frame->eeconfig()->m_Appearance.show_directive_labels
4205 aGroup->
Add( aItem );
4215 sch_item->RunOnChildren(
4266 sch_item->RunOnChildren(
4280 aGroup->
Remove( aChild );
4294 const unsigned GRIP_MARGIN = 20;
4300 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...
const std::vector< KICAD_T > & GetScanTypes() const
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 generate netlists.
bool IsHorizontal() const
The base frame for deriving all KiCad main window classes.
bool IsType(FRAME_T aType) 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,...
virtual bool IsVisible() const
virtual EDA_ANGLE GetTextAngle() 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.
SNAP_RESULT ResolveSnap(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.
SCH_CONNECTIVITY::NETCHAIN_MANAGER & NetChains() const
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.
Net membership for one UI operation.
std::vector< SCH_ITEM * > WholeNetItems(const std::vector< SCH_ITEM * > &aSeeds, const SCH_SHEET_PATH &aSheet) const
Whole nets containing the seeds on this instance; excludes bus parents and members.
SCH_NETCHAIN * GetNetChainForNet(const wxString &aNet)
SCH_NETCHAIN * FindPotentialNetChainBetweenPins(SCH_PIN *aPinA, const SCH_SHEET_PATH &aPathA, SCH_PIN *aPinB, const SCH_SHEET_PATH &aPathB)
Handle actions specific to the schematic editor.
Schematic editor (Eeschema) main window.
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags, PROGRESS_REPORTER *aProgressReporter=nullptr, bool aCleanupDone=false)
Generate the connection data for the entire schematic hierarchy.
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 SYMBOL * GetParentSymbol() const
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
virtual bool IsPointClickableAnchor(const VECTOR2I &aPos) const
const std::vector< SCH_ITEM * > & ConnectedItems(const SCH_SHEET_PATH &aPath) const
Retrieve the set of items connected to this item on the given sheet.
bool IsLocked() const override
std::optional< wxString > GetConnectionName(const SCH_SHEET_PATH *aSheet=nullptr, bool aLocal=false, bool aIgnoreSheet=false) const
Return the connection name for this sheet instance, if connected.
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.
void SetShape(LABEL_FLAG_SHAPE aShape)
LABEL_SHAPE GetLabelShape() const
wxString GetShownText(const SCH_SHEET_PATH *aPath, RESOLUTION_CONTEXT aContext, int aDepth=0) const override
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 IsDirectiveLabelOnlyArea() const
Return true when the rule area exists only as a container for attached directive labels.
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...
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
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()
BOX2I GetBodyAndPinsBoundingBox() const override
Return a bounding box for the symbol body and pins but not the fields.
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)
A null aItem is ignored; the selection never holds null members.
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_REPLACE_TERMINAL_PIN_A
@ ID_REPLACE_TERMINAL_PIN_B
@ 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.
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
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< 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)
@ 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