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" ) );
169 auto hasCornerCondition =
177 auto hasMidpointCondition =
221 auto positioningToolsCondition =
225 subMenu->Evaluate( aSel );
226 return subMenu->GetMenuItemCount() > 0;
229 auto shapeModificationCondition =
233 subMenu->Evaluate( aSel );
234 return subMenu->GetMenuItemCount() > 0;
237 auto propertiesCondition =
240 if( aSel.GetSize() == 0 )
254 if( aSel.GetSize() == 1 )
266 auto inFootprintEditor =
290 auto multipleFootprintsCondition =
293 bool foundFirst =
false;
309 auto noActiveToolCondition =
312 return frame()->ToolStackIsEmpty();
315 auto notMovingCondition =
318 return aSelection.Empty() || !aSelection.Front()->IsMoving();
321 auto noItemsCondition =
322 [ this ](
const SELECTION& aSelections ) ->
bool
324 return frame()->GetBoard() && !
frame()->GetBoard()->IsEmpty();
336 && notMovingCondition
337 && !inFootprintEditor;
359 && notMovingCondition );
367 && notMovingCondition );
389 && !inFootprintEditor );
401 menu.AddSeparator( 100 );
402 menu.AddMenu( shapeModificationSubMenu.get(), shapeModificationCondition, 100 );
403 menu.AddMenu( positioningToolsSubMenu.get(), positioningToolsCondition, 100 );
405 menu.AddSeparator( 150 );
417 menu.AddSeparator( 150 );
433 wxString footprintName;
434 wxArrayString fplist;
439 fplist.Add( fp->GetReference() + wxT(
" ( " ) + fp->GetValue() + wxT(
" )" ) );
449 footprintName.Trim(
true );
450 footprintName.Trim(
false );
452 if( !footprintName.IsEmpty() )
456 if( fp->GetReference().CmpNoCase( footprintName ) == 0 )
556 std::vector<PCB_TRACK*> tracks;
557 std::vector<PCB_TRACK*> vias;
558 std::vector<FOOTPRINT*> footprints;
565 vias.push_back( track );
567 tracks.push_back( track );
578 for( int ii = aCollector.GetCount() - 1; ii >= 0; --ii )
580 if( aCollector[ii]->Type() != PCB_FOOTPRINT_T )
581 aCollector.Remove( ii );
584 else if( tracks.size() || vias.size() )
589 if( aCollector.GetCount() > 1 )
590 sTool->GuessSelectionCandidates( aCollector, aPt );
597 auto connected = []( PCB_TRACK* track, const VECTOR2I& pt )
599 return track->GetStart() == pt || track->GetEnd() == pt;
602 if( tracks.size() == 2 && vias.size() == 0 )
604 if( connected( tracks[0], tracks[1]->GetStart() )
605 || connected( tracks[0], tracks[1]->GetEnd() ) )
607 aCollector.Remove( tracks[1] );
610 else if( tracks.size() == 2 && vias.size() == 1 )
612 if( connected( tracks[0], vias[0]->GetPosition() )
613 && connected( tracks[1], vias[0]->GetPosition() ) )
615 aCollector.Remove( tracks[0] );
616 aCollector.Remove( tracks[1] );
623 if( selection.Empty() )
626 if( selection.Size() == 1 && selection.Front()->Type() ==
PCB_ARC_T )
630 return DragArcTrack( aEvent );
634 invokeInlineRouter( mode );
653 wxString msg = wxString::Format(
_(
"Unable to resize arc tracks of %s or greater." ),
655 frame()->ShowInfoBarError( msg );
668 bool restore_state =
false;
682 tanStart.
A = *tanIntersect;
684 tanEnd.
A = *tanIntersect;
687 std::set<PCB_TRACK*> addedTracks;
689 auto getUniqueTrackAtAnchorCollinear =
695 int allowedDeviation = theArc->
GetWidth();
697 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
699 for(
int i = 0; i < 3; i++ )
701 itemsOnAnchor = conn->GetConnectedItemsAtAnchor( theArc, aAnchor,
704 allowedDeviation /= 2;
706 if( itemsOnAnchor.size() == 1 )
712 if( itemsOnAnchor.size() == 1 && itemsOnAnchor.front()->Type() ==
PCB_TRACE_T )
714 track =
static_cast<PCB_TRACK*
>( itemsOnAnchor.front() );
720 if( trackSeg.
Angle( aCollinearSeg ) > maxTangentDeviation )
737 addedTracks.insert( track );
743 PCB_TRACK* trackOnStart = getUniqueTrackAtAnchorCollinear( theArc->
GetStart(), tanStart);
744 PCB_TRACK* trackOnEnd = getUniqueTrackAtAnchorCollinear( theArc->
GetEnd(), tanEnd );
749 tanStart.
B = trackOnStart->
GetEnd();
755 tanEnd.
B = trackOnEnd->
GetEnd();
759 if( tanIntersect = tanStart.
IntersectLines( tanEnd ); !tanIntersect )
762 auto isTrackStartClosestToArcStart =
765 double trackStartToArcStart = aTrack->GetStart().
Distance( theArc->
GetStart() );
766 double trackEndToArcStart = aTrack->GetEnd().Distance( theArc->
GetStart() );
768 return trackStartToArcStart < trackEndToArcStart;
771 bool isStartTrackOnStartPt = isTrackStartClosestToArcStart( trackOnStart );
772 bool isEndTrackOnStartPt = isTrackStartClosestToArcStart( trackOnEnd );
801 auto getFurthestPointToTanInterstect =
804 if( ( aPointA - *tanIntersect ).EuclideanNorm()
805 > ( aPointB - *tanIntersect ).EuclideanNorm() )
816 VECTOR2I tanStartPoint = getFurthestPointToTanInterstect( tanStart.
A, tanStart.
B );
817 VECTOR2I tanEndPoint = getFurthestPointToTanInterstect( tanEnd.
A, tanEnd.
B );
818 VECTOR2I tempTangentPoint = tanEndPoint;
820 if( getFurthestPointToTanInterstect( tanStartPoint, tanEndPoint ) == tanEndPoint )
821 tempTangentPoint = tanStartPoint;
827 SEG cSegTanStart( maxTanPtStart, *tanIntersect );
828 SEG cSegTanEnd( maxTanPtEnd, *tanIntersect );
829 SEG cSegChord( maxTanPtStart, maxTanPtEnd );
831 int cSegTanStartSide = cSegTanStart.
Side( theArc->
GetMid() );
832 int cSegTanEndSide = cSegTanEnd.
Side( theArc->
GetMid() );
833 int cSegChordSide = cSegChord.
Side( theArc->
GetMid() );
835 bool eatFirstMouseUp =
true;
847 std::vector<VECTOR2I> possiblePoints;
854 for(
const VECTOR2I& candidate : possiblePoints )
856 if( ( candidate -
m_cursor ).SquaredEuclideanNorm()
857 < ( closest -
m_cursor ).SquaredEuclideanNorm() )
886 if( isStartTrackOnStartPt )
889 trackOnStart->
SetEnd( newStart );
891 if( isEndTrackOnStartPt )
894 trackOnEnd->
SetEnd( newEnd );
902 if( evt->IsMotion() || evt->IsDrag(
BUT_LEFT ) )
904 eatFirstMouseUp =
false;
906 else if( evt->IsCancelInteractive() || evt->IsActivate() )
908 restore_state =
true;
913 restore_state =
true;
922 eatFirstMouseUp =
false;
934 if( isStartTrackOnStartPt )
935 newStart = trackOnStart->
GetEnd();
937 if( isEndTrackOnStartPt )
938 newEnd = trackOnEnd->
GetEnd();
943 if( trackOnStart->
GetLength() <= maxLengthIU )
945 if( addedTracks.count( trackOnStart ) )
948 addedTracks.erase( trackOnStart );
953 commit.
Remove( trackOnStart );
959 if( trackOnEnd->
GetLength() <= maxLengthIU )
961 if( addedTracks.count( trackOnEnd ) )
964 addedTracks.erase( trackOnEnd );
969 commit.
Remove( trackOnEnd );
988 commit.
Push(
_(
"Drag Arc Track" ) );
1000 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1002 BOARD_ITEM* item = aCollector[ i ];
1004 if( !dynamic_cast<PCB_TRACK*>( item ) )
1005 aCollector.Remove( item );
1023 if(
via->GetViaType() == VIATYPE::MICROVIA )
1036 via->SetDrill( new_drill );
1044 wxCHECK( track, 0 );
1053 commit.
Push(
_(
"Edit Track Width/Via Size" ) );
1078 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1080 BOARD_ITEM* item = aCollector[i];
1082 if( !dynamic_cast<PCB_TRACK*>( item ) )
1083 aCollector.Remove( item );
1097 if( newLayer == origLayer )
1108 wxCHECK( track, 0 );
1116 commit.
Push(
_(
"Edit Track Layer" ) );
1133 static int filletRadius = 0;
1139 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1141 BOARD_ITEM* item = aCollector[i];
1143 if( !dynamic_cast<PCB_TRACK*>( item ) )
1144 aCollector.Remove( item );
1149 if( selection.
Size() < 2 )
1151 frame()->ShowInfoBarMsg(
_(
"At least two straight track segments must be selected." ) );
1167 bool t1Start =
true;
1168 bool t2Start =
true;
1171 std::vector<FILLET_OP> filletOperations;
1172 bool operationPerformedOnAtLeastOne =
false;
1173 bool didOneAttemptFail =
false;
1174 std::set<PCB_TRACK*> processedTracks;
1176 auto processFilletOp =
1177 [&](
PCB_TRACK* aTrack,
bool aStartPoint )
1181 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
1185 if( itemsOnAnchor.size() > 0
1186 && selection.
Contains( itemsOnAnchor.at( 0 ) )
1192 if( processedTracks.find( trackOther ) == processedTracks.end() )
1194 if( itemsOnAnchor.size() == 1 )
1197 filletOp.t1 = aTrack;
1198 filletOp.t2 = trackOther;
1199 filletOp.t1Start = aStartPoint;
1200 filletOp.t2Start = aTrack->
IsPointOnEnds( filletOp.t2->GetStart() );
1201 filletOperations.push_back( filletOp );
1207 didOneAttemptFail =
true;
1221 processFilletOp( track,
true );
1222 processFilletOp( track,
false );
1224 processedTracks.insert( track );
1230 std::vector<BOARD_ITEM*> itemsToAddToSelection;
1232 for( FILLET_OP filletOp : filletOperations )
1240 if( trackOnStart && trackOnEnd )
1243 if( ( trackOnStart || trackOnEnd ) && track1->
GetLayer() == track2->
GetLayer() )
1251 SHAPE_ARC sArc( t1Seg, t2Seg, filletRadius );
1254 auto setIfPointOnSeg =
1257 VECTOR2I segToVec = aSegment.NearestPoint( aVecToTest ) - aVecToTest;
1262 aPointToSet.
x = aVecToTest.x;
1263 aPointToSet.
y = aVecToTest.y;
1271 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP0() )
1272 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP0() ) )
1274 didOneAttemptFail =
true;
1278 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP1() )
1279 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP1() ) )
1281 didOneAttemptFail =
true;
1293 itemsToAddToSelection.push_back( tArc );
1298 if( filletOp.t1Start )
1301 track1->
SetEnd( t1newPoint );
1303 if( filletOp.t2Start )
1306 track2->
SetEnd( t2newPoint );
1308 operationPerformedOnAtLeastOne =
true;
1312 commit.
Push(
_(
"Fillet Tracks" ) );
1315 for(
BOARD_ITEM* item : itemsToAddToSelection )
1318 if( !operationPerformedOnAtLeastOne )
1319 frame()->ShowInfoBarMsg(
_(
"Unable to fillet the selected track segments." ) );
1320 else if( didOneAttemptFail )
1321 frame()->ShowInfoBarMsg(
_(
"Some of the track segments could not be filleted." ) );
1337 int& aPersitentRadius )
1342 return std::nullopt;
1346 return aPersitentRadius;
1350static std::optional<DOGBONE_CORNER_ROUTINE::PARAMETERS>
1359 std::vector<WX_MULTI_ENTRY_DIALOG::ENTRY> entries{
1366 _(
"Add slots in acute corners" ),
1368 _(
"Add slots in acute corners to allow access to a cutter of the given radius" ),
1375 return std::nullopt;
1377 std::vector<WX_MULTI_ENTRY_DIALOG::RESULT> results = dlg.
GetValues();
1378 wxCHECK( results.size() == 2, std::nullopt );
1382 s_dogBoneParams.DogboneRadiusIU = std::get<long long int>( results[0] );
1383 s_dogBoneParams.AddSlots = std::get<bool>( results[1] );
1385 catch(
const std::bad_variant_access& )
1388 return std::nullopt;
1391 return s_dogBoneParams;
1407 static CHAMFER_PARAMS params{ default_setback, default_setback };
1410 params.m_chamfer_setback_a );
1413 return std::nullopt;
1415 params.m_chamfer_setback_a = dlg.
GetValue();
1418 params.m_chamfer_setback_b = params.m_chamfer_setback_a;
1429 std::vector<VECTOR2I> pts;
1432 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1434 BOARD_ITEM* item = aCollector[i];
1438 if( !item->IsType( { PCB_SHAPE_LOCATE_SEGMENT_T,
1439 PCB_SHAPE_LOCATE_POLY_T,
1440 PCB_SHAPE_LOCATE_RECT_T } ) )
1442 aCollector.
Remove( item );
1448 std::set<PCB_SHAPE*> lines_to_add;
1449 std::vector<PCB_SHAPE*> items_to_remove;
1453 std::vector<VECTOR2I> pts;
1460 items_to_remove.push_back( graphic );
1463 pts.emplace_back( start );
1465 pts.emplace_back(
end );
1471 items_to_remove.push_back( graphic );
1473 for(
int jj = 0; jj < graphic->
GetPolyShape().VertexCount(); ++jj )
1477 for(
size_t jj = 1; jj < pts.size(); ++jj )
1485 lines_to_add.insert( line );
1488 if( pts.size() > 1 )
1493 line->
SetEnd( pts.front() );
1496 lines_to_add.insert( line );
1504 frame()->ShowInfoBarMsg(
_(
"Exactly two lines must be selected to extend them." ) );
1511 else if( segmentCount < 2 )
1513 frame()->ShowInfoBarMsg(
_(
"A shape with at least two lines must be selected." ) );
1527 selection.Add( item );
1531 for(
PCB_SHAPE* item : items_to_remove )
1533 selection.Remove( item );
1534 commit.Remove( item );
1542 std::vector<BOARD_ITEM*> items_to_select_on_success;
1545 std::vector<BOARD_ITEM*> items_to_deselect_on_success;
1550 auto item_modification_handler =
1556 commit.Modify( &aItem );
1557 items_to_select_on_success.push_back( &aItem );
1561 bool any_items_created = !lines_to_add.empty();
1562 auto item_creation_handler =
1563 [&]( std::unique_ptr<BOARD_ITEM> aItem )
1565 any_items_created =
true;
1566 items_to_select_on_success.push_back( aItem.get() );
1567 commit.Add( aItem.release() );
1570 bool any_items_removed = !items_to_remove.empty();
1571 auto item_removal_handler =
1575 any_items_removed =
true;
1576 items_to_deselect_on_success.push_back( &aItem );
1577 commit.Remove( &aItem );
1582 item_creation_handler, item_modification_handler, item_removal_handler );
1585 std::unique_ptr<PAIRWISE_LINE_ROUTINE> pairwise_line_routine;
1590 std::optional<int> filletRadiusIU =
1593 if( filletRadiusIU.has_value() )
1595 pairwise_line_routine = std::make_unique<LINE_FILLET_ROUTINE>(
1596 frame()->
GetModel(), change_handler, *filletRadiusIU );
1601 std::optional<DOGBONE_CORNER_ROUTINE::PARAMETERS> dogboneParams =
1604 if( dogboneParams.has_value() )
1606 pairwise_line_routine = std::make_unique<DOGBONE_CORNER_ROUTINE>(
1607 frame()->
GetModel(), change_handler, *dogboneParams );
1612 std::optional<CHAMFER_PARAMS> chamfer_params =
GetChamferParams( *frame() );
1614 if( chamfer_params.has_value() )
1616 pairwise_line_routine = std::make_unique<LINE_CHAMFER_ROUTINE>( frame()->
GetModel(),
1623 pairwise_line_routine = std::make_unique<LINE_EXTENSION_ROUTINE>( frame()->
GetModel(),
1627 if( !pairwise_line_routine )
1638 if( ( a->GetFlags() & STRUCT_DELETED ) == 0
1639 && ( b->GetFlags() & STRUCT_DELETED ) == 0 )
1641 PCB_SHAPE* line_a = static_cast<PCB_SHAPE*>( a );
1642 PCB_SHAPE* line_b = static_cast<PCB_SHAPE*>( b );
1644 pairwise_line_routine->ProcessLinePair( *line_a, *line_b );
1649 for(
BOARD_ITEM* item : items_to_select_on_success )
1650 m_selectionTool->AddItemToSel( item,
true );
1653 for(
BOARD_ITEM* item : items_to_deselect_on_success )
1654 m_selectionTool->RemoveItemFromSel( item,
true );
1656 if( any_items_removed )
1659 if( any_items_created )
1665 commit.Push( pairwise_line_routine->GetCommitDescription() );
1667 if(
const std::optional<wxString> msg = pairwise_line_routine->GetStatusMessage( segmentCount ) )
1668 frame()->ShowInfoBarMsg( *msg );
1679 std::vector<VECTOR2I> pts;
1682 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1684 BOARD_ITEM* item = aCollector[i];
1686 if( !item->IsType( { PCB_SHAPE_LOCATE_POLY_T, PCB_ZONE_T } ) )
1687 aCollector.
Remove( item );
1689 if(
ZONE* zone = dyn_cast<ZONE*>( item ) )
1691 if( zone->IsTeardropArea() )
1692 aCollector.
Remove( item );
1704 if( dlg.ShowModal() == wxID_CANCEL )
1707 s_toleranceValue = dlg.GetValue();
1709 if( s_toleranceValue <= 0 )
1714 std::vector<PCB_SHAPE*> shapeList;
1720 if(
PCB_SHAPE* shape = dyn_cast<PCB_SHAPE*>( item ) )
1727 if(
ZONE* zone = dyn_cast<ZONE*>( item ) )
1735 commit.Push(
_(
"Simplify Polygons" ) );
1749 std::vector<VECTOR2I> pts;
1752 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1754 BOARD_ITEM* item = aCollector[i];
1758 if( !item->IsType( { PCB_SHAPE_LOCATE_SEGMENT_T, PCB_SHAPE_LOCATE_ARC_T,
1759 PCB_SHAPE_LOCATE_BEZIER_T } ) )
1761 aCollector.
Remove( item );
1773 if( dlg.ShowModal() == wxID_CANCEL )
1776 s_toleranceValue = dlg.GetValue();
1778 if( s_toleranceValue <= 0 )
1783 std::vector<PCB_SHAPE*> shapeList;
1784 std::vector<std::unique_ptr<PCB_SHAPE>> newShapes;
1790 shapeList.push_back( shape );
1797 std::vector<PCB_SHAPE*> items_to_select;
1799 for( std::unique_ptr<PCB_SHAPE>& ptr : newShapes )
1803 commit.Add( shape );
1804 items_to_select.push_back( shape );
1807 commit.Push(
_(
"Heal Shapes" ) );
1810 for(
PCB_SHAPE* item : items_to_select )
1811 m_selectionTool->AddItemToSel( item,
true );
1813 if( items_to_select.size() > 0 )
1829 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1831 BOARD_ITEM* item = aCollector[i];
1833 static const std::vector<KICAD_T> polygonBooleanTypes = {
1834 PCB_SHAPE_LOCATE_POLY_T,
1835 PCB_SHAPE_LOCATE_RECT_T,
1836 PCB_SHAPE_LOCATE_CIRCLE_T,
1839 if( !item->IsType( polygonBooleanTypes ) )
1840 aCollector.
Remove( item );
1845 const EDA_ITEM*
const last_item = selection.GetLastAddedItem();
1848 std::vector<PCB_SHAPE*> items_to_process;
1852 items_to_process.push_back(
static_cast<PCB_SHAPE*
>( item ) );
1857 if( item == last_item )
1858 std::swap( items_to_process.back(), items_to_process.front() );
1864 auto item_modification_handler =
1870 std::vector<BOARD_ITEM*> items_to_select_on_success;
1872 auto item_creation_handler =
1873 [&]( std::unique_ptr<BOARD_ITEM> aItem )
1875 items_to_select_on_success.push_back( aItem.get() );
1876 commit.
Add( aItem.release() );
1879 auto item_removal_handler =
1887 item_modification_handler,
1888 item_removal_handler );
1891 std::unique_ptr<POLYGON_BOOLEAN_ROUTINE> boolean_routine;
1893 const auto create_routine = [&]() -> std::unique_ptr<POLYGON_BOOLEAN_ROUTINE>
1900 wxCHECK( model,
nullptr );
1904 return std::make_unique<POLYGON_MERGE_ROUTINE>( model, change_handler );
1908 return std::make_unique<POLYGON_SUBTRACT_ROUTINE>( model, change_handler );
1912 return std::make_unique<POLYGON_INTERSECT_ROUTINE>( model, change_handler );
1917 const auto run_routine = [&]()
1920 for(
PCB_SHAPE* shape : items_to_process )
1921 boolean_routine->ProcessShape( *shape );
1923 boolean_routine->Finalize();
1926 boolean_routine = create_routine();
1928 wxCHECK_MSG( boolean_routine, 0,
"Could not find a polygon routine for this action" );
1935 if( !boolean_routine->IsCommutative() && items_to_select_on_success.empty() )
1939 items_to_select_on_success.clear();
1941 std::map<const PCB_SHAPE*, VECTOR2I::extended_type> items_area;
1943 for(
PCB_SHAPE* shape : items_to_process )
1946 items_area[shape] = area;
1955 std::sort( items_to_process.begin(), items_to_process.end(),
1958 return items_area[a] > items_area[b];
1962 boolean_routine = create_routine();
1967 for(
BOARD_ITEM* item : items_to_select_on_success )
1968 m_selectionTool->AddItemToSel( item,
true );
1973 commit.Push( boolean_routine->GetCommitDescription() );
1975 if(
const std::optional<wxString> msg = boolean_routine->GetStatusMessage() )
1976 frame()->ShowInfoBarMsg( *msg );
1998 std::vector<PCB_TABLECELL*> cells;
2048 for(
EDA_ITEM* eda_item : selCopy )
2050 if( !eda_item->IsBOARD_ITEM() )
2083 commit = &localCommit;
2099 if( selection.
Empty() )
2102 std::optional<VECTOR2I> oldRefPt;
2103 bool is_hover = selection.
IsHover();
2125 if( selection.
Empty() )
2131 bool usePcbShapeCenter =
false;
2137 if( shape->
GetShape() == SHAPE_T::RECTANGLE || shape->
GetShape() == SHAPE_T::POLY )
2138 usePcbShapeCenter =
true;
2145 else if( usePcbShapeCenter )
2157 if(
frame()->GetCanvas()->GetView()->GetGAL()->IsFlippedX() )
2158 rotateAngle = -rotateAngle;
2164 viewBBox.
Merge( item->ViewBBox() );
2173 typedef std::numeric_limits<int> coord_limits;
2178 bool outOfBounds = rotPos.
x < min || rotPos.
x > max || rotPos.
y < min || rotPos.
y > max
2179 || rotEnd.
x < min || rotEnd.
x > max || rotEnd.
y < min || rotEnd.
y > max;
2185 if( !item->IsNew() && !item->IsMoving() )
2186 commit->
Modify( item,
nullptr, RECURSE_MODE::RECURSE );
2188 if( item->IsBOARD_ITEM() )
2192 board_item->
Rotate( refPt, rotateAngle );
2200 if( !localCommit.
Empty() )
2201 localCommit.
Push(
_(
"Rotate" ) );
2236 MIRROR( tmpPt, aMirrorPoint, aFlipDirection );
2277 commit = &localCommit;
2288 if( selection.
Empty() )
2295 : FLIP_DIRECTION::LEFT_RIGHT;
2297 std::vector<EDA_ITEM*> items;
2303 static_cast<PCB_GROUP*
>( item )->RunOnChildren(
2306 items.push_back( descendant );
2308 RECURSE_MODE::RECURSE );
2312 items.push_back( item );
2321 if( !item->IsNew() && !item->IsMoving() )
2322 commit->
Modify( item,
nullptr, RECURSE_MODE::RECURSE );
2325 switch( item->Type() )
2328 static_cast<PCB_SHAPE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2332 static_cast<ZONE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2337 static_cast<PCB_TEXT*
>( item )->
Mirror( mirrorPoint, flipDirection );
2349 mirrorPad( *
static_cast<PAD*
>( item ), mirrorPoint, flipDirection );
2355 static_cast<PCB_TRACK*
>( item )->
Mirror( mirrorPoint, flipDirection );
2359 static_cast<PCB_GROUP*
>( item )->
Mirror( mirrorPoint, flipDirection );
2372 if( !localCommit.
Empty() )
2373 localCommit.
Push(
_(
"Mirror" ) );
2402 commit = &localCommit;
2411 if( selection.
Empty() )
2429 if( !item->IsNew() && !item->IsMoving() )
2432 setJustify(
static_cast<PCB_TEXT*
>( item ) );
2436 if( !item->IsNew() && !item->IsMoving() )
2443 if( !localCommit.
Empty() )
2446 localCommit.
Push(
_(
"Left Justify" ) );
2448 localCommit.
Push(
_(
"Center Justify" ) );
2450 localCommit.
Push(
_(
"Right Justify" ) );
2480 commit = &localCommit;
2492 if( selection.
Empty() )
2495 std::optional<VECTOR2I> oldRefPt;
2510 if( selection.
GetSize() == 1 )
2514 if( !item || item->
GetShape() != SHAPE_T::RECTANGLE )
2522 if( !item->IsBOARD_ITEM() )
2528 commit->
Modify( boardItem,
nullptr, RECURSE_MODE::RECURSE );
2530 boardItem->
Flip( refPt, flipDirection );
2537 if( !localCommit.
Empty() )
2538 localCommit.
Push(
_(
"Change Side / Flip" ) );
2570 int itemsDeleted = 0;
2571 int fieldsHidden = 0;
2572 int fieldsAlreadyHidden = 0;
2576 if( !item->IsBOARD_ITEM() )
2582 switch( item->Type() )
2588 wxASSERT( parentFP );
2589 commit.
Modify( parentFP );
2598 fieldsAlreadyHidden++;
2616 commit.
Remove( board_item );
2622 commit.
Modify( board_item );
2623 static_cast<PCB_TABLECELL*
>( board_item )->SetText( wxEmptyString );
2633 RECURSE_MODE::RECURSE );
2635 commit.
Remove( board_item );
2642 commit.
Remove( board_item );
2652 if( !aIsCut && aItems.
GetSize() == 1 )
2655 ZONE* zone =
static_cast<ZONE*
>( board_item );
2657 int outlineIdx, holeIdx;
2678 commit.
Remove( board_item );
2683 if( aItems.
Size() == 1 )
2697 commit.
Remove( board_item );
2704 wxASSERT_MSG( parentFP ==
nullptr, wxT(
"Try to delete an item living in a footprint" ) );
2705 commit.
Remove( board_item );
2714 if( enteredGroup && enteredGroup->
GetItems().empty() )
2719 commit.
Push(
_(
"Cut" ) );
2721 else if( itemsDeleted == 0 )
2723 if( fieldsHidden == 1 )
2724 commit.
Push(
_(
"Hide Field" ) );
2725 else if( fieldsHidden > 1 )
2726 commit.
Push(
_(
"Hide Fields" ) );
2727 else if( fieldsAlreadyHidden > 0 )
2728 editFrame->
ShowInfoBarError(
_(
"Use the Footprint Properties dialog to remove fields." ) );
2732 commit.
Push(
_(
"Delete" ) );
2743 std::vector<BOARD_ITEM*> lockedItems;
2831 if( selection.
Empty() )
2845 if( ret == wxID_OK )
2853 selCenter += translation;
2855 if( !
frame()->GetPcbNewSettings()->m_Display.m_DisplayInvertYAxis )
2856 rotation = -rotation;
2860 if( !item->IsBOARD_ITEM() )
2865 if( !boardItem->
IsNew() )
2866 commit.
Modify( boardItem,
nullptr, RECURSE_MODE::RECURSE );
2869 boardItem->
Move( translation );
2871 switch( rotationAnchor )
2877 boardItem->
Rotate( selCenter, angle );
2880 boardItem->
Rotate(
frame()->GetScreen()->m_LocalOrigin, angle );
2891 commit.
Push(
_(
"Move Exactly" ) );
2893 if( selection.IsHover() )
2929 if( selection.
Empty() )
2945 bool is_hover = selection.
IsHover();
2947 std::vector<BOARD_ITEM*> new_items;
2948 new_items.reserve( selection.
Size() );
2954 if( !item->IsBOARD_ITEM() )
2966 switch( orig_item->
Type() )
2984 dupe_item = parentFootprint->
DuplicateItem(
true, &commit, orig_item );
2986 dupe_item = orig_item->
Duplicate(
true, &commit );
2992 new_items.push_back( dupe_item );
2993 commit.
Add( dupe_item );
3003 dupe_item = parentFootprint->
DuplicateItem(
true, &commit, orig_item );
3011 static_cast<PAD*
>( dupe_item )->SetNumber( padNumber );
3018 new_items.push_back( dupe_item );
3019 commit.
Add( dupe_item );
3028 dupe_item =
static_cast<PCB_GROUP*
>( orig_item )->DeepDuplicate(
true, &commit );
3034 new_items.push_back( aItem );
3035 commit.
Add( aItem );
3037 RECURSE_MODE::RECURSE );
3040 new_items.push_back( dupe_item );
3041 commit.
Add( dupe_item );
3055 EDA_ITEMS nItems( new_items.begin(), new_items.end() );
3059 if( !selection.
Empty() )
3061 editFrame->
DisplayToolMsg( wxString::Format(
_(
"Duplicated %d item(s)" ),
3062 (
int) new_items.size() ) );
3066 commit.
Push(
_(
"Duplicate" ) );
3081 const auto incrementableFilter =
3084 for(
int i = aCollector.GetCount() - 1; i >= 0; i-- )
3086 switch( aCollector[i]->Type() )
3092 aCollector.Remove( i );
3101 if( selection.
Empty() )
3114 commit = &localCommit;
3118 switch( item->Type() )
3128 if( !
pad.CanHaveNumber() )
3132 std::optional<wxString> newNumber = incrementer.Increment(
pad.GetNumber(), incParam.
Delta,
3140 pad.SetNumber( *newNumber );
3149 std::optional<wxString> newText = incrementer.Increment(
text.GetText(), incParam.
Delta,
3157 text.SetText( *newText );
3170 commit->
Push(
_(
"Increment" ) );
3178 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3180 if( aCollector[i]->Type() !=
PCB_PAD_T )
3188 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3199 if( aSelection.
Empty() )
3223 BOX2I nonFieldsBBox;
3227 if( !item->IsType( { PCB_TEXT_T, PCB_FIELD_T } ) )
3228 nonFieldsBBox.
Merge( item->GetBoundingBox() );
3243 const wxString& aCanceledMessage,
VECTOR2I& aReferencePoint )
3247 std::optional<VECTOR2I> pickedPoint;
3257 const auto setPickerLayerSet =
3264 layerFilter =
LSET( { editFrame->GetActiveLayer() } );
3272 setPickerLayerSet();
3275 [&](
const VECTOR2D& aPoint ) ->
bool
3277 pickedPoint = aPoint;
3279 if( !aSuccessMessage.empty() )
3281 m_statusPopup->SetText( aSuccessMessage );
3282 m_statusPopup->Expire( 800 );
3286 m_statusPopup->Hide();
3301 if( !aCanceledMessage.empty() )
3303 m_statusPopup->SetText( aCanceledMessage );
3304 m_statusPopup->Expire( 800 );
3308 m_statusPopup->Hide();
3313 [&](
const int& aFinalState )
3332 setPickerLayerSet();
3335 evt->SetPassEvent();
3348 aReferencePoint = *pickedPoint;
3350 return pickedPoint.has_value();
3359 "pcbnew.InteractiveEdit.selectReferencePoint",
3360 TOOL_ACTION_SCOPE::AS_GLOBAL );
3362 frame()->PushTool( selectReferencePoint );
3375 if( !selection.
Empty() )
3377 std::vector<BOARD_ITEM*> items;
3381 if( item->IsBOARD_ITEM() )
3382 items.push_back(
static_cast<BOARD_ITEM*
>( item ) );
3390 _(
"Selection copied" ),
3391 _(
"Copy canceled" ),
3394 frame()->PopTool( selectReferencePoint );
3403 selection.SetReferencePoint( refPoint );
3407 frame()->SetStatusText(
_(
"Selection copied" ) );
3410 frame()->PopTool( selectReferencePoint );
3432 const auto getItemText = [&](
const BOARD_ITEM& aItem ) -> wxString
3434 switch( aItem.Type() )
3446 return text.GetShownText(
true );
3460 for(
int row = 0; row <
table.GetRowCount(); ++row )
3462 for(
int col = 0; col <
table.GetColCount(); ++col )
3467 if( col <
table.GetColCount() - 1 )
3473 if( row <
table.GetRowCount() - 1 )
3484 return wxEmptyString;
3487 wxArrayString itemTexts;
3491 if( item->IsBOARD_ITEM() )
3494 wxString itemText = getItemText( *boardItem );
3496 itemText.Trim(
false ).Trim(
true );
3498 if( !itemText.IsEmpty() )
3500 itemTexts.Add( std::move( itemText ) );
3506 if( !itemTexts.empty() )
3508 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 selectItem
Select an item (specified as the event parameter).
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 selectionClear
Clear the current selection.
static TOOL_ACTION leftJustify
static TOOL_ACTION copyAsText
static TOOL_ACTION refreshPreview
static TOOL_ACTION selectAll
static TOOL_ACTION selectItems
Select a list of items (specified as the event parameter)
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.
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
Abstract interface for BOARD_ITEMs capable of storing other items inside.
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 BOARD_ITEM * Duplicate(bool addToParentGroup, BOARD_COMMIT *aCommit=nullptr) const
Create a copy of this BOARD_ITEM.
void SetLocked(bool aLocked) override
bool IsLocked() const override
virtual void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle)
Rotate this object.
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 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.
const 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 ecoord_type GetArea() const
Return the area of the rectangle.
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.
void SaveSelection(const PCB_SELECTION &selected, bool isFootprintEditor)
void SetBoard(BOARD *aBoard)
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, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Add a new item to the model.
@ 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)
std::unordered_set< EDA_ITEM * > & GetItems()
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 const 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 layerPrev
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 moveWithReference
move with a reference point
static TOOL_ACTION changeTrackLayerPrev
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 unrouteSegment
Removes track segment from the selected item to the next segment.
static TOOL_ACTION moveIndividually
move items one-by-one
static TOOL_ACTION changeFootprints
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 changeTrackLayerNext
static TOOL_ACTION flip
Flipping of selected objects.
static TOOL_ACTION layerNext
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.
static const TOOL_EVENT & SnappingModeChangedByKeyEvent()
Hotkey feedback.
A set of BOARD_ITEMs (i.e., without duplicates).
Tool that displays edit points allowing to modify items by dragging the points.
BOX2I GetBoundingBox() const override
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
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).
VECTOR2_TRAITS< int32_t >::extended_type extended_type
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_TARGET_T
class PCB_TARGET, a target (graphic item)
@ PCB_SHAPE_LOCATE_CIRCLE_T
@ 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