28#include "dialog_table_properties.h"
35#include <dialogs/dialog_text_properties.h>
61#include <wx/filedlg.h>
119 _(
"Specify custom track and via sizes" ), wxITEM_CHECK );
128 if(
via.m_Drill > 0 )
130 msg.Printf(
_(
"Via %s, hole %s" ),
136 msg.Printf(
_(
"Via %s" ),
141 Append( menuIdx, msg, wxEmptyString, wxITEM_CHECK );
150 int id = aEvent.GetId();
208 auto activeToolFunctor =
227 auto canCloseOutline =
247 auto tuningToolActive =
253 auto dimensionToolActive =
281 std::shared_ptr<VIA_SIZE_MENU> viaSizeMenu = std::make_shared<VIA_SIZE_MENU>();
282 viaSizeMenu->SetTool(
this );
283 m_menu->RegisterSubMenu( viaSizeMenu );
284 ctxMenu.
AddMenu( viaSizeMenu.get(), viaToolActive, 500 );
343 m_frame->DisplayConstraintsMsg(
_(
"Constrain to H, V, 45" ) );
346 m_frame->DisplayConstraintsMsg(
_(
"Constrain to H, V" ) );
349 m_frame->DisplayConstraintsMsg( wxString(
"" ) );
370 std::optional<VECTOR2D> startingPoint;
371 std::stack<PCB_SHAPE*> committedLines;
382 while(
drawShape( aEvent, &line, startingPoint, &committedLines ) )
387 commit.
Push(
_(
"Draw Line" ) );
389 committedLines.push( line );
393 startingPoint = std::nullopt;
420 std::optional<VECTOR2D> startingPoint;
433 while(
drawShape( aEvent, &rect, startingPoint,
nullptr ) )
437 bool cancelled =
false;
440 cancelled =
m_frame->ShowTextBoxPropertiesDialog( textbox ) != wxID_OK;
451 commit.
Push( isTextBox ?
_(
"Draw Text Box" ) :
_(
"Draw Rectangle" ) );
461 startingPoint = std::nullopt;
482 std::optional<VECTOR2D> startingPoint;
485 circle->SetFilled(
false );
499 commit.
Push(
_(
"Draw Circle" ) );
506 circle->SetFilled(
false );
509 startingPoint = std::nullopt;
530 std::optional<VECTOR2D> startingPoint;
541 while(
drawArc( aEvent, &arc, startingPoint ) )
546 commit.
Push(
_(
"Draw Arc" ) );
555 startingPoint = std::nullopt;
585 std::unique_ptr<PCB_SHAPE> bezier =
589 startingPoint = std::nullopt;
590 startingC1 = std::nullopt;
596 commit.
Add( bezier.release() );
597 commit.
Push(
_(
"Draw Bezier" ) );
602 startingPoint = bezierRef.
GetEnd();
627 bool immediateMode =
image !=
nullptr;
629 bool ignorePrimePosition =
false;
641 image->SetPosition( cursorPos );
662 m_view->RecacheAllItems();
687 ignorePrimePosition =
true;
696 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
700 m_controls->ForceCursorPosition(
true, cursorPos );
720 else if( evt->IsActivate() )
722 if(
image && evt->IsMoveTool() )
725 evt->SetPassEvent(
false );
731 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel image creation." ) );
732 evt->SetPassEvent(
false );
736 if( evt->IsMoveTool() )
753 wxFileDialog dlg(
m_frame,
_(
"Choose Image" ), wxEmptyString, wxEmptyString,
758 bool cancelled =
false;
763 cancelled = dlg.ShowModal() != wxID_OK;
772 if( evt->IsPrime() && !ignorePrimePosition )
774 cursorPos =
grid.Align( evt->Position() );
785 wxString fullFilename = dlg.GetPath();
787 if( wxFileExists( fullFilename ) )
790 if( !
image || !
image->GetReferenceImage().ReadImageFile( fullFilename ) )
792 wxMessageBox( wxString::Format(
_(
"Could not load image from '%s'." ), fullFilename ) );
803 m_view->RecacheAllItems();
808 m_view->ShowPreview(
true );
813 commit.Push(
_(
"Place Image" ) );
838 || evt->IsMotion() ) )
840 image->SetPosition( cursorPos );
843 m_view->RecacheAllItems();
876 m_gridHelper( aDrawingTool.GetManager(), aFrame.GetMagneticItemsSettings() )
882 std::unique_ptr<PCB_POINT> new_point = std::make_unique<PCB_POINT>(
m_frame.GetModel() );
885 new_point->SetLayer( layer );
939 bool ignorePrimePosition =
false;
985 ignorePrimePosition =
true;
994 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
996 { m_frame->GetActiveLayer() },
GRID_TEXT ),
998 m_controls->ForceCursorPosition(
true, cursorPos );
1004 else if( evt->IsCancelInteractive() || (
text && evt->IsAction( &
ACTIONS::undo ) ) )
1016 else if( evt->IsActivate() )
1021 if( evt->IsMoveTool() )
1039 else if( evt->IsClick(
BUT_LEFT ) )
1041 bool placing =
text !=
nullptr;
1066 text->SetLayer( layer );
1067 text->SetAttributes( textAttrs );
1068 text->SetTextPos( cursorPos );
1086 else if(
text->GetTextPos() != cursorPos )
1095 if( !
m_view->IsLayerVisible(
text->GetLayer() ) )
1097 m_frame->GetAppearancePanel()->SetLayerVisible(
text->GetLayer(),
true );
1098 m_frame->GetCanvas()->Refresh();
1115 commit.
Push(
_(
"Draw Text" ) );
1127 if( evt->IsPrime() && !ignorePrimePosition )
1129 cursorPos = evt->Position();
1130 m_controls->WarpMouseCursor( cursorPos,
true );
1134 m_controls->PinCursorInsideNonAutoscrollArea(
true );
1146 text->SetPosition( cursorPos );
1164 evt->SetPassEvent();
1236 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1238 { m_frame->GetActiveLayer() },
GRID_TEXT ),
1240 m_controls->ForceCursorPosition(
true, cursorPos );
1246 else if( evt->IsCancelInteractive() || (
table && evt->IsAction( &
ACTIONS::undo ) ) )
1258 else if( evt->IsActivate() )
1263 if( evt->IsMoveTool() )
1282 else if( evt->IsClick(
BUT_LEFT ) )
1292 table->SetLayer( layer );
1293 table->SetColCount( 1 );
1296 table->SetLayer( layer );
1297 table->SetPosition( cursorPos );
1299 if( !
m_view->IsLayerVisible( layer ) )
1301 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
1302 m_frame->GetCanvas()->Refresh();
1334 commit.
Push(
_(
"Draw Table" ) );
1348 VECTOR2I requestedSize( cursorPos - origin );
1350 int colCount = std::max( 1, requestedSize.
x / ( fontSize.
x * 15 ) );
1351 int rowCount = std::max( 1, requestedSize.
y / ( fontSize.
y * 3 ) );
1353 VECTOR2I cellSize( std::max( fontSize.
x * 5, requestedSize.
x / colCount ),
1354 std::max( fontSize.
y * 3, requestedSize.
y / rowCount ) );
1356 cellSize.
x =
KiROUND( (
double) cellSize.
x / gridSize.
x ) * gridSize.
x;
1357 cellSize.
y =
KiROUND( (
double) cellSize.
y / gridSize.
y ) * gridSize.
y;
1359 table->ClearCells();
1360 table->SetColCount( colCount );
1362 for(
int col = 0; col < colCount; ++col )
1363 table->SetColWidth( col, cellSize.
x );
1365 for(
int row = 0; row < rowCount; ++row )
1367 table->SetRowHeight( row, cellSize.
y );
1369 for(
int col = 0; col < colCount; ++col )
1374 table->AddCell( cell );
1395 evt->SetPassEvent();
1469 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1471 { m_frame->GetActiveLayer() },
GRID_TEXT ),
1473 m_controls->ForceCursorPosition(
true, cursorPos );
1479 else if( evt->IsCancelInteractive() || ( barcode && evt->IsAction( &
ACTIONS::undo ) ) )
1491 else if( evt->IsActivate() )
1496 if( evt->IsMoveTool() )
1514 else if( evt->IsClick(
BUT_LEFT ) )
1541 if( !
m_view->IsLayerVisible( layer ) )
1543 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
1544 m_frame->GetCanvas()->Refresh();
1547 commit.
Add( barcode );
1548 commit.
Push(
_(
"Draw Barcode" ) );
1558 evt->SetPassEvent();
1582 enum DIMENSION_STEPS
1597 int step = SET_ORIGIN;
1610 m_view->Update( &preview );
1613 dimension =
nullptr;
1642 if( step > SET_ORIGIN )
1643 frame()->SetMsgPanel( dimension );
1649 if( evt->Modifier(
MD_CTRL ) )
1652 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1660 grid.SetUseGrid(
false );
1664 VECTOR2I cursorPos = evt->HasPosition() ? evt->Position() :
m_controls->GetMousePosition();
1668 m_controls->ForceCursorPosition(
true, cursorPos );
1670 if( evt->IsCancelInteractive() || ( dimension && evt->IsAction( &
ACTIONS::undo ) ) )
1674 if( step != SET_ORIGIN )
1684 else if( evt->IsActivate() )
1686 if( step != SET_ORIGIN )
1689 if( evt->IsPointEditor() )
1693 else if( evt->IsMoveTool() )
1708 m_view->Update( &preview );
1709 frame()->SetMsgPanel( dimension );
1717 m_view->Update( &preview );
1718 frame()->SetMsgPanel( dimension );
1739 auto setMeasurementAttributes =
1753 setMeasurementAttributes( dimension );
1758 setMeasurementAttributes( dimension );
1767 setMeasurementAttributes( dimension );
1776 wxFAIL_MSG( wxT(
"Unhandled action in DRAWING_TOOL::DrawDimension" ) );
1779 t = dimension->
Type();
1790 dimension->
SetEnd( cursorPos );
1793 if( !
m_view->IsLayerVisible( layer ) )
1795 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
1796 m_frame->GetCanvas()->Refresh();
1799 preview.
Add( dimension );
1800 frame()->SetMsgPanel( dimension );
1826 preview.
Remove( dimension );
1828 commit.
Add( dimension );
1829 commit.
Push(
_(
"Draw Dimension" ) );
1833 frame()->OnEditItemRequest( dimension );
1840 if( ++step >= FINISHED )
1842 dimension =
nullptr;
1847 else if( evt->IsDblClick(
BUT_LEFT ) )
1852 else if( evt->IsMotion() )
1857 dimension->
SetEnd( cursorPos );
1881 textOffset = -textOffset;
1890 textOffset = -textOffset;
1907 double height = (
delta.x * cos( angle ) ) + (
delta.y * sin( angle ) );
1945 ortho->SetHeight( vert ? heightVector.
x : heightVector.
y );
1953 m_view->Update( &preview );
1959 if( !
m_view->IsLayerVisible( layer ) )
1961 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
1962 m_frame->GetCanvas()->Refresh();
1972 m_view->Update( &preview );
1973 frame()->SetMsgPanel( dimension );
1977 if( step == SET_END || step == SET_HEIGHT )
1979 frame()->OnEditItemRequest( dimension );
1981 frame()->SetMsgPanel( dimension );
1991 switch( dimension->
Type() )
2006 m_view->Update( &preview );
2015 evt->SetPassEvent();
2019 if( step != SET_ORIGIN )
2027 m_view->Remove( &preview );
2056 if( dlgResult != wxID_OK )
2062 wxMessageBox(
_(
"No graphic items found in file.") );
2068 std::vector<BOARD_ITEM*> newItems;
2069 std::vector<BOARD_ITEM*> selectedItems;
2079 newItems.push_back(
group );
2080 selectedItems.push_back(
group );
2086 std::vector<PCB_SHAPE*> shapeList;
2088 for(
const std::unique_ptr<EDA_ITEM>& ptr : list )
2091 shapeList.push_back( shape );
2097 for( std::unique_ptr<EDA_ITEM>& ptr : list )
2099 EDA_ITEM* eda_item = ptr.release();
2105 newItems.push_back( item );
2108 group->AddItem( item );
2110 selectedItems.push_back( item );
2115 preview.
Add( eda_item );
2121 EDA_ITEMS selItems( selectedItems.begin(), selectedItems.end() );
2129 commit.
Push(
_(
"Import Graphics" ) );
2137 if( !
m_view->IsLayerVisible( layer ) )
2139 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
2140 m_frame->GetCanvas()->Refresh();
2168 item->Move(
delta );
2170 m_view->Update( &preview );
2178 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2181 m_controls->ForceCursorPosition(
true, cursorPos );
2183 if( evt->IsCancelInteractive() || evt->IsActivate() )
2195 else if( evt->IsMotion() )
2200 item->Move(
delta );
2202 m_view->Update( &preview );
2214 commit.
Push(
_(
"Import Graphics" ) );
2224 evt->SetPassEvent();
2229 m_view->Remove( &preview );
2281 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2283 m_controls->ForceCursorPosition(
true, cursorPos );
2293 footprint->MoveAnchorPosition( moveVector );
2295 commit.
Push(
_(
"Move Footprint Anchor" ) );
2306 else if( evt->IsCancelInteractive() || evt->IsActivate() )
2313 evt->SetPassEvent();
2339 std::optional<VECTOR2D> aStartingPoint,
2340 std::stack<PCB_SHAPE*>* aCommittedGraphics )
2342 SHAPE_T shape = ( *aGraphic )->GetShape();
2383 m_view->Add( &twoPointAsst );
2385 bool started =
false;
2386 bool cancelled =
false;
2387 bool isLocalOriginSet = (
m_frame->GetScreen()->m_LocalOrigin !=
VECTOR2D( 0, 0 ) );
2404 if( !isLocalOriginSet )
2415 if( aStartingPoint )
2416 m_toolMgr->PrimeTool( *aStartingPoint );
2424 m_frame->SetMsgPanel( graphic );
2428 if( evt->Modifier(
MD_CTRL ) )
2435 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2438 m_controls->ForceCursorPosition(
true, cursorPos );
2440 if( evt->IsCancelInteractive() || ( started && evt->IsAction( &
ACTIONS::undo ) ) )
2447 evt->SetPassEvent(
false );
2454 else if( evt->IsActivate() )
2456 if( evt->IsPointEditor() )
2460 else if( evt->IsMoveTool() )
2499 m_frame->GetCanvas()->Refresh();
2509 frame()->SetMsgPanel( graphic );
2513 evt->SetPassEvent();
2532 if( aStartingPoint )
2534 cursorPos = *aStartingPoint;
2535 aStartingPoint = std::nullopt;
2550 grid.SetSkipPoint( cursorPos );
2553 twoPointMgr.
SetEnd( cursorPos );
2555 if( !isLocalOriginSet )
2556 m_frame->GetScreen()->m_LocalOrigin = cursorPos;
2559 frame()->SetMsgPanel( graphic );
2566 m_frame->GetCanvas()->Refresh();
2582 commit.
Add( graphic );
2583 commit.
Push(
_(
"Draw Line" ) );
2596 twoPointMgr.
Reset();
2602 else if( evt->IsMotion() )
2604 VECTOR2I clampedCursorPos = cursorPos;
2628 twoPointMgr.
SetEnd( clampedCursorPos );
2634 m_view->Update( &twoPointAsst );
2639 if( aCommittedGraphics && !aCommittedGraphics->empty() )
2641 twoPointMgr.
SetOrigin( aCommittedGraphics->top()->GetStart() );
2642 twoPointMgr.
SetEnd( aCommittedGraphics->top()->GetEnd() );
2643 aCommittedGraphics->pop();
2656 m_view->Update( &twoPointAsst );
2669 frame()->SetMsgPanel( graphic );
2678 frame()->SetMsgPanel( graphic );
2683 frame()->OnEditItemRequest( graphic );
2685 frame()->SetMsgPanel( graphic );
2694 isLocalOriginSet =
true;
2695 evt->SetPassEvent();
2701 userUnits =
frame()->GetUserUnits();
2702 twoPointAsst.
SetUnits( userUnits );
2703 m_view->Update( &twoPointAsst );
2705 evt->SetPassEvent();
2709 evt->SetPassEvent();
2713 if( !isLocalOriginSet )
2716 m_view->Remove( &twoPointAsst );
2759 std::optional<VECTOR2D> aStartingPoint )
2761 wxCHECK( aGraphic,
false );
2765 wxCHECK( graphic,
false );
2798 *aGraphic =
nullptr;
2806 bool started =
false;
2807 bool cancelled =
false;
2811 if( aStartingPoint )
2812 m_toolMgr->PrimeTool( *aStartingPoint );
2818 m_frame->SetMsgPanel( graphic );
2827 if( evt->Modifier(
MD_CTRL ) )
2830 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2834 m_controls->ForceCursorPosition(
true, cursorPos );
2836 if( evt->IsCancelInteractive() || ( started && evt->IsAction( &
ACTIONS::undo ) ) )
2843 evt->SetPassEvent(
false );
2850 else if( evt->IsActivate() )
2852 if( evt->IsPointEditor() )
2856 else if( evt->IsMoveTool() )
2871 else if( evt->IsClick(
BUT_LEFT ) )
2888 m_frame->GetCanvas()->Refresh();
2891 preview.
Add( graphic );
2892 frame()->SetMsgPanel( graphic );
2896 arcManager.
AddPoint( cursorPos,
true );
2902 else if( evt->IsMotion() )
2908 arcManager.
AddPoint( cursorPos,
false );
2925 m_frame->GetCanvas()->Refresh();
2930 m_view->Update( &preview );
2931 frame()->SetMsgPanel( graphic );
2935 evt->SetPassEvent();
2943 frame()->OnEditItemRequest( graphic );
2944 m_view->Update( &preview );
2945 frame()->SetMsgPanel( graphic );
2952 frame()->OnEditItemRequest( graphic );
2953 m_view->Update( &preview );
2954 frame()->SetMsgPanel( graphic );
2959 evt->SetPassEvent();
2976 m_view->Update( &preview );
2977 frame()->SetMsgPanel( graphic );
2989 m_view->Update( &preview );
2990 frame()->SetMsgPanel( graphic );
3001 m_view->Update( &arcAsst );
3002 evt->SetPassEvent();
3011 evt->SetPassEvent();
3021 m_view->Update( &preview );
3022 m_view->Update( &arcAsst );
3025 frame()->SetMsgPanel( graphic );
3031 preview.
Remove( graphic );
3032 m_view->Remove( &arcAsst );
3033 m_view->Remove( &preview );
3054 std::unique_ptr<PCB_SHAPE> bezier = std::make_unique<PCB_SHAPE>(
m_frame->GetModel() );
3056 bezier->SetFlags(
IS_NEW );
3075 m_view->Add( &bezierAsst );
3078 const auto setCursor =
3084 const auto resetProgress =
3096 const auto started =
3103 bool priming =
false;
3108 if( aStartingPoint )
3112 if( aStartingControl1Point )
3114 bezierManager.
AddPoint( *aStartingPoint,
true );
3115 bezierManager.
AddPoint( *aStartingControl1Point,
true );
3116 m_toolMgr->PrimeTool( *aStartingControl1Point );
3120 bezierManager.
AddPoint( *aStartingPoint,
true );
3121 m_toolMgr->PrimeTool( *aStartingPoint );
3129 m_frame->SetMsgPanel( bezier.get() );
3140 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
3144 m_controls->ForceCursorPosition(
true, cursorPos );
3146 if( evt->IsCancelInteractive() || ( started() && evt->IsAction( &
ACTIONS::undo ) ) )
3153 evt->SetPassEvent(
false );
3166 else if( evt->IsActivate() )
3168 if( evt->IsPointEditor() )
3172 else if( evt->IsMoveTool() )
3199 m_frame->GetCanvas()->Refresh();
3202 frame()->SetMsgPanel( bezier.get() );
3206 bezierManager.
AddPoint( cursorPos,
true );
3210 const bool doubleClick = evt->IsDblClick(
BUT_LEFT );
3216 bezierManager.
AddPoint( cursorPos,
true );
3220 preview.
Add( bezier.get() );
3235 preview.
Remove( bezier.get() );
3237 else if( evt->IsMotion() )
3243 bezierManager.
AddPoint( cursorPos,
false );
3258 m_frame->GetCanvas()->Refresh();
3263 m_view->Update( &preview );
3264 frame()->SetMsgPanel( bezier.get() );
3271 frame()->OnEditItemRequest( bezier.get() );
3272 m_view->Update( &preview );
3273 frame()->SetMsgPanel( bezier.get() );
3278 evt->SetPassEvent();
3290 m_view->Update( &preview );
3291 frame()->SetMsgPanel( bezier.get() );
3300 m_view->Update( &preview );
3301 frame()->SetMsgPanel( bezier.get() );
3307 m_view->Update( &bezierAsst );
3308 evt->SetPassEvent();
3317 evt->SetPassEvent();
3326 bezier->SetStart( bezierManager.
GetStart() );
3328 bezier->SetEnd( bezierManager.
GetEnd() );
3330 bezier->RebuildBezierToSegmentsPointsList( maxError );
3332 m_view->Update( &preview );
3333 m_view->Update( &bezierAsst );
3337 frame()->SetMsgPanel( bezier.get() );
3343 preview.
Remove( bezier.get() );
3344 m_view->Remove( &bezierAsst );
3345 m_view->Remove( &preview );
3361 bool clearSelection =
false;
3373 clearSelection =
true;
3384 if( clearSelection )
3418 ZONE* sourceZone =
nullptr;
3429 params.
m_mode = zoneMode;
3440 bool started =
false;
3454 polyGeomMgr.
Reset();
3456 grid.ClearSkipPoint();
3480 if( evt->Modifier(
MD_CTRL ) )
3483 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
3485 VECTOR2I cursorPos = evt->HasPosition() ? evt->Position() :
m_controls->GetMousePosition();
3488 m_controls->ForceCursorPosition(
true, cursorPos );
3492 if( evt->IsCancelInteractive() )
3503 evt->SetPassEvent(
false );
3507 else if( evt->IsActivate() )
3512 if( evt->IsPointEditor() )
3516 else if( evt->IsMoveTool() )
3534 m_frame->GetAppearancePanel()->SetLayerVisible( params.
m_layer,
true );
3535 m_frame->GetCanvas()->Refresh();
3551 const bool endPolygon = evt->IsDblClick(
BUT_LEFT )
3558 polyGeomMgr.
Reset();
3565 else if( polyGeomMgr.
AddPoint( cursorPos ) )
3576 m_frame->GetAppearancePanel()->SetLayerVisible( params.
m_layer,
true );
3577 m_frame->GetCanvas()->Refresh();
3588 cursorPos = last.value();
3590 m_controls->ForceCursorPosition(
true, cursorPos );
3598 else if( started && ( evt->IsMotion()
3624 evt->SetPassEvent();
3651 std::shared_ptr<DRC_ENGINE> m_drcEngine;
3653 int m_worstClearance;
3654 bool m_allowDRCViolations;
3661 m_worstClearance( 0 )
3679 m_worstClearance = std::max( m_worstClearance, constraint.
GetValue().
Min() );
3685 std::optional<int> padOverride =
pad->GetClearanceOverrides(
nullptr );
3687 if( padOverride.has_value() )
3688 m_worstClearance = std::max( m_worstClearance, padOverride.value() );
3697 virtual ~VIA_PLACER()
3715 const BOX2I bbox = getEffectiveBoundingBox( *aVia, aPosition );
3717 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
3719 std::vector<PCB_TRACK*> possible_tracks;
3721 wxCHECK(
view,
nullptr );
3723 view->Query( bbox, items );
3727 if( !it.first->IsBOARD_ITEM() )
3742 possible_tracks.push_back( track );
3750 possible_tracks.push_back( arc );
3755 int min_d = std::numeric_limits<int>::max();
3757 for(
PCB_TRACK* track : possible_tracks )
3759 SEG test( track->GetStart(), track->GetEnd() );
3760 int dist = (
test.NearestPoint( aPosition ) - aPosition ).EuclideanNorm();
3765 return_track = track;
3769 return return_track;
3777 ZONE* zone =
dynamic_cast<ZONE*
>( aOther );
3803 int connectedItemNet = connectedItem->
GetNetCode();
3805 if( connectedItemNet == 0 || connectedItemNet == aVia->
GetNetCode() )
3823 if( viaShape->Collide( otherShape.get(),
clearance - m_drcEpsilon ) )
3845 bool checkDRCViolation(
PCB_VIA* aVia )
3847 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
3848 std::set<BOARD_ITEM*> checkedItems;
3851 bbox.
Inflate( m_worstClearance );
3852 m_frame->GetCanvas()->GetView()->Query( bbox, items );
3854 for( std::pair<KIGFX::VIEW_ITEM*, int> it : items )
3856 if( !it.first->IsBOARD_ITEM() )
3874 else if( checkedItems.count( item ) )
3879 if( hasDRCViolation( aVia, item ) )
3882 checkedItems.insert( item );
3897 const BOX2I bbox = getEffectiveBoundingBox( *aVia, aPosition );
3900 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
3902 view.Query( bbox, items );
3906 if( !it.first->IsBOARD_ITEM() )
3915 if(
pad.HitTest( aPosition ) )
3926 BOX2I bbox = getEffectiveBoundingBox( *aVia, aPosition );
3928 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
3931 std::vector<PCB_SHAPE*> possible_shapes;
3933 view->Query( bbox, items );
3937 if( !it.first->IsBOARD_ITEM() )
3950 possible_shapes.push_back( shape );
3955 int min_d = std::numeric_limits<int>::max();
3957 for(
PCB_SHAPE* shape : possible_shapes )
3959 int dist = ( shape->GetPosition() - aPosition ).EuclideanNorm();
3964 return_shape = shape;
3968 return return_shape;
3971 std::optional<int> selectPossibleNetsByPopupMenu( std::set<int>& aNetcodeList )
3975 std::map<int, int> menuIDNetCodeMap;
3978 for(
int netcode : aNetcodeList )
3984 menuText = wxString::Format(
"%s\t",
3987 menuText = wxString::Format(
"&%d %s\t",
3998 menuIDNetCodeMap[ menuID ] = netcode;
4008 int selectedNetCode = -1;
4009 bool cancelled =
false;
4015 evt->SetPassEvent();
4019 std::optional<int>
id = evt->GetCommandId();
4022 if(
id && ( *
id > 0 ) && ( *
id < menuID ) )
4024 selectedNetCode = menuIDNetCodeMap.at( *
id );
4039 return std::optional<int>();
4041 return selectedNetCode;
4044 std::optional<int> findStitchedZoneNet(
PCB_VIA* aVia )
4048 std::set<int> netcodeList;
4058 if( z->IsOnLayer(
m_frame->GetActiveLayer() ) )
4060 if( z->HitTestFilledArea(
m_frame->GetActiveLayer(), position ) )
4061 netcodeList.insert( z->GetNetCode() );
4068 if( netcodeList.size() == 1 )
4069 return *netcodeList.begin();
4076 if( z->GetIsRuleArea() )
4081 if( z->IsOnLayer( layer ) )
4083 if( z->HitTestFilledArea( layer, position ) )
4084 netcodeList.insert( z->GetNetCode() );
4090 if( netcodeList.size() == 1 )
4091 return *netcodeList.begin();
4093 if( netcodeList.size() > 1 )
4096 return selectPossibleNetsByPopupMenu( netcodeList );
4121 SEG trackSeg( track->GetStart(), track->GetEnd() );
4131 if(
PAD*
pad = findPad(
via, position ) )
4142 if( shape->IsAnyFill() )
4148 double shapeArea = poly.
Area();
4150 int R =
via->GetWidth( shape->GetLayer() ) / 2;
4151 double viaArea =
M_PI * R * R;
4153 if( viaArea * 4 > shapeArea )
4158 switch( shape->GetShape() )
4162 SEG seg( shape->GetStart(), shape->GetEnd() );
4170 if( ( shape->GetEnd() - position ).SquaredEuclideanNorm() <
4171 ( shape->GetStart() - position ).SquaredEuclideanNorm() )
4185 if( !shape->IsPolyShapeValid() )
4192 std::optional<SEG> nearestSeg;
4193 int minDist = std::numeric_limits<int>::max();
4202 int dist = seg.
Distance( position );
4204 if( dist < minDist )
4243 via->SetIsFree(
false );
4247 via->SetNetCode(
pad->GetNetCode() );
4248 via->SetIsFree(
false );
4253 via->SetIsFree(
false );
4257 std::optional<int> netcode = findStitchedZoneNet(
via );
4259 if( !netcode.has_value() )
4262 via->SetNetCode( netcode.value() );
4263 via->SetIsFree(
via->GetNetCode() > 0 );
4266 if( checkDRCViolation(
via ) )
4268 m_frame->ShowInfoBarError(
_(
"Via location violates DRC." ),
true,
4271 if( !m_allowDRCViolations )
4285 if( track && m_gridHelper.
GetSnap() )
4289 SEG trackSeg( trackStart, trackEnd );
4291 if( viaPos == trackStart || viaPos == trackEnd )
4305 newTrack->
SetEnd( trackEnd );
4306 aCommit.
Add( newTrack );
4312 std::unique_ptr<BOARD_ITEM> CreateItem()
override
4317 via->SetNetCode( 0 );
4330 if( first_layer !=
m_frame->GetScreen()->m_Route_Layer_TOP )
4331 last_layer =
m_frame->GetScreen()->m_Route_Layer_TOP;
4333 last_layer =
m_frame->GetScreen()->m_Route_Layer_BOTTOM;
4335 via->SetLayerPair( first_layer, last_layer );
4341 via->GetEffectiveNetClass()->GetuViaDiameter() );
4342 via->SetDrill(
via->GetEffectiveNetClass()->GetuViaDrill() );
4350 return std::unique_ptr<BOARD_ITEM>(
via );
4354 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,...
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 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
#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
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::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.
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
Definition of file extensions used in Kicad.