31using namespace std::placeholders;
 
   75    if( aDirection.
x != 0 || aDirection.
y != 0 )
 
   76        aDirections.push_back( aDirection );
 
 
   81    std::vector<VECTOR2I> directions;
 
   91    else if( 
dynamic_cast<EC_45DEGREE*
>( aConstraint ) )
 
   98    else if( 
dynamic_cast<EC_VERTICAL*
>( aConstraint ) )
 
  106    else if( 
EC_LINE* lineConstraint = 
dynamic_cast<EC_LINE*
>( aConstraint ) )
 
 
  189        wxArrayString strings;
 
 
  211        return wxT( 
"RECT_RADIUS_TEXT_ITEM" );
 
 
 
  247        if( aPoints.
SwapX() )
 
  248            std::swap( topLeft.
x, botRight.
x );
 
  250        if( aPoints.
SwapY() )
 
  251            std::swap( topLeft.
y, botRight.
y );
 
 
  304        PinEditedCorner( aEditedPoint, aPoints, topLeft, topRight, botLeft, botRight );
 
  312            setLeft( topLeft.
x );
 
  313            setRight( botRight.
x );
 
  314            setBottom( botRight.
y );
 
  319            aRectangle.
Move( moveVector );
 
  323            int width = 
std::abs( botRight.
x - topLeft.
x );
 
  324            int height = 
std::abs( botRight.
y - topLeft.
y );
 
  325            int maxRadius = std::min( width, height ) / 2;
 
  327            x = std::clamp( x, botRight.
x - maxRadius, botRight.
x );
 
  339            setLeft( topLeft.
x );
 
  344            setBottom( botRight.
y );
 
  349            setRight( botRight.
x );
 
  352        for( 
unsigned i = 0; i < aPoints.
LinesSize(); ++i )
 
 
  369        if( aPoints.
SwapX() )
 
  370            std::swap( topLeft.
x, botRight.
x );
 
  372        if( aPoints.
SwapY() )
 
  373            std::swap( topLeft.
y, botRight.
y );
 
 
  400                     std::vector<EDA_ITEM*>& aUpdatedItems )
 override 
 
  430                aTopLeft.
x = std::min( aTopLeft.
x, aHole.x - aHoleSize.
x / 2 - minWidth );
 
  431                aTopLeft.
y = std::min( aTopLeft.
y, aHole.y - aHoleSize.
y / 2 - minHeight );
 
  436                aTopLeft.
x = std::min( aTopLeft.
x, aBotRight.
x - minWidth );
 
  437                aTopLeft.
y = std::min( aTopLeft.
y, aBotRight.
y - minHeight );
 
  441            aTopRight.
y = aTopLeft.
y;
 
  442            aBotLeft.
x = aTopLeft.
x;
 
  449                aTopRight.
x = std::max( aTopRight.
x, aHole.x + aHoleSize.
x / 2 + minWidth );
 
  450                aTopRight.
y = std::min( aTopRight.
y, aHole.y - aHoleSize.
y / 2 - minHeight );
 
  455                aTopRight.
x = std::max( aTopRight.
x, aBotLeft.
x + minWidth );
 
  456                aTopRight.
y = std::min( aTopRight.
y, aBotLeft.
y - minHeight );
 
  460            aTopLeft.
y = aTopRight.
y;
 
  461            aBotRight.
x = aTopRight.
x;
 
  468                aBotLeft.
x = std::min( aBotLeft.
x, aHole.x - aHoleSize.
x / 2 - minWidth );
 
  469                aBotLeft.
y = std::max( aBotLeft.
y, aHole.y + aHoleSize.
y / 2 + minHeight );
 
  474                aBotLeft.
x = std::min( aBotLeft.
x, aTopRight.
x - minWidth );
 
  475                aBotLeft.
y = std::max( aBotLeft.
y, aTopRight.
y + minHeight );
 
  479            aBotRight.
y = aBotLeft.
y;
 
  480            aTopLeft.
x = aBotLeft.
x;
 
  487                aBotRight.
x = std::max( aBotRight.
x, aHole.x + aHoleSize.
x / 2 + minWidth );
 
  488                aBotRight.
y = std::max( aBotRight.
y, aHole.y + aHoleSize.
y / 2 + minHeight );
 
  493                aBotRight.
x = std::max( aBotRight.
x, aTopLeft.
x + minWidth );
 
  494                aBotRight.
y = std::max( aBotRight.
y, aTopLeft.
y + minHeight );
 
  498            aBotLeft.
y = aBotRight.
y;
 
  499            aTopRight.
x = aBotRight.
x;
 
  503            aTopLeft.
y = std::min( aTopLeft.
y, aBotRight.
y - minHeight );
 
  507            aTopLeft.
x = std::min( aTopLeft.
x, aBotRight.
x - minWidth );
 
  511            aBotRight.
y = std::max( aBotRight.
y, aTopLeft.
y + minHeight );
 
  515            aBotRight.
x = std::max( aBotRight.
x, aTopLeft.
x + minWidth );
 
 
  533                     std::vector<EDA_ITEM*>& aUpdatedItems )
 override 
 
 
  595                     std::vector<EDA_ITEM*>& aUpdatedItems )
 override 
  611            const VECTOR2I newOffset = xfrmOrigin - ( topLeft + botRight ) / 2;
 
  626                oldCorner -= oldSize / 2;
 
  630                newCorner = topRight;
 
  631                oldCorner -= 
VECTOR2I( -oldSize.
x, oldSize.
y ) / 2;
 
  636                oldCorner -= 
VECTOR2I( oldSize.
x, -oldSize.
y ) / 2;
 
  640                newCorner = botRight;
 
  641                oldCorner += oldSize / 2;
 
  647                *newCorner -= xfrmOrigin;
 
  648                oldCorner -= oldOrigin;
 
  651                if( 
sign( newCorner->x ) != 
sign( oldCorner.
x ) || 
sign( newCorner->y ) != 
sign( oldCorner.
y ) )
 
  659                double ratio = oldLength > 0 ? ( newLength / oldLength ) : 1.0;
 
  665                ratio = std::min( newWidth / oldSize.
x, newHeight / oldSize.
y );
 
 
 
  702        auto set45Constraint =
 
 
  731                     std::vector<EDA_ITEM*>& aUpdatedItems )
 override 
 
 
  760                     std::vector<EDA_ITEM*>& aUpdatedItems )
 override 
  766        aUpdatedItems.push_back( &
table );
 
  768        if( !
m_cell.GetTextAngle().IsHorizontal() )
 
  776                for( 
int ii = 0; ii < 
m_cell.GetColSpan() - 1; ++ii )
 
  777                    colWidth -= 
