63using namespace std::placeholders;
65#include <wx/hyperlink.h>
69#include <dialogs/dialog_tablecell_properties.h>
70#include <dialogs/dialog_table_properties.h>
78 m_selectionTool( nullptr ),
88 m_statusPopup = std::make_unique<STATUS_TEXT_POPUP>( getEditFrame<PCB_BASE_EDIT_FRAME>() );
94 auto menu = std::make_shared<CONDITIONAL_MENU>( aTool );
97 menu->SetTitle(
_(
"Positioning Tools" ) );
99 auto notMovingCondition = [](
const SELECTION& aSelection )
101 return aSelection.Empty() || !aSelection.Front()->IsMoving();
116 auto menu = std::make_shared<CONDITIONAL_MENU>( aTool );
118 menu->SetTitle(
_(
"Shape Modification" ) );
136 auto hasCornerCondition =
144 auto hasMidpointCondition =
187 auto positioningToolsCondition =
191 subMenu->Evaluate( aSel );
192 return subMenu->GetMenuItemCount() > 0;
195 auto shapeModificationCondition =
199 subMenu->Evaluate( aSel );
200 return subMenu->GetMenuItemCount() > 0;
203 auto propertiesCondition =
206 if( aSel.GetSize() == 0 )
220 if( aSel.GetSize() == 1 )
232 auto inFootprintEditor =
256 auto multipleFootprintsCondition =
259 bool foundFirst =
false;
275 auto noActiveToolCondition =
281 auto notMovingCondition =
284 return aSelection.Empty() || !aSelection.Front()->IsMoving();
287 auto noItemsCondition =
288 [ this ](
const SELECTION& aSelections ) ->
bool
305 static std::vector<KICAD_T> unroutableTypes = {
PCB_TRACE_T,
311 static std::vector<KICAD_T> trackTypes = {
PCB_TRACE_T,
320 && notMovingCondition );
323 && notMovingCondition
324 && !inFootprintEditor );
326 && notMovingCondition );
348 && !inFootprintEditor );
361 menu.
AddMenu( shapeModificationSubMenu.get(), shapeModificationCondition, 100 );
362 menu.
AddMenu( positioningToolsSubMenu.get(), positioningToolsCondition, 100 );
392 FOOTPRINT* fp = getEditFrame<PCB_BASE_FRAME>()->GetFootprintFromBoardByReference();
475 std::vector<PCB_TRACK*> tracks;
476 std::vector<PCB_TRACK*> vias;
477 std::vector<FOOTPRINT*> footprints;
484 vias.push_back( track );
486 tracks.push_back( track );
494 if( footprints.size() == (
unsigned) aCollector.GetCount() )
498 else if( tracks.size() || vias.size() )
503 if( aCollector.GetCount() > 1 )
504 sTool->GuessSelectionCandidates( aCollector, aPt );
511 auto connected = []( PCB_TRACK* track, const VECTOR2I& pt )
513 return track->GetStart() == pt || track->GetEnd() == pt;
516 if( tracks.size() == 2 && vias.size() == 0 )
518 if( connected( tracks[0], tracks[1]->GetStart() )
519 || connected( tracks[0], tracks[1]->GetEnd() ) )
521 aCollector.Remove( tracks[1] );
524 else if( tracks.size() == 2 && vias.size() == 1 )
526 if( connected( tracks[0], vias[0]->GetPosition() )
527 && connected( tracks[1], vias[0]->GetPosition() ) )
529 aCollector.Remove( tracks[0] );
530 aCollector.Remove( tracks[1] );
537 if( selection.Empty() )
540 if( selection.Size() == 1 && selection.Front()->Type() ==
PCB_ARC_T )
544 return DragArcTrack( aEvent );
548 invokeInlineRouter( mode );
567 wxString msg = wxString::Format(
_(
"Unable to resize arc tracks of %s or greater." ),
582 bool restore_state =
false;
596 tanStart.
A = *tanIntersect;
598 tanEnd.
A = *tanIntersect;
601 std::set<PCB_TRACK*> addedTracks;
603 auto getUniqueTrackAtAnchorCollinear =
609 int allowedDeviation = theArc->
GetWidth();
611 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
613 for(
int i = 0; i < 3; i++ )
615 itemsOnAnchor = conn->GetConnectedItemsAtAnchor( theArc, aAnchor,
619 allowedDeviation /= 2;
621 if( itemsOnAnchor.size() == 1 )
627 if( itemsOnAnchor.size() == 1 && itemsOnAnchor.front()->Type() ==
PCB_TRACE_T )
629 track =
static_cast<PCB_TRACK*
>( itemsOnAnchor.front() );
635 if( trackSeg.
Angle( aCollinearSeg ) > maxTangentDeviation )
650 addedTracks.insert( track );
656 PCB_TRACK* trackOnStart = getUniqueTrackAtAnchorCollinear( theArc->
GetStart(), tanStart);
657 PCB_TRACK* trackOnEnd = getUniqueTrackAtAnchorCollinear( theArc->
GetEnd(), tanEnd );
662 tanStart.
B = trackOnStart->
GetEnd();
668 tanEnd.
B = trackOnEnd->
GetEnd();
672 if( tanIntersect = tanStart.
IntersectLines( tanEnd ); !tanIntersect )
675 auto isTrackStartClosestToArcStart =
681 return trackStartToArcStart < trackEndToArcStart;
684 bool isStartTrackOnStartPt = isTrackStartClosestToArcStart( trackOnStart );
685 bool isEndTrackOnStartPt = isTrackStartClosestToArcStart( trackOnEnd );
714 auto getFurthestPointToTanInterstect =
717 if( ( aPointA - *tanIntersect ).EuclideanNorm()
729 VECTOR2I tanStartPoint = getFurthestPointToTanInterstect( tanStart.
A, tanStart.
B );
730 VECTOR2I tanEndPoint = getFurthestPointToTanInterstect( tanEnd.
A, tanEnd.
B );
731 VECTOR2I tempTangentPoint = tanEndPoint;
733 if( getFurthestPointToTanInterstect( tanStartPoint, tanEndPoint ) == tanEndPoint )
734 tempTangentPoint = tanStartPoint;
740 SEG cSegTanStart( maxTanPtStart, *tanIntersect );
741 SEG cSegTanEnd( maxTanPtEnd, *tanIntersect );
742 SEG cSegChord( maxTanPtStart, maxTanPtEnd );
744 int cSegTanStartSide = cSegTanStart.
Side( theArc->
GetMid() );
745 int cSegTanEndSide = cSegTanEnd.
Side( theArc->
GetMid() );
746 int cSegChordSide = cSegChord.
Side( theArc->
GetMid() );
748 bool eatFirstMouseUp =
true;
760 std::vector<VECTOR2I> possiblePoints;
767 for(
const VECTOR2I& candidate : possiblePoints )
769 if( ( candidate -
m_cursor ).SquaredEuclideanNorm()
770 < ( closest -
m_cursor ).SquaredEuclideanNorm() )
799 if( isStartTrackOnStartPt )
802 trackOnStart->
SetEnd( newStart );
804 if( isEndTrackOnStartPt )
807 trackOnEnd->
SetEnd( newEnd );
815 if( evt->IsMotion() || evt->IsDrag(
BUT_LEFT ) )
817 eatFirstMouseUp =
false;
819 else if( evt->IsCancelInteractive() || evt->IsActivate() )
821 restore_state =
true;
826 restore_state =
true;
835 eatFirstMouseUp =
false;
847 if( isStartTrackOnStartPt )
848 newStart = trackOnStart->
GetEnd();
850 if( isEndTrackOnStartPt )
851 newEnd = trackOnEnd->
GetEnd();
856 if( trackOnStart->
GetLength() <= maxLengthIU )
858 if( addedTracks.count( trackOnStart ) )
861 addedTracks.erase( trackOnStart );
866 commit.
Remove( trackOnStart );
872 if( trackOnEnd->
GetLength() <= maxLengthIU )
874 if( addedTracks.count( trackOnEnd ) )
877 addedTracks.erase( trackOnEnd );
882 commit.
Remove( trackOnEnd );
901 commit.
Push(
_(
"Drag Arc Track" ) );
913 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
915 BOARD_ITEM* item = aCollector[ i ];
917 if( !dynamic_cast<PCB_TRACK*>( item ) )
918 aCollector.Remove( item );
936 if(
via->GetViaType() == VIATYPE::MICROVIA )
949 via->SetDrill( new_drill );
950 via->SetWidth( new_width );
965 commit.
Push(
_(
"Edit Track Width/Via Size" ) );
982 static int filletRadius = 0;
988 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
990 BOARD_ITEM* item = aCollector[i];
992 if( !dynamic_cast<PCB_TRACK*>( item ) )
993 aCollector.Remove( item );
998 if( selection.
Size() < 2 )
1007 if( dlg.ShowModal() == wxID_CANCEL )
1012 if( filletRadius == 0 )
1015 "The fillet operation was not performed." ) );
1024 bool t1Start =
true;
1025 bool t2Start =
true;
1028 std::vector<FILLET_OP> filletOperations;
1029 bool operationPerformedOnAtLeastOne =
false;
1030 bool didOneAttemptFail =
false;
1031 std::set<PCB_TRACK*> processedTracks;
1033 auto processFilletOp =
1034 [&](
PCB_TRACK* aTrack,
bool aStartPoint )
1038 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
1040 itemsOnAnchor = c->GetConnectedItemsAtAnchor( aTrack,
anchor,
1044 if( itemsOnAnchor.size() > 0
1045 && selection.
Contains( itemsOnAnchor.at( 0 ) )
1051 if( processedTracks.find( trackOther ) == processedTracks.end() )
1053 if( itemsOnAnchor.size() == 1 )
1056 filletOp.t1 = aTrack;
1057 filletOp.t2 = trackOther;
1058 filletOp.t1Start = aStartPoint;
1059 filletOp.t2Start = aTrack->
IsPointOnEnds( filletOp.t2->GetStart() );
1060 filletOperations.push_back( filletOp );
1066 didOneAttemptFail =
true;
1080 processFilletOp( track,
true );
1081 processFilletOp( track,
false );
1083 processedTracks.insert( track );
1089 std::vector<BOARD_ITEM*> itemsToAddToSelection;
1091 for( FILLET_OP filletOp : filletOperations )
1099 if( trackOnStart && trackOnEnd )
1102 if( ( trackOnStart || trackOnEnd ) && track1->
GetLayer() == track2->
GetLayer() )
1110 SHAPE_ARC sArc( t1Seg, t2Seg, filletRadius );
1113 auto setIfPointOnSeg =
1116 VECTOR2I segToVec = aSegment.NearestPoint( aVecToTest ) - aVecToTest;
1121 aPointToSet.
x = aVecToTest.x;
1122 aPointToSet.
y = aVecToTest.y;
1130 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP0() )
1131 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP0() ) )
1133 didOneAttemptFail =
true;
1137 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP1() )
1138 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP1() ) )
1140 didOneAttemptFail =
true;
1150 itemsToAddToSelection.push_back( tArc );
1155 if( filletOp.t1Start )
1158 track1->
SetEnd( t1newPoint );
1160 if( filletOp.t2Start )
1163 track2->
SetEnd( t2newPoint );
1165 operationPerformedOnAtLeastOne =
true;
1169 commit.
Push(
_(
"Fillet Tracks" ) );
1172 for(
BOARD_ITEM* item : itemsToAddToSelection )
1175 if( !operationPerformedOnAtLeastOne )
1177 else if( didOneAttemptFail )
1194 static int filletRadius = 0;
1199 if( dlg.ShowModal() == wxID_CANCEL )
1200 return std::nullopt;
1204 if( filletRadius == 0 )
1206 aErrorMsg =
_(
"A radius of zero was entered.\n"
1207 "The fillet operation was not performed." );
1208 return std::nullopt;
1211 return filletRadius;
1223 wxString& aErrorMsg )
1228 static CHAMFER_PARAMS params{ default_setback, default_setback };
1231 params.m_chamfer_setback_a );
1233 if( dlg.ShowModal() == wxID_CANCEL )
1234 return std::nullopt;
1236 params.m_chamfer_setback_a = dlg.
GetValue();
1239 params.m_chamfer_setback_b = params.m_chamfer_setback_a;
1242 if( params.m_chamfer_setback_a == 0 )
1244 aErrorMsg =
_(
"A setback of zero was entered.\n"
1245 "The chamfer operation was not performed." );
1246 return std::nullopt;
1257 std::vector<VECTOR2I> pts;
1260 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1262 BOARD_ITEM* item = aCollector[i];
1266 if( !item->IsType( { PCB_SHAPE_LOCATE_SEGMENT_T,
1267 PCB_SHAPE_LOCATE_POLY_T,
1268 PCB_SHAPE_LOCATE_RECT_T } ) )
1270 aCollector.
Remove( item );
1276 std::set<PCB_SHAPE*> lines_to_add;
1277 std::vector<PCB_SHAPE*> items_to_remove;
1281 std::vector<VECTOR2I> pts;
1288 items_to_remove.push_back( graphic );
1291 pts.emplace_back( start );
1292 pts.emplace_back(
VECTOR2I( end.x, start.y ) );
1293 pts.emplace_back( end );
1294 pts.emplace_back(
VECTOR2I( start.x, end.y ) );
1299 items_to_remove.push_back( graphic );
1301 for(
int jj = 0; jj < graphic->
GetPolyShape().VertexCount(); ++jj )
1305 for(
size_t jj = 1; jj < pts.size(); ++jj )
1313 lines_to_add.insert( line );
1316 if( pts.size() > 1 )
1321 line->
SetEnd( pts.front() );
1324 lines_to_add.insert( line );
1329 selection.Add( item );
1331 for(
PCB_SHAPE* item : items_to_remove )
1332 selection.Remove( item );
1336 frame()->ShowInfoBarMsg(
_(
"A shape with least two lines must be selected." ) );
1344 std::vector<PCB_SHAPE*> items_to_select_on_success;
1347 std::vector<PCB_SHAPE*> items_to_deselect_on_success;
1352 const auto item_modification_handler = [&](
PCB_SHAPE& aItem )
1358 items_to_select_on_success.push_back( &aItem );
1362 bool any_items_created = !lines_to_add.empty();
1363 const auto item_creation_handler = [&]( std::unique_ptr<PCB_SHAPE> aItem )
1365 any_items_created =
true;
1366 items_to_select_on_success.push_back( aItem.get() );
1367 commit.
Add( aItem.release() );
1370 bool any_items_removed = !items_to_remove.empty();
1371 const auto item_removal_handler = [&](
PCB_SHAPE& aItem )
1373 any_items_removed =
true;
1374 items_to_deselect_on_success.push_back( &aItem );
1380 item_creation_handler, item_modification_handler, item_removal_handler );
1383 std::unique_ptr<PAIRWISE_LINE_ROUTINE> pairwise_line_routine;
1384 wxString error_message;
1388 const std::optional<int> filletRadiusIU =
GetFilletParams( *frame(), error_message );
1390 if( filletRadiusIU.has_value() )
1392 pairwise_line_routine = std::make_unique<LINE_FILLET_ROUTINE>(
1393 frame()->
GetModel(), change_handler, *filletRadiusIU );
1398 const std::optional<CHAMFER_PARAMS> chamfer_params =
1401 if( chamfer_params.has_value() )
1403 pairwise_line_routine = std::make_unique<LINE_CHAMFER_ROUTINE>(
1404 frame()->
GetModel(), change_handler, *chamfer_params );
1411 error_message =
_(
"Exactly two lines must be selected to extend them." );
1415 pairwise_line_routine =
1416 std::make_unique<LINE_EXTENSION_ROUTINE>( frame()->
GetModel(), change_handler );
1420 if( !pairwise_line_routine )
1423 if( !error_message.empty() )
1424 frame()->ShowInfoBarMsg( error_message );
1433 PCB_SHAPE* line_a = static_cast<PCB_SHAPE*>( a );
1434 PCB_SHAPE* line_b = static_cast<PCB_SHAPE*>( b );
1436 pairwise_line_routine->ProcessLinePair( *line_a, *line_b );
1444 m_selectionTool->AddItemToSel( item,
true );
1449 for(
PCB_SHAPE* item : items_to_remove )
1451 commit.Remove( item );
1452 m_selectionTool->RemoveItemFromSel( item,
true );
1456 for(
PCB_SHAPE* item : items_to_select_on_success )
1457 m_selectionTool->AddItemToSel( item,
true );
1460 for(
PCB_SHAPE* item : items_to_deselect_on_success )
1461 m_selectionTool->RemoveItemFromSel( item,
true );
1463 if( any_items_removed )
1466 if( any_items_created )
1472 commit.Push( pairwise_line_routine->GetCommitDescription() );
1474 if (
const std::optional<wxString> msg = pairwise_line_routine->GetStatusMessage()) {
1475 frame()->ShowInfoBarMsg( *msg );
1487 std::vector<VECTOR2I> pts;
1490 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1492 BOARD_ITEM* item = aCollector[i];
1494 if( !item->IsType( { PCB_SHAPE_LOCATE_POLY_T, PCB_ZONE_T } ) )
1495 aCollector.
Remove( item );
1497 if(
ZONE* zone = dyn_cast<ZONE*>( item ) )
1499 if( zone->IsTeardropArea() )
1500 aCollector.
Remove( item );
1512 if( dlg.ShowModal() == wxID_CANCEL )
1515 s_toleranceValue = dlg.GetValue();
1517 if( s_toleranceValue <= 0 )
1522 std::vector<PCB_SHAPE*> shapeList;
1528 if(
PCB_SHAPE* shape = dyn_cast<PCB_SHAPE*>( item ) )
1535 if(
ZONE* zone = dyn_cast<ZONE*>( item ) )
1543 commit.Push(
_(
"Simplify Polygons" ) );
1557 std::vector<VECTOR2I> pts;
1560 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1562 BOARD_ITEM* item = aCollector[i];
1566 if( !item->IsType( { PCB_SHAPE_LOCATE_SEGMENT_T, PCB_SHAPE_LOCATE_ARC_T,
1567 PCB_SHAPE_LOCATE_BEZIER_T } ) )
1569 aCollector.
Remove( item );
1581 if( dlg.ShowModal() == wxID_CANCEL )
1584 s_toleranceValue = dlg.GetValue();
1586 if( s_toleranceValue <= 0 )
1591 std::vector<PCB_SHAPE*> shapeList;
1592 std::vector<std::unique_ptr<PCB_SHAPE>> newShapes;
1598 shapeList.push_back( shape );
1605 std::vector<PCB_SHAPE*> items_to_select;
1607 for( std::unique_ptr<PCB_SHAPE>& ptr : newShapes )
1611 commit.Add( shape );
1612 items_to_select.push_back( shape );
1615 commit.Push(
_(
"Heal Shapes" ) );
1618 for(
PCB_SHAPE* item : items_to_select )
1619 m_selectionTool->AddItemToSel( item,
true );
1621 if( items_to_select.size() > 0 )
1637 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1639 BOARD_ITEM* item = aCollector[i];
1641 if( !item->IsType( {
1642 PCB_SHAPE_LOCATE_POLY_T,
1643 PCB_SHAPE_LOCATE_RECT_T,
1646 aCollector.
Remove( item );
1652 const EDA_ITEM*
const last_item = selection.GetLastAddedItem();
1655 std::vector<PCB_SHAPE*> items_to_process;
1658 items_to_process.push_back(
static_cast<PCB_SHAPE*
>( item ) );
1663 if( item == last_item )
1665 std::swap( items_to_process.back(), items_to_process.front() );
1672 const auto item_modification_handler = [&](
PCB_SHAPE& aItem )
1677 std::vector<PCB_SHAPE*> items_to_select_on_success;
1678 const auto item_creation_handler = [&]( std::unique_ptr<PCB_SHAPE> aItem )
1680 items_to_select_on_success.push_back( aItem.get() );
1681 commit.
Add( aItem.release() );
1684 const auto item_removal_handler = [&](
PCB_SHAPE& aItem )
1691 item_creation_handler, item_modification_handler, item_removal_handler );
1694 std::unique_ptr<POLYGON_BOOLEAN_ROUTINE> boolean_routine;
1698 std::make_unique<POLYGON_MERGE_ROUTINE>( frame()->
GetModel(), change_handler );
1703 std::make_unique<POLYGON_SUBTRACT_ROUTINE>( frame()->
GetModel(), change_handler );
1708 std::make_unique<POLYGON_INTERSECT_ROUTINE>( frame()->
GetModel(), change_handler );
1712 wxASSERT_MSG(
false,
"Could not find a polygon routine for this action" );
1717 for(
PCB_SHAPE* shape : items_to_process )
1719 boolean_routine->ProcessShape( *shape );
1723 for(
PCB_SHAPE* item : items_to_select_on_success )
1725 m_selectionTool->AddItemToSel( item,
true );
1731 commit.Push( boolean_routine->GetCommitDescription() );
1733 if(
const std::optional<wxString> msg = boolean_routine->GetStatusMessage() )
1735 frame()->ShowInfoBarMsg( *msg );
1758 std::vector<PCB_TABLECELL*> cells;
1775 else if( selection.
Size() == 1 )
1809 for(
EDA_ITEM* eda_item : selCopy )
1813 if( !( item->GetLayerSet() & visible ).any() )
1836 commit = &localCommit;
1851 if( selection.
Empty() )
1854 std::optional<VECTOR2I> oldRefPt;
1855 bool is_hover = selection.
IsHover();
1877 if( selection.
Empty() )
1894 if(
frame()->GetCanvas()->GetView()->GetGAL()->IsFlippedX() )
1895 rotateAngle = -rotateAngle;
1901 viewBBox.
Merge( item->ViewBBox() );
1910 typedef std::numeric_limits<int> coord_limits;
1915 bool outOfBounds = rotPos.
x < min || rotPos.
x > max || rotPos.
y < min || rotPos.
y > max
1916 || rotEnd.
x < min || rotEnd.
x > max || rotEnd.
y < min || rotEnd.
y > max;
1922 if( !item->IsNew() && !item->IsMoving() )
1927 board_item->Rotate( refPt, rotateAngle );
1928 board_item->Normalize();
1932 if( !localCommit.
Empty() )
1933 localCommit.
Push(
_(
"Rotate" ) );
1962 mirrored.
x -= aMirrorPoint.
x;
1963 mirrored.
x = -mirrored.
x;
1964 mirrored.
x += aMirrorPoint.
x;
1977 mirrored.
y -= aMirrorPoint.
y;
1978 mirrored.
y = -mirrored.
y;
1979 mirrored.
y += aMirrorPoint.
y;
2055 commit = &localCommit;
2066 if( selection.
Empty() )
2075 bool mirrorLeftRight =
true;
2076 bool mirrorAroundXaxis =
false;
2080 mirrorLeftRight =
false;
2081 mirrorAroundXaxis =
true;
2084 std::vector<EDA_ITEM*> items;
2090 static_cast<PCB_GROUP*
>( item )->RunOnDescendants(
2093 items.push_back( descendant );
2098 items.push_back( item );
2107 if( !item->IsNew() && !item->IsMoving() )
2111 switch( item->Type() )
2114 static_cast<PCB_SHAPE*
>( item )->
Mirror( mirrorPoint, mirrorAroundXaxis );
2118 static_cast<ZONE*
>( item )->
Mirror( mirrorPoint, mirrorLeftRight );
2123 static_cast<PCB_TEXT*
>( item )->
Mirror( mirrorPoint, mirrorAroundXaxis );
2135 if( mirrorLeftRight )
2145 static_cast<PCB_TRACK*
>( item )->
Mirror( mirrorPoint, mirrorAroundXaxis );
2154 if( !localCommit.
Empty() )
2155 localCommit.
Push(
_(
"Mirror" ) );
2181 commit = &localCommit;
2190 if( selection.
Empty() )
2208 if( !item->IsNew() && !item->IsMoving() )
2211 setJustify(
static_cast<PCB_TEXT*
>( item ) );
2215 if( !item->IsNew() && !item->IsMoving() )
2222 if( !localCommit.
Empty() )
2225 localCommit.
Push(
_(
"Left Justify" ) );
2227 localCommit.
Push(
_(
"Center Justify" ) );
2229 localCommit.
Push(
_(
"Right Justify" ) );
2256 commit = &localCommit;
2268 if( selection.
Empty() )
2271 std::optional<VECTOR2I> oldRefPt;
2283 if( selection.
GetSize() == 1 )
2292 if( !boardItem->IsNew() && !boardItem->IsMoving() )
2293 commit->
Modify( boardItem );
2295 boardItem->Flip( refPt, leftRight );
2296 boardItem->Normalize();
2300 if( !localCommit.
Empty() )
2301 localCommit.
Push(
_(
"Change Side / Flip" ) );
2323 std::unordered_set<BOARD_ITEM*>& children )
2327 std::unordered_set<BOARD_ITEM*>& childItems =
static_cast<PCB_GROUP*
>( item )->GetItems();
2331 children.insert( childItem );
2341 auto itr = items.begin();
2343 while( itr != items.end() )
2351 std::unordered_set<BOARD_ITEM*> childItems;
2354 std::for_each( childItems.begin(), childItems.end(),
2355 [&](
auto eraseItem )
2357 items.erase( eraseItem );
2377 std::unordered_set<EDA_ITEM*> rootItems( aItems.
begin(), aItems.
end() );
2380 int itemsDeleted = 0;
2381 int fieldsHidden = 0;
2382 int fieldsAlreadyHidden = 0;
2387 wxCHECK2( board_item,
continue );
2394 switch( item->Type() )
2400 wxASSERT( parentFP );
2401 commit.
Modify( parentFP );
2410 fieldsAlreadyHidden++;
2428 commit.
Remove( board_item );
2434 commit.
Modify( board_item );
2435 static_cast<PCB_TABLECELL*
>( board_item )->SetText( wxEmptyString );
2452 commit.
Remove( board_item );
2459 commit.
Modify( parentFP );
2461 parentFP->
Remove( board_item );
2471 if( !aIsCut && aItems.
GetSize() == 1 )
2474 ZONE* zone =
static_cast<ZONE*
>( board_item );
2476 int outlineIdx, holeIdx;
2499 commit.
Remove( board_item );
2504 if( rootItems.size() == 1 )
2521 commit.
Remove( board_item );
2528 wxASSERT_MSG( parentFP ==
nullptr, wxT(
"Try to delete an item living in a footprint" ) );
2529 commit.
Remove( board_item );
2538 if( enteredGroup && enteredGroup->
GetItems().empty() )
2543 commit.
Push(
_(
"Cut" ) );
2545 else if( itemsDeleted == 0 )
2547 if( fieldsHidden == 1 )
2548 commit.
Push(
_(
"Hide Field" ) );
2549 else if( fieldsHidden > 1 )
2550 commit.
Push(
_(
"Hide Fields" ) );
2551 else if( fieldsAlreadyHidden > 0 )
2552 editFrame->
ShowInfoBarError(
_(
"Use the Footprint Properties dialog to remove fields." ) );
2556 commit.
Push(
_(
"Delete" ) );
2567 std::vector<BOARD_ITEM*> lockedItems;
2651 if( selection.
Empty() )
2663 int ret = dialog.ShowModal();
2665 if( ret == wxID_OK )
2673 selCenter += translation;
2675 if( !
frame()->GetPcbNewSettings()->m_Display.m_DisplayInvertYAxis )
2676 rotation = -rotation;
2682 wxCHECK2( boardItem,
continue );
2684 if( !boardItem->
IsNew() )
2685 commit.
Modify( boardItem );
2688 boardItem->
Move( translation );
2690 switch( rotationAnchor )
2696 boardItem->
Rotate( selCenter, angle );
2699 boardItem->
Rotate(
frame()->GetScreen()->m_LocalOrigin, angle );
2702 boardItem->
Rotate(
board()->GetDesignSettings().GetAuxOrigin(), angle );
2710 commit.
Push(
_(
"Move Exactly" ) );
2712 if( selection.IsHover() )
2745 if( selection.
Empty() )
2757 bool is_hover = selection.
IsHover();
2759 std::vector<BOARD_ITEM*> new_items;
2760 new_items.reserve( selection.
Size() );
2769 wxCHECK2( orig_item,
continue );
2792 static_cast<PAD*
>( dupe_item )->SetNumber( padNumber );
2796 new_items.push_back( dupe_item );
2797 commit.
Add( dupe_item );
2806 switch( orig_item->
Type() )
2829 new_items.push_back( dupe_item );
2830 commit.
Add( dupe_item );
2839 dupe_item =
static_cast<PCB_GROUP*
>( orig_item )->DeepDuplicate();
2845 new_items.push_back( aItem );
2846 commit.
Add( aItem );
2850 new_items.push_back( dupe_item );
2851 commit.
Add( dupe_item );
2855 wxASSERT_MSG(
false, wxString::Format( wxT(
"Unhandled item type %d" ),
2856 orig_item->
Type() ) );
2866 EDA_ITEMS nItems( new_items.begin(), new_items.end() );
2870 if( !selection.
Empty() )
2872 editFrame->
DisplayToolMsg( wxString::Format(
_(
"Duplicated %d item(s)" ),
2873 (
int) new_items.size() ) );
2877 commit.
Push(
_(
"Duplicate" ) );
2906 if( selection.
Empty() )
2921 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
2923 if( aCollector[i]->Type() !=
PCB_PAD_T )
2932 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
2943 if( aSelection.
Empty() )
2964 BOX2I nonFieldsBBox;
2968 if( !item->IsType( { PCB_TEXT_T, PCB_FIELD_T } ) )
2969 nonFieldsBBox.
Merge( item->GetBoundingBox() );
2984 const wxString& aCanceledMessage,
VECTOR2I& aReferencePoint )
2987 std::optional<VECTOR2I> pickedPoint;
2996 [&](
const VECTOR2D& aPoint ) ->
bool
2998 pickedPoint = aPoint;
3000 if( !aSuccessMessage.empty() )
3022 if( !aCanceledMessage.empty() )
3034 [&](
const int& aFinalState )
3049 evt->SetPassEvent();
3059 aReferencePoint = *pickedPoint;
3061 return pickedPoint.has_value();
3069 getEditFrame<PCB_BASE_EDIT_FRAME>()->GetMagneticItemsSettings() );
3071 "pcbnew.InteractiveEdit.selectReferencePoint",
3072 TOOL_ACTION_SCOPE::AS_GLOBAL );
3080 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
3082 BOARD_ITEM* item = aCollector[i];
3086 if( ( item->Type() == PCB_FIELD_T || item->Type() == PCB_TEXT_T )
3087 && aCollector.HasItem( item->GetParentFootprint() ) )
3089 aCollector.Remove( item );
3094 aCollector.Remove( item );
3100 aEvent.IsAction( &
ACTIONS::cut ) && !m_isFootprintEditor );
3102 if( !selection.Empty() )
3104 std::vector<BOARD_ITEM*> items;
3109 items.push_back( boardItem );
3116 if( !pickReferencePoint(
_(
"Select reference point for the copy..." ),
3117 _(
"Selection copied" ),
3118 _(
"Copy canceled" ),
3121 frame()->PopTool( selectReferencePoint );
3127 refPoint =
grid.BestDragOrigin( getViewControls()->GetCursorPosition(), items );
3130 selection.SetReferencePoint( refPoint );
3132 io.SetBoard( board() );
3133 io.SaveSelection( selection, m_isFootprintEditor );
3134 frame()->SetStatusText(
_(
"Selection copied" ) );
3137 frame()->PopTool( selectReferencePoint );
3139 if( selection.IsHover() )
3140 m_selectionTool->ClearSelection();
constexpr EDA_IU_SCALE pcbIUScale
static TOOL_ACTION pickerSubTool
static TOOL_ACTION unselectAll
static TOOL_ACTION pasteSpecial
static TOOL_ACTION rightJustify
static TOOL_ACTION pageSettings
static TOOL_ACTION duplicate
static TOOL_ACTION doDelete
static TOOL_ACTION cursorClick
static TOOL_ACTION leftJustify
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
Revert the commit by restoring the modified items state.
COMMIT & Stage(EDA_ITEM *aItem, CHANGE_TYPE aChangeType, BASE_SCREEN *aScreen=nullptr) override
virtual void Revert() override
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
int GetCurrentTrackWidth() const
int GetCurrentViaDrill() const
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 bool IsLocked() const
BOARD_ITEM_CONTAINER * GetParent() const
virtual void RunOnDescendants(const std::function< void(BOARD_ITEM *)> &aFunction, int aDepth=0) const
Invoke a function on all descendants.
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.
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
const Vec & GetPosition() const
const Vec GetCenter() const
BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
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)
Notify observers that aItem has been removed.
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Create an undo entry for an item that has been already modified.
bool Empty() const
Returns status of an item.
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Notify observers that aItem has been added.
@ TABLECELL_PROPS_EDIT_TABLE
enum TABLECELL_PROPS_RETVALUE GetReturnValue()
bool HitTestDrawingSheetItems(KIGFX::VIEW *aView, const VECTOR2I &aPosition)
void ShowInfoBarMsg(const wxString &aMsg, bool aShowCloseButton=false)
Show the WX_INFOBAR displayed on the top of the canvas with a message and an info icon on the left of...
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.
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.
A collection of nets and the parameters used to route or test these nets.
int GetuViaDiameter() const
bool CanHaveNumber() const
Indicates whether or not the pad can have a number.
void FlipPrimitives(bool aFlipLeftRight)
Flip (mirror) the primitives left to right or top to bottom, around the anchor position in custom pad...
VECTOR2I GetPosition() const override
void SetOffset(const VECTOR2I &aOffset)
const VECTOR2I & GetOffset() const
void SetDelta(const VECTOR2I &aSize)
void SetPosition(const VECTOR2I &aPos) override
const VECTOR2I & GetDelta() const
PAD_SHAPE GetShape() 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 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 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 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 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
Activation of the position relative tool.
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 createArray
Tool for creating an array of objects.
static TOOL_ACTION extendLines
Extend selected lines to meet at a point.
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.
PCBNEW_SETTINGS * GetPcbNewSettings() const
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.
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(bool aOnlyVisible=false) 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.
void SetWidth(int aWidth)
virtual double GetLength() const
Get the length of the track using the hypotenuse calculation.
void SetEnd(const VECTOR2I &aEnd)
void SetStart(const VECTOR2I &aStart)
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...
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.
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.
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
An extension of WX_TEXT_ENTRY_DIALOG that uses UNIT_BINDER to request a dimension (e....
int GetValue()
Returns 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.
@ 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.
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
drawingsheet frame and titleblock
@ 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)
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)
Function GetModel creates 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
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.
double GetLineLength(const VECTOR2I &aPointA, const VECTOR2I &aPointB)
Return the length of a line segment defined by aPointA and aPointB.
double EuclideanNorm(const VECTOR2I &vector)
@ 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
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".