28#include "dialog_table_properties.h"
35#include <dialogs/dialog_text_properties.h>
61#include <wx/filedlg.h>
123 _(
"Specify custom track and via sizes" ), wxITEM_CHECK );
132 if(
via.m_Drill > 0 )
134 msg.Printf(
_(
"Via %s, hole %s" ),
140 msg.Printf(
_(
"Via %s" ),
145 Append( menuIdx, msg, wxEmptyString, wxITEM_CHECK );
154 int id = aEvent.GetId();
212 auto activeToolFunctor =
231 auto canCloseOutline =
251 auto tuningToolActive =
257 auto dimensionToolActive =
285 std::shared_ptr<VIA_SIZE_MENU> viaSizeMenu = std::make_shared<VIA_SIZE_MENU>();
286 viaSizeMenu->SetTool(
this );
287 m_menu->RegisterSubMenu( viaSizeMenu );
288 ctxMenu.
AddMenu( viaSizeMenu.get(), viaToolActive, 500 );
347 m_frame->DisplayConstraintsMsg(
_(
"Constrain to H, V, 45" ) );
350 m_frame->DisplayConstraintsMsg(
_(
"Constrain to H, V" ) );
353 m_frame->DisplayConstraintsMsg( wxString(
"" ) );
374 std::optional<VECTOR2D> startingPoint;
375 std::stack<PCB_SHAPE*> committedLines;
386 while(
drawShape( aEvent, &line, startingPoint, &committedLines ) )
391 commit.
Push(
_(
"Draw Line" ) );
393 committedLines.push( line );
397 startingPoint = std::nullopt;
424 std::optional<VECTOR2D> startingPoint;
437 while(
drawShape( aEvent, &rect, startingPoint,
nullptr ) )
441 bool cancelled =
false;
444 cancelled =
m_frame->ShowTextBoxPropertiesDialog( textbox ) != wxID_OK;
455 commit.
Push( isTextBox ?
_(
"Draw Text Box" ) :
_(
"Draw Rectangle" ) );
465 startingPoint = std::nullopt;
515 std::optional<VECTOR2D> startingPoint;
526 while(
drawArc( aEvent, &arc, startingPoint ) )
531 commit.
Push(
_(
"Draw Arc" ) );
540 startingPoint = std::nullopt;
570 std::unique_ptr<PCB_SHAPE> bezier =
574 startingPoint = std::nullopt;
575 startingC1 = std::nullopt;
581 commit.
Add( bezier.release() );
582 commit.
Push(
_(
"Draw Bezier" ) );
587 startingPoint = bezierRef.
GetEnd();
612 bool immediateMode =
image !=
nullptr;
614 bool ignorePrimePosition =
false;
627 image->SetPosition( cursorPos );
648 m_view->RecacheAllItems();
673 ignorePrimePosition =
true;
682 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
686 m_controls->ForceCursorPosition(
true, cursorPos );
706 else if( evt->IsActivate() )
708 if(
image && evt->IsMoveTool() )
711 evt->SetPassEvent(
false );
717 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel image creation." ) );
718 evt->SetPassEvent(
false );
722 if( evt->IsMoveTool() )
739 wxFileDialog dlg(
m_frame,
_(
"Choose Image" ), wxEmptyString, wxEmptyString,
744 bool cancelled =
false;
749 cancelled = dlg.ShowModal() != wxID_OK;
758 if( evt->IsPrime() && !ignorePrimePosition )
760 cursorPos =
grid.Align( evt->Position() );
771 wxString fullFilename = dlg.GetPath();
773 if( wxFileExists( fullFilename ) )
776 if( !
image || !
image->GetReferenceImage().ReadImageFile( fullFilename ) )
778 wxMessageBox( wxString::Format(
_(
"Could not load image from '%s'." ), fullFilename ) );
789 m_view->RecacheAllItems();
794 m_view->ShowPreview(
true );
799 commit.Push(
_(
"Place Image" ) );
824 || evt->IsMotion() ) )
826 image->SetPosition( cursorPos );
829 m_view->RecacheAllItems();
862 m_gridHelper( aDrawingTool.GetManager(), aFrame.GetMagneticItemsSettings() )
868 std::unique_ptr<PCB_POINT> new_point = std::make_unique<PCB_POINT>(
m_frame.GetModel() );
871 new_point->SetLayer( layer );
926 bool ignorePrimePosition =
false;
972 ignorePrimePosition =
true;
981 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
983 { m_frame->GetActiveLayer() },
GRID_TEXT ),
985 m_controls->ForceCursorPosition(
true, cursorPos );
991 else if( evt->IsCancelInteractive() || (
text && evt->IsAction( &
ACTIONS::undo ) ) )
1003 else if( evt->IsActivate() )
1008 if( evt->IsMoveTool() )
1026 else if( evt->IsClick(
BUT_LEFT ) )
1028 bool placing =
text !=
nullptr;
1053 text->SetLayer( layer );
1054 text->SetAttributes( textAttrs );
1055 text->SetTextPos( cursorPos );
1073 else if(
text->GetTextPos() != cursorPos )
1082 if( !
m_view->IsLayerVisible(
text->GetLayer() ) )
1084 m_frame->GetAppearancePanel()->SetLayerVisible(
text->GetLayer(),
true );
1085 m_frame->GetCanvas()->Refresh();
1102 commit.
Push(
_(
"Draw Text" ) );
1114 if( evt->IsPrime() && !ignorePrimePosition )
1116 cursorPos = evt->Position();
1117 m_controls->WarpMouseCursor( cursorPos,
true );
1121 m_controls->PinCursorInsideNonAutoscrollArea(
true );
1133 text->SetPosition( cursorPos );
1151 evt->SetPassEvent();
1224 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1226 { m_frame->GetActiveLayer() },
GRID_TEXT ),
1228 m_controls->ForceCursorPosition(
true, cursorPos );
1234 else if( evt->IsCancelInteractive() || (
table && evt->IsAction( &
ACTIONS::undo ) ) )
1246 else if( evt->IsActivate() )
1251 if( evt->IsMoveTool() )
1270 else if( evt->IsClick(
BUT_LEFT ) )
1280 table->SetLayer( layer );
1281 table->SetColCount( 1 );
1284 table->SetLayer( layer );
1285 table->SetPosition( cursorPos );
1287 if( !
m_view->IsLayerVisible( layer ) )
1289 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
1290 m_frame->GetCanvas()->Refresh();
1322 commit.
Push(
_(
"Draw Table" ) );
1336 VECTOR2I requestedSize( cursorPos - origin );
1338 int colCount = std::max( 1, requestedSize.
x / ( fontSize.
x * 15 ) );
1339 int rowCount = std::max( 1, requestedSize.
y / ( fontSize.
y * 3 ) );
1341 VECTOR2I cellSize( std::max( fontSize.
x * 5, requestedSize.
x / colCount ),
1342 std::max( fontSize.
y * 3, requestedSize.
y / rowCount ) );
1344 cellSize.
x =
KiROUND( (
double) cellSize.
x / gridSize.
x ) * gridSize.
x;
1345 cellSize.
y =
KiROUND( (
double) cellSize.
y / gridSize.
y ) * gridSize.
y;
1347 table->ClearCells();
1348 table->SetColCount( colCount );
1350 for(
int col = 0; col < colCount; ++col )
1351 table->SetColWidth( col, cellSize.
x );
1353 for(
int row = 0; row < rowCount; ++row )
1355 table->SetRowHeight( row, cellSize.
y );
1357 for(
int col = 0; col < colCount; ++col )
1362 table->AddCell( cell );
1383 evt->SetPassEvent();
1458 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1460 { m_frame->GetActiveLayer() },
GRID_TEXT ),
1462 m_controls->ForceCursorPosition(
true, cursorPos );
1468 else if( evt->IsCancelInteractive() || ( barcode && evt->IsAction( &
ACTIONS::undo ) ) )
1480 else if( evt->IsActivate() )
1485 if( evt->IsMoveTool() )
1503 else if( evt->IsClick(
BUT_LEFT ) )
1530 if( !
m_view->IsLayerVisible( layer ) )
1532 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
1533 m_frame->GetCanvas()->Refresh();
1536 commit.
Add( barcode );
1537 commit.
Push(
_(
"Draw Barcode" ) );
1547 evt->SetPassEvent();
1571 enum DIMENSION_STEPS
1586 int step = SET_ORIGIN;
1599 m_view->Update( &preview );
1602 dimension =
nullptr;
1631 if( step > SET_ORIGIN )
1632 frame()->SetMsgPanel( dimension );
1638 if( evt->Modifier(
MD_CTRL ) )
1641 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1649 grid.SetUseGrid(
false );
1653 VECTOR2I cursorPos = evt->HasPosition() ? evt->Position() :
m_controls->GetMousePosition();
1657 m_controls->ForceCursorPosition(
true, cursorPos );
1659 if( evt->IsCancelInteractive() || ( dimension && evt->IsAction( &
ACTIONS::undo ) ) )
1663 if( step != SET_ORIGIN )
1673 else if( evt->IsActivate() )
1675 if( step != SET_ORIGIN )
1678 if( evt->IsPointEditor() )
1682 else if( evt->IsMoveTool() )
1697 m_view->Update( &preview );
1698 frame()->SetMsgPanel( dimension );
1706 m_view->Update( &preview );
1707 frame()->SetMsgPanel( dimension );
1728 auto setMeasurementAttributes =
1742 setMeasurementAttributes( dimension );
1747 setMeasurementAttributes( dimension );
1756 setMeasurementAttributes( dimension );
1765 wxFAIL_MSG( wxT(
"Unhandled action in DRAWING_TOOL::DrawDimension" ) );
1768 t = dimension->
Type();
1779 dimension->
SetEnd( cursorPos );
1782 if( !
m_view->IsLayerVisible( layer ) )
1784 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
1785 m_frame->GetCanvas()->Refresh();
1788 preview.
Add( dimension );
1789 frame()->SetMsgPanel( dimension );
1815 preview.
Remove( dimension );
1817 commit.
Add( dimension );
1818 commit.
Push(
_(
"Draw Dimension" ) );
1822 frame()->OnEditItemRequest( dimension );
1829 if( ++step >= FINISHED )
1831 dimension =
nullptr;
1836 else if( evt->IsDblClick(
BUT_LEFT ) )
1841 else if( evt->IsMotion() )
1846 dimension->
SetEnd( cursorPos );
1870 textOffset = -textOffset;
1879 textOffset = -textOffset;
1896 double height = (
delta.x * cos( angle ) ) + (
delta.y * sin( angle ) );
1934 ortho->SetHeight( vert ? heightVector.
x : heightVector.
y );
1942 m_view->Update( &preview );
1948 if( !
m_view->IsLayerVisible( layer ) )
1950 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
1951 m_frame->GetCanvas()->Refresh();
1961 m_view->Update( &preview );
1962 frame()->SetMsgPanel( dimension );
1966 if( step == SET_END || step == SET_HEIGHT )
1968 frame()->OnEditItemRequest( dimension );
1970 frame()->SetMsgPanel( dimension );
1980 switch( dimension->
Type() )
1995 m_view->Update( &preview );
2004 evt->SetPassEvent();
2008 if( step != SET_ORIGIN )
2016 m_view->Remove( &preview );
2045 if( dlgResult != wxID_OK )
2051 wxMessageBox(
_(
"No graphic items found in file.") );
2057 std::vector<BOARD_ITEM*> newItems;
2058 std::vector<BOARD_ITEM*> selectedItems;
2066 size_t boardItemCount = std::count_if( list.begin(), list.end(),
2067 [](
const std::unique_ptr<EDA_ITEM>& ptr )
2069 return ptr->IsBOARD_ITEM();
2072 if( boardItemCount >= 2 )
2076 newItems.push_back(
group );
2077 selectedItems.push_back(
group );
2084 std::vector<PCB_SHAPE*> shapeList;
2086 for(
const std::unique_ptr<EDA_ITEM>& ptr : list )
2089 shapeList.push_back( shape );
2095 for( std::unique_ptr<EDA_ITEM>& ptr : list )
2097 EDA_ITEM* eda_item = ptr.release();
2103 newItems.push_back( item );
2106 group->AddItem( item );
2108 selectedItems.push_back( item );
2113 preview.
Add( eda_item );
2119 EDA_ITEMS selItems( selectedItems.begin(), selectedItems.end() );
2127 commit.
Push(
_(
"Import Graphics" ) );
2135 if( !
m_view->IsLayerVisible( layer ) )
2137 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
2138 m_frame->GetCanvas()->Refresh();
2166 item->Move(
delta );
2168 m_view->Update( &preview );
2176 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2179 m_controls->ForceCursorPosition(
true, cursorPos );
2181 if( evt->IsCancelInteractive() || evt->IsActivate() )
2193 else if( evt->IsMotion() )
2198 item->Move(
delta );
2200 m_view->Update( &preview );
2212 commit.
Push(
_(
"Import Graphics" ) );
2222 evt->SetPassEvent();
2227 m_view->Remove( &preview );
2279 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2281 m_controls->ForceCursorPosition(
true, cursorPos );
2291 footprint->MoveAnchorPosition( moveVector );
2293 commit.
Push(
_(
"Move Footprint Anchor" ) );
2304 else if( evt->IsCancelInteractive() || evt->IsActivate() )
2311 evt->SetPassEvent();
2328 const double cosRot = rot.
Cos();
2329 const double sinRot = rot.
Sin();
2331 const double dx = aCursorPos.
x -
center.x;
2332 const double dy = aCursorPos.
y -
center.y;
2333 const double lx = dx * cosRot + dy * sinRot;
2334 const double ly = -dx * sinRot + dy * cosRot;
2337 const double px = a * t.
Cos();
2338 const double py = b * t.
Sin();
2361 if( halfW >= halfH )
2363 majorRadius = std::max( halfW, 1 );
2364 minorRadius = std::max( halfH, 1 );
2369 majorRadius = std::max( halfH, 1 );
2370 minorRadius = std::max( halfW, 1 );
2395 std::optional<VECTOR2D> aStartingPoint,
2396 std::stack<PCB_SHAPE*>* aCommittedGraphics )
2398 SHAPE_T shape = ( *aGraphic )->GetShape();
2441 m_view->Add( &twoPointAsst );
2443 bool started =
false;
2444 bool cancelled =
false;
2445 bool multiPhase =
false;
2447 bool isLocalOriginSet = (
m_frame->GetScreen()->m_LocalOrigin !=
VECTOR2D( 0, 0 ) );
2467 if( !isLocalOriginSet )
2478 if( aStartingPoint )
2479 m_toolMgr->PrimeTool( *aStartingPoint );
2487 m_frame->SetMsgPanel( graphic );
2497 if( evt->Modifier(
MD_CTRL ) )
2504 if( evt->Modifier(
MD_CTRL ) )
2508 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2511 m_controls->ForceCursorPosition(
true, cursorPos );
2513 if( evt->IsCancelInteractive() || ( started && evt->IsAction( &
ACTIONS::undo ) ) )
2520 evt->SetPassEvent(
false );
2527 else if( evt->IsActivate() )
2529 if( evt->IsPointEditor() )
2533 else if( evt->IsMoveTool() )
2572 m_frame->GetCanvas()->Refresh();
2582 frame()->SetMsgPanel( graphic );
2586 evt->SetPassEvent();
2605 if( aStartingPoint )
2607 cursorPos = *aStartingPoint;
2608 aStartingPoint = std::nullopt;
2623 grid.SetSkipPoint( cursorPos );
2626 twoPointMgr.
SetEnd( cursorPos );
2628 if( !isLocalOriginSet )
2629 m_frame->GetScreen()->m_LocalOrigin = cursorPos;
2632 frame()->SetMsgPanel( graphic );
2639 m_frame->GetCanvas()->Refresh();
2649 else if( multiPhase )
2674 m_view->Remove( &twoPointAsst );
2686 commit.
Add( graphic );
2687 commit.
Push(
_(
"Draw Line" ) );
2700 twoPointMgr.
Reset();
2707 else if( evt->IsMotion() )
2733 frame()->SetMsgPanel( graphic );
2737 VECTOR2I clampedCursorPos = cursorPos;
2761 twoPointMgr.
SetEnd( clampedCursorPos );
2767 m_view->Update( &twoPointAsst );
2773 if( aCommittedGraphics && !aCommittedGraphics->empty() )
2775 twoPointMgr.
SetOrigin( aCommittedGraphics->top()->GetStart() );
2776 twoPointMgr.
SetEnd( aCommittedGraphics->top()->GetEnd() );
2777 aCommittedGraphics->pop();
2790 m_view->Update( &twoPointAsst );
2803 frame()->SetMsgPanel( graphic );
2812 frame()->SetMsgPanel( graphic );
2817 frame()->OnEditItemRequest( graphic );
2819 frame()->SetMsgPanel( graphic );
2828 isLocalOriginSet =
true;
2829 evt->SetPassEvent();
2833 if(
frame()->GetUserUnits() != userUnits )
2835 userUnits =
frame()->GetUserUnits();
2836 twoPointAsst.
SetUnits( userUnits );
2837 m_view->Update( &twoPointAsst );
2839 evt->SetPassEvent();
2843 evt->SetPassEvent();
2847 if( !isLocalOriginSet )
2851 m_view->Remove( &twoPointAsst );
2895 std::optional<VECTOR2D> aStartingPoint )
2897 wxCHECK( aGraphic,
false );
2901 wxCHECK( graphic,
false );
2934 *aGraphic =
nullptr;
2942 bool started =
false;
2943 bool cancelled =
false;
2947 if( aStartingPoint )
2948 m_toolMgr->PrimeTool( *aStartingPoint );
2954 m_frame->SetMsgPanel( graphic );
2963 if( evt->Modifier(
MD_CTRL ) )
2966 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2970 m_controls->ForceCursorPosition(
true, cursorPos );
2972 if( evt->IsCancelInteractive() || ( started && evt->IsAction( &
ACTIONS::undo ) ) )
2979 evt->SetPassEvent(
false );
2986 else if( evt->IsActivate() )
2988 if( evt->IsPointEditor() )
2992 else if( evt->IsMoveTool() )
3007 else if( evt->IsClick(
BUT_LEFT ) )
3024 m_frame->GetCanvas()->Refresh();
3027 preview.
Add( graphic );
3028 frame()->SetMsgPanel( graphic );
3032 arcManager.
AddPoint( cursorPos,
true );
3038 else if( evt->IsMotion() )
3044 arcManager.
AddPoint( cursorPos,
false );
3061 m_frame->GetCanvas()->Refresh();
3066 m_view->Update( &preview );
3067 frame()->SetMsgPanel( graphic );
3071 evt->SetPassEvent();
3079 frame()->OnEditItemRequest( graphic );
3080 m_view->Update( &preview );
3081 frame()->SetMsgPanel( graphic );
3088 frame()->OnEditItemRequest( graphic );
3089 m_view->Update( &preview );
3090 frame()->SetMsgPanel( graphic );
3095 evt->SetPassEvent();
3112 m_view->Update( &preview );
3113 frame()->SetMsgPanel( graphic );
3125 m_view->Update( &preview );
3126 frame()->SetMsgPanel( graphic );
3137 m_view->Update( &arcAsst );
3138 evt->SetPassEvent();
3147 evt->SetPassEvent();
3157 m_view->Update( &preview );
3158 m_view->Update( &arcAsst );
3161 frame()->SetMsgPanel( graphic );
3167 preview.
Remove( graphic );
3168 m_view->Remove( &arcAsst );
3169 m_view->Remove( &preview );
3190 std::unique_ptr<PCB_SHAPE> bezier = std::make_unique<PCB_SHAPE>(
m_frame->GetModel() );
3192 bezier->SetFlags(
IS_NEW );
3211 m_view->Add( &bezierAsst );
3214 const auto setCursor =
3220 const auto resetProgress =
3232 const auto started =
3239 bool priming =
false;
3244 if( aStartingPoint )
3248 if( aStartingControl1Point )
3250 bezierManager.
AddPoint( *aStartingPoint,
true );
3251 bezierManager.
AddPoint( *aStartingControl1Point,
true );
3252 m_toolMgr->PrimeTool( *aStartingControl1Point );
3256 bezierManager.
AddPoint( *aStartingPoint,
true );
3257 m_toolMgr->PrimeTool( *aStartingPoint );
3265 m_frame->SetMsgPanel( bezier.get() );
3276 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
3280 m_controls->ForceCursorPosition(
true, cursorPos );
3282 if( evt->IsCancelInteractive() || ( started() && evt->IsAction( &
ACTIONS::undo ) ) )
3289 evt->SetPassEvent(
false );
3302 else if( evt->IsActivate() )
3304 if( evt->IsPointEditor() )
3308 else if( evt->IsMoveTool() )
3335 m_frame->GetCanvas()->Refresh();
3338 frame()->SetMsgPanel( bezier.get() );
3342 bezierManager.
AddPoint( cursorPos,
true );
3346 const bool doubleClick = evt->IsDblClick(
BUT_LEFT );
3352 bezierManager.
AddPoint( cursorPos,
true );
3356 preview.
Add( bezier.get() );
3371 preview.
Remove( bezier.get() );
3373 else if( evt->IsMotion() )
3379 bezierManager.
AddPoint( cursorPos,
false );
3394 m_frame->GetCanvas()->Refresh();
3399 m_view->Update( &preview );
3400 frame()->SetMsgPanel( bezier.get() );
3407 frame()->OnEditItemRequest( bezier.get() );
3408 m_view->Update( &preview );
3409 frame()->SetMsgPanel( bezier.get() );
3414 evt->SetPassEvent();
3426 m_view->Update( &preview );
3427 frame()->SetMsgPanel( bezier.get() );
3436 m_view->Update( &preview );
3437 frame()->SetMsgPanel( bezier.get() );
3443 m_view->Update( &bezierAsst );
3444 evt->SetPassEvent();
3453 evt->SetPassEvent();
3462 bezier->SetStart( bezierManager.
GetStart() );
3464 bezier->SetEnd( bezierManager.
GetEnd() );
3466 bezier->RebuildBezierToSegmentsPointsList( maxError );
3468 m_view->Update( &preview );
3469 m_view->Update( &bezierAsst );
3473 frame()->SetMsgPanel( bezier.get() );
3479 preview.
Remove( bezier.get() );
3480 m_view->Remove( &bezierAsst );
3481 m_view->Remove( &preview );
3497 bool clearSelection =
false;
3509 clearSelection =
true;
3520 if( clearSelection )
3556 ZONE* sourceZone =
nullptr;
3568 params.
m_mode = zoneMode;
3579 bool started =
false;
3593 polyGeomMgr.
Reset();
3595 grid.ClearSkipPoint();
3619 if( evt->Modifier(
MD_CTRL ) )
3622 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
3624 VECTOR2I cursorPos = evt->HasPosition() ? evt->Position() :
m_controls->GetMousePosition();
3627 m_controls->ForceCursorPosition(
true, cursorPos );
3631 if( evt->IsCancelInteractive() )
3642 evt->SetPassEvent(
false );
3646 else if( evt->IsActivate() )
3651 if( evt->IsPointEditor() )
3655 else if( evt->IsMoveTool() )
3673 m_frame->GetAppearancePanel()->SetLayerVisible( params.
m_layer,
true );
3674 m_frame->GetCanvas()->Refresh();
3690 const bool endPolygon = evt->IsDblClick(
BUT_LEFT )
3697 polyGeomMgr.
Reset();
3704 else if( polyGeomMgr.
AddPoint( cursorPos ) )
3715 m_frame->GetAppearancePanel()->SetLayerVisible( params.
m_layer,
true );
3716 m_frame->GetCanvas()->Refresh();
3727 cursorPos = last.value();
3729 m_controls->ForceCursorPosition(
true, cursorPos );
3737 else if( started && ( evt->IsMotion()
3763 evt->SetPassEvent();
3790 std::shared_ptr<DRC_ENGINE> m_drcEngine;
3792 int m_worstClearance;
3793 bool m_allowDRCViolations;
3795 int sub_e(
int aClearance )
3797 return std::max( 0, aClearance - m_drcEpsilon );
3805 m_worstClearance( 0 )
3823 m_worstClearance = std::max( m_worstClearance, constraint.
GetValue().
Min() );
3829 std::optional<int> padOverride =
pad->GetClearanceOverrides(
nullptr );
3831 if( padOverride.has_value() )
3832 m_worstClearance = std::max( m_worstClearance, padOverride.value() );
3841 virtual ~VIA_PLACER()
3859 const BOX2I bbox = getEffectiveBoundingBox( *aVia, aPosition );
3861 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
3863 std::vector<PCB_TRACK*> possible_tracks;
3865 wxCHECK(
view,
nullptr );
3867 view->Query( bbox, items );
3871 if( !it.first->IsBOARD_ITEM() )
3886 possible_tracks.push_back( track );
3894 possible_tracks.push_back( arc );
3899 int min_d = std::numeric_limits<int>::max();
3901 for(
PCB_TRACK* track : possible_tracks )
3903 SEG test( track->GetStart(), track->GetEnd() );
3904 int dist = (
test.NearestPoint( aPosition ) - aPosition ).EuclideanNorm();
3909 return_track = track;
3913 return return_track;
3921 ZONE* zone =
dynamic_cast<ZONE*
>( aOther );
3947 int connectedItemNet = connectedItem->
GetNetCode();
3949 if( connectedItemNet == 0 || connectedItemNet == aVia->
GetNetCode() )
3967 if( viaShape->Collide( otherShape.get(), sub_e(
clearance ) ) )
3989 bool checkDRCViolation(
PCB_VIA* aVia )
3991 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
3992 std::set<BOARD_ITEM*> checkedItems;
3995 bbox.
Inflate( m_worstClearance );
3996 m_frame->GetCanvas()->GetView()->Query( bbox, items );
3998 for( std::pair<KIGFX::VIEW_ITEM*, int> it : items )
4000 if( !it.first->IsBOARD_ITEM() )
4018 else if( checkedItems.count( item ) )
4023 if( hasDRCViolation( aVia, item ) )
4026 checkedItems.insert( item );
4041 const BOX2I bbox = getEffectiveBoundingBox( *aVia, aPosition );
4044 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
4046 view.Query( bbox, items );
4050 if( !it.first->IsBOARD_ITEM() )
4059 if(
pad.HitTest( aPosition ) )
4070 BOX2I bbox = getEffectiveBoundingBox( *aVia, aPosition );
4072 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
4075 std::vector<PCB_SHAPE*> possible_shapes;
4077 view->Query( bbox, items );
4081 if( !it.first->IsBOARD_ITEM() )
4094 possible_shapes.push_back( shape );
4099 int min_d = std::numeric_limits<int>::max();
4101 for(
PCB_SHAPE* shape : possible_shapes )
4103 int dist = ( shape->GetPosition() - aPosition ).EuclideanNorm();
4108 return_shape = shape;
4112 return return_shape;
4115 std::optional<int> selectPossibleNetsByPopupMenu( std::set<int>& aNetcodeList )
4119 std::map<int, int> menuIDNetCodeMap;
4122 for(
int netcode : aNetcodeList )
4128 menuText = wxString::Format(
"%s\t",
4131 menuText = wxString::Format(
"&%d %s\t",
4142 menuIDNetCodeMap[ menuID ] = netcode;
4152 int selectedNetCode = -1;
4153 bool cancelled =
false;
4159 evt->SetPassEvent();
4163 std::optional<int>
id = evt->GetCommandId();
4166 if(
id && ( *
id > 0 ) && ( *
id < menuID ) )
4168 selectedNetCode = menuIDNetCodeMap.at( *
id );
4183 return std::optional<int>();
4185 return selectedNetCode;
4188 std::optional<int> findStitchedZoneNet(
PCB_VIA* aVia )
4192 std::set<int> netcodeList;
4202 if( z->IsOnLayer(
m_frame->GetActiveLayer() ) )
4204 if( z->HitTestFilledArea(
m_frame->GetActiveLayer(), position ) )
4205 netcodeList.insert( z->GetNetCode() );
4212 if( netcodeList.size() == 1 )
4213 return *netcodeList.begin();
4220 if( z->GetIsRuleArea() )
4225 if( z->IsOnLayer( layer ) )
4227 if( z->HitTestFilledArea( layer, position ) )
4228 netcodeList.insert( z->GetNetCode() );
4234 if( netcodeList.size() == 1 )
4235 return *netcodeList.begin();
4237 if( netcodeList.size() > 1 )
4240 return selectPossibleNetsByPopupMenu( netcodeList );
4265 SEG trackSeg( track->GetStart(), track->GetEnd() );
4275 if(
PAD*
pad = findPad(
via, position ) )
4286 if( shape->IsAnyFill() )
4292 double shapeArea = poly.
Area();
4294 int R =
via->GetWidth( shape->GetLayer() ) / 2;
4295 double viaArea =
M_PI * R * R;
4297 if( viaArea * 4 > shapeArea )
4302 switch( shape->GetShape() )
4306 SEG seg( shape->GetStart(), shape->GetEnd() );
4314 if( ( shape->GetEnd() - position ).SquaredEuclideanNorm() <
4315 ( shape->GetStart() - position ).SquaredEuclideanNorm() )
4329 if( !shape->IsPolyShapeValid() )
4336 std::optional<SEG> nearestSeg;
4337 int minDist = std::numeric_limits<int>::max();
4346 int dist = seg.
Distance( position );
4348 if( dist < minDist )
4387 via->SetIsFree(
false );
4391 via->SetNetCode(
pad->GetNetCode() );
4392 via->SetIsFree(
false );
4397 via->SetIsFree(
false );
4401 std::optional<int> netcode = findStitchedZoneNet(
via );
4403 if( !netcode.has_value() )
4406 via->SetNetCode( netcode.value() );
4407 via->SetIsFree(
via->GetNetCode() > 0 );
4410 if( checkDRCViolation(
via ) )
4412 m_frame->ShowInfoBarError(
_(
"Via location violates DRC." ),
true,
4413 WX_INFOBAR::MESSAGE_TYPE::DRC_VIOLATION );
4415 if( !m_allowDRCViolations )
4420 if( infobar->
GetMessageType() == WX_INFOBAR::MESSAGE_TYPE::DRC_VIOLATION )
4429 if( track && m_gridHelper.
GetSnap() )
4433 SEG trackSeg( trackStart, trackEnd );
4435 if( viaPos == trackStart || viaPos == trackEnd )
4449 newTrack->
SetEnd( trackEnd );
4450 aCommit.
Add( newTrack );
4456 std::unique_ptr<BOARD_ITEM> CreateItem()
override
4461 via->SetNetCode( 0 );
4474 if( first_layer !=
m_frame->GetScreen()->m_Route_Layer_TOP )
4475 last_layer =
m_frame->GetScreen()->m_Route_Layer_TOP;
4477 last_layer =
m_frame->GetScreen()->m_Route_Layer_BOTTOM;
4479 via->SetLayerPair( first_layer, last_layer );
4485 via->GetEffectiveNetClass()->GetuViaDiameter() );
4486 via->SetDrill(
via->GetEffectiveNetClass()->GetuViaDrill() );
4494 return std::unique_ptr<BOARD_ITEM>(
via );
4498 VIA_PLACER placer(
frame() );
4523 std::optional<VECTOR2D> startingPoint;
4525 auto makeShape = [&]()
4542 while( aDrawer( aEvent, &shape, startingPoint ) )
4546 commit.
Add( shape );
4547 commit.
Push( aCommitLabel );
4551 shape = makeShape();
4552 startingPoint = std::nullopt;
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,...
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
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 ClearEditFlags()
virtual void SetPosition(const VECTOR2I &aPos)
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
void SetEllipseRotation(const EDA_ANGLE &aA)
int GetEllipseMinorRadius() const
const VECTOR2I & GetBezierC2() const
const VECTOR2I & GetEllipseCenter() const
void SetCenter(const VECTOR2I &aCenter)
void SetEllipseCenter(const VECTOR2I &aPt)
int GetEllipseMajorRadius() const
void SetEllipseStartAngle(const EDA_ANGLE &aA)
EDA_ANGLE GetEllipseRotation() const
virtual void SetFilled(bool aFlag)
void SetEllipseEndAngle(const EDA_ANGLE &aA)
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 SetEllipseMajorRadius(int aR)
void SetEllipseMinorRadius(int aR)
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 & AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
static const LSET & AllLayersMask()
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 drawEllipseArc
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 drawCopperThievingZone
static TOOL_ACTION tuneSkew
static TOOL_ACTION incWidth
Increase width of currently drawn line.
static TOOL_ACTION drawEllipse
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
void EndEdit(bool aClosed=true)
void CalcEdit(const VECTOR2I &aPosition)
void SetEditState(int aState)
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.
bool ContinueEdit(const VECTOR2I &aPosition)
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.
Simple container to manage line stroke parameters.
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
static constexpr EDA_ANGLE ANGLE_360
#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)
static wxString ImageFileWildcard()
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
PGM_BASE & Pgm()
The global program "get" accessor.
Class that computes missing connections on a PCB.
std::vector< EDA_ITEM * > EDA_ITEMS
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.
bool m_thieving
Layer to begin drawing.
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.
std::vector< std::vector< std::string > > table
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
Definition of file extensions used in Kicad.