69 if( aSel.GetSize() == 1 )
83 return aSel.GetSize() == 1 && aSel.Front()->Type() ==
SCH_SYMBOL_T;
89 if( aSel.GetSize() == 1 )
103 if( aSel.GetSize() == 1 )
117 if( aSel.GetSize() == 1 )
121 if(
pin &&
pin->GetLibPin() )
122 return !
pin->GetLibPin()->GetAlternates().empty();
140 return aSel.GetSize() > 1 && aSel.OnlyContains( {
SCH_SYMBOL_T } );
146 return aSel.GetSize() >= 1 && aSel.OnlyContains( {
SCH_PIN_T } );
158 for(
int i = 0; aAllowedActions[i]; ++i )
160 if( aEvent->
IsAction( aAllowedActions[i] ) )
169#define HITTEST_THRESHOLD_PIXELS 5
236 if( symbolEditorFrame )
257 auto schEditSheetPageNumberCondition =
267 auto schEditCondition =
273 auto belowRootSheetCondition =
297 auto groupEnterCondition =
300 auto inGroupCondition =
306 auto multipleUnitsSelection = [](
const SELECTION& aSel )
315 m_frame->eeconfig()->m_Input.allow_unconstrained_pin_swaps;
319 auto& menu =
m_menu->GetMenu();
333 menu.AddSeparator( 100 );
337 menu.AddSeparator( 100 );
344 menu.AddSeparator( 200 );
361 menu.AddSeparator( 400 );
365 menu.AddSeparator( 1000 );
401 if( symbolEditFrame )
428 auto pinOrientation =
438 return pin->GetOrientation();
443 return dummy.GetOrientation();
467 bool selCancelled =
false;
468 bool displayWireCursor =
false;
469 bool displayBusCursor =
false;
470 bool displayLineCursor =
false;
471 KIID rolloverItem = lastRolloverItem;
475 evt->Modifier(
MD_ALT ) );
481 if( !
m_frame->ToolStackIsEmpty() )
515 schframe->ClearFocus();
522 size_t preFilterCount = collector.
GetCount();
524 narrowSelection( collector, evt->Position(),
false,
false, &rejected );
531 bool allCellsFromSameTable =
true;
543 allCellsFromSameTable =
false;
564 VECTOR2D bottomRight( std::max( start.
x,
end.x ), std::max( start.
y,
end.y ) );
587 else if( collector[0]->IsHypertext() )
589 collector[ 0 ]->DoHypertextAction(
m_frame );
592 else if( collector[0]->IsBrightened() )
599 schframe->SelectNetNavigatorItem( &itemData );
606 if( collector.
GetCount() == 0 && preFilterCount > 0 )
609 frame->HighlightSelectionFilter( rejected );
625 SelectPoint( evt->Position(), { SCH_LOCATE_ANY_T },
nullptr, &selCancelled );
634 .Contains( evt->Position() ) )
638 if(
CollectHits( collector, evt->Position(), { SCH_LOCATE_ANY_T } ) )
642 SelectPoint( evt->Position(), { SCH_LOCATE_ANY_T },
nullptr, &selCancelled );
650 else if( evt->IsDblClick(
BUT_LEFT ) )
656 schframe->ClearFocus();
694 schframe->ClearFocus();
703 else if(
CollectHits( collector, evt->DragOrigin(), { SCH_TABLECELL_T } )
704 && ( collector[0]->GetParent()->GetParentGroup() ==
nullptr
705 || collector[0]->GetParent()->GetParentGroup() ==
m_enteredGroup ) )
768 else if( evt->IsMouseDown(
BUT_AUX1 ) )
772 else if( evt->IsMouseDown(
BUT_AUX2 ) )
788 const int delta = evt->Parameter<
int>();
831 wxString alt = *evt->Parameter<wxString*>();
855 newItems.push_back( nc );
858 if( !commit.
Empty() )
860 commit.
Push( wxS(
"No Connect Pins" ) );
879 switch( pinOrientation( item ) )
900 newItems.push_back( wire );
903 if( !commit.
Empty() )
921 commit.
Push( wxS(
"Wire Pins" ) );
941 labelText =
pin->GetShownName();
943 if( labelText.IsEmpty() )
945 labelText.Printf(
"%s_%s",
946 pin->GetParentSymbol()->GetRef( &sheetPath ),
952 labelText = sheetPin->
GetShownText( &sheetPath,
false );
959 switch( *evt->GetCommandId() )
962 label =
new SCH_LABEL( item->GetPosition(), labelText );
974 switch( pinOrientation( item ) )
995 pinType =
pin->GetType();
1031 newItems.push_back( label );
1034 if( !commit.
Empty() )
1036 commit.
Push( wxS(
"Label Pins" ) );
1048 wxString* net =
new wxString( *evt->Parameter<wxString*>() );
1052 else if( evt->IsCancelInteractive() )
1062 schframe->ClearFocus();
1068 else if( evt->FirstResponder() ==
this && evt->GetCommandId() == (
int) WXK_ESCAPE )
1078 if(
editor &&
m_frame->eeconfig()->m_Input.esc_clears_net_highlight )
1079 editor->ClearHighlight( *evt );
1086 schframe->ClearFocus();
1088 else if( evt->IsMotion() && !
m_isSymbolEditor && evt->FirstResponder() ==
this )
1107 displayBusCursor =
true;
1109 displayWireCursor =
true;
1111 displayLineCursor =
true;
1113 else if( collector[0]->IsHypertext() && !collector[0]->IsSelected() )
1115 rolloverItem = collector[0]->m_Uuid;
1122 evt->SetPassEvent();
1125 if( lastRolloverItem !=
niluuid && lastRolloverItem != rolloverItem )
1136 m_frame->GetCanvas()->GetView()->Update( item );
1151 m_frame->GetCanvas()->GetView()->Update( item );
1155 lastRolloverItem = rolloverItem;
1157 if(
m_frame->ToolStackIsEmpty() )
1159 if( displayWireCursor )
1163 else if( displayBusCursor )
1167 else if( displayLineCursor )
1171 else if( rolloverItem !=
niluuid )
1177 && evt->HasPosition()
1202 wxT(
"EnterGroup called when selection is not a single group" ) );
1256 if(
m_frame->eeconfig()->m_Drawing.auto_start_wires
1289 if( possibleConnection.
IsBus() )
1297 if( !
pin || !
pin->IsPointClickableAnchor( pos ) )
1300 if( !
pin->IsVisible()
1301 && !(
m_frame->eeconfig()->m_Appearance.show_hidden_pins
1302 ||
m_frame->GetRenderSettings()->m_ShowHiddenPins ) )
1308 newEvt->SetMousePosition( pos );
1309 newEvt->SetHasPosition(
true );
1310 newEvt->SetForceImmediate(
true );
1323 wxMouseState keyboardState = wxGetMouseState();
1326 keyboardState.AltDown() );
1341 wxMouseState keyboardState = wxGetMouseState();
1344 keyboardState.AltDown() );
1365 const std::vector<KICAD_T>& aScanTypes )
1368 int gridThreshold =
KiROUND(
getView()->GetGAL()->GetGridSize().EuclideanNorm() / 2.0 );
1369 aCollector.
m_Threshold = std::max( pixelThreshold, gridThreshold );
1389 int originalCount = aCollector.
GetCount();
1391 for(
int ii = 0; ii < originalCount; ++ii )
1393 if( aCollector[ii]->Type() ==
SCH_PIN_T )
1397 if( !aCollector.
HasItem(
pin->GetParentSymbol() ) )
1398 aCollector.
Append(
pin->GetParentSymbol() );
1409 bool aCheckLocked,
bool aSelectedOnly,
1414 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
1416 if( symbolEditorFrame )
1423 if( !
static_cast<SCH_FIELD*
>( item )->IsVisible()
1432 if( !
static_cast<SCH_PIN*
>( item )->IsVisible()
1447 if( aCheckLocked && collector[i]->IsLocked() )
1461 if( aSelectedOnly && !collector[i]->IsSelected() )
1477 EDA_ITEM** aItem,
bool* aSelectionCancelledFlag,
bool aAdd,
1478 bool aSubtract,
bool aExclusiveOr )
1496 if( aSelectionCancelledFlag )
1497 *aSelectionCancelledFlag =
true;
1503 if( !aAdd && !aSubtract && !aExclusiveOr )
1511 bool foundEnteredGroup =
false;
1516 foundEnteredGroup =
true;
1521 if( !foundEnteredGroup )
1528 bool anySubtracted =
false;
1532 for(
int i = 0; i < aCollector.
GetCount(); ++i )
1535 bool isLine = aCollector[i]->Type() ==
SCH_LINE_T;
1551 || ( aExclusiveOr && aCollector[i]->IsSelected()
1552 && ( !isLine || ( isLine && aCollector[i]->HasFlag( flags ) ) ) ) )
1554 aCollector[i]->ClearFlags( flags );
1564 anySubtracted =
true;
1569 aCollector[i]->SetFlags( flags );
1576 if( addedCount == 1 )
1580 if( aItem && aCollector.
GetCount() == 1 )
1581 *aItem = aCollector[0];
1585 else if( addedCount > 1 )
1590 else if( anySubtracted )
1596 m_frame->GetCanvas()->ForceRefresh();
1602 const std::vector<KICAD_T>& aScanTypes,
1603 EDA_ITEM** aItem,
bool* aSelectionCancelledFlag,
1604 bool aCheckLocked,
bool aAdd,
bool aSubtract,
1609 if( !
CollectHits( collector, aWhere, aScanTypes ) )
1612 size_t preFilterCount = collector.
GetCount();
1614 rejected.
SetAll(
false );
1615 narrowSelection( collector, aWhere, aCheckLocked, aSubtract, &rejected );
1617 if( collector.
GetCount() == 0 && preFilterCount > 0 )
1620 frame->HighlightSelectionFilter( rejected );
1625 return selectPoint( collector, aWhere, aItem, aSelectionCancelledFlag, aAdd, aSubtract,
1636 std::vector<EDA_ITEM*> sheetPins;
1642 view->
Query( selectionBox,
1650 collection.
Append( item );
1664 sheetPins.emplace_back(
pin );
1685 m_frame->GetCanvas()->ForceRefresh();
1695 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> selectedItems;
1701 view->
Query( selectionBox, selectedItems );
1728 m_frame->GetCanvas()->ForceRefresh();
1736 std::set<EDA_ITEM*> exactHits;
1738 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
1751 if( item->
HitTest( aPos, pixelThreshold ) )
1752 exactHits.insert( item );
1761 if(
m_frame->GetRenderSettings()->m_ShowPinsElectricalType )
1764 if( item->
HitTest( aPos, 0 ) )
1765 exactHits.insert( item );
1771 if( exactHits.size() > 0 && exactHits.size() < (
unsigned) collector.
GetCount() )
1773 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
1777 if( !exactHits.contains( item ) )
1783 SEG poss( aPos, aPos );
1785 int closestDist = INT_MAX / 4;
1789 BOX2I bbox = item->GetBoundingBox();
1790 int dist = INT_MAX / 4;
1795 bool dominating =
false;
1797 if( exactHits.contains( item ) )
1835 text->GetEffectiveTextShape(
false )->Collide( poss, INT_MAX / 4, &dist );
1841 shapes->Collide( poss, INT_MAX / 4, &dist );
1855 rect.
Collide( poss, closestDist, &dist );
1873 if( dist == closestDist )
1875 if( item->GetParent() == closest )
1878 else if( dist < closestDist )
1894 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
1898 if( item == closest )
1901 if( !item->
HitTest( tightBox,
true ) )
1909 bool aPromoteCellSelections,
1910 bool aPromoteGroups )
1912 bool anyUnselected =
false;
1913 bool anySelected =
false;
1926 bool isMoving =
false;
1928 for(
int i = (
int)
m_selection.GetSize() - 1; i >= 0; --i )
1931 isMoving |=
static_cast<SCH_ITEM*
>( item )->IsMoving();
1933 if( !item->
IsType( aScanTypes ) )
1936 anyUnselected =
true;
1944 if( aPromoteGroups )
1946 for(
int i = (
int)
m_selection.GetSize() - 1; i >= 0; --i )
1950 std::set<EDA_ITEM*> selectedChildren;
1956 if( aChild->
IsType( aScanTypes ) )
1957 selectedChildren.insert( aChild );
1961 anyUnselected =
true;
1964 for(
EDA_ITEM* child : selectedChildren )
1966 if( !child->IsSelected() )
1978 if( aPromoteCellSelections )
1980 std::set<EDA_ITEM*> parents;
1982 for(
int i = (
int)
m_selection.GetSize() - 1; i >= 0; --i )
1990 anyUnselected =
true;
1996 if( !parent->IsSelected() )
2019 std::set<EDA_ITEM*> rejected;
2024 rejected.insert( item );
2028 aCollector.
Remove( item );
2041 if( schItem->IsLocked() && !
m_filter.lockedItems )
2046 switch( aItem->
Type() )
2064 aRejected->
pins =
true;
2074 aRejected->
wires =
true;
2082 switch(
static_cast<SCH_LINE*
>( aItem )->GetLayer() )
2089 aRejected->
wires =
true;
2125 aRejected->
text =
true;
2137 aRejected->
labels =
true;
2147 aRejected->
images =
true;
2227 bool cancelled =
false;
2243 isGreedy = !isGreedy;
2248 if( evt->IsCancelInteractive() || evt->IsActivate() )
2261 area.
SetEnd( evt->Position() );
2278 evt->SetPassEvent(
false );
2300 bool cancelled =
false;
2316 bool isClockwise = shapeArea > 0 ? true :
false;
2318 if(
getView()->IsMirroredX() && shapeArea != 0 )
2319 isClockwise = !isClockwise;
2323 if( evt->IsCancelInteractive() || evt->IsActivate() )
2332 points.
Append( evt->Position() );
2334 else if( evt->IsDblClick(
BUT_LEFT )
2373 area.
SetMode( selectionMode );
2400 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> candidates;
2402 view->
Query( selectionRect, candidates );
2404 std::set<SCH_ITEM*> uniqueCandidates;
2406 for(
const auto& [viewItem, layer] : candidates )
2408 if( viewItem->IsSCH_ITEM() )
2409 uniqueCandidates.insert(
static_cast<SCH_ITEM*
>( viewItem ) );
2418 if( boxMode ? selectionRect.
Intersects(
pin->GetBoundingBox() )
2420 uniqueCandidates.insert(
pin );
2427 if( boxMode ? selectionRect.
Intersects(
pin->GetBoundingBox() )
2429 uniqueCandidates.insert(
pin );
2434 if( field.IsVisible()
2435 && ( boxMode ? selectionRect.
Intersects( field.GetBoundingBox() )
2438 uniqueCandidates.insert( &field );
2446 std::set<EDA_ITEM*> group_items;
2455 std::unordered_set<EDA_ITEM*>& newset =
group->GetItems();
2458 [&](
const BOX2I& aBox )
2460 return boxMode ? selectionRect.
Contains( aBox )
2464 if( containedMode && boxContained(
group->GetBoundingBox() ) && newset.size() )
2466 for(
EDA_ITEM* group_item : newset )
2468 if( !group_item->IsSCH_ITEM() )
2472 collector.
Append( *newset.begin() );
2476 for(
EDA_ITEM* group_item : newset )
2477 group_items.emplace( group_item );
2483 return boxMode ? aItem->HitTest( selectionRect, containedMode )
2484 : aItem->HitTest( aArea.
GetPoly(), containedMode );
2487 for(
SCH_ITEM* item : uniqueCandidates )
2490 && ( !containedMode || !group_items.count( item ) ) )
2493 pinsCollector.
Append( item );
2495 collector.
Append( item );
2504 collector = pinsCollector;
2509 std::sort( collector.
begin(), collector.
end(),
2512 VECTOR2I aPos = a->GetPosition();
2513 VECTOR2I bPos = b->GetPosition();
2515 if( aPos.y == bPos.y )
2516 return aPos.x < bPos.x;
2518 return aPos.y < bPos.y;
2521 bool anyAdded =
false;
2522 bool anySubtracted =
false;
2527 if( aSubtractive || ( aExclusiveOr && aItem->
IsSelected() ) )
2537 anySubtracted =
true;
2540 if( flags && !anySubtracted )
2551 std::vector<EDA_ITEM*> flaggedItems;
2553 auto shapeContains =
2556 return boxMode ? selectionRect.
Contains( aPoint )
2565 flaggedItems.push_back( item );
2567 if(
m_frame->GetRenderSettings()->m_ShowPinsElectricalType )
2576 hits = line->
HitTest( selectionRect,
false );
2580 if( ( !containedMode && hits )
2585 else if( containedMode )
2595 selectItem( item, flags );
2598 selectItem( item, flags );
2603 for(
EDA_ITEM* item : pinsCollector )
2605 if(
m_frame->GetRenderSettings()->m_ShowPinsElectricalType )
2611 selectItem( item, 0 );
2617 for(
EDA_ITEM* item : flaggedItems )
2624 else if( anySubtracted )
2630 bool aMultiselect )
const
2632 std::unordered_set<EDA_ITEM*> toAdd;
2636 for(
int j = 0; j < aCollector.
GetCount(); j++ )
2638 if( aCollector[j]->GetParent() )
2641 if( aCollector[j]->GetParentSymbol() )
2647 for(
int j = 0; j < aCollector.
GetCount(); j++ )
2651 for(
int j = 0; j < aCollector.
GetCount(); )
2663 aCollector.
Remove( item );
2671 if( top->AsEdaItem() != item )
2673 toAdd.insert( top->AsEdaItem() );
2676 aCollector.
Remove( item );
2685 aCollector.
Remove( item );
2694 if( !aCollector.
HasItem( item ) )
2695 aCollector.
Append( item );
2713 if( cell->IsSelected() )
2725 auto wasSelected = [](
EDA_ITEM* aItem )
2732 bool doSelect =
false;
2734 if( cell->HitTest( selectionRect,
false ) )
2739 doSelect = !wasSelected( cell );
2743 else if( wasSelected( cell ) )
2748 if( doSelect && !cell->IsSelected() )
2750 else if( !doSelect && cell->IsSelected() )
2757 bool cancelled =
false;
2764 if( evt->IsCancelInteractive() || evt->IsActivate() )
2772 SelectCellsBetween( evt->DragOrigin(), evt->Position() - evt->DragOrigin(), aTable );
2774 else if( evt->IsMouseUp(
BUT_LEFT ) )
2778 bool anyAdded =
false;
2779 bool anySubtracted =
false;
2786 anySubtracted =
true;
2802 evt->SetPassEvent();
2826 int gridThreshold =
KiROUND(
getView()->GetGAL()->GetGridSize().EuclideanNorm() );
2827 int thresholdMax = std::max( pixelThreshold, gridThreshold );
2829 for(
int threshold : { 0, thresholdMax/4, thresholdMax/2, thresholdMax } )
2838 return collector.
GetCount() ? collector[ 0 ] :
nullptr;
2859 m_frame->GetScreen()->ClearDrawingState();
2868 std::set<SCH_ITEM*> conns =
m_frame->GetScreen()->MarkConnections( line, line->
IsConnectable() );
2883 std::set<std::pair<SCH_TABLE*, int>> columns;
2891 columns.insert( std::make_pair(
table, cell->GetColumn() ) );
2895 for(
auto& [
table, col ] : columns )
2897 for(
int row = 0; row <
table->GetRowCount(); ++row )
2918 std::set<std::pair<SCH_TABLE*, int>> rows;
2926 rows.insert( std::make_pair(
table, cell->GetRow() ) );
2930 for(
auto& [
table, row ] : rows )
2932 for(
int col = 0; col <
table->GetColCount(); ++col )
2953 std::set<SCH_TABLE*> tables;
2959 tables.insert(
static_cast<SCH_TABLE*
>( cell->GetParent() ) );
2966 if( !
table->IsSelected() )
3009 double compRatio = bbSize.
y / currTextHeight;
3010 double compRatioBent = 1.0;
3016 std::vector<std::pair<double, double>> lut{ { 1.25, 16 },
3025 std::vector<std::pair<double, double>>::iterator it;
3028 compRatioBent = lut.back().second;
3032 if( compRatio >= lut.front().first )
3034 for( it = lut.begin(); it < lut.end() - 1; ++it )
3036 if( it->first <= compRatio &&
next( it )->first >= compRatio )
3038 double diffx = compRatio - it->first;
3039 double diffn =
next( it )->first - it->first;
3041 compRatioBent = it->second + (
next( it )->second - it->second ) * diffx / diffn;
3048 compRatioBent = lut.front().second;
3057 screenSize.
x = std::max( 10.0, screenSize.
x );
3058 screenSize.
y = std::max( 10.0, screenSize.
y );
3059 double ratio = std::max( -1.0, fabs( bbSize.
y / screenSize.
y ) );
3062 double kicadRatio = std::max( fabs( bbSize.
x / screenSize.
x ),
3063 fabs( bbSize.
y / screenSize.
y ) );
3068 if( bbSize.
x > screenSize.
x * ratio * compRatioBent )
3072 compRatioBent = 1.0;
3073 wxLogTrace(
"CROSS_PROBE_SCALE",
3074 "Part TOO WIDE for screen. Using normal KiCad zoom ratio: %1.5f", ratio );
3079 ratio *= compRatioBent;
3081 bool alwaysZoom =
false;
3084 if( ( ratio < 0.5 || ratio > 1.0 ) || alwaysZoom )
3090 SCH_ITEM* focusItem,
const std::vector<SCH_ITEM*>& items )
3111 if(
m_frame->GetScreen()->CheckIfOnDrawList( item )
3112 || ( parent &&
m_frame->GetScreen()->CheckIfOnDrawList( parent ) ) )
3122 if(
m_frame->eeconfig()->m_CrossProbing.center_on_items )
3124 if(
m_frame->eeconfig()->m_CrossProbing.zoom_to_fit )
3143 bool enteredGroupFound =
false;
3151 if( item.IsSelected() )
3159 enteredGroupFound =
true;
3173 if( item->IsSelected() )
3179 item->RunOnChildren(
3193 enteredGroupFound =
true;
3205 if( !enteredGroupFound )
3217 bool checkVisibilityOnly )
const
3228 switch( aItem->
Type() )
3236 if(
pin->GetUnit() &&
pin->GetUnit() != symEditFrame->
GetUnit() )
3243 if( !
pin->IsVisible() && !
m_frame->GetShowAllPins() )
3254 if(
pin->IsPointClickableAnchor(
grid.BestSnapAnchor( *aPos, pinGrid ) ) )
3265 if( !
m_frame->eeconfig()->m_Appearance.show_directive_labels )
3370 aGroup->
Add( aItem );
3380 sch_item->RunOnChildren(
3431 sch_item->RunOnChildren(
3445 aGroup->
Remove( aChild );
3459 const unsigned GRIP_MARGIN = 20;
3465 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.
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
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)
void SetIsRollover(bool aIsRollover)
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)
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 SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Set the item visibility.
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 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 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 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 editPageNumber
static TOOL_ACTION selectOnPCB
static TOOL_ACTION syncSheetPins
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 AllPinsOrSheetPins
static SELECTION_CONDITION SingleSymbolOrPower
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.
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
wxTreeCtrl * GetNetNavigator()
const SCH_ITEM * SelectNextPrevNetNavigatorItem(bool aNext)
const wxString & GetHighlightedConnection() const
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,...
const SYMBOL * GetParentSymbol() const
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
virtual bool IsPointClickableAnchor(const VECTOR2I &aPos) const
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 IsConnectable() const override
bool IsGraphicLine() const
Return if the line is a graphic (non electrical line)
void SetEndPoint(const VECTOR2I &aPosition)
Tool that displays edit points allowing to modify items by dragging the points.
bool HasPoint()
Indicate the cursor is over an edit point.
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()
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
std::vector< SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet) const
Retrieve a list of the SCH_PINs for the given sheet path.
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)
virtual void Remove(EDA_ITEM *aItem)
bool PointInside(const VECTOR2I &aPt, int aAccuracy=0, bool aUseBBoxCache=false) const override
Check if point aP lies inside a closed shape.
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 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.
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
std::vector< EDA_ITEM * > EDA_ITEMS
Define list of drawing items for screens.
#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::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.
@ 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