63#define QUIET_MODE true
68 switch( aItem->
Type() )
76 return static_cast<const SCH_LINE*
>( aItem )->IsGraphicLine();
91 long long bot =
top + h;
112 long long bot =
top + h;
113 long long perimeter = 2 * ( w + h );
122 aArc = ( ( aArc % perimeter ) + perimeter ) % perimeter;
129 else if( aArc <= w + h )
134 else if( aArc <= 2 * w + h )
137 aPos =
VECTOR2I( (
int) (
right - ( aArc - w - h ) ), (
int) bot );
142 aPos =
VECTOR2I( (
int)
left, (
int) ( bot - ( aArc - 2 * w - h ) ) );
149 if( !aNewLine || !aSource || !aFrame )
160 if( !sourceConnection )
168 newConnection->
Clone( *sourceConnection );
259 bool foundAttachment =
false;
260 bool foundJunction =
false;
261 bool foundPin =
false;
266 foundAttachment =
true;
270 switch( cItem->Type() )
286 if( !foundLine && cLine->
GetLength() == 0 )
292 foundJunction =
true;
302 if( pair.first->IsConnected( selectedEnd ) )
322 bool preferOriginalLine =
false;
326 && line->GetLength() == 0
327 &&
EDA_ANGLE( splitDelta ).IsParallelTo( line->GetStoredAngle() ) )
329 preferOriginalLine =
true;
335 else if( !foundLine && foundJunction && !foundPin )
338 foundLine =
new SCH_LINE( unselectedEnd, line->GetLayer() );
355 if( foundLine && !preferOriginalLine )
376 else if( foundLine->
GetEndPoint() == unselectedEnd )
377 foundLine->
MoveEnd( splitDelta );
409 if(
info.attachedLine == bendLine ||
info.attachedLine == foundLine )
411 info.attachedLine = line;
412 info.originalLineStart = line->GetStartPoint();
413 info.originalLineEnd = line->GetEndPoint();
434 line->MoveEnd( splitDelta );
436 line->MoveStart( splitDelta );
441 else if( line->GetLength() == 0 )
451 else if( foundAttachment && line->IsOrthogonal() )
458 unsigned int xMoveBit = splitDelta.
x != 0;
459 unsigned int yMoveBit = splitDelta.
y != 0;
460 int xLength = abs( unselectedEnd.
x - selectedEnd.
x );
461 int yLength = abs( unselectedEnd.
y - selectedEnd.
y );
462 int xMove = ( xLength - ( xBendCount * lineGrid.
x ) )
463 *
sign( selectedEnd.
x - unselectedEnd.
x );
464 int yMove = ( yLength - ( yBendCount * lineGrid.
y ) )
465 *
sign( selectedEnd.
y - unselectedEnd.
y );
487 xBendCount += yMoveBit;
488 yBendCount += xMoveBit;
493 line->MoveEnd(
VECTOR2I( splitDelta.
x ? splitDelta.
x : xMove,
494 splitDelta.
y ? splitDelta.
y : yMove ) );
498 line->MoveStart(
VECTOR2I( splitDelta.
x ? splitDelta.
x : xMove,
499 splitDelta.
y ? splitDelta.
y : yMove ) );
531 else if( !foundAttachment )
534 line->MoveEnd( splitDelta );
536 line->MoveStart( splitDelta );
571 case MOVE: localCommit.
Push(
_(
"Move" ) );
break;
572 case DRAG: localCommit.
Push(
_(
"Drag" ) );
break;
573 case BREAK: localCommit.
Push(
_(
"Break Wire" ) );
break;
574 case SLICE: localCommit.
Push(
_(
"Slice Wire" ) );
break;
602 if( selection.
Empty() )
605 std::vector<SCH_LINE*> lines;
618 lines.push_back(
static_cast<SCH_LINE*
>( item ) );
629 bool useCursorForSingleLine =
false;
631 if( lines.size() == 1 )
632 useCursorForSingleLine =
true;
639 VECTOR2I breakPos = useCursorForSingleLine ? cursorPos : line->GetMidPoint();
646 lwbTool->
BreakSegment( aCommit, line, breakPos, &newLine, screen );
673 bool currentModeIsDragLike = (
m_mode !=
MOVE );
675 bool didAtLeastOneBreak =
false;
691 bool unselect =
false;
695 std::vector<DANGLING_END_ITEM> internalPoints;
698 bool selectionHasSheetPins =
false;
699 bool selectionHasGraphicItems =
false;
700 bool selectionHasNonGraphicItems =
false;
701 bool selectionIsGraphicsOnly =
false;
703 std::unique_ptr<SCH_DRAG_NET_COLLISION_MONITOR> netCollisionMonitor;
709 selectionHasNonGraphicItems, selectionIsGraphicsOnly );
714 if( !selection.
Empty() )
717 netCollisionMonitor = std::make_unique<SCH_DRAG_NET_COLLISION_MONITOR>(
m_frame,
m_view );
718 netCollisionMonitor->Initialize( selection );
721 bool lastCtrlDown =
false;
727 bool pasteHoldingCtrl =
false;
733 pasteHoldingCtrl = wxGetKeyState( WXK_CONTROL );
747 if( selection.
Empty() )
750 bool restore_state =
false;
761 AXIS_LOCK axisLock = AXIS_LOCK::NONE;
762 long lastArrowKeyAction = 0;
767 wxLogTrace(
traceSchMove,
"doMoveSelection: event loop iteration, evt=%s, action=%s",
773 m_frame->GetCanvas()->SetCurrentCursor( currentCursor );
781 if( pasteHoldingCtrl && hasModifierState && !ctrlDown )
782 pasteHoldingCtrl =
false;
786 bool gridSnapDisabled = ctrlDown && !pasteHoldingCtrl;
788 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !gridSnapDisabled );
790 lastCtrlDown = ctrlDown;
820 grid.SetSnap(
false );
826 if( axisLock == AXIS_LOCK::HORIZONTAL )
832 axisLock = AXIS_LOCK::NONE;
838 axisLock = AXIS_LOCK::HORIZONTAL;
843 if( axisLock == AXIS_LOCK::VERTICAL )
849 axisLock = AXIS_LOCK::NONE;
855 axisLock = AXIS_LOCK::VERTICAL;
859 lastArrowKeyAction = action;
867 if( axisLock == AXIS_LOCK::HORIZONTAL )
869 else if( axisLock == AXIS_LOCK::VERTICAL )
881 if( sheet != hoverSheet )
886 m_frame->UpdateItem( hoverSheet,
false );
894 m_frame->UpdateItem( hoverSheet,
false );
900 if( netCollisionMonitor )
901 currentCursor = netCollisionMonitor->AdjustCursor( currentCursor );
913 std::vector<SCH_ITEM*> previewItems;
916 previewItems.push_back(
static_cast<SCH_ITEM*
>( it ) );
919 previewItems.push_back( line );
922 previewItems.push_back( line );
924 std::vector<SCH_JUNCTION*> previewJunctions =
927 if( netCollisionMonitor )
928 netCollisionMonitor->Update( previewJunctions, selection );
931 m_view->AddToPreview( jct,
true );
945 m_frame->GetInfoBar()->Dismiss();
962 case MOVE:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel move." ) );
break;
963 case DRAG:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel drag." ) );
break;
964 case BREAK:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel break." ) );
break;
965 case SLICE:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel slice." ) );
break;
973 restore_state =
true;
983 restore_state =
true;
997 wxLogTrace(
traceSchMove,
"doMoveSelection: handleMoveToolActions returned false, exiting" );
1018 didAtLeastOneBreak =
true;
1057 wxLogTrace(
traceSchMove,
"doMoveSelection: event handled, not passing" );
1066 }
while( ( evt =
Wait() ) );
1070 if( selectionHasSheetPins || ( selectionIsGraphicsOnly && !lastCtrlDown ) )
1071 targetSheet =
nullptr;
1076 m_frame->UpdateItem( hoverSheet,
false );
1082 m_view->Hide( hidden.m_junction,
false );
1115 return !restore_state;
1127 if( aCurrentModeIsDragLike != aWasDragging )
1131 if( sel && !sel->
IsNew() )
1160 if( userSelection.
GetSize() == 1 )
1179 aUnselect = selection.
IsHover();
1188 bool& aHasGraphicItems,
bool& aHasNonGraphicItems,
1189 bool& aIsGraphicsOnly )
1191 aHasSheetPins =
false;
1192 aHasGraphicItems =
false;
1193 aHasNonGraphicItems =
false;
1195 for(
EDA_ITEM* edaItem : aSelection )
1200 aHasSheetPins =
true;
1203 aHasGraphicItems =
true;
1205 aHasNonGraphicItems =
true;
1208 aIsGraphicsOnly = aHasGraphicItems && !aHasNonGraphicItems;
1224 std::vector<SCH_ITEM*> stageTwo;
1226 for(
EDA_ITEM* edaItem : aSelection )
1229 std::vector<VECTOR2I> connections;
1231 switch( item->
Type() )
1237 stageTwo.emplace_back( item );
1241 static_cast<SCH_LINE*
>( item )->GetSelectedPoints( connections );
1248 for(
const VECTOR2I& point : connections )
1256 for(
const VECTOR2I& point : item->GetConnectionPoints() )
1260 for(
EDA_ITEM* item : connectedDragItems )
1268 for(
EDA_ITEM* edaItem : aSelection )
1291 static_cast<SCH_ITEM*
>( item )->GetEndPoints( aInternalPoints );
1293 std::vector<DANGLING_END_ITEM> endPointsByType = aInternalPoints;
1294 std::vector<DANGLING_END_ITEM> endPointsByPos = endPointsByType;
1298 static_cast<SCH_ITEM*
>( item )->UpdateDanglingState( endPointsByType, endPointsByPos );
1303 std::vector<DANGLING_END_ITEM>& aInternalPoints,
1309 bool placingNewItems = sch_item && sch_item->
IsNew();
1318 aInternalPoints.clear();
1325 if( !it->IsSelected() )
1335 aSnapLayer =
grid.GetSelectionGrid( aSelection );
1341 if( schItem->
IsNew() )
1352 enteredGroup->AddItem( schItem );
1369 shape->SetHatchingDirty();
1370 shape->UpdateHatching();
1403 wxASSERT_MSG(
m_anchorPos,
"Should be already set from previous cmd" );
1405 else if( placingNewItems )
1413 bool isPasted =
false;
1419 if( item->GetParent() && item->GetParent()->IsSelected() )
1425 isPasted |= ( item->GetFlags() &
IS_PASTED ) != 0;
1432 aSelection.SetReferencePoint(
m_cursor );
1445 if(
m_frame->GetMoveWarpsCursor() )
1465 bool aHasSheetPins,
bool aIsGraphicsOnly,
bool aCtrlDown )
1488 selBBox.
Merge( schIt->GetBoundingBox() );
1529 if( sheet->
GetPin( pt ) )
1544 bool dropAllowedBySelection = !aHasSheetPins;
1545 bool dropAllowedByModifiers = !aIsGraphicsOnly || aCtrlDown;
1547 if( sheet && !( dropAllowedBySelection && dropAllowedByModifiers ) )
1558 if( !destScreen || destScreen->
GetFileName().IsEmpty() )
1561 std::vector<SCH_SHEET*> movedSheets;
1566 movedSheets.push_back(
static_cast<SCH_SHEET*
>( item ) );
1569 if( movedSheets.empty() )
1574 for(
SCH_SHEET* movedSheet : movedSheets )
1587 SCH_COMMIT* aCommit,
int& aXBendCount,
int& aYBendCount,
1590 wxLogTrace(
traceSchMove,
"performItemMove: delta=(%d,%d), moveOffset=(%d,%d), selection size=%u",
1597 std::vector<VECTOR2I> splitMoves;
1606 splitMoves.emplace_back(
VECTOR2I( aDelta.
x, 0 ) );
1616 splitMoves.emplace_back(
VECTOR2I( 0, aDelta.
y ) );
1622 for(
const VECTOR2I& splitDelta : splitMoves )
1625 if( splitDelta ==
VECTOR2I( 0, 0 ) )
1629 ( aDelta.
y >= 0 ) ) )
1632 if( item->GetParent() && item->GetParent()->IsSelected() )
1636 bool isLineModeConstrained =
false;
1645 if( (
m_mode ==
DRAG ) && isLineModeConstrained && line
1649 orthoLineDrag( aCommit, line, splitDelta, aXBendCount, aYBendCount, aGrid );
1662 if( lineEnd.second && lineEnd.first->HasFlag(
STARTPOINT ) )
1663 lineEnd.first->SetStartPoint(
pin->GetPosition() );
1664 else if( !lineEnd.second && lineEnd.first->HasFlag(
ENDPOINT ) )
1665 lineEnd.first->SetEndPoint(
pin->GetPosition() );
1675 if( !label || !
info.attachedLine )
1678 if(
info.trackMovingEnd )
1680 label->Move( splitDelta );
1685 if(
info.attachedLine->GetLength() > 0
1686 &&
info.attachedLine->HitTest(
info.originalLabelPos, 1 )
1687 &&
info.originalLabelPos != start
1688 &&
info.originalLabelPos !=
end )
1690 info.trackMovingEnd =
false;
1691 label->SetPosition(
info.originalLabelPos );
1692 info.originalLineStart = start;
1710 if( deltaStart == deltaEnd )
1712 label->SetPosition(
info.originalLabelPos + deltaStart );
1717 VECTOR2I fixedEndDelta = startDrags ? deltaEnd : deltaStart;
1719 label->SetPosition(
info.originalLabelPos + fixedEndDelta );
1723 if( !
info.attachedLine->HitTest( label->GetPosition(), 1 ) )
1726 label->SetPosition( seg.
NearestPoint( label->GetPosition() ) );
1730 if( label->GetPosition() == movingEnd )
1731 info.trackMovingEnd =
true;
1750 std::map<SCH_SHEET*, std::vector<SCH_SHEET_PIN*>> groups;
1761 groups[sheet].push_back(
pin );
1765 for(
auto& [sheet, pins] : groups )
1767 if( pins.size() < 2 )
1783 bool sameEdge =
true;
1786 sameEdge &= ( startSide(
pin ) == refStartSide );
1801 pin->SetSide( side );
1804 pin->SetTextY( pos.
y );
1806 pin->SetTextX( pos.
x );
1815 if( lineEnd.second && lineEnd.first->HasFlag(
STARTPOINT ) )
1816 lineEnd.first->SetStartPoint(
pin->GetPosition() );
1817 else if( !lineEnd.second && lineEnd.first->HasFlag(
ENDPOINT ) )
1818 lineEnd.first->SetEndPoint(
pin->GetPosition() );
1826 wxLogTrace(
traceSchMove,
"handleMoveToolActions: received event, action=%s",
1827 aEvent->
Format().c_str() );
1831 wxLogTrace(
traceSchMove,
"handleMoveToolActions: doDelete, exiting move" );
1832 const_cast<TOOL_EVENT*
>( aEvent )->SetPassEvent();
1843 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCW event received, selection size=%u",
1846 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCW RunSynchronousAction completed" );
1848 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCW updateStoredPositions completed" );
1853 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCCW event received, selection size=%u",
1856 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCCW RunSynchronousAction completed" );
1858 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCCW updateStoredPositions completed" );
1917 m_frame->SelectUnit( symbol, unit );
1929 m_frame->SelectBodyStyle( symbol, bodyStyle );
1950 wxLogTrace(
traceSchMove,
"updateStoredPositions: start, selection size=%u",
1978 wxLogTrace(
traceSchMove,
" item[%d] type=%d: stored pos updated (%d,%d) -> (%d,%d)",
1979 itemCount++, (
int) schItem->
Type(), oldPos.
x, oldPos.
y, newPos.
x, newPos.
y );
1989 pin->SetStoredPos( pinNewPos );
1990 wxLogTrace(
traceSchMove,
" sheet pin: stored pos updated (%d,%d) -> (%d,%d)",
1991 pinOldPos.
x, pinOldPos.
y, pinNewPos.
x, pinNewPos.
y );
1996 wxLogTrace(
traceSchMove,
"updateStoredPositions: complete, updated %d items", itemCount );
2007 for(
EDA_ITEM* edaItem : aSelection )
2022 return aHidden.m_junction == jct;
2028 if( !
info.isJunction )
2031 m_view->Hide( jct,
true );
2048 m_view->Hide( hidden.m_junction,
false );
2050 SCH_LINE* line =
dynamic_cast<SCH_LINE*
>(
m_frame->Schematic().ResolveItem( hidden.m_lineId,
nullptr,
true ) );
2057 if( newPos != hidden.m_junction->GetPosition()
2061 aCommit->
Modify( hidden.m_junction, screen );
2062 hidden.m_junction->SetPosition( newPos );
2063 m_frame->UpdateItem( hidden.m_junction,
false,
true );
2070 const std::vector<DANGLING_END_ITEM>& aInternalPoints )
2079 newLine->ClearEditFlags();
2086 oldLine->ClearEditFlags();
2101 sch_item->SetConnectivityDirty(
true );
2115 if(
m_frame->GetScreen()->IsExplicitJunctionNeeded( it.GetPosition() ) )
2125 selectionCopy.
Add( line );
2128 selectionCopy.
Add( line );
2138 if( isDragLike && !isSlice )
2148 item->ClearTempFlags();
2150 for(
EDA_ITEM* item : selectionCopy )
2151 item->ClearTempFlags();
2153 m_frame->Schematic().CleanUp( aCommit );
2157 auto clearChildEditFlags =
2160 aItem->RunOnChildren(
2170 item->ClearEditFlags();
2173 clearChildEditFlags( schItem );
2178 for(
EDA_ITEM* item : selectionCopy )
2180 item->ClearEditFlags();
2183 clearChildEditFlags( schItem );
2205 bbox.
Merge(
static_cast<SCH_ITEM*
>( item )->GetBoundingBox() );
2209 bool overlap =
false;
2214 moved.Move( offset );
2219 if(
moved.Intersects( existing->GetBoundingBox() ) )
2235 m_frame->RemoveFromScreen( schItem, srcScreen );
2238 schItem->
Move( offset );
2241 destScreen->
Append( schItem );
2255 std::set<SCH_ITEM*> danglers;
2257 std::function<void(
SCH_ITEM* )> changeHandler =
2258 [&](
SCH_ITEM* aChangedItem ) ->
void
2262 if( aChangedItem->IsSelected() )
2274 danglers.insert( aChangedItem );
2282 danglers.insert( aChangedItem );
2286 m_frame->GetScreen()->TestDanglingEnds(
nullptr, &changeHandler );
2310 for(
SCH_ITEM* item : itemsOverlapping )
2312 if( item != aOriginalItem && item->
IsConnected( aPoint ) )
2315 foundJunction = item;
2321 if( foundSymbol && foundJunction )
2323 aList.push_back( foundSymbol );
2329 aList.push_back( foundJunction );
2336 if(
test == aOriginalItem || !
test->CanConnect( aOriginalItem ) )
2339 switch(
test->Type() )
2355 if(
test->IsConnected( aPoint ) )
2356 aList.push_back(
test );
2361 if(
static_cast<SCH_LINE*
>(
test )->HitTest( label->GetPosition(), 1 ) )
2362 aList.push_back(
test );
2375 if(
pin->IsConnected( aPoint ) )
2377 if(
pin->IsSelected() )
2380 aList.push_back(
pin );
2390 if(
test->IsConnected( aPoint ) )
2391 aList.push_back(
test );
2406 aList.push_back( label );
2418 if( line->
HitTest( aPoint, 1 ) )
2419 aList.push_back( label );
2435 std::set<SCH_ITEM*> connectableCandidates;
2436 std::vector<SCH_ITEM*> itemsConnectable;
2437 bool ptHasUnselectedJunction =
false;
2440 connectableCandidates.insert( item );
2447 connectableCandidates.insert( item );
2455 bool isBusLabel =
false;
2466 || selected->GetLayer() ==
LAYER_BUS || isBusLabel )
2486 else if( fixedLine )
2499 auto makeNewJunction =
2516 for(
SCH_ITEM* item : connectableCandidates )
2529 if( !
pin->IsSelected()
2530 &&
pin->GetPosition() == aPoint
2531 &&
pin->CanConnect( aSelectedItem ) )
2533 itemsConnectable.push_back(
pin );
2544 if( item == aSelectedItem
2545 || ( item->Type() !=
SCH_LINE_T && ( item->IsSelected() || item->HasSelectedAncestorGroup() ) )
2551 itemsConnectable.push_back( item );
2554 for(
SCH_ITEM* item : itemsConnectable )
2556 if( item->Type() ==
SCH_JUNCTION_T && item->IsConnected( aPoint ) && !item->IsSelected() )
2558 ptHasUnselectedJunction =
true;
2575 if( ptHasUnselectedJunction )
2590 if( !lineInSelectedGroup )
2594 || lineInSelectedGroup )
2601 aList.push_back( line );
2606 if( !lineInSelectedGroup )
2610 || lineInSelectedGroup )
2617 aList.push_back( line );
2622 switch( aSelectedItem->
Type() )
2636 newWire = makeNewWire( aCommit, line, aSelectedItem, aPoint, aPoint );
2639 aList.push_back( newWire );
2649 makeNewWire( aCommit, line, line, aPoint, oldEnd );
2650 makeNewJunction( aCommit, line, aPoint );
2682 aList.push_back( label );
2685 info.attachedLine = line;
2699 if(
pin->IsConnected( aPoint ) )
2710 newWire = makeNewWire( aCommit,
pin, aSelectedItem, aPoint, aPoint );
2712 aList.push_back( newWire );
2721 if(
test->IsConnected( aPoint ) && !newWire )
2725 newWire = makeNewWire( aCommit,
test, aSelectedItem, aPoint, aPoint );
2727 aList.push_back( newWire );
2736 aList.push_back(
test );
2771 aList.push_back( label );
2776 info.attachedLine = line;
2785 else if(
test->IsConnected( aPoint ) && !newWire )
2789 newWire = makeNewWire( aCommit,
test, aSelectedItem, aPoint, aPoint );
2791 aList.push_back( newWire );
2817 if( line->
HitTest( point, 1 ) )
2820 aList.push_back(
test );
2823 std::vector<VECTOR2I> ends =
test->GetConnectionPoints();
2826 if( ends[0] == point )
2850 static int moveCallCount = 0;
2851 wxLogTrace(
traceSchMove,
"moveItem[%d]: type=%d, delta=(%d,%d)",
2852 ++moveCallCount, aItem->
Type(), aDelta.
x, aDelta.
y );
2854 switch( aItem->
Type() )
2860 static_cast<SCH_LINE*
>( aItem )->Move( aDelta );
2905 label->
Move( aDelta );
2911 static_cast<SCH_ITEM*
>( aItem )->Move( aDelta );
2947 if( !it->IsSelected() )
2950 if( !selection.
IsHover() && it->IsSelected() )
2953 it->SetStoredPos( it->GetPosition() );
2958 pin->SetStoredPos(
pin->GetPosition() );
2980 std::vector<EDA_ITEM*> items( selection.
begin(), selection.
end() );
2990 m_frame->Schematic().CleanUp( &commit );
2991 commit.
Push(
_(
"Align Items to Grid" ) );
constexpr EDA_IU_SCALE schIUScale
static TOOL_ACTION duplicate
static TOOL_ACTION doDelete
static TOOL_ACTION cursorClick
static TOOL_ACTION increment
static TOOL_ACTION selectionClear
Clear the current selection.
static TOOL_ACTION refreshPreview
constexpr const Vec & GetPosition() const
constexpr coord_type GetY() const
constexpr size_type GetWidth() const
constexpr coord_type GetX() const
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
constexpr size_type GetHeight() const
constexpr bool Contains(const Vec &aPoint) const
COMMIT & Added(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Notify observers that aItem has been added.
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
COMMIT & Removed(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
static void sort_dangling_end_items(std::vector< DANGLING_END_ITEM > &aItemListByType, std::vector< DANGLING_END_ITEM > &aItemListByPos)
Both contain the same information.
Helper class used to store the state of schematic items that can be connected to other schematic item...
A base class for most all the KiCad significant classes used in schematics and boards.
virtual VECTOR2I GetPosition() const
virtual void ClearEditFlags()
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
void SetFlags(EDA_ITEM_FLAGS aMask)
virtual EDA_GROUP * GetParentGroup() const
KICAD_T Type() const
Returns the type of object.
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
EDA_ITEM * GetParent() const
bool HasSelectedAncestorGroup() const
bool HasFlag(EDA_ITEM_FLAGS aFlag) const
virtual VECTOR2I GetTextPos() const
Implement an R-tree for fast spatial and type indexing of schematic items.
EE_TYPE Overlapping(const BOX2I &aRect) const
static const TOOL_EVENT SelectedItemsMoved
Used to inform tools that the selection should temporarily be non-editable.
An interface for classes handling user events controlling the view behavior such as zooming,...
virtual void ForceCursorPosition(bool aEnabled, const VECTOR2D &aPosition=VECTOR2D(0, 0))
Place the cursor immediately at a given point.
virtual void ShowCursor(bool aEnabled)
Enable or disables display of cursor.
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.
const VC_SETTINGS & GetSettings() const
Return the current VIEW_CONTROLS settings.
static TOOL_ACTION rotateCCW
static TOOL_ACTION breakWire
static TOOL_ACTION toText
static TOOL_ACTION restartMove
static TOOL_ACTION toHLabel
static TOOL_ACTION rotateCW
static TOOL_ACTION toLabel
static TOOL_ACTION alignToGrid
static TOOL_ACTION toDLabel
static TOOL_ACTION toTextBox
static TOOL_ACTION highlightNet
static TOOL_ACTION repeatDrawItem
static TOOL_ACTION toGLabel
static TOOL_ACTION selectOnPCB
static const std::vector< KICAD_T > MovableItems
COMMIT & Stage(EDA_ITEM *aItem, CHANGE_TYPE aChangeType, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE) override
Add a change of the item aItem of type aChangeType to the change list.
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.
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
void Clone(const SCH_CONNECTION &aOther)
Copies connectivity information (but not parent) from another connection.
static bool IsBusLabel(const wxString &aLabel)
Test if aLabel has a bus notation.
Schematic editor (Eeschema) main window.
SCH_SHEET_PATH & GetCurrentSheet() const
A set of SCH_ITEMs (i.e., without duplicates).
Base class for any item which can be embedded within the SCHEMATIC container class,...
void SetStoredPos(const VECTOR2I &aPos)
virtual bool CanConnect(const SCH_ITEM *aItem) const
virtual void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction, RECURSE_MODE aMode)
SCH_CONNECTION * InitializeConnection(const SCH_SHEET_PATH &aPath, CONNECTION_GRAPH *aGraph)
Create a new connection object associated with this object.
virtual void Move(const VECTOR2I &aMoveVector)
Move the item by aMoveVector to a new position.
void SetLayer(SCH_LAYER_ID aLayer)
void SetConnectivityDirty(bool aDirty=true)
void SetFieldsAutoplaced(AUTOPLACE_ALGO aAlgo)
bool IsConnected(const VECTOR2I &aPoint) const
Test the item to see if it is connected to aPoint.
virtual bool IsMovableFromAnchorPoint() const
Check if object is movable from the anchor point.
SCH_CONNECTION * Connection(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve the connection associated with this object in the given sheet.
VECTOR2I & GetStoredPos()
bool IsGroupableType() const
virtual std::vector< VECTOR2I > GetConnectionPoints() const
Add all the connection points for this item to aPoints.
void SetLastResolvedState(const SCH_ITEM *aItem) override
void Move(const VECTOR2I &aMoveVector) override
Move the item by aMoveVector to a new position.
bool CanConnect(const SCH_ITEM *aItem) const override
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.
void StoreAngle()
Save the current line angle.
std::vector< VECTOR2I > GetConnectionPoints() const override
Add all the connection points for this item to aPoints.
bool IsStartDangling() const
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
EDA_ANGLE Angle() const
Get the angle between the start and end lines.
VECTOR2I GetEndPoint() const
VECTOR2I GetStartPoint() const
bool IsEndDangling() const
void MoveEnd(const VECTOR2I &aMoveVector)
void SetLastResolvedState(const SCH_ITEM *aItem) override
void MoveStart(const VECTOR2I &aMoveVector)
void SetEndPoint(const VECTOR2I &aPosition)
bool IsDangling() const override
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
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.
const wxString & GetFileName() const
bool IsExplicitJunctionNeeded(const VECTOR2I &aPosition) const
Indicate that a junction dot is necessary at the given location, and does not yet exist.
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
bool TestForRecursion(const SCH_SHEET_LIST &aSrcSheetHierarchy, const wxString &aDestFileName)
Test every SCH_SHEET_PATH in this SCH_SHEET_LIST to verify if adding the sheets stored in aSrcSheetHi...
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
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.
bool IsTopLevelSheet() const
Check if this sheet is a top-level sheet.
SCH_SHEET_PIN * GetPin(const VECTOR2I &aPosition)
Return the sheet pin item found at aPosition in the sheet.
SCH_SCREEN * GetScreen() const
VECTOR2I GetPosition() const override
const BOX2I GetBodyBoundingBox() const
Return a bounding box for the sheet body but not the fields.
std::vector< SCH_SHEET_PIN * > & GetPins()
VECTOR2I GetPosition() const override
const VECTOR2I NearestPoint(const VECTOR2I &aP) const
Compute a point on the segment (this) that is closest to point aP.
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.
VECTOR2I GetReferencePoint() const
virtual unsigned int GetSize() const override
Return the number of stored items.
int Size() const
Returns the number of selected parts.
void SetReferencePoint(const VECTOR2I &aP)
bool Empty() const
Checks if there is anything selected.
std::vector< EDA_ITEM * > GetItemsSortedByTypeAndXY(bool leftBeforeRight=true, bool topBeforeBottom=true) const
Returns a copy of this selection of items sorted by their X then Y position.
bool HasReferencePoint() const
const TRANSFORM & GetTransform() const
@ CHT_DONE
Flag to indicate the change is already applied.
static constexpr EDA_ANGLE ANGLE_90
#define IS_PASTED
Modifier on IS_NEW which indicates it came from clipboard.
#define IS_CHANGED
Item was edited, and modified.
#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 SELECTED_BY_DRAG
Item was algorithmically selected as a dragged item.
#define IS_BROKEN
Is a segment just broken by BreakSegment.
#define STRUCT_DELETED
flag indication structures to be erased
#define ENDPOINT
ends. (Used to support dragging.)
#define IS_MOVING
Item being moved.
#define STARTPOINT
When a line is selected, these flags indicate which.
@ ID_POPUP_SCH_SELECT_UNIT
@ ID_POPUP_SCH_SELECT_BODY_STYLE
@ ID_POPUP_SCH_SELECT_BODY_STYLE_END
@ ID_POPUP_SCH_SELECT_UNIT_END
const wxChar *const traceSchMove
Flag to watch how schematic move tool actions are handled.
std::vector< SCH_JUNCTION * > PreviewJunctions(const class SCH_SCREEN *aScreen, const std::vector< class SCH_ITEM * > &aItems)
Determine the points where explicit junctions would be required if the given temporary items were com...
POINT_INFO AnalyzePoint(const EE_RTREE &aItem, const VECTOR2I &aPosition, bool aBreakCrossings)
Check a tree of items for a confluence at a given point and work out what kind of junction it is,...
@ REPAINT
Item needs to be redrawn.
bool signbit(T v)
Integral version of std::signbit that works all compilers.
@ VERTICAL
A segment (or two points) is vertical.
@ HORIZONTAL
A segment (or two points) is horizontal.
Class to handle a set of SCH_ITEMs.
void MoveSchematicItem(EDA_ITEM *aItem, const VECTOR2I &aDelta)
Move a schematic item by a delta.
void AlignSchematicItemsToGrid(SCH_SCREEN *aScreen, const std::vector< EDA_ITEM * > &aItems, EE_GRID_HELPER &aGrid, GRID_HELPER_GRIDS aSelectionGrid, const SCH_ALIGNMENT_CALLBACKS &aCallbacks)
Align a set of schematic items to the grid.
std::vector< EDA_ITEM * > EDA_ITEMS
SHEET_SIDE
Define the edge of the sheet that the sheet pin is positioned.
T * GetAppSettings(const char *aFilename)
The EE_TYPE struct provides a type-specific auto-range iterator to the RTree.
A selection of information about a point in the schematic that might be eligible for turning into a j...
VECTOR2D m_lastKeyboardCursorPosition
Position of the above event.
bool m_lastKeyboardCursorPositionValid
Is last cursor motion event coming from keyboard arrow cursor motion action.
long m_lastKeyboardCursorCommand
ACTIONS::CURSOR_UP, ACTIONS::CURSOR_DOWN, etc.
Callbacks for alignment operations.
std::function< void(SCH_ITEM *aItem, const VECTOR2I &aPoint, EDA_ITEMS &aList)> m_getConnectedDragItems
Callback to get items connected to a given item at a specific point.
std::function< void(EDA_ITEM *aItem, const VECTOR2I &aDelta)> m_doMoveItem
Callback to move an item by a delta.
std::function< void(EDA_ITEM *aItem)> m_updateItem
Optional callback to update an item's display after modification.
KIBIS top(path, &reporter)
wxLogTrace helper definitions.
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
constexpr int sign(T val)
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D