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;
486 std::optional<VECTOR2D> startingPoint;
489 circle->SetFilled(
false );
503 commit.
Push(
_(
"Draw Circle" ) );
510 circle->SetFilled(
false );
513 startingPoint = std::nullopt;
534 std::optional<VECTOR2D> startingPoint;
545 while(
drawArc( aEvent, &arc, startingPoint ) )
550 commit.
Push(
_(
"Draw Arc" ) );
559 startingPoint = std::nullopt;
589 std::unique_ptr<PCB_SHAPE> bezier =
593 startingPoint = std::nullopt;
594 startingC1 = std::nullopt;
600 commit.
Add( bezier.release() );
601 commit.
Push(
_(
"Draw Bezier" ) );
606 startingPoint = bezierRef.
GetEnd();
631 bool immediateMode =
image !=
nullptr;
633 bool ignorePrimePosition =
false;
646 image->SetPosition( cursorPos );
667 m_view->RecacheAllItems();
692 ignorePrimePosition =
true;
701 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
705 m_controls->ForceCursorPosition(
true, cursorPos );
725 else if( evt->IsActivate() )
727 if(
image && evt->IsMoveTool() )
730 evt->SetPassEvent(
false );
736 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel image creation." ) );
737 evt->SetPassEvent(
false );
741 if( evt->IsMoveTool() )
758 wxFileDialog dlg(
m_frame,
_(
"Choose Image" ), wxEmptyString, wxEmptyString,
763 bool cancelled =
false;
768 cancelled = dlg.ShowModal() != wxID_OK;
777 if( evt->IsPrime() && !ignorePrimePosition )
779 cursorPos =
grid.Align( evt->Position() );
790 wxString fullFilename = dlg.GetPath();
792 if( wxFileExists( fullFilename ) )
795 if( !
image || !
image->GetReferenceImage().ReadImageFile( fullFilename ) )
797 wxMessageBox( wxString::Format(
_(
"Could not load image from '%s'." ), fullFilename ) );
808 m_view->RecacheAllItems();
813 m_view->ShowPreview(
true );
818 commit.Push(
_(
"Place Image" ) );
843 || evt->IsMotion() ) )
845 image->SetPosition( cursorPos );
848 m_view->RecacheAllItems();
881 m_gridHelper( aDrawingTool.GetManager(), aFrame.GetMagneticItemsSettings() )
887 std::unique_ptr<PCB_POINT> new_point = std::make_unique<PCB_POINT>(
m_frame.GetModel() );
890 new_point->SetLayer( layer );
945 bool ignorePrimePosition =
false;
991 ignorePrimePosition =
true;
1000 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1002 { m_frame->GetActiveLayer() },
GRID_TEXT ),
1004 m_controls->ForceCursorPosition(
true, cursorPos );
1010 else if( evt->IsCancelInteractive() || (
text && evt->IsAction( &
ACTIONS::undo ) ) )
1022 else if( evt->IsActivate() )
1027 if( evt->IsMoveTool() )
1045 else if( evt->IsClick(
BUT_LEFT ) )
1047 bool placing =
text !=
nullptr;
1072 text->SetLayer( layer );
1073 text->SetAttributes( textAttrs );
1074 text->SetTextPos( cursorPos );
1092 else if(
text->GetTextPos() != cursorPos )
1101 if( !
m_view->IsLayerVisible(
text->GetLayer() ) )
1103 m_frame->GetAppearancePanel()->SetLayerVisible(
text->GetLayer(),
true );
1104 m_frame->GetCanvas()->Refresh();
1121 commit.
Push(
_(
"Draw Text" ) );
1133 if( evt->IsPrime() && !ignorePrimePosition )
1135 cursorPos = evt->Position();
1136 m_controls->WarpMouseCursor( cursorPos,
true );
1140 m_controls->PinCursorInsideNonAutoscrollArea(
true );
1152 text->SetPosition( cursorPos );
1170 evt->SetPassEvent();
1243 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1245 { m_frame->GetActiveLayer() },
GRID_TEXT ),
1247 m_controls->ForceCursorPosition(
true, cursorPos );
1253 else if( evt->IsCancelInteractive() || (
table && evt->IsAction( &
ACTIONS::undo ) ) )
1265 else if( evt->IsActivate() )
1270 if( evt->IsMoveTool() )
1289 else if( evt->IsClick(
BUT_LEFT ) )
1299 table->SetLayer( layer );
1300 table->SetColCount( 1 );
1303 table->SetLayer( layer );
1304 table->SetPosition( cursorPos );
1306 if( !
m_view->IsLayerVisible( layer ) )
1308 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
1309 m_frame->GetCanvas()->Refresh();
1341 commit.
Push(
_(
"Draw Table" ) );
1355 VECTOR2I requestedSize( cursorPos - origin );
1357 int colCount = std::max( 1, requestedSize.
x / ( fontSize.
x * 15 ) );
1358 int rowCount = std::max( 1, requestedSize.
y / ( fontSize.
y * 3 ) );
1360 VECTOR2I cellSize( std::max( fontSize.
x * 5, requestedSize.
x / colCount ),
1361 std::max( fontSize.
y * 3, requestedSize.
y / rowCount ) );
1363 cellSize.
x =
KiROUND( (
double) cellSize.
x / gridSize.
x ) * gridSize.
x;
1364 cellSize.
y =
KiROUND( (
double) cellSize.
y / gridSize.
y ) * gridSize.
y;
1366 table->ClearCells();
1367 table->SetColCount( colCount );
1369 for(
int col = 0; col < colCount; ++col )
1370 table->SetColWidth( col, cellSize.
x );
1372 for(
int row = 0; row < rowCount; ++row )
1374 table->SetRowHeight( row, cellSize.
y );
1376 for(
int col = 0; col < colCount; ++col )
1381 table->AddCell( cell );
1402 evt->SetPassEvent();
1477 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1479 { m_frame->GetActiveLayer() },
GRID_TEXT ),
1481 m_controls->ForceCursorPosition(
true, cursorPos );
1487 else if( evt->IsCancelInteractive() || ( barcode && evt->IsAction( &
ACTIONS::undo ) ) )
1499 else if( evt->IsActivate() )
1504 if( evt->IsMoveTool() )
1522 else if( evt->IsClick(
BUT_LEFT ) )
1549 if( !
m_view->IsLayerVisible( layer ) )
1551 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
1552 m_frame->GetCanvas()->Refresh();
1555 commit.
Add( barcode );
1556 commit.
Push(
_(
"Draw Barcode" ) );
1566 evt->SetPassEvent();
1590 enum DIMENSION_STEPS
1605 int step = SET_ORIGIN;
1618 m_view->Update( &preview );
1621 dimension =
nullptr;
1650 if( step > SET_ORIGIN )
1651 frame()->SetMsgPanel( dimension );
1657 if( evt->Modifier(
MD_CTRL ) )
1660 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1668 grid.SetUseGrid(
false );
1672 VECTOR2I cursorPos = evt->HasPosition() ? evt->Position() :
m_controls->GetMousePosition();
1676 m_controls->ForceCursorPosition(
true, cursorPos );
1678 if( evt->IsCancelInteractive() || ( dimension && evt->IsAction( &
ACTIONS::undo ) ) )
1682 if( step != SET_ORIGIN )
1692 else if( evt->IsActivate() )
1694 if( step != SET_ORIGIN )
1697 if( evt->IsPointEditor() )
1701 else if( evt->IsMoveTool() )
1716 m_view->Update( &preview );
1717 frame()->SetMsgPanel( dimension );
1725 m_view->Update( &preview );
1726 frame()->SetMsgPanel( dimension );
1747 auto setMeasurementAttributes =
1761 setMeasurementAttributes( dimension );
1766 setMeasurementAttributes( dimension );
1775 setMeasurementAttributes( dimension );
1784 wxFAIL_MSG( wxT(
"Unhandled action in DRAWING_TOOL::DrawDimension" ) );
1787 t = dimension->
Type();
1798 dimension->
SetEnd( cursorPos );
1801 if( !
m_view->IsLayerVisible( layer ) )
1803 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
1804 m_frame->GetCanvas()->Refresh();
1807 preview.
Add( dimension );
1808 frame()->SetMsgPanel( dimension );
1834 preview.
Remove( dimension );
1836 commit.
Add( dimension );
1837 commit.
Push(
_(
"Draw Dimension" ) );
1841 frame()->OnEditItemRequest( dimension );
1848 if( ++step >= FINISHED )
1850 dimension =
nullptr;
1855 else if( evt->IsDblClick(
BUT_LEFT ) )
1860 else if( evt->IsMotion() )
1865 dimension->
SetEnd( cursorPos );
1889 textOffset = -textOffset;
1898 textOffset = -textOffset;
1915 double height = (
delta.x * cos( angle ) ) + (
delta.y * sin( angle ) );
1953 ortho->SetHeight( vert ? heightVector.
x : heightVector.
y );
1961 m_view->Update( &preview );
1967 if( !
m_view->IsLayerVisible( layer ) )
1969 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
1970 m_frame->GetCanvas()->Refresh();
1980 m_view->Update( &preview );
1981 frame()->SetMsgPanel( dimension );
1985 if( step == SET_END || step == SET_HEIGHT )
1987 frame()->OnEditItemRequest( dimension );
1989 frame()->SetMsgPanel( dimension );
1999 switch( dimension->
Type() )
2014 m_view->Update( &preview );
2023 evt->SetPassEvent();
2027 if( step != SET_ORIGIN )
2035 m_view->Remove( &preview );
2064 if( dlgResult != wxID_OK )
2070 wxMessageBox(
_(
"No graphic items found in file.") );
2076 std::vector<BOARD_ITEM*> newItems;
2077 std::vector<BOARD_ITEM*> selectedItems;
2085 size_t boardItemCount = std::count_if( list.begin(), list.end(),
2086 [](
const std::unique_ptr<EDA_ITEM>& ptr )
2088 return ptr->IsBOARD_ITEM();
2091 if( boardItemCount >= 2 )
2095 newItems.push_back(
group );
2096 selectedItems.push_back(
group );
2103 std::vector<PCB_SHAPE*> shapeList;
2105 for(
const std::unique_ptr<EDA_ITEM>& ptr : list )
2108 shapeList.push_back( shape );
2114 for( std::unique_ptr<EDA_ITEM>& ptr : list )
2116 EDA_ITEM* eda_item = ptr.release();
2122 newItems.push_back( item );
2125 group->AddItem( item );
2127 selectedItems.push_back( item );
2132 preview.
Add( eda_item );
2138 EDA_ITEMS selItems( selectedItems.begin(), selectedItems.end() );
2146 commit.
Push(
_(
"Import Graphics" ) );
2154 if( !
m_view->IsLayerVisible( layer ) )
2156 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
2157 m_frame->GetCanvas()->Refresh();
2185 item->Move(
delta );
2187 m_view->Update( &preview );
2195 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2198 m_controls->ForceCursorPosition(
true, cursorPos );
2200 if( evt->IsCancelInteractive() || evt->IsActivate() )
2212 else if( evt->IsMotion() )
2217 item->Move(
delta );
2219 m_view->Update( &preview );
2231 commit.
Push(
_(
"Import Graphics" ) );
2241 evt->SetPassEvent();
2246 m_view->Remove( &preview );
2298 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2300 m_controls->ForceCursorPosition(
true, cursorPos );
2310 footprint->MoveAnchorPosition( moveVector );
2312 commit.
Push(
_(
"Move Footprint Anchor" ) );
2323 else if( evt->IsCancelInteractive() || evt->IsActivate() )
2330 evt->SetPassEvent();
2356 std::optional<VECTOR2D> aStartingPoint,
2357 std::stack<PCB_SHAPE*>* aCommittedGraphics )
2359 SHAPE_T shape = ( *aGraphic )->GetShape();
2400 m_view->Add( &twoPointAsst );
2402 bool started =
false;
2403 bool cancelled =
false;
2404 bool isLocalOriginSet = (
m_frame->GetScreen()->m_LocalOrigin !=
VECTOR2D( 0, 0 ) );
2421 if( !isLocalOriginSet )
2432 if( aStartingPoint )
2433 m_toolMgr->PrimeTool( *aStartingPoint );
2441 m_frame->SetMsgPanel( graphic );
2450 if( evt->Modifier(
MD_CTRL ) )
2457 if( evt->Modifier(
MD_CTRL ) )
2461 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2464 m_controls->ForceCursorPosition(
true, cursorPos );
2466 if( evt->IsCancelInteractive() || ( started && evt->IsAction( &
ACTIONS::undo ) ) )
2473 evt->SetPassEvent(
false );
2480 else if( evt->IsActivate() )
2482 if( evt->IsPointEditor() )
2486 else if( evt->IsMoveTool() )
2525 m_frame->GetCanvas()->Refresh();
2535 frame()->SetMsgPanel( graphic );
2539 evt->SetPassEvent();
2558 if( aStartingPoint )
2560 cursorPos = *aStartingPoint;
2561 aStartingPoint = std::nullopt;
2576 grid.SetSkipPoint( cursorPos );
2579 twoPointMgr.
SetEnd( cursorPos );
2581 if( !isLocalOriginSet )
2582 m_frame->GetScreen()->m_LocalOrigin = cursorPos;
2585 frame()->SetMsgPanel( graphic );
2592 m_frame->GetCanvas()->Refresh();
2608 commit.
Add( graphic );
2609 commit.
Push(
_(
"Draw Line" ) );
2622 twoPointMgr.
Reset();
2628 else if( evt->IsMotion() )
2630 VECTOR2I clampedCursorPos = cursorPos;
2654 twoPointMgr.
SetEnd( clampedCursorPos );
2660 m_view->Update( &twoPointAsst );
2665 if( aCommittedGraphics && !aCommittedGraphics->empty() )
2667 twoPointMgr.
SetOrigin( aCommittedGraphics->top()->GetStart() );
2668 twoPointMgr.
SetEnd( aCommittedGraphics->top()->GetEnd() );
2669 aCommittedGraphics->pop();
2682 m_view->Update( &twoPointAsst );
2695 frame()->SetMsgPanel( graphic );
2704 frame()->SetMsgPanel( graphic );
2709 frame()->OnEditItemRequest( graphic );
2711 frame()->SetMsgPanel( graphic );
2720 isLocalOriginSet =
true;
2721 evt->SetPassEvent();
2725 if(
frame()->GetUserUnits() != userUnits )
2727 userUnits =
frame()->GetUserUnits();
2728 twoPointAsst.
SetUnits( userUnits );
2729 m_view->Update( &twoPointAsst );
2731 evt->SetPassEvent();
2735 evt->SetPassEvent();
2739 if( !isLocalOriginSet )
2742 m_view->Remove( &twoPointAsst );
2785 std::optional<VECTOR2D> aStartingPoint )
2787 wxCHECK( aGraphic,
false );
2791 wxCHECK( graphic,
false );
2824 *aGraphic =
nullptr;
2832 bool started =
false;
2833 bool cancelled =
false;
2837 if( aStartingPoint )
2838 m_toolMgr->PrimeTool( *aStartingPoint );
2844 m_frame->SetMsgPanel( graphic );
2853 if( evt->Modifier(
MD_CTRL ) )
2856 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2860 m_controls->ForceCursorPosition(
true, cursorPos );
2862 if( evt->IsCancelInteractive() || ( started && evt->IsAction( &
ACTIONS::undo ) ) )
2869 evt->SetPassEvent(
false );
2876 else if( evt->IsActivate() )
2878 if( evt->IsPointEditor() )
2882 else if( evt->IsMoveTool() )
2897 else if( evt->IsClick(
BUT_LEFT ) )
2914 m_frame->GetCanvas()->Refresh();
2917 preview.
Add( graphic );
2918 frame()->SetMsgPanel( graphic );
2922 arcManager.
AddPoint( cursorPos,
true );
2928 else if( evt->IsMotion() )
2934 arcManager.
AddPoint( cursorPos,
false );
2951 m_frame->GetCanvas()->Refresh();
2956 m_view->Update( &preview );
2957 frame()->SetMsgPanel( graphic );
2961 evt->SetPassEvent();
2969 frame()->OnEditItemRequest( graphic );
2970 m_view->Update( &preview );
2971 frame()->SetMsgPanel( graphic );
2978 frame()->OnEditItemRequest( graphic );
2979 m_view->Update( &preview );
2980 frame()->SetMsgPanel( graphic );
2985 evt->SetPassEvent();
3002 m_view->Update( &preview );
3003 frame()->SetMsgPanel( graphic );
3015 m_view->Update( &preview );
3016 frame()->SetMsgPanel( graphic );
3027 m_view->Update( &arcAsst );
3028 evt->SetPassEvent();
3037 evt->SetPassEvent();
3047 m_view->Update( &preview );
3048 m_view->Update( &arcAsst );
3051 frame()->SetMsgPanel( graphic );
3057 preview.
Remove( graphic );
3058 m_view->Remove( &arcAsst );
3059 m_view->Remove( &preview );
3080 std::unique_ptr<PCB_SHAPE> bezier = std::make_unique<PCB_SHAPE>(
m_frame->GetModel() );
3082 bezier->SetFlags(
IS_NEW );
3101 m_view->Add( &bezierAsst );
3104 const auto setCursor =
3110 const auto resetProgress =
3122 const auto started =
3129 bool priming =
false;
3134 if( aStartingPoint )
3138 if( aStartingControl1Point )
3140 bezierManager.
AddPoint( *aStartingPoint,
true );
3141 bezierManager.
AddPoint( *aStartingControl1Point,
true );
3142 m_toolMgr->PrimeTool( *aStartingControl1Point );
3146 bezierManager.
AddPoint( *aStartingPoint,
true );
3147 m_toolMgr->PrimeTool( *aStartingPoint );
3155 m_frame->SetMsgPanel( bezier.get() );
3166 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
3170 m_controls->ForceCursorPosition(
true, cursorPos );
3172 if( evt->IsCancelInteractive() || ( started() && evt->IsAction( &
ACTIONS::undo ) ) )
3179 evt->SetPassEvent(
false );
3192 else if( evt->IsActivate() )
3194 if( evt->IsPointEditor() )
3198 else if( evt->IsMoveTool() )
3225 m_frame->GetCanvas()->Refresh();
3228 frame()->SetMsgPanel( bezier.get() );
3232 bezierManager.
AddPoint( cursorPos,
true );
3236 const bool doubleClick = evt->IsDblClick(
BUT_LEFT );
3242 bezierManager.
AddPoint( cursorPos,
true );
3246 preview.
Add( bezier.get() );
3261 preview.
Remove( bezier.get() );
3263 else if( evt->IsMotion() )
3269 bezierManager.
AddPoint( cursorPos,
false );
3284 m_frame->GetCanvas()->Refresh();
3289 m_view->Update( &preview );
3290 frame()->SetMsgPanel( bezier.get() );
3297 frame()->OnEditItemRequest( bezier.get() );
3298 m_view->Update( &preview );
3299 frame()->SetMsgPanel( bezier.get() );
3304 evt->SetPassEvent();
3316 m_view->Update( &preview );
3317 frame()->SetMsgPanel( bezier.get() );
3326 m_view->Update( &preview );
3327 frame()->SetMsgPanel( bezier.get() );
3333 m_view->Update( &bezierAsst );
3334 evt->SetPassEvent();
3343 evt->SetPassEvent();
3352 bezier->SetStart( bezierManager.
GetStart() );
3354 bezier->SetEnd( bezierManager.
GetEnd() );
3356 bezier->RebuildBezierToSegmentsPointsList( maxError );
3358 m_view->Update( &preview );
3359 m_view->Update( &bezierAsst );
3363 frame()->SetMsgPanel( bezier.get() );
3369 preview.
Remove( bezier.get() );
3370 m_view->Remove( &bezierAsst );
3371 m_view->Remove( &preview );
3387 bool clearSelection =
false;
3399 clearSelection =
true;
3410 if( clearSelection )
3444 ZONE* sourceZone =
nullptr;
3455 params.
m_mode = zoneMode;
3466 bool started =
false;
3480 polyGeomMgr.
Reset();
3482 grid.ClearSkipPoint();
3506 if( evt->Modifier(
MD_CTRL ) )
3509 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
3511 VECTOR2I cursorPos = evt->HasPosition() ? evt->Position() :
m_controls->GetMousePosition();
3514 m_controls->ForceCursorPosition(
true, cursorPos );
3518 if( evt->IsCancelInteractive() )
3529 evt->SetPassEvent(
false );
3533 else if( evt->IsActivate() )
3538 if( evt->IsPointEditor() )
3542 else if( evt->IsMoveTool() )
3560 m_frame->GetAppearancePanel()->SetLayerVisible( params.
m_layer,
true );
3561 m_frame->GetCanvas()->Refresh();
3577 const bool endPolygon = evt->IsDblClick(
BUT_LEFT )
3584 polyGeomMgr.
Reset();
3591 else if( polyGeomMgr.
AddPoint( cursorPos ) )
3602 m_frame->GetAppearancePanel()->SetLayerVisible( params.
m_layer,
true );
3603 m_frame->GetCanvas()->Refresh();
3614 cursorPos = last.value();
3616 m_controls->ForceCursorPosition(
true, cursorPos );
3624 else if( started && ( evt->IsMotion()
3650 evt->SetPassEvent();
3677 std::shared_ptr<DRC_ENGINE> m_drcEngine;
3679 int m_worstClearance;
3680 bool m_allowDRCViolations;
3682 int sub_e(
int aClearance )
3684 return std::max( 0, aClearance - m_drcEpsilon );
3692 m_worstClearance( 0 )
3710 m_worstClearance = std::max( m_worstClearance, constraint.
GetValue().
Min() );
3716 std::optional<int> padOverride =
pad->GetClearanceOverrides(
nullptr );
3718 if( padOverride.has_value() )
3719 m_worstClearance = std::max( m_worstClearance, padOverride.value() );
3728 virtual ~VIA_PLACER()
3746 const BOX2I bbox = getEffectiveBoundingBox( *aVia, aPosition );
3748 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
3750 std::vector<PCB_TRACK*> possible_tracks;
3752 wxCHECK(
view,
nullptr );
3754 view->Query( bbox, items );
3758 if( !it.first->IsBOARD_ITEM() )
3773 possible_tracks.push_back( track );
3781 possible_tracks.push_back( arc );
3786 int min_d = std::numeric_limits<int>::max();
3788 for(
PCB_TRACK* track : possible_tracks )
3790 SEG test( track->GetStart(), track->GetEnd() );
3791 int dist = (
test.NearestPoint( aPosition ) - aPosition ).EuclideanNorm();
3796 return_track = track;
3800 return return_track;
3808 ZONE* zone =
dynamic_cast<ZONE*
>( aOther );
3834 int connectedItemNet = connectedItem->
GetNetCode();
3836 if( connectedItemNet == 0 || connectedItemNet == aVia->
GetNetCode() )
3854 if( viaShape->Collide( otherShape.get(), sub_e(
clearance ) ) )
3876 bool checkDRCViolation(
PCB_VIA* aVia )
3878 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
3879 std::set<BOARD_ITEM*> checkedItems;
3882 bbox.
Inflate( m_worstClearance );
3883 m_frame->GetCanvas()->GetView()->Query( bbox, items );
3885 for( std::pair<KIGFX::VIEW_ITEM*, int> it : items )
3887 if( !it.first->IsBOARD_ITEM() )
3905 else if( checkedItems.count( item ) )
3910 if( hasDRCViolation( aVia, item ) )
3913 checkedItems.insert( item );
3928 const BOX2I bbox = getEffectiveBoundingBox( *aVia, aPosition );
3931 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
3933 view.Query( bbox, items );
3937 if( !it.first->IsBOARD_ITEM() )
3946 if(
pad.HitTest( aPosition ) )
3957 BOX2I bbox = getEffectiveBoundingBox( *aVia, aPosition );
3959 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
3962 std::vector<PCB_SHAPE*> possible_shapes;
3964 view->Query( bbox, items );
3968 if( !it.first->IsBOARD_ITEM() )
3981 possible_shapes.push_back( shape );
3986 int min_d = std::numeric_limits<int>::max();
3988 for(
PCB_SHAPE* shape : possible_shapes )
3990 int dist = ( shape->GetPosition() - aPosition ).EuclideanNorm();
3995 return_shape = shape;
3999 return return_shape;
4002 std::optional<int> selectPossibleNetsByPopupMenu( std::set<int>& aNetcodeList )
4006 std::map<int, int> menuIDNetCodeMap;
4009 for(
int netcode : aNetcodeList )
4015 menuText = wxString::Format(
"%s\t",
4018 menuText = wxString::Format(
"&%d %s\t",
4029 menuIDNetCodeMap[ menuID ] = netcode;
4039 int selectedNetCode = -1;
4040 bool cancelled =
false;
4046 evt->SetPassEvent();
4050 std::optional<int>
id = evt->GetCommandId();
4053 if(
id && ( *
id > 0 ) && ( *
id < menuID ) )
4055 selectedNetCode = menuIDNetCodeMap.at( *
id );
4070 return std::optional<int>();
4072 return selectedNetCode;
4075 std::optional<int> findStitchedZoneNet(
PCB_VIA* aVia )
4079 std::set<int> netcodeList;
4089 if( z->IsOnLayer(
m_frame->GetActiveLayer() ) )
4091 if( z->HitTestFilledArea(
m_frame->GetActiveLayer(), position ) )
4092 netcodeList.insert( z->GetNetCode() );
4099 if( netcodeList.size() == 1 )
4100 return *netcodeList.begin();
4107 if( z->GetIsRuleArea() )
4112 if( z->IsOnLayer( layer ) )
4114 if( z->HitTestFilledArea( layer, position ) )
4115 netcodeList.insert( z->GetNetCode() );
4121 if( netcodeList.size() == 1 )
4122 return *netcodeList.begin();
4124 if( netcodeList.size() > 1 )
4127 return selectPossibleNetsByPopupMenu( netcodeList );
4152 SEG trackSeg( track->GetStart(), track->GetEnd() );
4162 if(
PAD*
pad = findPad(
via, position ) )
4173 if( shape->IsAnyFill() )
4179 double shapeArea = poly.
Area();
4181 int R =
via->GetWidth( shape->GetLayer() ) / 2;
4182 double viaArea =
M_PI * R * R;
4184 if( viaArea * 4 > shapeArea )
4189 switch( shape->GetShape() )
4193 SEG seg( shape->GetStart(), shape->GetEnd() );
4201 if( ( shape->GetEnd() - position ).SquaredEuclideanNorm() <
4202 ( shape->GetStart() - position ).SquaredEuclideanNorm() )
4216 if( !shape->IsPolyShapeValid() )
4223 std::optional<SEG> nearestSeg;
4224 int minDist = std::numeric_limits<int>::max();
4233 int dist = seg.
Distance( position );
4235 if( dist < minDist )
4274 via->SetIsFree(
false );
4278 via->SetNetCode(
pad->GetNetCode() );
4279 via->SetIsFree(
false );
4284 via->SetIsFree(
false );
4288 std::optional<int> netcode = findStitchedZoneNet(
via );
4290 if( !netcode.has_value() )
4293 via->SetNetCode( netcode.value() );
4294 via->SetIsFree(
via->GetNetCode() > 0 );
4297 if( checkDRCViolation(
via ) )
4299 m_frame->ShowInfoBarError(
_(
"Via location violates DRC." ),
true,
4300 WX_INFOBAR::MESSAGE_TYPE::DRC_VIOLATION );
4302 if( !m_allowDRCViolations )
4307 if( infobar->
GetMessageType() == WX_INFOBAR::MESSAGE_TYPE::DRC_VIOLATION )
4316 if( track && m_gridHelper.
GetSnap() )
4320 SEG trackSeg( trackStart, trackEnd );
4322 if( viaPos == trackStart || viaPos == trackEnd )
4336 newTrack->
SetEnd( trackEnd );
4337 aCommit.
Add( newTrack );
4343 std::unique_ptr<BOARD_ITEM> CreateItem()
override
4348 via->SetNetCode( 0 );
4361 if( first_layer !=
m_frame->GetScreen()->m_Route_Layer_TOP )
4362 last_layer =
m_frame->GetScreen()->m_Route_Layer_TOP;
4364 last_layer =
m_frame->GetScreen()->m_Route_Layer_BOTTOM;
4366 via->SetLayerPair( first_layer, last_layer );
4372 via->GetEffectiveNetClass()->GetuViaDiameter() );
4373 via->SetDrill(
via->GetEffectiveNetClass()->GetuViaDrill() );
4381 return std::unique_ptr<BOARD_ITEM>(
via );
4385 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 & 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 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
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.
std::vector< std::vector< std::string > > table
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.