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();
335 && notMovingCondition
336 && !inFootprintEditor;
358 && notMovingCondition );
364 && notMovingCondition );
386 && !inFootprintEditor );
398 menu.AddSeparator( 100 );
399 menu.AddMenu( shapeModificationSubMenu.get(), shapeModificationCondition, 100 );
400 menu.AddMenu( positioningToolsSubMenu.get(), positioningToolsCondition, 100 );
402 menu.AddSeparator( 150 );
414 menu.AddSeparator( 150 );
430 wxString footprintName;
431 wxArrayString fplist;
436 fplist.Add( fp->GetReference() + wxT(
" ( " ) + fp->GetValue() + wxT(
" )" ) );
446 footprintName.Trim(
true );
447 footprintName.Trim(
false );
449 if( !footprintName.IsEmpty() )
453 if( fp->GetReference().CmpNoCase( footprintName ) == 0 )
553 std::vector<PCB_TRACK*> tracks;
554 std::vector<PCB_TRACK*> vias;
555 std::vector<FOOTPRINT*> footprints;
562 vias.push_back( track );
564 tracks.push_back( track );
575 for( int ii = aCollector.GetCount() - 1; ii >= 0; --ii )
577 if( aCollector[ii]->Type() != PCB_FOOTPRINT_T )
578 aCollector.Remove( ii );
581 else if( tracks.size() || vias.size() )
586 if( aCollector.GetCount() > 1 )
587 sTool->GuessSelectionCandidates( aCollector, aPt );
594 auto connected = []( PCB_TRACK* track, const VECTOR2I& pt )
596 return track->GetStart() == pt || track->GetEnd() == pt;
599 if( tracks.size() == 2 && vias.size() == 0 )
601 if( connected( tracks[0], tracks[1]->GetStart() )
602 || connected( tracks[0], tracks[1]->GetEnd() ) )
604 aCollector.Remove( tracks[1] );
607 else if( tracks.size() == 2 && vias.size() == 1 )
609 if( connected( tracks[0], vias[0]->GetPosition() )
610 && connected( tracks[1], vias[0]->GetPosition() ) )
612 aCollector.Remove( tracks[0] );
613 aCollector.Remove( tracks[1] );
620 if( selection.Empty() )
623 if( selection.Size() == 1 && selection.Front()->Type() ==
PCB_ARC_T )
627 return DragArcTrack( aEvent );
631 invokeInlineRouter( mode );
650 wxString msg = wxString::Format(
_(
"Unable to resize arc tracks of %s or greater." ),
652 frame()->ShowInfoBarError( msg );
665 bool restore_state =
false;
679 tanStart.
A = *tanIntersect;
681 tanEnd.
A = *tanIntersect;
684 std::set<PCB_TRACK*> addedTracks;
686 auto getUniqueTrackAtAnchorCollinear =
692 int allowedDeviation = theArc->
GetWidth();
694 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
696 for(
int i = 0; i < 3; i++ )
698 itemsOnAnchor = conn->GetConnectedItemsAtAnchor( theArc, aAnchor,
701 allowedDeviation /= 2;
703 if( itemsOnAnchor.size() == 1 )
709 if( itemsOnAnchor.size() == 1 && itemsOnAnchor.front()->Type() ==
PCB_TRACE_T )
711 track =
static_cast<PCB_TRACK*
>( itemsOnAnchor.front() );
717 if( trackSeg.
Angle( aCollinearSeg ) > maxTangentDeviation )
734 addedTracks.insert( track );
740 PCB_TRACK* trackOnStart = getUniqueTrackAtAnchorCollinear( theArc->
GetStart(), tanStart);
741 PCB_TRACK* trackOnEnd = getUniqueTrackAtAnchorCollinear( theArc->
GetEnd(), tanEnd );
746 tanStart.
B = trackOnStart->
GetEnd();
752 tanEnd.
B = trackOnEnd->
GetEnd();
756 if( tanIntersect = tanStart.
IntersectLines( tanEnd ); !tanIntersect )
759 auto isTrackStartClosestToArcStart =
762 double trackStartToArcStart = aTrack->GetStart().
Distance( theArc->
GetStart() );
763 double trackEndToArcStart = aTrack->GetEnd().Distance( theArc->
GetStart() );
765 return trackStartToArcStart < trackEndToArcStart;
768 bool isStartTrackOnStartPt = isTrackStartClosestToArcStart( trackOnStart );
769 bool isEndTrackOnStartPt = isTrackStartClosestToArcStart( trackOnEnd );
798 auto getFurthestPointToTanInterstect =
801 if( ( aPointA - *tanIntersect ).EuclideanNorm()
802 > ( aPointB - *tanIntersect ).EuclideanNorm() )
813 VECTOR2I tanStartPoint = getFurthestPointToTanInterstect( tanStart.
A, tanStart.
B );
814 VECTOR2I tanEndPoint = getFurthestPointToTanInterstect( tanEnd.
A, tanEnd.
B );
815 VECTOR2I tempTangentPoint = tanEndPoint;
817 if( getFurthestPointToTanInterstect( tanStartPoint, tanEndPoint ) == tanEndPoint )
818 tempTangentPoint = tanStartPoint;
824 SEG cSegTanStart( maxTanPtStart, *tanIntersect );
825 SEG cSegTanEnd( maxTanPtEnd, *tanIntersect );
826 SEG cSegChord( maxTanPtStart, maxTanPtEnd );
828 int cSegTanStartSide = cSegTanStart.
Side( theArc->
GetMid() );
829 int cSegTanEndSide = cSegTanEnd.
Side( theArc->
GetMid() );
830 int cSegChordSide = cSegChord.
Side( theArc->
GetMid() );
832 bool eatFirstMouseUp =
true;
844 std::vector<VECTOR2I> possiblePoints;
851 for(
const VECTOR2I& candidate : possiblePoints )
853 if( ( candidate -
m_cursor ).SquaredEuclideanNorm()
854 < ( closest -
m_cursor ).SquaredEuclideanNorm() )
883 if( isStartTrackOnStartPt )
886 trackOnStart->
SetEnd( newStart );
888 if( isEndTrackOnStartPt )
891 trackOnEnd->
SetEnd( newEnd );
899 if( evt->IsMotion() || evt->IsDrag(
BUT_LEFT ) )
901 eatFirstMouseUp =
false;
903 else if( evt->IsCancelInteractive() || evt->IsActivate() )
905 restore_state =
true;
910 restore_state =
true;
919 eatFirstMouseUp =
false;
931 if( isStartTrackOnStartPt )
932 newStart = trackOnStart->
GetEnd();
934 if( isEndTrackOnStartPt )
935 newEnd = trackOnEnd->
GetEnd();
940 if( trackOnStart->
GetLength() <= maxLengthIU )
942 if( addedTracks.count( trackOnStart ) )
945 addedTracks.erase( trackOnStart );
950 commit.
Remove( trackOnStart );
956 if( trackOnEnd->
GetLength() <= maxLengthIU )
958 if( addedTracks.count( trackOnEnd ) )
961 addedTracks.erase( trackOnEnd );
966 commit.
Remove( trackOnEnd );
985 commit.
Push(
_(
"Drag Arc Track" ) );
997 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
999 BOARD_ITEM* item = aCollector[ i ];
1001 if( !dynamic_cast<PCB_TRACK*>( item ) )
1002 aCollector.Remove( item );
1020 if(
via->GetViaType() == VIATYPE::MICROVIA )
1033 via->SetDrill( new_drill );
1041 wxCHECK( track, 0 );
1050 commit.
Push(
_(
"Edit Track Width/Via Size" ) );
1067 static int filletRadius = 0;
1073 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1075 BOARD_ITEM* item = aCollector[i];
1077 if( !dynamic_cast<PCB_TRACK*>( item ) )
1078 aCollector.Remove( item );
1083 if( selection.
Size() < 2 )
1085 frame()->ShowInfoBarMsg(
_(
"At least two straight track segments must be selected." ) );
1101 bool t1Start =
true;
1102 bool t2Start =
true;
1105 std::vector<FILLET_OP> filletOperations;
1106 bool operationPerformedOnAtLeastOne =
false;
1107 bool didOneAttemptFail =
false;
1108 std::set<PCB_TRACK*> processedTracks;
1110 auto processFilletOp =
1111 [&](
PCB_TRACK* aTrack,
bool aStartPoint )
1115 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
1119 if( itemsOnAnchor.size() > 0
1120 && selection.
Contains( itemsOnAnchor.at( 0 ) )
1126 if( processedTracks.find( trackOther ) == processedTracks.end() )
1128 if( itemsOnAnchor.size() == 1 )
1131 filletOp.t1 = aTrack;
1132 filletOp.t2 = trackOther;
1133 filletOp.t1Start = aStartPoint;
1134 filletOp.t2Start = aTrack->
IsPointOnEnds( filletOp.t2->GetStart() );
1135 filletOperations.push_back( filletOp );
1141 didOneAttemptFail =
true;
1155 processFilletOp( track,
true );
1156 processFilletOp( track,
false );
1158 processedTracks.insert( track );
1164 std::vector<BOARD_ITEM*> itemsToAddToSelection;
1166 for( FILLET_OP filletOp : filletOperations )
1174 if( trackOnStart && trackOnEnd )
1177 if( ( trackOnStart || trackOnEnd ) && track1->
GetLayer() == track2->
GetLayer() )
1185 SHAPE_ARC sArc( t1Seg, t2Seg, filletRadius );
1188 auto setIfPointOnSeg =
1191 VECTOR2I segToVec = aSegment.NearestPoint( aVecToTest ) - aVecToTest;
1196 aPointToSet.
x = aVecToTest.x;
1197 aPointToSet.
y = aVecToTest.y;
1205 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP0() )
1206 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP0() ) )
1208 didOneAttemptFail =
true;
1212 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP1() )
1213 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP1() ) )
1215 didOneAttemptFail =
true;
1227 itemsToAddToSelection.push_back( tArc );
1232 if( filletOp.t1Start )
1235 track1->
SetEnd( t1newPoint );
1237 if( filletOp.t2Start )
1240 track2->
SetEnd( t2newPoint );
1242 operationPerformedOnAtLeastOne =
true;
1246 commit.
Push(
_(
"Fillet Tracks" ) );
1249 for(
BOARD_ITEM* item : itemsToAddToSelection )
1252 if( !operationPerformedOnAtLeastOne )
1253 frame()->ShowInfoBarMsg(
_(
"Unable to fillet the selected track segments." ) );
1254 else if( didOneAttemptFail )
1255 frame()->ShowInfoBarMsg(
_(
"Some of the track segments could not be filleted." ) );
1271 int& aPersitentRadius )
1276 return std::nullopt;
1280 return aPersitentRadius;
1284static std::optional<DOGBONE_CORNER_ROUTINE::PARAMETERS>
1293 std::vector<WX_MULTI_ENTRY_DIALOG::ENTRY> entries{
1300 _(
"Add slots in acute corners" ),
1302 _(
"Add slots in acute corners to allow access to a cutter of the given radius" ),
1309 return std::nullopt;
1311 std::vector<WX_MULTI_ENTRY_DIALOG::RESULT> results = dlg.
GetValues();
1312 wxCHECK( results.size() == 2, std::nullopt );
1316 s_dogBoneParams.DogboneRadiusIU = std::get<long long int>( results[0] );
1317 s_dogBoneParams.AddSlots = std::get<bool>( results[1] );
1319 catch(
const std::bad_variant_access& )
1322 return std::nullopt;
1325 return s_dogBoneParams;
1341 static CHAMFER_PARAMS params{ default_setback, default_setback };
1344 params.m_chamfer_setback_a );
1347 return std::nullopt;
1349 params.m_chamfer_setback_a = dlg.
GetValue();
1352 params.m_chamfer_setback_b = params.m_chamfer_setback_a;
1363 std::vector<VECTOR2I> pts;
1366 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1368 BOARD_ITEM* item = aCollector[i];
1372 if( !item->IsType( { PCB_SHAPE_LOCATE_SEGMENT_T,
1373 PCB_SHAPE_LOCATE_POLY_T,
1374 PCB_SHAPE_LOCATE_RECT_T } ) )
1376 aCollector.
Remove( item );
1382 std::set<PCB_SHAPE*> lines_to_add;
1383 std::vector<PCB_SHAPE*> items_to_remove;
1387 std::vector<VECTOR2I> pts;
1394 items_to_remove.push_back( graphic );
1397 pts.emplace_back( start );
1399 pts.emplace_back(
end );
1405 items_to_remove.push_back( graphic );
1407 for(
int jj = 0; jj < graphic->
GetPolyShape().VertexCount(); ++jj )
1411 for(
size_t jj = 1; jj < pts.size(); ++jj )
1419 lines_to_add.insert( line );
1422 if( pts.size() > 1 )
1427 line->
SetEnd( pts.front() );
1430 lines_to_add.insert( line );
1438 frame()->ShowInfoBarMsg(
_(
"Exactly two lines must be selected to extend them." ) );
1445 else if( segmentCount < 2 )
1447 frame()->ShowInfoBarMsg(
_(
"A shape with at least two lines must be selected." ) );
1461 selection.Add( item );
1465 for(
PCB_SHAPE* item : items_to_remove )
1467 selection.Remove( item );
1468 commit.Remove( item );
1476 std::vector<BOARD_ITEM*> items_to_select_on_success;
1479 std::vector<BOARD_ITEM*> items_to_deselect_on_success;
1484 auto item_modification_handler =
1490 commit.Modify( &aItem );
1491 items_to_select_on_success.push_back( &aItem );
1495 bool any_items_created = !lines_to_add.empty();
1496 auto item_creation_handler =
1497 [&]( std::unique_ptr<BOARD_ITEM> aItem )
1499 any_items_created =
true;
1500 items_to_select_on_success.push_back( aItem.get() );
1501 commit.Add( aItem.release() );
1504 bool any_items_removed = !items_to_remove.empty();
1505 auto item_removal_handler =
1509 any_items_removed =
true;
1510 items_to_deselect_on_success.push_back( &aItem );
1511 commit.Remove( &aItem );
1516 item_creation_handler, item_modification_handler, item_removal_handler );
1519 std::unique_ptr<PAIRWISE_LINE_ROUTINE> pairwise_line_routine;
1524 std::optional<int> filletRadiusIU =
1527 if( filletRadiusIU.has_value() )
1529 pairwise_line_routine = std::make_unique<LINE_FILLET_ROUTINE>(
1530 frame()->
GetModel(), change_handler, *filletRadiusIU );
1535 std::optional<DOGBONE_CORNER_ROUTINE::PARAMETERS> dogboneParams =
1538 if( dogboneParams.has_value() )
1540 pairwise_line_routine = std::make_unique<DOGBONE_CORNER_ROUTINE>(
1541 frame()->
GetModel(), change_handler, *dogboneParams );
1546 std::optional<CHAMFER_PARAMS> chamfer_params =
GetChamferParams( *frame() );
1548 if( chamfer_params.has_value() )
1550 pairwise_line_routine = std::make_unique<LINE_CHAMFER_ROUTINE>( frame()->
GetModel(),
1557 pairwise_line_routine = std::make_unique<LINE_EXTENSION_ROUTINE>( frame()->
GetModel(),
1561 if( !pairwise_line_routine )
1572 if( ( a->GetFlags() & STRUCT_DELETED ) == 0
1573 && ( b->GetFlags() & STRUCT_DELETED ) == 0 )
1575 PCB_SHAPE* line_a = static_cast<PCB_SHAPE*>( a );
1576 PCB_SHAPE* line_b = static_cast<PCB_SHAPE*>( b );
1578 pairwise_line_routine->ProcessLinePair( *line_a, *line_b );
1583 for(
BOARD_ITEM* item : items_to_select_on_success )
1584 m_selectionTool->AddItemToSel( item,
true );
1587 for(
BOARD_ITEM* item : items_to_deselect_on_success )
1588 m_selectionTool->RemoveItemFromSel( item,
true );
1590 if( any_items_removed )
1593 if( any_items_created )
1599 commit.Push( pairwise_line_routine->GetCommitDescription() );
1601 if(
const std::optional<wxString> msg = pairwise_line_routine->GetStatusMessage() )
1602 frame()->ShowInfoBarMsg( *msg );
1613 std::vector<VECTOR2I> pts;
1616 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1618 BOARD_ITEM* item = aCollector[i];
1620 if( !item->IsType( { PCB_SHAPE_LOCATE_POLY_T, PCB_ZONE_T } ) )
1621 aCollector.
Remove( item );
1623 if(
ZONE* zone = dyn_cast<ZONE*>( item ) )
1625 if( zone->IsTeardropArea() )
1626 aCollector.
Remove( item );
1638 if( dlg.ShowModal() == wxID_CANCEL )
1641 s_toleranceValue = dlg.GetValue();
1643 if( s_toleranceValue <= 0 )
1648 std::vector<PCB_SHAPE*> shapeList;
1654 if(
PCB_SHAPE* shape = dyn_cast<PCB_SHAPE*>( item ) )
1661 if(
ZONE* zone = dyn_cast<ZONE*>( item ) )
1669 commit.Push(
_(
"Simplify Polygons" ) );
1683 std::vector<VECTOR2I> pts;
1686 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1688 BOARD_ITEM* item = aCollector[i];
1692 if( !item->IsType( { PCB_SHAPE_LOCATE_SEGMENT_T, PCB_SHAPE_LOCATE_ARC_T,
1693 PCB_SHAPE_LOCATE_BEZIER_T } ) )
1695 aCollector.
Remove( item );
1707 if( dlg.ShowModal() == wxID_CANCEL )
1710 s_toleranceValue = dlg.GetValue();
1712 if( s_toleranceValue <= 0 )
1717 std::vector<PCB_SHAPE*> shapeList;
1718 std::vector<std::unique_ptr<PCB_SHAPE>> newShapes;
1724 shapeList.push_back( shape );
1731 std::vector<PCB_SHAPE*> items_to_select;
1733 for( std::unique_ptr<PCB_SHAPE>& ptr : newShapes )
1737 commit.Add( shape );
1738 items_to_select.push_back( shape );
1741 commit.Push(
_(
"Heal Shapes" ) );
1744 for(
PCB_SHAPE* item : items_to_select )
1745 m_selectionTool->AddItemToSel( item,
true );
1747 if( items_to_select.size() > 0 )
1763 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1765 BOARD_ITEM* item = aCollector[i];
1767 if( !item->IsType( {
1768 PCB_SHAPE_LOCATE_POLY_T,
1769 PCB_SHAPE_LOCATE_RECT_T,
1772 aCollector.
Remove( item );
1778 const EDA_ITEM*
const last_item = selection.GetLastAddedItem();
1781 std::vector<PCB_SHAPE*> items_to_process;
1785 items_to_process.push_back(
static_cast<PCB_SHAPE*
>( item ) );
1790 if( item == last_item )
1791 std::swap( items_to_process.back(), items_to_process.front() );
1797 auto item_modification_handler =
1803 std::vector<BOARD_ITEM*> items_to_select_on_success;
1805 auto item_creation_handler =
1806 [&]( std::unique_ptr<BOARD_ITEM> aItem )
1808 items_to_select_on_success.push_back( aItem.get() );
1809 commit.
Add( aItem.release() );
1812 auto item_removal_handler =
1820 item_creation_handler, item_modification_handler, item_removal_handler );
1823 std::unique_ptr<POLYGON_BOOLEAN_ROUTINE> boolean_routine;
1826 boolean_routine = std::make_unique<POLYGON_MERGE_ROUTINE>( frame()->
GetModel(),
1831 boolean_routine = std::make_unique<POLYGON_SUBTRACT_ROUTINE>( frame()->
GetModel(),
1836 boolean_routine = std::make_unique<POLYGON_INTERSECT_ROUTINE>( frame()->
GetModel(),
1841 wxASSERT_MSG(
false,
"Could not find a polygon routine for this action" );
1846 for(
PCB_SHAPE* shape : items_to_process )
1847 boolean_routine->ProcessShape( *shape );
1849 boolean_routine->Finalize();
1852 for(
BOARD_ITEM* item : items_to_select_on_success )
1853 m_selectionTool->AddItemToSel( item,
true );
1858 commit.Push( boolean_routine->GetCommitDescription() );
1860 if(
const std::optional<wxString> msg = boolean_routine->GetStatusMessage() )
1861 frame()->ShowInfoBarMsg( *msg );
1883 std::vector<PCB_TABLECELL*> cells;
1933 for(
EDA_ITEM* eda_item : selCopy )
1935 if( !eda_item->IsBOARD_ITEM() )
1962 commit = &localCommit;
1977 if( selection.
Empty() )
1980 std::optional<VECTOR2I> oldRefPt;
1981 bool is_hover = selection.
IsHover();
2003 if( selection.
Empty() )
2020 if(
frame()->GetCanvas()->GetView()->GetGAL()->IsFlippedX() )
2021 rotateAngle = -rotateAngle;
2027 viewBBox.
Merge( item->ViewBBox() );
2036 typedef std::numeric_limits<int> coord_limits;
2041 bool outOfBounds = rotPos.
x < min || rotPos.
x > max || rotPos.
y < min || rotPos.
y > max
2042 || rotEnd.
x < min || rotEnd.
x > max || rotEnd.
y < min || rotEnd.
y > max;
2048 if( !item->IsNew() && !item->IsMoving() )
2051 if( item->IsBOARD_ITEM() )
2055 board_item->
Rotate( refPt, rotateAngle );
2060 if( !localCommit.
Empty() )
2061 localCommit.
Push(
_(
"Rotate" ) );
2093 MIRROR( tmpPt, aMirrorPoint, aFlipDirection );
2133 commit = &localCommit;
2144 if( selection.
Empty() )
2151 ? FLIP_DIRECTION::TOP_BOTTOM
2152 : FLIP_DIRECTION::LEFT_RIGHT;
2154 std::vector<EDA_ITEM*> items;
2160 static_cast<PCB_GROUP*
>( item )->RunOnDescendants(
2163 items.push_back( descendant );
2168 items.push_back( item );
2177 if( !item->IsNew() && !item->IsMoving() )
2181 switch( item->Type() )
2184 static_cast<PCB_SHAPE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2188 static_cast<ZONE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2193 static_cast<PCB_TEXT*
>( item )->
Mirror( mirrorPoint, flipDirection );
2205 mirrorPad( *
static_cast<PAD*
>( item ), mirrorPoint, flipDirection );
2211 static_cast<PCB_TRACK*
>( item )->
Mirror( mirrorPoint, flipDirection );
2224 if( !localCommit.
Empty() )
2225 localCommit.
Push(
_(
"Mirror" ) );
2251 commit = &localCommit;
2260 if( selection.
Empty() )
2278 if( !item->IsNew() && !item->IsMoving() )
2281 setJustify(
static_cast<PCB_TEXT*
>( item ) );
2285 if( !item->IsNew() && !item->IsMoving() )
2292 if( !localCommit.
Empty() )
2295 localCommit.
Push(
_(
"Left Justify" ) );
2297 localCommit.
Push(
_(
"Center Justify" ) );
2299 localCommit.
Push(
_(
"Right Justify" ) );
2326 commit = &localCommit;
2338 if( selection.
Empty() )
2341 std::optional<VECTOR2I> oldRefPt;
2356 if( selection.
GetSize() == 1 )
2360 if( !item || item->
GetShape() != SHAPE_T::RECTANGLE )
2368 if( !item->IsBOARD_ITEM() )
2374 commit->
Modify( boardItem );
2376 boardItem->
Flip( refPt, flipDirection );
2380 if( !localCommit.
Empty() )
2381 localCommit.
Push(
_(
"Change Side / Flip" ) );
2403 std::unordered_set<BOARD_ITEM*>& children )
2407 std::unordered_set<BOARD_ITEM*>& childItems =
static_cast<PCB_GROUP*
>( item )->GetItems();
2411 children.insert( childItem );
2421 auto itr = items.begin();
2423 while( itr != items.end() )
2433 std::unordered_set<BOARD_ITEM*> childItems;
2436 std::for_each( childItems.begin(), childItems.end(),
2437 [&](
auto eraseItem )
2439 items.erase( eraseItem );
2459 std::unordered_set<EDA_ITEM*> rootItems( aItems.
begin(), aItems.
end() );
2462 int itemsDeleted = 0;
2463 int fieldsHidden = 0;
2464 int fieldsAlreadyHidden = 0;
2468 if( !item->IsBOARD_ITEM() )
2477 switch( item->Type() )
2483 wxASSERT( parentFP );
2484 commit.
Modify( parentFP );
2493 fieldsAlreadyHidden++;
2503 commit.
Modify( parentFP );
2504 parentFP->
Delete( board_item );
2509 commit.
Remove( board_item );
2525 commit.
Remove( board_item );
2531 commit.
Modify( board_item );
2532 static_cast<PCB_TABLECELL*
>( board_item )->SetText( wxEmptyString );
2549 commit.
Remove( board_item );
2556 commit.
Modify( parentFP );
2558 parentFP->
Remove( board_item );
2568 if( !aIsCut && aItems.
GetSize() == 1 )
2571 ZONE* zone =
static_cast<ZONE*
>( board_item );
2573 int outlineIdx, holeIdx;
2596 commit.
Remove( board_item );
2601 if( rootItems.size() == 1 )
2618 commit.
Remove( board_item );
2625 wxASSERT_MSG( parentFP ==
nullptr, wxT(
"Try to delete an item living in a footprint" ) );
2626 commit.
Remove( board_item );
2635 if( enteredGroup && enteredGroup->
GetItems().empty() )
2640 commit.
Push(
_(
"Cut" ) );
2642 else if( itemsDeleted == 0 )
2644 if( fieldsHidden == 1 )
2645 commit.
Push(
_(
"Hide Field" ) );
2646 else if( fieldsHidden > 1 )
2647 commit.
Push(
_(
"Hide Fields" ) );
2648 else if( fieldsAlreadyHidden > 0 )
2649 editFrame->
ShowInfoBarError(
_(
"Use the Footprint Properties dialog to remove fields." ) );
2653 commit.
Push(
_(
"Delete" ) );
2664 std::vector<BOARD_ITEM*> lockedItems;
2748 if( selection.
Empty() )
2762 if( ret == wxID_OK )
2770 selCenter += translation;
2772 if( !
frame()->GetPcbNewSettings()->m_Display.m_DisplayInvertYAxis )
2773 rotation = -rotation;
2777 if( !item->IsBOARD_ITEM() )
2782 if( !boardItem->
IsNew() )
2783 commit.
Modify( boardItem );
2786 boardItem->
Move( translation );
2788 switch( rotationAnchor )
2794 boardItem->
Rotate( selCenter, angle );
2797 boardItem->
Rotate(
frame()->GetScreen()->m_LocalOrigin, angle );
2808 commit.
Push(
_(
"Move Exactly" ) );
2810 if( selection.IsHover() )
2843 if( selection.
Empty() )
2859 bool is_hover = selection.
IsHover();
2861 std::vector<BOARD_ITEM*> new_items;
2862 new_items.reserve( selection.
Size() );
2868 if( !item->IsBOARD_ITEM() )
2882 switch( orig_item->
Type() )
2908 new_items.push_back( dupe_item );
2909 commit.
Add( dupe_item );
2927 static_cast<PAD*
>( dupe_item )->SetNumber( padNumber );
2934 new_items.push_back( dupe_item );
2935 commit.
Add( dupe_item );
2944 dupe_item =
static_cast<PCB_GROUP*
>( orig_item )->DeepDuplicate();
2950 new_items.push_back( aItem );
2951 commit.
Add( aItem );
2955 new_items.push_back( dupe_item );
2956 commit.
Add( dupe_item );
2960 wxASSERT_MSG(
false, wxString::Format( wxT(
"Unhandled item type %d" ),
2961 orig_item->
Type() ) );
2971 EDA_ITEMS nItems( new_items.begin(), new_items.end() );
2975 if( !selection.
Empty() )
2977 editFrame->
DisplayToolMsg( wxString::Format(
_(
"Duplicated %d item(s)" ),
2978 (
int) new_items.size() ) );
2982 commit.
Push(
_(
"Duplicate" ) );
2997 const auto incrementableFilter =
3000 for(
int i = aCollector.GetCount() - 1; i >= 0; i-- )
3002 switch( aCollector[i]->Type() )
3008 aCollector.Remove( i );
3015 incrementableFilter,
true );
3017 if( selection.
Empty() )
3030 commit = &localCommit;
3032 const auto modifyItem = [&](
EDA_ITEM& aItem )
3037 commit->
Modify( &aItem );
3042 switch( item->Type() )
3052 if( !
pad.CanHaveNumber() )
3056 std::optional<wxString> newNumber =
3057 incrementer.Increment(
pad.GetNumber(), incParam.
Delta, incParam.
Index );
3062 pad.SetNumber( *newNumber );
3071 std::optional<wxString> newText =
3072 incrementer.Increment(
text.GetText(), incParam.
Delta, incParam.
Index );
3077 text.SetText( *newText );
3087 commit->
Push(
_(
"Increment" ) );
3096 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3098 if( aCollector[i]->Type() !=
PCB_PAD_T )
3107 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3118 if( aSelection.
Empty() )
3142 BOX2I nonFieldsBBox;
3146 if( !item->IsType( { PCB_TEXT_T, PCB_FIELD_T } ) )
3147 nonFieldsBBox.
Merge( item->GetBoundingBox() );
3162 const wxString& aCanceledMessage,
VECTOR2I& aReferencePoint )
3166 std::optional<VECTOR2I> pickedPoint;
3174 const auto setPickerLayerSet = [&]()
3179 layerFilter =
LSET( { editFrame.GetActiveLayer() } );
3187 setPickerLayerSet();
3190 [&](
const VECTOR2D& aPoint ) ->
bool
3192 pickedPoint = aPoint;
3194 if( !aSuccessMessage.empty() )
3196 m_statusPopup->SetText( aSuccessMessage );
3197 m_statusPopup->Expire( 800 );
3201 m_statusPopup->Hide();
3216 if( !aCanceledMessage.empty() )
3218 m_statusPopup->SetText( aCanceledMessage );
3219 m_statusPopup->Expire( 800 );
3223 m_statusPopup->Hide();
3228 [&](
const int& aFinalState )
3247 setPickerLayerSet();
3250 evt->SetPassEvent();
3261 aReferencePoint = *pickedPoint;
3263 return pickedPoint.has_value();
3271 getEditFrame<PCB_BASE_EDIT_FRAME>()->GetMagneticItemsSettings() );
3273 "pcbnew.InteractiveEdit.selectReferencePoint",
3274 TOOL_ACTION_SCOPE::AS_GLOBAL );
3276 frame()->PushTool( selectReferencePoint );
3282 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
3284 BOARD_ITEM* item = aCollector[i];
3288 if( ( item->Type() == PCB_FIELD_T || item->Type() == PCB_TEXT_T )
3289 && aCollector.HasItem( item->GetParentFootprint() ) )
3291 aCollector.Remove( item );
3296 aCollector.Remove( item );
3302 aEvent.IsAction( &
ACTIONS::cut ) && !m_isFootprintEditor );
3304 if( !selection.Empty() )
3306 std::vector<BOARD_ITEM*> items;
3310 if( item->IsBOARD_ITEM() )
3311 items.push_back(
static_cast<BOARD_ITEM*
>( item ) );
3318 if( !pickReferencePoint(
_(
"Select reference point for the copy..." ),
3319 _(
"Selection copied" ),
3320 _(
"Copy canceled" ),
3323 frame()->PopTool( selectReferencePoint );
3329 refPoint =
grid.BestDragOrigin( getViewControls()->GetCursorPosition(), items );
3332 selection.SetReferencePoint( refPoint );
3334 io.SetBoard( board() );
3335 io.SaveSelection( selection, m_isFootprintEditor );
3336 frame()->SetStatusText(
_(
"Selection copied" ) );
3339 frame()->PopTool( selectReferencePoint );
3341 if( selection.IsHover() )
3342 m_selectionTool->ClearSelection();
3361 const auto getItemText = [&](
const BOARD_ITEM& aItem ) -> wxString
3363 switch( aItem.Type() )
3375 return text.GetShownText(
true );
3389 for(
int row = 0; row <
table.GetRowCount(); ++row )
3391 for(
int col = 0; col <
table.GetColCount(); ++col )
3396 if( col <
table.GetColCount() - 1 )
3402 if( row <
table.GetRowCount() - 1 )
3413 return wxEmptyString;
3416 wxArrayString itemTexts;
3420 if( item->IsBOARD_ITEM() )
3423 wxString itemText = getItemText( *boardItem );
3425 itemText.Trim(
false ).Trim(
true );
3427 if( !itemText.IsEmpty() )
3429 itemTexts.Add( std::move( itemText ) );
3435 if( !itemTexts.empty() )
3437 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 refreshPreview
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
Execute the changes.
COMMIT & Stage(EDA_ITEM *aItem, CHANGE_TYPE aChangeType, BASE_SCREEN *aScreen=nullptr) override
Add a change of the item aItem of type aChangeType to the change list.
virtual void Revert() override
Revert the commit by restoring the modified items state.
NETINFO_ITEM * GetNet() const
Return #NET_INFO object for a given item.
void SetNet(NETINFO_ITEM *aNetInfo)
Set a NET_INFO object for the item.
int GetCurrentViaSize() const
const VECTOR2I & GetAuxOrigin()
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)
Remove a new item from the model.
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Modify a given item in the model.
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Add a new item to the model.
@ TABLECELL_PROPS_EDIT_TABLE
enum TABLECELL_PROPS_RETVALUE GetReturnValue()
bool HitTestDrawingSheetItems(KIGFX::VIEW *aView, const VECTOR2I &aPosition)
void ShowInfoBarError(const wxString &aErrorMsg, bool aShowCloseButton=false, WX_INFOBAR::MESSAGE_TYPE aType=WX_INFOBAR::MESSAGE_TYPE::GENERIC)
Show the WX_INFOBAR displayed on the top of the canvas with a message and an error icon on the left o...
void DisplayToolMsg(const wxString &msg) override
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
void SetStatusPopup(wxWindow *aPopup)
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
bool CanHaveNumber() const
Indicates whether or not the pad can have a number.
const VECTOR2I & GetDelta(PCB_LAYER_ID aLayer) const
VECTOR2I GetPosition() const override
void SetDelta(PCB_LAYER_ID aLayer, const VECTOR2I &aSize)
void FlipPrimitives(FLIP_DIRECTION aFlipDirection)
Flip (mirror) the primitives left to right or top to bottom, around the anchor position in custom pad...
PAD_SHAPE GetShape(PCB_LAYER_ID aLayer) const
void SetOffset(PCB_LAYER_ID aLayer, const VECTOR2I &aOffset)
void SetPosition(const VECTOR2I &aPos) override
const VECTOR2I & GetOffset(PCB_LAYER_ID aLayer) const
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
void SetOrientation(const EDA_ANGLE &aAngle)
Set the rotation angle of the pad.
static TOOL_ACTION drag45Degree
static TOOL_ACTION duplicateIncrement
Activation of the duplication tool with incrementing (e.g. pad number)
static TOOL_ACTION 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 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 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 routerRouteSelected
static TOOL_ACTION rotateCw
Rotation of selected objects.
static TOOL_ACTION rotateCcw
virtual double GetLength() const override
Return the length of the arc track.
void SetMid(const VECTOR2I &aMid)
EDA_ANGLE GetAngle() const
const VECTOR2I & GetMid() const
virtual VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
Common, abstract interface for edit frames.
virtual void OnEditItemRequest(BOARD_ITEM *aItem)
Install the corresponding dialog editor for the given item.
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
DS_PROXY_VIEW_ITEM * GetDrawingSheet() const
void RedrawRatsnest()
Return the bounding box of the view that should be used if model is not valid.
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.
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()
Return the value in internal units.
Handle a list of polygons defining a copper zone.
bool UnFill()
Removes the zone filling.
bool HitTestCutout(const VECTOR2I &aRefPos, int *aOutlineIdx=nullptr, int *aHoleIdx=nullptr) const
Test if the given point is contained within a cutout of the zone.
void HatchBorder()
Compute the hatch lines depending on the hatch parameters and stores it in the zone's attribute m_bor...
void RemoveCutout(int aOutlineIdx, int aHoleIdx)
Remove a cutout from the zone.
bool SaveClipboard(const std::string &aTextUTF8)
Store information to the system clipboard.
@ ROTATE_AROUND_USER_ORIGIN
@ ROTATE_AROUND_SEL_CENTER
@ ROTATE_AROUND_AUX_ORIGIN
@ ROTATE_AROUND_ITEM_ANCHOR
static constexpr EDA_ANGLE ANGLE_180
std::vector< EDA_ITEM * > EDA_ITEMS
Define list of drawing items for screens.
#define IS_NEW
New item, just created.
#define STRUCT_DELETED
flag indication structures to be erased
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
void ConnectBoardShapes(std::vector< PCB_SHAPE * > &aShapeList, std::vector< std::unique_ptr< PCB_SHAPE > > &aNewShapes, int aChainingEpsilon)
Connects shapes to each other, making continious contours (adjacent shapes will have a common vertex)...
@ LAYER_DRAWINGSHEET
Sheet frame and title block.
@ LAYER_SCHEMATIC_DRAWINGSHEET
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
#define UNIMPLEMENTED_FOR(type)
constexpr void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
KICOMMON_API wxString MessageTextFromValue(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, double aValue, bool aAddUnitsText=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
A helper to convert the double length aValue to a string in inches, millimeters, or unscaled units.
SGLIB_API S3DMODEL * GetModel(SCENEGRAPH *aNode)
Create an S3DMODEL representation of aNode (raw data, no transforms).
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
void for_all_pairs(_InputIterator __first, _InputIterator __last, _Function __f)
Apply a function to every possible pair of elements of a sequence.
Class to handle a set of BOARD_ITEMs.
std::optional< VECTOR2I > OPT_VECTOR2I
std::function< bool(const SELECTION &)> SELECTION_CONDITION
Functor type that checks a specific condition for selected items.
Parameters that define a simple chamfer operation.
constexpr int mmToIU(double mm) const
const VECTOR2I CalcArcMid(const VECTOR2I &aStart, const VECTOR2I &aEnd, const VECTOR2I &aCenter, bool aMinArcAngle=true)
Return the middle point of an arc, half-way between aStart and aEnd.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
@ PCB_GENERATOR_T
class PCB_GENERATOR, generator on a layer
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
@ PCB_ZONE_T
class ZONE, a copper pour area
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
@ PCB_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