62#define QUIET_MODE true
67 switch( aItem->
Type() )
75 return static_cast<const SCH_LINE*
>( aItem )->IsGraphicLine();
84 if( !aNewLine || !aSource || !aFrame )
95 if( !sourceConnection )
103 newConnection->
Clone( *sourceConnection );
193 bool foundAttachment =
false;
194 bool foundJunction =
false;
195 bool foundPin =
false;
200 foundAttachment =
true;
204 switch( cItem->Type() )
220 if( !foundLine && cLine->
GetLength() == 0 )
226 foundJunction =
true;
236 if( pair.first->IsConnected( selectedEnd ) )
256 bool preferOriginalLine =
false;
260 && line->GetLength() == 0
261 &&
EDA_ANGLE( splitDelta ).IsParallelTo( line->GetStoredAngle() ) )
263 preferOriginalLine =
true;
269 else if( !foundLine && foundJunction && !foundPin )
272 foundLine =
new SCH_LINE( unselectedEnd, line->GetLayer() );
289 if( foundLine && !preferOriginalLine )
310 else if( foundLine->
GetEndPoint() == unselectedEnd )
311 foundLine->
MoveEnd( splitDelta );
343 if(
info.attachedLine == bendLine ||
info.attachedLine == foundLine )
345 info.attachedLine = line;
346 info.originalLineStart = line->GetStartPoint();
347 info.originalLineEnd = line->GetEndPoint();
368 line->MoveEnd( splitDelta );
370 line->MoveStart( splitDelta );
375 else if( line->GetLength() == 0 )
385 else if( foundAttachment && line->IsOrthogonal() )
392 unsigned int xMoveBit = splitDelta.
x != 0;
393 unsigned int yMoveBit = splitDelta.
y != 0;
394 int xLength = abs( unselectedEnd.
x - selectedEnd.
x );
395 int yLength = abs( unselectedEnd.
y - selectedEnd.
y );
396 int xMove = ( xLength - ( xBendCount * lineGrid.
x ) )
397 *
sign( selectedEnd.
x - unselectedEnd.
x );
398 int yMove = ( yLength - ( yBendCount * lineGrid.
y ) )
399 *
sign( selectedEnd.
y - unselectedEnd.
y );
421 xBendCount += yMoveBit;
422 yBendCount += xMoveBit;
427 line->MoveEnd(
VECTOR2I( splitDelta.
x ? splitDelta.
x : xMove,
428 splitDelta.
y ? splitDelta.
y : yMove ) );
432 line->MoveStart(
VECTOR2I( splitDelta.
x ? splitDelta.
x : xMove,
433 splitDelta.
y ? splitDelta.
y : yMove ) );
465 else if( !foundAttachment )
468 line->MoveEnd( splitDelta );
470 line->MoveStart( splitDelta );
505 case MOVE: localCommit.
Push(
_(
"Move" ) );
break;
506 case DRAG: localCommit.
Push(
_(
"Drag" ) );
break;
507 case BREAK: localCommit.
Push(
_(
"Break Wire" ) );
break;
508 case SLICE: localCommit.
Push(
_(
"Slice Wire" ) );
break;
536 if( selection.
Empty() )
539 std::vector<SCH_LINE*> lines;
552 lines.push_back(
static_cast<SCH_LINE*
>( item ) );
563 bool useCursorForSingleLine =
false;
565 if( lines.size() == 1 )
566 useCursorForSingleLine =
true;
573 VECTOR2I breakPos = useCursorForSingleLine ? cursorPos : line->GetMidPoint();
580 lwbTool->
BreakSegment( aCommit, line, breakPos, &newLine, screen );
607 bool currentModeIsDragLike = (
m_mode !=
MOVE );
609 bool didAtLeastOneBreak =
false;
625 bool unselect =
false;
629 std::vector<DANGLING_END_ITEM> internalPoints;
632 bool selectionHasSheetPins =
false;
633 bool selectionHasGraphicItems =
false;
634 bool selectionHasNonGraphicItems =
false;
635 bool selectionIsGraphicsOnly =
false;
637 std::unique_ptr<SCH_DRAG_NET_COLLISION_MONITOR> netCollisionMonitor;
643 selectionHasNonGraphicItems, selectionIsGraphicsOnly );
648 if( !selection.
Empty() )
651 netCollisionMonitor = std::make_unique<SCH_DRAG_NET_COLLISION_MONITOR>(
m_frame,
m_view );
652 netCollisionMonitor->Initialize( selection );
655 bool lastCtrlDown =
false;
664 if( selection.
Empty() )
672 bool restore_state =
false;
683 AXIS_LOCK axisLock = AXIS_LOCK::NONE;
684 long lastArrowKeyAction = 0;
689 wxLogTrace(
traceSchMove,
"doMoveSelection: event loop iteration, evt=%s, action=%s",
695 m_frame->GetCanvas()->SetCurrentCursor( currentCursor );
700 lastCtrlDown = ctrlDown;
730 grid.SetSnap(
false );
736 if( axisLock == AXIS_LOCK::HORIZONTAL )
742 axisLock = AXIS_LOCK::NONE;
748 axisLock = AXIS_LOCK::HORIZONTAL;
753 if( axisLock == AXIS_LOCK::VERTICAL )
759 axisLock = AXIS_LOCK::NONE;
765 axisLock = AXIS_LOCK::VERTICAL;
769 lastArrowKeyAction = action;
776 if( axisLock == AXIS_LOCK::HORIZONTAL )
778 else if( axisLock == AXIS_LOCK::VERTICAL )
790 if( sheet != hoverSheet )
797 m_frame->UpdateItem( hoverSheet,
false );
803 if( netCollisionMonitor )
804 currentCursor = netCollisionMonitor->AdjustCursor( currentCursor );
816 std::vector<SCH_ITEM*> previewItems;
819 previewItems.push_back(
static_cast<SCH_ITEM*
>( it ) );
822 previewItems.push_back( line );
825 previewItems.push_back( line );
827 std::vector<SCH_JUNCTION*> previewJunctions =
830 if( netCollisionMonitor )
831 netCollisionMonitor->Update( previewJunctions, selection );
834 m_view->AddToPreview( jct,
true );
848 m_frame->GetInfoBar()->Dismiss();
865 case MOVE:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel move." ) );
break;
866 case DRAG:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel drag." ) );
break;
867 case BREAK:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel break." ) );
break;
868 case SLICE:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel slice." ) );
break;
876 restore_state =
true;
886 restore_state =
true;
900 wxLogTrace(
traceSchMove,
"doMoveSelection: handleMoveToolActions returned false, exiting" );
919 didAtLeastOneBreak =
true;
958 wxLogTrace(
traceSchMove,
"doMoveSelection: event handled, not passing" );
967 }
while( ( evt =
Wait() ) );
971 if( selectionHasSheetPins || ( selectionIsGraphicsOnly && !lastCtrlDown ) )
972 targetSheet =
nullptr;
977 m_frame->UpdateItem( hoverSheet,
false );
1014 return !restore_state;
1026 if( aCurrentModeIsDragLike != aWasDragging )
1030 if( sel && !sel->
IsNew() )
1059 if( userSelection.
GetSize() == 1 )
1078 aUnselect = selection.
IsHover();
1087 bool& aHasGraphicItems,
bool& aHasNonGraphicItems,
1088 bool& aIsGraphicsOnly )
1090 aHasSheetPins =
false;
1091 aHasGraphicItems =
false;
1092 aHasNonGraphicItems =
false;
1094 for(
EDA_ITEM* edaItem : aSelection )
1099 aHasSheetPins =
true;
1102 aHasGraphicItems =
true;
1104 aHasNonGraphicItems =
true;
1107 aIsGraphicsOnly = aHasGraphicItems && !aHasNonGraphicItems;
1123 std::vector<SCH_ITEM*> stageTwo;
1125 for(
EDA_ITEM* edaItem : aSelection )
1128 std::vector<VECTOR2I> connections;
1130 switch( item->
Type() )
1136 stageTwo.emplace_back( item );
1140 static_cast<SCH_LINE*
>( item )->GetSelectedPoints( connections );
1147 for(
const VECTOR2I& point : connections )
1155 for(
const VECTOR2I& point : item->GetConnectionPoints() )
1159 for(
EDA_ITEM* item : connectedDragItems )
1167 for(
EDA_ITEM* edaItem : aSelection )
1190 static_cast<SCH_ITEM*
>( item )->GetEndPoints( aInternalPoints );
1192 std::vector<DANGLING_END_ITEM> endPointsByType = aInternalPoints;
1193 std::vector<DANGLING_END_ITEM> endPointsByPos = endPointsByType;
1197 static_cast<SCH_ITEM*
>( item )->UpdateDanglingState( endPointsByType, endPointsByPos );
1202 std::vector<DANGLING_END_ITEM>& aInternalPoints,
1208 bool placingNewItems = sch_item && sch_item->
IsNew();
1216 aInternalPoints.clear();
1223 if( !it->IsSelected() )
1236 for(
EDA_ITEM* edaItem : aSelection )
1253 if( !
info.isJunction )
1267 aSnapLayer =
grid.GetSelectionGrid( aSelection );
1273 if( schItem->
IsNew() )
1284 enteredGroup->AddItem( schItem );
1301 shape->SetHatchingDirty();
1302 shape->UpdateHatching();
1329 wxASSERT_MSG(
m_anchorPos,
"Should be already set from previous cmd" );
1331 else if( placingNewItems )
1339 bool isPasted =
false;
1345 if( item->GetParent() && item->GetParent()->IsSelected() )
1351 isPasted |= ( item->GetFlags() &
IS_PASTED ) != 0;
1358 aSelection.SetReferencePoint(
m_cursor );
1371 if(
m_frame->GetMoveWarpsCursor() )
1391 bool aHasSheetPins,
bool aIsGraphicsOnly,
bool aCtrlDown )
1414 selBBox.
Merge( schIt->GetBoundingBox() );
1455 if( sheet->
GetPin( pt ) )
1467 bool dropAllowedBySelection = !aHasSheetPins;
1468 bool dropAllowedByModifiers = !aIsGraphicsOnly || aCtrlDown;
1470 if( sheet && !( dropAllowedBySelection && dropAllowedByModifiers ) )
1478 SCH_COMMIT* aCommit,
int& aXBendCount,
int& aYBendCount,
1481 wxLogTrace(
traceSchMove,
"performItemMove: delta=(%d,%d), moveOffset=(%d,%d), selection size=%u",
1488 std::vector<VECTOR2I> splitMoves;
1497 splitMoves.emplace_back(
VECTOR2I( aDelta.
x, 0 ) );
1507 splitMoves.emplace_back(
VECTOR2I( 0, aDelta.
y ) );
1513 for(
const VECTOR2I& splitDelta : splitMoves )
1516 if( splitDelta ==
VECTOR2I( 0, 0 ) )
1520 ( aDelta.
y >= 0 ) ) )
1523 if( item->GetParent() && item->GetParent()->IsSelected() )
1527 bool isLineModeConstrained =
false;
1536 if( (
m_mode ==
DRAG ) && isLineModeConstrained && line
1540 orthoLineDrag( aCommit, line, splitDelta, aXBendCount, aYBendCount, aGrid );
1553 if( lineEnd.second && lineEnd.first->HasFlag(
STARTPOINT ) )
1554 lineEnd.first->SetStartPoint(
pin->GetPosition() );
1555 else if( !lineEnd.second && lineEnd.first->HasFlag(
ENDPOINT ) )
1556 lineEnd.first->SetEndPoint(
pin->GetPosition() );
1566 if( !label || !
info.attachedLine )
1569 if(
info.trackMovingEnd )
1571 label->Move( splitDelta );
1576 if(
info.attachedLine->GetLength() > 0
1577 &&
info.attachedLine->HitTest(
info.originalLabelPos, 1 )
1578 &&
info.originalLabelPos != start
1579 &&
info.originalLabelPos !=
end )
1581 info.trackMovingEnd =
false;
1582 label->SetPosition(
info.originalLabelPos );
1583 info.originalLineStart = start;
1601 if( deltaStart == deltaEnd )
1603 label->SetPosition(
info.originalLabelPos + deltaStart );
1608 VECTOR2I fixedEndDelta = startDrags ? deltaEnd : deltaStart;
1610 label->SetPosition(
info.originalLabelPos + fixedEndDelta );
1614 if( !
info.attachedLine->HitTest( label->GetPosition(), 1 ) )
1617 label->SetPosition( seg.
NearestPoint( label->GetPosition() ) );
1621 if( label->GetPosition() == movingEnd )
1622 info.trackMovingEnd =
true;
1638 wxLogTrace(
traceSchMove,
"handleMoveToolActions: received event, action=%s",
1639 aEvent->
Format().c_str() );
1643 wxLogTrace(
traceSchMove,
"handleMoveToolActions: doDelete, exiting move" );
1644 const_cast<TOOL_EVENT*
>( aEvent )->SetPassEvent();
1655 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCW event received, selection size=%u",
1658 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCW RunSynchronousAction completed" );
1660 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCW updateStoredPositions completed" );
1665 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCCW event received, selection size=%u",
1668 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCCW RunSynchronousAction completed" );
1670 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCCW updateStoredPositions completed" );
1729 m_frame->SelectUnit( symbol, unit );
1741 m_frame->SelectBodyStyle( symbol, bodyStyle );
1762 wxLogTrace(
traceSchMove,
"updateStoredPositions: start, selection size=%u",
1781 wxLogTrace(
traceSchMove,
" item[%d] type=%d: stored pos updated (%d,%d) -> (%d,%d)",
1782 itemCount++, (
int) schItem->
Type(), oldPos.
x, oldPos.
y, newPos.
x, newPos.
y );
1792 pin->SetStoredPos( pinNewPos );
1793 wxLogTrace(
traceSchMove,
" sheet pin: stored pos updated (%d,%d) -> (%d,%d)",
1794 pinOldPos.
x, pinOldPos.
y, pinNewPos.
x, pinNewPos.
y );
1799 wxLogTrace(
traceSchMove,
"updateStoredPositions: complete, updated %d items", itemCount );
1804 const std::vector<DANGLING_END_ITEM>& aInternalPoints )
1813 newLine->ClearEditFlags();
1820 oldLine->ClearEditFlags();
1835 sch_item->SetConnectivityDirty(
true );
1849 if(
m_frame->GetScreen()->IsExplicitJunctionNeeded( it.GetPosition() ) )
1859 selectionCopy.
Add( line );
1862 selectionCopy.
Add( line );
1869 if( isDragLike && !isSlice )
1879 item->ClearTempFlags();
1881 for(
EDA_ITEM* item : selectionCopy )
1882 item->ClearTempFlags();
1884 m_frame->Schematic().CleanUp( aCommit );
1888 auto clearChildEditFlags =
1891 aItem->RunOnChildren(
1901 item->ClearEditFlags();
1904 clearChildEditFlags( schItem );
1909 for(
EDA_ITEM* item : selectionCopy )
1911 item->ClearEditFlags();
1914 clearChildEditFlags( schItem );
1936 bbox.
Merge(
static_cast<SCH_ITEM*
>( item )->GetBoundingBox() );
1940 bool overlap =
false;
1945 moved.Move( offset );
1950 if(
moved.Intersects( existing->GetBoundingBox() ) )
1966 m_frame->RemoveFromScreen( schItem, srcScreen );
1969 schItem->
Move( offset );
1972 destScreen->
Append( schItem );
1986 std::set<SCH_ITEM*> danglers;
1988 std::function<void(
SCH_ITEM* )> changeHandler =
1989 [&](
SCH_ITEM* aChangedItem ) ->
void
1993 if( aChangedItem->IsSelected() )
2005 danglers.insert( aChangedItem );
2013 danglers.insert( aChangedItem );
2017 m_frame->GetScreen()->TestDanglingEnds(
nullptr, &changeHandler );
2041 for(
SCH_ITEM* item : itemsOverlapping )
2043 if( item != aOriginalItem && item->
IsConnected( aPoint ) )
2046 foundJunction = item;
2052 if( foundSymbol && foundJunction )
2054 aList.push_back( foundSymbol );
2060 aList.push_back( foundJunction );
2067 if(
test == aOriginalItem || !
test->CanConnect( aOriginalItem ) )
2070 switch(
test->Type() )
2086 if(
test->IsConnected( aPoint ) )
2087 aList.push_back(
test );
2092 if(
static_cast<SCH_LINE*
>(
test )->HitTest( label->GetPosition(), 1 ) )
2093 aList.push_back(
test );
2106 if(
pin->IsConnected( aPoint ) )
2108 if(
pin->IsSelected() )
2111 aList.push_back(
pin );
2121 if(
test->IsConnected( aPoint ) )
2122 aList.push_back(
test );
2137 aList.push_back( label );
2149 if( line->
HitTest( aPoint, 1 ) )
2150 aList.push_back( label );
2166 std::set<SCH_ITEM*> connectableCandidates;
2167 std::vector<SCH_ITEM*> itemsConnectable;
2168 bool ptHasUnselectedJunction =
false;
2171 connectableCandidates.insert( item );
2178 connectableCandidates.insert( item );
2186 bool isBusLabel =
false;
2197 || selected->GetLayer() ==
LAYER_BUS || isBusLabel )
2217 else if( fixedLine )
2230 auto makeNewJunction =
2247 for(
SCH_ITEM* item : connectableCandidates )
2260 if( !
pin->IsSelected()
2261 &&
pin->GetPosition() == aPoint
2262 &&
pin->CanConnect( aSelectedItem ) )
2264 itemsConnectable.push_back(
pin );
2275 if( item == aSelectedItem
2276 || ( item->Type() !=
SCH_LINE_T && ( item->IsSelected() || item->HasSelectedAncestorGroup() ) )
2282 itemsConnectable.push_back( item );
2285 for(
SCH_ITEM* item : itemsConnectable )
2287 if( item->Type() ==
SCH_JUNCTION_T && item->IsConnected( aPoint ) && !item->IsSelected() )
2289 ptHasUnselectedJunction =
true;
2306 if( ptHasUnselectedJunction )
2321 if( !lineInSelectedGroup )
2325 || lineInSelectedGroup )
2332 aList.push_back( line );
2337 if( !lineInSelectedGroup )
2341 || lineInSelectedGroup )
2348 aList.push_back( line );
2353 switch( aSelectedItem->
Type() )
2367 newWire = makeNewWire( aCommit, line, aSelectedItem, aPoint, aPoint );
2370 aList.push_back( newWire );
2380 makeNewWire( aCommit, line, line, aPoint, oldEnd );
2381 makeNewJunction( aCommit, line, aPoint );
2413 aList.push_back( label );
2416 info.attachedLine = line;
2430 if(
pin->IsConnected( aPoint ) )
2441 newWire = makeNewWire( aCommit,
pin, aSelectedItem, aPoint, aPoint );
2443 aList.push_back( newWire );
2452 if(
test->IsConnected( aPoint ) && !newWire )
2456 newWire = makeNewWire( aCommit,
test, aSelectedItem, aPoint, aPoint );
2458 aList.push_back( newWire );
2467 aList.push_back(
test );
2502 aList.push_back( label );
2507 info.attachedLine = line;
2516 else if(
test->IsConnected( aPoint ) && !newWire )
2520 newWire = makeNewWire( aCommit,
test, aSelectedItem, aPoint, aPoint );
2522 aList.push_back( newWire );
2548 if( line->
HitTest( point, 1 ) )
2551 aList.push_back(
test );
2554 std::vector<VECTOR2I> ends =
test->GetConnectionPoints();
2557 if( ends[0] == point )
2581 static int moveCallCount = 0;
2582 wxLogTrace(
traceSchMove,
"moveItem[%d]: type=%d, delta=(%d,%d)",
2583 ++moveCallCount, aItem->
Type(), aDelta.
x, aDelta.
y );
2585 switch( aItem->
Type() )
2591 static_cast<SCH_LINE*
>( aItem )->Move( aDelta );
2636 label->
Move( aDelta );
2642 static_cast<SCH_ITEM*
>( aItem )->Move( aDelta );
2678 if( !it->IsSelected() )
2681 if( !selection.
IsHover() && it->IsSelected() )
2684 it->SetStoredPos( it->GetPosition() );
2689 pin->SetStoredPos(
pin->GetPosition() );
2709 std::vector<EDA_ITEM*> items( selection.
begin(), selection.
end() );
2718 m_frame->Schematic().CleanUp( &commit );
2719 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)
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