60#define QUIET_MODE true
65 switch( aItem->
Type() )
73 return static_cast<const SCH_LINE*
>( aItem )->IsGraphicLine();
82 if( !aNewLine || !aSource || !aFrame )
93 if( !sourceConnection )
101 newConnection->
Clone( *sourceConnection );
157 bool foundAttachment =
false;
158 bool foundJunction =
false;
159 bool foundPin =
false;
164 foundAttachment =
true;
168 switch( cItem->Type() )
184 if( !foundLine && cLine->
GetLength() == 0 )
190 foundJunction =
true;
200 if( pair.first->IsConnected( selectedEnd ) )
220 bool preferOriginalLine =
false;
224 && line->GetLength() == 0
225 &&
EDA_ANGLE( splitDelta ).IsParallelTo( line->GetStoredAngle() ) )
227 preferOriginalLine =
true;
233 else if( !foundLine && foundJunction && !foundPin )
236 foundLine =
new SCH_LINE( unselectedEnd, line->GetLayer() );
253 if( foundLine && !preferOriginalLine )
274 else if( foundLine->
GetEndPoint() == unselectedEnd )
275 foundLine->
MoveEnd( splitDelta );
329 line->MoveEnd( splitDelta );
331 line->MoveStart( splitDelta );
336 else if( line->GetLength() == 0 )
346 else if( foundAttachment && line->IsOrthogonal() )
353 unsigned int xMoveBit = splitDelta.
x != 0;
354 unsigned int yMoveBit = splitDelta.
y != 0;
355 int xLength = abs( unselectedEnd.
x - selectedEnd.
x );
356 int yLength = abs( unselectedEnd.
y - selectedEnd.
y );
357 int xMove = ( xLength - ( xBendCount * lineGrid.
x ) )
358 *
sign( selectedEnd.
x - unselectedEnd.
x );
359 int yMove = ( yLength - ( yBendCount * lineGrid.
y ) )
360 *
sign( selectedEnd.
y - unselectedEnd.
y );
382 xBendCount += yMoveBit;
383 yBendCount += xMoveBit;
388 line->MoveEnd(
VECTOR2I( splitDelta.
x ? splitDelta.
x : xMove,
389 splitDelta.
y ? splitDelta.
y : yMove ) );
393 line->MoveStart(
VECTOR2I( splitDelta.
x ? splitDelta.
x : xMove,
394 splitDelta.
y ? splitDelta.
y : yMove ) );
415 else if( !foundAttachment )
418 line->MoveEnd( splitDelta );
420 line->MoveStart( splitDelta );
432 bool isSlice =
false;
464 bool isLineModeConstrained =
false;
477 if( sel && !sel->
IsNew() )
510 if( userSelection.
GetSize() == 1 )
530 bool unselect = selection.
IsHover();
533 std::vector<DANGLING_END_ITEM> internalPoints;
535 bool selectionHasSheetPins =
false;
536 bool selectionHasGraphicItems =
false;
537 bool selectionHasNonGraphicItems =
false;
538 bool selectionIsGraphicsOnly =
false;
540 std::unique_ptr<SCH_DRAG_NET_COLLISION_MONITOR> netCollisionMonitor;
542 auto refreshSelectionTraits = [&]()
544 selectionHasSheetPins =
false;
545 selectionHasGraphicItems =
false;
546 selectionHasNonGraphicItems =
false;
548 for(
EDA_ITEM* edaItem : selection )
553 selectionHasSheetPins =
true;
556 selectionHasGraphicItems =
true;
558 selectionHasNonGraphicItems =
true;
561 selectionIsGraphicsOnly = selectionHasGraphicItems && !selectionHasNonGraphicItems;
564 refreshSelectionTraits();
566 if( !selection.
Empty() )
568 netCollisionMonitor = std::make_unique<SCH_DRAG_NET_COLLISION_MONITOR>(
m_frame,
m_view );
569 netCollisionMonitor->Initialize( selection );
572 bool lastCtrlDown =
false;
581 if( selection.
Empty() )
589 bool restore_state =
false;
601 m_frame->GetCanvas()->SetCurrentCursor( currentCursor );
606 lastCtrlDown = ctrlDown;
615 refreshSelectionTraits();
620 bool placingNewItems = sch_item && sch_item->
IsNew();
628 internalPoints.clear();
635 if( !it->IsSelected() )
648 std::vector<SCH_ITEM*> stageTwo;
650 for(
EDA_ITEM* edaItem : selection )
653 std::vector<VECTOR2I> connections;
655 switch( item->
Type() )
661 stageTwo.emplace_back(item);
665 static_cast<SCH_LINE*
>( item )->GetSelectedPoints( connections );
671 for(
const VECTOR2I& point : connections )
679 for(
const VECTOR2I& point : item->GetConnectionPoints() )
683 for(
EDA_ITEM* item : connectedDragItems )
691 for(
EDA_ITEM* edaItem : selection )
712 static_cast<SCH_ITEM*
>( item )->GetEndPoints( internalPoints );
714 std::vector<DANGLING_END_ITEM> endPointsByType = internalPoints;
715 std::vector<DANGLING_END_ITEM> endPointsByPos = endPointsByType;
719 static_cast<SCH_ITEM*
>( item )->UpdateDanglingState( endPointsByType, endPointsByPos );
725 for(
EDA_ITEM* edaItem : selection )
747 snapLayer =
grid.GetSelectionGrid( selection );
753 if( schItem->
IsNew() )
764 enteredGroup->AddItem( schItem );
781 shape->SetHatchingDirty();
782 shape->UpdateHatching();
801 wxASSERT_MSG(
m_anchorPos,
"Should be already set from previous cmd" );
803 else if( placingNewItems )
811 bool isPasted =
false;
817 if( item->GetParent() && item->GetParent()->IsSelected() )
823 isPasted |= ( item->GetFlags() &
IS_PASTED ) != 0;
831 selection.SetReferencePoint(
m_cursor );
844 if(
m_frame->GetMoveWarpsCursor() )
848 selection.SetReferencePoint(
m_cursor );
863 refreshSelectionTraits();
872 snapLayer, selection );
886 selBBox.
Merge( schIt->GetBoundingBox() );
913 bool dropAllowedBySelection = !selectionHasSheetPins;
914 bool dropAllowedByModifiers = !selectionIsGraphicsOnly || ctrlDown;
916 if( sheet && !( dropAllowedBySelection && dropAllowedByModifiers ) )
919 if( sheet != hoverSheet )
926 m_frame->UpdateItem( hoverSheet,
false );
932 if( netCollisionMonitor )
933 currentCursor = netCollisionMonitor->AdjustCursor( currentCursor );
943 std::vector<VECTOR2I> splitMoves;
974 for(
const VECTOR2I& splitDelta : splitMoves )
977 if( splitDelta ==
VECTOR2I( 0, 0 ) )
984 if( item->GetParent() && item->GetParent()->IsSelected() )
991 if(
m_isDrag && isLineModeConstrained
1007 if( lineEnd.second && lineEnd.first->HasFlag(
STARTPOINT ) )
1008 lineEnd.first->SetStartPoint(
pin->GetPosition() );
1009 else if( !lineEnd.second && lineEnd.first->HasFlag(
ENDPOINT ) )
1010 lineEnd.first->SetEndPoint(
pin->GetPosition() );
1018 std::vector<SCH_ITEM*> previewItems;
1021 previewItems.push_back(
static_cast<SCH_ITEM*
>( it ) );
1024 previewItems.push_back( line );
1027 previewItems.push_back( line );
1029 std::vector<SCH_JUNCTION*> previewJunctions =
1032 if( netCollisionMonitor )
1033 netCollisionMonitor->Update( previewJunctions, selection );
1037 m_view->AddToPreview( jct,
true );
1051 m_frame->GetInfoBar()->Dismiss();
1061 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel drag." ) );
1063 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel move." ) );
1070 restore_state =
true;
1153 m_frame->SelectUnit( symbol, unit );
1165 m_frame->SelectBodyStyle( symbol, bodyStyle );
1198 }
while( ( evt =
Wait() ) );
1202 if( selectionHasSheetPins || ( selectionIsGraphicsOnly && !lastCtrlDown ) )
1203 targetSheet =
nullptr;
1208 m_frame->UpdateItem( hoverSheet,
false );
1225 selectionCopy.
Add( line );
1228 selectionCopy.
Add( line );
1233 newLine->ClearEditFlags();
1240 oldLine->ClearEditFlags();
1264 sch_item->SetConnectivityDirty(
true );
1267 if( selection.GetSize() == 1 && selection.Front()->IsNew() )
1268 m_frame->SaveCopyForRepeatItem(
static_cast<SCH_ITEM*
>( selection.Front() ) );
1278 if(
m_frame->GetScreen()->IsExplicitJunctionNeeded( it.GetPosition()) )
1294 m_frame->Schematic().CleanUp( aCommit );
1298 item->ClearEditFlags();
1302 for(
EDA_ITEM* item : selectionCopy )
1303 item->ClearEditFlags();
1318 return !restore_state;
1331 bbox.
Merge(
static_cast<SCH_ITEM*
>( item )->GetBoundingBox() );
1335 bool overlap =
false;
1340 moved.Move( offset );
1345 if(
moved.Intersects( existing->GetBoundingBox() ) )
1361 m_frame->RemoveFromScreen( schItem, srcScreen );
1364 schItem->
Move( offset );
1367 destScreen->
Append( schItem );
1381 std::set<SCH_ITEM*> danglers;
1383 std::function<void(
SCH_ITEM* )> changeHandler =
1384 [&](
SCH_ITEM* aChangedItem ) ->
void
1391 if( aChangedItem->HasFlag(
IS_BROKEN) && aChangedItem->IsDangling()
1392 && !aChangedItem->IsSelected() )
1394 danglers.insert( aChangedItem );
1398 m_frame->GetScreen()->TestDanglingEnds(
nullptr, &changeHandler );
1423 for(
SCH_ITEM* item : itemsOverlapping )
1425 if( item != aOriginalItem && item->
IsConnected( aPoint ) )
1428 foundJunction = item;
1434 if( foundSymbol && foundJunction )
1436 aList.push_back( foundSymbol );
1442 aList.push_back( foundJunction );
1449 if(
test == aOriginalItem || !
test->CanConnect( aOriginalItem ) )
1452 switch(
test->Type() )
1468 if(
test->IsConnected( aPoint ) )
1469 aList.push_back(
test );
1474 if(
static_cast<SCH_LINE*
>(
test )->HitTest( label->GetPosition(), 1 ) )
1475 aList.push_back(
test );
1488 if(
pin->IsConnected( aPoint ) )
1490 if(
pin->IsSelected() )
1493 aList.push_back(
pin );
1503 if(
test->IsConnected( aPoint ) )
1504 aList.push_back(
test );
1519 aList.push_back( label );
1531 if( line->
HitTest( aPoint, 1 ) )
1532 aList.push_back( label );
1549 std::vector<SCH_ITEM*> itemsConnectable;
1550 bool ptHasUnselectedJunction =
false;
1581 else if( fixedLine )
1594 auto makeNewJunction =
1611 for(
SCH_ITEM* item : itemsOverlappingRTree )
1619 if( !
pin->IsSelected()
1621 &&
pin->CanConnect( aSelectedItem ) )
1623 itemsConnectable.push_back(
pin );
1632 if( item == aSelectedItem
1633 || ( item->Type() !=
SCH_LINE_T && item->IsSelected() )
1639 itemsConnectable.push_back( item );
1642 for(
SCH_ITEM* item : itemsConnectable )
1644 if( item->Type() ==
SCH_JUNCTION_T && item->IsConnected( aPoint ) && !item->IsSelected() )
1646 ptHasUnselectedJunction =
true;
1663 if( ptHasUnselectedJunction )
1683 aList.push_back( line );
1697 aList.push_back( line );
1702 switch( aSelectedItem->
Type() )
1716 newWire = makeNewWire( aCommit, line, aSelectedItem, aPoint, aPoint );
1719 aList.push_back( newWire );
1729 makeNewWire( aCommit, line, line, aPoint, oldEnd );
1730 makeNewJunction( aCommit, line, aPoint );
1762 aList.push_back( label );
1765 info.attachedLine = line;
1777 if(
pin->IsConnected( aPoint ) )
1788 newWire = makeNewWire( aCommit,
pin, aSelectedItem, aPoint, aPoint );
1790 aList.push_back( newWire );
1799 if(
test->IsConnected( aPoint ) && !newWire )
1803 newWire = makeNewWire( aCommit,
test, aSelectedItem, aPoint, aPoint );
1805 aList.push_back( newWire );
1814 aList.push_back(
test );
1849 aList.push_back( label );
1854 info.attachedLine = line;
1861 else if(
test->IsConnected( aPoint ) && !newWire )
1865 newWire = makeNewWire( aCommit,
test, aSelectedItem, aPoint, aPoint );
1867 aList.push_back( newWire );
1893 if( line->
HitTest( point, 1 ) )
1896 aList.push_back(
test );
1899 std::vector<VECTOR2I> ends =
test->GetConnectionPoints();
1902 if( ends[0] == point )
1926 switch( aItem->
Type() )
1968 pin->SetStoredPos(
pin->GetStoredPos() + aDelta );
1969 pin->ConstrainOnEdge(
pin->GetStoredPos(),
true );
1983 SEG currentLine(
info.attachedLine->GetStartPoint(),
info.attachedLine->GetEndPoint() );
1988 label->
Move( aDelta );
1995 static_cast<SCH_ITEM*
>( aItem )->Move( aDelta );
2028 if( !it->IsSelected() )
2031 if( !selection.
IsHover() && it->IsSelected() )
2034 it->SetStoredPos( it->GetPosition() );
2039 pin->SetStoredPos(
pin->GetPosition() );
2051 for(
int ii = 0; ii < 2; ++ii )
2058 std::set<EDA_ITEM*> unique_items( drag_items.begin(), drag_items.end() );
2064 for(
EDA_ITEM* dragItem : unique_items )
2066 if( dragItem->GetParent() && dragItem->GetParent()->IsSelected() )
2069 doMoveItem( dragItem,
delta );
2079 doMoveItem( item,
delta );
2086 VECTOR2I tl_delta =
grid.AlignGrid( topLeft, selectionGrid ) - topLeft;
2087 VECTOR2I br_delta =
grid.AlignGrid( bottomRight, selectionGrid ) - bottomRight;
2091 doMoveItem( sheet, tl_delta );
2103 newPos =
pin->GetPosition() + tl_delta;
2105 newPos =
pin->GetPosition() + br_delta;
2117 for(
EDA_ITEM* dragItem : drag_items )
2119 if( dragItem->GetParent() && dragItem->GetParent()->IsSelected() )
2122 doMoveItem( dragItem,
delta );
2133 for(
const VECTOR2I& point : connections )
2136 std::map<VECTOR2I, int> shifts;
2140 for(
const VECTOR2I& conn : connections )
2142 VECTOR2I gridpt =
grid.AlignGrid( conn, selectionGrid ) - conn;
2146 if( shifts[gridpt] > max_count )
2148 most_common = gridpt;
2149 max_count = shifts[most_common];
2153 if( most_common !=
VECTOR2I( 0, 0 ) )
2155 doMoveItem( item, most_common );
2157 for(
EDA_ITEM* dragItem : drag_items )
2159 if( dragItem->GetParent() && dragItem->GetParent()->IsSelected() )
2162 doMoveItem( dragItem, most_common );
2174 m_frame->Schematic().CleanUp( &commit );
2175 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.
static TOOL_ACTION rotateCCW
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.
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)
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.
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
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...
@ 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.
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