66#define QUIET_MODE true
71 switch( aItem->
Type() )
79 return static_cast<const SCH_LINE*
>( aItem )->IsGraphicLine();
88 if( !aNewLine || !aSource || !aFrame )
99 if( !sourceConnection )
107 newConnection->
Clone( *sourceConnection );
197 bool foundAttachment =
false;
198 bool foundJunction =
false;
199 bool foundPin =
false;
204 foundAttachment =
true;
208 switch( cItem->Type() )
224 if( !foundLine && cLine->
GetLength() == 0 )
230 foundJunction =
true;
240 if( pair.first->IsConnected( selectedEnd ) )
260 bool preferOriginalLine =
false;
264 && line->GetLength() == 0
265 &&
EDA_ANGLE( splitDelta ).IsParallelTo( line->GetStoredAngle() ) )
267 preferOriginalLine =
true;
273 else if( !foundLine && foundJunction && !foundPin )
276 foundLine =
new SCH_LINE( unselectedEnd, line->GetLayer() );
293 if( foundLine && !preferOriginalLine )
314 else if( foundLine->
GetEndPoint() == unselectedEnd )
315 foundLine->
MoveEnd( splitDelta );
347 if(
info.attachedLine == bendLine ||
info.attachedLine == foundLine )
349 info.attachedLine = line;
350 info.originalLineStart = line->GetStartPoint();
351 info.originalLineEnd = line->GetEndPoint();
372 line->MoveEnd( splitDelta );
374 line->MoveStart( splitDelta );
379 else if( line->GetLength() == 0 )
389 else if( foundAttachment && line->IsOrthogonal() )
396 unsigned int xMoveBit = splitDelta.
x != 0;
397 unsigned int yMoveBit = splitDelta.
y != 0;
398 int xLength = abs( unselectedEnd.
x - selectedEnd.
x );
399 int yLength = abs( unselectedEnd.
y - selectedEnd.
y );
400 int xMove = ( xLength - ( xBendCount * lineGrid.
x ) )
401 *
sign( selectedEnd.
x - unselectedEnd.
x );
402 int yMove = ( yLength - ( yBendCount * lineGrid.
y ) )
403 *
sign( selectedEnd.
y - unselectedEnd.
y );
425 xBendCount += yMoveBit;
426 yBendCount += xMoveBit;
431 line->MoveEnd(
VECTOR2I( splitDelta.
x ? splitDelta.
x : xMove,
432 splitDelta.
y ? splitDelta.
y : yMove ) );
436 line->MoveStart(
VECTOR2I( splitDelta.
x ? splitDelta.
x : xMove,
437 splitDelta.
y ? splitDelta.
y : yMove ) );
469 else if( !foundAttachment )
472 line->MoveEnd( splitDelta );
474 line->MoveStart( splitDelta );
509 case MOVE: localCommit.
Push(
_(
"Move" ) );
break;
510 case DRAG: localCommit.
Push(
_(
"Drag" ) );
break;
511 case BREAK: localCommit.
Push(
_(
"Break Wire" ) );
break;
512 case SLICE: localCommit.
Push(
_(
"Slice Wire" ) );
break;
540 if( selection.
Empty() )
543 std::vector<SCH_LINE*> lines;
556 lines.push_back(
static_cast<SCH_LINE*
>( item ) );
567 bool useCursorForSingleLine =
false;
569 if( lines.size() == 1 )
570 useCursorForSingleLine =
true;
577 VECTOR2I breakPos = useCursorForSingleLine ? cursorPos : line->GetMidPoint();
584 lwbTool->
BreakSegment( aCommit, line, breakPos, &newLine, screen );
611 bool currentModeIsDragLike = (
m_mode !=
MOVE );
613 bool didAtLeastOneBreak =
false;
629 bool unselect =
false;
633 std::vector<DANGLING_END_ITEM> internalPoints;
636 bool selectionHasSheetPins =
false;
637 bool selectionHasGraphicItems =
false;
638 bool selectionHasNonGraphicItems =
false;
639 bool selectionIsGraphicsOnly =
false;
641 std::unique_ptr<SCH_DRAG_NET_COLLISION_MONITOR> netCollisionMonitor;
647 selectionHasNonGraphicItems, selectionIsGraphicsOnly );
652 if( !selection.
Empty() )
655 netCollisionMonitor = std::make_unique<SCH_DRAG_NET_COLLISION_MONITOR>(
m_frame,
m_view );
656 netCollisionMonitor->Initialize( selection );
659 bool lastCtrlDown =
false;
668 if( selection.
Empty() )
676 bool restore_state =
false;
687 AXIS_LOCK axisLock = AXIS_LOCK::NONE;
688 long lastArrowKeyAction = 0;
693 wxLogTrace(
traceSchMove,
"doMoveSelection: event loop iteration, evt=%s, action=%s",
699 m_frame->GetCanvas()->SetCurrentCursor( currentCursor );
704 lastCtrlDown = ctrlDown;
734 grid.SetSnap(
false );
740 if( axisLock == AXIS_LOCK::HORIZONTAL )
746 axisLock = AXIS_LOCK::NONE;
752 axisLock = AXIS_LOCK::HORIZONTAL;
757 if( axisLock == AXIS_LOCK::VERTICAL )
763 axisLock = AXIS_LOCK::NONE;
769 axisLock = AXIS_LOCK::VERTICAL;
773 lastArrowKeyAction = action;
780 if( axisLock == AXIS_LOCK::HORIZONTAL )
782 else if( axisLock == AXIS_LOCK::VERTICAL )
787 selectionIsGraphicsOnly, ctrlDown );
789 if( sheet != hoverSheet )
796 m_frame->UpdateItem( hoverSheet,
false );
802 if( netCollisionMonitor )
803 currentCursor = netCollisionMonitor->AdjustCursor( currentCursor );
815 std::vector<SCH_ITEM*> previewItems;
818 previewItems.push_back(
static_cast<SCH_ITEM*
>( it ) );
821 previewItems.push_back( line );
824 previewItems.push_back( line );
826 std::vector<SCH_JUNCTION*> previewJunctions =
829 if( netCollisionMonitor )
830 netCollisionMonitor->Update( previewJunctions, selection );
833 m_view->AddToPreview( jct,
true );
847 m_frame->GetInfoBar()->Dismiss();
864 case MOVE:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel move." ) );
break;
865 case DRAG:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel drag." ) );
break;
866 case BREAK:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel break." ) );
break;
867 case SLICE:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel slice." ) );
break;
875 restore_state =
true;
885 restore_state =
true;
899 wxLogTrace(
traceSchMove,
"doMoveSelection: handleMoveToolActions returned false, exiting" );
918 didAtLeastOneBreak =
true;
957 wxLogTrace(
traceSchMove,
"doMoveSelection: event handled, not passing" );
966 }
while( ( evt =
Wait() ) );
970 if( selectionHasSheetPins || ( selectionIsGraphicsOnly && !lastCtrlDown ) )
971 targetSheet =
nullptr;
976 m_frame->UpdateItem( hoverSheet,
false );
1013 return !restore_state;
1025 if( aCurrentModeIsDragLike != aWasDragging )
1029 if( sel && !sel->
IsNew() )
1058 if( userSelection.
GetSize() == 1 )
1077 aUnselect = selection.
IsHover();
1086 bool& aHasGraphicItems,
bool& aHasNonGraphicItems,
1087 bool& aIsGraphicsOnly )
1089 aHasSheetPins =
false;
1090 aHasGraphicItems =
false;
1091 aHasNonGraphicItems =
false;
1093 for(
EDA_ITEM* edaItem : aSelection )
1098 aHasSheetPins =
true;
1101 aHasGraphicItems =
true;
1103 aHasNonGraphicItems =
true;
1106 aIsGraphicsOnly = aHasGraphicItems && !aHasNonGraphicItems;
1122 std::vector<SCH_ITEM*> stageTwo;
1124 for(
EDA_ITEM* edaItem : aSelection )
1127 std::vector<VECTOR2I> connections;
1129 switch( item->
Type() )
1135 stageTwo.emplace_back( item );
1139 static_cast<SCH_LINE*
>( item )->GetSelectedPoints( connections );
1146 for(
const VECTOR2I& point : connections )
1154 for(
const VECTOR2I& point : item->GetConnectionPoints() )
1158 for(
EDA_ITEM* item : connectedDragItems )
1166 for(
EDA_ITEM* edaItem : aSelection )
1189 static_cast<SCH_ITEM*
>( item )->GetEndPoints( aInternalPoints );
1191 std::vector<DANGLING_END_ITEM> endPointsByType = aInternalPoints;
1192 std::vector<DANGLING_END_ITEM> endPointsByPos = endPointsByType;
1196 static_cast<SCH_ITEM*
>( item )->UpdateDanglingState( endPointsByType, endPointsByPos );
1201 std::vector<DANGLING_END_ITEM>& aInternalPoints,
1207 bool placingNewItems = sch_item && sch_item->
IsNew();
1215 aInternalPoints.clear();
1222 if( !it->IsSelected() )
1235 for(
EDA_ITEM* edaItem : aSelection )
1252 if( !
info.isJunction )
1266 aSnapLayer =
grid.GetSelectionGrid( aSelection );
1272 if( schItem->
IsNew() )
1283 enteredGroup->AddItem( schItem );
1300 shape->SetHatchingDirty();
1301 shape->UpdateHatching();
1328 wxASSERT_MSG(
m_anchorPos,
"Should be already set from previous cmd" );
1330 else if( placingNewItems )
1338 bool isPasted =
false;
1344 if( item->GetParent() && item->GetParent()->IsSelected() )
1350 isPasted |= ( item->GetFlags() &
IS_PASTED ) != 0;
1357 aSelection.SetReferencePoint(
m_cursor );
1370 if(
m_frame->GetMoveWarpsCursor() )
1390 bool aHasSheetPins,
bool aIsGraphicsOnly,
bool aCtrlDown )
1413 selBBox.
Merge( schIt->GetBoundingBox() );
1454 if( sheet->
GetPin( pt ) )
1466 bool dropAllowedBySelection = !aHasSheetPins;
1467 bool dropAllowedByModifiers = !aIsGraphicsOnly || aCtrlDown;
1469 if( sheet && !( dropAllowedBySelection && dropAllowedByModifiers ) )
1477 SCH_COMMIT* aCommit,
int& aXBendCount,
int& aYBendCount,
1480 wxLogTrace(
traceSchMove,
"performItemMove: delta=(%d,%d), moveOffset=(%d,%d), selection size=%u",
1487 std::vector<VECTOR2I> splitMoves;
1496 splitMoves.emplace_back(
VECTOR2I( aDelta.
x, 0 ) );
1506 splitMoves.emplace_back(
VECTOR2I( 0, aDelta.
y ) );
1512 for(
const VECTOR2I& splitDelta : splitMoves )
1515 if( splitDelta ==
VECTOR2I( 0, 0 ) )
1519 ( aDelta.
y >= 0 ) ) )
1522 if( item->GetParent() && item->GetParent()->IsSelected() )
1526 bool isLineModeConstrained =
false;
1535 if( (
m_mode ==
DRAG ) && isLineModeConstrained && line
1539 orthoLineDrag( aCommit, line, splitDelta, aXBendCount, aYBendCount, aGrid );
1552 if( lineEnd.second && lineEnd.first->HasFlag(
STARTPOINT ) )
1553 lineEnd.first->SetStartPoint(
pin->GetPosition() );
1554 else if( !lineEnd.second && lineEnd.first->HasFlag(
ENDPOINT ) )
1555 lineEnd.first->SetEndPoint(
pin->GetPosition() );
1565 if( !label || !
info.attachedLine )
1568 if(
info.trackMovingEnd )
1570 label->Move( splitDelta );
1575 if(
info.attachedLine->GetLength() > 0
1576 &&
info.attachedLine->HitTest(
info.originalLabelPos, 1 )
1577 &&
info.originalLabelPos != start
1578 &&
info.originalLabelPos !=
end )
1580 info.trackMovingEnd =
false;
1581 label->SetPosition(
info.originalLabelPos );
1582 info.originalLineStart = start;
1600 if( deltaStart == deltaEnd )
1602 label->SetPosition(
info.originalLabelPos + deltaStart );
1607 VECTOR2I fixedEndDelta = startDrags ? deltaEnd : deltaStart;
1609 label->SetPosition(
info.originalLabelPos + fixedEndDelta );
1613 if( !
info.attachedLine->HitTest( label->GetPosition(), 1 ) )
1616 label->SetPosition( seg.
NearestPoint( label->GetPosition() ) );
1620 if( label->GetPosition() == movingEnd )
1621 info.trackMovingEnd =
true;
1637 wxLogTrace(
traceSchMove,
"handleMoveToolActions: received event, action=%s",
1638 aEvent->
Format().c_str() );
1642 wxLogTrace(
traceSchMove,
"handleMoveToolActions: doDelete, exiting move" );
1643 const_cast<TOOL_EVENT*
>( aEvent )->SetPassEvent();
1654 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCW event received, selection size=%u",
1657 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCW RunSynchronousAction completed" );
1659 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCW updateStoredPositions completed" );
1664 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCCW event received, selection size=%u",
1667 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCCW RunSynchronousAction completed" );
1669 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCCW updateStoredPositions completed" );
1728 m_frame->SelectUnit( symbol, unit );
1740 m_frame->SelectBodyStyle( symbol, bodyStyle );
1761 wxLogTrace(
traceSchMove,
"updateStoredPositions: start, selection size=%u",
1780 wxLogTrace(
traceSchMove,
" item[%d] type=%d: stored pos updated (%d,%d) -> (%d,%d)",
1781 itemCount++, (
int) schItem->
Type(), oldPos.
x, oldPos.
y, newPos.
x, newPos.
y );
1791 pin->SetStoredPos( pinNewPos );
1792 wxLogTrace(
traceSchMove,
" sheet pin: stored pos updated (%d,%d) -> (%d,%d)",
1793 pinOldPos.
x, pinOldPos.
y, pinNewPos.
x, pinNewPos.
y );
1798 wxLogTrace(
traceSchMove,
"updateStoredPositions: complete, updated %d items", itemCount );
1803 const std::vector<DANGLING_END_ITEM>& aInternalPoints )
1812 newLine->ClearEditFlags();
1819 oldLine->ClearEditFlags();
1834 sch_item->SetConnectivityDirty(
true );
1848 if(
m_frame->GetScreen()->IsExplicitJunctionNeeded( it.GetPosition() ) )
1858 selectionCopy.
Add( line );
1861 selectionCopy.
Add( line );
1868 if( isDragLike && !isSlice )
1878 item->ClearTempFlags();
1880 for(
EDA_ITEM* item : selectionCopy )
1881 item->ClearTempFlags();
1883 m_frame->Schematic().CleanUp( aCommit );
1887 auto clearChildEditFlags =
1890 aItem->RunOnChildren(
1900 item->ClearEditFlags();
1903 clearChildEditFlags( schItem );
1908 for(
EDA_ITEM* item : selectionCopy )
1910 item->ClearEditFlags();
1913 clearChildEditFlags( schItem );
1935 bbox.
Merge(
static_cast<SCH_ITEM*
>( item )->GetBoundingBox() );
1939 bool overlap =
false;
1944 moved.Move( offset );
1949 if(
moved.Intersects( existing->GetBoundingBox() ) )
1965 m_frame->RemoveFromScreen( schItem, srcScreen );
1968 schItem->
Move( offset );
1971 destScreen->
Append( schItem );
1985 std::set<SCH_ITEM*> danglers;
1987 std::function<void(
SCH_ITEM* )> changeHandler =
1988 [&](
SCH_ITEM* aChangedItem ) ->
void
1992 if( aChangedItem->IsSelected() )
2004 danglers.insert( aChangedItem );
2012 danglers.insert( aChangedItem );
2016 m_frame->GetScreen()->TestDanglingEnds(
nullptr, &changeHandler );
2040 for(
SCH_ITEM* item : itemsOverlapping )
2042 if( item != aOriginalItem && item->
IsConnected( aPoint ) )
2045 foundJunction = item;
2051 if( foundSymbol && foundJunction )
2053 aList.push_back( foundSymbol );
2059 aList.push_back( foundJunction );
2066 if(
test == aOriginalItem || !
test->CanConnect( aOriginalItem ) )
2069 switch(
test->Type() )
2085 if(
test->IsConnected( aPoint ) )
2086 aList.push_back(
test );
2091 if(
static_cast<SCH_LINE*
>(
test )->HitTest( label->GetPosition(), 1 ) )
2092 aList.push_back(
test );
2105 if(
pin->IsConnected( aPoint ) )
2107 if(
pin->IsSelected() )
2110 aList.push_back(
pin );
2120 if(
test->IsConnected( aPoint ) )
2121 aList.push_back(
test );
2136 aList.push_back( label );
2148 if( line->
HitTest( aPoint, 1 ) )
2149 aList.push_back( label );
2165 std::set<SCH_ITEM*> connectableCandidates;
2166 std::vector<SCH_ITEM*> itemsConnectable;
2167 bool ptHasUnselectedJunction =
false;
2170 connectableCandidates.insert( item );
2177 connectableCandidates.insert( item );
2185 bool isBusLabel =
false;
2196 || selected->GetLayer() ==
LAYER_BUS || isBusLabel )
2216 else if( fixedLine )
2229 auto makeNewJunction =
2246 for(
SCH_ITEM* item : connectableCandidates )
2254 if( !
pin->IsSelected()
2255 &&
pin->GetPosition() == aPoint
2256 &&
pin->CanConnect( aSelectedItem ) )
2258 itemsConnectable.push_back(
pin );
2267 if( item == aSelectedItem
2268 || ( item->Type() !=
SCH_LINE_T && item->IsSelected() )
2274 itemsConnectable.push_back( item );
2277 for(
SCH_ITEM* item : itemsConnectable )
2279 if( item->Type() ==
SCH_JUNCTION_T && item->IsConnected( aPoint ) && !item->IsSelected() )
2281 ptHasUnselectedJunction =
true;
2298 if( ptHasUnselectedJunction )
2318 aList.push_back( line );
2332 aList.push_back( line );
2337 switch( aSelectedItem->
Type() )
2351 newWire = makeNewWire( aCommit, line, aSelectedItem, aPoint, aPoint );
2354 aList.push_back( newWire );
2364 makeNewWire( aCommit, line, line, aPoint, oldEnd );
2365 makeNewJunction( aCommit, line, aPoint );
2397 aList.push_back( label );
2400 info.attachedLine = line;
2414 if(
pin->IsConnected( aPoint ) )
2425 newWire = makeNewWire( aCommit,
pin, aSelectedItem, aPoint, aPoint );
2427 aList.push_back( newWire );
2436 if(
test->IsConnected( aPoint ) && !newWire )
2440 newWire = makeNewWire( aCommit,
test, aSelectedItem, aPoint, aPoint );
2442 aList.push_back( newWire );
2451 aList.push_back(
test );
2486 aList.push_back( label );
2491 info.attachedLine = line;
2500 else if(
test->IsConnected( aPoint ) && !newWire )
2504 newWire = makeNewWire( aCommit,
test, aSelectedItem, aPoint, aPoint );
2506 aList.push_back( newWire );
2532 if( line->
HitTest( point, 1 ) )
2535 aList.push_back(
test );
2538 std::vector<VECTOR2I> ends =
test->GetConnectionPoints();
2541 if( ends[0] == point )
2565 static int moveCallCount = 0;
2566 wxLogTrace(
traceSchMove,
"moveItem[%d]: type=%d, delta=(%d,%d)",
2567 ++moveCallCount, aItem->
Type(), aDelta.
x, aDelta.
y );
2569 switch( aItem->
Type() )
2575 static_cast<SCH_LINE*
>( aItem )->Move( aDelta );
2620 label->
Move( aDelta );
2626 static_cast<SCH_ITEM*
>( aItem )->Move( aDelta );
2662 if( !it->IsSelected() )
2665 if( !selection.
IsHover() && it->IsSelected() )
2668 it->SetStoredPos( it->GetPosition() );
2673 pin->SetStoredPos(
pin->GetPosition() );
2693 std::vector<EDA_ITEM*> items( selection.
begin(), selection.
end() );
2702 m_frame->Schematic().CleanUp( &commit );
2703 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 HasFlag(EDA_ITEM_FLAGS aFlag) const
const 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)
EE_RTREE & Items()
Get the full RTree, usually for iterating.
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 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
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)
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.
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
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.
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