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() )
 
 1199    for( 
EDA_ITEM* edaItem : aSelection )
 
 1223    aSnapLayer = 
grid.GetSelectionGrid( aSelection );
 
 1229        if( schItem->
IsNew() )
 
 1241                    enteredGroup->AddItem( schItem );
 
 1258            shape->SetHatchingDirty();
 
 1259            shape->UpdateHatching();
 
 1286        wxASSERT_MSG( 
m_anchorPos, 
"Should be already set from previous cmd" );
 
 1288    else if( placingNewItems )
 
 1296        bool     isPasted = 
false;
 
 1302            if( item->GetParent() && item->GetParent()->IsSelected() )
 
 1308            isPasted |= ( item->GetFlags() & 
IS_PASTED ) != 0;
 
 1315            aSelection.SetReferencePoint( 
m_cursor );
 
 1328        if( 
m_frame->GetMoveWarpsCursor() )
 
 
 1348                                           const VECTOR2I& aCursorPos, 
bool aHasSheetPins,
 
 1349                                           bool aIsGraphicsOnly, 
bool aCtrlDown )
 
 1366                selBBox.
Merge( schIt->GetBoundingBox() );
 
 1394    bool dropAllowedBySelection = !aHasSheetPins;
 
 1395    bool dropAllowedByModifiers = !aIsGraphicsOnly || aCtrlDown;
 
 1397    if( sheet && !( dropAllowedBySelection && dropAllowedByModifiers ) )
 
 
 1405                                     SCH_COMMIT* aCommit, 
int& aXBendCount, 
int& aYBendCount,
 
 1408    wxLogTrace( 
traceSchMove, 
"performItemMove: delta=(%d,%d), moveOffset=(%d,%d), selection size=%u",
 
 1415    std::vector<VECTOR2I> splitMoves;
 
 1424        splitMoves.emplace_back( 
VECTOR2I( aDelta.
x, 0 ) );
 
 1434        splitMoves.emplace_back( 
VECTOR2I( 0, aDelta.
y ) );
 
 1440    for( 
const VECTOR2I& splitDelta : splitMoves )
 
 1443        if( splitDelta == 
VECTOR2I( 0, 0 ) )
 
 1447                                                                    ( aDelta.
y >= 0 ) ) )
 
 1450            if( item->GetParent() && item->GetParent()->IsSelected() )
 
 1454            bool      isLineModeConstrained = 
