68 if( aSel.GetSize() == 1 )
82 return aSel.GetSize() == 1 && aSel.Front()->Type() ==
SCH_SYMBOL_T;
88 if( aSel.GetSize() == 1 )
102 if( aSel.GetSize() == 1 )
116 if( aSel.GetSize() == 1 )
120 if(
pin &&
pin->GetLibPin() )
121 return !
pin->GetLibPin()->GetAlternates().empty();
139 return aSel.GetSize() > 1 && aSel.OnlyContains( {
SCH_SYMBOL_T } );
145 return aSel.GetSize() >= 1 && aSel.OnlyContains( {
SCH_PIN_T } );
157 for(
int i = 0; aAllowedActions[i]; ++i )
159 if( aEvent->
IsAction( aAllowedActions[i] ) )
168#define HITTEST_THRESHOLD_PIXELS 5
235 if( symbolEditorFrame )
255 auto schEditSheetPageNumberCondition =
265 auto schEditCondition =
271 auto belowRootSheetCondition =
295 auto groupEnterCondition =
298 auto inGroupCondition =
304 auto& menu =
m_menu->GetMenu();
318 menu.AddSeparator( 100 );
322 menu.AddSeparator( 100 );
329 menu.AddSeparator( 200 );
343 menu.AddSeparator( 400 );
347 menu.AddSeparator( 1000 );
383 if( symbolEditFrame )
410 auto pinOrientation =
420 return pin->GetOrientation();
425 return dummy.GetOrientation();
449 bool selCancelled =
false;
450 bool displayWireCursor =
false;
451 bool displayBusCursor =
false;
452 bool displayLineCursor =
false;
453 KIID rolloverItem = lastRolloverItem;
457 evt->Modifier(
MD_ALT ) );
463 if( !
m_frame->ToolStackIsEmpty() )
497 schframe->ClearFocus();
504 size_t preFilterCount = collector.
GetCount();
506 narrowSelection( collector, evt->Position(),
false,
false, &rejected );
513 bool allCellsFromSameTable =
true;
525 allCellsFromSameTable =
false;
546 VECTOR2D bottomRight( std::max( start.
x,
end.x ), std::max( start.
y,
end.y ) );
569 else if( collector[0]->IsHypertext() )
571 collector[ 0 ]->DoHypertextAction(
m_frame );
574 else if( collector[0]->IsBrightened() )
581 schframe->SelectNetNavigatorItem( &itemData );
588 if( collector.
GetCount() == 0 && preFilterCount > 0 )
591 frame->HighlightSelectionFilter( rejected );
607 SelectPoint( evt->Position(), { SCH_LOCATE_ANY_T },
nullptr, &selCancelled );
616 .Contains( evt->Position() ) )
620 if(
CollectHits( collector, evt->Position(), { SCH_LOCATE_ANY_T } ) )
624 SelectPoint( evt->Position(), { SCH_LOCATE_ANY_T },
nullptr, &selCancelled );
632 else if( evt->IsDblClick(
BUT_LEFT ) )
638 schframe->ClearFocus();
676 schframe->ClearFocus();
685 else if(
CollectHits( collector, evt->DragOrigin(), { SCH_TABLECELL_T } )
686 && ( collector[0]->GetParent()->GetParentGroup() ==
nullptr
687 || collector[0]->GetParent()->GetParentGroup() ==
m_enteredGroup ) )
750 else if( evt->IsMouseDown(
BUT_AUX1 ) )
754 else if( evt->IsMouseDown(
BUT_AUX2 ) )
770 const int delta = evt->Parameter<
int>();
813 wxString alt = *evt->Parameter<wxString*>();
837 newItems.push_back( nc );
840 if( !commit.
Empty() )
842 commit.
Push( wxS(
"No Connect Pins" ) );
861 switch( pinOrientation( item ) )
882 newItems.push_back( wire );
885 if( !commit.
Empty() )
903 commit.
Push( wxS(
"Wire Pins" ) );
923 labelText =
pin->GetShownName();
925 if( labelText.IsEmpty() )
927 labelText.Printf(
"%s_%s",
928 pin->GetParentSymbol()->GetRef( &sheetPath ),
934 labelText = sheetPin->
GetShownText( &sheetPath,
false );
941 switch( *evt->GetCommandId() )
944 label =
new SCH_LABEL( item->GetPosition(), labelText );
956 switch( pinOrientation( item ) )
977 pinType =
pin->GetType();
1013 newItems.push_back( label );
1016 if( !commit.
Empty() )
1018 commit.
Push( wxS(
"Label Pins" ) );
1030 wxString* net =
new wxString( *evt->Parameter<wxString*>() );
1034 else if( evt->IsCancelInteractive() )
1044 schframe->ClearFocus();
1050 else if( evt->FirstResponder() ==
this && evt->GetCommandId() == (
int) WXK_ESCAPE )
1060 if(
editor &&
m_frame->eeconfig()->m_Input.esc_clears_net_highlight )
1061 editor->ClearHighlight( *evt );
1068 schframe->ClearFocus();
1070 else if( evt->IsMotion() && !
m_isSymbolEditor && evt->FirstResponder() ==
this )
1089 displayBusCursor =
true;
1091 displayWireCursor =
true;
1093 displayLineCursor =
true;
1095 else if( collector[0]->IsHypertext() && !collector[0]->IsSelected() )
1097 rolloverItem = collector[0]->m_Uuid;
1104 evt->SetPassEvent();
1107 if( lastRolloverItem !=
niluuid && lastRolloverItem != rolloverItem )
1118 m_frame->GetCanvas()->GetView()->Update( item );
1133 m_frame->GetCanvas()->GetView()->Update( item );
1137 lastRolloverItem = rolloverItem;
1139 if(
m_frame->ToolStackIsEmpty() )
1141 if( displayWireCursor )
1145 else if( displayBusCursor )
1149 else if( displayLineCursor )
1153 else if( rolloverItem !=
niluuid )
1159 && evt->HasPosition()
1184 wxT(
"EnterGroup called when selection is not a single group" ) );
1238 if(
m_frame->eeconfig()->m_Drawing.auto_start_wires
1271 if( possibleConnection.
IsBus() )
1279 if( !
pin || !
pin->IsPointClickableAnchor( pos ) )
1282 if( !
pin->IsVisible()
1283 && !(
m_frame->eeconfig()->m_Appearance.show_hidden_pins
1284 ||
m_frame->GetRenderSettings()->m_ShowHiddenPins ) )
1290 newEvt->SetMousePosition( pos );
1291 newEvt->SetHasPosition(
true );
1292 newEvt->SetForceImmediate(
true );
1305 wxMouseState keyboardState = wxGetMouseState();
1308 keyboardState.AltDown() );
1323 wxMouseState keyboardState = wxGetMouseState();
1326 keyboardState.AltDown() );
1347 const std::vector<KICAD_T>& aScanTypes )
1350 int gridThreshold =
KiROUND(
getView()->GetGAL()->GetGridSize().EuclideanNorm() / 2.0 );
1351 aCollector.
m_Threshold = std::max( pixelThreshold, gridThreshold );
1371 int originalCount = aCollector.
GetCount();
1373 for(
int ii = 0; ii < originalCount; ++ii )
1375 if( aCollector[ii]->Type() ==
SCH_PIN_T )
1379 if( !aCollector.
HasItem(
pin->GetParentSymbol() ) )
1380 aCollector.
Append(
pin->GetParentSymbol() );
1391 bool aCheckLocked,
bool aSelectedOnly,
1396 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
1398 if( symbolEditorFrame )
1405 if( !
static_cast<SCH_FIELD*
>( item )->IsVisible()
1414 if( !
static_cast<SCH_PIN*
>( item )->IsVisible()
1429 if( aCheckLocked && collector[i]->IsLocked() )
1443 if( aSelectedOnly && !collector[i]->IsSelected() )
1459 EDA_ITEM** aItem,
bool* aSelectionCancelledFlag,
bool aAdd,
1460 bool aSubtract,
bool aExclusiveOr )
1478 if( aSelectionCancelledFlag )
1479 *aSelectionCancelledFlag =
true;
1485 if( !aAdd && !aSubtract && !aExclusiveOr )
1493 bool foundEnteredGroup =
false;
1498 foundEnteredGroup =
true;
1503 if( !foundEnteredGroup )
1510 bool anySubtracted =
false;
1514 for(
int i = 0; i < aCollector.
GetCount(); ++i )
1517 bool isLine = aCollector[i]->Type() ==
SCH_LINE_T;
1533 || ( aExclusiveOr && aCollector[i]->IsSelected()
1534 && ( !isLine || ( isLine && aCollector[i]->HasFlag( flags ) ) ) ) )
1536 aCollector[i]->ClearFlags( flags );
1546 anySubtracted =
true;
1551 aCollector[i]->SetFlags( flags );
1558 if( addedCount == 1 )
1562 if( aItem && aCollector.
GetCount() == 1 )
1563 *aItem = aCollector[0];
1567 else if( addedCount > 1 )
1572 else if( anySubtracted )
1578 m_frame->GetCanvas()->ForceRefresh();
1584 const std::vector<KICAD_T>& aScanTypes,
1585 EDA_ITEM** aItem,
bool* aSelectionCancelledFlag,
1586 bool aCheckLocked,
bool aAdd,
bool aSubtract,
1591 if( !
CollectHits( collector, aWhere, aScanTypes ) )
1594 size_t preFilterCount = collector.
GetCount();
1596 rejected.
SetAll(
false );
1597 narrowSelection( collector, aWhere, aCheckLocked, aSubtract, &rejected );
1599 if( collector.
GetCount() == 0 && preFilterCount > 0 )
1602 frame->HighlightSelectionFilter( rejected );
1607 return selectPoint( collector, aWhere, aItem, aSelectionCancelledFlag, aAdd, aSubtract,
1618 std::vector<EDA_ITEM*> sheetPins;
1624 view->
Query( selectionBox,
1632 collection.
Append( item );
1646 sheetPins.emplace_back(
pin );
1667 m_frame->GetCanvas()->ForceRefresh();
1677 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> selectedItems;
1683 view->
Query( selectionBox, selectedItems );
1710 m_frame->GetCanvas()->ForceRefresh();
1718 std::set<EDA_ITEM*> exactHits;
1720 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
1733 if( item->
HitTest( aPos, pixelThreshold ) )
1734 exactHits.insert( item );
1743 if(
m_frame->GetRenderSettings()->m_ShowPinsElectricalType )
1746 if( item->
HitTest( aPos, 0 ) )
1747 exactHits.insert( item );
1753 if( exactHits.size() > 0 && exactHits.size() < (
unsigned) collector.
GetCount() )
1755 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
1759 if( !exactHits.contains( item ) )
1765 SEG poss( aPos, aPos );
1767 int closestDist = INT_MAX / 4;
1771 BOX2I bbox = item->GetBoundingBox();
1772 int dist = INT_MAX / 4;
1777 bool dominating =
false;
1779 if( exactHits.contains( item ) )
1814 ->Collide( poss, INT_MAX / 4, &dist );
1818 text->GetEffectiveTextShape(
false )->Collide( poss, INT_MAX / 4, &dist );
1824 for(
SHAPE* s : shapes )
1826 int shapeDist = dist;
1827 s->Collide( poss, INT_MAX / 4, &shapeDist );
1829 if( shapeDist < dist )
1847 rect.
Collide( poss, closestDist, &dist );
1865 if( dist == closestDist )
1867 if( item->GetParent() == closest )
1870 else if( dist < closestDist )
1886 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
1890 if( item == closest )
1893 if( !item->
HitTest( tightBox,
true ) )
1901 bool aPromoteCellSelections,
1902 bool aPromoteGroups )
1904 bool anyUnselected =
false;
1905 bool anySelected =
false;
1918 bool isMoving =
false;
1920 for(
int i = (
int)
m_selection.GetSize() - 1; i >= 0; --i )
1923 isMoving |=
static_cast<SCH_ITEM*
>( item )->IsMoving();
1925 if( !item->
IsType( aScanTypes ) )
1928 anyUnselected =
true;
1936 if( aPromoteGroups )
1938 for(
int i = (
int)
m_selection.GetSize() - 1; i >= 0; --i )
1942 std::set<EDA_ITEM*> selectedChildren;
1948 if( aChild->
IsType( aScanTypes ) )
1949 selectedChildren.insert( aChild );
1953 anyUnselected =
true;
1956 for(
EDA_ITEM* child : selectedChildren )
1958 if( !child->IsSelected() )
1970 if( aPromoteCellSelections )
1972 std::set<EDA_ITEM*> parents;
1974 for(
int i = (
int)
m_selection.GetSize() - 1; i >= 0; --i )
1982 anyUnselected =
true;
1988 if( !parent->IsSelected() )
2011 std::set<EDA_ITEM*> rejected;
2016 rejected.insert( item );
2020 aCollector.
Remove( item );
2033 if( schItem->IsLocked() && !
m_filter.lockedItems )
2038 switch( aItem->
Type() )
2056 aRejected->
pins =
true;
2066 aRejected->
wires =
true;
2074 switch(
static_cast<SCH_LINE*
>( aItem )->GetLayer() )
2081 aRejected->
wires =
true;
2117 aRejected->
text =
true;
2129 aRejected->
labels =
true;
2139 aRejected->
images =
true;
2219 bool cancelled =
false;
2235 isGreedy = !isGreedy;
2240 if( evt->IsCancelInteractive() || evt->IsActivate() )
2253 area.
SetEnd( evt->Position() );
2270 evt->SetPassEvent(
false );
2292 bool cancelled =
false;
2308 bool isClockwise = shapeArea > 0 ? true :
false;
2310 if(
getView()->IsMirroredX() && shapeArea != 0 )
2311 isClockwise = !isClockwise;
2315 if( evt->IsCancelInteractive() || evt->IsActivate() )
2324 points.
Append( evt->Position() );
2326 else if( evt->IsDblClick(
BUT_LEFT )
2365 area.
SetMode( selectionMode );
2392 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> candidates;
2394 view->
Query( selectionRect, candidates );
2396 std::set<SCH_ITEM*> uniqueCandidates;
2398 for(
const auto& [viewItem, layer] : candidates )
2400 if( viewItem->IsSCH_ITEM() )
2401 uniqueCandidates.insert(
static_cast<SCH_ITEM*
>( viewItem ) );
2410 if( boxMode ? selectionRect.
Intersects(
pin->GetBoundingBox() )
2412 uniqueCandidates.insert(
pin );
2419 if( boxMode ? selectionRect.
Intersects(
pin->GetBoundingBox() )
2421 uniqueCandidates.insert(
pin );
2428 std::set<EDA_ITEM*> group_items;
2437 std::unordered_set<EDA_ITEM*>& newset =
group->GetItems();
2440 [&](
const BOX2I& aBox )
2442 return boxMode ? selectionRect.
Contains( aBox )
2446 if( containedMode && boxContained(
group->GetBoundingBox() ) && newset.size() )
2448 for(
EDA_ITEM* group_item : newset )
2450 if( !group_item->IsSCH_ITEM() )
2454 collector.
Append( *newset.begin() );
2458 for(
EDA_ITEM* group_item : newset )
2459 group_items.emplace( group_item );
2465 return boxMode ? aItem->HitTest( selectionRect, containedMode )
2466 : aItem->HitTest( aArea.
GetPoly(), containedMode );
2469 for(
SCH_ITEM* item : uniqueCandidates )
2472 && ( !containedMode || !group_items.count( item ) ) )
2475 pinsCollector.
Append( item );
2477 collector.
Append( item );
2486 collector = pinsCollector;
2491 std::sort( collector.
begin(), collector.
end(),
2494 VECTOR2I aPos = a->GetPosition();
2495 VECTOR2I bPos = b->GetPosition();
2497 if( aPos.y == bPos.y )
2498 return aPos.x < bPos.x;
2500 return aPos.y < bPos.y;
2503 bool anyAdded =
false;
2504 bool anySubtracted =
false;
2509 if( aSubtractive || ( aExclusiveOr && aItem->
IsSelected() ) )
2519 anySubtracted =
true;
2522 if( flags && !anySubtracted )
2533 std::vector<EDA_ITEM*> flaggedItems;
2535 auto shapeContains =
2538 return boxMode ? selectionRect.
Contains( aPoint )
2547 flaggedItems.push_back( item );
2549 if(
m_frame->GetRenderSettings()->m_ShowPinsElectricalType )
2558 hits = line->
HitTest( selectionRect,
false );
2562 if( ( !containedMode && hits )
2567 else if( containedMode )
2577 selectItem( item, flags );
2580 selectItem( item, flags );
2585 for(
EDA_ITEM* item : pinsCollector )
2587 if(
m_frame->GetRenderSettings()->m_ShowPinsElectricalType )
2593 selectItem( item, 0 );
2599 for(
EDA_ITEM* item : flaggedItems )
2606 else if( anySubtracted )
2612 bool aMultiselect )
const
2614 std::unordered_set<EDA_ITEM*> toAdd;
2618 for(
int j = 0; j < aCollector.
GetCount(); j++ )
2620 if( aCollector[j]->GetParent() )
2623 if( aCollector[j]->GetParentSymbol() )
2629 for(
int j = 0; j < aCollector.
GetCount(); j++ )
2633 for(
int j = 0; j < aCollector.
GetCount(); )
2645 aCollector.
Remove( item );
2653 if( top->AsEdaItem() != item )
2655 toAdd.insert( top->AsEdaItem() );
2658 aCollector.
Remove( item );
2667 aCollector.
Remove( item );
2676 if( !aCollector.
HasItem( item ) )
2677 aCollector.
Append( item );
2695 if( cell->IsSelected() )
2707 auto wasSelected = [](
EDA_ITEM* aItem )
2714 bool doSelect =
false;
2716 if( cell->HitTest( selectionRect,
false ) )
2721 doSelect = !wasSelected( cell );
2725 else if( wasSelected( cell ) )
2730 if( doSelect && !cell->IsSelected() )
2732 else if( !doSelect && cell->IsSelected() )
2739 bool cancelled =
false;
2746 if( evt->IsCancelInteractive() || evt->IsActivate() )
2754 SelectCellsBetween( evt->DragOrigin(), evt->Position() - evt->DragOrigin(), aTable );
2756 else if( evt->IsMouseUp(
BUT_LEFT ) )
2760 bool anyAdded =
false;
2761 bool anySubtracted =
false;
2768 anySubtracted =
true;
2784 evt->SetPassEvent();
2808 int gridThreshold =
KiROUND(
getView()->GetGAL()->GetGridSize().EuclideanNorm() );
2809 int thresholdMax = std::max( pixelThreshold, gridThreshold );
2811 for(
int threshold : { 0, thresholdMax/4, thresholdMax/2, thresholdMax } )
2820 return collector.
GetCount() ? collector[ 0 ] :
nullptr;
2841 m_frame->GetScreen()->ClearDrawingState();
2850 std::set<SCH_ITEM*> conns =
m_frame->GetScreen()->MarkConnections( line, line->
IsConnectable() );
2865 std::set<std::pair<SCH_TABLE*, int>> columns;
2873 columns.insert( std::make_pair(
table, cell->GetColumn() ) );
2877 for(
auto& [
table, col ] : columns )
2879 for(
int row = 0; row <
table->GetRowCount(); ++row )
2900 std::set<std::pair<SCH_TABLE*, int>> rows;
2908 rows.insert( std::make_pair(
table, cell->GetRow() ) );
2912 for(
auto& [
table, row ] : rows )
2914 for(
int col = 0; col <
table->GetColCount(); ++col )
2935 std::set<SCH_TABLE*> tables;
2941 tables.insert(
static_cast<SCH_TABLE*
>( cell->GetParent() ) );
2948 if( !
table->IsSelected() )
2991 double compRatio = bbSize.
y / currTextHeight;
2992 double compRatioBent = 1.0;
2998 std::vector<std::pair<double, double>> lut{ { 1.25, 16 },
3007 std::vector<std::pair<double, double>>::iterator it;
3010 compRatioBent = lut.back().second;
3014 if( compRatio >= lut.front().first )
3016 for( it = lut.begin(); it < lut.end() - 1; ++it )
3018 if( it->first <= compRatio &&
next( it )->first >= compRatio )
3020 double diffx = compRatio - it->first;
3021 double diffn =
next( it )->first - it->first;
3023 compRatioBent = it->second + (
next( it )->second - it->second ) * diffx / diffn;
3030 compRatioBent = lut.front().second;
3039 screenSize.
x = std::max( 10.0, screenSize.
x );
3040 screenSize.
y = std::max( 10.0, screenSize.
y );
3041 double ratio = std::max( -1.0, fabs( bbSize.
y / screenSize.
y ) );
3044 double kicadRatio = std::max( fabs( bbSize.
x / screenSize.
x ),
3045 fabs( bbSize.
y / screenSize.
y ) );
3050 if( bbSize.
x > screenSize.
x * ratio * compRatioBent )
3054 compRatioBent = 1.0;
3055 wxLogTrace(
"CROSS_PROBE_SCALE",
3056 "Part TOO WIDE for screen. Using normal KiCad zoom ratio: %1.5f", ratio );
3061 ratio *= compRatioBent;
3063 bool alwaysZoom =
false;
3066 if( ( ratio < 0.5 || ratio > 1.0 ) || alwaysZoom )
3072 SCH_ITEM* focusItem,
const std::vector<SCH_ITEM*>& items )
3093 if(
m_frame->GetScreen()->CheckIfOnDrawList( item )
3094 || ( parent &&
m_frame->GetScreen()->CheckIfOnDrawList( parent ) ) )
3104 if(
m_frame->eeconfig()->m_CrossProbing.center_on_items )
3106 if(
m_frame->eeconfig()->m_CrossProbing.zoom_to_fit )
3125 bool enteredGroupFound =
false;
3133 if( item.IsSelected() )
3141 enteredGroupFound =
true;
3155 if( item->IsSelected() )
3161 item->RunOnChildren(
3175 enteredGroupFound =
true;
3187 if( !enteredGroupFound )
3199 bool checkVisibilityOnly )
const
3210 switch( aItem->
Type() )
3218 if(
pin->GetUnit() &&
pin->GetUnit() != symEditFrame->
GetUnit() )
3225 if( !
pin->IsVisible() && !
m_frame->GetShowAllPins() )
3236 if(
pin->IsPointClickableAnchor(
grid.BestSnapAnchor( *aPos, pinGrid ) ) )
3247 if( !
m_frame->eeconfig()->m_Appearance.show_directive_labels )
3352 aGroup->
Add( aItem );
3362 sch_item->RunOnChildren(
3413 sch_item->RunOnChildren(
3427 aGroup->
Remove( aChild );
3441 const unsigned GRIP_MARGIN = 20;
3447 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 std::vector< SHAPE * > MakeEffectiveShapes(bool aEdgeOnly=false) const
Make a set of SHAPE objects representing the EDA_SHAPE.
virtual bool IsFilledForHitTesting() 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 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 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 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()
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,...
An abstract shape on 2D plane.
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