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 )
348 info.attachedLine = line;
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 ) );
454 else if( !foundAttachment )
457 line->MoveEnd( splitDelta );
459 line->MoveStart( splitDelta );
494 case MOVE: localCommit.
Push(
_(
"Move" ) );
break;
495 case DRAG: localCommit.
Push(
_(
"Drag" ) );
break;
496 case BREAK: localCommit.
Push(
_(
"Break Wire" ) );
break;
497 case SLICE: localCommit.
Push(
_(
"Slice Wire" ) );
break;
525 if( selection.
Empty() )
528 std::vector<SCH_LINE*> lines;
541 lines.push_back(
static_cast<SCH_LINE*
>( item ) );
552 bool useCursorForSingleLine =
false;
554 if( lines.size() == 1 )
555 useCursorForSingleLine =
true;
562 VECTOR2I breakPos = useCursorForSingleLine ? cursorPos : line->GetMidPoint();
569 lwbTool->
BreakSegment( aCommit, line, breakPos, &newLine, screen );
596 bool currentModeIsDragLike = (
m_mode !=
MOVE );
598 bool didAtLeastOneBreak =
false;
614 bool unselect =
false;
618 std::vector<DANGLING_END_ITEM> internalPoints;
621 bool selectionHasSheetPins =
false;
622 bool selectionHasGraphicItems =
false;
623 bool selectionHasNonGraphicItems =
false;
624 bool selectionIsGraphicsOnly =
false;
626 std::unique_ptr<SCH_DRAG_NET_COLLISION_MONITOR> netCollisionMonitor;
632 selectionHasNonGraphicItems, selectionIsGraphicsOnly );
637 if( !selection.
Empty() )
640 netCollisionMonitor = std::make_unique<SCH_DRAG_NET_COLLISION_MONITOR>(
m_frame,
m_view );
641 netCollisionMonitor->Initialize( selection );
644 bool lastCtrlDown =
false;
653 if( selection.
Empty() )
661 bool restore_state =
false;
672 AXIS_LOCK axisLock = AXIS_LOCK::NONE;
673 long lastArrowKeyAction = 0;
678 wxLogTrace(
traceSchMove,
"doMoveSelection: event loop iteration, evt=%s, action=%s",
684 m_frame->GetCanvas()->SetCurrentCursor( currentCursor );
689 lastCtrlDown = ctrlDown;
719 grid.SetSnap(
false );
725 if( axisLock == AXIS_LOCK::HORIZONTAL )
731 axisLock = AXIS_LOCK::NONE;
737 axisLock = AXIS_LOCK::HORIZONTAL;
742 if( axisLock == AXIS_LOCK::VERTICAL )
748 axisLock = AXIS_LOCK::NONE;
754 axisLock = AXIS_LOCK::VERTICAL;
758 lastArrowKeyAction = action;
765 if( axisLock == AXIS_LOCK::HORIZONTAL )
767 else if( axisLock == AXIS_LOCK::VERTICAL )
772 selectionIsGraphicsOnly, ctrlDown );
774 if( sheet != hoverSheet )
781 m_frame->UpdateItem( hoverSheet,
false );
787 if( netCollisionMonitor )
788 currentCursor = netCollisionMonitor->AdjustCursor( currentCursor );
800 std::vector<SCH_ITEM*> previewItems;
803 previewItems.push_back(
static_cast<SCH_ITEM*
>( it ) );
806 previewItems.push_back( line );
809 previewItems.push_back( line );
811 std::vector<SCH_JUNCTION*> previewJunctions =
814 if( netCollisionMonitor )
815 netCollisionMonitor->Update( previewJunctions, selection );
818 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 );
981 return !restore_state;
993 if( aCurrentModeIsDragLike != aWasDragging )
997 if( sel && !sel->
IsNew() )
1026 if( userSelection.
GetSize() == 1 )
1045 aUnselect = selection.
IsHover();
1054 bool& aHasGraphicItems,
bool& aHasNonGraphicItems,
1055 bool& aIsGraphicsOnly )
1057 aHasSheetPins =
false;
1058 aHasGraphicItems =
false;
1059 aHasNonGraphicItems =
false;
1061 for(
EDA_ITEM* edaItem : aSelection )
1066 aHasSheetPins =
true;
1069 aHasGraphicItems =
true;
1071 aHasNonGraphicItems =
true;
1074 aIsGraphicsOnly = aHasGraphicItems && !aHasNonGraphicItems;
1090 std::vector<SCH_ITEM*> stageTwo;
1092 for(
EDA_ITEM* edaItem : aSelection )
1095 std::vector<VECTOR2I> connections;
1097 switch( item->
Type() )
1103 stageTwo.emplace_back( item );
1107 static_cast<SCH_LINE*
>( item )->GetSelectedPoints( connections );
1114 for(
const VECTOR2I& point : connections )
1122 for(
const VECTOR2I& point : item->GetConnectionPoints() )
1126 for(
EDA_ITEM* item : connectedDragItems )
1134 for(
EDA_ITEM* edaItem : aSelection )
1157 static_cast<SCH_ITEM*
>( item )->GetEndPoints( aInternalPoints );
1159 std::vector<DANGLING_END_ITEM> endPointsByType = aInternalPoints;
1160 std::vector<DANGLING_END_ITEM> endPointsByPos = endPointsByType;
1164 static_cast<SCH_ITEM*
>( item )->UpdateDanglingState( endPointsByType, endPointsByPos );
1169 std::vector<DANGLING_END_ITEM>& aInternalPoints,
1175 bool placingNewItems = sch_item && sch_item->
IsNew();
1183 aInternalPoints.clear();
1190 if( !it->IsSelected() )
1203 for(
EDA_ITEM* edaItem : aSelection )
1220 if( !
info.isJunction )
1234 aSnapLayer =
grid.GetSelectionGrid( aSelection );
1240 if( schItem->
IsNew() )
1251 enteredGroup->AddItem( schItem );
1268 shape->SetHatchingDirty();
1269 shape->UpdateHatching();
1296 wxASSERT_MSG(
m_anchorPos,
"Should be already set from previous cmd" );
1298 else if( placingNewItems )
1306 bool isPasted =
false;
1312 if( item->GetParent() && item->GetParent()->IsSelected() )
1318 isPasted |= ( item->GetFlags() &
IS_PASTED ) != 0;
1325 aSelection.SetReferencePoint(
m_cursor );
1338 if(
m_frame->GetMoveWarpsCursor() )
1358 bool aHasSheetPins,
bool aIsGraphicsOnly,
bool aCtrlDown )
1381 selBBox.
Merge( schIt->GetBoundingBox() );
1422 if( sheet->
GetPin( pt ) )
1434 bool dropAllowedBySelection = !aHasSheetPins;
1435 bool dropAllowedByModifiers = !aIsGraphicsOnly || aCtrlDown;
1437 if( sheet && !( dropAllowedBySelection && dropAllowedByModifiers ) )
1445 SCH_COMMIT* aCommit,
int& aXBendCount,
int& aYBendCount,
1448 wxLogTrace(
traceSchMove,
"performItemMove: delta=(%d,%d), moveOffset=(%d,%d), selection size=%u",
1455 std::vector<VECTOR2I> splitMoves;
1464 splitMoves.emplace_back(
VECTOR2I( aDelta.
x, 0 ) );
1474 splitMoves.emplace_back(
VECTOR2I( 0, aDelta.
y ) );
1480 for(
const VECTOR2I& splitDelta : splitMoves )
1483 if( splitDelta ==
VECTOR2I( 0, 0 ) )
1487 ( aDelta.
y >= 0 ) ) )
1490 if( item->GetParent() && item->GetParent()->IsSelected() )
1494 bool isLineModeConstrained =
false;
1503 if( (
m_mode ==
DRAG ) && isLineModeConstrained && line
1507 orthoLineDrag( aCommit, line, splitDelta, aXBendCount, aYBendCount, aGrid );
1520 if( lineEnd.second && lineEnd.first->HasFlag(
STARTPOINT ) )
1521 lineEnd.first->SetStartPoint(
pin->GetPosition() );
1522 else if( !lineEnd.second && lineEnd.first->HasFlag(
ENDPOINT ) )
1523 lineEnd.first->SetEndPoint(
pin->GetPosition() );
1533 if( !label || !
info.attachedLine )
1547 if( deltaStart == deltaEnd )
1549 label->SetPosition(
info.originalLabelPos + deltaStart );
1553 label->Move( splitDelta );
1557 if( !
info.attachedLine->HitTest( label->GetPosition(), 1 ) &&
info.attachedLine->IsOrthogonal() )
1559 VECTOR2I pos = label->GetPosition();
1561 if( start.
x ==
end.x )
1563 int minY = std::min( start.
y,
end.y );
1564 int maxY = std::max( start.
y,
end.y );
1566 pos.
y = std::clamp( pos.
y, minY, maxY );
1568 else if( start.
y ==
end.y )
1570 int minX = std::min( start.
x,
end.x );
1571 int maxX = std::max( start.
x,
end.x );
1573 pos.
x = std::clamp( pos.
x, minX, maxX );
1576 label->SetPosition( pos );
1592 wxLogTrace(
traceSchMove,
"handleMoveToolActions: received event, action=%s",
1593 aEvent->
Format().c_str() );
1597 wxLogTrace(
traceSchMove,
"handleMoveToolActions: doDelete, exiting move" );
1598 const_cast<TOOL_EVENT*
>( aEvent )->SetPassEvent();
1609 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCW event received, selection size=%u",
1612 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCW RunSynchronousAction completed" );
1614 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCW updateStoredPositions completed" );
1619 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCCW event received, selection size=%u",
1622 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCCW RunSynchronousAction completed" );
1624 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCCW updateStoredPositions completed" );
1683 m_frame->SelectUnit( symbol, unit );
1695 m_frame->SelectBodyStyle( symbol, bodyStyle );
1716 wxLogTrace(
traceSchMove,
"updateStoredPositions: start, selection size=%u",
1735 wxLogTrace(
traceSchMove,
" item[%d] type=%d: stored pos updated (%d,%d) -> (%d,%d)",
1736 itemCount++, (
int) schItem->
Type(), oldPos.
x, oldPos.
y, newPos.
x, newPos.
y );
1746 pin->SetStoredPos( pinNewPos );
1747 wxLogTrace(
traceSchMove,
" sheet pin: stored pos updated (%d,%d) -> (%d,%d)",
1748 pinOldPos.
x, pinOldPos.
y, pinNewPos.
x, pinNewPos.
y );
1753 wxLogTrace(
traceSchMove,
"updateStoredPositions: complete, updated %d items", itemCount );
1758 const std::vector<DANGLING_END_ITEM>& aInternalPoints )
1767 newLine->ClearEditFlags();
1774 oldLine->ClearEditFlags();
1789 sch_item->SetConnectivityDirty(
true );
1803 if(
m_frame->GetScreen()->IsExplicitJunctionNeeded( it.GetPosition() ) )
1813 selectionCopy.
Add( line );
1816 selectionCopy.
Add( line );
1823 if( isDragLike && !isSlice )
1833 item->ClearTempFlags();
1835 for(
EDA_ITEM* item : selectionCopy )
1836 item->ClearTempFlags();
1838 m_frame->Schematic().CleanUp( aCommit );
1841 item->ClearEditFlags();
1845 for(
EDA_ITEM* item : selectionCopy )
1846 item->ClearEditFlags();
1867 bbox.
Merge(
static_cast<SCH_ITEM*
>( item )->GetBoundingBox() );
1871 bool overlap =
false;
1876 moved.Move( offset );
1881 if(
moved.Intersects( existing->GetBoundingBox() ) )
1897 m_frame->RemoveFromScreen( schItem, srcScreen );
1900 schItem->
Move( offset );
1903 destScreen->
Append( schItem );
1917 std::set<SCH_ITEM*> danglers;
1919 std::function<void(
SCH_ITEM* )> changeHandler =
1920 [&](
SCH_ITEM* aChangedItem ) ->
void
1928 if( ( aChangedItem->HasFlag(
IS_BROKEN ) || aChangedItem->HasFlag(
IS_NEW ) )
1929 && aChangedItem->IsDangling() && !aChangedItem->IsSelected() )
1931 danglers.insert( aChangedItem );
1935 m_frame->GetScreen()->TestDanglingEnds(
nullptr, &changeHandler );
1959 for(
SCH_ITEM* item : itemsOverlapping )
1961 if( item != aOriginalItem && item->
IsConnected( aPoint ) )
1964 foundJunction = item;
1970 if( foundSymbol && foundJunction )
1972 aList.push_back( foundSymbol );
1978 aList.push_back( foundJunction );
1985 if(
test == aOriginalItem || !
test->CanConnect( aOriginalItem ) )
1988 switch(
test->Type() )
2004 if(
test->IsConnected( aPoint ) )
2005 aList.push_back(
test );
2010 if(
static_cast<SCH_LINE*
>(
test )->HitTest( label->GetPosition(), 1 ) )
2011 aList.push_back(
test );
2024 if(
pin->IsConnected( aPoint ) )
2026 if(
pin->IsSelected() )
2029 aList.push_back(
pin );
2039 if(
test->IsConnected( aPoint ) )
2040 aList.push_back(
test );
2055 aList.push_back( label );
2067 if( line->
HitTest( aPoint, 1 ) )
2068 aList.push_back( label );
2084 std::set<SCH_ITEM*> connectableCandidates;
2085 std::vector<SCH_ITEM*> itemsConnectable;
2086 bool ptHasUnselectedJunction =
false;
2089 connectableCandidates.insert( item );
2096 connectableCandidates.insert( item );
2104 bool isBusLabel =
false;
2115 || selected->GetLayer() ==
LAYER_BUS || isBusLabel )
2135 else if( fixedLine )
2148 auto makeNewJunction =
2165 for(
SCH_ITEM* item : connectableCandidates )
2173 if( !
pin->IsSelected()
2174 &&
pin->GetPosition() == aPoint
2175 &&
pin->CanConnect( aSelectedItem ) )
2177 itemsConnectable.push_back(
pin );
2186 if( item == aSelectedItem
2187 || ( item->Type() !=
SCH_LINE_T && item->IsSelected() )
2193 itemsConnectable.push_back( item );
2196 for(
SCH_ITEM* item : itemsConnectable )
2198 if( item->Type() ==
SCH_JUNCTION_T && item->IsConnected( aPoint ) && !item->IsSelected() )
2200 ptHasUnselectedJunction =
true;
2217 if( ptHasUnselectedJunction )
2237 aList.push_back( line );
2251 aList.push_back( line );
2256 switch( aSelectedItem->
Type() )
2270 newWire = makeNewWire( aCommit, line, aSelectedItem, aPoint, aPoint );
2273 aList.push_back( newWire );
2283 makeNewWire( aCommit, line, line, aPoint, oldEnd );
2284 makeNewJunction( aCommit, line, aPoint );
2316 aList.push_back( label );
2319 info.attachedLine = line;
2333 if(
pin->IsConnected( aPoint ) )
2344 newWire = makeNewWire( aCommit,
pin, aSelectedItem, aPoint, aPoint );
2346 aList.push_back( newWire );
2355 if(
test->IsConnected( aPoint ) && !newWire )
2359 newWire = makeNewWire( aCommit,
test, aSelectedItem, aPoint, aPoint );
2361 aList.push_back( newWire );
2370 aList.push_back(
test );
2405 aList.push_back( label );
2410 info.attachedLine = line;
2419 else if(
test->IsConnected( aPoint ) && !newWire )
2423 newWire = makeNewWire( aCommit,
test, aSelectedItem, aPoint, aPoint );
2425 aList.push_back( newWire );
2451 if( line->
HitTest( point, 1 ) )
2454 aList.push_back(
test );
2457 std::vector<VECTOR2I> ends =
test->GetConnectionPoints();
2460 if( ends[0] == point )
2484 static int moveCallCount = 0;
2485 wxLogTrace(
traceSchMove,
"moveItem[%d]: type=%d, delta=(%d,%d)",
2486 ++moveCallCount, aItem->
Type(), aDelta.
x, aDelta.
y );
2488 switch( aItem->
Type() )
2494 static_cast<SCH_LINE*
>( aItem )->Move( aDelta );
2539 label->
Move( aDelta );
2545 static_cast<SCH_ITEM*
>( aItem )->Move( aDelta );
2581 if( !it->IsSelected() )
2584 if( !selection.
IsHover() && it->IsSelected() )
2587 it->SetStoredPos( it->GetPosition() );
2592 pin->SetStoredPos(
pin->GetPosition() );
2612 std::vector<EDA_ITEM*> items( selection.
begin(), selection.
end() );
2621 m_frame->Schematic().CleanUp( &commit );
2622 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.
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.
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.
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
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