table.GetColWidth( 
m_cell.GetColumn() + ii );
 
  785                int rowHeight = 
m_cell.GetRectangleWidth();
 
  787                for( 
int ii = 0; ii < 
m_cell.GetRowSpan() - 1; ++ii )
 
  788                    rowHeight -= 
table.GetRowHeight( 
m_cell.GetRow() + ii );
 
  799                int colWidth = 
m_cell.GetRectangleWidth();
 
  801                for( 
int ii = 0; ii < 
m_cell.GetColSpan() - 1; ++ii )
 
  802                    colWidth -= 
table.GetColWidth( 
m_cell.GetColumn() + ii );
 
  810                int rowHeight = 
m_cell.GetRectangleHeight();
 
  812                for( 
int ii = 0; ii < 
m_cell.GetRowSpan() - 1; ++ii )
 
  813                    rowHeight -= 
table.GetRowHeight( 
m_cell.GetRow() + ii );
 
 
 
  840        if( 
m_pad.IsLocked() )
 
  855            if( !
m_pad.GetOrientation().IsCardinal() )
 
  858            if( 
m_pad.GetOrientation().IsVertical() )
 
  859                std::swap( halfSize.
x, halfSize.
y );
 
  862            aPoints.
AddPoint( shapePos - halfSize );
 
  864            aPoints.
AddPoint( shapePos + halfSize );
 
 
  884            int target = 
locked ? 0 : 1;
 
  892            else if( target == 1 )
 
  894                shapePos.
x += halfSize.
x;
 
  907            int target = 
locked || !
m_pad.GetOrientation().IsCardinal() ? 0 : 4;
 
  914            else if( target == 4 )
 
  916                if( 
m_pad.GetOrientation().IsVertical() )
 
  917                    std::swap( halfSize.
x, halfSize.
y );
 
  921                                                                       shapePos.
y - halfSize.
y ) );
 
  924                                                                      shapePos.
y + halfSize.
y ) );
 
 
  938                     std::vector<EDA_ITEM*>& aUpdatedItems )
 override 
  965                                                            botLeft, botRight, holeCenter, holeSize );
 
  968                || ( 
m_pad.GetDrillSize().x && 
m_pad.GetDrillSize().y ) )
 
  978                    dist[0] = 
center.x - topLeft.
x;
 
  979                    dist[1] = 
center.y - topLeft.
y;
 
  980                    dist[2] = botRight.
x - 
center.x;
 
  981                    dist[3] = botRight.
y - 
center.y;
 
  985                    dist[0] = 
center.x - botLeft.
x;
 
  986                    dist[1] = 
center.y - topRight.
y;
 
  987                    dist[2] = topRight.
x - 
center.x;
 
  988                    dist[3] = botLeft.
y - 
center.y;
 
  991                VECTOR2I padSize( dist[0] + dist[2], dist[1] + dist[3] );
 
  992                VECTOR2I deltaOffset( padSize.
x / 2 - dist[2], padSize.
y / 2 - dist[3] );
 
  994                if( 
m_pad.GetOrientation().IsVertical() )
 
  995                    std::swap( padSize.
x, padSize.
y );
 
 1014                    bottom = botRight.
y;
 
 1026                if( 
m_pad.GetOrientation().IsVertical() )
 
 1027                    std::swap( padSize.
x, padSize.
y );
 
 
 
 1069                     std::vector<EDA_ITEM*>& aUpdatedItems )
 override 
 
 
 1093            m_oldCrossBar( 
SEG{ aDimension.GetCrossbarStart(), aDimension.GetCrossbarEnd() } )
 
 
 1116            const VECTOR2I newProject = newCrossBar.LineProject( newTextPos );
 
 1118            const VECTOR2I oldProjectedOffset =
 
 1120            const VECTOR2I newProjectedOffset = newProject - newCrossBar.NearestPoint( newProject );
 
 1122            const bool textWasLeftOf = oldProjectedOffset.
x < 0
 
 1123                                       || ( oldProjectedOffset.
x == 0 && oldProjectedOffset.
y > 0 );
 
 1124            const bool textIsLeftOf = newProjectedOffset.
x < 0
 
 1125                                      || ( newProjectedOffset.
x == 0 && newProjectedOffset.
y > 0 );
 
 1127            if( textWasLeftOf != textIsLeftOf )
 
 
 1147        const EDA_ANGLE rotation = oldAngle - newAngle;
 
 1160                                                                              rotTextOffsetFromCbCenter,
 
 1161                                                                              newCrossBar.Center() );
 
 1167            return newCbRefPt + rotTextOffsetFromCbEnd;
 
 1180        const VECTOR2I newProjected = newCrossBar.A + ( newCrossBar.B - newCrossBar.A ) * oldRatio;
 
 1181        return newProjected + rotCbNormalToText;
 
 
 
 1234                     std::vector<EDA_ITEM*>& aUpdatedItems )
 override 
 
 1271            if( featureLine.
Cross( crossBar ) > 0 )
 
 1283            if( featureLine.
Cross( crossBar ) > 0 )
 
 
 1339            VECTOR2I direction = ( directionA < directionB ) ? directionA : directionB;
 
 1345            if( !bounds.
Contains( cursorPos ) )
 
 1368            m_dimension.SetHeight( vert ? featureLine.
x : featureLine.
y );
 
 
 
 1424                     std::vector<EDA_ITEM*>& aUpdatedItems )
 override 
 
 1441        return std::nullopt;
 
 
 
 1487                     std::vector<EDA_ITEM*>& aUpdatedItems )
 override 
 
 1537        return std::nullopt;
 
 
 
 1577                     std::vector<EDA_ITEM*>& aUpdatedItems )
 override 
 
 
 1637                     std::vector<EDA_ITEM*>& aUpdatedItems )
 override 
 
 1656            if( item->Type() == PCB_SHAPE_T )
 
 1658                PCB_SHAPE* shape = static_cast<PCB_SHAPE*>( item );
 
 1659                m_originalWidths[shape] = static_cast<double>( shape->GetWidth() );
 
 
 1697                     std::vector<EDA_ITEM*>& aUpdatedItems )
 override 
 1710                aUpdatedItems.push_back( item );
 
 1723        double sx = 
