63using namespace std::placeholders;
65#include <wx/hyperlink.h>
69#include <dialogs/dialog_tablecell_properties.h>
70#include <dialogs/dialog_table_properties.h>
106 m_selectionTool( nullptr ),
116 m_statusPopup = std::make_unique<STATUS_TEXT_POPUP>( getEditFrame<PCB_BASE_EDIT_FRAME>() );
122 auto menu = std::make_shared<CONDITIONAL_MENU>( aTool );
125 menu->SetTitle(
_(
"Positioning Tools" ) );
127 auto notMovingCondition = [](
const SELECTION& aSelection )
129 return aSelection.Empty() || !aSelection.Front()->IsMoving();
144 auto menu = std::make_shared<CONDITIONAL_MENU>( aTool );
146 menu->SetTitle(
_(
"Shape Modification" ) );
164 auto hasCornerCondition =
172 auto hasMidpointCondition =
215 auto positioningToolsCondition =
219 subMenu->Evaluate( aSel );
220 return subMenu->GetMenuItemCount() > 0;
223 auto shapeModificationCondition =
227 subMenu->Evaluate( aSel );
228 return subMenu->GetMenuItemCount() > 0;
231 auto propertiesCondition =
234 if( aSel.GetSize() == 0 )
248 if( aSel.GetSize() == 1 )
260 auto inFootprintEditor =
284 auto multipleFootprintsCondition =
287 bool foundFirst =
false;
303 auto noActiveToolCondition =
309 auto notMovingCondition =
312 return aSelection.Empty() || !aSelection.Front()->IsMoving();
315 auto noItemsCondition =
316 [ this ](
const SELECTION& aSelections ) ->
bool
332 && notMovingCondition );
335 && notMovingCondition
336 && !inFootprintEditor );
338 && notMovingCondition );
360 && !inFootprintEditor );
373 menu.
AddMenu( shapeModificationSubMenu.get(), shapeModificationCondition, 100 );
374 menu.
AddMenu( positioningToolsSubMenu.get(), positioningToolsCondition, 100 );
404 FOOTPRINT* fp = getEditFrame<PCB_BASE_FRAME>()->GetFootprintFromBoardByReference();
487 std::vector<PCB_TRACK*> tracks;
488 std::vector<PCB_TRACK*> vias;
489 std::vector<FOOTPRINT*> footprints;
496 vias.push_back( track );
498 tracks.push_back( track );
506 if( footprints.size() == (
unsigned) aCollector.GetCount() )
510 else if( tracks.size() || vias.size() )
515 if( aCollector.GetCount() > 1 )
516 sTool->GuessSelectionCandidates( aCollector, aPt );
523 auto connected = []( PCB_TRACK* track, const VECTOR2I& pt )
525 return track->GetStart() == pt || track->GetEnd() == pt;
528 if( tracks.size() == 2 && vias.size() == 0 )
530 if( connected( tracks[0], tracks[1]->GetStart() )
531 || connected( tracks[0], tracks[1]->GetEnd() ) )
533 aCollector.Remove( tracks[1] );
536 else if( tracks.size() == 2 && vias.size() == 1 )
538 if( connected( tracks[0], vias[0]->GetPosition() )
539 && connected( tracks[1], vias[0]->GetPosition() ) )
541 aCollector.Remove( tracks[0] );
542 aCollector.Remove( tracks[1] );
549 if( selection.Empty() )
552 if( selection.Size() == 1 && selection.Front()->Type() ==
PCB_ARC_T )
556 return DragArcTrack( aEvent );
560 invokeInlineRouter( mode );
579 wxString msg = wxString::Format(
_(
"Unable to resize arc tracks of %s or greater." ),
594 bool restore_state =
false;
608 tanStart.
A = *tanIntersect;
610 tanEnd.
A = *tanIntersect;
613 std::set<PCB_TRACK*> addedTracks;
615 auto getUniqueTrackAtAnchorCollinear =
621 int allowedDeviation = theArc->
GetWidth();
623 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
625 for(
int i = 0; i < 3; i++ )
627 itemsOnAnchor = conn->GetConnectedItemsAtAnchor( theArc, aAnchor,
630 allowedDeviation /= 2;
632 if( itemsOnAnchor.size() == 1 )
638 if( itemsOnAnchor.size() == 1 && itemsOnAnchor.front()->Type() ==
PCB_TRACE_T )
640 track =
static_cast<PCB_TRACK*
>( itemsOnAnchor.front() );
646 if( trackSeg.
Angle( aCollinearSeg ) > maxTangentDeviation )
661 addedTracks.insert( track );
667 PCB_TRACK* trackOnStart = getUniqueTrackAtAnchorCollinear( theArc->
GetStart(), tanStart);
668 PCB_TRACK* trackOnEnd = getUniqueTrackAtAnchorCollinear( theArc->
GetEnd(), tanEnd );
673 tanStart.
B = trackOnStart->
GetEnd();
679 tanEnd.
B = trackOnEnd->
GetEnd();
683 if( tanIntersect = tanStart.
IntersectLines( tanEnd ); !tanIntersect )
686 auto isTrackStartClosestToArcStart =
689 double trackStartToArcStart = aTrack->GetStart().
Distance( theArc->
GetStart() );
690 double trackEndToArcStart = aTrack->GetEnd().Distance( theArc->
GetStart() );
692 return trackStartToArcStart < trackEndToArcStart;
695 bool isStartTrackOnStartPt = isTrackStartClosestToArcStart( trackOnStart );
696 bool isEndTrackOnStartPt = isTrackStartClosestToArcStart( trackOnEnd );
725 auto getFurthestPointToTanInterstect =
728 if( ( aPointA - *tanIntersect ).EuclideanNorm()
729 > ( aPointB - *tanIntersect ).EuclideanNorm() )
740 VECTOR2I tanStartPoint = getFurthestPointToTanInterstect( tanStart.
A, tanStart.
B );
741 VECTOR2I tanEndPoint = getFurthestPointToTanInterstect( tanEnd.
A, tanEnd.
B );
742 VECTOR2I tempTangentPoint = tanEndPoint;
744 if( getFurthestPointToTanInterstect( tanStartPoint, tanEndPoint ) == tanEndPoint )
745 tempTangentPoint = tanStartPoint;
751 SEG cSegTanStart( maxTanPtStart, *tanIntersect );
752 SEG cSegTanEnd( maxTanPtEnd, *tanIntersect );
753 SEG cSegChord( maxTanPtStart, maxTanPtEnd );
755 int cSegTanStartSide = cSegTanStart.
Side( theArc->
GetMid() );
756 int cSegTanEndSide = cSegTanEnd.
Side( theArc->
GetMid() );
757 int cSegChordSide = cSegChord.
Side( theArc->
GetMid() );
759 bool eatFirstMouseUp =
true;
771 std::vector<VECTOR2I> possiblePoints;
778 for(
const VECTOR2I& candidate : possiblePoints )
780 if( ( candidate -
m_cursor ).SquaredEuclideanNorm()
781 < ( closest -
m_cursor ).SquaredEuclideanNorm() )
810 if( isStartTrackOnStartPt )
813 trackOnStart->
SetEnd( newStart );
815 if( isEndTrackOnStartPt )
818 trackOnEnd->
SetEnd( newEnd );
826 if( evt->IsMotion() || evt->IsDrag(
BUT_LEFT ) )
828 eatFirstMouseUp =
false;
830 else if( evt->IsCancelInteractive() || evt->IsActivate() )
832 restore_state =
true;
837 restore_state =
true;
846 eatFirstMouseUp =
false;
858 if( isStartTrackOnStartPt )
859 newStart = trackOnStart->
GetEnd();
861 if( isEndTrackOnStartPt )
862 newEnd = trackOnEnd->
GetEnd();
867 if( trackOnStart->
GetLength() <= maxLengthIU )
869 if( addedTracks.count( trackOnStart ) )
872 addedTracks.erase( trackOnStart );
877 commit.
Remove( trackOnStart );
883 if( trackOnEnd->
GetLength() <= maxLengthIU )
885 if( addedTracks.count( trackOnEnd ) )
888 addedTracks.erase( trackOnEnd );
893 commit.
Remove( trackOnEnd );
912 commit.
Push(
_(
"Drag Arc Track" ) );
924 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
926 BOARD_ITEM* item = aCollector[ i ];
928 if( !dynamic_cast<PCB_TRACK*>( item ) )
929 aCollector.Remove( item );
947 if(
via->GetViaType() == VIATYPE::MICROVIA )
960 via->SetDrill( new_drill );
961 via->SetWidth( new_width );
976 commit.
Push(
_(
"Edit Track Width/Via Size" ) );
993 static int filletRadius = 0;
999 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1001 BOARD_ITEM* item = aCollector[i];
1003 if( !dynamic_cast<PCB_TRACK*>( item ) )
1004 aCollector.Remove( item );
1009 if( selection.
Size() < 2 )
1017 if( dlg.ShowModal() == wxID_CANCEL || dlg.
GetValue() == 0 )
1027 bool t1Start =
true;
1028 bool t2Start =
true;
1031 std::vector<FILLET_OP> filletOperations;
1032 bool operationPerformedOnAtLeastOne =
false;
1033 bool didOneAttemptFail =
false;
1034 std::set<PCB_TRACK*> processedTracks;
1036 auto processFilletOp =
1037 [&](
PCB_TRACK* aTrack,
bool aStartPoint )
1041 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
1045 if( itemsOnAnchor.size() > 0
1046 && selection.
Contains( itemsOnAnchor.at( 0 ) )
1052 if( processedTracks.find( trackOther ) == processedTracks.end() )
1054 if( itemsOnAnchor.size() == 1 )
1057 filletOp.t1 = aTrack;
1058 filletOp.t2 = trackOther;
1059 filletOp.t1Start = aStartPoint;
1060 filletOp.t2Start = aTrack->
IsPointOnEnds( filletOp.t2->GetStart() );
1061 filletOperations.push_back( filletOp );
1067 didOneAttemptFail =
true;
1081 processFilletOp( track,
true );
1082 processFilletOp( track,
false );
1084 processedTracks.insert( track );
1090 std::vector<BOARD_ITEM*> itemsToAddToSelection;
1092 for( FILLET_OP filletOp : filletOperations )
1100 if( trackOnStart && trackOnEnd )
1103 if( ( trackOnStart || trackOnEnd ) && track1->
GetLayer() == track2->
GetLayer() )
1111 SHAPE_ARC sArc( t1Seg, t2Seg, filletRadius );
1114 auto setIfPointOnSeg =
1117 VECTOR2I segToVec = aSegment.NearestPoint( aVecToTest ) - aVecToTest;
1122 aPointToSet.
x = aVecToTest.x;
1123 aPointToSet.
y = aVecToTest.y;
1131 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP0() )
1132 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP0() ) )
1134 didOneAttemptFail =
true;
1138 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP1() )
1139 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP1() ) )
1141 didOneAttemptFail =
true;
1151 itemsToAddToSelection.push_back( tArc );
1156 if( filletOp.t1Start )
1159 track1->
SetEnd( t1newPoint );
1161 if( filletOp.t2Start )
1164 track2->
SetEnd( t2newPoint );
1166 operationPerformedOnAtLeastOne =
true;
1170 commit.
Push(
_(
"Fillet Tracks" ) );
1173 for(
BOARD_ITEM* item : itemsToAddToSelection )
1176 if( !operationPerformedOnAtLeastOne )
1178 else if( didOneAttemptFail )
1196 static int filletRadius = 0;
1200 if( dlg.ShowModal() == wxID_CANCEL || dlg.
GetValue() == 0 )
1201 return std::nullopt;
1205 return filletRadius;
1222 static CHAMFER_PARAMS params{ default_setback, default_setback };
1225 params.m_chamfer_setback_a );
1227 if( dlg.ShowModal() == wxID_CANCEL || dlg.
GetValue() == 0 )
1228 return std::nullopt;
1230 params.m_chamfer_setback_a = dlg.
GetValue();
1233 params.m_chamfer_setback_b = params.m_chamfer_setback_a;
1244 std::vector<VECTOR2I> pts;
1247 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1249 BOARD_ITEM* item = aCollector[i];
1253 if( !item->IsType( { PCB_SHAPE_LOCATE_SEGMENT_T,
1254 PCB_SHAPE_LOCATE_POLY_T,
1255 PCB_SHAPE_LOCATE_RECT_T } ) )
1257 aCollector.
Remove( item );
1263 std::set<PCB_SHAPE*> lines_to_add;
1264 std::vector<PCB_SHAPE*> items_to_remove;
1268 std::vector<VECTOR2I> pts;
1275 items_to_remove.push_back( graphic );
1278 pts.emplace_back( start );
1279 pts.emplace_back(
VECTOR2I( end.x, start.y ) );
1280 pts.emplace_back( end );
1281 pts.emplace_back(
VECTOR2I( start.x, end.y ) );
1286 items_to_remove.push_back( graphic );
1288 for(
int jj = 0; jj < graphic->
GetPolyShape().VertexCount(); ++jj )
1292 for(
size_t jj = 1; jj < pts.size(); ++jj )
1300 lines_to_add.insert( line );
1303 if( pts.size() > 1 )
1308 line->
SetEnd( pts.front() );
1311 lines_to_add.insert( line );
1319 frame()->ShowInfoBarMsg(
_(
"Exactly two lines must be selected to extend them." ) );
1326 else if( segmentCount < 2 )
1328 frame()->ShowInfoBarMsg(
_(
"A shape with at least two lines must be selected." ) );
1342 selection.Add( item );
1346 for(
PCB_SHAPE* item : items_to_remove )
1348 selection.Remove( item );
1349 commit.Remove( item );
1357 std::vector<PCB_SHAPE*> items_to_select_on_success;
1360 std::vector<PCB_SHAPE*> items_to_deselect_on_success;
1365 auto item_modification_handler =
1371 commit.Modify( &aItem );
1372 items_to_select_on_success.push_back( &aItem );
1376 bool any_items_created = !lines_to_add.empty();
1377 auto item_creation_handler =
1378 [&]( std::unique_ptr<PCB_SHAPE> aItem )
1380 any_items_created =
true;
1381 items_to_select_on_success.push_back( aItem.get() );
1382 commit.Add( aItem.release() );
1385 bool any_items_removed = !items_to_remove.empty();
1386 auto item_removal_handler =
1390 any_items_removed =
true;
1391 items_to_deselect_on_success.push_back( &aItem );
1392 commit.Remove( &aItem );
1397 item_creation_handler, item_modification_handler, item_removal_handler );
1400 std::unique_ptr<PAIRWISE_LINE_ROUTINE> pairwise_line_routine;
1406 if( filletRadiusIU.has_value() )
1408 pairwise_line_routine = std::make_unique<LINE_FILLET_ROUTINE>( frame()->
GetModel(),
1415 std::optional<CHAMFER_PARAMS> chamfer_params =
GetChamferParams( *frame() );
1417 if( chamfer_params.has_value() )
1419 pairwise_line_routine = std::make_unique<LINE_CHAMFER_ROUTINE>( frame()->
GetModel(),
1426 pairwise_line_routine = std::make_unique<LINE_EXTENSION_ROUTINE>( frame()->
GetModel(),
1430 if( !pairwise_line_routine )
1441 if( ( a->GetFlags() & STRUCT_DELETED ) == 0
1442 && ( b->GetFlags() & STRUCT_DELETED ) == 0 )
1444 PCB_SHAPE* line_a = static_cast<PCB_SHAPE*>( a );
1445 PCB_SHAPE* line_b = static_cast<PCB_SHAPE*>( b );
1447 pairwise_line_routine->ProcessLinePair( *line_a, *line_b );
1452 for(
PCB_SHAPE* item : items_to_select_on_success )
1453 m_selectionTool->AddItemToSel( item,
true );
1456 for(
PCB_SHAPE* item : items_to_deselect_on_success )
1457 m_selectionTool->RemoveItemFromSel( item,
true );
1459 if( any_items_removed )
1462 if( any_items_created )
1468 commit.Push( pairwise_line_routine->GetCommitDescription() );
1470 if(
const std::optional<wxString> msg = pairwise_line_routine->GetStatusMessage() )
1471 frame()->ShowInfoBarMsg( *msg );
1482 std::vector<VECTOR2I> pts;
1485 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1487 BOARD_ITEM* item = aCollector[i];
1489 if( !item->IsType( { PCB_SHAPE_LOCATE_POLY_T, PCB_ZONE_T } ) )
1490 aCollector.
Remove( item );
1492 if(
ZONE* zone = dyn_cast<ZONE*>( item ) )
1494 if( zone->IsTeardropArea() )
1495 aCollector.
Remove( item );
1507 if( dlg.ShowModal() == wxID_CANCEL )
1510 s_toleranceValue = dlg.GetValue();
1512 if( s_toleranceValue <= 0 )
1517 std::vector<PCB_SHAPE*> shapeList;
1523 if(
PCB_SHAPE* shape = dyn_cast<PCB_SHAPE*>( item ) )
1530 if(
ZONE* zone = dyn_cast<ZONE*>( item ) )
1538 commit.Push(
_(
"Simplify Polygons" ) );
1552 std::vector<VECTOR2I> pts;
1555 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1557 BOARD_ITEM* item = aCollector[i];
1561 if( !item->IsType( { PCB_SHAPE_LOCATE_SEGMENT_T, PCB_SHAPE_LOCATE_ARC_T,
1562 PCB_SHAPE_LOCATE_BEZIER_T } ) )
1564 aCollector.
Remove( item );
1576 if( dlg.ShowModal() == wxID_CANCEL )
1579 s_toleranceValue = dlg.GetValue();
1581 if( s_toleranceValue <= 0 )
1586 std::vector<PCB_SHAPE*> shapeList;
1587 std::vector<std::unique_ptr<PCB_SHAPE>> newShapes;
1593 shapeList.push_back( shape );
1600 std::vector<PCB_SHAPE*> items_to_select;
1602 for( std::unique_ptr<PCB_SHAPE>& ptr : newShapes )
1606 commit.Add( shape );
1607 items_to_select.push_back( shape );
1610 commit.Push(
_(
"Heal Shapes" ) );
1613 for(
PCB_SHAPE* item : items_to_select )
1614 m_selectionTool->AddItemToSel( item,
true );
1616 if( items_to_select.size() > 0 )
1632 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1634 BOARD_ITEM* item = aCollector[i];
1636 if( !item->IsType( {
1637 PCB_SHAPE_LOCATE_POLY_T,
1638 PCB_SHAPE_LOCATE_RECT_T,
1641 aCollector.
Remove( item );
1647 const EDA_ITEM*
const last_item = selection.GetLastAddedItem();
1650 std::vector<PCB_SHAPE*> items_to_process;
1654 items_to_process.push_back(
static_cast<PCB_SHAPE*
>( item ) );
1659 if( item == last_item )
1660 std::swap( items_to_process.back(), items_to_process.front() );
1666 auto item_modification_handler =
1672 std::vector<PCB_SHAPE*> items_to_select_on_success;
1674 auto item_creation_handler =
1675 [&]( std::unique_ptr<PCB_SHAPE> aItem )
1677 items_to_select_on_success.push_back( aItem.get() );
1678 commit.
Add( aItem.release() );
1681 auto item_removal_handler =
1689 item_creation_handler, item_modification_handler, item_removal_handler );
1692 std::unique_ptr<POLYGON_BOOLEAN_ROUTINE> boolean_routine;
1695 boolean_routine = std::make_unique<POLYGON_MERGE_ROUTINE>( frame()->
GetModel(),
1700 boolean_routine = std::make_unique<POLYGON_SUBTRACT_ROUTINE>( frame()->
GetModel(),
1705 boolean_routine = std::make_unique<POLYGON_INTERSECT_ROUTINE>( frame()->
GetModel(),
1710 wxASSERT_MSG(
false,
"Could not find a polygon routine for this action" );
1715 for(
PCB_SHAPE* shape : items_to_process )
1716 boolean_routine->ProcessShape( *shape );
1719 for(
PCB_SHAPE* item : items_to_select_on_success )
1720 m_selectionTool->AddItemToSel( item,
true );
1725 commit.Push( boolean_routine->GetCommitDescription() );
1727 if(
const std::optional<wxString> msg = boolean_routine->GetStatusMessage() )
1728 frame()->ShowInfoBarMsg( *msg );
1750 std::vector<PCB_TABLECELL*> cells;
1767 else if( selection.
Size() == 1 )
1801 for(
EDA_ITEM* eda_item : selCopy )
1805 if( !( item->GetLayerSet() & visible ).any() )
1828 commit = &localCommit;
1843 if( selection.
Empty() )
1846 std::optional<VECTOR2I> oldRefPt;
1847 bool is_hover = selection.
IsHover();
1869 if( selection.
Empty() )
1886 if(
frame()->GetCanvas()->GetView()->GetGAL()->IsFlippedX() )
1887 rotateAngle = -rotateAngle;
1893 viewBBox.
Merge( item->ViewBBox() );
1902 typedef std::numeric_limits<int> coord_limits;
1907 bool outOfBounds = rotPos.
x < min || rotPos.
x > max || rotPos.
y < min || rotPos.
y > max
1908 || rotEnd.
x < min || rotEnd.
x > max || rotEnd.
y < min || rotEnd.
y > max;
1914 if( !item->IsNew() && !item->IsMoving() )
1919 board_item->Rotate( refPt, rotateAngle );
1920 board_item->Normalize();
1924 if( !localCommit.
Empty() )
1925 localCommit.
Push(
_(
"Rotate" ) );
1954 mirrored.
x -= aMirrorPoint.
x;
1955 mirrored.
x = -mirrored.
x;
1956 mirrored.
x += aMirrorPoint.
x;
1969 mirrored.
y -= aMirrorPoint.
y;
1970 mirrored.
y = -mirrored.
y;
1971 mirrored.
y += aMirrorPoint.
y;
2047 commit = &localCommit;
2058 if( selection.
Empty() )
2067 bool mirrorLeftRight =
true;
2068 bool mirrorAroundXaxis =
false;
2072 mirrorLeftRight =
false;
2073 mirrorAroundXaxis =
true;
2076 std::vector<EDA_ITEM*> items;
2082 static_cast<PCB_GROUP*
>( item )->RunOnDescendants(
2085 items.push_back( descendant );
2090 items.push_back( item );
2099 if( !item->IsNew() && !item->IsMoving() )
2103 switch( item->Type() )
2106 static_cast<PCB_SHAPE*
>( item )->
Mirror( mirrorPoint, mirrorAroundXaxis );
2110 static_cast<ZONE*
>( item )->
Mirror( mirrorPoint, mirrorLeftRight );
2115 static_cast<PCB_TEXT*
>( item )->
Mirror( mirrorPoint, mirrorAroundXaxis );
2127 if( mirrorLeftRight )
2137 static_cast<PCB_TRACK*
>( item )->
Mirror( mirrorPoint, mirrorAroundXaxis );
2146 if( !localCommit.
Empty() )
2147 localCommit.
Push(
_(
"Mirror" ) );
2173 commit = &localCommit;
2182 if( selection.
Empty() )
2200 if( !item->IsNew() && !item->IsMoving() )
2203 setJustify(
static_cast<PCB_TEXT*
>( item ) );
2207 if( !item->IsNew() && !item->IsMoving() )
2214 if( !localCommit.
Empty() )
2217 localCommit.
Push(
_(
"Left Justify" ) );
2219 localCommit.
Push(
_(
"Center Justify" ) );
2221 localCommit.
Push(
_(
"Right Justify" ) );
2248 commit = &localCommit;
2260 if( selection.
Empty() )
2263 std::optional<VECTOR2I> oldRefPt;
2275 if( selection.
GetSize() == 1 )
2284 if( !boardItem->IsNew() && !boardItem->IsMoving() )
2285 commit->
Modify( boardItem );
2287 boardItem->Flip( refPt, leftRight );
2288 boardItem->Normalize();
2292 if( !localCommit.
Empty() )
2293 localCommit.
Push(
_(
"Change Side / Flip" ) );
2315 std::unordered_set<BOARD_ITEM*>& children )
2319 std::unordered_set<BOARD_ITEM*>& childItems =
static_cast<PCB_GROUP*
>( item )->GetItems();
2323 children.insert( childItem );
2333 auto itr = items.begin();
2335 while( itr != items.end() )
2343 std::unordered_set<BOARD_ITEM*> childItems;
2346 std::for_each( childItems.begin(), childItems.end(),
2347 [&](
auto eraseItem )
2349 items.erase( eraseItem );
2369 std::unordered_set<EDA_ITEM*> rootItems( aItems.
begin(), aItems.
end() );
2372 int itemsDeleted = 0;
2373 int fieldsHidden = 0;
2374 int fieldsAlreadyHidden = 0;
2379 wxCHECK2( board_item,
continue );
2386 switch( item->Type() )
2392 wxASSERT( parentFP );
2393 commit.
Modify( parentFP );
2402 fieldsAlreadyHidden++;
2420 commit.
Remove( board_item );
2426 commit.
Modify( board_item );
2427 static_cast<PCB_TABLECELL*
>( board_item )->SetText( wxEmptyString );
2444 commit.
Remove( board_item );
2451 commit.
Modify( parentFP );
2453 parentFP->
Remove( board_item );
2463 if( !aIsCut && aItems.
GetSize() == 1 )
2466 ZONE* zone =
static_cast<ZONE*
>( board_item );
2468 int outlineIdx, holeIdx;
2491 commit.
Remove( board_item );
2496 if( rootItems.size() == 1 )
2513 commit.
Remove( board_item );
2520 wxASSERT_MSG( parentFP ==
nullptr, wxT(
"Try to delete an item living in a footprint" ) );
2521 commit.
Remove( board_item );
2530 if( enteredGroup && enteredGroup->
GetItems().empty() )
2535 commit.
Push(
_(
"Cut" ) );
2537 else if( itemsDeleted == 0 )
2539 if( fieldsHidden == 1 )
2540 commit.
Push(
_(
"Hide Field" ) );
2541 else if( fieldsHidden > 1 )
2542 commit.
Push(
_(
"Hide Fields" ) );
2543 else if( fieldsAlreadyHidden > 0 )
2544 editFrame->
ShowInfoBarError(
_(
"Use the Footprint Properties dialog to remove fields." ) );
2548 commit.
Push(
_(
"Delete" ) );
2559 std::vector<BOARD_ITEM*> lockedItems;
2643 if( selection.
Empty() )
2655 int ret = dialog.ShowModal();
2657 if( ret == wxID_OK )
2665 selCenter += translation;
2667 if( !
frame()->GetPcbNewSettings()->m_Display.m_DisplayInvertYAxis )
2668 rotation = -rotation;
2674 wxCHECK2( boardItem,
continue );
2676 if( !boardItem->
IsNew() )
2677 commit.
Modify( boardItem );
2680 boardItem->
Move( translation );
2682 switch( rotationAnchor )
2688 boardItem->
Rotate( selCenter, angle );
2691 boardItem->
Rotate(
frame()->GetScreen()->m_LocalOrigin, angle );
2694 boardItem->
Rotate(
board()->GetDesignSettings().GetAuxOrigin(), angle );
2702 commit.
Push(
_(
"Move Exactly" ) );
2704 if( selection.IsHover() )
2737 if( selection.
Empty() )
2749 bool is_hover = selection.
IsHover();
2751 std::vector<BOARD_ITEM*> new_items;
2752 new_items.reserve( selection.
Size() );
2761 wxCHECK2( orig_item,
continue );
2784 static_cast<PAD*
>( dupe_item )->SetNumber( padNumber );
2788 new_items.push_back( dupe_item );
2789 commit.
Add( dupe_item );
2798 switch( orig_item->
Type() )
2821 new_items.push_back( dupe_item );
2822 commit.
Add( dupe_item );
2831 dupe_item =
static_cast<PCB_GROUP*
>( orig_item )->DeepDuplicate();
2837 new_items.push_back( aItem );
2838 commit.
Add( aItem );
2842 new_items.push_back( dupe_item );
2843 commit.
Add( dupe_item );
2847 wxASSERT_MSG(
false, wxString::Format( wxT(
"Unhandled item type %d" ),
2848 orig_item->
Type() ) );
2858 EDA_ITEMS nItems( new_items.begin(), new_items.end() );
2862 if( !selection.
Empty() )
2864 editFrame->
DisplayToolMsg( wxString::Format(
_(
"Duplicated %d item(s)" ),
2865 (
int) new_items.size() ) );
2869 commit.
Push(
_(
"Duplicate" ) );
2898 if( selection.
Empty() )
2913 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
2915 if( aCollector[i]->Type() !=
PCB_PAD_T )
2924 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
2935 if( aSelection.
Empty() )
2956 BOX2I nonFieldsBBox;
2960 if( !item->IsType( { PCB_TEXT_T, PCB_FIELD_T } ) )
2961 nonFieldsBBox.
Merge( item->GetBoundingBox() );
2976 const wxString& aCanceledMessage,
VECTOR2I& aReferencePoint )
2979 std::optional<VECTOR2I> pickedPoint;
2988 [&](
const VECTOR2D& aPoint ) ->
bool
2990 pickedPoint = aPoint;
2992 if( !aSuccessMessage.empty() )
3014 if( !aCanceledMessage.empty() )
3026 [&](
const int& aFinalState )
3041 evt->SetPassEvent();
3051 aReferencePoint = *pickedPoint;
3053 return pickedPoint.has_value();
3061 getEditFrame<PCB_BASE_EDIT_FRAME>()->GetMagneticItemsSettings() );
3063 "pcbnew.InteractiveEdit.selectReferencePoint",
3064 TOOL_ACTION_SCOPE::AS_GLOBAL );
3072 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
3074 BOARD_ITEM* item = aCollector[i];
3078 if( ( item->Type() == PCB_FIELD_T || item->Type() == PCB_TEXT_T )
3079 && aCollector.HasItem( item->GetParentFootprint() ) )
3081 aCollector.Remove( item );
3086 aCollector.Remove( item );
3092 aEvent.IsAction( &
ACTIONS::cut ) && !m_isFootprintEditor );
3094 if( !selection.Empty() )
3096 std::vector<BOARD_ITEM*> items;
3101 items.push_back( boardItem );
3108 if( !pickReferencePoint(
_(
"Select reference point for the copy..." ),
3109 _(
"Selection copied" ),
3110 _(
"Copy canceled" ),
3113 frame()->PopTool( selectReferencePoint );
3119 refPoint =
grid.BestDragOrigin( getViewControls()->GetCursorPosition(), items );
3122 selection.SetReferencePoint( refPoint );
3124 io.SetBoard( board() );
3125 io.SaveSelection( selection, m_isFootprintEditor );
3126 frame()->SetStatusText(
_(
"Selection copied" ) );
3129 frame()->PopTool( selectReferencePoint );
3131 if( selection.IsHover() )
3132 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.
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).
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.
#define STRUCT_DELETED
flag indication structures to be erased
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.
@ 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".
VECTOR2< int32_t > VECTOR2I