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 );
365 line->MoveEnd( splitDelta );
367 line->MoveStart( splitDelta );
372 else if( line->GetLength() == 0 )
382 else if( foundAttachment && line->IsOrthogonal() )
389 unsigned int xMoveBit = splitDelta.
x != 0;
390 unsigned int yMoveBit = splitDelta.
y != 0;
391 int xLength = abs( unselectedEnd.
x - selectedEnd.
x );
392 int yLength = abs( unselectedEnd.
y - selectedEnd.
y );
393 int xMove = ( xLength - ( xBendCount * lineGrid.
x ) )
394 *
sign( selectedEnd.
x - unselectedEnd.
x );
395 int yMove = ( yLength - ( yBendCount * lineGrid.
y ) )
396 *
sign( selectedEnd.
y - unselectedEnd.
y );
418 xBendCount += yMoveBit;
419 yBendCount += xMoveBit;
424 line->MoveEnd(
VECTOR2I( splitDelta.
x ? splitDelta.
x : xMove,
425 splitDelta.
y ? splitDelta.
y : yMove ) );
429 line->MoveStart(
VECTOR2I( splitDelta.
x ? splitDelta.
x : xMove,
430 splitDelta.
y ? splitDelta.
y : yMove ) );
451 else if( !foundAttachment )
454 line->MoveEnd( splitDelta );
456 line->MoveStart( splitDelta );
491 case MOVE: localCommit.
Push(
_(
"Move" ) );
break;
492 case DRAG: localCommit.
Push(
_(
"Drag" ) );
break;
493 case BREAK: localCommit.
Push(
_(
"Break Wire" ) );
break;
494 case SLICE: localCommit.
Push(
_(
"Slice Wire" ) );
break;
522 if( selection.
Empty() )
525 std::vector<SCH_LINE*> lines;
538 lines.push_back(
static_cast<SCH_LINE*
>( item ) );
549 bool useCursorForSingleLine =
false;
551 if( lines.size() == 1 )
552 useCursorForSingleLine =
true;
559 VECTOR2I breakPos = useCursorForSingleLine ? cursorPos : line->GetMidPoint();
566 lwbTool->
BreakSegment( aCommit, line, breakPos, &newLine, screen );
593 bool currentModeIsDragLike = (
m_mode !=
MOVE );
595 bool didAtLeastOneBreak =
false;
611 bool unselect =
false;
615 std::vector<DANGLING_END_ITEM> internalPoints;
618 bool selectionHasSheetPins =
false;
619 bool selectionHasGraphicItems =
false;
620 bool selectionHasNonGraphicItems =
false;
621 bool selectionIsGraphicsOnly =
false;
623 std::unique_ptr<SCH_DRAG_NET_COLLISION_MONITOR> netCollisionMonitor;
629 selectionHasNonGraphicItems, selectionIsGraphicsOnly );
634 if( !selection.
Empty() )
637 netCollisionMonitor = std::make_unique<SCH_DRAG_NET_COLLISION_MONITOR>(
m_frame,
m_view );
638 netCollisionMonitor->Initialize( selection );
641 bool lastCtrlDown =
false;
650 if( selection.
Empty() )
658 bool restore_state =
false;
669 AXIS_LOCK axisLock = AXIS_LOCK::NONE;
670 long lastArrowKeyAction = 0;
675 wxLogTrace(
traceSchMove,
"doMoveSelection: event loop iteration, evt=%s, action=%s",
681 m_frame->GetCanvas()->SetCurrentCursor( currentCursor );
686 lastCtrlDown = ctrlDown;
717 grid.SetSnap(
false );
723 if( axisLock == AXIS_LOCK::HORIZONTAL )
729 axisLock = AXIS_LOCK::NONE;
735 axisLock = AXIS_LOCK::HORIZONTAL;
740 if( axisLock == AXIS_LOCK::VERTICAL )
746 axisLock = AXIS_LOCK::NONE;
752 axisLock = AXIS_LOCK::VERTICAL;
756 lastArrowKeyAction = action;
763 if( axisLock == AXIS_LOCK::HORIZONTAL )
765 else if( axisLock == AXIS_LOCK::VERTICAL )
770 selectionIsGraphicsOnly, ctrlDown );
772 if( sheet != hoverSheet )
779 m_frame->UpdateItem( hoverSheet,
false );
785 if( netCollisionMonitor )
786 currentCursor = netCollisionMonitor->AdjustCursor( currentCursor );
798 std::vector<SCH_ITEM*> previewItems;
801 previewItems.push_back(
static_cast<SCH_ITEM*
>( it ) );
804 previewItems.push_back( line );
807 previewItems.push_back( line );
809 std::vector<SCH_JUNCTION*> previewJunctions =
812 if( netCollisionMonitor )
813 netCollisionMonitor->Update( previewJunctions, selection );
817 m_view->AddToPreview( jct,
true );
832 m_frame->GetInfoBar()->Dismiss();
849 case MOVE:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel move." ) );
break;
850 case DRAG:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel drag." ) );
break;
851 case BREAK:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel break." ) );
break;
852 case SLICE:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel slice." ) );
break;
860 restore_state =
true;
874 wxLogTrace(
traceSchMove,
"doMoveSelection: handleMoveToolActions returned false, exiting" );
893 didAtLeastOneBreak =
true;
932 wxLogTrace(
traceSchMove,
"doMoveSelection: event handled, not passing" );
941 }
while( ( evt =
Wait() ) );
945 if( selectionHasSheetPins || ( selectionIsGraphicsOnly && !lastCtrlDown ) )
946 targetSheet =
nullptr;
951 m_frame->UpdateItem( hoverSheet,
false );
980 return !restore_state;
992 if( aCurrentModeIsDragLike != aWasDragging )
996 if( sel && !sel->
IsNew() )
1025 if( userSelection.
GetSize() == 1 )
1045 aUnselect = selection.
IsHover();
1052 bool& aHasGraphicItems,
bool& aHasNonGraphicItems,
1053 bool& aIsGraphicsOnly )
1055 aHasSheetPins =
false;
1056 aHasGraphicItems =
false;
1057 aHasNonGraphicItems =
false;
1059 for(
EDA_ITEM* edaItem : aSelection )
1064 aHasSheetPins =
true;
1067 aHasGraphicItems =
true;
1069 aHasNonGraphicItems =
true;
1072 aIsGraphicsOnly = aHasGraphicItems && !aHasNonGraphicItems;
1088 std::vector<SCH_ITEM*> stageTwo;
1090 for(
EDA_ITEM* edaItem : aSelection )
1093 std::vector<VECTOR2I> connections;
1095 switch( item->
Type() )
1101 stageTwo.emplace_back( item );
1105 static_cast<SCH_LINE*
>( item )->GetSelectedPoints( connections );
1112 for(
const VECTOR2I& point : connections )
1120 for(
const VECTOR2I& point : item->GetConnectionPoints() )
1124 for(
EDA_ITEM* item : connectedDragItems )
1132 for(
EDA_ITEM* edaItem : aSelection )
1152 std::vector<DANGLING_END_ITEM>& aInternalPoints )
1156 static_cast<SCH_ITEM*
>( item )->GetEndPoints( aInternalPoints );
1158 std::vector<DANGLING_END_ITEM> endPointsByType = aInternalPoints;
1159 std::vector<DANGLING_END_ITEM> endPointsByPos = endPointsByType;
1163 static_cast<SCH_ITEM*
>( item )->UpdateDanglingState( endPointsByType, endPointsByPos );
1168 std::vector<DANGLING_END_ITEM>& aInternalPoints,
1174 bool placingNewItems = sch_item && sch_item->
IsNew();
1182 aInternalPoints.clear();
1189 if( !it->IsSelected() )
1202 for(
EDA_ITEM* edaItem : aSelection )
1219 m_frame->GetScreen()->Items(), pt,
false );
1221 if( !
info.isJunction )
1235 aSnapLayer =
grid.GetSelectionGrid( aSelection );
1241 if( schItem->
IsNew() )
1253 enteredGroup->AddItem( schItem );
1270 shape->SetHatchingDirty();
1271 shape->UpdateHatching();
1298 wxASSERT_MSG(
m_anchorPos,
"Should be already set from previous cmd" );
1300 else if( placingNewItems )
1308 bool isPasted =
false;
1314 if( item->GetParent() && item->GetParent()->IsSelected() )
1320 isPasted |= ( item->GetFlags() &
IS_PASTED ) != 0;
1327 aSelection.SetReferencePoint(
m_cursor );
1340 if(
m_frame->GetMoveWarpsCursor() )
1360 const VECTOR2I& aCursorPos,
bool aHasSheetPins,
1361 bool aIsGraphicsOnly,
bool aCtrlDown )
1378 selBBox.
Merge( schIt->GetBoundingBox() );
1406 bool dropAllowedBySelection = !aHasSheetPins;
1407 bool dropAllowedByModifiers = !aIsGraphicsOnly || aCtrlDown;
1409 if( sheet && !( dropAllowedBySelection && dropAllowedByModifiers ) )
1417 SCH_COMMIT* aCommit,
int& aXBendCount,
int& aYBendCount,
1420 wxLogTrace(
traceSchMove,
"performItemMove: delta=(%d,%d), moveOffset=(%d,%d), selection size=%u",
1427 std::vector<VECTOR2I> splitMoves;
1436 splitMoves.emplace_back(
VECTOR2I( aDelta.
x, 0 ) );
1446 splitMoves.emplace_back(
VECTOR2I( 0, aDelta.
y ) );
1452 for(
const VECTOR2I& splitDelta : splitMoves )
1455 if( splitDelta ==
VECTOR2I( 0, 0 ) )
1459 ( aDelta.
y >= 0 ) ) )
1462 if( item->GetParent() && item->GetParent()->IsSelected() )
1466 bool isLineModeConstrained =
false;
1472 if( (
m_mode ==
DRAG ) && isLineModeConstrained && line
1475 orthoLineDrag( aCommit, line, splitDelta, aXBendCount, aYBendCount, aGrid );
1488 if( lineEnd.second && lineEnd.first->HasFlag(
STARTPOINT ) )
1489 lineEnd.first->SetStartPoint(
pin->GetPosition() );
1490 else if( !lineEnd.second && lineEnd.first->HasFlag(
ENDPOINT ) )
1491 lineEnd.first->SetEndPoint(
pin->GetPosition() );
1504 wxLogTrace(
traceSchMove,
"handleMoveToolActions: received event, action=%s",
1505 aEvent->
Format().c_str() );
1509 wxLogTrace(
traceSchMove,
"handleMoveToolActions: doDelete, exiting move" );
1510 const_cast<TOOL_EVENT*
>( aEvent )->SetPassEvent();
1521 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCW event received, selection size=%u",
1524 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCW RunSynchronousAction completed" );
1526 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCW updateStoredPositions completed" );
1531 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCCW event received, selection size=%u",
1534 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCCW RunSynchronousAction completed" );
1536 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCCW updateStoredPositions completed" );
1598 m_frame->SelectUnit( symbol, unit );
1611 m_frame->SelectBodyStyle( symbol, bodyStyle );
1632 wxLogTrace(
traceSchMove,
"updateStoredPositions: start, selection size=%u",
1650 wxLogTrace(
traceSchMove,
" item[%d] type=%d: stored pos updated (%d,%d) -> (%d,%d)",
1651 itemCount++, (
int) schItem->
Type(), oldPos.
x, oldPos.
y, newPos.
x, newPos.
y );
1661 pin->SetStoredPos( pinNewPos );
1662 wxLogTrace(
traceSchMove,
" sheet pin: stored pos updated (%d,%d) -> (%d,%d)",
1663 pinOldPos.
x, pinOldPos.
y, pinNewPos.
x, pinNewPos.
y );
1668 wxLogTrace(
traceSchMove,
"updateStoredPositions: complete, updated %d items", itemCount );
1673 const std::vector<DANGLING_END_ITEM>& aInternalPoints )
1682 newLine->ClearEditFlags();
1689 oldLine->ClearEditFlags();
1704 sch_item->SetConnectivityDirty(
true );
1718 if(
m_frame->GetScreen()->IsExplicitJunctionNeeded( it.GetPosition() ) )
1728 selectionCopy.
Add( line );
1731 selectionCopy.
Add( line );
1738 if( isDragLike && !isSlice )
1745 m_frame->Schematic().CleanUp( aCommit );
1748 item->ClearEditFlags();
1752 for(
EDA_ITEM* item : selectionCopy )
1753 item->ClearEditFlags();
1774 bbox.
Merge(
static_cast<SCH_ITEM*
>( item )->GetBoundingBox() );
1778 bool overlap =
false;
1783 moved.Move( offset );
1788 if(
moved.Intersects( existing->GetBoundingBox() ) )
1804 m_frame->RemoveFromScreen( schItem, srcScreen );
1807 schItem->
Move( offset );
1810 destScreen->
Append( schItem );
1824 std::set<SCH_ITEM*> danglers;
1826 std::function<void(
SCH_ITEM* )> changeHandler =
1827 [&](
SCH_ITEM* aChangedItem ) ->
void
1834 if( aChangedItem->HasFlag(
IS_BROKEN) && aChangedItem->IsDangling()
1835 && !aChangedItem->IsSelected() )
1837 danglers.insert( aChangedItem );
1841 m_frame->GetScreen()->TestDanglingEnds(
nullptr, &changeHandler );
1866 for(
SCH_ITEM* item : itemsOverlapping )
1868 if( item != aOriginalItem && item->
IsConnected( aPoint ) )
1871 foundJunction = item;
1877 if( foundSymbol && foundJunction )
1879 aList.push_back( foundSymbol );
1885 aList.push_back( foundJunction );
1892 if(
test == aOriginalItem || !
test->CanConnect( aOriginalItem ) )
1895 switch(
test->Type() )
1911 if(
test->IsConnected( aPoint ) )
1912 aList.push_back(
test );
1917 if(
static_cast<SCH_LINE*
>(
test )->HitTest( label->GetPosition(), 1 ) )
1918 aList.push_back(
test );
1931 if(
pin->IsConnected( aPoint ) )
1933 if(
pin->IsSelected() )
1936 aList.push_back(
pin );
1946 if(
test->IsConnected( aPoint ) )
1947 aList.push_back(
test );
1962 aList.push_back( label );
1974 if( line->
HitTest( aPoint, 1 ) )
1975 aList.push_back( label );
1992 std::vector<SCH_ITEM*> itemsConnectable;
1993 bool ptHasUnselectedJunction =
false;
2024 else if( fixedLine )
2037 auto makeNewJunction =
2054 for(
SCH_ITEM* item : itemsOverlappingRTree )
2062 if( !
pin->IsSelected()
2064 &&
pin->CanConnect( aSelectedItem ) )
2066 itemsConnectable.push_back(
pin );
2075 if( item == aSelectedItem
2076 || ( item->Type() !=
SCH_LINE_T && item->IsSelected() )
2082 itemsConnectable.push_back( item );
2085 for(
SCH_ITEM* item : itemsConnectable )
2087 if( item->Type() ==
SCH_JUNCTION_T && item->IsConnected( aPoint ) && !item->IsSelected() )
2089 ptHasUnselectedJunction =
true;
2106 if( ptHasUnselectedJunction )
2126 aList.push_back( line );
2140 aList.push_back( line );
2145 switch( aSelectedItem->
Type() )
2159 newWire = makeNewWire( aCommit, line, aSelectedItem, aPoint, aPoint );
2162 aList.push_back( newWire );
2172 makeNewWire( aCommit, line, line, aPoint, oldEnd );
2173 makeNewJunction( aCommit, line, aPoint );
2205 aList.push_back( label );
2208 info.attachedLine = line;
2220 if(
pin->IsConnected( aPoint ) )
2231 newWire = makeNewWire( aCommit,
pin, aSelectedItem, aPoint, aPoint );
2233 aList.push_back( newWire );
2242 if(
test->IsConnected( aPoint ) )
2247 aList.push_back(
test );
2253 newWire = makeNewWire( aCommit,
test, aSelectedItem, aPoint, aPoint );
2255 aList.push_back( newWire );
2265 aList.push_back(
test );
2300 aList.push_back( label );
2305 info.attachedLine = line;
2312 else if(
test->IsConnected( aPoint ) && !newWire )
2316 newWire = makeNewWire( aCommit,
test, aSelectedItem, aPoint, aPoint );
2318 aList.push_back( newWire );
2344 if( line->
HitTest( point, 1 ) )
2347 aList.push_back(
test );
2350 std::vector<VECTOR2I> ends =
test->GetConnectionPoints();
2353 if( ends[0] == point )
2377 static int moveCallCount = 0;
2378 wxLogTrace(
traceSchMove,
"moveItem[%d]: type=%d, delta=(%d,%d)",
2379 ++moveCallCount, aItem->
Type(), aDelta.
x, aDelta.
y );
2381 switch( aItem->
Type() )
2423 pin->SetStoredPos(
pin->GetStoredPos() + aDelta );
2424 pin->ConstrainOnEdge(
pin->GetStoredPos(),
true );
2438 SEG currentLine(
info.attachedLine->GetStartPoint(),
info.attachedLine->GetEndPoint() );
2443 label->
Move( aDelta );
2450 static_cast<SCH_ITEM*
>( aItem )->Move( aDelta );
2483 if( !it->IsSelected() )
2486 if( !selection.
IsHover() && it->IsSelected() )
2489 it->SetStoredPos( it->GetPosition() );
2494 pin->SetStoredPos(
pin->GetPosition() );
2506 for(
int ii = 0; ii < 2; ++ii )
2513 std::set<EDA_ITEM*> unique_items( drag_items.begin(), drag_items.end() );
2519 for(
EDA_ITEM* dragItem : unique_items )
2521 if( dragItem->GetParent() && dragItem->GetParent()->IsSelected() )
2524 doMoveItem( dragItem,
delta );
2534 doMoveItem( item,
delta );
2541 VECTOR2I tl_delta =
grid.AlignGrid( topLeft, selectionGrid ) - topLeft;
2542 VECTOR2I br_delta =
grid.AlignGrid( bottomRight, selectionGrid ) - bottomRight;
2546 doMoveItem( sheet, tl_delta );
2558 newPos =
pin->GetPosition() + tl_delta;
2560 newPos =
pin->GetPosition() + br_delta;
2572 for(
EDA_ITEM* dragItem : drag_items )
2574 if( dragItem->GetParent() && dragItem->GetParent()->IsSelected() )
2577 doMoveItem( dragItem,
delta );
2588 for(
const VECTOR2I& point : connections )
2591 std::map<VECTOR2I, int> shifts;
2595 for(
const VECTOR2I& conn : connections )
2597 VECTOR2I gridpt =
grid.AlignGrid( conn, selectionGrid ) - conn;
2601 if( shifts[gridpt] > max_count )
2603 most_common = gridpt;
2604 max_count = shifts[most_common];
2608 if( most_common !=
VECTOR2I( 0, 0 ) )
2610 doMoveItem( item, most_common );
2612 for(
EDA_ITEM* dragItem : drag_items )
2614 if( dragItem->GetParent() && dragItem->GetParent()->IsSelected() )
2617 doMoveItem( dragItem, most_common );
2629 m_frame->Schematic().CleanUp( &commit );
2630 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 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.
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.
void SetPosition(const VECTOR2I &aPosition) override
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.
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
void MoveEnd(const VECTOR2I &aMoveVector)
void SetLastResolvedState(const SCH_ITEM *aItem) override
void MoveStart(const VECTOR2I &aMoveVector)
void SetEndPoint(const VECTOR2I &aPosition)
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.
void SetSize(const VECTOR2I &aSize)
bool IsTopLevelSheet() const
Check if this sheet is a top-level 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)
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
std::vector< EDA_ITEM * > EDA_ITEMS
Define list of drawing items for screens.
#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.
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.
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