28#include "dialog_table_properties.h" 
   35#include <dialogs/dialog_text_properties.h> 
   59#include <wx/filedlg.h> 
  117                _( 
"Specify custom track and via sizes" ), wxITEM_CHECK );
 
  126            if( 
via.m_Drill > 0 )
 
  128                msg.Printf( 
_(
"Via %s, hole %s" ),
 
  134                msg.Printf( 
_( 
"Via %s" ),
 
  139            Append( menuIdx, msg, wxEmptyString, wxITEM_CHECK );
 
 
  148        int                    id = aEvent.GetId();
 
 
 
  206    auto activeToolFunctor =
 
  225    auto canCloseOutline =
 
  245    auto tuningToolActive =
 
  251    auto dimensionToolActive =
 
  279    std::shared_ptr<VIA_SIZE_MENU> viaSizeMenu = std::make_shared<VIA_SIZE_MENU>();
 
  280    viaSizeMenu->SetTool( 
this );
 
  281    m_menu->RegisterSubMenu( viaSizeMenu );
 
  282    ctxMenu.
AddMenu( viaSizeMenu.get(),                  viaToolActive, 500 );
 
 
  341            m_frame->DisplayConstraintsMsg( 
_( 
"Constrain to H, V, 45" ) );
 
  344            m_frame->DisplayConstraintsMsg( 
_( 
"Constrain to H, V" ) );
 
  347            m_frame->DisplayConstraintsMsg( wxString( 
"" ) );
 
 
  368    std::optional<VECTOR2D> startingPoint;
 
  369    std::stack<PCB_SHAPE*>  committedLines;
 
  380    while( 
drawShape( aEvent, &line, startingPoint, &committedLines ) )
 
  385            commit.
Push( 
_( 
"Draw Line" ) );
 
  387            committedLines.push( line );
 
  391            startingPoint = std::nullopt;
 
 
  418    std::optional<VECTOR2D> startingPoint;
 
  431    while( 
drawShape( aEvent, &rect, startingPoint, 
nullptr ) )
 
  435            bool cancelled = 
false;
 
  438                cancelled = 
m_frame->ShowTextBoxPropertiesDialog( textbox ) != wxID_OK;
 
  449                commit.
Push( isTextBox ? 
_( 
"Draw Text Box" ) : 
_( 
"Draw Rectangle" ) );
 
  459        startingPoint = std::nullopt;
 
 
  480    std::optional<VECTOR2D> startingPoint;
 
  483    circle->SetFilled( 
false );
 
  497            commit.
Push( 
_( 
"Draw Circle" ) );
 
  504        circle->SetFilled( 
false );
 
  507        startingPoint = std::nullopt;
 
 
  528    std::optional<VECTOR2D> startingPoint;
 
  539    while( 
drawArc( aEvent, &arc, startingPoint ) )
 
  544            commit.
Push( 
_( 
"Draw Arc" ) );
 
  553        startingPoint = std::nullopt;
 
 
  583        std::unique_ptr<PCB_SHAPE> bezier =
 
  587        startingPoint = std::nullopt;
 
  588        startingC1 = std::nullopt;
 
  594            commit.
Add( bezier.release() );
 
  595            commit.
Push( 
_( 
"Draw Bezier" ) );
 
  600                startingPoint = bezierRef.
GetEnd();
 
 
  625    bool                 immediateMode = 
image != 
nullptr;
 
  627    bool                 ignorePrimePosition = 
false;
 
  639        image->SetPosition( cursorPos );
 
  660                m_view->RecacheAllItems();
 
  685        ignorePrimePosition = 
true;
 
  694        grid.SetUseGrid( 
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
 
  698        m_controls->ForceCursorPosition( 
true, cursorPos );
 
  718        else if( evt->IsActivate() )
 
  720            if( 
image && evt->IsMoveTool() )
 
  723                evt->SetPassEvent( 
false );
 
  729                m_frame->ShowInfoBarMsg( 
_( 
"Press <ESC> to cancel image creation." ) );
 
  730                evt->SetPassEvent( 
false );
 
  734            if( evt->IsMoveTool() )
 
  751                wxFileDialog dlg( 
m_frame, 
_( 
"Choose Image" ), wxEmptyString, wxEmptyString,
 
  752                                  _( 
"Image Files" ) + wxS( 
" " ) + wxImage::GetImageExtWildcard(),
 
  754                bool         cancelled = 
false;
 
  759                            cancelled = dlg.ShowModal() != wxID_OK;
 
  768                if( evt->IsPrime() && !ignorePrimePosition )
 
  770                    cursorPos = 
grid.Align( evt->Position() );
 
  781                wxString fullFilename = dlg.GetPath();
 
  783                if( wxFileExists( fullFilename ) )
 
  786                if( !
image || !
image->GetReferenceImage().ReadImageFile( fullFilename ) )
 
  788                    wxMessageBox( wxString::Format(
_( 
"Could not load image from '%s'." ), fullFilename ) );
 
  799                m_view->RecacheAllItems(); 
 
  804                m_view->ShowPreview( 
true );
 
  809                commit.Push( 
_( 
"Place Image" ) );
 
  834                           || evt->IsMotion() ) )
 
  836            image->SetPosition( cursorPos );
 
  839            m_view->RecacheAllItems(); 
 
 
  872            m_gridHelper( aDrawingTool.GetManager(), aFrame.GetMagneticItemsSettings() )
 
 
  878        std::unique_ptr<PCB_POINT> new_point = std::make_unique<PCB_POINT>( 
m_frame.GetModel() );
 
  881        new_point->SetLayer( layer );
 
 
 
  935    bool                         ignorePrimePosition = 
false;
 
  981        ignorePrimePosition = 
true;
 
  990        grid.SetUseGrid( 
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
 
  992                                                                    { m_frame->GetActiveLayer() }, 
GRID_TEXT ),
 
  994        m_controls->ForceCursorPosition( 
true, cursorPos );
 
 1000        else if( evt->IsCancelInteractive() || ( 
text && evt->IsAction( &
ACTIONS::undo ) ) )
 
 1012        else if( evt->IsActivate() )
 
 1017            if( evt->IsMoveTool() )
 
 1035        else if( evt->IsClick( 
BUT_LEFT ) )
 
 1037            bool placing = 
text != 
nullptr;
 
 1062                text->SetLayer( layer );
 
 1063                text->SetAttributes( textAttrs );
 
 1064                text->SetTextPos( cursorPos );
 
 1082                else if( 
text->GetTextPos() != cursorPos )
 
 1091                    if( !
m_view->IsLayerVisible( 
text->GetLayer() ) )
 
 1093                        m_frame->GetAppearancePanel()->SetLayerVisible( 
text->GetLayer(), 
true );
 
 1094                        m_frame->GetCanvas()->Refresh();
 
 1111                commit.
Push( 
_( 
"Draw Text" ) );
 
 1123            if( evt->IsPrime() && !ignorePrimePosition )
 
 1125                cursorPos = evt->Position();
 
 1126                m_controls->WarpMouseCursor( cursorPos, 
true );
 
 1130                m_controls->PinCursorInsideNonAutoscrollArea( 
true );
 
 1142            text->SetPosition( cursorPos );
 
 1160            evt->SetPassEvent();
 
 
 1232        grid.SetUseGrid( 
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
 
 1234                                                                    { m_frame->GetActiveLayer() }, 
GRID_TEXT ),
 
 1236        m_controls->ForceCursorPosition( 
true, cursorPos );
 
 1251        else if( evt->IsActivate() )
 
 1256            if( evt->IsMoveTool() )
 
 1275        else if( evt->IsClick( 
BUT_LEFT ) )
 
 1285                table->SetLayer( layer );
 
 1286                table->SetColCount( 1 );
 
 1289                table->SetLayer( layer );
 
 1290                table->SetPosition( cursorPos );
 
 1292                if( !
m_view->IsLayerVisible( layer ) )
 
 1294                    m_frame->GetAppearancePanel()->SetLayerVisible( layer, 
true );
 
 1295                    m_frame->GetCanvas()->Refresh();
 
 1327                    commit.
Push( 
_( 
"Draw Table" ) );
 
 1341            VECTOR2I requestedSize( cursorPos - origin );
 
 1343            int colCount = std::max( 1, requestedSize.
x / ( fontSize.
x * 15 ) );
 
 1344            int rowCount = std::max( 1, requestedSize.
y / ( fontSize.
y * 3  ) );
 
 1346            VECTOR2I cellSize( std::max( fontSize.
x * 5, requestedSize.
x / colCount ),
 
 1347                               std::max( fontSize.
y * 3, requestedSize.
y / rowCount ) );
 
 1349            cellSize.
x = 
KiROUND( (
double) cellSize.
x / gridSize.
x ) * gridSize.
x;
 
 1350            cellSize.
y = 
KiROUND( (
double) cellSize.
y / gridSize.
y ) * gridSize.
y;
 
 1352            table->ClearCells();
 
 1353            table->SetColCount( colCount );
 
 1355            for( 
int col = 0; col < colCount; ++col )
 
 1356                table->SetColWidth( col, cellSize.
x );
 
 1358            for( 
int row = 0; row < rowCount; ++row )
 
 1360                table->SetRowHeight( row, cellSize.
y );
 
 1362                for( 
int col = 0; col < colCount; ++col )
 
 1367                    table->AddCell( cell );
 
 1388            evt->SetPassEvent();
 
 
 1462        grid.SetUseGrid( 
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
 
 1464                                                                    { m_frame->GetActiveLayer() }, 
GRID_TEXT ),
 
 1466        m_controls->ForceCursorPosition( 
true, cursorPos );
 
 1468        if( evt->IsCancelInteractive()
 
 1482        else if( evt->IsActivate() )
 
 1487            if( evt->IsMoveTool() )
 
 1505        else if( evt->IsClick( 
BUT_LEFT ) )
 
 1532                if( !
m_view->IsLayerVisible( layer ) )
 
 1534                    m_frame->GetAppearancePanel()->SetLayerVisible( layer, 
true );
 
 1535                    m_frame->GetCanvas()->Refresh();
 
 1538                commit.
Add( barcode );
 
 1539                commit.
Push( 
_( 
"Draw Barcode" ) );
 
 1549            evt->SetPassEvent();
 
 
 1573    enum DIMENSION_STEPS
 
 1588    int                    step = SET_ORIGIN;
 
 1601                m_view->Update( &preview );
 
 1604                dimension = 
nullptr;
 
 1633        if( step > SET_ORIGIN )
 
 1634            frame()->SetMsgPanel( dimension );
 
 1640        if( evt->Modifier( 
MD_CTRL ) )
 
 1643        grid.SetUseGrid( 
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
 
 1651                grid.SetUseGrid( 
false );
 
 1655        VECTOR2I cursorPos = evt->HasPosition() ? evt->Position() : 
m_controls->GetMousePosition();
 
 1659        m_controls->ForceCursorPosition( 
true, cursorPos );
 
 1661        if( evt->IsCancelInteractive() || ( dimension && evt->IsAction( &
ACTIONS::undo ) ) )
 
 1665            if( step != SET_ORIGIN )    
 
 1675        else if( evt->IsActivate() )
 
 1677            if( step != SET_ORIGIN )
 
 1680            if( evt->IsPointEditor() )
 
 1684            else if( evt->IsMoveTool() )
 
 1699            m_view->Update( &preview );
 
 1700            frame()->SetMsgPanel( dimension );
 
 1708                m_view->Update( &preview );
 
 1709                frame()->SetMsgPanel( dimension );
 
 1730                auto setMeasurementAttributes =
 
 1744                    setMeasurementAttributes( dimension );
 
 1749                    setMeasurementAttributes( dimension );
 
 1758                    setMeasurementAttributes( dimension );
 
 1767                    wxFAIL_MSG( wxT( 
"Unhandled action in DRAWING_TOOL::DrawDimension" ) );
 
 1770                t = dimension->
Type();
 
 1781                dimension->
SetEnd( cursorPos );
 
 1784                if( !
m_view->IsLayerVisible( layer ) )
 
 1786                    m_frame->GetAppearancePanel()->SetLayerVisible( layer, 
true );
 
 1787                    m_frame->GetCanvas()->Refresh();
 
 1790                preview.
Add( dimension );
 
 1791                frame()->SetMsgPanel( dimension );
 
 1817                preview.
Remove( dimension );
 
 1819                commit.
Add( dimension );
 
 1820                commit.
Push( 
_( 
"Draw Dimension" ) );
 
 1824                    frame()->OnEditItemRequest( dimension );
 
 1831            if( ++step >= FINISHED )
 
 1833                dimension = 
nullptr;
 
 1838            else if( evt->IsDblClick( 
BUT_LEFT ) )
 
 1843        else if( evt->IsMotion() )
 
 1848                dimension->
SetEnd( cursorPos );
 
 1872                        textOffset = -textOffset;
 
 1881                        textOffset = -textOffset;
 
 1898                    double  height = ( 
delta.x * cos( angle ) ) + ( 
delta.y * sin( angle ) );
 
 1936                    ortho->SetHeight( vert ? heightVector.
x : heightVector.
y );
 
 1944            m_view->Update( &preview );
 
 1950            if( !
m_view->IsLayerVisible( layer ) )
 
 1952                m_frame->GetAppearancePanel()->SetLayerVisible( layer, 
true );
 
 1953                m_frame->GetCanvas()->Refresh();
 
 1963            m_view->Update( &preview );
 
 1964            frame()->SetMsgPanel( dimension );
 
 1968            if( step == SET_END || step == SET_HEIGHT )
 
 1970                frame()->OnEditItemRequest( dimension );
 
 1972                frame()->SetMsgPanel( dimension );
 
 1982            switch( dimension->
Type() )
 
 1997            m_view->Update( &preview );
 
 2006            evt->SetPassEvent();
 
 2010    if( step != SET_ORIGIN )
 
 2018    m_view->Remove( &preview );
 
 
 2047    if( dlgResult != wxID_OK )
 
 2053        wxMessageBox( 
_( 
"No graphic items found in file.") );
 
 2059    std::vector<BOARD_ITEM*> newItems;          
 
 2060    std::vector<BOARD_ITEM*> selectedItems;     
 
 2070        newItems.push_back( 
group );
 
 2071        selectedItems.push_back( 
group );
 
 2077        std::vector<PCB_SHAPE*> shapeList;
 
 2079        for( 
const std::unique_ptr<EDA_ITEM>& ptr : list )
 
 2082                shapeList.push_back( shape );
 
 2088    for( std::unique_ptr<EDA_ITEM>& ptr : list )
 
 2090        EDA_ITEM* eda_item = ptr.release();
 
 2096            newItems.push_back( item );
 
 2099                group->AddItem( item );
 
 2101                selectedItems.push_back( item );
 
 2106        preview.
Add( eda_item );
 
 2112    EDA_ITEMS selItems( selectedItems.begin(), selectedItems.end() );
 
 2120        commit.
Push( 
_( 
"Import Graphics" ) );
 
 2128    if( !
m_view->IsLayerVisible( layer ) )
 
 2130        m_frame->GetAppearancePanel()->SetLayerVisible( layer, 
true );
 
 2131        m_frame->GetCanvas()->Refresh();
 
 2159        item->Move( 
delta );
 
 2161    m_view->Update( &preview );
 
 2169        grid.SetUseGrid( 
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
 
 2172        m_controls->ForceCursorPosition( 
true, cursorPos );
 
 2174        if( evt->IsCancelInteractive() || evt->IsActivate() )
 
 2186        else if( evt->IsMotion() )
 
 2191                item->Move( 
delta );
 
 2193            m_view->Update( &preview );
 
 2205            commit.
Push( 
_( 
"Import Graphics" ) );
 
 2215            evt->SetPassEvent();
 
 2220    m_view->Remove( &preview );
 
 
 2272        grid.SetUseGrid( 
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
 
 2274        m_controls->ForceCursorPosition( 
true, cursorPos );
 
 2284            footprint->MoveAnchorPosition( moveVector );
 
 2286            commit.
Push( 
_( 
"Move Footprint Anchor" ) );
 
 2297        else if( evt->IsCancelInteractive() || evt->IsActivate() )
 
 2304            evt->SetPassEvent();
 
 
 2330                              std::optional<VECTOR2D> aStartingPoint,
 
 2331                              std::stack<PCB_SHAPE*>* aCommittedGraphics )
 
 2333    SHAPE_T shape = ( *aGraphic )->GetShape();
 
 2374    m_view->Add( &twoPointAsst );
 
 2376    bool     started = 
false;
 
 2377    bool     cancelled = 
false;
 
 2378    bool     isLocalOriginSet = ( 
m_frame->GetScreen()->m_LocalOrigin != 
VECTOR2D( 0, 0 ) );
 
 2395                if( !isLocalOriginSet )
 
 2406    if( aStartingPoint )
 
 2407        m_toolMgr->PrimeTool( *aStartingPoint );
 
 2415            m_frame->SetMsgPanel( graphic );
 
 2419        if( evt->Modifier( 
MD_CTRL ) )
 
 2426        grid.SetUseGrid( 
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
 
 2429        m_controls->ForceCursorPosition( 
true, cursorPos );
 
 2431        if( evt->IsCancelInteractive() || ( started && evt->IsAction( &
ACTIONS::undo ) ) )
 
 2438                evt->SetPassEvent( 
false );
 
 2445        else if( evt->IsActivate() )
 
 2447            if( evt->IsPointEditor() )
 
 2451            else if( evt->IsMoveTool() )
 
 2490                    m_frame->GetCanvas()->Refresh();
 
 2500                frame()->SetMsgPanel( graphic );
 
 2504                evt->SetPassEvent();
 
 2523                if( aStartingPoint )
 
 2525                    cursorPos = *aStartingPoint;
 
 2526                    aStartingPoint = std::nullopt;
 
 2541                grid.SetSkipPoint( cursorPos );
 
 2544                twoPointMgr.
SetEnd( cursorPos );
 
 2546                if( !isLocalOriginSet )
 
 2547                    m_frame->GetScreen()->m_LocalOrigin = cursorPos;
 
 2550                frame()->SetMsgPanel( graphic );
 
 2557                    m_frame->GetCanvas()->Refresh();
 
 2573                    commit.
Add( graphic );
 
 2574                    commit.
Push( 
_( 
"Draw Line" ) );
 
 2587                twoPointMgr.
Reset();
 
 2593        else if( evt->IsMotion() )
 
 2595            VECTOR2I clampedCursorPos = cursorPos;
 
 2619                twoPointMgr.
SetEnd( clampedCursorPos );
 
 2625            m_view->Update( &twoPointAsst );
 
 2630            if( aCommittedGraphics && !aCommittedGraphics->empty() )
 
 2632                twoPointMgr.
SetOrigin( aCommittedGraphics->top()->GetStart() );
 
 2633                twoPointMgr.
SetEnd( aCommittedGraphics->top()->GetEnd() );
 
 2634                aCommittedGraphics->pop();
 
 2647                m_view->Update( &twoPointAsst );
 
 2660            frame()->SetMsgPanel( graphic );
 
 2669                frame()->SetMsgPanel( graphic );
 
 2674            frame()->OnEditItemRequest( graphic );
 
 2676            frame()->SetMsgPanel( graphic );
 
 2685            isLocalOriginSet = 
true;
 
 2686            evt->SetPassEvent();
 
 2692                userUnits = 
frame()->GetUserUnits();
 
 2693                twoPointAsst.
SetUnits( userUnits );
 
 2694                m_view->Update( &twoPointAsst );
 
 2696            evt->SetPassEvent();
 
 2700            evt->SetPassEvent();
 
 2704    if( !isLocalOriginSet ) 
 
 2707    m_view->Remove( &twoPointAsst );
 
 
 2750                            std::optional<VECTOR2D> aStartingPoint )
 
 2752    wxCHECK( aGraphic, 
false );
 
 2756    wxCHECK( graphic, 
false );
 
 2789                *aGraphic = 
nullptr;
 
 2797    bool started = 
false;
 
 2798    bool cancelled = 
false;
 
 2802    if( aStartingPoint )
 
 2803        m_toolMgr->PrimeTool( *aStartingPoint );
 
 2809            m_frame->SetMsgPanel( graphic );
 
 2817        if( evt->Modifier( 
MD_CTRL ) )
 
 2819        grid.SetUseGrid( 
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
 
 2823        m_controls->ForceCursorPosition( 
true, cursorPos );
 
 2825        if( evt->IsCancelInteractive() || ( started && evt->IsAction( &
ACTIONS::undo ) ) )
 
 2832                evt->SetPassEvent( 
false );
 
 2839        else if( evt->IsActivate() )
 
 2841            if( evt->IsPointEditor() )
 
 2845            else if( evt->IsMoveTool() )
 
 2860        else if( evt->IsClick( 
BUT_LEFT ) )
 
 2877                    m_frame->GetCanvas()->Refresh();
 
 2880                preview.
Add( graphic );
 
 2881                frame()->SetMsgPanel( graphic );
 
 2885            arcManager.
AddPoint( cursorPos, 
true );
 
 2891        else if( evt->IsMotion() )
 
 2897            arcManager.
AddPoint( cursorPos, 
false );
 
 2914                    m_frame->GetCanvas()->Refresh();
 
 2919                m_view->Update( &preview );
 
 2920                frame()->SetMsgPanel( graphic );
 
 2924                evt->SetPassEvent();
 
 2932                frame()->OnEditItemRequest( graphic );
 
 2933                m_view->Update( &preview );
 
 2934                frame()->SetMsgPanel( graphic );
 
 2941                frame()->OnEditItemRequest( graphic );
 
 2942                m_view->Update( &preview );
 
 2943                frame()->SetMsgPanel( graphic );
 
 2948                evt->SetPassEvent();
 
 2965                m_view->Update( &preview );
 
 2966                frame()->SetMsgPanel( graphic );
 
 2978                    m_view->Update( &preview );
 
 2979                    frame()->SetMsgPanel( graphic );
 
 2990            m_view->Update( &arcAsst );
 
 2991            evt->SetPassEvent();
 
 3000            evt->SetPassEvent();
 
 3010            m_view->Update( &preview );
 
 3011            m_view->Update( &arcAsst );
 
 3014                frame()->SetMsgPanel( graphic );
 
 3020    preview.
Remove( graphic );
 
 3021    m_view->Remove( &arcAsst );
 
 3022    m_view->Remove( &preview );
 
 
 3043    std::unique_ptr<PCB_SHAPE> bezier = std::make_unique<PCB_SHAPE>( 
m_frame->GetModel() );
 
 3045    bezier->SetFlags( 
IS_NEW );
 
 3064    m_view->Add( &bezierAsst );
 
 3067    const auto setCursor =
 
 3073    const auto resetProgress =
 
 3085    const auto started =
 
 3092    bool priming = 
false;
 
 3097    if( aStartingPoint )
 
 3101        if( aStartingControl1Point )
 
 3103            bezierManager.
AddPoint( *aStartingPoint, 
true );
 
 3104            bezierManager.
AddPoint( *aStartingControl1Point, 
true );
 
 3105            m_toolMgr->PrimeTool( *aStartingControl1Point );
 
 3109            bezierManager.
AddPoint( *aStartingPoint, 
true );
 
 3110            m_toolMgr->PrimeTool( *aStartingPoint );
 
 3118            m_frame->SetMsgPanel( bezier.get() );
 
 3129        grid.SetUseGrid( 
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
 
 3133        m_controls->ForceCursorPosition( 
true, cursorPos );
 
 3135        if( evt->IsCancelInteractive() || ( started() && evt->IsAction( &
ACTIONS::undo ) ) )
 
 3142                evt->SetPassEvent( 
false );
 
 3155        else if( evt->IsActivate() )
 
 3157            if( evt->IsPointEditor() )
 
 3161            else if( evt->IsMoveTool() )
 
 3188                    m_frame->GetCanvas()->Refresh();
 
 3191                frame()->SetMsgPanel( bezier.get() );
 
 3195                bezierManager.
AddPoint( cursorPos, 
true );
 
 3199            const bool doubleClick = evt->IsDblClick( 
BUT_LEFT );
 
 3205                    bezierManager.
AddPoint( cursorPos, 
true );
 
 3209                preview.
Add( bezier.get() );
 
 3224                preview.
Remove( bezier.get() );
 
 3226        else if( evt->IsMotion() )
 
 3232            bezierManager.
AddPoint( cursorPos, 
false );
 
 3247                m_frame->GetCanvas()->Refresh();
 
 3252            m_view->Update( &preview );
 
 3253            frame()->SetMsgPanel( bezier.get() );
 
 3260                frame()->OnEditItemRequest( bezier.get() );
 
 3261                m_view->Update( &preview );
 
 3262                frame()->SetMsgPanel( bezier.get() );
 
 3267                evt->SetPassEvent();
 
 3279            m_view->Update( &preview );
 
 3280            frame()->SetMsgPanel( bezier.get() );
 
 3289                m_view->Update( &preview );
 
 3290                frame()->SetMsgPanel( bezier.get() );
 
 3296            m_view->Update( &bezierAsst );
 
 3297            evt->SetPassEvent();
 
 3306            evt->SetPassEvent();
 
 3315            bezier->SetStart( bezierManager.
GetStart() );
 
 3317            bezier->SetEnd( bezierManager.
GetEnd() );
 
 3319            bezier->RebuildBezierToSegmentsPointsList( maxError );
 
 3321            m_view->Update( &preview );
 
 3322            m_view->Update( &bezierAsst );
 
 3326                frame()->SetMsgPanel( bezier.get() );
 
 3332    preview.
Remove( bezier.get() );
 
 3333    m_view->Remove( &bezierAsst );
 
 3334    m_view->Remove( &preview );
 
 
 3350    bool clearSelection = 
false;
 
 3362        clearSelection = 
true;
 
 3373        if( clearSelection )
 
 
 3407    ZONE* sourceZone = 
nullptr;
 
 3418    params.
m_mode = zoneMode;
 
 3429    bool                 started     = 
false;
 
 3443                polyGeomMgr.
Reset();
 
 3445                grid.ClearSkipPoint();
 
 3469        if( evt->Modifier( 
MD_CTRL ) )
 
 3472        grid.SetUseGrid( 
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
 
 3474        VECTOR2I cursorPos = evt->HasPosition() ? evt->Position() : 
m_controls->GetMousePosition();
 
 3477        m_controls->ForceCursorPosition( 
true, cursorPos );
 
 3481        if( evt->IsCancelInteractive() )
 
 3492                evt->SetPassEvent( 
false );
 
 3496        else if( evt->IsActivate() )
 
 3501            if( evt->IsPointEditor() )
 
 3505            else if( evt->IsMoveTool() )
 
 3523                m_frame->GetAppearancePanel()->SetLayerVisible( params.
m_layer, 
true );
 
 3524                m_frame->GetCanvas()->Refresh();
 
 3540            const bool endPolygon = evt->IsDblClick( 
BUT_LEFT )
 
 3547                polyGeomMgr.
Reset();
 
 3554            else if( polyGeomMgr.
AddPoint( cursorPos ) )
 
 3565                        m_frame->GetAppearancePanel()->SetLayerVisible( params.
m_layer, 
true );
 
 3566                        m_frame->GetCanvas()->Refresh();
 
 3577                cursorPos = last.value();
 
 3579                m_controls->ForceCursorPosition( 
true, cursorPos );
 
 3587        else if( started && (   evt->IsMotion()
 
 3613            evt->SetPassEvent();
 
 
 3640        std::shared_ptr<DRC_ENGINE> m_drcEngine;
 
 3642        int                         m_worstClearance;
 
 3643        bool                        m_allowDRCViolations;
 
 3650                m_worstClearance( 0 )
 
 3668                    m_worstClearance = std::max( m_worstClearance, constraint.
GetValue().
Min() );
 
 3674                        std::optional<int> padOverride = 
pad->GetClearanceOverrides( 
nullptr );
 
 3676                        if( padOverride.has_value() )
 
 3677                            m_worstClearance = std::max( m_worstClearance, padOverride.value() );
 
 3686        virtual ~VIA_PLACER()
 
 3704            const BOX2I bbox = getEffectiveBoundingBox( *aVia, aPosition );
 
 3706            std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
 
 3708            std::vector<PCB_TRACK*> possible_tracks;
 
 3710            wxCHECK( 
view, 
nullptr );
 
 3712            view->Query( bbox, items );
 
 3716                if( !it.first->IsBOARD_ITEM() )
 
 3731                        possible_tracks.push_back( track );
 
 3739                        possible_tracks.push_back( arc );
 
 3744            int min_d = std::numeric_limits<int>::max();
 
 3746            for( 
PCB_TRACK* track : possible_tracks )
 
 3748                SEG test( track->GetStart(), track->GetEnd() );
 
 3749                int dist = ( 
test.NearestPoint( aPosition ) - aPosition ).EuclideanNorm();
 
 3754                    return_track = track;
 
 3758            return return_track;
 
 3766            ZONE*                 zone = 
dynamic_cast<ZONE*
>( aOther );
 
 3792                int connectedItemNet = connectedItem->
GetNetCode();
 
 3794                if( connectedItemNet == 0 || connectedItemNet == aVia->
GetNetCode() )
 
 3812                    if( viaShape->Collide( otherShape.get(), 
clearance - m_drcEpsilon ) )
 
 3834        bool checkDRCViolation( 
PCB_VIA* aVia )
 
 3836            std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
 
 3837            std::set<BOARD_ITEM*> checkedItems;
 
 3840            bbox.
Inflate( m_worstClearance );
 
 3841            m_frame->GetCanvas()->GetView()->Query( bbox, items );
 
 3843            for( std::pair<KIGFX::VIEW_ITEM*, int> it : items )
 
 3845                if( !it.first->IsBOARD_ITEM() )
 
 3863                else if( checkedItems.count( item ) )
 
 3868                if( hasDRCViolation( aVia, item ) )
 
 3871                checkedItems.insert( item );
 
 3886            const BOX2I bbox = getEffectiveBoundingBox( *aVia, aPosition );
 
 3889            std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
 
 3891            view.Query( bbox, items );
 
 3895                if( !it.first->IsBOARD_ITEM() )
 
 3904                    if( 
pad.HitTest( aPosition ) )
 
 3915            BOX2I      bbox = getEffectiveBoundingBox( *aVia, aPosition );
 
 3917            std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
 
 3920            std::vector<PCB_SHAPE*> possible_shapes;
 
 3922            view->Query( bbox, items );
 
 3926                if( !it.first->IsBOARD_ITEM() )
 
 3939                        possible_shapes.push_back( shape );
 
 3944            int min_d = std::numeric_limits<int>::max();
 
 3946            for( 
PCB_SHAPE* shape : possible_shapes )
 
 3948                int dist = ( shape->GetPosition() - aPosition ).EuclideanNorm();
 
 3953                    return_shape = shape;
 
 3957            return return_shape;
 
 3960        std::optional<int> selectPossibleNetsByPopupMenu( std::set<int>& aNetcodeList )
 
 3964            std::map<int, int>  menuIDNetCodeMap;
 
 3967            for( 
int netcode : aNetcodeList )
 
 3973                    menuText = wxString::Format( 
"%s\t",
 
 3976                    menuText = wxString::Format( 
"&%d  %s\t",
 
 3987                menuIDNetCodeMap[ menuID ] = netcode;
 
 3997            int  selectedNetCode = -1;
 
 3998            bool cancelled = 
false;
 
 4004                    evt->SetPassEvent();
 
 4008                    std::optional<int> 
id = evt->GetCommandId();
 
 4011                    if( 
id && ( *
id > 0 ) && ( *
id < menuID ) )
 
 4013                        selectedNetCode = menuIDNetCodeMap.at( *
id );
 
 4028                return std::optional<int>();
 
 4030                return selectedNetCode;
 
 4033        std::optional<int> findStitchedZoneNet( 
PCB_VIA* aVia )
 
 4037            std::set<int>       netcodeList;
 
 4047                        if( z->IsOnLayer( 
m_frame->GetActiveLayer() ) )
 
 4049                            if( z->HitTestFilledArea( 
m_frame->GetActiveLayer(), position ) )
 
 4050                                netcodeList.insert( z->GetNetCode() );
 
 4057            if( netcodeList.size() == 1 )
 
 4058                return *netcodeList.begin();
 
 4065                if( z->GetIsRuleArea() )
 
 4070                    if( z->IsOnLayer( layer ) )
 
 4072                        if( z->HitTestFilledArea( layer, position ) )
 
 4073                            netcodeList.insert( z->GetNetCode() );
 
 4079            if( netcodeList.size() == 1 )
 
 4080                return *netcodeList.begin();
 
 4082            if( netcodeList.size() > 1 )
 
 4085                return selectPossibleNetsByPopupMenu( netcodeList );
 
 4110                    SEG      trackSeg( track->GetStart(), track->GetEnd() );
 
 4120                if( 
PAD* 
pad = findPad( 
via, position ) )
 
 4131                    if( shape->IsAnyFill() )
 
 4137                        double shapeArea = poly.
Area();
 
 4139                        int    R = 
via->GetWidth() / 2;
 
 4140                        double viaArea = 
M_PI * R * R;
 
 4142                        if( viaArea * 4 > shapeArea )
 
 4147                        switch( shape->GetShape() )
 
 4151                            SEG seg( shape->GetStart(), shape->GetEnd() );
 
 4159                            if( ( shape->GetEnd() - position ).SquaredEuclideanNorm() <
 
 4160                                ( shape->GetStart() - position ).SquaredEuclideanNorm() )
 
 4174                            if( !shape->IsPolyShapeValid() )
 
 4181                            std::optional<SEG> nearestSeg;
 
 4182                            int minDist = std::numeric_limits<int>::max();
 
 4191                                    int dist = seg.
Distance( position );
 
 4193                                    if( dist < minDist )
 
 4232                via->SetIsFree( 
false );
 
 4236                via->SetNetCode( 
pad->GetNetCode() );
 
 4237                via->SetIsFree( 
false );
 
 4242                via->SetIsFree( 
false );
 
 4246                std::optional<int> netcode = findStitchedZoneNet( 
via );
 
 4248                if( !netcode.has_value() )  
 
 4251                via->SetNetCode( netcode.value() );
 
 4252                via->SetIsFree( 
via->GetNetCode() > 0 );
 
 4255            if( checkDRCViolation( 
via ) )
 
 4257                m_frame->ShowInfoBarError( 
_( 
"Via location violates DRC." ), 
true,
 
 4260                if( !m_allowDRCViolations )
 
 4274            if( track && m_gridHelper.
GetSnap() )
 
 4278                SEG      trackSeg( trackStart, trackEnd );
 
 4280                if( viaPos == trackStart || viaPos == trackEnd )
 
 4294                newTrack->
SetEnd( trackEnd );
 
 4295                aCommit.
Add( newTrack );
 
 4301        std::unique_ptr<BOARD_ITEM> CreateItem()
 override 
 4306            via->SetNetCode( 0 );
 
 4319                if( first_layer != 
m_frame->GetScreen()->m_Route_Layer_TOP )
 
 4320                    last_layer = 
m_frame->GetScreen()->m_Route_Layer_TOP;
 
 4322                    last_layer = 
m_frame->GetScreen()->m_Route_Layer_BOTTOM;
 
 4324                via->SetLayerPair( first_layer, last_layer );
 
 4330                               via->GetEffectiveNetClass()->GetuViaDiameter() );
 
 4331                via->SetDrill( 
via->GetEffectiveNetClass()->GetuViaDrill() );
 
 4339            return std::unique_ptr<BOARD_ITEM>( 
via );
 
 4343    VIA_PLACER placer( 
frame() );
 
 
constexpr EDA_IU_SCALE pcbIUScale
 
constexpr int ARC_LOW_DEF
 
@ HIDDEN
Inactive layers are hidden.
 
@ DIMMED
Inactive layers are dimmed (old high-contrast mode)
 
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
 
static TOOL_ACTION cancelInteractive
 
static TOOL_ACTION selectItem
Select an item (specified as the event parameter).
 
static TOOL_ACTION selectionCursor
Select a single item under the cursor position.
 
static TOOL_ACTION updateUnits
 
static TOOL_ACTION activatePointEditor
 
static TOOL_ACTION doDelete
 
static TOOL_ACTION cursorClick
 
static TOOL_ACTION selectionClear
Clear the current selection.
 
static TOOL_ACTION refreshPreview
 
static TOOL_ACTION selectItems
Select a list of items (specified as the event parameter)
 
static TOOL_ACTION resetLocalCoords
 
virtual void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Execute the changes.
 
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
 
Container for design settings for a BOARD object.
 
DIM_PRECISION m_DimensionPrecision
Number of digits after the decimal.
 
void UseCustomTrackViaSize(bool aEnabled)
Enables/disables custom track/via size settings.
 
VIATYPE m_CurrentViaType
(VIA_BLIND_BURIED, VIA_THROUGH, VIA_MICROVIA)
 
DIM_UNITS_FORMAT m_DimensionUnitsFormat
 
bool GetTextUpright(PCB_LAYER_ID aLayer) const
 
int GetTextThickness(PCB_LAYER_ID aLayer) const
Return the default text thickness from the layer class for the given layer.
 
bool GetTextItalic(PCB_LAYER_ID aLayer) const
 
int GetCurrentViaSize() const
 
void SetViaSizeIndex(int aIndex)
Set the current via size list index to aIndex.
 
std::shared_ptr< DRC_ENGINE > m_DRCEngine
 
bool m_UseConnectedTrackWidth
 
int GetViaSizeIndex() const
 
bool m_DimensionSuppressZeroes
 
int GetDRCEpsilon() const
Return an epsilon which accounts for rounding errors, etc.
 
bool m_DimensionKeepTextAligned
 
VECTOR2I GetTextSize(PCB_LAYER_ID aLayer) const
Return the default text size from the layer class for the given layer.
 
int GetLineThickness(PCB_LAYER_ID aLayer) const
Return the default graphic segment thickness from the layer class for the given layer.
 
int GetCurrentViaDrill() const
 
DIM_TEXT_POSITION m_DimensionTextPosition
 
DIM_UNITS_MODE m_DimensionUnitsMode
 
std::vector< VIA_DIMENSION > m_ViasDimensionsList
 
int m_DimensionExtensionOffset
 
int m_DimensionArrowLength
 
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
 
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
 
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
 
virtual std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
 
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
 
virtual std::shared_ptr< SHAPE_SEGMENT > GetEffectiveHoleShape() const
 
virtual bool HasHole() const
 
const FOOTPRINTS & Footprints() const
 
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
 
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
 
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 void Move(const Vec &aMoveVector)
Move the rectangle by the aMoveVector.
 
constexpr coord_type GetRight() const
 
constexpr coord_type GetTop() const
 
constexpr coord_type GetBottom() const
 
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
 
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.
 
DIALOG_BARCODE_PROPERTIES, derived from DIALOG_BARCODE_PROPERTIES_BASE, created by wxFormBuilder.
 
std::list< std::unique_ptr< EDA_ITEM > > & GetImportedItems()
 
bool ShouldFixDiscontinuities()
 
void SetFilenameOverride(const wxString &aFilenameOverride)
Set the filename override to be applied in TransferDataToWindow.
 
bool IsPlacementInteractive()
 
Implementing DIALOG_TRACK_VIA_SIZE_BASE.
 
SEVERITY GetSeverity() const
 
const MINOPTMAX< int > & GetValue() const
 
A base class for most all the KiCad significant classes used in schematics and boards.
 
virtual VECTOR2I GetPosition() const
 
virtual void SetPosition(const VECTOR2I &aPos)
 
void SetFlags(EDA_ITEM_FLAGS aMask)
 
KICAD_T Type() const
Returns the type of object.
 
const VECTOR2I & GetBezierC2() const
 
void SetCenter(const VECTOR2I &aCenter)
 
virtual void SetFilled(bool aFlag)
 
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
 
void SetStart(const VECTOR2I &aStart)
 
void SetShape(SHAPE_T aShape)
 
void SetEnd(const VECTOR2I &aEnd)
 
void SetArcAngleAndEnd(const EDA_ANGLE &aAngle, bool aCheckNegativeAngle=false)
Set the end point from the angle center and start.
 
void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
 
virtual bool IsVisible() const
 
void SetTextPos(const VECTOR2I &aPoint)
 
void SetMirrored(bool isMirrored)
 
void SetTextThickness(int aWidth)
The TextThickness is that set by the user.
 
void SetItalic(bool aItalic)
Set the text to be italic - this will also update the font if needed.
 
A color representation with 4 components: red, green, blue, alpha.
 
Represents an assistant draw when interactively drawing an arc on a canvas.
 
void SetUnits(EDA_UNITS aUnits)
 
Manage the construction of a circular arc though sequential setting of critical points: center,...
 
VECTOR2I GetOrigin() const
< Get the center point of the arc (valid when state > SET_ORIGIN)
 
void SetAngleSnap(bool aSnap)
 
ARC_STEPS GetStep() const
Get the current step the manager is on (useful when drawing something depends on the current state)
 
void ToggleClockwise()
Set angle snapping (for the next point)
 
VECTOR2I GetStartRadiusEnd() const
Get the coordinates of the arc end point.
 
VECTOR2I GetEndRadiusEnd() const
Get the radius of the arc (valid if step >= SET_START)
 
EDA_ANGLE GetSubtended() const
 
@ SET_ANGLE
Waiting to lock in the arc end point.
 
@ SET_START
Waiting to lock in the arc start point.
 
Represents an assistant draw when interactively drawing a bezier on a canvas.
 
void SetUnits(EDA_UNITS aUnits)
 
Manage the construction of a bezier through a series of steps.
 
VECTOR2I GetControlC2() const
Get the coordinates of the arc end point.
 
VECTOR2I GetControlC1() const
 
VECTOR2I GetStart() const
< Get the center point of the arc (valid when state > SET_ORIGIN)
 
@ SET_END
Waiting to lock in the end point.
 
@ SET_START
Waiting to lock in the start point.
 
BEZIER_STEPS GetStep() const
Get the current step the manager is on (useful when drawing something depends on the current state)
 
bool HasGeometryChanged() const
 
void AddPoint(const VECTOR2I &aPt, bool aLockIn)
Add a point to the construction manager.
 
void RemoveLastPoint()
Undo the last point, and move the manager back to the previous step.
 
Represents an assistant draw when interactively drawing a line or circle on a canvas.
 
void SetUnits(EDA_UNITS aUnits)
 
Represent a very simple geometry manager for items that have a start and end point.
 
void SetOrigin(const VECTOR2I &aOrigin)
< Set the origin of the ruler (the fixed end)
 
void SetAngleSnap(LEADER_MODE aSnap)
 
VECTOR2I GetOrigin() const
 
void Reset()
Reset the manager to the initial state.
 
void SetEnd(const VECTOR2I &aEnd)
Set the current end of the rectangle (the end that moves with the cursor.
 
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
 
const std::set< int > & GetHighlightNetCodes() const
Return the netcode of currently highlighted net.
 
An interface for classes handling user events controlling the view behavior such as zooming,...
 
virtual void CaptureCursor(bool aEnabled)
Force the cursor to stay within the drawing panel area.
 
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.
 
virtual void WarpMouseCursor(const VECTOR2D &aPosition, bool aWorldCoordinates=false, bool aWarpView=false)=0
If enabled (.
 
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
 
virtual VECTOR2D GetMousePosition(bool aWorldCoordinates=true) const =0
Return the current mouse pointer position.
 
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.
 
virtual void PinCursorInsideNonAutoscrollArea(bool aWarpMouseCursor)=0
 
bool IsBOARD_ITEM() const
 
std::pair< VIEW_ITEM *, int > LAYER_ITEM_PAIR
 
LSET is a set of PCB_LAYER_IDs.
 
static const LSET & AllLayersMask()
 
static LSET AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
 
const wxString & GetNetname() const
 
Container for NETINFO_ITEM elements, which are the nets.
 
static const int ORPHANED
Constant that forces initialization of a netinfo item to the NETINFO_ITEM ORPHANED (typically -1) whe...
 
NETINFO_ITEM * GetNetItem(int aNetCode) const
 
void ForEachUniqueLayer(const std::function< void(PCB_LAYER_ID)> &aMethod) const
Runs the given callable for each active unique copper layer in this padstack, meaning F_Cu for MODE::...
 
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
 
static TOOL_ACTION deleteLastPoint
 
static TOOL_ACTION drawRuleArea
 
static TOOL_ACTION changeDimensionArrows
Switch between dimension arrow directions.
 
static TOOL_ACTION drawBezier
 
static TOOL_ACTION placeText
 
static TOOL_ACTION drawOrthogonalDimension
 
static TOOL_ACTION drawRectangle
 
static TOOL_ACTION setAnchor
 
static TOOL_ACTION placeReferenceImage
 
static TOOL_ACTION drawCircle
 
static TOOL_ACTION tuneDiffPair
 
static TOOL_ACTION trackViaSizeChanged
 
static TOOL_ACTION layerChanged
 
static TOOL_ACTION drawTable
 
static TOOL_ACTION drawTextBox
 
static TOOL_ACTION drawZoneCutout
 
static TOOL_ACTION drawPolygon
 
static TOOL_ACTION drawRadialDimension
 
static TOOL_ACTION tuneSingleTrack
 
static TOOL_ACTION properties
Activation of the edit tool.
 
static TOOL_ACTION drawLeader
 
static TOOL_ACTION tuneSkew
 
static TOOL_ACTION incWidth
Increase width of currently drawn line.
 
static TOOL_ACTION clearHighlight
 
static TOOL_ACTION spacingDecrease
 
static TOOL_ACTION placeImportedGraphics
 
static TOOL_ACTION drawVia
 
static TOOL_ACTION drawArc
 
static TOOL_ACTION drawSimilarZone
 
static TOOL_ACTION decWidth
Decrease width of currently drawn line.
 
static TOOL_ACTION drawCenterDimension
 
static TOOL_ACTION arcPosture
Switch posture when drawing arc.
 
static TOOL_ACTION ddImportGraphics
 
static TOOL_ACTION placeBarcode
 
static TOOL_ACTION placePoint
 
static TOOL_ACTION closeOutline
 
static TOOL_ACTION amplIncrease
 
static TOOL_ACTION amplDecrease
 
static TOOL_ACTION lengthTunerSettings
 
static TOOL_ACTION spacingIncrease
 
static TOOL_ACTION drawLine
 
static TOOL_ACTION drawAlignedDimension
 
static TOOL_ACTION drawZone
 
virtual bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
 
void SetTextSize(int aTextSize)
Change the height of the human-readable text displayed below the barcode.
 
void SetPosition(const VECTOR2I &aPos) override
 
void SetLayer(PCB_LAYER_ID aLayer) override
Set the drawing layer for the barcode and its text.
 
Common, abstract interface for edit frames.
 
wxString GetDesignRulesPath()
Return the absolute path to the design rules file for the currently-loaded board.
 
virtual MAGNETIC_SETTINGS * GetMagneticItemsSettings()
 
void Update()
Update the dimension's cached text and geometry.
 
int GetLineThickness() const
 
void SetExtensionOffset(int aOffset)
 
void SetLineThickness(int aWidth)
 
void SetArrowLength(int aLength)
 
virtual const VECTOR2I & GetStart() const
The dimension's origin is the first feature point for the dimension.
 
DIM_ARROW_DIRECTION GetArrowDirection() const
 
virtual void SetEnd(const VECTOR2I &aPoint)
 
virtual void SetStart(const VECTOR2I &aPoint)
 
void SetArrowDirection(const DIM_ARROW_DIRECTION &aDirection)
 
int GetArrowLength() const
 
virtual const VECTOR2I & GetEnd() const
 
For better understanding of the points that make a dimension:
 
double GetAngle() const
Return the angle of the crossbar.
 
void SetHeight(int aHeight)
Set the distance from the feature points to the crossbar line.
 
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 ...
 
A radial dimension indicates either the radius or diameter of an arc or circle.
 
HIGH_CONTRAST_MODE m_ContrastModeDisplay
How inactive layers are displayed.
 
The main frame for Pcbnew.
 
VECTOR2I AlignToSegment(const VECTOR2I &aPoint, const SEG &aSeg)
 
A set of BOARD_ITEMs (i.e., without duplicates).
 
Object to handle a bitmap image that can be inserted in a PCB.
 
EDA_ITEM * GetTopLeftItem(bool aFootprintsOnly=false) const override
 
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
 
void SetPosition(const VECTOR2I &aPos) override
 
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
 
void SetStroke(const STROKE_PARAMS &aStroke) override
 
void Normalize() override
Perform any normalization required after a user rotate and/or flip.
 
VECTOR2I GetPosition() const override
 
void SetEnd(const VECTOR2I &aEnd)
 
void SetStart(const VECTOR2I &aStart)
 
virtual EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
 
const VECTOR2I & GetStart() const
 
const VECTOR2I & GetEnd() const
 
virtual int GetWidth() const
 
VECTOR2I GetPosition() const override
 
std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const override
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
 
const PADSTACK & Padstack() const
 
int GetWidth() const override
 
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
 
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
 
virtual COMMON_SETTINGS * GetCommonSettings() const
 
A holder to handle information on schematic or board items.
 
ROUTING_SETTINGS & Settings()
 
bool AllowDRCViolations() const
 
Class that handles the drawing of a polygon, including management of last corner deletion and drawing...
 
bool AddPoint(const VECTOR2I &aPt)
Lock in a polygon point.
 
void SetCursorPosition(const VECTOR2I &aPos)
Set the current cursor position.
 
bool NewPointClosesOutline(const VECTOR2I &aPt) const
 
std::optional< VECTOR2I > DeleteLastCorner()
Remove the last-added point from the polygon.
 
void SetFinished()
Mark the polygon finished and update the client.
 
void SetLeaderMode(LEADER_MODE aMode)
Set the leader mode to use when calculating the leader/returner lines.
 
void Reset()
Clear the manager state and start again.
 
RAII class that sets an value at construction and resets it to the original value at destruction.
 
int Distance(const SEG &aSeg) const
Compute minimum Euclidean distance to segment aSeg.
 
bool Contains(const SEG &aSeg) const
 
virtual void Add(EDA_ITEM *aItem)
 
virtual void Remove(EDA_ITEM *aItem)
 
virtual void Clear() override
Remove all the stored items from the group.
 
void SetReferencePoint(const VECTOR2I &aP)
 
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
 
virtual const SEG GetSegment(int aIndex) const override
 
int SegmentCount() const
Return the number of segments in this line chain.
 
Represent a set of closed polygons.
 
double Area()
Return the area of this poly set.
 
bool Collide(const SHAPE *aShape, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const override
Check if the boundary of shape (this) lies closer to the shape aShape than aClearance,...
 
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
 
int OutlineCount() const
Return the number of outlines in the set.
 
GR_TEXT_H_ALIGN_T m_Halign
 
GR_TEXT_V_ALIGN_T m_Valign
 
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
 
A modified version of the wxInfoBar class that allows us to:
 
void Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
 
MESSAGE_TYPE GetMessageType() const
 
void OnGeometryChange(const POLYGON_GEOM_MANAGER &aMgr) override
Called when the polygon is complete.
 
bool GetIsRuleArea() const
Accessors to parameters used in Rule Area zones:
 
bool GetDoNotAllowVias() const
 
SHAPE_POLY_SET * Outline()
 
virtual bool IsOnLayer(PCB_LAYER_ID) const override
Test to see if this object is on the given layer.
 
PCB_LAYER_ID GetFirstLayer() const
 
This file is part of the common library.
 
@ HOLE_CLEARANCE_CONSTRAINT
 
static constexpr EDA_ANGLE ANGLE_0
 
static constexpr EDA_ANGLE ANGLE_90
 
std::vector< EDA_ITEM * > EDA_ITEMS
Define list of drawing items for screens.
 
#define IS_NEW
New item, just created.
 
#define IS_MOVING
Item being moved.
 
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
 
void ConnectBoardShapes(std::vector< PCB_SHAPE * > &aShapeList, int aChainingEpsilon)
Connects shapes to each other, making continious contours (adjacent shapes will have a common vertex)...
 
a few functions useful in geometry calculations.
 
VECTOR2< T > GetVectorSnapped45(const VECTOR2< T > &aVec, bool only45=false)
Snap a vector onto the nearest 0, 45 or 90 degree line.
 
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...
 
LEADER_MODE
The kind of the leader line.
 
@ DIRECT
Unconstrained point-to-point.
 
VECTOR2< T > GetVectorSnapped90(const VECTOR2< T > &aVec)
Snap a vector onto the nearest horizontal or vertical line.
 
void InferBold(TEXT_ATTRIBUTES *aAttrs)
 
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
 
@ LAYER_FILLED_SHAPES
Copper graphic shape opacity/visibility (color ignored).
 
@ LAYER_ZONES
Control for copper zone opacity/visibility (color ignored).
 
PCB_LAYER_ID
A quick note on layer IDs:
 
This file contains miscellaneous commonly used macros and functions.
 
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
 
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
 
@ SIMILAR
Add a new zone with the same settings as an existing one.
 
@ ADD
Add a new zone/keepout with fresh settings.
 
BARCODE class definition.
 
Class to handle a set of BOARD_ITEMs.
 
SCOPED_SET_RESET< DRAWING_TOOL::MODE > SCOPED_DRAW_MODE
 
@ ID_POPUP_PCB_SELECT_CUSTOM_WIDTH
 
@ ID_POPUP_PCB_SELECT_VIASIZE1
 
@ ID_POPUP_PCB_SELECT_VIASIZE16
 
int GetUserUnits()
Return the currently selected user unit value for the interface.
 
PGM_BASE & Pgm()
The global program "get" accessor.
 
Class that computes missing connections on a PCB.
 
std::optional< VECTOR2I > OPT_VECTOR2I
 
bool NoPrintableChars(const wxString &aString)
Return true if the string is empty or contains only whitespace.
 
LINE_STYLE
Dashed line types.
 
A filename or source description, a problem input line, a line number, a byte offset,...
 
std::unique_ptr< BOARD_ITEM > CreateItem() override
 
DRAWING_TOOL & m_drawingTool
 
PCB_BASE_EDIT_FRAME & m_frame
 
PCB_GRID_HELPER m_gridHelper
 
void SnapItem(BOARD_ITEM *aItem) override
 
POINT_PLACER(DRAWING_TOOL &aDrawingTool, PCB_BASE_EDIT_FRAME &aFrame)
 
Container to handle a stock of specific vias each with unique diameter and drill sizes in the BOARD c...
 
Parameters used to fully describe a zone creation process.
 
ZONE_MODE m_mode
Zone settings source (for similar and cutout zones)
 
bool m_keepout
< Should create a keepout zone?
 
ZONE * m_sourceZone
Zone leader mode.
 
PCB_LAYER_ID m_layer
The zone mode to operate in.
 
SHAPE_CIRCLE circle(c.m_circle_center, c.m_circle_radius)
 
wxString result
Test unit parsing edge cases and error handling.
 
bool TestSegmentHit(const VECTOR2I &aRefPoint, const VECTOR2I &aStart, const VECTOR2I &aEnd, int aDist)
Test if aRefPoint is with aDistance on the line defined by aStart and aEnd.
 
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_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_ZONE_T
class ZONE, a copper pour area
 
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
 
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
 
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
 
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
 
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
 
@ PCB_PAD_T
class PAD, a pad in a footprint
 
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
 
@ PCB_DIMENSION_T
class PCB_DIMENSION_BASE: abstract dimension meta-type
 
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
 
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
 
VECTOR2< int32_t > VECTOR2I
 
VECTOR2< double > VECTOR2D