28#include "dialog_table_properties.h"
34#include <dialogs/dialog_text_properties.h>
57#include <wx/filedlg.h>
115 _(
"Specify custom track and via sizes" ), wxITEM_CHECK );
124 if(
via.m_Drill > 0 )
126 msg.Printf(
_(
"Via %s, hole %s" ),
132 msg.Printf(
_(
"Via %s" ),
137 Append( menuIdx, msg, wxEmptyString, wxITEM_CHECK );
146 int id = aEvent.GetId();
204 auto activeToolFunctor =
223 auto canCloseOutline =
243 auto tuningToolActive =
249 auto dimensionToolActive =
278 std::shared_ptr<VIA_SIZE_MENU> viaSizeMenu = std::make_shared<VIA_SIZE_MENU>();
279 viaSizeMenu->SetTool(
this );
280 m_menu->RegisterSubMenu( viaSizeMenu );
281 ctxMenu.
AddMenu( viaSizeMenu.get(), viaToolActive, 500 );
340 m_frame->DisplayConstraintsMsg(
_(
"Constrain to H, V, 45" ) );
343 m_frame->DisplayConstraintsMsg(
_(
"Constrain to H, V" ) );
345 default:
m_frame->DisplayConstraintsMsg( wxString(
"" ) );
break;
365 std::optional<VECTOR2D> startingPoint;
366 std::stack<PCB_SHAPE*> committedLines;
377 while(
drawShape( aEvent, &line, startingPoint, &committedLines ) )
382 commit.
Push(
_(
"Draw Line" ) );
384 committedLines.push( line );
388 startingPoint = std::nullopt;
415 std::optional<VECTOR2D> startingPoint;
428 while(
drawShape( aEvent, &rect, startingPoint,
nullptr ) )
432 bool cancelled =
false;
435 cancelled =
m_frame->ShowTextBoxPropertiesDialog( textbox ) != wxID_OK;
446 commit.
Push( isTextBox ?
_(
"Draw Text Box" ) :
_(
"Draw Rectangle" ) );
456 startingPoint = std::nullopt;
477 std::optional<VECTOR2D> startingPoint;
480 circle->SetFilled(
false );
494 commit.
Push(
_(
"Draw Circle" ) );
501 circle->SetFilled(
false );
504 startingPoint = std::nullopt;
525 std::optional<VECTOR2D> startingPoint;
536 while(
drawArc( aEvent, &arc, startingPoint ) )
541 commit.
Push(
_(
"Draw Arc" ) );
550 startingPoint = std::nullopt;
580 std::unique_ptr<PCB_SHAPE> bezier =
584 startingPoint = std::nullopt;
585 startingC1 = std::nullopt;
591 commit.
Add( bezier.release() );
592 commit.
Push(
_(
"Draw Bezier" ) );
597 startingPoint = bezierRef.
GetEnd();
624 bool immediateMode =
image !=
nullptr;
626 bool ignorePrimePosition =
false;
638 image->SetPosition( cursorPos );
659 m_view->RecacheAllItems();
684 ignorePrimePosition =
true;
693 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
695 { m_frame->GetActiveLayer() },
698 m_controls->ForceCursorPosition(
true, cursorPos );
718 else if( evt->IsActivate() )
720 if(
image && evt->IsMoveTool() )
723 evt->SetPassEvent(
false );
729 m_frame->ShowInfoBarMsg(
_(
"Press <ESC> to cancel image creation." ) );
730 evt->SetPassEvent(
false );
734 if( evt->IsMoveTool() )
751 wxFileDialog dlg(
m_frame,
_(
"Choose Image" ), wxEmptyString, wxEmptyString,
752 _(
"Image Files" ) + wxS(
" " ) + wxImage::GetImageExtWildcard(),
755 if( dlg.ShowModal() != wxID_OK )
761 if( evt->IsPrime() && !ignorePrimePosition )
763 cursorPos =
grid.Align( evt->Position() );
774 wxString fullFilename = dlg.GetPath();
776 if( wxFileExists( fullFilename ) )
779 if( !
image || !
image->GetReferenceImage().ReadImageFile( fullFilename ) )
781 wxMessageBox( wxString::Format(
_(
"Could not load image from '%s'." ), fullFilename ) );
792 m_view->RecacheAllItems();
797 m_view->ShowPreview(
true );
802 commit.Push(
_(
"Place Image" ) );
827 || evt->IsMotion() ) )
829 image->SetPosition( cursorPos );
832 m_view->RecacheAllItems();
865 m_gridHelper( aDrawingTool.GetManager(), aFrame.GetMagneticItemsSettings() )
871 std::unique_ptr<PCB_POINT> new_point = std::make_unique<PCB_POINT>(
m_frame.GetModel() );
874 new_point->SetLayer( layer );
928 bool ignorePrimePosition =
false;
974 ignorePrimePosition =
true;
983 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
986 { m_frame->GetActiveLayer() },
GRID_TEXT ),
988 m_controls->ForceCursorPosition(
true, cursorPos );
994 else if( evt->IsCancelInteractive() || (
text && evt->IsAction( &
ACTIONS::undo ) ) )
1006 else if( evt->IsActivate() )
1011 if( evt->IsMoveTool() )
1029 else if( evt->IsClick(
BUT_LEFT ) )
1031 bool placing =
text !=
nullptr;
1056 text->SetLayer( layer );
1057 text->SetAttributes( textAttrs );
1058 text->SetTextPos( cursorPos );
1076 else if(
text->GetTextPos() != cursorPos )
1085 if( !
m_view->IsLayerVisible(
text->GetLayer() ) )
1087 m_frame->GetAppearancePanel()->SetLayerVisible(
text->GetLayer(),
true );
1088 m_frame->GetCanvas()->Refresh();
1105 commit.
Push(
_(
"Draw Text" ) );
1117 if( evt->IsPrime() && !ignorePrimePosition )
1119 cursorPos = evt->Position();
1120 m_controls->WarpMouseCursor( cursorPos,
true );
1124 m_controls->PinCursorInsideNonAutoscrollArea(
true );
1136 text->SetPosition( cursorPos );
1154 evt->SetPassEvent();
1226 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1229 { m_frame->GetActiveLayer() },
GRID_TEXT ),
1231 m_controls->ForceCursorPosition(
true, cursorPos );
1246 else if( evt->IsActivate() )
1251 if( evt->IsMoveTool() )
1270 else if( evt->IsClick(
BUT_LEFT ) )
1280 table->SetLayer( layer );
1281 table->SetColCount( 1 );
1284 table->SetLayer( layer );
1285 table->SetPosition( cursorPos );
1287 if( !
m_view->IsLayerVisible( layer ) )
1289 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
1290 m_frame->GetCanvas()->Refresh();
1311 commit.
Push(
_(
"Draw Table" ) );
1329 VECTOR2I requestedSize( cursorPos - origin );
1331 int colCount = std::max( 1, requestedSize.
x / ( fontSize.
x * 15 ) );
1332 int rowCount = std::max( 1, requestedSize.
y / ( fontSize.
y * 3 ) );
1334 VECTOR2I cellSize( std::max( fontSize.
x * 5, requestedSize.
x / colCount ),
1335 std::max( fontSize.
y * 3, requestedSize.
y / rowCount ) );
1337 cellSize.
x =
KiROUND( (
double) cellSize.
x / gridSize.
x ) * gridSize.
x;
1338 cellSize.
y =
KiROUND( (
double) cellSize.
y / gridSize.
y ) * gridSize.
y;
1340 table->ClearCells();
1341 table->SetColCount( colCount );
1343 for(
int col = 0; col < colCount; ++col )
1344 table->SetColWidth( col, cellSize.
x );
1346 for(
int row = 0; row < rowCount; ++row )
1348 table->SetRowHeight( row, cellSize.
y );
1350 for(
int col = 0; col < colCount; ++col )
1355 table->AddCell( cell );
1376 evt->SetPassEvent();
1410 enum DIMENSION_STEPS
1425 int step = SET_ORIGIN;
1438 m_view->Update( &preview );
1441 dimension =
nullptr;
1470 if( step > SET_ORIGIN )
1471 frame()->SetMsgPanel( dimension );
1477 if( evt->Modifier(
MD_CTRL ) )
1480 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
1488 grid.SetUseGrid(
false );
1492 VECTOR2I cursorPos = evt->HasPosition() ? evt->Position() :
m_controls->GetMousePosition();
1496 m_controls->ForceCursorPosition(
true, cursorPos );
1498 if( evt->IsCancelInteractive() || ( dimension && evt->IsAction( &
ACTIONS::undo ) ) )
1502 if( step != SET_ORIGIN )
1512 else if( evt->IsActivate() )
1514 if( step != SET_ORIGIN )
1517 if( evt->IsPointEditor() )
1521 else if( evt->IsMoveTool() )
1536 m_view->Update( &preview );
1537 frame()->SetMsgPanel( dimension );
1545 m_view->Update( &preview );
1546 frame()->SetMsgPanel( dimension );
1567 auto setMeasurementAttributes =
1581 setMeasurementAttributes( dimension );
1586 setMeasurementAttributes( dimension );
1595 setMeasurementAttributes( dimension );
1604 wxFAIL_MSG( wxT(
"Unhandled action in DRAWING_TOOL::DrawDimension" ) );
1607 t = dimension->
Type();
1618 dimension->
SetEnd( cursorPos );
1621 if( !
m_view->IsLayerVisible( layer ) )
1623 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
1624 m_frame->GetCanvas()->Refresh();
1627 preview.
Add( dimension );
1628 frame()->SetMsgPanel( dimension );
1654 preview.
Remove( dimension );
1656 commit.
Add( dimension );
1657 commit.
Push(
_(
"Draw Dimension" ) );
1661 frame()->OnEditItemRequest( dimension );
1668 if( ++step >= FINISHED )
1670 dimension =
nullptr;
1675 else if( evt->IsDblClick(
BUT_LEFT ) )
1680 else if( evt->IsMotion() )
1685 dimension->
SetEnd( cursorPos );
1709 textOffset = -textOffset;
1718 textOffset = -textOffset;
1735 double height = (
delta.x * cos( angle ) ) + (
delta.y * sin( angle ) );
1773 ortho->SetHeight( vert ? heightVector.
x : heightVector.
y );
1781 m_view->Update( &preview );
1787 if( !
m_view->IsLayerVisible( layer ) )
1789 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
1790 m_frame->GetCanvas()->Refresh();
1800 m_view->Update( &preview );
1801 frame()->SetMsgPanel( dimension );
1805 if( step == SET_END || step == SET_HEIGHT )
1807 frame()->OnEditItemRequest( dimension );
1809 frame()->SetMsgPanel( dimension );
1819 switch( dimension->
Type() )
1834 m_view->Update( &preview );
1843 evt->SetPassEvent();
1847 if( step != SET_ORIGIN )
1855 m_view->Remove( &preview );
1884 if( dlgResult != wxID_OK )
1890 wxMessageBox(
_(
"No graphic items found in file.") );
1896 std::vector<BOARD_ITEM*> newItems;
1897 std::vector<BOARD_ITEM*> selectedItems;
1907 newItems.push_back(
group );
1908 selectedItems.push_back(
group );
1914 std::vector<PCB_SHAPE*> shapeList;
1916 for(
const std::unique_ptr<EDA_ITEM>& ptr : list )
1919 shapeList.push_back( shape );
1925 for( std::unique_ptr<EDA_ITEM>& ptr : list )
1927 EDA_ITEM* eda_item = ptr.release();
1933 newItems.push_back( item );
1936 group->AddItem( item );
1938 selectedItems.push_back( item );
1943 preview.
Add( eda_item );
1949 EDA_ITEMS selItems( selectedItems.begin(), selectedItems.end() );
1957 commit.
Push(
_(
"Import Graphics" ) );
1965 if( !
m_view->IsLayerVisible( layer ) )
1967 m_frame->GetAppearancePanel()->SetLayerVisible( layer,
true );
1968 m_frame->GetCanvas()->Refresh();
1996 item->Move(
delta );
1998 m_view->Update( &preview );
2006 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2010 m_controls->ForceCursorPosition(
true, cursorPos );
2012 if( evt->IsCancelInteractive() || evt->IsActivate() )
2024 else if( evt->IsMotion() )
2029 item->Move(
delta );
2031 m_view->Update( &preview );
2043 commit.
Push(
_(
"Import Graphics" ) );
2053 evt->SetPassEvent();
2058 m_view->Remove( &preview );
2110 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2113 m_controls->ForceCursorPosition(
true, cursorPos );
2123 footprint->MoveAnchorPosition( moveVector );
2125 commit.
Push(
_(
"Move Footprint Anchor" ) );
2136 else if( evt->IsCancelInteractive() || evt->IsActivate() )
2143 evt->SetPassEvent();
2169 std::optional<VECTOR2D> aStartingPoint,
2170 std::stack<PCB_SHAPE*>* aCommittedGraphics )
2172 SHAPE_T shape = ( *aGraphic )->GetShape();
2213 m_view->Add( &twoPointAsst );
2215 bool started =
false;
2216 bool cancelled =
false;
2217 bool isLocalOriginSet = (
m_frame->GetScreen()->m_LocalOrigin !=
VECTOR2D( 0, 0 ) );
2234 if( !isLocalOriginSet )
2245 if( aStartingPoint )
2246 m_toolMgr->PrimeTool( *aStartingPoint );
2254 m_frame->SetMsgPanel( graphic );
2258 if( evt->Modifier(
MD_CTRL ) )
2265 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2269 m_controls->ForceCursorPosition(
true, cursorPos );
2271 if( evt->IsCancelInteractive() || ( started && evt->IsAction( &
ACTIONS::undo ) ) )
2278 evt->SetPassEvent(
false );
2285 else if( evt->IsActivate() )
2287 if( evt->IsPointEditor() )
2291 else if( evt->IsMoveTool() )
2330 m_frame->GetCanvas()->Refresh();
2340 frame()->SetMsgPanel( graphic );
2344 evt->SetPassEvent();
2363 if( aStartingPoint )
2365 cursorPos = *aStartingPoint;
2366 aStartingPoint = std::nullopt;
2381 grid.SetSkipPoint( cursorPos );
2384 twoPointMgr.
SetEnd( cursorPos );
2386 if( !isLocalOriginSet )
2387 m_frame->GetScreen()->m_LocalOrigin = cursorPos;
2390 frame()->SetMsgPanel( graphic );
2397 m_frame->GetCanvas()->Refresh();
2413 commit.
Add( graphic );
2414 commit.
Push(
_(
"Draw Line" ) );
2427 twoPointMgr.
Reset();
2433 else if( evt->IsMotion() )
2435 VECTOR2I clampedCursorPos = cursorPos;
2459 twoPointMgr.
SetEnd( clampedCursorPos );
2465 m_view->Update( &twoPointAsst );
2470 if( aCommittedGraphics && !aCommittedGraphics->empty() )
2472 twoPointMgr.
SetOrigin( aCommittedGraphics->top()->GetStart() );
2473 twoPointMgr.
SetEnd( aCommittedGraphics->top()->GetEnd() );
2474 aCommittedGraphics->pop();
2487 m_view->Update( &twoPointAsst );
2500 frame()->SetMsgPanel( graphic );
2509 frame()->SetMsgPanel( graphic );
2514 frame()->OnEditItemRequest( graphic );
2516 frame()->SetMsgPanel( graphic );
2525 isLocalOriginSet =
true;
2526 evt->SetPassEvent();
2532 userUnits =
frame()->GetUserUnits();
2533 twoPointAsst.
SetUnits( userUnits );
2534 m_view->Update( &twoPointAsst );
2536 evt->SetPassEvent();
2540 evt->SetPassEvent();
2544 if( !isLocalOriginSet )
2547 m_view->Remove( &twoPointAsst );
2590 std::optional<VECTOR2D> aStartingPoint )
2592 wxCHECK( aGraphic,
false );
2596 wxCHECK( graphic,
false );
2629 *aGraphic =
nullptr;
2637 bool started =
false;
2638 bool cancelled =
false;
2642 if( aStartingPoint )
2643 m_toolMgr->PrimeTool( *aStartingPoint );
2649 m_frame->SetMsgPanel( graphic );
2657 if( evt->Modifier(
MD_CTRL ) )
2659 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2663 m_controls->ForceCursorPosition(
true, cursorPos );
2665 if( evt->IsCancelInteractive() || ( started && evt->IsAction( &
ACTIONS::undo ) ) )
2672 evt->SetPassEvent(
false );
2679 else if( evt->IsActivate() )
2681 if( evt->IsPointEditor() )
2685 else if( evt->IsMoveTool() )
2700 else if( evt->IsClick(
BUT_LEFT ) )
2717 m_frame->GetCanvas()->Refresh();
2720 preview.
Add( graphic );
2721 frame()->SetMsgPanel( graphic );
2725 arcManager.
AddPoint( cursorPos,
true );
2731 else if( evt->IsMotion() )
2737 arcManager.
AddPoint( cursorPos,
false );
2754 m_frame->GetCanvas()->Refresh();
2759 m_view->Update( &preview );
2760 frame()->SetMsgPanel( graphic );
2764 evt->SetPassEvent();
2772 frame()->OnEditItemRequest( graphic );
2773 m_view->Update( &preview );
2774 frame()->SetMsgPanel( graphic );
2781 frame()->OnEditItemRequest( graphic );
2782 m_view->Update( &preview );
2783 frame()->SetMsgPanel( graphic );
2788 evt->SetPassEvent();
2805 m_view->Update( &preview );
2806 frame()->SetMsgPanel( graphic );
2818 m_view->Update( &preview );
2819 frame()->SetMsgPanel( graphic );
2830 m_view->Update( &arcAsst );
2831 evt->SetPassEvent();
2840 evt->SetPassEvent();
2850 m_view->Update( &preview );
2851 m_view->Update( &arcAsst );
2854 frame()->SetMsgPanel( graphic );
2860 preview.
Remove( graphic );
2861 m_view->Remove( &arcAsst );
2862 m_view->Remove( &preview );
2883 std::unique_ptr<PCB_SHAPE> bezier = std::make_unique<PCB_SHAPE>(
m_frame->GetModel() );
2885 bezier->SetFlags(
IS_NEW );
2905 m_view->Add( &bezierAsst );
2908 const auto setCursor =
2914 const auto resetProgress =
2926 const auto started =
2933 bool priming =
false;
2938 if( aStartingPoint )
2942 if( aStartingControl1Point )
2944 bezierManager.
AddPoint( *aStartingPoint,
true );
2945 bezierManager.
AddPoint( *aStartingControl1Point,
true );
2946 m_toolMgr->PrimeTool( *aStartingControl1Point );
2950 bezierManager.
AddPoint( *aStartingPoint,
true );
2951 m_toolMgr->PrimeTool( *aStartingPoint );
2959 m_frame->SetMsgPanel( bezier.get() );
2970 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2974 m_controls->ForceCursorPosition(
true, cursorPos );
2976 if( evt->IsCancelInteractive() || ( started() && evt->IsAction( &
ACTIONS::undo ) ) )
2983 evt->SetPassEvent(
false );
2996 else if( evt->IsActivate() )
2998 if( evt->IsPointEditor() )
3002 else if( evt->IsMoveTool() )
3029 m_frame->GetCanvas()->Refresh();
3032 frame()->SetMsgPanel( bezier.get() );
3036 bezierManager.
AddPoint( cursorPos,
true );
3040 const bool doubleClick = evt->IsDblClick(
BUT_LEFT );
3046 bezierManager.
AddPoint( cursorPos,
true );
3050 preview.
Add( bezier.get() );
3065 preview.
Remove( bezier.get() );
3067 else if( evt->IsMotion() )
3073 bezierManager.
AddPoint( cursorPos,
false );
3088 m_frame->GetCanvas()->Refresh();
3093 m_view->Update( &preview );
3094 frame()->SetMsgPanel( bezier.get() );
3101 frame()->OnEditItemRequest( bezier.get() );
3102 m_view->Update( &preview );
3103 frame()->SetMsgPanel( bezier.get() );
3108 evt->SetPassEvent();
3120 m_view->Update( &preview );
3121 frame()->SetMsgPanel( bezier.get() );
3130 m_view->Update( &preview );
3131 frame()->SetMsgPanel( bezier.get() );
3137 m_view->Update( &bezierAsst );
3138 evt->SetPassEvent();
3147 evt->SetPassEvent();
3156 bezier->SetStart( bezierManager.
GetStart() );
3158 bezier->SetEnd( bezierManager.
GetEnd() );
3160 bezier->RebuildBezierToSegmentsPointsList( maxError );
3162 m_view->Update( &preview );
3163 m_view->Update( &bezierAsst );
3167 frame()->SetMsgPanel( bezier.get() );
3173 preview.
Remove( bezier.get() );
3174 m_view->Remove( &bezierAsst );
3175 m_view->Remove( &preview );
3191 bool clearSelection =
false;
3203 clearSelection =
true;
3214 if( clearSelection )
3248 ZONE* sourceZone =
nullptr;
3259 params.
m_mode = zoneMode;
3270 bool started =
false;
3284 polyGeomMgr.
Reset();
3286 grid.ClearSkipPoint();
3309 if( evt->Modifier(
MD_CTRL ) )
3311 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
3313 VECTOR2I cursorPos = evt->HasPosition() ? evt->Position() :
m_controls->GetMousePosition();
3317 m_controls->ForceCursorPosition(
true, cursorPos );
3321 if( evt->IsCancelInteractive() )
3332 evt->SetPassEvent(
false );
3336 else if( evt->IsActivate() )
3341 if( evt->IsPointEditor() )
3345 else if( evt->IsMoveTool() )
3363 m_frame->GetAppearancePanel()->SetLayerVisible( params.
m_layer,
true );
3364 m_frame->GetCanvas()->Refresh();
3380 const bool endPolygon = evt->IsDblClick(
BUT_LEFT )
3387 polyGeomMgr.
Reset();
3394 else if( polyGeomMgr.
AddPoint( cursorPos ) )
3405 m_frame->GetAppearancePanel()->SetLayerVisible( params.
m_layer,
true );
3406 m_frame->GetCanvas()->Refresh();
3417 cursorPos = last.value();
3419 m_controls->ForceCursorPosition(
true, cursorPos );
3427 else if( started && ( evt->IsMotion()
3453 evt->SetPassEvent();
3480 std::shared_ptr<DRC_ENGINE> m_drcEngine;
3482 int m_worstClearance;
3483 bool m_allowDRCViolations;
3490 m_worstClearance( 0 )
3508 m_worstClearance = std::max( m_worstClearance, constraint.
GetValue().
Min() );
3514 std::optional<int> padOverride =
pad->GetClearanceOverrides(
nullptr );
3516 if( padOverride.has_value() )
3517 m_worstClearance = std::max( m_worstClearance, padOverride.value() );
3526 virtual ~VIA_PLACER()
3544 const BOX2I bbox = getEffectiveBoundingBox( *aVia, aPosition );
3546 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
3548 std::vector<PCB_TRACK*> possible_tracks;
3550 wxCHECK(
view,
nullptr );
3552 view->Query( bbox, items );
3556 if( !it.first->IsBOARD_ITEM() )
3571 possible_tracks.push_back( track );
3579 possible_tracks.push_back( arc );
3584 int min_d = std::numeric_limits<int>::max();
3586 for(
PCB_TRACK* track : possible_tracks )
3588 SEG test( track->GetStart(), track->GetEnd() );
3589 int dist = (
test.NearestPoint( aPosition ) - aPosition ).EuclideanNorm();
3594 return_track = track;
3598 return return_track;
3606 ZONE* zone =
dynamic_cast<ZONE*
>( aOther );
3635 int connectedItemNet = connectedItem->
GetNetCode();
3637 if( connectedItemNet == 0 || connectedItemNet == aVia->
GetNetCode() )
3655 if( viaShape->Collide( otherShape.get(),
clearance - m_drcEpsilon ) )
3677 bool checkDRCViolation(
PCB_VIA* aVia )
3679 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
3680 std::set<BOARD_ITEM*> checkedItems;
3683 bbox.
Inflate( m_worstClearance );
3684 m_frame->GetCanvas()->GetView()->Query( bbox, items );
3686 for( std::pair<KIGFX::VIEW_ITEM*, int> it : items )
3688 if( !it.first->IsBOARD_ITEM() )
3706 else if( checkedItems.count( item ) )
3711 if( hasDRCViolation( aVia, item ) )
3714 checkedItems.insert( item );
3729 const BOX2I bbox = getEffectiveBoundingBox( *aVia, aPosition );
3732 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
3734 view.Query( bbox, items );
3738 if( !it.first->IsBOARD_ITEM() )
3747 if(
pad.HitTest( aPosition ) )
3758 BOX2I bbox = getEffectiveBoundingBox( *aVia, aPosition );
3760 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> items;
3763 std::vector<PCB_SHAPE*> possible_shapes;
3765 view->Query( bbox, items );
3769 if( !it.first->IsBOARD_ITEM() )
3782 possible_shapes.push_back( shape );
3787 int min_d = std::numeric_limits<int>::max();
3789 for(
PCB_SHAPE* shape : possible_shapes )
3791 int dist = ( shape->GetPosition() - aPosition ).EuclideanNorm();
3796 return_shape = shape;
3800 return return_shape;
3803 std::optional<int> selectPossibleNetsByPopupMenu( std::set<int>& aNetcodeList )
3807 std::map<int, int> menuIDNetCodeMap;
3810 for(
int netcode : aNetcodeList )
3816 menuText = wxString::Format(
"%s\t",
3819 menuText = wxString::Format(
"&%d %s\t",
3830 menuIDNetCodeMap[ menuID ] = netcode;
3840 int selectedNetCode = -1;
3841 bool cancelled =
false;
3847 evt->SetPassEvent();
3851 std::optional<int>
id = evt->GetCommandId();
3854 if(
id && ( *
id > 0 ) && ( *
id < menuID ) )
3856 selectedNetCode = menuIDNetCodeMap.at( *
id );
3871 return std::optional<int>();
3873 return selectedNetCode;
3876 std::optional<int> findStitchedZoneNet(
PCB_VIA* aVia )
3880 std::set<int> netcodeList;
3890 if( z->IsOnLayer(
m_frame->GetActiveLayer() ) )
3892 if( z->HitTestFilledArea(
m_frame->GetActiveLayer(), position ) )
3893 netcodeList.insert( z->GetNetCode() );
3900 if( netcodeList.size() == 1 )
3901 return *netcodeList.begin();
3908 if( z->GetIsRuleArea() )
3913 if( z->IsOnLayer( layer ) )
3915 if( z->HitTestFilledArea( layer, position ) )
3916 netcodeList.insert( z->GetNetCode() );
3922 if( netcodeList.size() == 1 )
3923 return *netcodeList.begin();
3925 if( netcodeList.size() > 1 )
3928 return selectPossibleNetsByPopupMenu( netcodeList );
3953 SEG trackSeg( track->GetStart(), track->GetEnd() );
3963 if(
PAD*
pad = findPad(
via, position ) )
3974 if( shape->IsAnyFill() )
3980 double shapeArea = poly.
Area();
3982 int R =
via->GetWidth() / 2;
3983 double viaArea =
M_PI * R * R;
3985 if( viaArea * 4 > shapeArea )
3990 switch( shape->GetShape() )
3994 SEG seg( shape->GetStart(), shape->GetEnd() );
4002 if( ( shape->GetEnd() - position ).SquaredEuclideanNorm() <
4003 ( shape->GetStart() - position ).SquaredEuclideanNorm() )
4017 if( !shape->IsPolyShapeValid() )
4024 std::optional<SEG> nearestSeg;
4025 int minDist = std::numeric_limits<int>::max();
4034 int dist = seg.
Distance( position );
4036 if( dist < minDist )
4075 via->SetIsFree(
false );
4079 via->SetNetCode(
pad->GetNetCode() );
4080 via->SetIsFree(
false );
4085 via->SetIsFree(
false );
4089 std::optional<int> netcode = findStitchedZoneNet(
via );
4091 if( !netcode.has_value() )
4094 via->SetNetCode( netcode.value() );
4095 via->SetIsFree(
via->GetNetCode() > 0 );
4098 if( checkDRCViolation(
via ) )
4100 m_frame->ShowInfoBarError(
_(
"Via location violates DRC." ),
true,
4103 if( !m_allowDRCViolations )
4117 if( track && m_gridHelper.
GetSnap() )
4121 SEG trackSeg( trackStart, trackEnd );
4123 if( viaPos == trackStart || viaPos == trackEnd )
4137 newTrack->
SetEnd( trackEnd );
4138 aCommit.
Add( newTrack );
4144 std::unique_ptr<BOARD_ITEM> CreateItem()
override
4149 via->SetNetCode( 0 );
4162 if( first_layer !=
m_frame->GetScreen()->m_Route_Layer_TOP )
4163 last_layer =
m_frame->GetScreen()->m_Route_Layer_TOP;
4165 last_layer =
m_frame->GetScreen()->m_Route_Layer_BOTTOM;
4167 via->SetLayerPair( first_layer, last_layer );
4173 via->GetEffectiveNetClass()->GetuViaDiameter() );
4174 via->SetDrill(
via->GetEffectiveNetClass()->GetuViaDrill() );
4182 return std::unique_ptr<BOARD_ITEM>(
via );
4186 VIA_PLACER placer(
frame() );
constexpr EDA_IU_SCALE pcbIUScale
constexpr int ARC_LOW_DEF
@ HIDDEN
Inactive layers are hidden.
@ DIMMED
Inactive layers are dimmed (old high-contrast mode)
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
static TOOL_ACTION cancelInteractive
static TOOL_ACTION selectItem
Select an item (specified as the event parameter).
static TOOL_ACTION selectionCursor
Select a single item under the cursor position.
static TOOL_ACTION updateUnits
static TOOL_ACTION activatePointEditor
static TOOL_ACTION doDelete
static TOOL_ACTION cursorClick
static TOOL_ACTION selectionClear
Clear the current selection.
static TOOL_ACTION refreshPreview
static TOOL_ACTION selectItems
Select a list of items (specified as the event parameter)
static TOOL_ACTION resetLocalCoords
virtual void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Execute the changes.
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
Container for design settings for a BOARD object.
DIM_PRECISION m_DimensionPrecision
Number of digits after the decimal.
void UseCustomTrackViaSize(bool aEnabled)
Enables/disables custom track/via size settings.
VIATYPE m_CurrentViaType
(VIA_BLIND_BURIED, VIA_THROUGH, VIA_MICROVIA)
DIM_UNITS_FORMAT m_DimensionUnitsFormat
bool GetTextUpright(PCB_LAYER_ID aLayer) const
int GetTextThickness(PCB_LAYER_ID aLayer) const
Return the default text thickness from the layer class for the given layer.
bool GetTextItalic(PCB_LAYER_ID aLayer) const
int GetCurrentViaSize() const
void SetViaSizeIndex(int aIndex)
Set the current via size list index to aIndex.
std::shared_ptr< DRC_ENGINE > m_DRCEngine
bool m_UseConnectedTrackWidth
int GetViaSizeIndex() const
bool m_DimensionSuppressZeroes
int GetDRCEpsilon() const
Return an epsilon which accounts for rounding errors, etc.
bool m_DimensionKeepTextAligned
VECTOR2I GetTextSize(PCB_LAYER_ID aLayer) const
Return the default text size from the layer class for the given layer.
int GetLineThickness(PCB_LAYER_ID aLayer) const
Return the default graphic segment thickness from the layer class for the given layer.
int GetCurrentViaDrill() const
DIM_TEXT_POSITION m_DimensionTextPosition
DIM_UNITS_MODE m_DimensionUnitsMode
std::vector< VIA_DIMENSION > m_ViasDimensionsList
int m_DimensionExtensionOffset
int m_DimensionArrowLength
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
virtual std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
virtual std::shared_ptr< SHAPE_SEGMENT > GetEffectiveHoleShape() const
virtual bool HasHole() const
const FOOTPRINTS & Footprints() const
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
constexpr size_type GetWidth() const
constexpr Vec Centre() const
constexpr size_type GetHeight() const
constexpr coord_type GetLeft() const
constexpr bool Contains(const Vec &aPoint) const
constexpr void Move(const Vec &aMoveVector)
Move the rectangle by the aMoveVector.
constexpr coord_type GetRight() const
constexpr coord_type GetTop() const
constexpr coord_type GetBottom() const
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Add a new item to the model.
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 toggleHV45Mode
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 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.
Common, abstract interface for edit frames.
wxString GetDesignRulesPath()
Return the absolute path to the design rules file for the currently-loaded board.
virtual MAGNETIC_SETTINGS * GetMagneticItemsSettings()
void Update()
Update the dimension's cached text and geometry.
int GetLineThickness() const
void SetExtensionOffset(int aOffset)
void SetLineThickness(int aWidth)
void SetArrowLength(int aLength)
virtual const VECTOR2I & GetStart() const
The dimension's origin is the first feature point for the dimension.
DIM_ARROW_DIRECTION GetArrowDirection() const
virtual void SetEnd(const VECTOR2I &aPoint)
virtual void SetStart(const VECTOR2I &aPoint)
void SetArrowDirection(const DIM_ARROW_DIRECTION &aDirection)
int GetArrowLength() const
virtual const VECTOR2I & GetEnd() const
For better understanding of the points that make a dimension:
double GetAngle() const
Return the angle of the crossbar.
void SetHeight(int aHeight)
Set the distance from the feature points to the crossbar line.
Mark the center of a circle or arc with a cross shape.
A leader is a dimension-like object pointing to a specific point.
An orthogonal dimension is like an aligned dimension, but the extension lines are locked to the X or ...
A radial dimension indicates either the radius or diameter of an arc or circle.
HIGH_CONTRAST_MODE m_ContrastModeDisplay
How inactive layers are displayed.
The main frame for Pcbnew.
VECTOR2I AlignToSegment(const VECTOR2I &aPoint, const SEG &aSeg)
A set of BOARD_ITEMs (i.e., without duplicates).
Object to handle a bitmap image that can be inserted in a PCB.
EDA_ITEM * GetTopLeftItem(bool aFootprintsOnly=false) const override
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
void SetPosition(const VECTOR2I &aPos) override
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
void SetStroke(const STROKE_PARAMS &aStroke) override
void Normalize() override
Perform any normalization required after a user rotate and/or flip.
VECTOR2I GetPosition() const override
void SetEnd(const VECTOR2I &aEnd)
void SetStart(const VECTOR2I &aStart)
virtual EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
const VECTOR2I & GetStart() const
const VECTOR2I & GetEnd() const
virtual int GetWidth() const
VECTOR2I GetPosition() const override
std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const override
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
const PADSTACK & Padstack() const
int GetWidth() const override
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
virtual COMMON_SETTINGS * GetCommonSettings() const
A holder to handle information on schematic or board items.
ROUTING_SETTINGS & Settings()
bool AllowDRCViolations() const
Class that handles the drawing of a polygon, including management of last corner deletion and drawing...
bool AddPoint(const VECTOR2I &aPt)
Lock in a polygon point.
void SetCursorPosition(const VECTOR2I &aPos)
Set the current cursor position.
bool NewPointClosesOutline(const VECTOR2I &aPt) const
std::optional< VECTOR2I > DeleteLastCorner()
Remove the last-added point from the polygon.
void SetFinished()
Mark the polygon finished and update the client.
void SetLeaderMode(LEADER_MODE aMode)
Set the leader mode to use when calculating the leader/returner lines.
void Reset()
Clear the manager state and start again.
RAII class that sets an value at construction and resets it to the original value at destruction.
int Distance(const SEG &aSeg) const
Compute minimum Euclidean distance to segment aSeg.
bool Contains(const SEG &aSeg) const
virtual void Add(EDA_ITEM *aItem)
virtual void Remove(EDA_ITEM *aItem)
virtual void Clear() override
Remove all the stored items from the group.
void SetReferencePoint(const VECTOR2I &aP)
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
virtual const SEG GetSegment(int aIndex) const override
int SegmentCount() const
Return the number of segments in this line chain.
Represent a set of closed polygons.
double Area()
Return the area of this poly set.
bool Collide(const SHAPE *aShape, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const override
Check if the boundary of shape (this) lies closer to the shape aShape than aClearance,...
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
int OutlineCount() const
Return the number of outlines in the set.
GR_TEXT_H_ALIGN_T m_Halign
GR_TEXT_V_ALIGN_T m_Valign
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
A modified version of the wxInfoBar class that allows us to:
void Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
MESSAGE_TYPE GetMessageType() const
void OnGeometryChange(const POLYGON_GEOM_MANAGER &aMgr) override
Called when the polygon is complete.
bool GetIsRuleArea() const
Accessors to parameters used in Rule Area zones:
bool GetDoNotAllowVias() const
SHAPE_POLY_SET * Outline()
virtual bool IsOnLayer(PCB_LAYER_ID) const override
Test to see if this object is on the given layer.
PCB_LAYER_ID GetFirstLayer() const
This file is part of the common library.
@ HOLE_CLEARANCE_CONSTRAINT
static constexpr EDA_ANGLE ANGLE_0
static constexpr EDA_ANGLE ANGLE_90
std::vector< EDA_ITEM * > EDA_ITEMS
Define list of drawing items for screens.
#define IS_NEW
New item, just created.
#define IS_MOVING
Item being moved.
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
void ConnectBoardShapes(std::vector< PCB_SHAPE * > &aShapeList, int aChainingEpsilon)
Connects shapes to each other, making continious contours (adjacent shapes will have a common vertex)...
a few functions useful in geometry calculations.
VECTOR2< T > GetVectorSnapped45(const VECTOR2< T > &aVec, bool only45=false)
Snap a vector onto the nearest 0, 45 or 90 degree line.
VECTOR2< ret_type > GetClampedCoords(const VECTOR2< in_type > &aCoords, pad_type aPadding=1u)
Clamps a vector to values that can be negated, respecting numeric limits of coordinates data type wit...
@ DIRECT
Unconstrained point-to-point.
VECTOR2< T > GetVectorSnapped90(const VECTOR2< T > &aVec)
Snap a vector onto the nearest horizontal or vertical line.
void InferBold(TEXT_ATTRIBUTES *aAttrs)
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
@ LAYER_FILLED_SHAPES
Copper graphic shape opacity/visibility (color ignored).
@ LAYER_ZONES
Control for copper zone opacity/visibility (color ignored).
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
@ SIMILAR
Add a new zone with the same settings as an existing one.
@ ADD
Add a new zone/keepout with fresh settings.
Class to handle a set of BOARD_ITEMs.
SCOPED_SET_RESET< DRAWING_TOOL::MODE > SCOPED_DRAW_MODE
@ ID_POPUP_PCB_SELECT_CUSTOM_WIDTH
@ ID_POPUP_PCB_SELECT_VIASIZE1
@ ID_POPUP_PCB_SELECT_VIASIZE16
int GetUserUnits()
Return the currently selected user unit value for the interface.
PGM_BASE & Pgm()
The global program "get" accessor.
Class that computes missing connections on a PCB.
std::optional< VECTOR2I > OPT_VECTOR2I
bool NoPrintableChars(const wxString &aString)
Return true if the string is empty or contains only whitespace.
LINE_STYLE
Dashed line types.
A filename or source description, a problem input line, a line number, a byte offset,...
std::unique_ptr< BOARD_ITEM > CreateItem() override
DRAWING_TOOL & m_drawingTool
PCB_BASE_EDIT_FRAME & m_frame
PCB_GRID_HELPER m_gridHelper
void SnapItem(BOARD_ITEM *aItem) override
POINT_PLACER(DRAWING_TOOL &aDrawingTool, PCB_BASE_EDIT_FRAME &aFrame)
Container to handle a stock of specific vias each with unique diameter and drill sizes in the BOARD c...
Parameters used to fully describe a zone creation process.
ZONE_MODE m_mode
Zone settings source (for similar and cutout zones)
bool m_keepout
< Should create a keepout zone?
ZONE * m_sourceZone
Zone leader mode.
PCB_LAYER_ID m_layer
The zone mode to operate in.
SHAPE_CIRCLE circle(c.m_circle_center, c.m_circle_radius)
wxString result
Test unit parsing edge cases and error handling.
bool TestSegmentHit(const VECTOR2I &aRefPoint, const VECTOR2I &aStart, const VECTOR2I &aEnd, int aDist)
Test if aRefPoint is with aDistance on the line defined by aStart and aEnd.
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
@ PCB_ZONE_T
class ZONE, a copper pour area
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
@ PCB_PAD_T
class PAD, a pad in a footprint
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
@ PCB_DIMENSION_T
class PCB_DIMENSION_BASE: abstract dimension meta-type
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D