65using namespace std::placeholders;
67#include <wx/hyperlink.h>
72#include <dialogs/dialog_tablecell_properties.h>
73#include <dialogs/dialog_table_properties.h>
126 auto menu = std::make_shared<CONDITIONAL_MENU>( aTool );
129 menu->SetTitle(
_(
"Positioning Tools" ) );
131 auto notMovingCondition = [](
const SELECTION& aSelection )
133 return aSelection.Empty() || !aSelection.Front()->IsMoving();
149 auto menu = std::make_shared<CONDITIONAL_MENU>( aTool );
151 menu->SetTitle(
_(
"Shape Modification" ) );
170 auto hasCornerCondition =
178 auto hasMidpointCondition =
217 m_selectionTool->GetToolMenu().RegisterSubMenu( positioningToolsSubMenu );
220 m_selectionTool->GetToolMenu().RegisterSubMenu( shapeModificationSubMenu );
222 auto positioningToolsCondition =
226 subMenu->Evaluate( aSel );
227 return subMenu->GetMenuItemCount() > 0;
230 auto shapeModificationCondition =
234 subMenu->Evaluate( aSel );
235 return subMenu->GetMenuItemCount() > 0;
238 auto propertiesCondition =
241 if( aSel.GetSize() == 0 )
255 if( aSel.GetSize() == 1 )
267 auto inFootprintEditor =
291 auto multipleFootprintsCondition =
294 bool foundFirst =
false;
310 auto noActiveToolCondition =
313 return frame()->ToolStackIsEmpty();
316 auto notMovingCondition =
319 return aSelection.Empty() || !aSelection.Front()->IsMoving();
322 auto noItemsCondition =
323 [
this](
const SELECTION& aSelections ) ->
bool
325 return frame()->GetBoard() && !
frame()->GetBoard()->IsEmpty();
337 && notMovingCondition
338 && !inFootprintEditor;
360 && notMovingCondition );
368 && notMovingCondition );
390 && !inFootprintEditor );
402 menu.AddSeparator( 100 );
403 menu.AddMenu( shapeModificationSubMenu.get(), shapeModificationCondition, 100 );
404 menu.AddMenu( positioningToolsSubMenu.get(), positioningToolsCondition, 100 );
406 menu.AddSeparator( 150 );
418 menu.AddSeparator( 150 );
434 wxString footprintName;
435 wxArrayString fplist;
440 fplist.Add( fp->GetReference() + wxT(
" ( " ) + fp->GetValue() + wxT(
" )" ) );
450 footprintName.Trim(
true );
451 footprintName.Trim(
false );
453 if( !footprintName.IsEmpty() )
457 if( fp->GetReference().CmpNoCase( footprintName ) == 0 )
557 std::vector<PCB_TRACK*> tracks;
558 std::vector<PCB_TRACK*> vias;
559 std::vector<FOOTPRINT*> footprints;
562 const auto gatherItemsByType =
570 vias.push_back( track );
572 tracks.push_back( track );
587 for(
int ii = aCollector.
GetCount() - 1; ii >= 0; --ii )
593 else if( tracks.size() || vias.size() )
620 if( tracks.size() == 2 && vias.size() == 0 )
622 if( connected( tracks[0], tracks[1]->GetStart() )
623 || connected( tracks[0], tracks[1]->GetEnd() ) )
625 aCollector.
Remove( tracks[1] );
628 else if( tracks.size() == 2 && vias.size() == 1 )
630 if( connected( tracks[0], vias[0]->GetPosition() )
631 && connected( tracks[1], vias[0]->GetPosition() ) )
633 aCollector.
Remove( tracks[0] );
634 aCollector.
Remove( tracks[1] );
672 wxString msg = wxString::Format(
_(
"Unable to resize arc tracks of %s or greater." ),
674 frame()->ShowInfoBarError( msg );
687 bool restore_state =
false;
701 tanStart.
A = *tanIntersect;
703 tanEnd.
A = *tanIntersect;
706 std::set<PCB_TRACK*> addedTracks;
708 auto getUniqueTrackAtAnchorCollinear =
711 std::shared_ptr<CONNECTIVITY_DATA> conn =
board()->GetConnectivity();
714 int allowedDeviation = theArc->
GetWidth();
716 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
718 for(
int i = 0; i < 3; i++ )
720 itemsOnAnchor = conn->GetConnectedItemsAtAnchor( theArc, aAnchor,
723 allowedDeviation /= 2;
725 if( itemsOnAnchor.size() == 1 )
731 if( itemsOnAnchor.size() == 1 && itemsOnAnchor.front()->Type() ==
PCB_TRACE_T )
733 track =
static_cast<PCB_TRACK*
>( itemsOnAnchor.front() );
739 if( trackSeg.
Angle( aCollinearSeg ) > maxTangentDeviation )
756 addedTracks.insert( track );
762 PCB_TRACK* trackOnStart = getUniqueTrackAtAnchorCollinear( theArc->
GetStart(), tanStart);
763 PCB_TRACK* trackOnEnd = getUniqueTrackAtAnchorCollinear( theArc->
GetEnd(), tanEnd );
768 tanStart.
B = trackOnStart->
GetEnd();
774 tanEnd.
B = trackOnEnd->
GetEnd();
778 if( tanIntersect = tanStart.
IntersectLines( tanEnd ); !tanIntersect )
781 auto isTrackStartClosestToArcStart =
784 double trackStartToArcStart = aTrack->GetStart().Distance( theArc->
GetStart() );
785 double trackEndToArcStart = aTrack->GetEnd().Distance( theArc->
GetStart() );
787 return trackStartToArcStart < trackEndToArcStart;
790 bool isStartTrackOnStartPt = isTrackStartClosestToArcStart( trackOnStart );
791 bool isEndTrackOnStartPt = isTrackStartClosestToArcStart( trackOnEnd );
820 auto getFurthestPointToTanInterstect =
823 if( ( aPointA - *tanIntersect ).EuclideanNorm()
824 > ( aPointB - *tanIntersect ).EuclideanNorm() )
835 VECTOR2I tanStartPoint = getFurthestPointToTanInterstect( tanStart.
A, tanStart.
B );
836 VECTOR2I tanEndPoint = getFurthestPointToTanInterstect( tanEnd.
A, tanEnd.
B );
837 VECTOR2I tempTangentPoint = tanEndPoint;
839 if( getFurthestPointToTanInterstect( tanStartPoint, tanEndPoint ) == tanEndPoint )
840 tempTangentPoint = tanStartPoint;
846 SEG cSegTanStart( maxTanPtStart, *tanIntersect );
847 SEG cSegTanEnd( maxTanPtEnd, *tanIntersect );
848 SEG cSegChord( maxTanPtStart, maxTanPtEnd );
850 int cSegTanStartSide = cSegTanStart.
Side( theArc->
GetMid() );
851 int cSegTanEndSide = cSegTanEnd.
Side( theArc->
GetMid() );
852 int cSegChordSide = cSegChord.
Side( theArc->
GetMid() );
854 bool eatFirstMouseUp =
true;
866 std::vector<VECTOR2I> possiblePoints;
873 for(
const VECTOR2I& candidate : possiblePoints )
875 if( ( candidate -
m_cursor ).SquaredEuclideanNorm()
876 < ( closest -
m_cursor ).SquaredEuclideanNorm() )
905 if( isStartTrackOnStartPt )
908 trackOnStart->
SetEnd( newStart );
910 if( isEndTrackOnStartPt )
913 trackOnEnd->
SetEnd( newEnd );
916 getView()->Update( trackOnStart );
917 getView()->Update( trackOnEnd );
921 if( evt->IsMotion() || evt->IsDrag(
BUT_LEFT ) )
923 eatFirstMouseUp =
false;
925 else if( evt->IsCancelInteractive() || evt->IsActivate() )
927 restore_state =
true;
932 restore_state =
true;
941 eatFirstMouseUp =
false;
953 if( isStartTrackOnStartPt )
954 newStart = trackOnStart->
GetEnd();
956 if( isEndTrackOnStartPt )
957 newEnd = trackOnEnd->
GetEnd();
962 if( trackOnStart->
GetLength() <= maxLengthIU )
964 if( addedTracks.count( trackOnStart ) )
966 getView()->Remove( trackOnStart );
967 addedTracks.erase( trackOnStart );
972 commit.
Remove( trackOnStart );
978 if( trackOnEnd->
GetLength() <= maxLengthIU )
980 if( addedTracks.count( trackOnEnd ) )
982 getView()->Remove( trackOnEnd );
983 addedTracks.erase( trackOnEnd );
988 commit.
Remove( trackOnEnd );
1000 commit.
Add( added );
1007 commit.
Push(
_(
"Drag Arc Track" ) );
1019 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1024 aCollector.
Remove( item );
1052 new_width =
board()->GetDesignSettings().GetCurrentViaSize();
1053 new_drill =
board()->GetDesignSettings().GetCurrentViaDrill();
1056 via->SetDrill( new_drill );
1064 wxCHECK( track, 0 );
1068 int new_width =
board()->GetDesignSettings().GetCurrentTrackWidth();
1073 commit.
Push(
_(
"Edit Track Width/Via Size" ) );
1098 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1103 aCollector.
Remove( item );
1118 if( newLayer == origLayer )
1129 wxCHECK( track, 0 );
1137 commit.
Push(
_(
"Edit Track Layer" ) );
1154 static int filletRadius = 0;
1160 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1165 aCollector.
Remove( item );
1173 frame()->ShowInfoBarMsg(
_(
"At least two straight track segments must be selected." ) );
1189 bool t1Start =
true;
1190 bool t2Start =
true;
1193 std::vector<FILLET_OP> filletOperations;
1194 bool operationPerformedOnAtLeastOne =
false;
1195 bool didOneAttemptFail =
false;
1196 std::set<PCB_TRACK*> processedTracks;
1198 auto processFilletOp =
1199 [&](
PCB_TRACK* aTrack,
bool aStartPoint )
1201 std::shared_ptr<CONNECTIVITY_DATA> c =
board()->GetConnectivity();
1203 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
1207 if( itemsOnAnchor.size() > 0
1208 &&
selection.Contains( itemsOnAnchor.at( 0 ) )
1214 if( processedTracks.find( trackOther ) == processedTracks.end() )
1216 if( itemsOnAnchor.size() == 1 )
1219 filletOp.t1 = aTrack;
1220 filletOp.t2 = trackOther;
1221 filletOp.t1Start = aStartPoint;
1222 filletOp.t2Start = aTrack->
IsPointOnEnds( filletOp.t2->GetStart() );
1223 filletOperations.push_back( filletOp );
1229 didOneAttemptFail =
true;
1243 processFilletOp( track,
true );
1244 processFilletOp( track,
false );
1246 processedTracks.insert( track );
1252 std::vector<BOARD_ITEM*> itemsToAddToSelection;
1254 for( FILLET_OP filletOp : filletOperations )
1262 if( trackOnStart && trackOnEnd )
1265 if( ( trackOnStart || trackOnEnd ) && track1->
GetLayer() == track2->
GetLayer() )
1273 SHAPE_ARC sArc( t1Seg, t2Seg, filletRadius );
1276 auto setIfPointOnSeg =
1279 VECTOR2I segToVec = aSegment.NearestPoint( aVecToTest ) - aVecToTest;
1284 aPointToSet.
x = aVecToTest.x;
1285 aPointToSet.
y = aVecToTest.y;
1293 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP0() )
1294 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP0() ) )
1296 didOneAttemptFail =
true;
1300 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP1() )
1301 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP1() ) )
1303 didOneAttemptFail =
true;
1315 itemsToAddToSelection.push_back( tArc );
1320 if( filletOp.t1Start )
1323 track1->
SetEnd( t1newPoint );
1325 if( filletOp.t2Start )
1328 track2->
SetEnd( t2newPoint );
1330 operationPerformedOnAtLeastOne =
true;
1334 commit.
Push(
_(
"Fillet Tracks" ) );
1337 for(
BOARD_ITEM* item : itemsToAddToSelection )
1340 if( !operationPerformedOnAtLeastOne )
1341 frame()->ShowInfoBarMsg(
_(
"Unable to fillet the selected track segments." ) );
1342 else if( didOneAttemptFail )
1343 frame()->ShowInfoBarMsg(
_(
"Some of the track segments could not be filleted." ) );
1359 int& aPersitentRadius )
1364 return std::nullopt;
1368 return aPersitentRadius;
1372static std::optional<DOGBONE_CORNER_ROUTINE::PARAMETERS>
1381 std::vector<WX_MULTI_ENTRY_DIALOG::ENTRY> entries{
1388 _(
"Add slots in acute corners" ),
1390 _(
"Add slots in acute corners to allow access to a cutter of the given radius" ),
1397 return std::nullopt;
1399 std::vector<WX_MULTI_ENTRY_DIALOG::RESULT> results = dlg.
GetValues();
1400 wxCHECK( results.size() == 2, std::nullopt );
1404 s_dogBoneParams.DogboneRadiusIU = std::get<long long int>( results[0] );
1405 s_dogBoneParams.AddSlots = std::get<bool>( results[1] );
1407 catch(
const std::bad_variant_access& )
1410 return std::nullopt;
1413 return s_dogBoneParams;
1427 const int default_setback =
pcbIUScale.mmToIU( 1 );
1429 static CHAMFER_PARAMS params{ default_setback, default_setback };
1432 params.m_chamfer_setback_a );
1435 return std::nullopt;
1437 params.m_chamfer_setback_a = dlg.
GetValue();
1440 params.m_chamfer_setback_b = params.m_chamfer_setback_a;
1451 std::vector<VECTOR2I> pts;
1454 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1460 if( !item->
IsType( { PCB_SHAPE_LOCATE_SEGMENT_T,
1461 PCB_SHAPE_LOCATE_POLY_T,
1462 PCB_SHAPE_LOCATE_RECT_T } ) )
1464 aCollector.
Remove( item );
1471 std::set<PCB_SHAPE*> lines_to_add;
1472 std::vector<PCB_SHAPE*> items_to_remove;
1476 std::vector<VECTOR2I> pts;
1483 items_to_remove.push_back( graphic );
1486 pts.emplace_back( start );
1488 pts.emplace_back(
end );
1494 items_to_remove.push_back( graphic );
1496 for(
int jj = 0; jj < graphic->
GetPolyShape().VertexCount(); ++jj )
1500 for(
size_t jj = 1; jj < pts.size(); ++jj )
1508 lines_to_add.insert( line );
1511 if( pts.size() > 1 )
1516 line->
SetEnd( pts.front() );
1519 lines_to_add.insert( line );
1527 frame()->ShowInfoBarMsg(
_(
"Exactly two lines must be selected to extend them." ) );
1534 else if( segmentCount < 2 )
1536 frame()->ShowInfoBarMsg(
_(
"A shape with at least two lines must be selected." ) );
1554 for(
PCB_SHAPE* item : items_to_remove )
1565 std::vector<BOARD_ITEM*> items_to_select_on_success;
1568 std::vector<BOARD_ITEM*> items_to_deselect_on_success;
1573 auto item_modification_handler =
1580 items_to_select_on_success.push_back( &aItem );
1584 bool any_items_created = !lines_to_add.empty();
1585 auto item_creation_handler =
1586 [&]( std::unique_ptr<BOARD_ITEM> aItem )
1588 any_items_created =
true;
1589 items_to_select_on_success.push_back( aItem.get() );
1590 commit.
Add( aItem.release() );
1593 bool any_items_removed = !items_to_remove.empty();
1594 auto item_removal_handler =
1598 any_items_removed =
true;
1599 items_to_deselect_on_success.push_back( &aItem );
1605 item_creation_handler, item_modification_handler, item_removal_handler );
1608 std::unique_ptr<PAIRWISE_LINE_ROUTINE> pairwise_line_routine;
1612 static int s_filletRadius =
pcbIUScale.mmToIU( 1 );
1613 std::optional<int> filletRadiusIU =
1616 if( filletRadiusIU.has_value() )
1618 pairwise_line_routine = std::make_unique<LINE_FILLET_ROUTINE>(
1619 frame()->GetModel(), change_handler, *filletRadiusIU );
1624 std::optional<DOGBONE_CORNER_ROUTINE::PARAMETERS> dogboneParams =
1627 if( dogboneParams.has_value() )
1629 pairwise_line_routine = std::make_unique<DOGBONE_CORNER_ROUTINE>(
1630 frame()->GetModel(), change_handler, *dogboneParams );
1637 if( chamfer_params.has_value() )
1639 pairwise_line_routine = std::make_unique<LINE_CHAMFER_ROUTINE>(
frame()->GetModel(),
1646 pairwise_line_routine = std::make_unique<LINE_EXTENSION_ROUTINE>(
frame()->GetModel(),
1650 if( !pairwise_line_routine )
1661 if( ( a->GetFlags() & STRUCT_DELETED ) == 0
1662 && ( b->GetFlags() & STRUCT_DELETED ) == 0 )
1664 PCB_SHAPE* line_a = static_cast<PCB_SHAPE*>( a );
1665 PCB_SHAPE* line_b = static_cast<PCB_SHAPE*>( b );
1667 pairwise_line_routine->ProcessLinePair( *line_a, *line_b );
1672 for(
BOARD_ITEM* item : items_to_select_on_success )
1673 m_selectionTool->AddItemToSel( item,
true );
1676 for(
BOARD_ITEM* item : items_to_deselect_on_success )
1677 m_selectionTool->RemoveItemFromSel( item,
true );
1679 if( any_items_removed )
1682 if( any_items_created )
1688 commit.Push( pairwise_line_routine->GetCommitDescription() );
1690 if(
const std::optional<wxString> msg = pairwise_line_routine->GetStatusMessage( segmentCount ) )
1691 frame()->ShowInfoBarMsg( *msg );
1702 std::vector<VECTOR2I> pts;
1705 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1709 if( !item->
IsType( { PCB_SHAPE_LOCATE_POLY_T, PCB_ZONE_T } ) )
1710 aCollector.
Remove( item );
1714 if( zone->IsTeardropArea() )
1715 aCollector.
Remove( item );
1723 static int s_toleranceValue =
pcbIUScale.mmToIU( 3 );
1733 if( s_toleranceValue <= 0 )
1738 std::vector<PCB_SHAPE*> shapeList;
1742 commit.Modify( item );
1759 commit.
Push(
_(
"Simplify Polygons" ) );
1773 std::vector<VECTOR2I> pts;
1776 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1782 if( !item->
IsType( { PCB_SHAPE_LOCATE_SEGMENT_T, PCB_SHAPE_LOCATE_ARC_T,
1783 PCB_SHAPE_LOCATE_BEZIER_T } ) )
1785 aCollector.
Remove( item );
1793 static int s_toleranceValue =
pcbIUScale.mmToIU( 3 );
1803 if( s_toleranceValue <= 0 )
1808 std::vector<PCB_SHAPE*> shapeList;
1814 shapeList.push_back( shape );
1815 commit.Modify( shape );
1821 commit.Push(
_(
"Heal Shapes" ) );
1836 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1840 static const std::vector<KICAD_T> polygonBooleanTypes = {
1846 if( !item->
IsType( polygonBooleanTypes ) )
1847 aCollector.
Remove( item );
1856 std::vector<PCB_SHAPE*> items_to_process;
1860 items_to_process.push_back(
static_cast<PCB_SHAPE*
>( item ) );
1865 if( item == last_item )
1866 std::swap( items_to_process.back(), items_to_process.front() );
1872 auto item_modification_handler =
1875 commit.Modify( &aItem );
1878 std::vector<BOARD_ITEM*> items_to_select_on_success;
1880 auto item_creation_handler =
1881 [&]( std::unique_ptr<BOARD_ITEM> aItem )
1883 items_to_select_on_success.push_back( aItem.get() );
1884 commit.Add( aItem.release() );
1887 auto item_removal_handler =
1890 commit.Remove( &aItem );
1895 item_modification_handler,
1896 item_removal_handler );
1899 std::unique_ptr<POLYGON_BOOLEAN_ROUTINE> boolean_routine;
1901 const auto create_routine = [&]() -> std::unique_ptr<POLYGON_BOOLEAN_ROUTINE>
1908 wxCHECK( model,
nullptr );
1912 return std::make_unique<POLYGON_MERGE_ROUTINE>( model, change_handler );
1916 return std::make_unique<POLYGON_SUBTRACT_ROUTINE>( model, change_handler );
1920 return std::make_unique<POLYGON_INTERSECT_ROUTINE>( model, change_handler );
1925 const auto run_routine = [&]()
1928 for(
PCB_SHAPE* shape : items_to_process )
1929 boolean_routine->ProcessShape( *shape );
1931 boolean_routine->Finalize();
1934 boolean_routine = create_routine();
1936 wxCHECK_MSG( boolean_routine, 0,
"Could not find a polygon routine for this action" );
1943 if( !boolean_routine->IsCommutative() && items_to_select_on_success.empty() )
1947 items_to_select_on_success.clear();
1949 std::map<const PCB_SHAPE*, VECTOR2I::extended_type> items_area;
1951 for(
PCB_SHAPE* shape : items_to_process )
1954 items_area[shape] = area;
1963 std::sort( items_to_process.begin(), items_to_process.end(),
1966 return items_area[a] > items_area[b];
1970 boolean_routine = create_routine();
1975 for(
BOARD_ITEM* item : items_to_select_on_success )
1981 commit.Push( boolean_routine->GetCommitDescription() );
1983 if(
const std::optional<wxString> msg = boolean_routine->GetStatusMessage() )
1984 frame()->ShowInfoBarMsg( *msg );
2006 std::vector<PCB_TABLECELL*> cells;
2056 for(
EDA_ITEM* eda_item : selCopy )
2058 if( !eda_item->IsBOARD_ITEM() )
2091 commit = &localCommit;
2112 std::optional<VECTOR2I> oldRefPt;
2117 oldRefPt =
selection.GetReferencePoint();
2141 bool usePcbShapeCenter =
false;
2148 usePcbShapeCenter =
true;
2155 else if( usePcbShapeCenter )
2167 if(
frame()->GetCanvas()->GetView()->GetGAL()->IsFlippedX() )
2168 rotateAngle = -rotateAngle;
2174 viewBBox.
Merge( item->ViewBBox() );
2183 typedef std::numeric_limits<int> coord_limits;
2188 bool outOfBounds = rotPos.
x < min || rotPos.
x > max || rotPos.
y < min || rotPos.
y > max
2189 || rotEnd.
x < min || rotEnd.
x > max || rotEnd.
y < min || rotEnd.
y > max;
2197 if( item->IsBOARD_ITEM() )
2201 board_item->
Rotate( refPt, rotateAngle );
2205 static_cast<FOOTPRINT*
>( board_item )->InvalidateComponentClassCache();
2209 if( !localCommit.
Empty() )
2210 localCommit.
Push(
_(
"Rotate" ) );
2227 selection.SetReferencePoint( *oldRefPt );
2245 MIRROR( tmpPt, aMirrorPoint, aFlipDirection );
2288 commit = &localCommit;
2316 switch( item->Type() )
2319 static_cast<PCB_SHAPE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2323 static_cast<ZONE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2328 static_cast<PCB_TEXT*
>( item )->
Mirror( mirrorPoint, flipDirection );
2340 mirrorPad( *
static_cast<PAD*
>( item ), mirrorPoint, flipDirection );
2346 static_cast<PCB_TRACK*
>( item )->
Mirror( mirrorPoint, flipDirection );
2350 static_cast<PCB_GROUP*
>( item )->
Mirror( mirrorPoint, flipDirection );
2358 static_cast<PCB_POINT*
>( item )->
Mirror( mirrorPoint, flipDirection );
2367 if( !localCommit.
Empty() )
2368 localCommit.
Push(
_(
"Mirror" ) );
2397 commit = &localCommit;
2425 setJustify(
static_cast<PCB_TEXT*
>( item ) );
2434 if( !localCommit.
Empty() )
2437 localCommit.
Push(
_(
"Left Justify" ) );
2439 localCommit.
Push(
_(
"Center Justify" ) );
2441 localCommit.
Push(
_(
"Right Justify" ) );
2471 commit = &localCommit;
2486 std::optional<VECTOR2I> oldRefPt;
2489 oldRefPt =
selection.GetReferencePoint();
2513 if( !item->IsBOARD_ITEM() )
2520 boardItem->
Flip( refPt, flipDirection );
2524 static_cast<FOOTPRINT*
>( boardItem )->InvalidateComponentClassCache();
2527 if( !localCommit.
Empty() )
2528 localCommit.
Push(
_(
"Change Side / Flip" ) );
2544 selection.SetReferencePoint( *oldRefPt );
2556 int commitFlags = 0;
2561 int itemsDeleted = 0;
2562 int fieldsHidden = 0;
2563 int fieldsAlreadyHidden = 0;
2567 if( !item->IsBOARD_ITEM() )
2573 switch( item->Type() )
2579 wxASSERT( parentFP );
2580 commit.
Modify( parentFP );
2589 fieldsAlreadyHidden++;
2592 getView()->Update( parentFP );
2608 commit.
Remove( board_item );
2614 commit.
Modify( board_item );
2615 static_cast<PCB_TABLECELL*
>( board_item )->SetText( wxEmptyString );
2627 commit.
Remove( board_item );
2634 commit.
Remove( board_item );
2644 if( !aIsCut && aItems.
GetSize() == 1 )
2647 ZONE* zone =
static_cast<ZONE*
>( board_item );
2649 int outlineIdx, holeIdx;
2670 commit.
Remove( board_item );
2681 commit.Push(
_(
"Delete" ), commitFlags );
2689 commit.
Remove( board_item );
2697 commit.
Remove( board_item );
2706 if( enteredGroup && enteredGroup->
GetItems().empty() )
2711 commit.
Push(
_(
"Cut" ), commitFlags );
2713 else if( itemsDeleted == 0 )
2715 if( fieldsHidden == 1 )
2716 commit.
Push(
_(
"Hide Field" ), commitFlags );
2717 else if( fieldsHidden > 1 )
2718 commit.
Push(
_(
"Hide Fields" ), commitFlags );
2719 else if( fieldsAlreadyHidden > 0 )
2720 editFrame->
ShowInfoBarError(
_(
"Use the Footprint Properties dialog to remove fields." ) );
2724 commit.
Push(
_(
"Delete" ), commitFlags );
2735 std::vector<BOARD_ITEM*> lockedItems;
2827 if( ret == wxID_OK )
2835 selCenter += translation;
2837 if( !
frame()->GetPcbNewSettings()->m_Display.m_DisplayInvertYAxis )
2838 rotation = -rotation;
2842 if( !item->IsBOARD_ITEM() )
2850 boardItem->
Move( translation );
2852 switch( rotationAnchor )
2858 boardItem->
Rotate( selCenter, angle );
2861 boardItem->
Rotate(
frame()->GetScreen()->m_LocalOrigin, angle );
2864 boardItem->
Rotate(
board()->GetDesignSettings().GetAuxOrigin(), angle );
2869 getView()->Update( boardItem );
2872 commit.
Push(
_(
"Move Exactly" ) );
2928 std::vector<BOARD_ITEM*> new_items;
2935 if( !item->IsBOARD_ITEM() )
2947 switch( orig_item->
Type() )
2966 dupe_item = parentFootprint->
DuplicateItem(
true, &commit, orig_item );
2968 dupe_item = orig_item->
Duplicate(
true, &commit );
2974 new_items.push_back( dupe_item );
2975 commit.
Add( dupe_item );
2985 dupe_item = parentFootprint->
DuplicateItem(
true, &commit, orig_item );
2987 if( increment &&
static_cast<PAD*
>( dupe_item )->CanHaveNumber() )
2993 static_cast<PAD*
>( dupe_item )->SetNumber( padNumber );
3000 new_items.push_back( dupe_item );
3001 commit.
Add( dupe_item );
3010 dupe_item =
static_cast<PCB_GROUP*
>( orig_item )->DeepDuplicate(
true, &commit );
3016 new_items.push_back( aItem );
3017 commit.
Add( aItem );
3022 new_items.push_back( dupe_item );
3023 commit.
Add( dupe_item );
3037 EDA_ITEMS nItems( new_items.begin(), new_items.end() );
3043 editFrame->
DisplayToolMsg( wxString::Format(
_(
"Duplicated %d item(s)" ), (
int) new_items.size() ) );
3047 commit.
Push(
_(
"Duplicate" ) );
3065 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3067 switch( aCollector[i]->Type() )
3097 commit = &localCommit;
3101 switch( item->Type() )
3111 if( !
pad.CanHaveNumber() )
3115 std::optional<wxString> newNumber = incrementer.Increment(
pad.GetNumber(), param.
Delta, param.
Index );
3120 pad.SetNumber( *newNumber );
3129 std::optional<wxString> newText = incrementer.Increment(
text.GetText(), param.
Delta, param.
Index );
3134 text.SetText( *newText );
3147 commit->
Push(
_(
"Increment" ) );
3155 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3157 if( aCollector[i]->Type() !=
PCB_PAD_T )
3165 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3176 if( aSelection.
Empty() )
3200 BOX2I nonFieldsBBox;
3204 if( !item->IsType( { PCB_TEXT_T, PCB_FIELD_T } ) )
3205 nonFieldsBBox.
Merge( item->GetBoundingBox() );
3220 const wxString& aCanceledMessage,
VECTOR2I& aReferencePoint )
3224 std::optional<VECTOR2I> pickedPoint;
3234 const auto setPickerLayerSet =
3241 layerFilter =
LSET( { editFrame->GetActiveLayer() } );
3249 setPickerLayerSet();
3252 [&](
const VECTOR2D& aPoint ) ->
bool
3254 pickedPoint = aPoint;
3256 if( !aSuccessMessage.empty() )
3278 if( !aCanceledMessage.empty() )
3290 [&](
const int& aFinalState )
3309 setPickerLayerSet();
3312 evt->SetPassEvent();
3323 canvas()->SetStatusPopup(
nullptr );
3327 aReferencePoint = *pickedPoint;
3329 return pickedPoint.has_value();
3338 "pcbnew.InteractiveEdit.selectReferencePoint",
3341 frame()->PushTool( selectReferencePoint );
3356 std::vector<BOARD_ITEM*> items;
3360 if( item->IsBOARD_ITEM() )
3361 items.push_back(
static_cast<BOARD_ITEM*
>( item ) );
3369 _(
"Selection copied" ),
_(
"Copy canceled" ), refPoint ) )
3371 frame()->PopTool( selectReferencePoint );
3380 selection.SetReferencePoint( refPoint );
3384 frame()->SetStatusText(
_(
"Selection copied" ) );
3387 frame()->PopTool( selectReferencePoint );
3407 const auto getItemText = [&](
const BOARD_ITEM& aItem ) -> wxString
3409 switch( aItem.Type() )
3421 return text.GetShownText(
true );
3435 for(
int row = 0; row <
table.GetRowCount(); ++row )
3437 for(
int col = 0; col <
table.GetColCount(); ++col )
3442 if( col <
table.GetColCount() - 1 )
3448 if( row <
table.GetRowCount() - 1 )
3459 return wxEmptyString;
3462 wxArrayString itemTexts;
3466 if( item->IsBOARD_ITEM() )
3469 wxString itemText = getItemText( *boardItem );
3471 itemText.Trim(
false ).Trim(
true );
3473 if( !itemText.IsEmpty() )
3475 itemTexts.Add( std::move( itemText ) );
3481 if( !itemTexts.empty() )
3483 SaveClipboard( wxJoin( itemTexts,
'\n',
'\0' ).ToStdString() );
3508 board()->BuildConnectivity();
3510 canvas()->RedrawRatsnest();
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.
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.
FOOTPRINT * GetFirstFootprint() const
Get the first footprint on the board or nullptr.
const FOOTPRINTS & Footprints() const
constexpr const Vec & GetPosition() const
constexpr const Vec GetEnd() const
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
constexpr const Vec GetCenter() const
constexpr bool IsValid() const
Represent basic circle geometry with utility geometry functions.
VECTOR2I Center
Public to make access simpler.
int Radius
Public to make access simpler.
CIRCLE & ConstructFromTanTanPt(const SEG &aLineA, const SEG &aLineB, const VECTOR2I &aP)
Construct this circle such that it is tangent to the given segments and passes through the given poin...
VECTOR2I NearestPoint(const VECTOR2I &aP) const
Compute the point on the circumference of the circle that is the closest to aP.
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
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 bool IsType(const std::vector< KICAD_T > &aScanTypes) const
Check whether the item is one of the listed types.
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,...
bool IsBOARD_ITEM() const
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
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
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.
A PCB_POINT is a 0-dimensional point that is used to mark a position on a PCB, or more usually a foot...
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
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 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 SetReferencePoint(const VECTOR2I &aP)
bool Empty() const
Checks if there is anything selected.
bool HasReferencePoint() const
size_t CountType(KICAD_T aType) 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.
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, 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.
@ LEFT_RIGHT
Flip left to right (around the Y axis)
@ TOP_BOTTOM
Flip top to bottom (around the X axis)
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.
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.
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_POINT_T
class PCB_POINT, a 0-dimensional point
@ 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
Casted dyn_cast(From aObject)
A lightweight dynamic downcast.
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D