64using namespace std::placeholders;
66#include <wx/hyperlink.h>
71#include <dialogs/dialog_tablecell_properties.h>
72#include <dialogs/dialog_table_properties.h>
109 m_selectionTool( nullptr ),
119 m_statusPopup = std::make_unique<STATUS_TEXT_POPUP>( getEditFrame<PCB_BASE_EDIT_FRAME>() );
125 auto menu = std::make_shared<CONDITIONAL_MENU>( aTool );
128 menu->SetTitle(
_(
"Positioning Tools" ) );
130 auto notMovingCondition = [](
const SELECTION& aSelection )
132 return aSelection.Empty() || !aSelection.Front()->IsMoving();
148 auto menu = std::make_shared<CONDITIONAL_MENU>( aTool );
150 menu->SetTitle(
_(
"Shape Modification" ) );
168 auto hasCornerCondition =
176 auto hasMidpointCondition =
220 auto positioningToolsCondition =
224 subMenu->Evaluate( aSel );
225 return subMenu->GetMenuItemCount() > 0;
228 auto shapeModificationCondition =
232 subMenu->Evaluate( aSel );
233 return subMenu->GetMenuItemCount() > 0;
236 auto propertiesCondition =
239 if( aSel.GetSize() == 0 )
253 if( aSel.GetSize() == 1 )
265 auto inFootprintEditor =
289 auto multipleFootprintsCondition =
292 bool foundFirst =
false;
308 auto noActiveToolCondition =
311 return frame()->ToolStackIsEmpty();
314 auto notMovingCondition =
317 return aSelection.Empty() || !aSelection.Front()->IsMoving();
320 auto noItemsCondition =
321 [ this ](
const SELECTION& aSelections ) ->
bool
323 return frame()->GetBoard() && !
frame()->GetBoard()->IsEmpty();
351 && notMovingCondition );
354 && notMovingCondition
355 && !inFootprintEditor );
357 && notMovingCondition );
379 && !inFootprintEditor );
391 menu.AddSeparator( 100 );
392 menu.AddMenu( shapeModificationSubMenu.get(), shapeModificationCondition, 100 );
393 menu.AddMenu( positioningToolsSubMenu.get(), positioningToolsCondition, 100 );
395 menu.AddSeparator( 150 );
407 menu.AddSeparator( 150 );
423 wxString footprintName;
424 wxArrayString fplist;
429 fplist.Add( fp->GetReference() + wxT(
" ( " ) + fp->GetValue() + wxT(
" )" ) );
439 footprintName.Trim(
true );
440 footprintName.Trim(
false );
442 if( !footprintName.IsEmpty() )
446 if( fp->GetReference().CmpNoCase( footprintName ) == 0 )
546 std::vector<PCB_TRACK*> tracks;
547 std::vector<PCB_TRACK*> vias;
548 std::vector<FOOTPRINT*> footprints;
555 vias.push_back( track );
557 tracks.push_back( track );
565 if( footprints.size() == (
unsigned) aCollector.GetCount() )
569 else if( tracks.size() || vias.size() )
574 if( aCollector.GetCount() > 1 )
575 sTool->GuessSelectionCandidates( aCollector, aPt );
582 auto connected = []( PCB_TRACK* track, const VECTOR2I& pt )
584 return track->GetStart() == pt || track->GetEnd() == pt;
587 if( tracks.size() == 2 && vias.size() == 0 )
589 if( connected( tracks[0], tracks[1]->GetStart() )
590 || connected( tracks[0], tracks[1]->GetEnd() ) )
592 aCollector.Remove( tracks[1] );
595 else if( tracks.size() == 2 && vias.size() == 1 )
597 if( connected( tracks[0], vias[0]->GetPosition() )
598 && connected( tracks[1], vias[0]->GetPosition() ) )
600 aCollector.Remove( tracks[0] );
601 aCollector.Remove( tracks[1] );
608 if( selection.Empty() )
611 if( selection.Size() == 1 && selection.Front()->Type() ==
PCB_ARC_T )
615 return DragArcTrack( aEvent );
619 invokeInlineRouter( mode );
638 wxString msg = wxString::Format(
_(
"Unable to resize arc tracks of %s or greater." ),
640 frame()->ShowInfoBarError( msg );
653 bool restore_state =
false;
667 tanStart.
A = *tanIntersect;
669 tanEnd.
A = *tanIntersect;
672 std::set<PCB_TRACK*> addedTracks;
674 auto getUniqueTrackAtAnchorCollinear =
680 int allowedDeviation = theArc->
GetWidth();
682 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
684 for(
int i = 0; i < 3; i++ )
686 itemsOnAnchor = conn->GetConnectedItemsAtAnchor( theArc, aAnchor,
689 allowedDeviation /= 2;
691 if( itemsOnAnchor.size() == 1 )
697 if( itemsOnAnchor.size() == 1 && itemsOnAnchor.front()->Type() ==
PCB_TRACE_T )
699 track =
static_cast<PCB_TRACK*
>( itemsOnAnchor.front() );
705 if( trackSeg.
Angle( aCollinearSeg ) > maxTangentDeviation )
722 addedTracks.insert( track );
728 PCB_TRACK* trackOnStart = getUniqueTrackAtAnchorCollinear( theArc->
GetStart(), tanStart);
729 PCB_TRACK* trackOnEnd = getUniqueTrackAtAnchorCollinear( theArc->
GetEnd(), tanEnd );
734 tanStart.
B = trackOnStart->
GetEnd();
740 tanEnd.
B = trackOnEnd->
GetEnd();
744 if( tanIntersect = tanStart.
IntersectLines( tanEnd ); !tanIntersect )
747 auto isTrackStartClosestToArcStart =
750 double trackStartToArcStart = aTrack->GetStart().
Distance( theArc->
GetStart() );
751 double trackEndToArcStart = aTrack->GetEnd().Distance( theArc->
GetStart() );
753 return trackStartToArcStart < trackEndToArcStart;
756 bool isStartTrackOnStartPt = isTrackStartClosestToArcStart( trackOnStart );
757 bool isEndTrackOnStartPt = isTrackStartClosestToArcStart( trackOnEnd );
786 auto getFurthestPointToTanInterstect =
789 if( ( aPointA - *tanIntersect ).EuclideanNorm()
790 > ( aPointB - *tanIntersect ).EuclideanNorm() )
801 VECTOR2I tanStartPoint = getFurthestPointToTanInterstect( tanStart.
A, tanStart.
B );
802 VECTOR2I tanEndPoint = getFurthestPointToTanInterstect( tanEnd.
A, tanEnd.
B );
803 VECTOR2I tempTangentPoint = tanEndPoint;
805 if( getFurthestPointToTanInterstect( tanStartPoint, tanEndPoint ) == tanEndPoint )
806 tempTangentPoint = tanStartPoint;
812 SEG cSegTanStart( maxTanPtStart, *tanIntersect );
813 SEG cSegTanEnd( maxTanPtEnd, *tanIntersect );
814 SEG cSegChord( maxTanPtStart, maxTanPtEnd );
816 int cSegTanStartSide = cSegTanStart.
Side( theArc->
GetMid() );
817 int cSegTanEndSide = cSegTanEnd.
Side( theArc->
GetMid() );
818 int cSegChordSide = cSegChord.
Side( theArc->
GetMid() );
820 bool eatFirstMouseUp =
true;
832 std::vector<VECTOR2I> possiblePoints;
839 for(
const VECTOR2I& candidate : possiblePoints )
841 if( ( candidate -
m_cursor ).SquaredEuclideanNorm()
842 < ( closest -
m_cursor ).SquaredEuclideanNorm() )
871 if( isStartTrackOnStartPt )
874 trackOnStart->
SetEnd( newStart );
876 if( isEndTrackOnStartPt )
879 trackOnEnd->
SetEnd( newEnd );
887 if( evt->IsMotion() || evt->IsDrag(
BUT_LEFT ) )
889 eatFirstMouseUp =
false;
891 else if( evt->IsCancelInteractive() || evt->IsActivate() )
893 restore_state =
true;
898 restore_state =
true;
907 eatFirstMouseUp =
false;
919 if( isStartTrackOnStartPt )
920 newStart = trackOnStart->
GetEnd();
922 if( isEndTrackOnStartPt )
923 newEnd = trackOnEnd->
GetEnd();
928 if( trackOnStart->
GetLength() <= maxLengthIU )
930 if( addedTracks.count( trackOnStart ) )
933 addedTracks.erase( trackOnStart );
938 commit.
Remove( trackOnStart );
944 if( trackOnEnd->
GetLength() <= maxLengthIU )
946 if( addedTracks.count( trackOnEnd ) )
949 addedTracks.erase( trackOnEnd );
954 commit.
Remove( trackOnEnd );
973 commit.
Push(
_(
"Drag Arc Track" ) );
985 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
987 BOARD_ITEM* item = aCollector[ i ];
989 if( !dynamic_cast<PCB_TRACK*>( item ) )
990 aCollector.Remove( item );
1008 if(
via->GetViaType() == VIATYPE::MICROVIA )
1021 via->SetDrill( new_drill );
1029 wxCHECK( track, 0 );
1038 commit.
Push(
_(
"Edit Track Width/Via Size" ) );
1055 static int filletRadius = 0;
1061 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1063 BOARD_ITEM* item = aCollector[i];
1065 if( !dynamic_cast<PCB_TRACK*>( item ) )
1066 aCollector.Remove( item );
1071 if( selection.
Size() < 2 )
1073 frame()->ShowInfoBarMsg(
_(
"At least two straight track segments must be selected." ) );
1089 bool t1Start =
true;
1090 bool t2Start =
true;
1093 std::vector<FILLET_OP> filletOperations;
1094 bool operationPerformedOnAtLeastOne =
false;
1095 bool didOneAttemptFail =
false;
1096 std::set<PCB_TRACK*> processedTracks;
1098 auto processFilletOp =
1099 [&](
PCB_TRACK* aTrack,
bool aStartPoint )
1103 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
1107 if( itemsOnAnchor.size() > 0
1108 && selection.
Contains( itemsOnAnchor.at( 0 ) )
1114 if( processedTracks.find( trackOther ) == processedTracks.end() )
1116 if( itemsOnAnchor.size() == 1 )
1119 filletOp.t1 = aTrack;
1120 filletOp.t2 = trackOther;
1121 filletOp.t1Start = aStartPoint;
1122 filletOp.t2Start = aTrack->
IsPointOnEnds( filletOp.t2->GetStart() );
1123 filletOperations.push_back( filletOp );
1129 didOneAttemptFail =
true;
1143 processFilletOp( track,
true );
1144 processFilletOp( track,
false );
1146 processedTracks.insert( track );
1152 std::vector<BOARD_ITEM*> itemsToAddToSelection;
1154 for( FILLET_OP filletOp : filletOperations )
1162 if( trackOnStart && trackOnEnd )
1165 if( ( trackOnStart || trackOnEnd ) && track1->
GetLayer() == track2->
GetLayer() )
1173 SHAPE_ARC sArc( t1Seg, t2Seg, filletRadius );
1176 auto setIfPointOnSeg =
1179 VECTOR2I segToVec = aSegment.NearestPoint( aVecToTest ) - aVecToTest;
1184 aPointToSet.
x = aVecToTest.x;
1185 aPointToSet.
y = aVecToTest.y;
1193 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP0() )
1194 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP0() ) )
1196 didOneAttemptFail =
true;
1200 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP1() )
1201 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP1() ) )
1203 didOneAttemptFail =
true;
1215 itemsToAddToSelection.push_back( tArc );
1220 if( filletOp.t1Start )
1223 track1->
SetEnd( t1newPoint );
1225 if( filletOp.t2Start )
1228 track2->
SetEnd( t2newPoint );
1230 operationPerformedOnAtLeastOne =
true;
1234 commit.
Push(
_(
"Fillet Tracks" ) );
1237 for(
BOARD_ITEM* item : itemsToAddToSelection )
1240 if( !operationPerformedOnAtLeastOne )
1241 frame()->ShowInfoBarMsg(
_(
"Unable to fillet the selected track segments." ) );
1242 else if( didOneAttemptFail )
1243 frame()->ShowInfoBarMsg(
_(
"Some of the track segments could not be filleted." ) );
1259 int& aPersitentRadius )
1264 return std::nullopt;
1268 return aPersitentRadius;
1272static std::optional<DOGBONE_CORNER_ROUTINE::PARAMETERS>
1281 std::vector<WX_MULTI_ENTRY_DIALOG::ENTRY> entries{
1288 _(
"Add slots in acute corners" ),
1290 _(
"Add slots in acute corners to allow access to a cutter of the given radius" ),
1297 return std::nullopt;
1299 std::vector<WX_MULTI_ENTRY_DIALOG::RESULT> results = dlg.
GetValues();
1300 wxCHECK( results.size() == 2, std::nullopt );
1304 s_dogBoneParams.DogboneRadiusIU = std::get<long long int>( results[0] );
1305 s_dogBoneParams.AddSlots = std::get<bool>( results[1] );
1307 catch(
const std::bad_variant_access& )
1310 return std::nullopt;
1313 return s_dogBoneParams;
1329 static CHAMFER_PARAMS params{ default_setback, default_setback };
1332 params.m_chamfer_setback_a );
1335 return std::nullopt;
1337 params.m_chamfer_setback_a = dlg.
GetValue();
1340 params.m_chamfer_setback_b = params.m_chamfer_setback_a;
1351 std::vector<VECTOR2I> pts;
1354 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1356 BOARD_ITEM* item = aCollector[i];
1360 if( !item->IsType( { PCB_SHAPE_LOCATE_SEGMENT_T,
1361 PCB_SHAPE_LOCATE_POLY_T,
1362 PCB_SHAPE_LOCATE_RECT_T } ) )
1364 aCollector.
Remove( item );
1370 std::set<PCB_SHAPE*> lines_to_add;
1371 std::vector<PCB_SHAPE*> items_to_remove;
1375 std::vector<VECTOR2I> pts;
1382 items_to_remove.push_back( graphic );
1385 pts.emplace_back( start );
1386 pts.emplace_back(
VECTOR2I( end.x, start.y ) );
1387 pts.emplace_back( end );
1388 pts.emplace_back(
VECTOR2I( start.x, end.y ) );
1393 items_to_remove.push_back( graphic );
1395 for(
int jj = 0; jj < graphic->
GetPolyShape().VertexCount(); ++jj )
1399 for(
size_t jj = 1; jj < pts.size(); ++jj )
1407 lines_to_add.insert( line );
1410 if( pts.size() > 1 )
1415 line->
SetEnd( pts.front() );
1418 lines_to_add.insert( line );
1426 frame()->ShowInfoBarMsg(
_(
"Exactly two lines must be selected to extend them." ) );
1433 else if( segmentCount < 2 )
1435 frame()->ShowInfoBarMsg(
_(
"A shape with at least two lines must be selected." ) );
1449 selection.Add( item );
1453 for(
PCB_SHAPE* item : items_to_remove )
1455 selection.Remove( item );
1456 commit.Remove( item );
1464 std::vector<BOARD_ITEM*> items_to_select_on_success;
1467 std::vector<BOARD_ITEM*> items_to_deselect_on_success;
1472 auto item_modification_handler =
1478 commit.Modify( &aItem );
1479 items_to_select_on_success.push_back( &aItem );
1483 bool any_items_created = !lines_to_add.empty();
1484 auto item_creation_handler =
1485 [&]( std::unique_ptr<BOARD_ITEM> aItem )
1487 any_items_created =
true;
1488 items_to_select_on_success.push_back( aItem.get() );
1489 commit.Add( aItem.release() );
1492 bool any_items_removed = !items_to_remove.empty();
1493 auto item_removal_handler =
1497 any_items_removed =
true;
1498 items_to_deselect_on_success.push_back( &aItem );
1499 commit.Remove( &aItem );
1504 item_creation_handler, item_modification_handler, item_removal_handler );
1507 std::unique_ptr<PAIRWISE_LINE_ROUTINE> pairwise_line_routine;
1512 std::optional<int> filletRadiusIU =
1515 if( filletRadiusIU.has_value() )
1517 pairwise_line_routine = std::make_unique<LINE_FILLET_ROUTINE>(
1518 frame()->
GetModel(), change_handler, *filletRadiusIU );
1523 std::optional<DOGBONE_CORNER_ROUTINE::PARAMETERS> dogboneParams =
1526 if( dogboneParams.has_value() )
1528 pairwise_line_routine = std::make_unique<DOGBONE_CORNER_ROUTINE>(
1529 frame()->
GetModel(), change_handler, *dogboneParams );
1534 std::optional<CHAMFER_PARAMS> chamfer_params =
GetChamferParams( *frame() );
1536 if( chamfer_params.has_value() )
1538 pairwise_line_routine = std::make_unique<LINE_CHAMFER_ROUTINE>( frame()->
GetModel(),
1545 pairwise_line_routine = std::make_unique<LINE_EXTENSION_ROUTINE>( frame()->
GetModel(),
1549 if( !pairwise_line_routine )
1560 if( ( a->GetFlags() & STRUCT_DELETED ) == 0
1561 && ( b->GetFlags() & STRUCT_DELETED ) == 0 )
1563 PCB_SHAPE* line_a = static_cast<PCB_SHAPE*>( a );
1564 PCB_SHAPE* line_b = static_cast<PCB_SHAPE*>( b );
1566 pairwise_line_routine->ProcessLinePair( *line_a, *line_b );
1571 for(
BOARD_ITEM* item : items_to_select_on_success )
1572 m_selectionTool->AddItemToSel( item,
true );
1575 for(
BOARD_ITEM* item : items_to_deselect_on_success )
1576 m_selectionTool->RemoveItemFromSel( item,
true );
1578 if( any_items_removed )
1581 if( any_items_created )
1587 commit.Push( pairwise_line_routine->GetCommitDescription() );
1589 if(
const std::optional<wxString> msg = pairwise_line_routine->GetStatusMessage() )
1590 frame()->ShowInfoBarMsg( *msg );
1601 std::vector<VECTOR2I> pts;
1604 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1606 BOARD_ITEM* item = aCollector[i];
1608 if( !item->IsType( { PCB_SHAPE_LOCATE_POLY_T, PCB_ZONE_T } ) )
1609 aCollector.
Remove( item );
1611 if(
ZONE* zone = dyn_cast<ZONE*>( item ) )
1613 if( zone->IsTeardropArea() )
1614 aCollector.
Remove( item );
1626 if( dlg.ShowModal() == wxID_CANCEL )
1629 s_toleranceValue = dlg.GetValue();
1631 if( s_toleranceValue <= 0 )
1636 std::vector<PCB_SHAPE*> shapeList;
1642 if(
PCB_SHAPE* shape = dyn_cast<PCB_SHAPE*>( item ) )
1649 if(
ZONE* zone = dyn_cast<ZONE*>( item ) )
1657 commit.Push(
_(
"Simplify Polygons" ) );
1671 std::vector<VECTOR2I> pts;
1674 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1676 BOARD_ITEM* item = aCollector[i];
1680 if( !item->IsType( { PCB_SHAPE_LOCATE_SEGMENT_T, PCB_SHAPE_LOCATE_ARC_T,
1681 PCB_SHAPE_LOCATE_BEZIER_T } ) )
1683 aCollector.
Remove( item );
1695 if( dlg.ShowModal() == wxID_CANCEL )
1698 s_toleranceValue = dlg.GetValue();
1700 if( s_toleranceValue <= 0 )
1705 std::vector<PCB_SHAPE*> shapeList;
1706 std::vector<std::unique_ptr<PCB_SHAPE>> newShapes;
1712 shapeList.push_back( shape );
1719 std::vector<PCB_SHAPE*> items_to_select;
1721 for( std::unique_ptr<PCB_SHAPE>& ptr : newShapes )
1725 commit.Add( shape );
1726 items_to_select.push_back( shape );
1729 commit.Push(
_(
"Heal Shapes" ) );
1732 for(
PCB_SHAPE* item : items_to_select )
1733 m_selectionTool->AddItemToSel( item,
true );
1735 if( items_to_select.size() > 0 )
1751 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1753 BOARD_ITEM* item = aCollector[i];
1755 if( !item->IsType( {
1756 PCB_SHAPE_LOCATE_POLY_T,
1757 PCB_SHAPE_LOCATE_RECT_T,
1760 aCollector.
Remove( item );
1766 const EDA_ITEM*
const last_item = selection.GetLastAddedItem();
1769 std::vector<PCB_SHAPE*> items_to_process;
1773 items_to_process.push_back(
static_cast<PCB_SHAPE*
>( item ) );
1778 if( item == last_item )
1779 std::swap( items_to_process.back(), items_to_process.front() );
1785 auto item_modification_handler =
1791 std::vector<BOARD_ITEM*> items_to_select_on_success;
1793 auto item_creation_handler =
1794 [&]( std::unique_ptr<BOARD_ITEM> aItem )
1796 items_to_select_on_success.push_back( aItem.get() );
1797 commit.
Add( aItem.release() );
1800 auto item_removal_handler =
1808 item_creation_handler, item_modification_handler, item_removal_handler );
1811 std::unique_ptr<POLYGON_BOOLEAN_ROUTINE> boolean_routine;
1814 boolean_routine = std::make_unique<POLYGON_MERGE_ROUTINE>( frame()->
GetModel(),
1819 boolean_routine = std::make_unique<POLYGON_SUBTRACT_ROUTINE>( frame()->
GetModel(),
1824 boolean_routine = std::make_unique<POLYGON_INTERSECT_ROUTINE>( frame()->
GetModel(),
1829 wxASSERT_MSG(
false,
"Could not find a polygon routine for this action" );
1834 for(
PCB_SHAPE* shape : items_to_process )
1835 boolean_routine->ProcessShape( *shape );
1837 boolean_routine->Finalize();
1840 for(
BOARD_ITEM* item : items_to_select_on_success )
1841 m_selectionTool->AddItemToSel( item,
true );
1846 commit.Push( boolean_routine->GetCommitDescription() );
1848 if(
const std::optional<wxString> msg = boolean_routine->GetStatusMessage() )
1849 frame()->ShowInfoBarMsg( *msg );
1871 std::vector<PCB_TABLECELL*> cells;
1921 for(
EDA_ITEM* eda_item : selCopy )
1923 if( !eda_item->IsBOARD_ITEM() )
1950 commit = &localCommit;
1965 if( selection.
Empty() )
1968 std::optional<VECTOR2I> oldRefPt;
1969 bool is_hover = selection.
IsHover();
1991 if( selection.
Empty() )
2008 if(
frame()->GetCanvas()->GetView()->GetGAL()->IsFlippedX() )
2009 rotateAngle = -rotateAngle;
2015 viewBBox.
Merge( item->ViewBBox() );
2024 typedef std::numeric_limits<int> coord_limits;
2029 bool outOfBounds = rotPos.
x < min || rotPos.
x > max || rotPos.
y < min || rotPos.
y > max
2030 || rotEnd.
x < min || rotEnd.
x > max || rotEnd.
y < min || rotEnd.
y > max;
2036 if( !item->IsNew() && !item->IsMoving() )
2039 if( item->IsBOARD_ITEM() )
2043 board_item->
Rotate( refPt, rotateAngle );
2048 if( !localCommit.
Empty() )
2049 localCommit.
Push(
_(
"Rotate" ) );
2081 MIRROR( tmpPt, aMirrorPoint, aFlipDirection );
2121 commit = &localCommit;
2132 if( selection.
Empty() )
2139 ? FLIP_DIRECTION::TOP_BOTTOM
2140 : FLIP_DIRECTION::LEFT_RIGHT;
2142 std::vector<EDA_ITEM*> items;
2148 static_cast<PCB_GROUP*
>( item )->RunOnDescendants(
2151 items.push_back( descendant );
2156 items.push_back( item );
2165 if( !item->IsNew() && !item->IsMoving() )
2169 switch( item->Type() )
2172 static_cast<PCB_SHAPE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2176 static_cast<ZONE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2181 static_cast<PCB_TEXT*
>( item )->
Mirror( mirrorPoint, flipDirection );
2193 mirrorPad( *
static_cast<PAD*
>( item ), mirrorPoint, flipDirection );
2199 static_cast<PCB_TRACK*
>( item )->
Mirror( mirrorPoint, flipDirection );
2212 if( !localCommit.
Empty() )
2213 localCommit.
Push(
_(
"Mirror" ) );
2239 commit = &localCommit;
2248 if( selection.
Empty() )
2266 if( !item->IsNew() && !item->IsMoving() )
2269 setJustify(
static_cast<PCB_TEXT*
>( item ) );
2273 if( !item->IsNew() && !item->IsMoving() )
2280 if( !localCommit.
Empty() )
2283 localCommit.
Push(
_(
"Left Justify" ) );
2285 localCommit.
Push(
_(
"Center Justify" ) );
2287 localCommit.
Push(
_(
"Right Justify" ) );
2314 commit = &localCommit;
2326 if( selection.
Empty() )
2329 std::optional<VECTOR2I> oldRefPt;
2344 if( selection.
GetSize() == 1 )
2348 if( !item || item->
GetShape() != SHAPE_T::RECTANGLE )
2356 if( !item->IsBOARD_ITEM() )
2362 commit->
Modify( boardItem );
2364 boardItem->
Flip( refPt, flipDirection );
2368 if( !localCommit.
Empty() )
2369 localCommit.
Push(
_(
"Change Side / Flip" ) );
2391 std::unordered_set<BOARD_ITEM*>& children )
2395 std::unordered_set<BOARD_ITEM*>& childItems =
static_cast<PCB_GROUP*
>( item )->GetItems();
2399 children.insert( childItem );
2409 auto itr = items.begin();
2411 while( itr != items.end() )
2421 std::unordered_set<BOARD_ITEM*> childItems;
2424 std::for_each( childItems.begin(), childItems.end(),
2425 [&](
auto eraseItem )
2427 items.erase( eraseItem );
2447 std::unordered_set<EDA_ITEM*> rootItems( aItems.
begin(), aItems.
end() );
2450 int itemsDeleted = 0;
2451 int fieldsHidden = 0;
2452 int fieldsAlreadyHidden = 0;
2456 if( !item->IsBOARD_ITEM() )
2465 switch( item->Type() )
2471 wxASSERT( parentFP );
2472 commit.
Modify( parentFP );
2481 fieldsAlreadyHidden++;
2491 commit.
Modify( parentFP );
2492 parentFP->
Delete( board_item );
2497 commit.
Remove( board_item );
2513 commit.
Remove( board_item );
2519 commit.
Modify( board_item );
2520 static_cast<PCB_TABLECELL*
>( board_item )->SetText( wxEmptyString );
2537 commit.
Remove( board_item );
2544 commit.
Modify( parentFP );
2546 parentFP->
Remove( board_item );
2556 if( !aIsCut && aItems.
GetSize() == 1 )
2559 ZONE* zone =
static_cast<ZONE*
>( board_item );
2561 int outlineIdx, holeIdx;
2584 commit.
Remove( board_item );
2589 if( rootItems.size() == 1 )
2606 commit.
Remove( board_item );
2613 wxASSERT_MSG( parentFP ==
nullptr, wxT(
"Try to delete an item living in a footprint" ) );
2614 commit.
Remove( board_item );
2623 if( enteredGroup && enteredGroup->
GetItems().empty() )
2628 commit.
Push(
_(
"Cut" ) );
2630 else if( itemsDeleted == 0 )
2632 if( fieldsHidden == 1 )
2633 commit.
Push(
_(
"Hide Field" ) );
2634 else if( fieldsHidden > 1 )
2635 commit.
Push(
_(
"Hide Fields" ) );
2636 else if( fieldsAlreadyHidden > 0 )
2637 editFrame->
ShowInfoBarError(
_(
"Use the Footprint Properties dialog to remove fields." ) );
2641 commit.
Push(
_(
"Delete" ) );
2652 std::vector<BOARD_ITEM*> lockedItems;
2736 if( selection.
Empty() )
2750 if( ret == wxID_OK )
2758 selCenter += translation;
2760 if( !
frame()->GetPcbNewSettings()->m_Display.m_DisplayInvertYAxis )
2761 rotation = -rotation;
2765 if( !item->IsBOARD_ITEM() )
2770 if( !boardItem->
IsNew() )
2771 commit.
Modify( boardItem );
2774 boardItem->
Move( translation );
2776 switch( rotationAnchor )
2782 boardItem->
Rotate( selCenter, angle );
2785 boardItem->
Rotate(
frame()->GetScreen()->m_LocalOrigin, angle );
2796 commit.
Push(
_(
"Move Exactly" ) );
2798 if( selection.IsHover() )
2831 if( selection.
Empty() )
2843 bool is_hover = selection.
IsHover();
2845 std::vector<BOARD_ITEM*> new_items;
2846 new_items.reserve( selection.
Size() );
2852 if( !item->IsBOARD_ITEM() )
2873 &&
static_cast<PAD*
>( dupe_item )->CanHaveNumber() )
2879 static_cast<PAD*
>( dupe_item )->SetNumber( padNumber );
2883 new_items.push_back( dupe_item );
2884 commit.
Add( dupe_item );
2893 switch( orig_item->
Type() )
2916 new_items.push_back( dupe_item );
2917 commit.
Add( dupe_item );
2926 dupe_item =
static_cast<PCB_GROUP*
>( orig_item )->DeepDuplicate();
2932 new_items.push_back( aItem );
2933 commit.
Add( aItem );
2937 new_items.push_back( dupe_item );
2938 commit.
Add( dupe_item );
2942 wxASSERT_MSG(
false, wxString::Format( wxT(
"Unhandled item type %d" ),
2943 orig_item->
Type() ) );
2953 EDA_ITEMS nItems( new_items.begin(), new_items.end() );
2957 if( !selection.
Empty() )
2959 editFrame->
DisplayToolMsg( wxString::Format(
_(
"Duplicated %d item(s)" ),
2960 (
int) new_items.size() ) );
2964 commit.
Push(
_(
"Duplicate" ) );
2979 const auto incrementableFilter =
2982 for(
int i = aCollector.GetCount() - 1; i >= 0; i-- )
2984 switch( aCollector[i]->Type() )
2990 aCollector.Remove( i );
2997 incrementableFilter,
true );
2999 if( selection.
Empty() )
3011 switch( item->Type() )
3021 if( !
pad.CanHaveNumber() )
3025 std::optional<wxString> newNumber =
3026 incrementer.Increment(
pad.GetNumber(), incParam.
Delta, incParam.
Index );
3031 pad.SetNumber( *newNumber );
3040 std::optional<wxString> newText =
3041 incrementer.Increment(
text.GetText(), incParam.
Delta, incParam.
Index );
3046 text.SetText( *newText );
3056 commit.
Push(
_(
"Increment" ) );
3065 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3067 if( aCollector[i]->Type() !=
PCB_PAD_T )
3076 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3087 if( aSelection.
Empty() )
3111 BOX2I nonFieldsBBox;
3115 if( !item->IsType( { PCB_TEXT_T, PCB_FIELD_T } ) )
3116 nonFieldsBBox.
Merge( item->GetBoundingBox() );
3131 const wxString& aCanceledMessage,
VECTOR2I& aReferencePoint )
3135 std::optional<VECTOR2I> pickedPoint;
3143 const auto setPickerLayerSet = [&]()
3148 layerFilter =
LSET( { editFrame.GetActiveLayer() } );
3156 setPickerLayerSet();
3159 [&](
const VECTOR2D& aPoint ) ->
bool
3161 pickedPoint = aPoint;
3163 if( !aSuccessMessage.empty() )
3165 m_statusPopup->SetText( aSuccessMessage );
3166 m_statusPopup->Expire( 800 );
3170 m_statusPopup->Hide();
3185 if( !aCanceledMessage.empty() )
3187 m_statusPopup->SetText( aCanceledMessage );
3188 m_statusPopup->Expire( 800 );
3192 m_statusPopup->Hide();
3197 [&](
const int& aFinalState )
3216 setPickerLayerSet();
3219 evt->SetPassEvent();
3230 aReferencePoint = *pickedPoint;
3232 return pickedPoint.has_value();
3240 getEditFrame<PCB_BASE_EDIT_FRAME>()->GetMagneticItemsSettings() );
3242 "pcbnew.InteractiveEdit.selectReferencePoint",
3243 TOOL_ACTION_SCOPE::AS_GLOBAL );
3245 frame()->PushTool( selectReferencePoint );
3251 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
3253 BOARD_ITEM* item = aCollector[i];
3257 if( ( item->Type() == PCB_FIELD_T || item->Type() == PCB_TEXT_T )
3258 && aCollector.HasItem( item->GetParentFootprint() ) )
3260 aCollector.Remove( item );
3265 aCollector.Remove( item );
3271 aEvent.IsAction( &
ACTIONS::cut ) && !m_isFootprintEditor );
3273 if( !selection.Empty() )
3275 std::vector<BOARD_ITEM*> items;
3279 if( item->IsBOARD_ITEM() )
3280 items.push_back(
static_cast<BOARD_ITEM*
>( item ) );
3287 if( !pickReferencePoint(
_(
"Select reference point for the copy..." ),
3288 _(
"Selection copied" ),
3289 _(
"Copy canceled" ),
3292 frame()->PopTool( selectReferencePoint );
3298 refPoint =
grid.BestDragOrigin( getViewControls()->GetCursorPosition(), items );
3301 selection.SetReferencePoint( refPoint );
3303 io.SetBoard( board() );
3304 io.SaveSelection( selection, m_isFootprintEditor );
3305 frame()->SetStatusText(
_(
"Selection copied" ) );
3308 frame()->PopTool( selectReferencePoint );
3310 if( selection.IsHover() )
3311 m_selectionTool->ClearSelection();
3330 const auto getItemText = [&](
const BOARD_ITEM& aItem ) -> wxString
3332 switch( aItem.Type() )
3344 return text.GetShownText(
true );
3358 for(
int row = 0; row < table.
GetRowCount(); ++row )
3360 for(
int col = 0; col < table.
GetColCount(); ++col )
3382 return wxEmptyString;
3385 wxArrayString itemTexts;
3389 if( item->IsBOARD_ITEM() )
3392 wxString itemText = getItemText( *boardItem );
3394 itemText.Trim(
false ).Trim(
true );
3396 if( !itemText.IsEmpty() )
3398 itemTexts.Add( std::move( itemText ) );
3404 if( !itemTexts.empty() )
3406 SaveClipboard( wxJoin( itemTexts,
'\n',
'\0' ).ToStdString() );
constexpr EDA_IU_SCALE pcbIUScale
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
static TOOL_ACTION decrementPrimary
static TOOL_ACTION pickerSubTool
static TOOL_ACTION unselectAll
static TOOL_ACTION decrementSecondary
static TOOL_ACTION pasteSpecial
static TOOL_ACTION rightJustify
static TOOL_ACTION pageSettings
static TOOL_ACTION incrementSecondary
static TOOL_ACTION duplicate
static TOOL_ACTION incrementPrimary
static TOOL_ACTION doDelete
static TOOL_ACTION cursorClick
static TOOL_ACTION increment
static TOOL_ACTION leftJustify
static TOOL_ACTION copyAsText
static TOOL_ACTION selectAll
static TOOL_ACTION centerJustify
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
virtual void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Revert the commit by restoring the modified items state.
COMMIT & Stage(EDA_ITEM *aItem, CHANGE_TYPE aChangeType, BASE_SCREEN *aScreen=nullptr) override
virtual void Revert() override
NETINFO_ITEM * GetNet() const
Return #NET_INFO object for a given item.
void SetNet(NETINFO_ITEM *aNetInfo)
Set a NET_INFO object for the item.
int GetCurrentViaSize() const
const VECTOR2I & GetAuxOrigin()
int GetCurrentTrackWidth() const
int GetCurrentViaDrill() const
virtual void Delete(BOARD_ITEM *aItem)
Removes an item from the container and deletes it.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
virtual void SetLocked(bool aLocked)
PCB_GROUP * GetParentGroup() const
virtual void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle)
Rotate this object.
virtual BOARD_ITEM * Duplicate() const
Create a copy of this BOARD_ITEM.
virtual void Move(const VECTOR2I &aMoveVector)
Move this object.
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
FOOTPRINT * GetParentFootprint() const
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
virtual bool IsLocked() const
BOARD_ITEM_CONTAINER * GetParent() const
virtual void RunOnDescendants(const std::function< void(BOARD_ITEM *)> &aFunction, int aDepth=0) const
Invoke a function on all descendants.
virtual void Normalize()
Perform any normalization required after a user rotate and/or flip.
virtual void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection)
Flip this object, i.e.
LSET GetVisibleLayers() const
A proxy function that calls the correspondent function in m_BoardSettings.
bool BuildConnectivity(PROGRESS_REPORTER *aReporter=nullptr)
Build or rebuild the board connectivity database for the board, especially the list of connected item...
FOOTPRINT * GetFirstFootprint() const
Get the first footprint on the board or nullptr.
const FOOTPRINTS & Footprints() const
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
constexpr const Vec & GetPosition() const
constexpr const Vec GetEnd() const
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
constexpr const Vec GetCenter() const
constexpr bool IsValid() const
Represent basic circle geometry with utility geometry functions.
VECTOR2I Center
Public to make access simpler.
int Radius
Public to make access simpler.
CIRCLE & ConstructFromTanTanPt(const SEG &aLineA, const SEG &aLineB, const VECTOR2I &aP)
Construct this circle such that it is tangent to the given segments and passes through the given poin...
VECTOR2I NearestPoint(const VECTOR2I &aP) const
Compute the point on the circumference of the circle that is the closest to aP.
int GetCount() const
Return the number of objects in the list.
void Remove(int aIndex)
Remove the item at aIndex (first position is 0).
COMMIT & Remove(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Notify observers that aItem has been removed.
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Create an undo entry for an item that has been already modified.
bool Empty() const
Returns status of an item.
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Notify observers that aItem has been added.
@ TABLECELL_PROPS_EDIT_TABLE
enum TABLECELL_PROPS_RETVALUE GetReturnValue()
bool HitTestDrawingSheetItems(KIGFX::VIEW *aView, const VECTOR2I &aPosition)
void ShowInfoBarError(const wxString &aErrorMsg, bool aShowCloseButton=false, WX_INFOBAR::MESSAGE_TYPE aType=WX_INFOBAR::MESSAGE_TYPE::GENERIC)
Show the WX_INFOBAR displayed on the top of the canvas with a message and an error icon on the left o...
void DisplayToolMsg(const wxString &msg) override
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
void SetStatusPopup(wxWindow *aPopup)
A base class for most all the KiCad significant classes used in schematics and boards.
virtual VECTOR2I GetPosition() const
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
virtual const BOX2I ViewBBox() const override
Return the bounding box of the item covering all its layers.
SHAPE_POLY_SET & GetPolyShape()
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
void SetStart(const VECTOR2I &aStart)
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
void SetEnd(const VECTOR2I &aEnd)
void SetWidth(int aWidth)
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
virtual bool IsVisible() const
virtual void SetVisible(bool aVisible)
static const TOOL_EVENT SelectedEvent
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
static const TOOL_EVENT ConnectivityChangedEvent
Selected item had a property changed (except movement)
static const TOOL_EVENT UnselectedEvent
Used when the right click button is pressed, or when the select tool is in effect.
static const std::vector< KICAD_T > DraggableItems
A scan list for items that can be dragged.
A handler that is based on a set of callbacks provided by the user of the ITEM_MODIFICATION_ROUTINE.
An interface for classes handling user events controlling the view behavior such as zooming,...
virtual void ForceCursorPosition(bool aEnabled, const VECTOR2D &aPosition=VECTOR2D(0, 0))
Place the cursor immediately at a given point.
virtual void ShowCursor(bool aEnabled)
Enable or disables display of cursor.
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
virtual VECTOR2D GetMousePosition(bool aWorldCoordinates=true) const =0
Return the current mouse pointer position.
virtual void SetAutoPan(bool aEnabled)
Turn on/off auto panning (this feature is used when there is a tool active (eg.
bool IsBOARD_ITEM() const
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
bool IsLayerVisible(int aLayer) const
Return information about visibility of a particular layer.
LSET is a set of PCB_LAYER_IDs.
static LSET AllLayersMask()
A collection of nets and the parameters used to route or test these nets.
int GetuViaDiameter() const
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
const VECTOR2I & GetDelta(PCB_LAYER_ID aLayer) const
VECTOR2I GetPosition() const override
void SetDelta(PCB_LAYER_ID aLayer, const VECTOR2I &aSize)
void FlipPrimitives(FLIP_DIRECTION aFlipDirection)
Flip (mirror) the primitives left to right or top to bottom, around the anchor position in custom pad...
PAD_SHAPE GetShape(PCB_LAYER_ID aLayer) const
void SetOffset(PCB_LAYER_ID aLayer, const VECTOR2I &aOffset)
void SetPosition(const VECTOR2I &aPos) override
const VECTOR2I & GetOffset(PCB_LAYER_ID aLayer) const
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
void SetOrientation(const EDA_ANGLE &aAngle)
Set the rotation angle of the pad.
static TOOL_ACTION drag45Degree
static TOOL_ACTION duplicateIncrement
Activation of the duplication tool with incrementing (e.g. pad number)
static TOOL_ACTION changeTrackWidth
Update selected tracks & vias to the current track & via dimensions.
static TOOL_ACTION unrouteSelected
Removes all tracks from the selected items to the first pad.
static TOOL_ACTION mirrorH
Mirroring of selected items.
static TOOL_ACTION updateFootprint
static TOOL_ACTION breakTrack
Break a single track into two segments at the cursor.
static TOOL_ACTION pointEditorMoveMidpoint
static TOOL_ACTION getAndPlace
Find an item and start moving.
static TOOL_ACTION properties
Activation of the edit tool.
static TOOL_ACTION editFpInFpEditor
static TOOL_ACTION selectionClear
Clear the current selection.
static TOOL_ACTION moveWithReference
move with a reference point
static TOOL_ACTION swap
Swapping of selected items.
static TOOL_ACTION moveExact
Activation of the exact move tool.
static TOOL_ACTION intersectPolygons
Intersection of multiple polygons.
static TOOL_ACTION pointEditorMoveCorner
static TOOL_ACTION genRemove
static TOOL_ACTION selectConnection
Select tracks between junctions or expands an existing selection to pads or the entire connection.
static TOOL_ACTION assignNetClass
static TOOL_ACTION packAndMoveFootprints
Pack and start moving selected footprints.
static TOOL_ACTION copyWithReference
copy command with manual reference point selection
static TOOL_ACTION healShapes
Connect selected shapes, possibly extending or cutting them, or adding extra geometry.
static TOOL_ACTION dragFreeAngle
static TOOL_ACTION positionRelativeInteractively
static TOOL_ACTION inspectClearance
static TOOL_ACTION updateLocalRatsnest
static TOOL_ACTION updateFootprints
static TOOL_ACTION deleteFull
static TOOL_ACTION moveIndividually
move items one-by-one
static TOOL_ACTION changeFootprints
static TOOL_ACTION selectItem
Select an item (specified as the event parameter).
static TOOL_ACTION chamferLines
Chamfer (i.e. adds a straight line) all selected straight lines by a user defined setback.
static TOOL_ACTION dogboneCorners
Add "dogbone" corners to selected lines to allow routing with a cutter radius.
static TOOL_ACTION filletTracks
Fillet (i.e. adds an arc tangent to) all selected straight tracks by a user defined radius.
static TOOL_ACTION simplifyPolygons
Simplify polygon outlines.
static TOOL_ACTION footprintProperties
static TOOL_ACTION filletLines
Fillet (i.e. adds an arc tangent to) all selected straight lines by a user defined radius.
static TOOL_ACTION changeFootprint
static TOOL_ACTION routerInlineDrag
Activation of the Push and Shove router (inline dragging mode)
static TOOL_ACTION positionRelative
static TOOL_ACTION move
move or drag an item
static TOOL_ACTION mirrorV
static TOOL_ACTION mergePolygons
Merge multiple polygons into a single polygon.
static TOOL_ACTION subtractPolygons
Subtract polygons from other polygons.
static TOOL_ACTION selectItems
Select a list of items (specified as the event parameter)
static TOOL_ACTION flip
Flipping of selected objects.
static TOOL_ACTION extendLines
Extend selected lines to meet at a point.
static TOOL_ACTION rotateCw
Rotation of selected objects.
static TOOL_ACTION rotateCcw
virtual double GetLength() const override
Return the length of the arc track.
void SetMid(const VECTOR2I &aMid)
EDA_ANGLE GetAngle() const
const VECTOR2I & GetMid() const
virtual VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
Common, abstract interface for edit frames.
virtual void OnEditItemRequest(BOARD_ITEM *aItem)
Install the corresponding dialog editor for the given item.
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
DS_PROXY_VIEW_ITEM * GetDrawingSheet() const
void RedrawRatsnest()
Return the bounding box of the view that should be used if model is not valid.
The main frame for Pcbnew.
static const TOOL_EVENT SnappingModeChangedByKeyEvent
Hotkey feedback.
A set of BOARD_ITEMs (i.e., without duplicates).
std::unordered_set< BOARD_ITEM * > & GetItems()
Tool that displays edit points allowing to modify items by dragging the points.
BOX2I GetBoundingBox() const override
int GetWidth() const override
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
PCB_TABLECELL * GetCell(int aRow, int aCol) const
wxString GetShownText(bool aAllowExtraText, int aDepth=0) const override
Return the string actually shown after processing of the base text.
void SetHasSolderMask(bool aVal)
virtual double GetLength() const
Get the length of the track using the hypotenuse calculation.
void SetEnd(const VECTOR2I &aEnd)
bool HasSolderMask() const
void SetStart(const VECTOR2I &aStart)
void SetLocalSolderMaskMargin(std::optional< int > aMargin)
std::optional< int > GetLocalSolderMaskMargin() const
const VECTOR2I & GetStart() const
const VECTOR2I & GetEnd() const
EDA_ITEM_FLAGS IsPointOnEnds(const VECTOR2I &point, int min_dist=0) const
Return STARTPOINT if point if near (dist = min_dist) start point, ENDPOINT if point if near (dist = m...
virtual void SetWidth(int aWidth)
virtual int GetWidth() const
const VECTOR2I NearestPoint(const VECTOR2I &aP) const
Compute a point on the segment (this) that is closest to point aP.
OPT_VECTOR2I IntersectLines(const SEG &aSeg) const
Compute the intersection point of lines passing through ends of (this) and aSeg.
bool ApproxCollinear(const SEG &aSeg, int aDistanceThreshold=1) const
VECTOR2I LineProject(const VECTOR2I &aP) const
Compute the perpendicular projection point of aP on a line passing through ends of the segment.
SEG PerpendicularSeg(const VECTOR2I &aP) const
Compute a segment perpendicular to this one, passing through point aP.
int Side(const VECTOR2I &aP) const
Determine on which side of directed line passing via segment ends point aP lies.
EDA_ANGLE Angle(const SEG &aOther) const
Determine the smallest angle between two segments.
static SELECTION_CONDITION HasTypes(std::vector< KICAD_T > aTypes)
Create a functor that tests if among the selected items there is at least one of a given types.
static SELECTION_CONDITION HasType(KICAD_T aType)
Create a functor that tests if among the selected items there is at least one of a given type.
static bool NotEmpty(const SELECTION &aSelection)
Test if there are any items selected.
static SELECTION_CONDITION MoreThan(int aNumber)
Create a functor that tests if the number of selected items is greater than the value given as parame...
static SELECTION_CONDITION Count(int aNumber)
Create a functor that tests if the number of selected items is equal to the value given as parameter.
static SELECTION_CONDITION OnlyTypes(std::vector< KICAD_T > aTypes)
Create a functor that tests if the selected items are only of given types.
virtual KIGFX::VIEW_ITEM * GetItem(unsigned int aIdx) const override
VECTOR2I GetReferencePoint() const
virtual VECTOR2I GetCenter() const
Returns the center point of the selection area bounding box.
virtual unsigned int GetSize() const override
Return the number of stored items.
bool HasType(KICAD_T aType) const
Checks if there is at least one item of requested kind.
int Size() const
Returns the number of selected parts.
std::deque< EDA_ITEM * > & Items()
void ClearReferencePoint()
void SetReferencePoint(const VECTOR2I &aP)
bool Empty() const
Checks if there is anything selected.
bool HasReferencePoint() const
size_t CountType(KICAD_T aType) const
bool Contains(EDA_ITEM *aItem) const
const VECTOR2I & GetP1() const
const VECTOR2I & GetP0() const
Represent a set of closed polygons.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
void SimplifyOutlines(int aMaxError=0)
Simplifies the lines in the polyset.
const VECTOR2I & CVertex(int aIndex, int aOutline, int aHole) const
Return the index-th vertex in a given hole outline within a given outline.
static const int MIN_PRECISION_IU
This is the minimum precision for all the points in a shape.
Heuristically increment a string's n'th part from the right.
void SetSkipIOSQXZ(bool aSkip)
If a alphabetic part is found, skip the letters I, O, S, Q, X, Z.
double Distance(const VECTOR2< extended_type > &aVector) const
Compute the distance between two vectors.
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
A dialog like WX_UNIT_ENTRY_DIALOG, but with multiple entries.
std::vector< RESULT > GetValues() const
Returns the values in the order they were added.
An extension of WX_TEXT_ENTRY_DIALOG that uses UNIT_BINDER to request a dimension (e....
int GetValue()
Returns the value in internal units.
Handle a list of polygons defining a copper zone.
bool UnFill()
Removes the zone filling.
bool HitTestCutout(const VECTOR2I &aRefPos, int *aOutlineIdx=nullptr, int *aHoleIdx=nullptr) const
Test if the given point is contained within a cutout of the zone.
void HatchBorder()
Compute the hatch lines depending on the hatch parameters and stores it in the zone's attribute m_bor...
void RemoveCutout(int aOutlineIdx, int aHoleIdx)
Remove a cutout from the zone.
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
void ConnectBoardShapes(std::vector< PCB_SHAPE * > &aShapeList, std::vector< std::unique_ptr< PCB_SHAPE > > &aNewShapes, int aChainingEpsilon)
Connects shapes to each other, making continious contours (adjacent shapes will have a common vertex)...
@ LAYER_DRAWINGSHEET
drawingsheet frame and titleblock
@ LAYER_SCHEMATIC_DRAWINGSHEET
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
#define UNIMPLEMENTED_FOR(type)
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)
Function GetModel creates an S3DMODEL representation of aNode (raw data, no transforms)
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
void for_all_pairs(_InputIterator __first, _InputIterator __last, _Function __f)
Apply a function to every possible pair of elements of a sequence.
Class to handle a set of BOARD_ITEMs.
std::optional< VECTOR2I > OPT_VECTOR2I
Parameters that define a simple chamfer operation.
constexpr int mmToIU(double mm) const
const VECTOR2I CalcArcMid(const VECTOR2I &aStart, const VECTOR2I &aEnd, const VECTOR2I &aCenter, bool aMinArcAngle=true)
Return the middle point of an arc, half-way between aStart and aEnd.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
@ PCB_GENERATOR_T
class PCB_GENERATOR, generator on a layer
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
@ PCB_ZONE_T
class ZONE, a copper pour area
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
@ PCB_MARKER_T
class PCB_MARKER, a marker used to show something
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
@ PCB_SHAPE_LOCATE_SEGMENT_T
@ PCB_SHAPE_LOCATE_RECT_T
@ PCB_TABLECELL_T
class PCB_TABLECELL, PCB_TEXTBOX for use in tables
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
@ PCB_SHAPE_LOCATE_BEZIER_T
@ PCB_PAD_T
class PAD, a pad in a footprint
@ PCB_SHAPE_LOCATE_POLY_T
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
@ PCB_DIMENSION_T
class PCB_DIMENSION_BASE: abstract dimension meta-type
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
VECTOR2< int32_t > VECTOR2I