static_cast<double>( br.
x - tl.
x ) / 
static_cast<double>( oldBox.
GetWidth() );
 
 1724        double sy = 
static_cast<double>( br.
y - tl.
y ) / 
static_cast<double>( oldBox.
GetHeight() );
 
 1725        double scale = ( sx + sy ) / 2.0;
 
 1734            shape->
Move( -oldCenter );
 
 1736            shape->
Move( oldCenter );
 
 1740                shapeIt->second = shapeIt->second * 
scale;
 
 1749            aUpdatedItems.push_back( shape );
 
 
 
 1814    const auto type = aItem.
Type();
 
 
 1834    double angleRad = aAngleDeg * 
M_PI / 180.0;
 
 1837    double chord = ( 
next - prev ).EuclideanNorm();
 
 1838    double sinA = sin( angleRad );
 
 1840    if( chord == 0.0 || fabs( sinA ) < 1e-9 )
 
 1843    double     radius = chord / ( 2.0 * sinA );
 
 1848    double h_sq = 
radius * 
radius - ( chord * chord ) / 4.0;
 
 1849    double h = h_sq > 0.0 ? sqrt( h_sq ) : 0.0;
 
 1873    return d1 < d2 ? p1 : p2;
 
 
 1882    wxASSERT_MSG( 
m_selectionTool, wxT( 
"pcbnew.InteractiveSelection tool is not available" ) );
 
 1884    const auto addCornerCondition =
 
 1885            []( 
const SELECTION& aSelection ) -> 
bool 
 1887                const EDA_ITEM* item = aSelection.Front();
 
 1891    const auto addChamferCondition =
 
 1892            []( 
const SELECTION& aSelection ) -> 
bool 
 1894                const EDA_ITEM* item = aSelection.Front();
 
 1899            [
this]( 
const SELECTION& aSelection ) -> 
bool 
 1904    const auto arcIsEdited =
 
 1905            []( 
const SELECTION& aSelection ) -> 
bool 
 1907                const EDA_ITEM* item = aSelection.Front();
 
 
 1929    std::shared_ptr<EDIT_POINTS> points = std::make_shared<EDIT_POINTS>( aItem );
 
 1937    switch( aItem->
Type() )
 
 1942        m_editorBehavior = std::make_unique<REFERENCE_IMAGE_POINT_EDIT_BEHAVIOR>( refImage );
 
 1948        m_editorBehavior = std::make_unique<BARCODE_POINT_EDIT_BEHAVIOR>( barcode );
 
 1954        m_editorBehavior = std::make_unique<TEXTBOX_POINT_EDIT_BEHAVIOR>( textbox );
 
 1964            m_editorBehavior = std::make_unique<EDA_SEGMENT_POINT_EDIT_BEHAVIOR>( *shape );
 
 1968            m_editorBehavior = std::make_unique<RECTANGLE_POINT_EDIT_BEHAVIOR>( *shape );
 
 1977            m_editorBehavior = std::make_unique<EDA_CIRCLE_POINT_EDIT_BEHAVIOR>( *shape );
 
 1981            m_editorBehavior = std::make_unique<EDA_POLYGON_POINT_EDIT_BEHAVIOR>( *shape );
 
 1985            m_editorBehavior = std::make_unique<EDA_BEZIER_POINT_EDIT_BEHAVIOR>( *shape,
 
 1999        bool shapesOnly = 
true;
 
 2024            m_editorBehavior = std::make_unique<PCB_TABLECELL_POINT_EDIT_BEHAVIOR>( *cell );
 
 2048        ZONE& zone = 
static_cast<ZONE&
>( *aItem );
 
 2056        m_editorBehavior = std::make_unique<GENERATOR_POINT_EDIT_BEHAVIOR>( *generator );
 
 2064        m_editorBehavior = std::make_unique<ALIGNED_DIMENSION_POINT_EDIT_BEHAVIOR>( dimension );
 
 2071        m_editorBehavior = std::make_unique<DIM_CENTER_POINT_EDIT_BEHAVIOR>( dimension );
 
 2078        m_editorBehavior = std::make_unique<DIM_RADIAL_POINT_EDIT_BEHAVIOR>( dimension );
 
 2085        m_editorBehavior = std::make_unique<DIM_LEADER_POINT_EDIT_BEHAVIOR>( dimension );
 
 
 2170    std::vector<std::unique_ptr<BOARD_ITEM>> clones;
 
 2200    bool inDrag = 
false;
 
 2201    bool isConstrained = 
false;
 
 2202    bool haveSnapLineDirections = 
false;
 
 2204    auto updateSnapLineDirections =
 
 2207                std::vector<VECTOR2I> directions;
 
 2221                if( directions.empty() )
 
 2223                    grid.SetSnapLineDirections( {} );
 
 2224                    grid.SetSnapLineEnd( std::nullopt );
 
 2225                    haveSnapLineDirections = 
false;
 
 2229                    grid.SetSnapLineDirections( directions );
 
 2231                    grid.SetSnapLineEnd( std::nullopt );
 
 2232                    haveSnapLineDirections = 
true;
 
 2242        grid.SetUseGrid( 
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
 
 2271                frame()->UndoRedoBlock( 
true );
 
 2289                for( 
size_t ii = 0; ii < 
m_editPoints->PointsSize(); ++ii )
 
 2305                    shape->UpdateHatching();
 
 2310                clones.emplace_back( clone );
 
 2311                grid.AddConstructionItems( { clone }, 
false, true );
 
 2313                updateSnapLineDirections();
 
 2318            if( isConstrained != need_constraint )
 
 2321                isConstrained = need_constraint;
 
 2322                updateSnapLineDirections();
 
 2338                if( 
grid.GetUseGrid() )
 
 2340                    VECTOR2I gridPt = 
grid.BestSnapAnchor( pos, {}, 
grid.GetItemGrid( item ), { item } );
 
 2344                    VECTOR2I deltaGrid = gridPt - 
grid.BestSnapAnchor( last, {}, 
grid.GetItemGrid( item ),
 
 2347                    if( abs( 
delta.x ) > 
grid.GetGrid().x / 2 )
 
 2348                        pos.
x = last.
x + deltaGrid.
x;
 
 2352                    if( abs( 
delta.y ) > 
grid.GetGrid().y / 2 )
 
 2353                        pos.
y = last.
y + deltaGrid.
y;
 
 2378                if( idx != wxNOT_FOUND )
 
 2381                    int nextIdx = ( idx + 1 ) % 
m_editPoints->PointsSize();
 
 2384                    SEG      segA( pos, prev );
 
 2387                    double   snapAng = 45.0 * std::round( ang / 45.0 );
 
 2389                    if( 
std::abs( ang - snapAng ) < 2.0 )
 
 2399            bool constraintSnapped = 
false;
 
 2406                constraintSnapped = 
true;
 
 2412                constraintSnapped = 
true;
 
 2424            if( haveSnapLineDirections )
 
 2426                if( constraintSnapped )
 
 2429                    grid.SetSnapLineEnd( std::nullopt );
 
 2441                    int radius = rect->GetCornerRadius();
 
 2443                    VECTOR2I topLeft = rect->GetTopLeft();
 
 2444                    VECTOR2I botRight = rect->GetBotRight();
 
 2452                radiusHelper->
Hide();
 
 2461            for( 
size_t ii = 0; ii < 
m_editPoints->PointsSize(); ++ii )
 
 2474        else if( inDrag && evt->IsMouseUp( 
BUT_LEFT ) )
 
 2485            radiusHelper->
Hide();
 
 2490            updateSnapLineDirections();
 
 2506                commit.
Push( 
_( 
"Resize Table Cells" ) );
 
 2510                commit.
Push( 
_( 
"Move Point" ) );
 
 2516                shape->UpdateHatching();
 
 2520            frame()->UndoRedoBlock( 
false );
 
 2521            updateSnapLineDirections();
 
 2525        else if( evt->IsCancelInteractive() || evt->IsActivate() )
 
 2540                    shape->UpdateHatching();
 
 2544                frame()->UndoRedoBlock( 
false );
 
 2545                updateSnapLineDirections();
 
 2551            if( evt->IsActivate() && !evt->IsMoveTool() )
 
 2581            evt->SetPassEvent();
 
 2588        shape->UpdateHatching();
 
 2606    grid.SetSnapLineDirections( {} );
 
 
 2628        title = 
_( 
"Move Midpoint to Location" );
 
 2629        msg = 
_( 
"Move Midpoint" );
 
 2633        title = 
_( 
"Move Corner to Location" );
 
 2634        msg = 
_( 
"Move Corner" );
 
 
 2659    std::vector<EDA_ITEM*> updatedItems = { item };
 
 2670    switch( item->
Type() )
 
 2681                if( 
pad->IsEntered() )
 
 2688            textBox->ClearRenderCache();
 
 2715    for( 
EDA_ITEM* updatedItem : updatedItems )
 
 2718    frame()->SetMsgPanel( item );
 
 
 2735    int editedIndex = -1;
 
 2736    bool editingLine = 
false;
 
 2741        for( 
unsigned ii = 0; ii < 
m_editPoints->PointsSize(); ++ii )
 
 2751        if( editedIndex == -1 )
 
 2753            for( 
unsigned ii = 0; ii < 
m_editPoints->LinesSize(); ++ii )
 
 2772    if( editedIndex >= 0 )
 
 2774        if( editingLine && editedIndex < (
int) 
m_editPoints->LinesSize() )
 
 2776        else if( !editingLine && editedIndex < (
int) 
m_editPoints->PointsSize() )
 
 
 2805        if( 
frame()->ToolStackIsEmpty() )
 
 2808        controls->ForceCursorPosition( 
false );
 
 
 2823        switch( parent->
Type() )
 
 2838        if( line && isPoly )
 
 
 2882        auto vertexIdx = it.GetIndex();
 
 2885            return std::make_pair( 
true, vertexIdx );
 
 
 2903    switch( item->
Type() )
 
 2906        polyset = 
static_cast<ZONE*
>( item )->Outline();
 
 2911            polyset = &
static_cast<PCB_SHAPE*
>( item )->GetPolyShape();
 
 
 2964        unsigned int nearestIdx = 0;
 
 2965        unsigned int nextNearestIdx = 0;
 
 2966        unsigned int nearestDist = INT_MAX;
 
 2967        unsigned int firstPointInContour = 0;
 
 2972            ZONE* zone = 
static_cast<ZONE*
>( item );
 
 2973            zoneOutline = zone->
Outline();
 
 2992        for( ; iterator; iterator++, curr_idx++ )
 
 2994            int jj = curr_idx+1;
 
 2998                jj = firstPointInContour;
 
 2999                firstPointInContour = curr_idx+1;     
 
 3002            SEG curr_segment( zoneOutline->
CVertex( curr_idx ), zoneOutline->
CVertex( jj ) );
 
 3009                nearestIdx = curr_idx;
 
 3010                nextNearestIdx = jj;
 
 3017        SEG             nearestSide( sideOrigin, sideEnd );
 
 3022        if( nearestPoint == sideOrigin || nearestPoint == sideEnd )
 
 3023            nearestPoint = ( sideOrigin + sideEnd ) / 2;
 
 3025        zoneOutline->
InsertVertex( nextNearestIdx, nearestPoint );
 
 3028            static_cast<ZONE*
>( item )->HatchBorder();
 
 3030        commit.
Push( 
_( 
"Add Zone Corner" ) );
 
 3032    else if( graphicItem )
 
 3038            commit.
Modify( graphicItem );
 
 3044            graphicItem->
SetEnd( nearestPoint );
 
 3049            newSegment->
SetStart( nearestPoint );
 
 3052            commit.
Add( newSegment );
 
 3053            commit.
Push( 
_( 
"Split Segment" ) );
 
 3058            commit.
Modify( graphicItem );
 
 3064            graphicItem->
SetEnd( nearestPoint );
 
 3073            commit.
Add( newArc );
 
 3074            commit.
Push( 
_( 
"Split Arc" ) );
 
 
 3102        ZONE* zone = 
static_cast<ZONE*
>( item );
 
 3123        const auto& vertexIdx = vertex.second;
 
 3124        auto& outline = polygon->
Polygon( vertexIdx.m_polygon )[vertexIdx.m_contour];
 
 3126        if( outline.PointCount() > 3 )
 
 3135            if( vertexIdx.m_contour > 0 )
 
 3151            commit.
Push( 
_( 
"Remove Zone Corner" ) );
 
 3153            commit.
Push( 
_( 
"Remove Polygon Corner" ) );
 
 3156            static_cast<ZONE*
>( item )->HatchBorder();
 
 
 3179        ZONE* zone = 
static_cast<ZONE*
>( item );
 
 3200    unsigned int nearestIdx = 0;
 
 3201    unsigned int nearestDist = INT_MAX;
 
 3209    for( ; iterator; iterator++, curr_idx++ )
 
 3216            nearestIdx = curr_idx;
 
 3220    int prevIdx, nextIdx;
 
 3228        setback = std::min( setback, (
int) ( segA.Length() * 0.25 ) );
 
 3229        setback = std::min( setback, (
int) ( segB.Length() * 0.25 ) );
 
 3233        std::optional<CHAMFER_RESULT> chamferResult = 
ComputeChamferPoints( segA, segB, chamferParams );
 
 3235        if( chamferResult && chamferResult->m_updated_seg_a && chamferResult->m_updated_seg_b )
 
 3241            polygon->
InsertVertex( nearestIdx, chamferResult->m_updated_seg_b->B );
 
 3242            polygon->
InsertVertex( nearestIdx, chamferResult->m_updated_seg_a->B );
 
 3249        commit.
Push( 
_( 
"Break Zone Corner" ) );
 
 3251        commit.
Push( 
_( 
"Break Polygon Corner" ) );
 
 3254        static_cast<ZONE*
>( item )->HatchBorder();
 
 
ARC_EDIT_MODE
Settings for arc editing.
 
@ KEEP_CENTER_ADJUST_ANGLE_RADIUS
When editing endpoints, the angle and radius are adjusted.
 
constexpr EDA_IU_SCALE pcbIUScale
 
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
 
static TOOL_ACTION cycleArcEditMode
 
static TOOL_ACTION pointEditorArcKeepCenter
 
static TOOL_ACTION pointEditorArcKeepRadius
 
static TOOL_ACTION reselectItem
 
static TOOL_ACTION activatePointEditor
 
static TOOL_ACTION selectionClear
Clear the current selection.
 
static TOOL_ACTION pointEditorArcKeepEndpoint
 
PCB_DIM_ALIGNED & m_dimension
 
void updateOrthogonalDimension(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints)
Update orthogonal dimension points.
 
ALIGNED_DIMENSION_POINT_EDIT_BEHAVIOR(PCB_DIM_ALIGNED &aDimension)
 
void updateAlignedDimension(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints)
Update non-orthogonal dimension points.
 
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
 
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
 
OPT_VECTOR2I Get45DegreeConstrainer(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints) const override
Get the 45-degree constrainer for the item, when the given point is moved.
 
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
 
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
 
BARCODE_POINT_EDIT_BEHAVIOR(PCB_BARCODE &aBarcode)
 
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
 
PCB_SHAPE makeDummyRect()
 
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
 
virtual void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Execute the changes.
 
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 Revert() override
Revert the commit by restoring the modified items state.
 
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
 
virtual BOARD_ITEM * Duplicate(bool addToParentGroup, BOARD_COMMIT *aCommit=nullptr) const
Create a copy of this BOARD_ITEM.
 
bool IsLocked() const override
 
FOOTPRINT * GetParentFootprint() const
 
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
 
constexpr void SetMaximum()
 
constexpr const Vec GetEnd() const
 
constexpr size_type GetWidth() const
 
constexpr Vec Centre() const
 
constexpr size_type GetHeight() const
 
constexpr coord_type GetLeft() const
 
constexpr bool Contains(const Vec &aPoint) const
 
constexpr const Vec & GetOrigin() const
 
constexpr coord_type GetRight() const
 
constexpr coord_type GetTop() const
 
constexpr coord_type GetBottom() const
 
Represent a set of changes (additions, deletions or modifications) of a data model (e....
 
COMMIT & Remove(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Remove a new item from the model.
 
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
 
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Add a new item to the model.
 
Class to help update the text position of a dimension when the crossbar changes.
 
DIM_ALIGNED_TEXT_UPDATER(PCB_DIM_ALIGNED &aDimension)
 
VECTOR2I getDimensionNewTextPosition()
 
PCB_DIM_ALIGNED & m_dimension
 
const VECTOR2I m_originalTextPos
 
void UpdateTextAfterChange()
 
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
 
PCB_DIM_CENTER & m_dimension
 
OPT_VECTOR2I Get45DegreeConstrainer(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints) const override
Get the 45-degree constrainer for the item, when the given point is moved.
 
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
 
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
 
DIM_CENTER_POINT_EDIT_BEHAVIOR(PCB_DIM_CENTER &aDimension)
 
DIM_LEADER_POINT_EDIT_BEHAVIOR(PCB_DIM_LEADER &aDimension)
 
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
 
PCB_DIM_LEADER & m_dimension
 
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
 
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
 
DIM_RADIAL_POINT_EDIT_BEHAVIOR(PCB_DIM_RADIAL &aDimension)
 
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
 
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
 
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
 
OPT_VECTOR2I Get45DegreeConstrainer(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints) const override
Get the 45-degree constrainer for the item, when the given point is moved.
 
PCB_DIM_RADIAL & m_dimension
 
EDIT_CONSTRAINT that imposes a constraint that two points have to be located at angle of 45 degree mu...
 
EDIT_CONSTRAINT that imposes a constraint that a point has to be located at angle of 90 degree multip...
 
EDIT_CONSTRAINT for 3 segments: dragged and two adjacent ones, enforcing to keep their slopes and all...
 
EDIT_CONSTRAINT that imposes a constraint that two points have to have the same Y coordinate.
 
EDIT_CONSTRAINT that imposes a constraint that a point has to lie on a line (determined by 2 points).
 
EDIT_CONSTRAINT for a EDIT_LINE, that constrains the line to move perpendicular to the line itself.
 
EDIT_CONSTRAINT that imposes a constraint that two points have to have the same X coordinate.
 
bool IsType(FRAME_T aType) const
 
A base class for most all the KiCad significant classes used in schematics and boards.
 
KICAD_T Type() const
Returns the type of object.
 
virtual void SetParent(EDA_ITEM *aParent)
 
virtual EDA_ITEM * Clone() const
Create a duplicate of this item with linked list members set to NULL.
 
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
 
virtual VECTOR2I GetTopLeft() const
 
void SetCornerRadius(int aRadius)
 
SHAPE_POLY_SET & GetPolyShape()
 
virtual VECTOR2I GetBotRight() const
 
virtual void SetBottom(int val)
 
virtual void SetTop(int val)
 
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
 
void SetStart(const VECTOR2I &aStart)
 
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
 
void SetEnd(const VECTOR2I &aEnd)
 
virtual void SetLeft(int val)
 
void SetWidth(int aWidth)
 
virtual void SetRight(int val)
 
int GetCornerRadius() const
 
VECTOR2I GetArcMid() const
 
EDA_TABLECELL_POINT_EDIT_BEHAVIOR(EDA_SHAPE &aCell)
 
Describe constraints between two edit handles.
 
Represent a line connecting two EDIT_POINTs.
 
void SetConstraint(EDIT_CONSTRAINT< EDIT_LINE > *aConstraint)
Set a constraint for and EDIT_POINT.
 
EDIT_POINTS is a VIEW_ITEM that manages EDIT_POINTs and EDIT_LINEs and draws them.
 
unsigned int PointsSize() const
Return number of stored EDIT_POINTs.
 
void AddPoint(const EDIT_POINT &aPoint)
Add an EDIT_POINT.
 
void SetSwapY(bool aSwap)
 
void Clear()
Clear all stored EDIT_POINTs and EDIT_LINEs.
 
EDIT_LINE & Line(unsigned int aIndex)
 
void AddIndicatorLine(EDIT_POINT &aOrigin, EDIT_POINT &aEnd)
Adds an EDIT_LINE that is shown as an indicator, rather than an editable line (no center point drag,...
 
void SetSwapX(bool aSwap)
 
unsigned int LinesSize() const
Return number of stored EDIT_LINEs.
 
EDIT_POINT & Point(unsigned int aIndex)
 
void AddLine(const EDIT_LINE &aLine)
Adds an EDIT_LINE.
 
Represent a single point that can be used for modifying items.
 
int GetY() const
Return Y coordinate of an EDIT_POINT.
 
virtual void SetPosition(const VECTOR2I &aPosition)
Set new coordinates for an EDIT_POINT.
 
virtual VECTOR2I GetPosition() const
Return coordinates of an EDIT_POINT.
 
void SetSnapConstraint(SNAP_CONSTRAINT_TYPE aConstraint)
 
void SetConstraint(EDIT_CONSTRAINT< EDIT_POINT > *aConstraint)
Set a constraint for an EDIT_POINT.
 
int GetX() const
Return X coordinate of an EDIT_POINT.
 
void SetActive(bool aActive=true)
 
void SetDrawCircle(bool aDrawCircle=true)
 
static const TOOL_EVENT InhibitSelectionEditing
 
static const TOOL_EVENT SelectedEvent
 
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
 
static const TOOL_EVENT UninhibitSelectionEditing
Used to inform tool that it should display the disambiguation menu.
 
static const TOOL_EVENT PointSelectedEvent
 
static const TOOL_EVENT SelectedItemsMoved
Used to inform tools that the selection should temporarily be non-editable.
 
static const TOOL_EVENT UnselectedEvent
 
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
 
PCB_GENERATOR & m_generator
 
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
 
GENERATOR_POINT_EDIT_BEHAVIOR(PCB_GENERATOR &aGenerator)
 
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
 
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const override
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
 
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 SetAutoPan(bool aEnabled)
Turn on/off auto panning (this feature is used when there is a tool active (eg.
 
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
 
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
 
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
 
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
 
LSET is a set of PCB_LAYER_IDs.
 
static const LSET & AllLayersMask()
 
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
 
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
 
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
 
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
 
PAD_POINT_EDIT_BEHAVIOR(PAD &aPad, PCB_LAYER_ID aLayer)
 
ARC_EDIT_MODE m_ArcEditMode
 
static TOOL_ACTION layerChanged
 
static TOOL_ACTION pointEditorMoveMidpoint
 
static TOOL_ACTION genFinishEdit
 
static TOOL_ACTION genStartEdit
 
static TOOL_ACTION pointEditorMoveCorner
 
static TOOL_ACTION genCancelEdit
 
static TOOL_ACTION genUpdateEdit
 
static TOOL_ACTION pointEditorChamferCorner
 
static TOOL_ACTION pointEditorRemoveCorner
 
static TOOL_ACTION pointEditorAddCorner
 
Common, abstract interface for edit frames.
 
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
 
PCBNEW_SETTINGS * GetPcbNewSettings() const
 
virtual MAGNETIC_SETTINGS * GetMagneticItemsSettings()
 
FOOTPRINT_EDITOR_SETTINGS * GetFootprintEditorSettings() const
 
For better understanding of the points that make a dimension:
 
Mark the center of a circle or arc with a cross shape.
 
A leader is a dimension-like object pointing to a specific point.
 
An orthogonal dimension is like an aligned dimension, but the extension lines are locked to the X or ...
 
void SetOrientation(DIR aOrientation)
Set the orientation of the dimension line (so, perpendicular to the feature lines).
 
DIR GetOrientation() const
 
A radial dimension indicates either the radius or diameter of an arc or circle.
 
virtual wxString GetCommitMessage() const =0
 
A set of BOARD_ITEMs (i.e., without duplicates).
 
int changeArcEditMode(const TOOL_EVENT &aEvent)
 
void updateItem(BOARD_COMMIT &aCommit)
Update edit points with item's points.
 
VECTOR2I m_stickyDisplacement
 
int OnSelectionChange(const TOOL_EVENT &aEvent)
Change selection event handler.
 
void setAltConstraint(bool aEnabled)
Return a point that should be used as a constrainer for 45 degrees mode.
 
static const unsigned int COORDS_PADDING
 
bool removeCornerCondition(const SELECTION &aSelection)
 
EDIT_POINT * m_hoveredPoint
 
int addCorner(const TOOL_EVENT &aEvent)
 
bool HasPoint()
Indicate the cursor is over an edit point.
 
EDIT_POINT m_original
Original pos for the current drag point.
 
EDIT_POINT get45DegConstrainer() const
Condition to display "Remove corner" context menu entry.
 
int modifiedSelection(const TOOL_EVENT &aEvent)
Change the edit method for arcs.
 
void Reset(RESET_REASON aReason) override
Bring the tool to a known, initial state.
 
std::unique_ptr< POINT_EDIT_BEHAVIOR > m_editorBehavior
 
int removeCorner(const TOOL_EVENT &aEvent)
 
bool Init() override
Init() is called once upon a registration of the tool.
 
int movePoint(const TOOL_EVENT &aEvent)
TOOL_ACTION handlers.
 
void setEditedPoint(EDIT_POINT *aPoint)
 
EDIT_POINT m_altConstrainer
 
ARC_EDIT_MODE m_arcEditMode
 
std::unique_ptr< KIGFX::PREVIEW::ANGLE_ITEM > m_angleItem
 
EDIT_POINT * m_editedPoint
 
void updateEditedPoint(const TOOL_EVENT &aEvent)
Set the current point being edited. NULL means none.
 
std::shared_ptr< EDIT_CONSTRAINT< EDIT_POINT > > m_altConstraint
 
int getEditedPointIndex() const
Return true if aPoint is the currently modified point.
 
void updatePoints()
Update which point is being edited.
 
int chamferCorner(const TOOL_EVENT &aEvent)
 
void setTransitions() override
< Set up handlers for various events.
 
std::shared_ptr< EDIT_POINTS > m_editPoints
 
std::shared_ptr< EDIT_POINTS > makePoints(EDA_ITEM *aItem)
Update item's points with edit points.
 
PCB_SELECTION_TOOL * m_selectionTool
 
Object to handle a bitmap image that can be inserted in a PCB.
 
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
 
int GetWidth() const override
 
bool IsProxyItem() const override
 
void Move(const VECTOR2I &aMoveVector) override
Move this object.
 
void Scale(double aScale)
 
PCB_TABLECELL_POINT_EDIT_BEHAVIOR(PCB_TABLECELL &aCell)
 
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
 
A helper class interface to manage the edit points for a single item.
 
static bool isModified(const EDIT_POINT &aEditedPoint, const EDIT_POINT &aPoint)
Checks if two points are the same instance - which means the point is being edited.
 
POLYGON_POINT_EDIT_BEHAVIOR(SHAPE_POLY_SET &aPolygon)
 
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
 
static void UpdateItem(SCH_SHAPE &aRect, const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints)
 
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
 
static void UpdatePoints(SCH_SHAPE &aRect, EDIT_POINTS &aPoints)
 
static void PinEditedCorner(const EDIT_POINT &aEditedPoint, const EDIT_POINTS &aPoints, int minWidth, int minHeight, VECTOR2I &topLeft, VECTOR2I &topRight, VECTOR2I &botLeft, VECTOR2I &botRight)
Update the coordinates of 4 corners of a rectangle, according to constraints and the moved corner.
 
static void PinEditedCorner(const EDIT_POINT &aEditedPoint, const EDIT_POINTS &aEditPoints, VECTOR2I &aTopLeft, VECTOR2I &aTopRight, VECTOR2I &aBotLeft, VECTOR2I &aBotRight, const VECTOR2I &aHole={ 0, 0 }, const VECTOR2I &aHoleSize={ 0, 0 })
Update the coordinates of 4 corners of a rectangle, according to constraints and the moved corner.
 
static void MakePoints(SCH_SHAPE &aRect, EDIT_POINTS &aPoints)
 
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
 
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
 
static void MakePoints(const PCB_SHAPE &aRectangle, EDIT_POINTS &aPoints)
Standard rectangle points construction utility (other shapes may use this as well)
 
static void UpdatePoints(const PCB_SHAPE &aRectangle, EDIT_POINTS &aPoints)
 
static void UpdateItem(PCB_SHAPE &aRectangle, const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints)
 
RECTANGLE_POINT_EDIT_BEHAVIOR(PCB_SHAPE &aRectangle)
 
const EDA_IU_SCALE & m_iuScale
 
wxString GetClass() const override
Return the class name.
 
std::vector< int > ViewGetLayers() const override
Return the all the layers within the VIEW the object is painted on.
 
const BOX2I ViewBBox() const override
Return the bounding box of the item covering all its layers.
 
void Set(int aRadius, const VECTOR2I &aCorner, const VECTOR2I &aQuadrant, EDA_UNITS aUnits)
 
RECT_RADIUS_TEXT_ITEM(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits)
 
void ViewDraw(int aLayer, KIGFX::VIEW *aView) const override
Draw the parts of the object belonging to layer aLayer.
 
REFERENCE_IMAGE_POINT_EDIT_BEHAVIOR(PCB_REFERENCE_IMAGE &aRefImage)
 
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
 
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
 
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
 
PCB_REFERENCE_IMAGE & m_refImage
 
A REFERENCE_IMAGE is a wrapper around a BITMAP_IMAGE that is displayed in an editor as a reference fo...
 
void SetTransformOriginOffset(const VECTOR2I &aCenter)
 
VECTOR2I GetTransformOriginOffset() const
Get the center of scaling, etc, relative to the image center (GetPosition()).
 
VECTOR2I GetPosition() const
 
double GetImageScale() const
 
void SetImageScale(double aScale)
Set the image "zoom" value.
 
const VECTOR2I NearestPoint(const VECTOR2I &aP) const
Compute a point on the segment (this) that is closest to point aP.
 
int Distance(const SEG &aSeg) const
Compute minimum Euclidean distance to segment aSeg.
 
EDA_ANGLE Angle(const SEG &aOther) const
Determine the smallest angle between two segments.
 
Class that groups generic conditions for selected items.
 
static SELECTION_CONDITION Count(int aNumber)
Create a functor that tests if the number of selected items is equal to the value given as parameter.
 
VECTOR2I NearestPoint(const VECTOR2I &aP) const
 
const VECTOR2I & GetP1() const
 
SHAPE_GROUP_POINT_EDIT_BEHAVIOR(PCB_GROUP &aGroup)
 
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
 
std::unordered_map< PCB_SHAPE *, double > m_originalWidths
 
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
 
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
 
bool IsEndContour() const
 
Represent a set of closed polygons.
 
ITERATOR_TEMPLATE< VECTOR2I > ITERATOR
 
ITERATOR IterateWithHoles(int aOutline)
 
void InsertVertex(int aGlobalIndex, const VECTOR2I &aNewVertex)
Adds a vertex in the globally indexed position aGlobalIndex.
 
POLYGON & Polygon(int aIndex)
Return the aIndex-th subpolygon in the set.
 
void RemoveVertex(int aGlobalIndex)
Delete the aGlobalIndex-th vertex.
 
void RemoveContour(int aContourIdx, int aPolygonIdx=-1)
Delete the aContourIdx-th contour of the aPolygonIdx-th polygon in the set.
 
bool GetNeighbourIndexes(int aGlobalIndex, int *aPrevious, int *aNext) const
Return the global indexes of the previous and the next corner of the aGlobalIndex-th corner of a cont...
 
ITERATOR Iterate(int aFirst, int aLast, bool aIterateHoles=false)
Return an object to iterate through the points of the polygons between aFirst and aLast.
 
const VECTOR2I & CVertex(int aIndex, int aOutline, int aHole) const
Return the index-th vertex in a given hole outline within a given outline.
 
int OutlineCount() const
Return the number of outlines in the set.
 
A textbox is edited as a rectnagle when it is orthogonally aligned.
 
TEXTBOX_POINT_EDIT_BEHAVIOR(PCB_TEXTBOX &aTextbox)
 
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
 
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
 
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
 
EDA_UNITS GetUserUnits() const
 
constexpr extended_type Cross(const VECTOR2< T > &aVector) const
Compute cross product of self with aVector.
 
double Distance(const VECTOR2< extended_type > &aVector) const
Compute the distance between two vectors.
 
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
 
VECTOR2< T > Resize(T aNewLength) const
Return a vector of the same direction, but length specified in aNewLength.
 
VECTOR2I GetValue()
Return the value in internal units.
 
ZONE_POINT_EDIT_BEHAVIOR(ZONE &aZone)
 
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
 
Handle a list of polygons defining a copper zone.
 
void SetNeedRefill(bool aNeedRefill)
 
SHAPE_POLY_SET * Outline()
 
This file is part of the common library.
 
std::optional< CHAMFER_RESULT > ComputeChamferPoints(const SEG &aSegA, const SEG &aSegB, const CHAMFER_PARAMS &aChamferParams)
Compute the chamfer points for a given line pair and chamfer parameters.
 
#define IS_MOVING
Item being moved.
 
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
 
a few functions useful in geometry calculations.
 
VECTOR2< ret_type > GetClampedCoords(const VECTOR2< in_type > &aCoords, pad_type aPadding=1u)
Clamps a vector to values that can be negated, respecting numeric limits of coordinates data type wit...
 
bool IsFrontLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a front layer.
 
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
 
@ LAYER_GP_OVERLAY
General purpose overlay.
 
@ LAYER_SELECT_OVERLAY
Selected items overlay.
 
PCB_LAYER_ID
A quick note on layer IDs:
 
constexpr int Mils2IU(const EDA_IU_SCALE &aIuScale, int mils)
 
bool PointProjectsOntoSegment(const VECTOR2I &aPoint, const SEG &aSeg)
Determine if a point projects onto a segment.
 
double GetLengthRatioFromStart(const VECTOR2I &aPoint, const SEG &aSeg)
Get the ratio of the vector to a point from the segment's start, compared to the segment's length.
 
const VECTOR2I & GetNearestEndpoint(const SEG &aSeg, const VECTOR2I &aPoint)
Get the nearest end of a segment to a point.
 
bool PointIsInDirection(const VECTOR2< T > &aPoint, const VECTOR2< T > &aDirection, const VECTOR2< T > &aFrom)
 
void DrawTextNextToCursor(KIGFX::VIEW *aView, const VECTOR2D &aCursorPos, const VECTOR2D &aTextQuadrant, const wxArrayString &aStrings, bool aDrawingDropShadows)
Draw strings next to the cursor.
 
wxString DimensionLabel(const wxString &prefix, double aVal, const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, bool aIncludeUnits=true)
Get a formatted string showing a dimension to a sane precision with an optional prefix and unit suffi...
 
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
 
BARCODE class definition.
 
@ MANUAL
Text placement is manually set by the user.
 
#define STATUS_ITEMS_ONLY
 
Class to handle a set of BOARD_ITEMs.
 
static VECTOR2I snapCorner(const VECTOR2I &aPrev, const VECTOR2I &aNext, const VECTOR2I &aGuess, double aAngleDeg)
 
static std::pair< bool, SHAPE_POLY_SET::VERTEX_INDEX > findVertex(SHAPE_POLY_SET &aPolySet, const EDIT_POINT &aPoint)
 
static std::vector< VECTOR2I > getConstraintDirections(EDIT_CONSTRAINT< EDIT_POINT > *aConstraint)
 
static bool canAddCorner(const EDA_ITEM &aItem)
Condition to check if a point editor can add a corner to the given item.
 
static void appendDirection(std::vector< VECTOR2I > &aDirections, const VECTOR2I &aDirection)
 
static bool canChamferCorner(const EDA_ITEM &aItem)
Condition to check if a point editor can add a chamfer to a corner of the given item.
 
ARC_EDIT_MODE IncrementArcEditMode(ARC_EDIT_MODE aMode)
 
#define CHECK_POINT_COUNT(aPoints, aExpected)
 
#define CHECK_POINT_COUNT_GE(aPoints, aExpected)
 
static float distance(const SFVEC2UI &a, const SFVEC2UI &b)
 
std::optional< VECTOR2I > OPT_VECTOR2I
 
std::vector< FAB_LAYER_COLOR > dummy
 
Parameters that define a simple chamfer operation.
 
Structure to hold the necessary information in order to index a vertex on a SHAPE_POLY_SET object: th...
 
GR_TEXT_H_ALIGN_T
This is API surface mapped to common.types.HorizontalAlignment.
 
VECTOR2I GetRotated(const VECTOR2I &aVector, const EDA_ANGLE &aAngle)
Return a new VECTOR2I that is the result of rotating aVector by aAngle.
 
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
 
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
 
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
 
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
 
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
 
@ PCB_GENERATOR_T
class PCB_GENERATOR, generator on a layer
 
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
 
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
 
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
 
@ PCB_ZONE_T
class ZONE, a copper pour area
 
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
 
@ NOT_USED
the 3d code uses this value
 
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
 
@ PCB_TABLECELL_T
class PCB_TABLECELL, PCB_TEXTBOX for use in tables
 
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
 
@ PCB_PAD_T
class PAD, a pad in a footprint
 
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
 
constexpr int sign(T val)
 
VECTOR2< int32_t > VECTOR2I
 
VECTOR2< double > VECTOR2D
 
Supplemental functions for working with vectors and simple objects that interact with vectors.