63#define QUIET_MODE true
68 switch( aItem->
Type() )
76 return static_cast<const SCH_LINE*
>( aItem )->IsGraphicLine();
85 if( !aNewLine || !aSource || !aFrame )
96 if( !sourceConnection )
104 newConnection->
Clone( *sourceConnection );
194 bool foundAttachment =
false;
195 bool foundJunction =
false;
196 bool foundPin =
false;
201 foundAttachment =
true;
205 switch( cItem->Type() )
221 if( !foundLine && cLine->
GetLength() == 0 )
227 foundJunction =
true;
237 if( pair.first->IsConnected( selectedEnd ) )
257 bool preferOriginalLine =
false;
261 && line->GetLength() == 0
262 &&
EDA_ANGLE( splitDelta ).IsParallelTo( line->GetStoredAngle() ) )
264 preferOriginalLine =
true;
270 else if( !foundLine && foundJunction && !foundPin )
273 foundLine =
new SCH_LINE( unselectedEnd, line->GetLayer() );
290 if( foundLine && !preferOriginalLine )
311 else if( foundLine->
GetEndPoint() == unselectedEnd )
312 foundLine->
MoveEnd( splitDelta );
344 if(
info.attachedLine == bendLine ||
info.attachedLine == foundLine )
345 info.attachedLine = line;
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;
716 grid.SetSnap(
false );
722 if( axisLock == AXIS_LOCK::HORIZONTAL )
728 axisLock = AXIS_LOCK::NONE;
734 axisLock = AXIS_LOCK::HORIZONTAL;
739 if( axisLock == AXIS_LOCK::VERTICAL )
745 axisLock = AXIS_LOCK::NONE;
751 axisLock = AXIS_LOCK::VERTICAL;
755 lastArrowKeyAction = action;
762 if( axisLock == AXIS_LOCK::HORIZONTAL )
764 else if( axisLock == AXIS_LOCK::VERTICAL )
769 selectionIsGraphicsOnly, ctrlDown );
771 if( sheet != hoverSheet )
778 m_frame->UpdateItem( hoverSheet,
false );
784 if( netCollisionMonitor )
785 currentCursor = netCollisionMonitor->AdjustCursor( currentCursor );
797 std::vector<SCH_ITEM*> previewItems;
800 previewItems.push_back(
static_cast<SCH_ITEM*
>( it ) );
803 previewItems.push_back( line );
806 previewItems.push_back( line );
808 std::vector<SCH_JUNCTION*> previewJunctions =
811 if( netCollisionMonitor )
812 netCollisionMonitor->Update( previewJunctions, selection );
815 m_view->AddToPreview( jct,
true );
829 m_frame->GetInfoBar()->Dismiss();
846 case MOVE:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel move." ) );
break;
847 case DRAG:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel drag." ) );
break;
848 case BREAK:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel break." ) );
break;
849 case SLICE:
m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel slice." ) );
break;
857 restore_state =
true;
871 wxLogTrace(
traceSchMove,
"doMoveSelection: handleMoveToolActions returned false, exiting" );
890 didAtLeastOneBreak =
true;
929 wxLogTrace(
traceSchMove,
"doMoveSelection: event handled, not passing" );
938 }
while( ( evt =
Wait() ) );
942 if( selectionHasSheetPins || ( selectionIsGraphicsOnly && !lastCtrlDown ) )
943 targetSheet =
nullptr;
948 m_frame->UpdateItem( hoverSheet,
false );
978 return !restore_state;
990 if( aCurrentModeIsDragLike != aWasDragging )
994 if( sel && !sel->
IsNew() )
1023 if( userSelection.
GetSize() == 1 )
1042 aUnselect = selection.
IsHover();
1049 bool& aHasGraphicItems,
bool& aHasNonGraphicItems,
1050 bool& aIsGraphicsOnly )
1052 aHasSheetPins =
false;
1053 aHasGraphicItems =
false;
1054 aHasNonGraphicItems =
false;
1056 for(
EDA_ITEM* edaItem : aSelection )
1061 aHasSheetPins =
true;
1064 aHasGraphicItems =
true;
1066 aHasNonGraphicItems =
true;
1069 aIsGraphicsOnly = aHasGraphicItems && !aHasNonGraphicItems;
1085 std::vector<SCH_ITEM*> stageTwo;
1087 for(
EDA_ITEM* edaItem : aSelection )
1090 std::vector<VECTOR2I> connections;
1092 switch( item->
Type() )
1098 stageTwo.emplace_back( item );
1102 static_cast<SCH_LINE*
>( item )->GetSelectedPoints( connections );
1109 for(
const VECTOR2I& point : connections )
1117 for(
const VECTOR2I& point : item->GetConnectionPoints() )
1121 for(
EDA_ITEM* item : connectedDragItems )
1129 for(
EDA_ITEM* edaItem : aSelection )
1152 static_cast<SCH_ITEM*
>( item )->GetEndPoints( aInternalPoints );
1154 std::vector<DANGLING_END_ITEM> endPointsByType = aInternalPoints;
1155 std::vector<DANGLING_END_ITEM> endPointsByPos = endPointsByType;
1159 static_cast<SCH_ITEM*
>( item )->UpdateDanglingState( endPointsByType, endPointsByPos );
1164 std::vector<DANGLING_END_ITEM>& aInternalPoints,
1170 bool placingNewItems = sch_item && sch_item->
IsNew();
1178 aInternalPoints.clear();
1185 if( !it->IsSelected() )
1198 for(
EDA_ITEM* edaItem : aSelection )
1215 if( !
info.isJunction )
1229 aSnapLayer =
grid.GetSelectionGrid( aSelection );
1235 if( schItem->
IsNew() )
1246 enteredGroup->AddItem( schItem );
1263 shape->SetHatchingDirty();
1264 shape->UpdateHatching();
1291 wxASSERT_MSG(
m_anchorPos,
"Should be already set from previous cmd" );
1293 else if( placingNewItems )
1301 bool isPasted =
false;
1307 if( item->GetParent() && item->GetParent()->IsSelected() )
1313 isPasted |= ( item->GetFlags() &
IS_PASTED ) != 0;
1320 aSelection.SetReferencePoint(
m_cursor );
1333 if(
m_frame->GetMoveWarpsCursor() )
1353 bool aHasSheetPins,
bool aIsGraphicsOnly,
bool aCtrlDown )
1369 selBBox.
Merge( schIt->GetBoundingBox() );
1410 if( sheet->
GetPin( pt ) )
1422 bool dropAllowedBySelection = !aHasSheetPins;
1423 bool dropAllowedByModifiers = !aIsGraphicsOnly || aCtrlDown;
1425 if( sheet && !( dropAllowedBySelection && dropAllowedByModifiers ) )
1433 SCH_COMMIT* aCommit,
int& aXBendCount,
int& aYBendCount,
1436 wxLogTrace(
traceSchMove,
"performItemMove: delta=(%d,%d), moveOffset=(%d,%d), selection size=%u",
1443 std::vector<VECTOR2I> splitMoves;
1452 splitMoves.emplace_back(
VECTOR2I( aDelta.
x, 0 ) );
1462 splitMoves.emplace_back(
VECTOR2I( 0, aDelta.
y ) );
1468 for(
const VECTOR2I& splitDelta : splitMoves )
1471 if( splitDelta ==
VECTOR2I( 0, 0 ) )
1475 ( aDelta.
y >= 0 ) ) )
1478 if( item->GetParent() && item->GetParent()->IsSelected() )
1482 bool isLineModeConstrained =
false;
1488 if( (
m_mode ==
DRAG ) && isLineModeConstrained && line
1491 orthoLineDrag( aCommit, line, splitDelta, aXBendCount, aYBendCount, aGrid );
1504 if( lineEnd.second && lineEnd.first->HasFlag(
STARTPOINT ) )
1505 lineEnd.first->SetStartPoint(
pin->GetPosition() );
1506 else if( !lineEnd.second && lineEnd.first->HasFlag(
ENDPOINT ) )
1507 lineEnd.first->SetEndPoint(
pin->GetPosition() );
1520 wxLogTrace(
traceSchMove,
"handleMoveToolActions: received event, action=%s",
1521 aEvent->
Format().c_str() );
1525 wxLogTrace(
traceSchMove,
"handleMoveToolActions: doDelete, exiting move" );
1526 const_cast<TOOL_EVENT*
>( aEvent )->SetPassEvent();
1537 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCW event received, selection size=%u",
1540 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCW RunSynchronousAction completed" );
1542 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCW updateStoredPositions completed" );
1547 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCCW event received, selection size=%u",
1550 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCCW RunSynchronousAction completed" );
1552 wxLogTrace(
traceSchMove,
"handleMoveToolActions: rotateCCW updateStoredPositions completed" );
1611 m_frame->SelectUnit( symbol, unit );
1623 m_frame->SelectBodyStyle( symbol, bodyStyle );
1644 wxLogTrace(
traceSchMove,
"updateStoredPositions: start, selection size=%u",
1663 wxLogTrace(
traceSchMove,
" item[%d] type=%d: stored pos updated (%d,%d) -> (%d,%d)",
1664 itemCount++, (
int) schItem->
Type(), oldPos.
x, oldPos.
y, newPos.
x, newPos.
y );
1674 pin->SetStoredPos( pinNewPos );
1675 wxLogTrace(
traceSchMove,
" sheet pin: stored pos updated (%d,%d) -> (%d,%d)",
1676 pinOldPos.
x, pinOldPos.
y, pinNewPos.
x, pinNewPos.
y );
1681 wxLogTrace(
traceSchMove,
"updateStoredPositions: complete, updated %d items", itemCount );
1686 const std::vector<DANGLING_END_ITEM>& aInternalPoints )
1695 newLine->ClearEditFlags();
1702 oldLine->ClearEditFlags();
1717 sch_item->SetConnectivityDirty(
true );
1731 if(
m_frame->GetScreen()->IsExplicitJunctionNeeded( it.GetPosition() ) )
1741 selectionCopy.
Add( line );
1744 selectionCopy.
Add( line );
1751 if( isDragLike && !isSlice )
1758 m_frame->Schematic().CleanUp( aCommit );
1761 item->ClearEditFlags();
1765 for(
EDA_ITEM* item : selectionCopy )
1766 item->ClearEditFlags();
1787 bbox.
Merge(
static_cast<SCH_ITEM*
>( item )->GetBoundingBox() );
1791 bool overlap =
false;
1796 moved.Move( offset );
1801 if(
moved.Intersects( existing->GetBoundingBox() ) )
1817 m_frame->RemoveFromScreen( schItem, srcScreen );
1820 schItem->
Move( offset );
1823 destScreen->
Append( schItem );
1837 std::set<SCH_ITEM*> danglers;
1839 std::function<void(
SCH_ITEM* )> changeHandler =
1840 [&](
SCH_ITEM* aChangedItem ) ->
void
1847 if( aChangedItem->HasFlag(
IS_BROKEN) && aChangedItem->IsDangling()
1848 && !aChangedItem->IsSelected() )
1850 danglers.insert( aChangedItem );
1854 m_frame->GetScreen()->TestDanglingEnds(
nullptr, &changeHandler );
1878 for(
SCH_ITEM* item : itemsOverlapping )
1880 if( item != aOriginalItem && item->
IsConnected( aPoint ) )
1883 foundJunction = item;
1889 if( foundSymbol && foundJunction )
1891 aList.push_back( foundSymbol );
1897 aList.push_back( foundJunction );
1904 if(
test == aOriginalItem || !
test->CanConnect( aOriginalItem ) )
1907 switch(
test->Type() )
1923 if(
test->IsConnected( aPoint ) )
1924 aList.push_back(
test );
1929 if(
static_cast<SCH_LINE*
>(
test )->HitTest( label->GetPosition(), 1 ) )
1930 aList.push_back(
test );
1943 if(
pin->IsConnected( aPoint ) )
1945 if(
pin->IsSelected() )
1948 aList.push_back(
pin );
1958 if(
test->IsConnected( aPoint ) )
1959 aList.push_back(
test );
1974 aList.push_back( label );
1986 if( line->
HitTest( aPoint, 1 ) )
1987 aList.push_back( label );
2004 std::vector<SCH_ITEM*> itemsConnectable;
2005 bool ptHasUnselectedJunction =
false;
2036 else if( fixedLine )
2049 auto makeNewJunction =
2066 for(
SCH_ITEM* item : itemsOverlappingRTree )
2074 if( !
pin->IsSelected()
2075 &&
pin->GetPosition() == aPoint
2076 &&
pin->CanConnect( aSelectedItem ) )
2078 itemsConnectable.push_back(
pin );
2087 if( item == aSelectedItem
2088 || ( item->Type() !=
SCH_LINE_T && item->IsSelected() )
2094 itemsConnectable.push_back( item );
2097 for(
SCH_ITEM* item : itemsConnectable )
2099 if( item->Type() ==
SCH_JUNCTION_T && item->IsConnected( aPoint ) && !item->IsSelected() )
2101 ptHasUnselectedJunction =
true;
2118 if( ptHasUnselectedJunction )
2138 aList.push_back( line );
2152 aList.push_back( line );
2157 switch( aSelectedItem->
Type() )
2171 newWire = makeNewWire( aCommit, line, aSelectedItem, aPoint, aPoint );
2174 aList.push_back( newWire );
2184 makeNewWire( aCommit, line, line, aPoint, oldEnd );
2185 makeNewJunction( aCommit, line, aPoint );
2217 aList.push_back( label );
2220 info.attachedLine = line;
2232 if(
pin->IsConnected( aPoint ) )
2243 newWire = makeNewWire( aCommit,
pin, aSelectedItem, aPoint, aPoint );
2245 aList.push_back( newWire );
2254 if(
test->IsConnected( aPoint ) && !newWire )
2258 newWire = makeNewWire( aCommit,
test, aSelectedItem, aPoint, aPoint );
2260 aList.push_back( newWire );
2269 aList.push_back(
test );
2304 aList.push_back( label );
2309 info.attachedLine = line;
2316 else if(
test->IsConnected( aPoint ) && !newWire )
2320 newWire = makeNewWire( aCommit,
test, aSelectedItem, aPoint, aPoint );
2322 aList.push_back( newWire );
2348 if( line->
HitTest( point, 1 ) )
2351 aList.push_back(
test );
2354 std::vector<VECTOR2I> ends =
test->GetConnectionPoints();
2357 if( ends[0] == point )
2381 static int moveCallCount = 0;
2382 wxLogTrace(
traceSchMove,
"moveItem[%d]: type=%d, delta=(%d,%d)",
2383 ++moveCallCount, aItem->
Type(), aDelta.
x, aDelta.
y );
2385 switch( aItem->
Type() )
2391 static_cast<SCH_LINE*
>( aItem )->Move( aDelta );
2439 SEG currentLine(
info.attachedLine->GetStartPoint(),
info.attachedLine->GetEndPoint() );
2444 label->
Move( aDelta );
2451 static_cast<SCH_ITEM*
>( aItem )->Move( aDelta );
2484 if( !it->IsSelected() )
2487 if( !selection.
IsHover() && it->IsSelected() )
2490 it->SetStoredPos( it->GetPosition() );
2495 pin->SetStoredPos(
pin->GetPosition() );
2515 std::vector<EDA_ITEM*> items( selection.
begin(), selection.
end() );
2524 m_frame->Schematic().CleanUp( &commit );
2525 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.
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