64using namespace std::placeholders;
66#include <wx/hyperlink.h>
71#include <dialogs/dialog_tablecell_properties.h>
72#include <dialogs/dialog_table_properties.h>
109 m_selectionTool( nullptr ),
119 m_statusPopup = std::make_unique<STATUS_TEXT_POPUP>( getEditFrame<PCB_BASE_EDIT_FRAME>() );
125 auto menu = std::make_shared<CONDITIONAL_MENU>( aTool );
128 menu->SetTitle(
_(
"Positioning Tools" ) );
130 auto notMovingCondition = [](
const SELECTION& aSelection )
132 return aSelection.Empty() || !aSelection.Front()->IsMoving();
148 auto menu = std::make_shared<CONDITIONAL_MENU>( aTool );
150 menu->SetTitle(
_(
"Shape Modification" ) );
168 auto hasCornerCondition =
176 auto hasMidpointCondition =
220 auto positioningToolsCondition =
224 subMenu->Evaluate( aSel );
225 return subMenu->GetMenuItemCount() > 0;
228 auto shapeModificationCondition =
232 subMenu->Evaluate( aSel );
233 return subMenu->GetMenuItemCount() > 0;
236 auto propertiesCondition =
239 if( aSel.GetSize() == 0 )
253 if( aSel.GetSize() == 1 )
265 auto inFootprintEditor =
289 auto multipleFootprintsCondition =
292 bool foundFirst =
false;
308 auto noActiveToolCondition =
311 return frame()->ToolStackIsEmpty();
314 auto notMovingCondition =
317 return aSelection.Empty() || !aSelection.Front()->IsMoving();
320 auto noItemsCondition =
321 [ this ](
const SELECTION& aSelections ) ->
bool
323 return frame()->GetBoard() && !
frame()->GetBoard()->IsEmpty();
335 && notMovingCondition
336 && !inFootprintEditor;
358 && notMovingCondition );
365 && notMovingCondition );
387 && !inFootprintEditor );
399 menu.AddSeparator( 100 );
400 menu.AddMenu( shapeModificationSubMenu.get(), shapeModificationCondition, 100 );
401 menu.AddMenu( positioningToolsSubMenu.get(), positioningToolsCondition, 100 );
403 menu.AddSeparator( 150 );
415 menu.AddSeparator( 150 );
431 wxString footprintName;
432 wxArrayString fplist;
437 fplist.Add( fp->GetReference() + wxT(
" ( " ) + fp->GetValue() + wxT(
" )" ) );
447 footprintName.Trim(
true );
448 footprintName.Trim(
false );
450 if( !footprintName.IsEmpty() )
454 if( fp->GetReference().CmpNoCase( footprintName ) == 0 )
554 std::vector<PCB_TRACK*> tracks;
555 std::vector<PCB_TRACK*> vias;
556 std::vector<FOOTPRINT*> footprints;
563 vias.push_back( track );
565 tracks.push_back( track );
576 for( int ii = aCollector.GetCount() - 1; ii >= 0; --ii )
578 if( aCollector[ii]->Type() != PCB_FOOTPRINT_T )
579 aCollector.Remove( ii );
582 else if( tracks.size() || vias.size() )
587 if( aCollector.GetCount() > 1 )
588 sTool->GuessSelectionCandidates( aCollector, aPt );
595 auto connected = []( PCB_TRACK* track, const VECTOR2I& pt )
597 return track->GetStart() == pt || track->GetEnd() == pt;
600 if( tracks.size() == 2 && vias.size() == 0 )
602 if( connected( tracks[0], tracks[1]->GetStart() )
603 || connected( tracks[0], tracks[1]->GetEnd() ) )
605 aCollector.Remove( tracks[1] );
608 else if( tracks.size() == 2 && vias.size() == 1 )
610 if( connected( tracks[0], vias[0]->GetPosition() )
611 && connected( tracks[1], vias[0]->GetPosition() ) )
613 aCollector.Remove( tracks[0] );
614 aCollector.Remove( tracks[1] );
621 if( selection.Empty() )
624 if( selection.Size() == 1 && selection.Front()->Type() ==
PCB_ARC_T )
628 return DragArcTrack( aEvent );
632 invokeInlineRouter( mode );
651 wxString msg = wxString::Format(
_(
"Unable to resize arc tracks of %s or greater." ),
653 frame()->ShowInfoBarError( msg );
666 bool restore_state =
false;
680 tanStart.
A = *tanIntersect;
682 tanEnd.
A = *tanIntersect;
685 std::set<PCB_TRACK*> addedTracks;
687 auto getUniqueTrackAtAnchorCollinear =
693 int allowedDeviation = theArc->
GetWidth();
695 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
697 for(
int i = 0; i < 3; i++ )
699 itemsOnAnchor = conn->GetConnectedItemsAtAnchor( theArc, aAnchor,
702 allowedDeviation /= 2;
704 if( itemsOnAnchor.size() == 1 )
710 if( itemsOnAnchor.size() == 1 && itemsOnAnchor.front()->Type() ==
PCB_TRACE_T )
712 track =
static_cast<PCB_TRACK*
>( itemsOnAnchor.front() );
718 if( trackSeg.
Angle( aCollinearSeg ) > maxTangentDeviation )
735 addedTracks.insert( track );
741 PCB_TRACK* trackOnStart = getUniqueTrackAtAnchorCollinear( theArc->
GetStart(), tanStart);
742 PCB_TRACK* trackOnEnd = getUniqueTrackAtAnchorCollinear( theArc->
GetEnd(), tanEnd );
747 tanStart.
B = trackOnStart->
GetEnd();
753 tanEnd.
B = trackOnEnd->
GetEnd();
757 if( tanIntersect = tanStart.
IntersectLines( tanEnd ); !tanIntersect )
760 auto isTrackStartClosestToArcStart =
763 double trackStartToArcStart = aTrack->GetStart().
Distance( theArc->
GetStart() );
764 double trackEndToArcStart = aTrack->GetEnd().Distance( theArc->
GetStart() );
766 return trackStartToArcStart < trackEndToArcStart;
769 bool isStartTrackOnStartPt = isTrackStartClosestToArcStart( trackOnStart );
770 bool isEndTrackOnStartPt = isTrackStartClosestToArcStart( trackOnEnd );
799 auto getFurthestPointToTanInterstect =
802 if( ( aPointA - *tanIntersect ).EuclideanNorm()
803 > ( aPointB - *tanIntersect ).EuclideanNorm() )
814 VECTOR2I tanStartPoint = getFurthestPointToTanInterstect( tanStart.
A, tanStart.
B );
815 VECTOR2I tanEndPoint = getFurthestPointToTanInterstect( tanEnd.
A, tanEnd.
B );
816 VECTOR2I tempTangentPoint = tanEndPoint;
818 if( getFurthestPointToTanInterstect( tanStartPoint, tanEndPoint ) == tanEndPoint )
819 tempTangentPoint = tanStartPoint;
825 SEG cSegTanStart( maxTanPtStart, *tanIntersect );
826 SEG cSegTanEnd( maxTanPtEnd, *tanIntersect );
827 SEG cSegChord( maxTanPtStart, maxTanPtEnd );
829 int cSegTanStartSide = cSegTanStart.
Side( theArc->
GetMid() );
830 int cSegTanEndSide = cSegTanEnd.
Side( theArc->
GetMid() );
831 int cSegChordSide = cSegChord.
Side( theArc->
GetMid() );
833 bool eatFirstMouseUp =
true;
845 std::vector<VECTOR2I> possiblePoints;
852 for(
const VECTOR2I& candidate : possiblePoints )
854 if( ( candidate -
m_cursor ).SquaredEuclideanNorm()
855 < ( closest -
m_cursor ).SquaredEuclideanNorm() )
884 if( isStartTrackOnStartPt )
887 trackOnStart->
SetEnd( newStart );
889 if( isEndTrackOnStartPt )
892 trackOnEnd->
SetEnd( newEnd );
900 if( evt->IsMotion() || evt->IsDrag(
BUT_LEFT ) )
902 eatFirstMouseUp =
false;
904 else if( evt->IsCancelInteractive() || evt->IsActivate() )
906 restore_state =
true;
911 restore_state =
true;
920 eatFirstMouseUp =
false;
932 if( isStartTrackOnStartPt )
933 newStart = trackOnStart->
GetEnd();
935 if( isEndTrackOnStartPt )
936 newEnd = trackOnEnd->
GetEnd();
941 if( trackOnStart->
GetLength() <= maxLengthIU )
943 if( addedTracks.count( trackOnStart ) )
946 addedTracks.erase( trackOnStart );
951 commit.
Remove( trackOnStart );
957 if( trackOnEnd->
GetLength() <= maxLengthIU )
959 if( addedTracks.count( trackOnEnd ) )
962 addedTracks.erase( trackOnEnd );
967 commit.
Remove( trackOnEnd );
986 commit.
Push(
_(
"Drag Arc Track" ) );
998 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1000 BOARD_ITEM* item = aCollector[ i ];
1002 if( !dynamic_cast<PCB_TRACK*>( item ) )
1003 aCollector.Remove( item );
1021 if(
via->GetViaType() == VIATYPE::MICROVIA )
1034 via->SetDrill( new_drill );
1042 wxCHECK( track, 0 );
1051 commit.
Push(
_(
"Edit Track Width/Via Size" ) );
1068 static int filletRadius = 0;
1074 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1076 BOARD_ITEM* item = aCollector[i];
1078 if( !dynamic_cast<PCB_TRACK*>( item ) )
1079 aCollector.Remove( item );
1084 if( selection.
Size() < 2 )
1086 frame()->ShowInfoBarMsg(
_(
"At least two straight track segments must be selected." ) );
1102 bool t1Start =
true;
1103 bool t2Start =
true;
1106 std::vector<FILLET_OP> filletOperations;
1107 bool operationPerformedOnAtLeastOne =
false;
1108 bool didOneAttemptFail =
false;
1109 std::set<PCB_TRACK*> processedTracks;
1111 auto processFilletOp =
1112 [&](
PCB_TRACK* aTrack,
bool aStartPoint )
1116 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
1120 if( itemsOnAnchor.size() > 0
1121 && selection.
Contains( itemsOnAnchor.at( 0 ) )
1127 if( processedTracks.find( trackOther ) == processedTracks.end() )
1129 if( itemsOnAnchor.size() == 1 )
1132 filletOp.t1 = aTrack;
1133 filletOp.t2 = trackOther;
1134 filletOp.t1Start = aStartPoint;
1135 filletOp.t2Start = aTrack->
IsPointOnEnds( filletOp.t2->GetStart() );
1136 filletOperations.push_back( filletOp );
1142 didOneAttemptFail =
true;
1156 processFilletOp( track,
true );
1157 processFilletOp( track,
false );
1159 processedTracks.insert( track );
1165 std::vector<BOARD_ITEM*> itemsToAddToSelection;
1167 for( FILLET_OP filletOp : filletOperations )
1175 if( trackOnStart && trackOnEnd )
1178 if( ( trackOnStart || trackOnEnd ) && track1->
GetLayer() == track2->
GetLayer() )
1186 SHAPE_ARC sArc( t1Seg, t2Seg, filletRadius );
1189 auto setIfPointOnSeg =
1192 VECTOR2I segToVec = aSegment.NearestPoint( aVecToTest ) - aVecToTest;
1197 aPointToSet.
x = aVecToTest.x;
1198 aPointToSet.
y = aVecToTest.y;
1206 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP0() )
1207 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP0() ) )
1209 didOneAttemptFail =
true;
1213 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP1() )
1214 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP1() ) )
1216 didOneAttemptFail =
true;
1228 itemsToAddToSelection.push_back( tArc );
1233 if( filletOp.t1Start )
1236 track1->
SetEnd( t1newPoint );
1238 if( filletOp.t2Start )
1241 track2->
SetEnd( t2newPoint );
1243 operationPerformedOnAtLeastOne =
true;
1247 commit.
Push(
_(
"Fillet Tracks" ) );
1250 for(
BOARD_ITEM* item : itemsToAddToSelection )
1253 if( !operationPerformedOnAtLeastOne )
1254 frame()->ShowInfoBarMsg(
_(
"Unable to fillet the selected track segments." ) );
1255 else if( didOneAttemptFail )
1256 frame()->ShowInfoBarMsg(
_(
"Some of the track segments could not be filleted." ) );
1272 int& aPersitentRadius )
1277 return std::nullopt;
1281 return aPersitentRadius;
1285static std::optional<DOGBONE_CORNER_ROUTINE::PARAMETERS>
1294 std::vector<WX_MULTI_ENTRY_DIALOG::ENTRY> entries{
1301 _(
"Add slots in acute corners" ),
1303 _(
"Add slots in acute corners to allow access to a cutter of the given radius" ),
1310 return std::nullopt;
1312 std::vector<WX_MULTI_ENTRY_DIALOG::RESULT> results = dlg.
GetValues();
1313 wxCHECK( results.size() == 2, std::nullopt );
1317 s_dogBoneParams.DogboneRadiusIU = std::get<long long int>( results[0] );
1318 s_dogBoneParams.AddSlots = std::get<bool>( results[1] );
1320 catch(
const std::bad_variant_access& )
1323 return std::nullopt;
1326 return s_dogBoneParams;
1342 static CHAMFER_PARAMS params{ default_setback, default_setback };
1345 params.m_chamfer_setback_a );
1348 return std::nullopt;
1350 params.m_chamfer_setback_a = dlg.
GetValue();
1353 params.m_chamfer_setback_b = params.m_chamfer_setback_a;
1364 std::vector<VECTOR2I> pts;
1367 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1369 BOARD_ITEM* item = aCollector[i];
1373 if( !item->IsType( { PCB_SHAPE_LOCATE_SEGMENT_T,
1374 PCB_SHAPE_LOCATE_POLY_T,
1375 PCB_SHAPE_LOCATE_RECT_T } ) )
1377 aCollector.
Remove( item );
1383 std::set<PCB_SHAPE*> lines_to_add;
1384 std::vector<PCB_SHAPE*> items_to_remove;
1388 std::vector<VECTOR2I> pts;
1395 items_to_remove.push_back( graphic );
1398 pts.emplace_back( start );
1400 pts.emplace_back(
end );
1406 items_to_remove.push_back( graphic );
1408 for(
int jj = 0; jj < graphic->
GetPolyShape().VertexCount(); ++jj )
1412 for(
size_t jj = 1; jj < pts.size(); ++jj )
1420 lines_to_add.insert( line );
1423 if( pts.size() > 1 )
1428 line->
SetEnd( pts.front() );
1431 lines_to_add.insert( line );
1439 frame()->ShowInfoBarMsg(
_(
"Exactly two lines must be selected to extend them." ) );
1446 else if( segmentCount < 2 )
1448 frame()->ShowInfoBarMsg(
_(
"A shape with at least two lines must be selected." ) );
1462 selection.Add( item );
1466 for(
PCB_SHAPE* item : items_to_remove )
1468 selection.Remove( item );
1469 commit.Remove( item );
1477 std::vector<BOARD_ITEM*> items_to_select_on_success;
1480 std::vector<BOARD_ITEM*> items_to_deselect_on_success;
1485 auto item_modification_handler =
1491 commit.Modify( &aItem );
1492 items_to_select_on_success.push_back( &aItem );
1496 bool any_items_created = !lines_to_add.empty();
1497 auto item_creation_handler =
1498 [&]( std::unique_ptr<BOARD_ITEM> aItem )
1500 any_items_created =
true;
1501 items_to_select_on_success.push_back( aItem.get() );
1502 commit.Add( aItem.release() );
1505 bool any_items_removed = !items_to_remove.empty();
1506 auto item_removal_handler =
1510 any_items_removed =
true;
1511 items_to_deselect_on_success.push_back( &aItem );
1512 commit.Remove( &aItem );
1517 item_creation_handler, item_modification_handler, item_removal_handler );
1520 std::unique_ptr<PAIRWISE_LINE_ROUTINE> pairwise_line_routine;
1525 std::optional<int> filletRadiusIU =
1528 if( filletRadiusIU.has_value() )
1530 pairwise_line_routine = std::make_unique<LINE_FILLET_ROUTINE>(
1531 frame()->
GetModel(), change_handler, *filletRadiusIU );
1536 std::optional<DOGBONE_CORNER_ROUTINE::PARAMETERS> dogboneParams =
1539 if( dogboneParams.has_value() )
1541 pairwise_line_routine = std::make_unique<DOGBONE_CORNER_ROUTINE>(
1542 frame()->
GetModel(), change_handler, *dogboneParams );
1547 std::optional<CHAMFER_PARAMS> chamfer_params =
GetChamferParams( *frame() );
1549 if( chamfer_params.has_value() )
1551 pairwise_line_routine = std::make_unique<LINE_CHAMFER_ROUTINE>( frame()->
GetModel(),
1558 pairwise_line_routine = std::make_unique<LINE_EXTENSION_ROUTINE>( frame()->
GetModel(),
1562 if( !pairwise_line_routine )
1573 if( ( a->GetFlags() & STRUCT_DELETED ) == 0
1574 && ( b->GetFlags() & STRUCT_DELETED ) == 0 )
1576 PCB_SHAPE* line_a = static_cast<PCB_SHAPE*>( a );
1577 PCB_SHAPE* line_b = static_cast<PCB_SHAPE*>( b );
1579 pairwise_line_routine->ProcessLinePair( *line_a, *line_b );
1584 for(
BOARD_ITEM* item : items_to_select_on_success )
1585 m_selectionTool->AddItemToSel( item,
true );
1588 for(
BOARD_ITEM* item : items_to_deselect_on_success )
1589 m_selectionTool->RemoveItemFromSel( item,
true );
1591 if( any_items_removed )
1594 if( any_items_created )
1600 commit.Push( pairwise_line_routine->GetCommitDescription() );
1602 if(
const std::optional<wxString> msg = pairwise_line_routine->GetStatusMessage( segmentCount ) )
1603 frame()->ShowInfoBarMsg( *msg );
1614 std::vector<VECTOR2I> pts;
1617 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1619 BOARD_ITEM* item = aCollector[i];
1621 if( !item->IsType( { PCB_SHAPE_LOCATE_POLY_T, PCB_ZONE_T } ) )
1622 aCollector.
Remove( item );
1624 if(
ZONE* zone = dyn_cast<ZONE*>( item ) )
1626 if( zone->IsTeardropArea() )
1627 aCollector.
Remove( item );
1639 if( dlg.ShowModal() == wxID_CANCEL )
1642 s_toleranceValue = dlg.GetValue();
1644 if( s_toleranceValue <= 0 )
1649 std::vector<PCB_SHAPE*> shapeList;
1655 if(
PCB_SHAPE* shape = dyn_cast<PCB_SHAPE*>( item ) )
1662 if(
ZONE* zone = dyn_cast<ZONE*>( item ) )
1670 commit.Push(
_(
"Simplify Polygons" ) );
1684 std::vector<VECTOR2I> pts;
1687 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1689 BOARD_ITEM* item = aCollector[i];
1693 if( !item->IsType( { PCB_SHAPE_LOCATE_SEGMENT_T, PCB_SHAPE_LOCATE_ARC_T,
1694 PCB_SHAPE_LOCATE_BEZIER_T } ) )
1696 aCollector.
Remove( item );
1708 if( dlg.ShowModal() == wxID_CANCEL )
1711 s_toleranceValue = dlg.GetValue();
1713 if( s_toleranceValue <= 0 )
1718 std::vector<PCB_SHAPE*> shapeList;
1719 std::vector<std::unique_ptr<PCB_SHAPE>> newShapes;
1725 shapeList.push_back( shape );
1732 std::vector<PCB_SHAPE*> items_to_select;
1734 for( std::unique_ptr<PCB_SHAPE>& ptr : newShapes )
1738 commit.Add( shape );
1739 items_to_select.push_back( shape );
1742 commit.Push(
_(
"Heal Shapes" ) );
1745 for(
PCB_SHAPE* item : items_to_select )
1746 m_selectionTool->AddItemToSel( item,
true );
1748 if( items_to_select.size() > 0 )
1764 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1766 BOARD_ITEM* item = aCollector[i];
1768 if( !item->IsType( {
1769 PCB_SHAPE_LOCATE_POLY_T,
1770 PCB_SHAPE_LOCATE_RECT_T,
1773 aCollector.
Remove( item );
1779 const EDA_ITEM*
const last_item = selection.GetLastAddedItem();
1782 std::vector<PCB_SHAPE*> items_to_process;
1786 items_to_process.push_back(
static_cast<PCB_SHAPE*
>( item ) );
1791 if( item == last_item )
1792 std::swap( items_to_process.back(), items_to_process.front() );
1798 auto item_modification_handler =
1804 std::vector<BOARD_ITEM*> items_to_select_on_success;
1806 auto item_creation_handler =
1807 [&]( std::unique_ptr<BOARD_ITEM> aItem )
1809 items_to_select_on_success.push_back( aItem.get() );
1810 commit.
Add( aItem.release() );
1813 auto item_removal_handler =
1821 item_creation_handler, item_modification_handler, item_removal_handler );
1824 std::unique_ptr<POLYGON_BOOLEAN_ROUTINE> boolean_routine;
1827 boolean_routine = std::make_unique<POLYGON_MERGE_ROUTINE>( frame()->
GetModel(),
1832 boolean_routine = std::make_unique<POLYGON_SUBTRACT_ROUTINE>( frame()->
GetModel(),
1837 boolean_routine = std::make_unique<POLYGON_INTERSECT_ROUTINE>( frame()->
GetModel(),
1842 wxASSERT_MSG(
false,
"Could not find a polygon routine for this action" );
1847 for(
PCB_SHAPE* shape : items_to_process )
1848 boolean_routine->ProcessShape( *shape );
1850 boolean_routine->Finalize();
1853 for(
BOARD_ITEM* item : items_to_select_on_success )
1854 m_selectionTool->AddItemToSel( item,
true );
1859 commit.Push( boolean_routine->GetCommitDescription() );
1861 if(
const std::optional<wxString> msg = boolean_routine->GetStatusMessage() )
1862 frame()->ShowInfoBarMsg( *msg );
1884 std::vector<PCB_TABLECELL*> cells;
1934 for(
EDA_ITEM* eda_item : selCopy )
1936 if( !eda_item->IsBOARD_ITEM() )
1969 commit = &localCommit;
1984 if( selection.
Empty() )
1987 std::optional<VECTOR2I> oldRefPt;
1988 bool is_hover = selection.
IsHover();
2010 if( selection.
Empty() )
2025 if(
frame()->GetCanvas()->GetView()->GetGAL()->IsFlippedX() )
2026 rotateAngle = -rotateAngle;
2032 viewBBox.
Merge( item->ViewBBox() );
2041 typedef std::numeric_limits<int> coord_limits;
2046 bool outOfBounds = rotPos.
x < min || rotPos.
x > max || rotPos.
y < min || rotPos.
y > max
2047 || rotEnd.
x < min || rotEnd.
x > max || rotEnd.
y < min || rotEnd.
y > max;
2053 if( !item->IsNew() && !item->IsMoving() )
2056 if( item->IsBOARD_ITEM() )
2060 board_item->
Rotate( refPt, rotateAngle );
2068 if( !localCommit.
Empty() )
2069 localCommit.
Push(
_(
"Rotate" ) );
2104 MIRROR( tmpPt, aMirrorPoint, aFlipDirection );
2144 commit = &localCommit;
2155 if( selection.
Empty() )
2162 ? FLIP_DIRECTION::TOP_BOTTOM
2163 : FLIP_DIRECTION::LEFT_RIGHT;
2165 std::vector<EDA_ITEM*> items;
2171 static_cast<PCB_GROUP*
>( item )->RunOnChildren(
2174 items.push_back( descendant );
2176 RECURSE_MODE::RECURSE );
2180 items.push_back( item );
2189 if( !item->IsNew() && !item->IsMoving() )
2193 switch( item->Type() )
2196 static_cast<PCB_SHAPE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2200 static_cast<ZONE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2205 static_cast<PCB_TEXT*
>( item )->
Mirror( mirrorPoint, flipDirection );
2217 mirrorPad( *
static_cast<PAD*
>( item ), mirrorPoint, flipDirection );
2223 static_cast<PCB_TRACK*
>( item )->
Mirror( mirrorPoint, flipDirection );
2236 if( !localCommit.
Empty() )
2237 localCommit.
Push(
_(
"Mirror" ) );
2266 commit = &localCommit;
2275 if( selection.
Empty() )
2293 if( !item->IsNew() && !item->IsMoving() )
2296 setJustify(
static_cast<PCB_TEXT*
>( item ) );
2300 if( !item->IsNew() && !item->IsMoving() )
2307 if( !localCommit.
Empty() )
2310 localCommit.
Push(
_(
"Left Justify" ) );
2312 localCommit.
Push(
_(
"Center Justify" ) );
2314 localCommit.
Push(
_(
"Right Justify" ) );
2344 commit = &localCommit;
2356 if( selection.
Empty() )
2359 std::optional<VECTOR2I> oldRefPt;
2374 if( selection.
GetSize() == 1 )
2378 if( !item || item->
GetShape() != SHAPE_T::RECTANGLE )
2386 if( !item->IsBOARD_ITEM() )
2392 commit->
Modify( boardItem );
2394 boardItem->
Flip( refPt, flipDirection );
2401 if( !localCommit.
Empty() )
2402 localCommit.
Push(
_(
"Change Side / Flip" ) );
2427 std::unordered_set<BOARD_ITEM*>& children )
2431 std::unordered_set<BOARD_ITEM*>& childItems =
static_cast<PCB_GROUP*
>( item )->GetItems();
2435 children.insert( childItem );
2445 auto itr = items.begin();
2447 while( itr != items.end() )
2457 std::unordered_set<BOARD_ITEM*> childItems;
2460 std::for_each( childItems.begin(), childItems.end(),
2461 [&](
auto eraseItem )
2463 items.erase( eraseItem );
2483 std::unordered_set<EDA_ITEM*> rootItems( aItems.
begin(), aItems.
end() );
2486 int itemsDeleted = 0;
2487 int fieldsHidden = 0;
2488 int fieldsAlreadyHidden = 0;
2492 if( !item->IsBOARD_ITEM() )
2501 switch( item->Type() )
2507 wxASSERT( parentFP );
2508 commit.
Modify( parentFP );
2517 fieldsAlreadyHidden++;
2527 commit.
Modify( parentFP );
2528 parentFP->
Delete( board_item );
2533 commit.
Remove( board_item );
2549 commit.
Remove( board_item );
2555 commit.
Modify( board_item );
2556 static_cast<PCB_TABLECELL*
>( board_item )->SetText( wxEmptyString );
2566 RECURSE_MODE::RECURSE );
2573 RECURSE_MODE::RECURSE );
2575 commit.
Remove( board_item );
2582 commit.
Modify( parentFP );
2584 parentFP->
Remove( board_item );
2594 if( !aIsCut && aItems.
GetSize() == 1 )
2597 ZONE* zone =
static_cast<ZONE*
>( board_item );
2599 int outlineIdx, holeIdx;
2620 commit.
Remove( board_item );
2625 if( rootItems.size() == 1 )
2642 commit.
Remove( board_item );
2649 wxASSERT_MSG( parentFP ==
nullptr, wxT(
"Try to delete an item living in a footprint" ) );
2650 commit.
Remove( board_item );
2659 if( enteredGroup && enteredGroup->
GetItems().empty() )
2664 commit.
Push(
_(
"Cut" ) );
2666 else if( itemsDeleted == 0 )
2668 if( fieldsHidden == 1 )
2669 commit.
Push(
_(
"Hide Field" ) );
2670 else if( fieldsHidden > 1 )
2671 commit.
Push(
_(
"Hide Fields" ) );
2672 else if( fieldsAlreadyHidden > 0 )
2673 editFrame->
ShowInfoBarError(
_(
"Use the Footprint Properties dialog to remove fields." ) );
2677 commit.
Push(
_(
"Delete" ) );
2688 std::vector<BOARD_ITEM*> lockedItems;
2772 if( selection.
Empty() )
2786 if( ret == wxID_OK )
2794 selCenter += translation;
2796 if( !
frame()->GetPcbNewSettings()->m_Display.m_DisplayInvertYAxis )
2797 rotation = -rotation;
2801 if( !item->IsBOARD_ITEM() )
2806 if( !boardItem->
IsNew() )
2807 commit.
Modify( boardItem );
2810 boardItem->
Move( translation );
2812 switch( rotationAnchor )
2818 boardItem->
Rotate( selCenter, angle );
2821 boardItem->
Rotate(
frame()->GetScreen()->m_LocalOrigin, angle );
2832 commit.
Push(
_(
"Move Exactly" ) );
2834 if( selection.IsHover() )
2870 if( selection.
Empty() )
2886 bool is_hover = selection.
IsHover();
2888 std::vector<BOARD_ITEM*> new_items;
2889 new_items.reserve( selection.
Size() );
2895 if( !item->IsBOARD_ITEM() )
2909 switch( orig_item->
Type() )
2935 new_items.push_back( dupe_item );
2936 commit.
Add( dupe_item );
2954 static_cast<PAD*
>( dupe_item )->SetNumber( padNumber );
2961 new_items.push_back( dupe_item );
2962 commit.
Add( dupe_item );
2971 dupe_item =
static_cast<PCB_GROUP*
>( orig_item )->DeepDuplicate();
2977 new_items.push_back( aItem );
2978 commit.
Add( aItem );
2980 RECURSE_MODE::RECURSE );
2983 new_items.push_back( dupe_item );
2984 commit.
Add( dupe_item );
2988 wxASSERT_MSG(
false, wxString::Format( wxT(
"Unhandled item type %d" ),
2989 orig_item->
Type() ) );
2999 EDA_ITEMS nItems( new_items.begin(), new_items.end() );
3003 if( !selection.
Empty() )
3005 editFrame->
DisplayToolMsg( wxString::Format(
_(
"Duplicated %d item(s)" ),
3006 (
int) new_items.size() ) );
3010 commit.
Push(
_(
"Duplicate" ) );
3025 const auto incrementableFilter =
3028 for(
int i = aCollector.GetCount() - 1; i >= 0; i-- )
3030 switch( aCollector[i]->Type() )
3036 aCollector.Remove( i );
3043 incrementableFilter,
true );
3045 if( selection.
Empty() )
3058 commit = &localCommit;
3060 const auto modifyItem = [&](
EDA_ITEM& aItem )
3065 commit->
Modify( &aItem );
3070 switch( item->Type() )
3080 if( !
pad.CanHaveNumber() )
3084 std::optional<wxString> newNumber =
3085 incrementer.Increment(
pad.GetNumber(), incParam.
Delta, incParam.
Index );
3090 pad.SetNumber( *newNumber );
3099 std::optional<wxString> newText =
3100 incrementer.Increment(
text.GetText(), incParam.
Delta, incParam.
Index );
3105 text.SetText( *newText );
3115 commit->
Push(
_(
"Increment" ) );
3124 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3126 if( aCollector[i]->Type() !=
PCB_PAD_T )
3135 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3146 if( aSelection.
Empty() )
3170 BOX2I nonFieldsBBox;
3174 if( !item->IsType( { PCB_TEXT_T, PCB_FIELD_T } ) )
3175 nonFieldsBBox.
Merge( item->GetBoundingBox() );
3190 const wxString& aCanceledMessage,
VECTOR2I& aReferencePoint )
3194 std::optional<VECTOR2I> pickedPoint;
3202 const auto setPickerLayerSet = [&]()
3207 layerFilter =
LSET( { editFrame.GetActiveLayer() } );
3215 setPickerLayerSet();
3218 [&](
const VECTOR2D& aPoint ) ->
bool
3220 pickedPoint = aPoint;
3222 if( !aSuccessMessage.empty() )
3224 m_statusPopup->SetText( aSuccessMessage );
3225 m_statusPopup->Expire( 800 );
3229 m_statusPopup->Hide();
3244 if( !aCanceledMessage.empty() )
3246 m_statusPopup->SetText( aCanceledMessage );
3247 m_statusPopup->Expire( 800 );
3251 m_statusPopup->Hide();
3256 [&](
const int& aFinalState )
3275 setPickerLayerSet();
3278 evt->SetPassEvent();
3289 aReferencePoint = *pickedPoint;
3291 return pickedPoint.has_value();
3299 getEditFrame<PCB_BASE_EDIT_FRAME>()->GetMagneticItemsSettings() );
3301 "pcbnew.InteractiveEdit.selectReferencePoint",
3302 TOOL_ACTION_SCOPE::AS_GLOBAL );
3304 frame()->PushTool( selectReferencePoint );
3310 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
3312 BOARD_ITEM* item = aCollector[i];
3316 if( ( item->Type() == PCB_FIELD_T || item->Type() == PCB_TEXT_T )
3317 && aCollector.HasItem( item->GetParentFootprint() ) )
3319 aCollector.Remove( item );
3324 aCollector.Remove( item );
3330 aEvent.IsAction( &
ACTIONS::cut ) && !m_isFootprintEditor );
3332 if( !selection.Empty() )
3334 std::vector<BOARD_ITEM*> items;
3338 if( item->IsBOARD_ITEM() )
3339 items.push_back(
static_cast<BOARD_ITEM*
>( item ) );
3346 if( !pickReferencePoint(
_(
"Select reference point for the copy..." ),
3347 _(
"Selection copied" ),
3348 _(
"Copy canceled" ),
3351 frame()->PopTool( selectReferencePoint );
3357 refPoint =
grid.BestDragOrigin( getViewControls()->GetCursorPosition(), items );
3360 selection.SetReferencePoint( refPoint );
3362 io.SetBoard( board() );
3363 io.SaveSelection( selection, m_isFootprintEditor );
3364 frame()->SetStatusText(
_(
"Selection copied" ) );
3367 frame()->PopTool( selectReferencePoint );
3369 if( selection.IsHover() )
3370 m_selectionTool->ClearSelection();
3389 const auto getItemText = [&](
const BOARD_ITEM& aItem ) -> wxString
3391 switch( aItem.Type() )
3403 return text.GetShownText(
true );
3417 for(
int row = 0; row <
table.GetRowCount(); ++row )
3419 for(
int col = 0; col <
table.GetColCount(); ++col )
3424 if( col <
table.GetColCount() - 1 )
3430 if( row <
table.GetRowCount() - 1 )
3441 return wxEmptyString;
3444 wxArrayString itemTexts;
3448 if( item->IsBOARD_ITEM() )
3451 wxString itemText = getItemText( *boardItem );
3453 itemText.Trim(
false ).Trim(
true );
3455 if( !itemText.IsEmpty() )
3457 itemTexts.Add( std::move( itemText ) );
3463 if( !itemTexts.empty() )
3465 SaveClipboard( wxJoin( itemTexts,
'\n',
'\0' ).ToStdString() );
constexpr EDA_IU_SCALE pcbIUScale
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
static TOOL_ACTION decrementPrimary
static TOOL_ACTION pickerSubTool
static TOOL_ACTION unselectAll
static TOOL_ACTION decrementSecondary
static TOOL_ACTION pasteSpecial
static TOOL_ACTION rightJustify
static TOOL_ACTION pageSettings
static TOOL_ACTION incrementSecondary
static TOOL_ACTION duplicate
static TOOL_ACTION incrementPrimary
static TOOL_ACTION doDelete
static TOOL_ACTION cursorClick
static TOOL_ACTION increment
static TOOL_ACTION leftJustify
static TOOL_ACTION copyAsText
static TOOL_ACTION refreshPreview
static TOOL_ACTION selectAll
static TOOL_ACTION centerJustify
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
virtual void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Execute the changes.
COMMIT & Stage(EDA_ITEM *aItem, CHANGE_TYPE aChangeType, BASE_SCREEN *aScreen=nullptr) override
Add a change of the item aItem of type aChangeType to the change list.
virtual void Revert() override
Revert the commit by restoring the modified items state.
NETINFO_ITEM * GetNet() const
Return #NET_INFO object for a given item.
void SetNet(NETINFO_ITEM *aNetInfo)
Set a NET_INFO object for the item.
int GetCurrentViaSize() const
const VECTOR2I & GetAuxOrigin() const
int GetCurrentTrackWidth() const
int GetCurrentViaDrill() const
virtual void Delete(BOARD_ITEM *aItem)
Removes an item from the container and deletes it.
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 SetLocked(bool aLocked)
PCB_GROUP * GetParentGroup() const
virtual void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle)
Rotate this object.
virtual BOARD_ITEM * Duplicate() const
Create a copy of this BOARD_ITEM.
virtual void Move(const VECTOR2I &aMoveVector)
Move this object.
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
FOOTPRINT * GetParentFootprint() const
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
virtual bool IsLocked() const
virtual void RunOnChildren(const std::function< void(BOARD_ITEM *)> &aFunction, RECURSE_MODE aMode) const
Invoke a function on all children.
BOARD_ITEM_CONTAINER * GetParent() const
virtual void Normalize()
Perform any normalization required after a user rotate and/or flip.
virtual void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection)
Flip this object, i.e.
LSET GetVisibleLayers() const
A proxy function that calls the correspondent function in m_BoardSettings.
bool BuildConnectivity(PROGRESS_REPORTER *aReporter=nullptr)
Build or rebuild the board connectivity database for the board, especially the list of connected item...
FOOTPRINT * GetFirstFootprint() const
Get the first footprint on the board or nullptr.
const FOOTPRINTS & Footprints() const
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
constexpr const Vec & GetPosition() const
constexpr const Vec GetEnd() const
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
constexpr const Vec GetCenter() const
constexpr bool IsValid() const
Represent basic circle geometry with utility geometry functions.
VECTOR2I Center
Public to make access simpler.
int Radius
Public to make access simpler.
CIRCLE & ConstructFromTanTanPt(const SEG &aLineA, const SEG &aLineB, const VECTOR2I &aP)
Construct this circle such that it is tangent to the given segments and passes through the given poin...
VECTOR2I NearestPoint(const VECTOR2I &aP) const
Compute the point on the circumference of the circle that is the closest to aP.
int GetCount() const
Return the number of objects in the list.
void Remove(int aIndex)
Remove the item at aIndex (first position is 0).
COMMIT & Remove(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Remove a new item from the model.
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Modify a given item in the model.
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Add a new item to the model.
@ TABLECELL_PROPS_EDIT_TABLE
enum TABLECELL_PROPS_RETVALUE GetReturnValue()
bool HitTestDrawingSheetItems(KIGFX::VIEW *aView, const VECTOR2I &aPosition)
void ShowInfoBarError(const wxString &aErrorMsg, bool aShowCloseButton=false, WX_INFOBAR::MESSAGE_TYPE aType=WX_INFOBAR::MESSAGE_TYPE::GENERIC)
Show the WX_INFOBAR displayed on the top of the canvas with a message and an error icon on the left o...
void DisplayToolMsg(const wxString &msg) override
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
void SetStatusPopup(wxWindow *aPopup)
A base class for most all the KiCad significant classes used in schematics and boards.
virtual VECTOR2I GetPosition() const
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
virtual const BOX2I ViewBBox() const override
Return the bounding box of the item covering all its layers.
SHAPE_POLY_SET & GetPolyShape()
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
void SetStart(const VECTOR2I &aStart)
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
void SetEnd(const VECTOR2I &aEnd)
void SetWidth(int aWidth)
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
virtual bool IsVisible() const
virtual void SetVisible(bool aVisible)
static const TOOL_EVENT SelectedEvent
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
static const TOOL_EVENT ConnectivityChangedEvent
Selected item had a property changed (except movement)
static const TOOL_EVENT UnselectedEvent
Used when the right click button is pressed, or when the select tool is in effect.
static const std::vector< KICAD_T > DraggableItems
A scan list for items that can be dragged.
A handler that is based on a set of callbacks provided by the user of the ITEM_MODIFICATION_ROUTINE.
An interface for classes handling user events controlling the view behavior such as zooming,...
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.
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 SetAutoPan(bool aEnabled)
Turn on/off auto panning (this feature is used when there is a tool active (eg.
bool IsBOARD_ITEM() const
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
bool IsLayerVisible(int aLayer) const
Return information about visibility of a particular layer.
LSET is a set of PCB_LAYER_IDs.
static LSET AllLayersMask()
A collection of nets and the parameters used to route or test these nets.
int GetuViaDiameter() const
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
bool CanHaveNumber() const
Indicates whether or not the pad can have a number.
const VECTOR2I & GetDelta(PCB_LAYER_ID aLayer) const
VECTOR2I GetPosition() const override
void SetDelta(PCB_LAYER_ID aLayer, const VECTOR2I &aSize)
void FlipPrimitives(FLIP_DIRECTION aFlipDirection)
Flip (mirror) the primitives left to right or top to bottom, around the anchor position in custom pad...
PAD_SHAPE GetShape(PCB_LAYER_ID aLayer) const
void SetOffset(PCB_LAYER_ID aLayer, const VECTOR2I &aOffset)
void SetPosition(const VECTOR2I &aPos) override
const VECTOR2I & GetOffset(PCB_LAYER_ID aLayer) const
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
void SetOrientation(const EDA_ANGLE &aAngle)
Set the rotation angle of the pad.
static TOOL_ACTION drag45Degree
static TOOL_ACTION duplicateIncrement
Activation of the duplication tool with incrementing (e.g. pad number)
static TOOL_ACTION changeTrackWidth
Update selected tracks & vias to the current track & via dimensions.
static TOOL_ACTION unrouteSelected
Removes all tracks from the selected items to the first pad.
static TOOL_ACTION mirrorH
Mirroring of selected items.
static TOOL_ACTION updateFootprint
static TOOL_ACTION breakTrack
Break a single track into two segments at the cursor.
static TOOL_ACTION pointEditorMoveMidpoint
static TOOL_ACTION getAndPlace
Find an item and start moving.
static TOOL_ACTION routerRouteSelectedFromEnd
static TOOL_ACTION properties
Activation of the edit tool.
static TOOL_ACTION editFpInFpEditor
static TOOL_ACTION selectionClear
Clear the current selection.
static TOOL_ACTION moveWithReference
move with a reference point
static TOOL_ACTION swap
Swapping of selected items.
static TOOL_ACTION routerAutorouteSelected
static TOOL_ACTION moveExact
Activation of the exact move tool.
static TOOL_ACTION intersectPolygons
Intersection of multiple polygons.
static TOOL_ACTION pointEditorMoveCorner
static TOOL_ACTION genRemove
static TOOL_ACTION selectConnection
Select tracks between junctions or expands an existing selection to pads or the entire connection.
static TOOL_ACTION assignNetClass
static TOOL_ACTION packAndMoveFootprints
Pack and start moving selected footprints.
static TOOL_ACTION copyWithReference
copy command with manual reference point selection
static TOOL_ACTION healShapes
Connect selected shapes, possibly extending or cutting them, or adding extra geometry.
static TOOL_ACTION dragFreeAngle
static TOOL_ACTION positionRelativeInteractively
static TOOL_ACTION inspectClearance
static TOOL_ACTION updateLocalRatsnest
static TOOL_ACTION updateFootprints
static TOOL_ACTION deleteFull
static TOOL_ACTION moveIndividually
move items one-by-one
static TOOL_ACTION changeFootprints
static TOOL_ACTION selectItem
Select an item (specified as the event parameter).
static TOOL_ACTION chamferLines
Chamfer (i.e. adds a straight line) all selected straight lines by a user defined setback.
static TOOL_ACTION dogboneCorners
Add "dogbone" corners to selected lines to allow routing with a cutter radius.
static TOOL_ACTION filletTracks
Fillet (i.e. adds an arc tangent to) all selected straight tracks by a user defined radius.
static TOOL_ACTION simplifyPolygons
Simplify polygon outlines.
static TOOL_ACTION footprintProperties
static TOOL_ACTION filletLines
Fillet (i.e. adds an arc tangent to) all selected straight lines by a user defined radius.
static TOOL_ACTION changeFootprint
static TOOL_ACTION routerInlineDrag
Activation of the Push and Shove router (inline dragging mode)
static TOOL_ACTION positionRelative
static TOOL_ACTION move
move or drag an item
static TOOL_ACTION mirrorV
static TOOL_ACTION mergePolygons
Merge multiple polygons into a single polygon.
static TOOL_ACTION subtractPolygons
Subtract polygons from other polygons.
static TOOL_ACTION selectItems
Select a list of items (specified as the event parameter)
static TOOL_ACTION flip
Flipping of selected objects.
static TOOL_ACTION extendLines
Extend selected lines to meet at a point.
static TOOL_ACTION routerRouteSelected
static TOOL_ACTION rotateCw
Rotation of selected objects.
static TOOL_ACTION rotateCcw
virtual double GetLength() const override
Return the length of the arc track.
void SetMid(const VECTOR2I &aMid)
EDA_ANGLE GetAngle() const
const VECTOR2I & GetMid() const
virtual VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
Common, abstract interface for edit frames.
virtual void OnEditItemRequest(BOARD_ITEM *aItem)
Install the corresponding dialog editor for the given item.
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
DS_PROXY_VIEW_ITEM * GetDrawingSheet() const
void RedrawRatsnest()
Return the bounding box of the view that should be used if model is not valid.
The main frame for Pcbnew.
static const TOOL_EVENT & SnappingModeChangedByKeyEvent()
Hotkey feedback.
A set of BOARD_ITEMs (i.e., without duplicates).
std::unordered_set< BOARD_ITEM * > & GetItems()
Tool that displays edit points allowing to modify items by dragging the points.
BOX2I GetBoundingBox() const override
int GetWidth() const override
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
wxString GetShownText(bool aAllowExtraText, int aDepth=0) const override
Return the string actually shown after processing of the base text.
void SetHasSolderMask(bool aVal)
virtual double GetLength() const
Get the length of the track using the hypotenuse calculation.
void SetEnd(const VECTOR2I &aEnd)
bool HasSolderMask() const
void SetStart(const VECTOR2I &aStart)
void SetLocalSolderMaskMargin(std::optional< int > aMargin)
std::optional< int > GetLocalSolderMaskMargin() const
const VECTOR2I & GetStart() const
const VECTOR2I & GetEnd() const
EDA_ITEM_FLAGS IsPointOnEnds(const VECTOR2I &point, int min_dist=0) const
Return STARTPOINT if point if near (dist = min_dist) start point, ENDPOINT if point if near (dist = m...
virtual void SetWidth(int aWidth)
virtual int GetWidth() const
const VECTOR2I NearestPoint(const VECTOR2I &aP) const
Compute a point on the segment (this) that is closest to point aP.
OPT_VECTOR2I IntersectLines(const SEG &aSeg) const
Compute the intersection point of lines passing through ends of (this) and aSeg.
bool ApproxCollinear(const SEG &aSeg, int aDistanceThreshold=1) const
VECTOR2I LineProject(const VECTOR2I &aP) const
Compute the perpendicular projection point of aP on a line passing through ends of the segment.
SEG PerpendicularSeg(const VECTOR2I &aP) const
Compute a segment perpendicular to this one, passing through point aP.
int Side(const VECTOR2I &aP) const
Determine on which side of directed line passing via segment ends point aP lies.
EDA_ANGLE Angle(const SEG &aOther) const
Determine the smallest angle between two segments.
static SELECTION_CONDITION HasTypes(std::vector< KICAD_T > aTypes)
Create a functor that tests if among the selected items there is at least one of a given types.
static SELECTION_CONDITION HasType(KICAD_T aType)
Create a functor that tests if among the selected items there is at least one of a given type.
static bool NotEmpty(const SELECTION &aSelection)
Test if there are any items selected.
static SELECTION_CONDITION MoreThan(int aNumber)
Create a functor that tests if the number of selected items is greater than the value given as parame...
static SELECTION_CONDITION Count(int aNumber)
Create a functor that tests if the number of selected items is equal to the value given as parameter.
static SELECTION_CONDITION OnlyTypes(std::vector< KICAD_T > aTypes)
Create a functor that tests if the selected items are only of given types.
virtual KIGFX::VIEW_ITEM * GetItem(unsigned int aIdx) const override
VECTOR2I GetReferencePoint() const
virtual VECTOR2I GetCenter() const
Returns the center point of the selection area bounding box.
virtual unsigned int GetSize() const override
Return the number of stored items.
bool HasType(KICAD_T aType) const
Checks if there is at least one item of requested kind.
int Size() const
Returns the number of selected parts.
std::deque< EDA_ITEM * > & Items()
void ClearReferencePoint()
void SetReferencePoint(const VECTOR2I &aP)
bool Empty() const
Checks if there is anything selected.
bool HasReferencePoint() const
size_t CountType(KICAD_T aType) const
bool Contains(EDA_ITEM *aItem) const
const VECTOR2I & GetP1() const
const VECTOR2I & GetP0() const
Represent a set of closed polygons.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
void SimplifyOutlines(int aMaxError=0)
Simplifies the lines in the polyset.
const VECTOR2I & CVertex(int aIndex, int aOutline, int aHole) const
Return the index-th vertex in a given hole outline within a given outline.
static const int MIN_PRECISION_IU
This is the minimum precision for all the points in a shape.
Heuristically increment a string's n'th part from the right.
void SetSkipIOSQXZ(bool aSkip)
If a alphabetic part is found, skip the letters I, O, S, Q, X, Z.
double Distance(const VECTOR2< extended_type > &aVector) const
Compute the distance between two vectors.
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
A dialog like WX_UNIT_ENTRY_DIALOG, but with multiple entries.
std::vector< RESULT > GetValues() const
Returns the values in the order they were added.
An extension of WX_TEXT_ENTRY_DIALOG that uses UNIT_BINDER to request a dimension (e....
int GetValue()
Return the value in internal units.
Handle a list of polygons defining a copper zone.
bool UnFill()
Removes the zone filling.
bool HitTestCutout(const VECTOR2I &aRefPos, int *aOutlineIdx=nullptr, int *aHoleIdx=nullptr) const
Test if the given point is contained within a cutout of the zone.
void HatchBorder()
Compute the hatch lines depending on the hatch parameters and stores it in the zone's attribute m_bor...
void RemoveCutout(int aOutlineIdx, int aHoleIdx)
Remove a cutout from the zone.
bool SaveClipboard(const std::string &aTextUTF8)
Store information to the system clipboard.
@ ROTATE_AROUND_USER_ORIGIN
@ ROTATE_AROUND_SEL_CENTER
@ ROTATE_AROUND_AUX_ORIGIN
@ ROTATE_AROUND_ITEM_ANCHOR
static constexpr EDA_ANGLE ANGLE_180
std::vector< EDA_ITEM * > EDA_ITEMS
Define list of drawing items for screens.
#define IS_NEW
New item, just created.
#define STRUCT_DELETED
flag indication structures to be erased
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
void ConnectBoardShapes(std::vector< PCB_SHAPE * > &aShapeList, std::vector< std::unique_ptr< PCB_SHAPE > > &aNewShapes, int aChainingEpsilon)
Connects shapes to each other, making continious contours (adjacent shapes will have a common vertex)...
@ LAYER_DRAWINGSHEET
Sheet frame and title block.
@ LAYER_SCHEMATIC_DRAWINGSHEET
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
#define UNIMPLEMENTED_FOR(type)
constexpr void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
KICOMMON_API wxString MessageTextFromValue(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, double aValue, bool aAddUnitsText=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
A helper to convert the double length aValue to a string in inches, millimeters, or unscaled units.
SGLIB_API S3DMODEL * GetModel(SCENEGRAPH *aNode)
Create an S3DMODEL representation of aNode (raw data, no transforms).
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
void for_all_pairs(_InputIterator __first, _InputIterator __last, _Function __f)
Apply a function to every possible pair of elements of a sequence.
Class to handle a set of BOARD_ITEMs.
std::optional< VECTOR2I > OPT_VECTOR2I
std::function< bool(const SELECTION &)> SELECTION_CONDITION
Functor type that checks a specific condition for selected items.
Parameters that define a simple chamfer operation.
constexpr int mmToIU(double mm) const
const VECTOR2I CalcArcMid(const VECTOR2I &aStart, const VECTOR2I &aEnd, const VECTOR2I &aCenter, bool aMinArcAngle=true)
Return the middle point of an arc, half-way between aStart and aEnd.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
@ 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_GENERATOR_T
class PCB_GENERATOR, generator on a layer
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ 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_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
@ 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_MARKER_T
class PCB_MARKER, a marker used to show something
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
@ PCB_SHAPE_LOCATE_SEGMENT_T
@ PCB_SHAPE_LOCATE_RECT_T
@ PCB_TABLECELL_T
class PCB_TABLECELL, PCB_TEXTBOX for use in tables
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
@ PCB_SHAPE_LOCATE_BEZIER_T
@ PCB_PAD_T
class PAD, a pad in a footprint
@ PCB_SHAPE_LOCATE_POLY_T
@ 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_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
@ 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