false;
 
 1460            if( ( 
m_mode == 
DRAG ) && isLineModeConstrained && line
 
 1463                orthoLineDrag( aCommit, line, splitDelta, aXBendCount, aYBendCount, aGrid );
 
 1476                if( lineEnd.second && lineEnd.first->HasFlag( 
STARTPOINT ) )
 
 1477                    lineEnd.first->SetStartPoint( 
pin->GetPosition() );
 
 1478                else if( !lineEnd.second && lineEnd.first->HasFlag( 
ENDPOINT ) )
 
 1479                    lineEnd.first->SetEndPoint( 
pin->GetPosition() );
 
 
 1492    wxLogTrace( 
traceSchMove, 
"handleMoveToolActions: received event, action=%s",
 
 1493                aEvent->
Format().c_str() );
 
 1497        wxLogTrace( 
traceSchMove, 
"handleMoveToolActions: doDelete, exiting move" );
 
 1498        const_cast<TOOL_EVENT*
>( aEvent )->SetPassEvent();
 
 1509        wxLogTrace( 
traceSchMove, 
"handleMoveToolActions: rotateCW event received, selection size=%u",
 
 1512        wxLogTrace( 
traceSchMove, 
"handleMoveToolActions: rotateCW RunSynchronousAction completed" );
 
 1514        wxLogTrace( 
traceSchMove, 
"handleMoveToolActions: rotateCW updateStoredPositions completed" );
 
 1519        wxLogTrace( 
traceSchMove, 
"handleMoveToolActions: rotateCCW event received, selection size=%u",
 
 1522        wxLogTrace( 
traceSchMove, 
"handleMoveToolActions: rotateCCW RunSynchronousAction completed" );
 
 1524        wxLogTrace( 
traceSchMove, 
"handleMoveToolActions: rotateCCW updateStoredPositions completed" );
 
 1586                m_frame->SelectUnit( symbol, unit );
 
 1599                m_frame->SelectBodyStyle( symbol, bodyStyle );
 
 
 1620    wxLogTrace( 
traceSchMove, 
"updateStoredPositions: start, selection size=%u",
 
 1638        wxLogTrace( 
traceSchMove, 
"  item[%d] type=%d: stored pos updated (%d,%d) -> (%d,%d)",
 
 1639                    itemCount++, (
int) schItem->
Type(), oldPos.
x, oldPos.
y, newPos.
x, newPos.
y );
 
 1649                pin->SetStoredPos( pinNewPos );
 
 1650                wxLogTrace( 
traceSchMove, 
"    sheet pin: stored pos updated (%d,%d) -> (%d,%d)",
 
 1651                            pinOldPos.
x, pinOldPos.
y, pinNewPos.
x, pinNewPos.
y );
 
 1656    wxLogTrace( 
traceSchMove, 
"updateStoredPositions: complete, updated %d items", itemCount );
 
 
 1661                                           const std::vector<DANGLING_END_ITEM>& aInternalPoints )
 
 1670        newLine->ClearEditFlags();
 
 1677        oldLine->ClearEditFlags();
 
 1695            sch_item->SetConnectivityDirty( 
true );
 
 1709        if( 
m_frame->GetScreen()->IsExplicitJunctionNeeded( it.GetPosition() ) )
 
 1719        selectionCopy.
Add( line );
 
 1722        selectionCopy.
Add( line );
 
 1729    if( isDragLike && !isSlice )
 
 1736    m_frame->Schematic().CleanUp( aCommit );
 
 1739        item->ClearEditFlags();
 
 1743    for( 
EDA_ITEM* item : selectionCopy )
 
 1744        item->ClearEditFlags();
 
 
 1762        bbox.
Merge( 
static_cast<SCH_ITEM*
>( item )->GetBoundingBox() );
 
 1766    bool     overlap = 
false;
 
 1771        moved.Move( offset );
 
 1776            if( 
moved.Intersects( existing->GetBoundingBox() ) )
 
 1792        m_frame->RemoveFromScreen( schItem, srcScreen );
 
 1795        schItem->
Move( offset );
 
 1798        destScreen->
Append( schItem );
 
 
 1812    std::set<SCH_ITEM*> danglers;
 
 1814    std::function<void( 
SCH_ITEM* )> changeHandler =
 
 1815            [&]( 
SCH_ITEM* aChangedItem ) -> 
void 
 1822                if( aChangedItem->HasFlag( 
IS_BROKEN) && aChangedItem->IsDangling()
 
 1823                  && !aChangedItem->IsSelected() )
 
 1825                    danglers.insert( aChangedItem );
 
 1829    m_frame->GetScreen()->TestDanglingEnds( 
nullptr, &changeHandler );
 
 
 1854    for( 
SCH_ITEM* item : itemsOverlapping )
 
 1856        if( item != aOriginalItem && item->
IsConnected( aPoint ) )
 
 1859                foundJunction = item;
 
 1865    if( foundSymbol && foundJunction )
 
 1867        aList.push_back( foundSymbol );
 
 1873        aList.push_back( foundJunction );
 
 1880        if( 
test == aOriginalItem || !
test->CanConnect( aOriginalItem ) )
 
 1883        switch( 
test->Type() )
 
 1899            if( 
test->IsConnected( aPoint ) )
 
 1900                aList.push_back( 
test );
 
 1905                if( 
static_cast<SCH_LINE*
>( 
test )->HitTest( label->GetPosition(), 1 ) )
 
 1906                    aList.push_back( 
test );
 
 1919                    if( 
pin->IsConnected( aPoint ) )
 
 1921                        if( 
pin->IsSelected() )
 
 1924                        aList.push_back( 
pin );
 
 1934            if( 
test->IsConnected( aPoint ) )
 
 1935                aList.push_back( 
test );
 
 1950                    aList.push_back( label );
 
 1962                if( line->
HitTest( aPoint, 1 ) )
 
 1963                    aList.push_back( label );
 
 
 1980    std::vector<SCH_ITEM*> itemsConnectable;
 
 1981    bool              ptHasUnselectedJunction = 
false;
 
 2012                else if( fixedLine )
 
 2025    auto makeNewJunction =
 
 2042    for( 
SCH_ITEM* item : itemsOverlappingRTree )
 
 2050                if( !
pin->IsSelected()
 
 2052                    && 
pin->CanConnect( aSelectedItem ) )
 
 2054                    itemsConnectable.push_back( 
pin );
 
 2063        if( item == aSelectedItem
 
 2064            || ( item->Type() != 
SCH_LINE_T && item->IsSelected() )
 
 2070        itemsConnectable.push_back( item );
 
 2073    for( 
SCH_ITEM* item : itemsConnectable )
 
 2075        if( item->Type() == 
SCH_JUNCTION_T && item->IsConnected( aPoint ) && !item->IsSelected() )
 
 2077            ptHasUnselectedJunction = 
true;
 
 2094            if( ptHasUnselectedJunction )
 
 2114                    aList.push_back( line );
 
 2128                    aList.push_back( line );
 
 2133                switch( aSelectedItem->
Type() )
 
 2147                        newWire = makeNewWire( aCommit, line, aSelectedItem, aPoint, aPoint );
 
 2150                        aList.push_back( newWire );
 
 2160                            makeNewWire( aCommit, line, line, aPoint, oldEnd );
 
 2161                            makeNewJunction( aCommit, line, aPoint );
 
 2193                    aList.push_back( label );
 
 2196                    info.attachedLine = line;
 
 2208                if( 
pin->IsConnected( aPoint ) )
 
 2219                        newWire = makeNewWire( aCommit, 
pin, aSelectedItem, aPoint, aPoint );
 
 2221                        aList.push_back( newWire );
 
 2230            if( 
test->IsConnected( aPoint ) && !newWire )
 
 2234                newWire = makeNewWire( aCommit, 
test, aSelectedItem, aPoint, aPoint );
 
 2236                aList.push_back( newWire );
 
 2245                aList.push_back( 
test );
 
 2280                        aList.push_back( label );
 
 2285                            info.attachedLine = line;
 
 2292            else if( 
test->IsConnected( aPoint ) && !newWire )
 
 2296                newWire = makeNewWire( aCommit, 
test, aSelectedItem, aPoint, aPoint );
 
 2298                aList.push_back( newWire );
 
 2324                    if( line->
HitTest( point, 1 ) )
 
 2327                        aList.push_back( 
test );
 
 2330                        std::vector<VECTOR2I> ends = 
test->GetConnectionPoints();
 
 2333                        if( ends[0] == point )
 
 
 2357    static int moveCallCount = 0;
 
 2358    wxLogTrace( 
traceSchMove, 
"moveItem[%d]: type=%d, delta=(%d,%d)",
 
 2359                ++moveCallCount, aItem->
Type(), aDelta.
x, aDelta.
y );
 
 2361    switch( aItem->
Type() )
 
 2403        pin->SetStoredPos( 
pin->GetStoredPos() + aDelta );
 
 2404        pin->ConstrainOnEdge( 
pin->GetStoredPos(), 
true );
 
 2418            SEG currentLine( 
info.attachedLine->GetStartPoint(), 
info.attachedLine->GetEndPoint() );
 
 2423            label->
Move( aDelta );
 
 2430        static_cast<SCH_ITEM*
>( aItem )->Move( aDelta );
 
 
 2463        if( !it->IsSelected() )
 
 2466        if( !selection.
IsHover() && it->IsSelected() )
 
 2469        it->SetStoredPos( it->GetPosition() );
 
 2474                pin->SetStoredPos( 
pin->GetPosition() );
 
 2486            for( 
int ii = 0; ii < 2; ++ii )
 
 2493                std::set<EDA_ITEM*> unique_items( drag_items.begin(), drag_items.end() );
 
 2499                    for( 
EDA_ITEM* dragItem : unique_items )
 
 2501                        if( dragItem->GetParent() && dragItem->GetParent()->IsSelected() )
 
 2504                        doMoveItem( dragItem, 
delta );
 
 2514                doMoveItem( item, 
delta );
 
 2521            VECTOR2I   tl_delta = 
grid.AlignGrid( topLeft, selectionGrid ) - topLeft;
 
 2522            VECTOR2I   br_delta = 
grid.AlignGrid( bottomRight, selectionGrid ) - bottomRight;
 
 2526                doMoveItem( sheet, tl_delta );
 
 2538                    newPos = 
pin->GetPosition() + tl_delta;
 
 2540                    newPos = 
pin->GetPosition() + br_delta;
 
 2552                    for( 
EDA_ITEM* dragItem : drag_items )
 
 2554                        if( dragItem->GetParent() && dragItem->GetParent()->IsSelected() )
 
 2557                        doMoveItem( dragItem, 
delta );
 
 2568            for( 
const VECTOR2I& point : connections )
 
 2571            std::map<VECTOR2I, int> shifts;
 
 2575            for( 
const VECTOR2I& conn : connections )
 
 2577                VECTOR2I gridpt = 
grid.AlignGrid( conn, selectionGrid ) - conn;
 
 2581                if( shifts[gridpt] > max_count )
 
 2583                    most_common = gridpt;
 
 2584                    max_count = shifts[most_common];
 
 2588            if( most_common != 
VECTOR2I( 0, 0 ) )
 
 2590                doMoveItem( item, most_common );
 
 2592                for( 
EDA_ITEM* dragItem : drag_items )
 
 2594                    if( dragItem->GetParent() && dragItem->GetParent()->IsSelected() )
 
 2597                    doMoveItem( dragItem, most_common );
 
 2609    m_frame->Schematic().CleanUp( &commit );
 
 2610    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...
 
@ 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.
 
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