67using namespace std::placeholders;
69#include <wx/hyperlink.h>
74#include <dialogs/dialog_tablecell_properties.h>
75#include <dialogs/dialog_table_properties.h>
95 ZONE* zone =
static_cast<ZONE*
>( aItem );
108 if( aSelection.
GetSize() != 1 )
161 auto menu = std::make_shared<CONDITIONAL_MENU>( aTool );
164 menu->SetUntranslatedTitle(
_HKI(
"Position" ) );
166 auto notMovingCondition = [](
const SELECTION& aSelection )
168 return aSelection.Empty() || !aSelection.Front()->IsMoving();
180 auto menu = std::make_shared<CONDITIONAL_MENU>( aTool );
182 menu->SetUntranslatedTitle(
_HKI(
"Shape Modification" ) );
201 auto hasCornerCondition =
209 auto hasMidpointCondition =
261 for(
const EDA_ITEM* it : aSelection )
274 if( units.size() < 2 )
277 const wxString& padNum =
pad->GetNumber();
278 bool inAnyUnit =
false;
280 for(
const auto& u : units )
282 for(
const auto& pnum : u.m_pins )
300 else if( single != fp )
311 std::unordered_set<wxString> padNums;
313 for(
const EDA_ITEM* it : aSelection )
320 if(
pad->GetParentFootprint() != aFootprint )
323 padNums.insert(
pad->GetNumber() );
332 const std::unordered_set<wxString>& aSelPadNums )
334 std::vector<int> indices;
338 for(
size_t i = 0; i < units.size(); ++i )
342 for(
const auto& pn : units[i].m_pins )
344 if( aSelPadNums.count( pn ) )
352 indices.push_back(
static_cast<int>( i ) );
362 if( aUnitIndices.empty() )
366 const size_t cnt = units[
static_cast<size_t>( aUnitIndices.front() )].m_pins.size();
368 for(
int idx : aUnitIndices )
370 if( units[
static_cast<size_t>( idx )].m_pins.size() != cnt )
381 std::vector<int> targets;
384 const size_t pinCount = units[
static_cast<size_t>( aSourceIdx )].m_pins.size();
386 for(
size_t i = 0; i < units.size(); ++i )
388 if(
static_cast<int>( i ) == aSourceIdx )
391 if( units[i].m_pins.size() != pinCount )
394 targets.push_back(
static_cast<int>( i ) );
424 if( unitsHit.size() != 1 )
427 const int sourceIdx = unitsHit.front();
430 for(
int idx : targets )
433 label.Printf(
_(
"Swap with %s" ), fp->
GetUnitInfo()[
static_cast<size_t>( idx )].m_unitName );
441 int id = aEvent.GetId();
456 if( targetIdx < 0 || targetIdx >=
static_cast<int>( units.size() ) )
472 auto menu = std::make_shared<GATE_SWAP_MENU>();
473 menu->SetTool( aTool );
484 m_selectionTool->GetToolMenu().RegisterSubMenu( positioningToolsSubMenu );
487 m_selectionTool->GetToolMenu().RegisterSubMenu( shapeModificationSubMenu );
492 auto positioningToolsCondition =
496 subMenu->Evaluate( aSel );
497 return subMenu->GetMenuItemCount() > 0;
500 auto shapeModificationCondition =
504 subMenu->Evaluate( aSel );
505 return subMenu->GetMenuItemCount() > 0;
509 auto gateSwapSingleUnitOnOneFootprint =
521 if( unitsHit.size() != 1 )
524 const int sourceIdx = unitsHit.front();
526 return !targets.empty();
530 auto gateSwapMultipleUnitsOnOneFootprint =
542 if( unitsHit.size() < 2 )
548 auto propertiesCondition =
551 if( aSel.GetSize() == 0 )
565 if( aSel.GetSize() == 1 )
577 auto inFootprintEditor =
601 auto multipleFootprintsCondition =
604 bool foundFirst =
false;
620 auto noActiveToolCondition =
623 return frame()->ToolStackIsEmpty();
626 auto notMovingCondition =
629 return aSelection.Empty() || !aSelection.Front()->IsMoving();
632 auto noItemsCondition =
633 [
this](
const SELECTION& aSelections ) ->
bool
635 return frame()->GetBoard() && !
frame()->GetBoard()->IsEmpty();
646 && notMovingCondition
647 && !inFootprintEditor;
695 menu.AddMenu( gateSwapSubMenu.get(), gateSwapSingleUnitOnOneFootprint );
703 && !inFootprintEditor );
715 menu.AddSeparator( 100 );
716 menu.AddMenu( shapeModificationSubMenu.get(), shapeModificationCondition, 100 );
717 menu.AddMenu( positioningToolsSubMenu.get(), positioningToolsCondition, 100 );
719 menu.AddSeparator( 150 );
732 menu.AddSeparator( 150 );
748 wxString footprintName;
749 wxArrayString fplist;
754 fplist.Add( fp->GetReference() + wxT(
" ( " ) + fp->GetValue() + wxT(
" )" ) );
764 footprintName.Trim(
true );
765 footprintName.Trim(
false );
767 if( !footprintName.IsEmpty() )
771 if( fp->GetReference().CmpNoCase( footprintName ) == 0 )
871 std::vector<PCB_TRACK*> tracks;
872 std::vector<PCB_TRACK*> vias;
873 std::vector<FOOTPRINT*> footprints;
876 const auto gatherItemsByType =
884 vias.push_back( track );
886 tracks.push_back( track );
901 for(
int ii = aCollector.
GetCount() - 1; ii >= 0; --ii )
907 else if( tracks.size() || vias.size() )
934 if( tracks.size() == 2 && vias.size() == 0 )
936 if( connected( tracks[0], tracks[1]->GetStart() )
937 || connected( tracks[0], tracks[1]->GetEnd() ) )
939 aCollector.
Remove( tracks[1] );
942 else if( tracks.size() == 2 && vias.size() == 1 )
944 if( connected( tracks[0], vias[0]->GetPosition() )
945 && connected( tracks[1], vias[0]->GetPosition() ) )
947 aCollector.
Remove( tracks[0] );
948 aCollector.
Remove( tracks[1] );
986 wxString msg = wxString::Format(
_(
"Unable to resize arc tracks of %s or greater." ),
988 frame()->ShowInfoBarError( msg );
1001 bool restore_state =
false;
1015 tanStart.
A = *tanIntersect;
1017 tanEnd.
A = *tanIntersect;
1020 std::set<PCB_TRACK*> addedTracks;
1022 auto getUniqueTrackAtAnchorCollinear =
1025 std::shared_ptr<CONNECTIVITY_DATA> conn =
board()->GetConnectivity();
1028 int allowedDeviation = theArc->
GetWidth();
1030 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
1032 for(
int i = 0; i < 3; i++ )
1034 itemsOnAnchor = conn->GetConnectedItemsAtAnchor( theArc, aAnchor,
1037 allowedDeviation /= 2;
1039 if( itemsOnAnchor.size() == 1 )
1045 if( itemsOnAnchor.size() == 1 && itemsOnAnchor.front()->Type() ==
PCB_TRACE_T )
1047 track =
static_cast<PCB_TRACK*
>( itemsOnAnchor.front() );
1053 if( trackSeg.
Angle( aCollinearSeg ) > maxTangentDeviation )
1061 track->
SetEnd( aAnchor );
1070 addedTracks.insert( track );
1076 PCB_TRACK* trackOnStart = getUniqueTrackAtAnchorCollinear( theArc->
GetStart(), tanStart);
1077 PCB_TRACK* trackOnEnd = getUniqueTrackAtAnchorCollinear( theArc->
GetEnd(), tanEnd );
1082 tanStart.
B = trackOnStart->
GetEnd();
1088 tanEnd.
B = trackOnEnd->
GetEnd();
1092 if( tanIntersect = tanStart.
IntersectLines( tanEnd ); !tanIntersect )
1095 auto isTrackStartClosestToArcStart =
1098 double trackStartToArcStart = aTrack->GetStart().Distance( theArc->
GetStart() );
1099 double trackEndToArcStart = aTrack->GetEnd().Distance( theArc->
GetStart() );
1101 return trackStartToArcStart < trackEndToArcStart;
1104 bool isStartTrackOnStartPt = isTrackStartClosestToArcStart( trackOnStart );
1105 bool isEndTrackOnStartPt = isTrackStartClosestToArcStart( trackOnEnd );
1134 auto getFurthestPointToTanInterstect =
1137 if( ( aPointA - *tanIntersect ).EuclideanNorm()
1138 > ( aPointB - *tanIntersect ).EuclideanNorm() )
1149 VECTOR2I tanStartPoint = getFurthestPointToTanInterstect( tanStart.
A, tanStart.
B );
1150 VECTOR2I tanEndPoint = getFurthestPointToTanInterstect( tanEnd.
A, tanEnd.
B );
1151 VECTOR2I tempTangentPoint = tanEndPoint;
1153 if( getFurthestPointToTanInterstect( tanStartPoint, tanEndPoint ) == tanEndPoint )
1154 tempTangentPoint = tanStartPoint;
1160 SEG cSegTanStart( maxTanPtStart, *tanIntersect );
1161 SEG cSegTanEnd( maxTanPtEnd, *tanIntersect );
1162 SEG cSegChord( maxTanPtStart, maxTanPtEnd );
1164 int cSegTanStartSide = cSegTanStart.
Side( theArc->
GetMid() );
1165 int cSegTanEndSide = cSegTanEnd.
Side( theArc->
GetMid() );
1166 int cSegChordSide = cSegChord.
Side( theArc->
GetMid() );
1168 bool eatFirstMouseUp =
true;
1180 std::vector<VECTOR2I> possiblePoints;
1187 for(
const VECTOR2I& candidate : possiblePoints )
1189 if( ( candidate -
m_cursor ).SquaredEuclideanNorm()
1190 < ( closest -
m_cursor ).SquaredEuclideanNorm() )
1192 closest = candidate;
1216 theArc->
SetEnd( newEnd );
1217 theArc->
SetMid( newMid );
1219 if( isStartTrackOnStartPt )
1220 trackOnStart->
SetStart( newStart );
1222 trackOnStart->
SetEnd( newStart );
1224 if( isEndTrackOnStartPt )
1227 trackOnEnd->
SetEnd( newEnd );
1230 getView()->Update( trackOnStart );
1231 getView()->Update( trackOnEnd );
1235 if( evt->IsMotion() || evt->IsDrag(
BUT_LEFT ) )
1237 eatFirstMouseUp =
false;
1239 else if( evt->IsCancelInteractive() || evt->IsActivate() )
1241 restore_state =
true;
1246 restore_state =
true;
1255 eatFirstMouseUp =
false;
1267 if( isStartTrackOnStartPt )
1268 newStart = trackOnStart->
GetEnd();
1270 if( isEndTrackOnStartPt )
1271 newEnd = trackOnEnd->
GetEnd();
1276 if( trackOnStart->
GetLength() <= maxLengthIU )
1278 if( addedTracks.count( trackOnStart ) )
1280 getView()->Remove( trackOnStart );
1281 addedTracks.erase( trackOnStart );
1282 delete trackOnStart;
1286 commit.
Remove( trackOnStart );
1292 if( trackOnEnd->
GetLength() <= maxLengthIU )
1294 if( addedTracks.count( trackOnEnd ) )
1296 getView()->Remove( trackOnEnd );
1297 addedTracks.erase( trackOnEnd );
1302 commit.
Remove( trackOnEnd );
1305 theArc->
SetEnd( newEnd );
1314 commit.
Add( added );
1321 commit.
Push(
_(
"Drag Arc Track" ) );
1333 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1338 aCollector.
Remove( item );
1366 new_width =
board()->GetDesignSettings().GetCurrentViaSize();
1367 new_drill =
board()->GetDesignSettings().GetCurrentViaDrill();
1370 via->SetDrill( new_drill );
1378 wxCHECK( track, 0 );
1382 int new_width =
board()->GetDesignSettings().GetCurrentTrackWidth();
1387 commit.
Push(
_(
"Edit Track Width/Via Size" ) );
1412 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1417 aCollector.
Remove( item );
1432 if( newLayer == origLayer )
1443 wxCHECK( track, 0 );
1451 commit.
Push(
_(
"Edit Track Layer" ) );
1468 static int filletRadius = 0;
1474 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1479 aCollector.
Remove( item );
1487 frame()->ShowInfoBarMsg(
_(
"At least two straight track segments must be selected." ) );
1503 bool t1Start =
true;
1504 bool t2Start =
true;
1507 std::vector<FILLET_OP> filletOperations;
1508 bool operationPerformedOnAtLeastOne =
false;
1509 bool didOneAttemptFail =
false;
1510 std::set<PCB_TRACK*> processedTracks;
1512 auto processFilletOp =
1513 [&](
PCB_TRACK* aTrack,
bool aStartPoint )
1515 std::shared_ptr<CONNECTIVITY_DATA> c =
board()->GetConnectivity();
1517 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
1521 if( itemsOnAnchor.size() > 0
1522 &&
selection.Contains( itemsOnAnchor.at( 0 ) )
1528 if( processedTracks.find( trackOther ) == processedTracks.end() )
1530 if( itemsOnAnchor.size() == 1 )
1533 filletOp.t1 = aTrack;
1534 filletOp.t2 = trackOther;
1535 filletOp.t1Start = aStartPoint;
1536 filletOp.t2Start = aTrack->
IsPointOnEnds( filletOp.t2->GetStart() );
1537 filletOperations.push_back( filletOp );
1543 didOneAttemptFail =
true;
1557 processFilletOp( track,
true );
1558 processFilletOp( track,
false );
1560 processedTracks.insert( track );
1566 std::vector<BOARD_ITEM*> itemsToAddToSelection;
1568 for( FILLET_OP filletOp : filletOperations )
1576 if( trackOnStart && trackOnEnd )
1579 if( ( trackOnStart || trackOnEnd ) && track1->
GetLayer() == track2->
GetLayer() )
1587 SHAPE_ARC sArc( t1Seg, t2Seg, filletRadius );
1590 auto setIfPointOnSeg =
1593 VECTOR2I segToVec = aSegment.NearestPoint( aVecToTest ) - aVecToTest;
1598 aPointToSet.
x = aVecToTest.x;
1599 aPointToSet.
y = aVecToTest.y;
1607 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP0() )
1608 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP0() ) )
1610 didOneAttemptFail =
true;
1614 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP1() )
1615 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP1() ) )
1617 didOneAttemptFail =
true;
1629 itemsToAddToSelection.push_back( tArc );
1634 if( filletOp.t1Start )
1637 track1->
SetEnd( t1newPoint );
1639 if( filletOp.t2Start )
1642 track2->
SetEnd( t2newPoint );
1644 operationPerformedOnAtLeastOne =
true;
1648 commit.
Push(
_(
"Fillet Tracks" ) );
1651 for(
BOARD_ITEM* item : itemsToAddToSelection )
1654 if( !operationPerformedOnAtLeastOne )
1655 frame()->ShowInfoBarMsg(
_(
"Unable to fillet the selected track segments." ) );
1656 else if( didOneAttemptFail )
1657 frame()->ShowInfoBarMsg(
_(
"Some of the track segments could not be filleted." ) );
1673 int& aPersitentRadius )
1678 return std::nullopt;
1682 return aPersitentRadius;
1686static std::optional<DOGBONE_CORNER_ROUTINE::PARAMETERS>
1695 std::vector<WX_MULTI_ENTRY_DIALOG::ENTRY> entries{
1702 _(
"Add slots in acute corners" ),
1704 _(
"Add slots in acute corners to allow access to a cutter of the given radius" ),
1711 return std::nullopt;
1713 std::vector<WX_MULTI_ENTRY_DIALOG::RESULT> results = dlg.
GetValues();
1714 wxCHECK( results.size() == 2, std::nullopt );
1718 s_dogBoneParams.DogboneRadiusIU = std::get<long long int>( results[0] );
1719 s_dogBoneParams.AddSlots = std::get<bool>( results[1] );
1721 catch(
const std::bad_variant_access& )
1724 return std::nullopt;
1727 return s_dogBoneParams;
1741 const int default_setback =
pcbIUScale.mmToIU( 1 );
1743 static CHAMFER_PARAMS params{ default_setback, default_setback };
1746 params.m_chamfer_setback_a );
1749 return std::nullopt;
1751 params.m_chamfer_setback_a = dlg.
GetValue();
1754 params.m_chamfer_setback_b = params.m_chamfer_setback_a;
1765 std::vector<VECTOR2I> pts;
1768 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1774 if( !item->
IsType( { PCB_SHAPE_LOCATE_SEGMENT_T,
1775 PCB_SHAPE_LOCATE_POLY_T,
1776 PCB_SHAPE_LOCATE_RECT_T } ) )
1778 aCollector.
Remove( item );
1785 std::set<PCB_SHAPE*> lines_to_add;
1786 std::vector<PCB_SHAPE*> items_to_remove;
1790 std::vector<VECTOR2I> pts;
1797 items_to_remove.push_back( graphic );
1800 pts.emplace_back( start );
1802 pts.emplace_back(
end );
1808 items_to_remove.push_back( graphic );
1810 for(
int jj = 0; jj < graphic->
GetPolyShape().VertexCount(); ++jj )
1814 for(
size_t jj = 1; jj < pts.size(); ++jj )
1822 lines_to_add.insert( line );
1825 if( pts.size() > 1 )
1830 line->
SetEnd( pts.front() );
1833 lines_to_add.insert( line );
1841 frame()->ShowInfoBarMsg(
_(
"Exactly two lines must be selected to extend them." ) );
1848 else if( segmentCount < 2 )
1850 frame()->ShowInfoBarMsg(
_(
"A shape with at least two lines must be selected." ) );
1868 for(
PCB_SHAPE* item : items_to_remove )
1879 std::vector<BOARD_ITEM*> items_to_select_on_success;
1882 std::vector<BOARD_ITEM*> items_to_deselect_on_success;
1887 auto item_modification_handler =
1894 items_to_select_on_success.push_back( &aItem );
1898 bool any_items_created = !lines_to_add.empty();
1899 auto item_creation_handler =
1900 [&]( std::unique_ptr<BOARD_ITEM> aItem )
1902 any_items_created =
true;
1903 items_to_select_on_success.push_back( aItem.get() );
1904 commit.
Add( aItem.release() );
1907 bool any_items_removed = !items_to_remove.empty();
1908 auto item_removal_handler =
1912 any_items_removed =
true;
1913 items_to_deselect_on_success.push_back( &aItem );
1919 item_creation_handler, item_modification_handler, item_removal_handler );
1922 std::unique_ptr<PAIRWISE_LINE_ROUTINE> pairwise_line_routine;
1926 static int s_filletRadius =
pcbIUScale.mmToIU( 1 );
1927 std::optional<int> filletRadiusIU =
1930 if( filletRadiusIU.has_value() )
1932 pairwise_line_routine = std::make_unique<LINE_FILLET_ROUTINE>(
1933 frame()->GetModel(), change_handler, *filletRadiusIU );
1938 std::optional<DOGBONE_CORNER_ROUTINE::PARAMETERS> dogboneParams =
1941 if( dogboneParams.has_value() )
1943 pairwise_line_routine = std::make_unique<DOGBONE_CORNER_ROUTINE>(
1944 frame()->GetModel(), change_handler, *dogboneParams );
1951 if( chamfer_params.has_value() )
1953 pairwise_line_routine = std::make_unique<LINE_CHAMFER_ROUTINE>(
frame()->GetModel(),
1960 pairwise_line_routine = std::make_unique<LINE_EXTENSION_ROUTINE>(
frame()->GetModel(),
1964 if( !pairwise_line_routine )
1975 if( ( a->GetFlags() & STRUCT_DELETED ) == 0
1976 && ( b->GetFlags() & STRUCT_DELETED ) == 0 )
1978 PCB_SHAPE* line_a = static_cast<PCB_SHAPE*>( a );
1979 PCB_SHAPE* line_b = static_cast<PCB_SHAPE*>( b );
1981 pairwise_line_routine->ProcessLinePair( *line_a, *line_b );
1986 for(
BOARD_ITEM* item : items_to_select_on_success )
1987 m_selectionTool->AddItemToSel( item,
true );
1990 for(
BOARD_ITEM* item : items_to_deselect_on_success )
1991 m_selectionTool->RemoveItemFromSel( item,
true );
1993 if( any_items_removed )
1996 if( any_items_created )
2002 commit.Push( pairwise_line_routine->GetCommitDescription() );
2004 if(
const std::optional<wxString> msg = pairwise_line_routine->GetStatusMessage( segmentCount ) )
2005 frame()->ShowInfoBarMsg( *msg );
2016 std::vector<VECTOR2I> pts;
2019 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
2023 if( !item->
IsType( { PCB_SHAPE_LOCATE_POLY_T, PCB_ZONE_T } ) )
2024 aCollector.
Remove( item );
2028 if( zone->IsTeardropArea() )
2029 aCollector.
Remove( item );
2037 static int s_toleranceValue =
pcbIUScale.mmToIU( 3 );
2047 if( s_toleranceValue <= 0 )
2052 std::vector<PCB_SHAPE*> shapeList;
2056 commit.Modify( item );
2073 commit.
Push(
_(
"Simplify Polygons" ) );
2087 std::vector<VECTOR2I> pts;
2090 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
2096 if( !item->
IsType( { PCB_SHAPE_LOCATE_SEGMENT_T, PCB_SHAPE_LOCATE_ARC_T,
2097 PCB_SHAPE_LOCATE_BEZIER_T } ) )
2099 aCollector.
Remove( item );
2107 static int s_toleranceValue =
pcbIUScale.mmToIU( 3 );
2117 if( s_toleranceValue <= 0 )
2122 std::vector<PCB_SHAPE*> shapeList;
2128 shapeList.push_back( shape );
2129 commit.Modify( shape );
2135 commit.Push(
_(
"Heal Shapes" ) );
2150 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
2154 static const std::vector<KICAD_T> polygonBooleanTypes = {
2160 if( !item->
IsType( polygonBooleanTypes ) )
2161 aCollector.
Remove( item );
2170 std::vector<PCB_SHAPE*> items_to_process;
2174 items_to_process.push_back(
static_cast<PCB_SHAPE*
>( item ) );
2179 if( item == last_item )
2180 std::swap( items_to_process.back(), items_to_process.front() );
2186 auto item_modification_handler =
2189 commit.Modify( &aItem );
2192 std::vector<BOARD_ITEM*> items_to_select_on_success;
2194 auto item_creation_handler =
2195 [&]( std::unique_ptr<BOARD_ITEM> aItem )
2197 items_to_select_on_success.push_back( aItem.get() );
2198 commit.Add( aItem.release() );
2201 auto item_removal_handler =
2204 commit.Remove( &aItem );
2209 item_modification_handler,
2210 item_removal_handler );
2213 std::unique_ptr<POLYGON_BOOLEAN_ROUTINE> boolean_routine;
2215 const auto create_routine = [&]() -> std::unique_ptr<POLYGON_BOOLEAN_ROUTINE>
2222 wxCHECK( model,
nullptr );
2226 return std::make_unique<POLYGON_MERGE_ROUTINE>( model, change_handler );
2230 return std::make_unique<POLYGON_SUBTRACT_ROUTINE>( model, change_handler );
2234 return std::make_unique<POLYGON_INTERSECT_ROUTINE>( model, change_handler );
2239 const auto run_routine = [&]()
2242 for(
PCB_SHAPE* shape : items_to_process )
2243 boolean_routine->ProcessShape( *shape );
2245 boolean_routine->Finalize();
2248 boolean_routine = create_routine();
2250 wxCHECK_MSG( boolean_routine, 0,
"Could not find a polygon routine for this action" );
2257 if( !boolean_routine->IsCommutative() && items_to_select_on_success.empty() )
2261 items_to_select_on_success.clear();
2263 std::map<const PCB_SHAPE*, VECTOR2I::extended_type> items_area;
2265 for(
PCB_SHAPE* shape : items_to_process )
2268 items_area[shape] = area;
2277 std::sort( items_to_process.begin(), items_to_process.end(),
2280 return items_area[a] > items_area[b];
2284 boolean_routine = create_routine();
2289 for(
BOARD_ITEM* item : items_to_select_on_success )
2295 commit.Push( boolean_routine->GetCommitDescription() );
2297 if(
const std::optional<wxString> msg = boolean_routine->GetStatusMessage() )
2298 frame()->ShowInfoBarMsg( *msg );
2320 std::vector<PCB_TABLECELL*> cells;
2370 for(
EDA_ITEM* eda_item : selCopy )
2372 if( !eda_item->IsBOARD_ITEM() )
2412 if( editFrame && item )
2432 commit = &localCommit;
2453 std::optional<VECTOR2I> oldRefPt;
2458 oldRefPt =
selection.GetReferencePoint();
2482 bool usePcbShapeCenter =
false;
2489 usePcbShapeCenter =
true;
2493 usePcbShapeCenter =
true;
2499 else if( usePcbShapeCenter )
2511 if(
frame()->GetCanvas()->GetView()->GetGAL()->IsFlippedX() )
2512 rotateAngle = -rotateAngle;
2518 viewBBox.
Merge( item->ViewBBox() );
2527 typedef std::numeric_limits<int> coord_limits;
2532 bool outOfBounds = rotPos.
x < min || rotPos.
x > max || rotPos.
y < min || rotPos.
y > max
2533 || rotEnd.
x < min || rotEnd.
x > max || rotEnd.
y < min || rotEnd.
y > max;
2541 if( item->IsBOARD_ITEM() )
2545 board_item->
Rotate( refPt, rotateAngle );
2549 static_cast<FOOTPRINT*
>( board_item )->InvalidateComponentClassCache();
2553 if( !localCommit.
Empty() )
2554 localCommit.
Push(
_(
"Rotate" ) );
2571 selection.SetReferencePoint( *oldRefPt );
2589 MIRROR( tmpPt, aMirrorPoint, aFlipDirection );
2632 commit = &localCommit;
2660 switch( item->Type() )
2663 static_cast<PCB_SHAPE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2667 static_cast<ZONE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2672 static_cast<PCB_TEXT*
>( item )->
Mirror( mirrorPoint, flipDirection );
2684 mirrorPad( *
static_cast<PAD*
>( item ), mirrorPoint, flipDirection );
2690 static_cast<PCB_TRACK*
>( item )->
Mirror( mirrorPoint, flipDirection );
2694 static_cast<PCB_GROUP*
>( item )->
Mirror( mirrorPoint, flipDirection );
2702 static_cast<PCB_POINT*
>( item )->
Mirror( mirrorPoint, flipDirection );
2711 if( !localCommit.
Empty() )
2712 localCommit.
Push(
_(
"Mirror" ) );
2741 commit = &localCommit;
2769 setJustify(
static_cast<PCB_TEXT*
>( item ) );
2778 if( !localCommit.
Empty() )
2781 localCommit.
Push(
_(
"Left Justify" ) );
2783 localCommit.
Push(
_(
"Center Justify" ) );
2785 localCommit.
Push(
_(
"Right Justify" ) );
2815 commit = &localCommit;
2830 std::optional<VECTOR2I> oldRefPt;
2833 oldRefPt =
selection.GetReferencePoint();
2859 if( !item->IsBOARD_ITEM() )
2866 boardItem->
Flip( refPt, flipDirection );
2870 static_cast<FOOTPRINT*
>( boardItem )->InvalidateComponentClassCache();
2873 if( !localCommit.
Empty() )
2874 localCommit.
Push(
_(
"Change Side / Flip" ) );
2890 selection.SetReferencePoint( *oldRefPt );
2902 int commitFlags = 0;
2907 int itemsDeleted = 0;
2908 int fieldsHidden = 0;
2909 int fieldsAlreadyHidden = 0;
2913 if( !item->IsBOARD_ITEM() )
2919 switch( item->Type() )
2925 wxASSERT( parentFP );
2926 commit.
Modify( parentFP );
2935 fieldsAlreadyHidden++;
2938 getView()->Update( parentFP );
2955 commit.
Remove( board_item );
2961 commit.
Modify( board_item );
2962 static_cast<PCB_TABLECELL*
>( board_item )->SetText( wxEmptyString );
2974 commit.
Remove( board_item );
2981 commit.
Remove( board_item );
2991 if( !aIsCut && aItems.
GetSize() == 1 )
2994 ZONE* zone =
static_cast<ZONE*
>( board_item );
2996 int outlineIdx, holeIdx;
3017 commit.
Remove( board_item );
3028 commit.Push(
_(
"Delete" ), commitFlags );
3036 commit.
Remove( board_item );
3044 commit.
Remove( board_item );
3053 if( enteredGroup && enteredGroup->
GetItems().empty() )
3058 commit.
Push(
_(
"Cut" ), commitFlags );
3060 else if( itemsDeleted == 0 )
3062 if( fieldsHidden == 1 )
3063 commit.
Push(
_(
"Hide Field" ), commitFlags );
3064 else if( fieldsHidden > 1 )
3065 commit.
Push(
_(
"Hide Fields" ), commitFlags );
3066 else if( fieldsAlreadyHidden > 0 )
3067 editFrame->
ShowInfoBarError(
_(
"Use the Footprint Properties dialog to remove fields." ) );
3071 commit.
Push(
_(
"Delete" ), commitFlags );
3082 std::vector<BOARD_ITEM*> lockedItems;
3174 if( ret == wxID_OK )
3182 selCenter += translation;
3184 if( !
frame()->GetPcbNewSettings()->m_Display.m_DisplayInvertYAxis )
3185 rotation = -rotation;
3189 if( !item->IsBOARD_ITEM() )
3197 boardItem->
Move( translation );
3199 switch( rotationAnchor )
3205 boardItem->
Rotate( selCenter, angle );
3208 boardItem->
Rotate(
frame()->GetScreen()->m_LocalOrigin, angle );
3211 boardItem->
Rotate(
board()->GetDesignSettings().GetAuxOrigin(), angle );
3216 getView()->Update( boardItem );
3219 commit.
Push(
_(
"Move Exactly" ) );
3275 std::vector<BOARD_ITEM*> new_items;
3282 if( !item->IsBOARD_ITEM() )
3294 switch( orig_item->
Type() )
3314 dupe_item = parentFootprint->
DuplicateItem(
true, &commit, orig_item );
3316 dupe_item = orig_item->
Duplicate(
true, &commit );
3322 new_items.push_back( dupe_item );
3323 commit.
Add( dupe_item );
3333 dupe_item = parentFootprint->
DuplicateItem(
true, &commit, orig_item );
3335 if( increment &&
static_cast<PAD*
>( dupe_item )->CanHaveNumber() )
3341 static_cast<PAD*
>( dupe_item )->SetNumber( padNumber );
3348 new_items.push_back( dupe_item );
3349 commit.
Add( dupe_item );
3358 dupe_item =
static_cast<PCB_GROUP*
>( orig_item )->DeepDuplicate(
true, &commit );
3364 new_items.push_back( aItem );
3365 commit.
Add( aItem );
3370 new_items.push_back( dupe_item );
3371 commit.
Add( dupe_item );
3385 EDA_ITEMS nItems( new_items.begin(), new_items.end() );
3391 editFrame->
DisplayToolMsg( wxString::Format(
_(
"Duplicated %d item(s)" ), (
int) new_items.size() ) );
3395 commit.
Push(
_(
"Duplicate" ) );
3413 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3415 switch( aCollector[i]->Type() )
3445 commit = &localCommit;
3449 switch( item->Type() )
3459 if( !
pad.CanHaveNumber() )
3463 std::optional<wxString> newNumber = incrementer.Increment(
pad.GetNumber(), param.
Delta, param.
Index );
3468 pad.SetNumber( *newNumber );
3477 std::optional<wxString> newText = incrementer.Increment(
text.GetText(), param.
Delta, param.
Index );
3482 text.SetText( *newText );
3495 commit->
Push(
_(
"Increment" ) );
3503 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3505 if( aCollector[i]->Type() !=
PCB_PAD_T )
3513 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3524 if( aSelection.
Empty() )
3548 BOX2I nonFieldsBBox;
3552 if( !item->IsType( { PCB_TEXT_T, PCB_FIELD_T } ) )
3553 nonFieldsBBox.
Merge( item->GetBoundingBox() );
3568 const wxString& aCanceledMessage,
VECTOR2I& aReferencePoint )
3572 std::optional<VECTOR2I> pickedPoint;
3582 const auto setPickerLayerSet =
3589 layerFilter =
LSET( { editFrame->GetActiveLayer() } );
3597 setPickerLayerSet();
3600 [&](
const VECTOR2D& aPoint ) ->
bool
3602 pickedPoint = aPoint;
3604 if( !aSuccessMessage.empty() )
3626 if( !aCanceledMessage.empty() )
3638 [&](
const int& aFinalState )
3657 setPickerLayerSet();
3660 evt->SetPassEvent();
3671 canvas()->SetStatusPopup(
nullptr );
3675 aReferencePoint = *pickedPoint;
3677 return pickedPoint.has_value();
3686 "pcbnew.InteractiveEdit.selectReferencePoint",
3689 frame()->PushTool( selectReferencePoint );
3704 std::vector<BOARD_ITEM*> items;
3708 if( item->IsBOARD_ITEM() )
3709 items.push_back(
static_cast<BOARD_ITEM*
>( item ) );
3717 _(
"Selection copied" ),
_(
"Copy canceled" ), refPoint ) )
3719 frame()->PopTool( selectReferencePoint );
3728 selection.SetReferencePoint( refPoint );
3732 frame()->SetStatusText(
_(
"Selection copied" ) );
3735 frame()->PopTool( selectReferencePoint );
3755 const auto getItemText = [&](
const BOARD_ITEM& aItem ) -> wxString
3757 switch( aItem.Type() )
3769 return text.GetShownText(
true );
3783 for(
int row = 0; row <
table.GetRowCount(); ++row )
3785 for(
int col = 0; col <
table.GetColCount(); ++col )
3790 if( col <
table.GetColCount() - 1 )
3796 if( row <
table.GetRowCount() - 1 )
3807 return wxEmptyString;
3810 wxArrayString itemTexts;
3814 if( item->IsBOARD_ITEM() )
3817 wxString itemText = getItemText( *boardItem );
3819 itemText.Trim(
false ).Trim(
true );
3821 if( !itemText.IsEmpty() )
3823 itemTexts.Add( std::move( itemText ) );
3829 if( !itemTexts.empty() )
3831 SaveClipboard( wxJoin( itemTexts,
'\n',
'\0' ).ToStdString() );
3856 board()->BuildConnectivity();
3858 canvas()->RedrawRatsnest();
constexpr EDA_IU_SCALE pcbIUScale
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
static TOOL_ACTION decrementPrimary
static TOOL_ACTION pickerSubTool
static TOOL_ACTION unselectAll
static TOOL_ACTION decrementSecondary
static TOOL_ACTION selectItem
Select an item (specified as the event parameter).
static TOOL_ACTION pasteSpecial
static TOOL_ACTION rightJustify
static TOOL_ACTION pageSettings
static TOOL_ACTION incrementSecondary
static TOOL_ACTION duplicate
static TOOL_ACTION incrementPrimary
static TOOL_ACTION doDelete
static TOOL_ACTION cursorClick
static TOOL_ACTION increment
static TOOL_ACTION selectionClear
Clear the current selection.
static TOOL_ACTION leftJustify
static TOOL_ACTION copyAsText
static TOOL_ACTION refreshPreview
static TOOL_ACTION selectAll
static TOOL_ACTION selectItems
Select a list of items (specified as the event parameter)
static TOOL_ACTION centerJustify
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
virtual void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Execute the changes.
virtual void Revert() override
Revert the commit by restoring the modified items state.
NETINFO_ITEM * GetNet() const
Return #NET_INFO object for a given item.
void SetNet(NETINFO_ITEM *aNetInfo)
Set a NET_INFO object for the item.
Abstract interface for BOARD_ITEMs capable of storing other items inside.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
virtual BOARD_ITEM * Duplicate(bool addToParentGroup, BOARD_COMMIT *aCommit=nullptr) const
Create a copy of this BOARD_ITEM.
void SetLocked(bool aLocked) override
bool IsLocked() const override
virtual void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle)
Rotate this object.
virtual void Move(const VECTOR2I &aMoveVector)
Move this object.
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
FOOTPRINT * GetParentFootprint() const
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
virtual void RunOnChildren(const std::function< void(BOARD_ITEM *)> &aFunction, RECURSE_MODE aMode) const
Invoke a function on all children.
BOARD_ITEM_CONTAINER * GetParent() const
virtual void Normalize()
Perform any normalization required after a user rotate and/or flip.
virtual void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection)
Flip this object, i.e.
const LSET & GetVisibleLayers() const
A proxy function that calls the correspondent function in m_BoardSettings.
FOOTPRINT * GetFirstFootprint() const
Get the first footprint on the board or nullptr.
const FOOTPRINTS & Footprints() const
constexpr const Vec & GetPosition() const
constexpr const Vec GetEnd() const
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
constexpr const Vec GetCenter() const
constexpr bool IsValid() const
Represent basic circle geometry with utility geometry functions.
VECTOR2I Center
Public to make access simpler.
int Radius
Public to make access simpler.
CIRCLE & ConstructFromTanTanPt(const SEG &aLineA, const SEG &aLineB, const VECTOR2I &aP)
Construct this circle such that it is tangent to the given segments and passes through the given poin...
VECTOR2I NearestPoint(const VECTOR2I &aP) const
Compute the point on the circumference of the circle that is the closest to aP.
void SaveSelection(const PCB_SELECTION &selected, bool isFootprintEditor)
void SetBoard(BOARD *aBoard)
int GetCount() const
Return the number of objects in the list.
void Remove(int aIndex)
Remove the item at aIndex (first position is 0).
COMMIT & Remove(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Remove a new item from the model.
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Add a new item to the model.
@ TABLECELL_PROPS_EDIT_TABLE
enum TABLECELL_PROPS_RETVALUE GetReturnValue()
bool HitTestDrawingSheetItems(KIGFX::VIEW *aView, const VECTOR2I &aPosition)
void ShowInfoBarError(const wxString &aErrorMsg, bool aShowCloseButton=false, WX_INFOBAR::MESSAGE_TYPE aType=WX_INFOBAR::MESSAGE_TYPE::GENERIC)
Show the WX_INFOBAR displayed on the top of the canvas with a message and an error icon on the left o...
void DisplayToolMsg(const wxString &msg) override
std::unordered_set< EDA_ITEM * > & GetItems()
A base class for most all the KiCad significant classes used in schematics and boards.
virtual VECTOR2I GetPosition() const
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
virtual bool IsType(const std::vector< KICAD_T > &aScanTypes) const
Check whether the item is one of the listed types.
SHAPE_POLY_SET & GetPolyShape()
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
void SetStart(const VECTOR2I &aStart)
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
void SetEnd(const VECTOR2I &aEnd)
void SetWidth(int aWidth)
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
virtual bool IsVisible() const
virtual void SetVisible(bool aVisible)
static const TOOL_EVENT SelectedEvent
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
static const TOOL_EVENT ConnectivityChangedEvent
Selected item had a property changed (except movement)
static const TOOL_EVENT UnselectedEvent
Used when the right click button is pressed, or when the select tool is in effect.
static const std::vector< KICAD_T > DraggableItems
A scan list for items that can be dragged.
A handler that is based on a set of callbacks provided by the user of the ITEM_MODIFICATION_ROUTINE.
An interface for classes handling user events controlling the view behavior such as zooming,...
bool IsBOARD_ITEM() const
virtual wxString GetClass() const =0
Return the class name.
LSET is a set of PCB_LAYER_IDs.
static const LSET & AllLayersMask()
A collection of nets and the parameters used to route or test these nets.
int GetuViaDiameter() const
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
const VECTOR2I & GetDelta(PCB_LAYER_ID aLayer) const
VECTOR2I GetPosition() const override
void SetDelta(PCB_LAYER_ID aLayer, const VECTOR2I &aSize)
void FlipPrimitives(FLIP_DIRECTION aFlipDirection)
Flip (mirror) the primitives left to right or top to bottom, around the anchor position in custom pad...
PAD_SHAPE GetShape(PCB_LAYER_ID aLayer) const
void SetOffset(PCB_LAYER_ID aLayer, const VECTOR2I &aOffset)
void SetPosition(const VECTOR2I &aPos) override
const VECTOR2I & GetOffset(PCB_LAYER_ID aLayer) const
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
void SetOrientation(const EDA_ANGLE &aAngle)
Set the rotation angle of the pad.
static TOOL_ACTION drag45Degree
static TOOL_ACTION duplicateIncrement
Activation of the duplication tool with incrementing (e.g. pad number)
static TOOL_ACTION layerPrev
static TOOL_ACTION changeTrackWidth
Update selected tracks & vias to the current track & via dimensions.
static TOOL_ACTION unrouteSelected
Removes all tracks from the selected items to the first pad.
static TOOL_ACTION mirrorH
Mirroring of selected items.
static TOOL_ACTION updateFootprint
static TOOL_ACTION breakTrack
Break a single track into two segments at the cursor.
static TOOL_ACTION pointEditorMoveMidpoint
static TOOL_ACTION getAndPlace
Find an item and start moving.
static TOOL_ACTION routerRouteSelectedFromEnd
static TOOL_ACTION swapPadNets
Swap nets between selected pads/gates (and connected copper)
static TOOL_ACTION properties
Activation of the edit tool.
static TOOL_ACTION editFpInFpEditor
static TOOL_ACTION moveWithReference
move with a reference point
static TOOL_ACTION changeTrackLayerPrev
static TOOL_ACTION swap
Swapping of selected items.
static TOOL_ACTION routerAutorouteSelected
static TOOL_ACTION moveExact
Activation of the exact move tool.
static TOOL_ACTION intersectPolygons
Intersection of multiple polygons.
static TOOL_ACTION pointEditorMoveCorner
static TOOL_ACTION genRemove
static TOOL_ACTION selectConnection
Select tracks between junctions or expands an existing selection to pads or the entire connection.
static TOOL_ACTION assignNetClass
static TOOL_ACTION packAndMoveFootprints
Pack and start moving selected footprints.
static TOOL_ACTION copyWithReference
copy command with manual reference point selection
static TOOL_ACTION healShapes
Connect selected shapes, possibly extending or cutting them, or adding extra geometry.
static TOOL_ACTION dragFreeAngle
static TOOL_ACTION inspectClearance
static TOOL_ACTION updateLocalRatsnest
static TOOL_ACTION updateFootprints
static TOOL_ACTION deleteFull
static TOOL_ACTION unrouteSegment
Removes track segment from the selected item to the next segment.
static TOOL_ACTION moveIndividually
move items one-by-one
static TOOL_ACTION changeFootprints
static TOOL_ACTION chamferLines
Chamfer (i.e. adds a straight line) all selected straight lines by a user defined setback.
static TOOL_ACTION dogboneCorners
Add "dogbone" corners to selected lines to allow routing with a cutter radius.
static TOOL_ACTION filletTracks
Fillet (i.e. adds an arc tangent to) all selected straight tracks by a user defined radius.
static TOOL_ACTION simplifyPolygons
Simplify polygon outlines.
static TOOL_ACTION interactiveOffsetTool
static TOOL_ACTION footprintProperties
static TOOL_ACTION filletLines
Fillet (i.e. adds an arc tangent to) all selected straight lines by a user defined radius.
static TOOL_ACTION changeFootprint
static TOOL_ACTION routerInlineDrag
Activation of the Push and Shove router (inline dragging mode)
static TOOL_ACTION positionRelative
static TOOL_ACTION move
move or drag an item
static TOOL_ACTION mirrorV
static TOOL_ACTION mergePolygons
Merge multiple polygons into a single polygon.
static TOOL_ACTION subtractPolygons
Subtract polygons from other polygons.
static TOOL_ACTION changeTrackLayerNext
static TOOL_ACTION flip
Flipping of selected objects.
static TOOL_ACTION editVertices
Edit polygon vertices in a table.
static TOOL_ACTION swapGateNets
static TOOL_ACTION layerNext
static TOOL_ACTION extendLines
Extend selected lines to meet at a point.
static TOOL_ACTION routerRouteSelected
static TOOL_ACTION rotateCw
Rotation of selected objects.
static TOOL_ACTION rotateCcw
virtual double GetLength() const override
Return the length of the arc track.
void SetMid(const VECTOR2I &aMid)
EDA_ANGLE GetAngle() const
const VECTOR2I & GetMid() const
virtual VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
Common, abstract interface for edit frames.
virtual void OnEditItemRequest(BOARD_ITEM *aItem)
Install the corresponding dialog editor for the given item.
void OpenVertexEditor(BOARD_ITEM *aItem)
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
DS_PROXY_VIEW_ITEM * GetDrawingSheet() const
static const TOOL_EVENT & SnappingModeChangedByKeyEvent()
Hotkey feedback.
A set of BOARD_ITEMs (i.e., without duplicates).
Tool that displays edit points allowing to modify items by dragging the points.
A PCB_POINT is a 0-dimensional point that is used to mark a position on a PCB, or more usually a foot...
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
int GetWidth() const override
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
wxString GetShownText(bool aAllowExtraText, int aDepth=0) const override
Return the string actually shown after processing of the base text.
void SetHasSolderMask(bool aVal)
virtual double GetLength() const
Get the length of the track using the hypotenuse calculation.
void SetEnd(const VECTOR2I &aEnd)
bool HasSolderMask() const
void SetStart(const VECTOR2I &aStart)
void SetLocalSolderMaskMargin(std::optional< int > aMargin)
std::optional< int > GetLocalSolderMaskMargin() const
const VECTOR2I & GetStart() const
const VECTOR2I & GetEnd() const
EDA_ITEM_FLAGS IsPointOnEnds(const VECTOR2I &point, int min_dist=0) const
Return STARTPOINT if point if near (dist = min_dist) start point, ENDPOINT if point if near (dist = m...
virtual void SetWidth(int aWidth)
virtual int GetWidth() const
const VECTOR2I NearestPoint(const VECTOR2I &aP) const
Compute a point on the segment (this) that is closest to point aP.
OPT_VECTOR2I IntersectLines(const SEG &aSeg) const
Compute the intersection point of lines passing through ends of (this) and aSeg.
bool ApproxCollinear(const SEG &aSeg, int aDistanceThreshold=1) const
VECTOR2I LineProject(const VECTOR2I &aP) const
Compute the perpendicular projection point of aP on a line passing through ends of the segment.
SEG PerpendicularSeg(const VECTOR2I &aP) const
Compute a segment perpendicular to this one, passing through point aP.
int Side(const VECTOR2I &aP) const
Determine on which side of directed line passing via segment ends point aP lies.
EDA_ANGLE Angle(const SEG &aOther) const
Determine the smallest angle between two segments.
static SELECTION_CONDITION HasTypes(std::vector< KICAD_T > aTypes)
Create a functor that tests if among the selected items there is at least one of a given types.
static SELECTION_CONDITION HasType(KICAD_T aType)
Create a functor that tests if among the selected items there is at least one of a given type.
static bool NotEmpty(const SELECTION &aSelection)
Test if there are any items selected.
static SELECTION_CONDITION MoreThan(int aNumber)
Create a functor that tests if the number of selected items is greater than the value given as parame...
static SELECTION_CONDITION Count(int aNumber)
Create a functor that tests if the number of selected items is equal to the value given as parameter.
static SELECTION_CONDITION OnlyTypes(std::vector< KICAD_T > aTypes)
Create a functor that tests if the selected items are only of given types.
virtual VECTOR2I GetCenter() const
Returns the center point of the selection area bounding box.
virtual unsigned int GetSize() const override
Return the number of stored items.
bool HasType(KICAD_T aType) const
Checks if there is at least one item of requested kind.
int Size() const
Returns the number of selected parts.
std::deque< EDA_ITEM * > & Items()
void SetReferencePoint(const VECTOR2I &aP)
bool Empty() const
Checks if there is anything selected.
bool HasReferencePoint() const
size_t CountType(KICAD_T aType) const
const VECTOR2I & GetP1() const
const VECTOR2I & GetP0() const
Represent a set of closed polygons.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
void SimplifyOutlines(int aMaxError=0)
Simplifies the lines in the polyset.
const VECTOR2I & CVertex(int aIndex, int aOutline, int aHole) const
Return the index-th vertex in a given hole outline within a given outline.
static const int MIN_PRECISION_IU
This is the minimum precision for all the points in a shape.
Heuristically increment a string's n'th part from the right.
void SetSkipIOSQXZ(bool aSkip)
If a alphabetic part is found, skip the letters I, O, S, Q, X, Z.
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
VECTOR2_TRAITS< int32_t >::extended_type extended_type
A dialog like WX_UNIT_ENTRY_DIALOG, but with multiple entries.
std::vector< RESULT > GetValues() const
Returns the values in the order they were added.
An extension of WX_TEXT_ENTRY_DIALOG that uses UNIT_BINDER to request a dimension (e....
int GetValue()
Return the value in internal units.
Handle a list of polygons defining a copper zone.
bool UnFill()
Removes the zone filling.
bool HitTestCutout(const VECTOR2I &aRefPos, int *aOutlineIdx=nullptr, int *aHoleIdx=nullptr) const
Test if the given point is contained within a cutout of the zone.
void HatchBorder()
Compute the hatch lines depending on the hatch parameters and stores it in the zone's attribute m_bor...
void RemoveCutout(int aOutlineIdx, int aHoleIdx)
Remove a cutout from the zone.
bool IsTeardropArea() const
bool SaveClipboard(const std::string &aTextUTF8)
Store information to the system clipboard.
@ ROTATE_AROUND_USER_ORIGIN
@ ROTATE_AROUND_SEL_CENTER
@ ROTATE_AROUND_AUX_ORIGIN
@ ROTATE_AROUND_ITEM_ANCHOR
static constexpr EDA_ANGLE ANGLE_180
std::vector< EDA_ITEM * > EDA_ITEMS
Define list of drawing items for screens.
#define IS_NEW
New item, just created.
#define STRUCT_DELETED
flag indication structures to be erased
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
void ConnectBoardShapes(std::vector< PCB_SHAPE * > &aShapeList, int aChainingEpsilon)
Connects shapes to each other, making continious contours (adjacent shapes will have a common vertex)...
@ LAYER_DRAWINGSHEET
Sheet frame and title block.
@ LAYER_SCHEMATIC_DRAWINGSHEET
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
#define UNIMPLEMENTED_FOR(type)
constexpr void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
@ LEFT_RIGHT
Flip left to right (around the Y axis)
@ TOP_BOTTOM
Flip top to bottom (around the X axis)
KICOMMON_API wxString MessageTextFromValue(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, double aValue, bool aAddUnitsText=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
A helper to convert the double length aValue to a string in inches, millimeters, or unscaled units.
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
void for_all_pairs(_InputIterator __first, _InputIterator __last, _Function __f)
Apply a function to every possible pair of elements of a sequence.
Class to handle a set of BOARD_ITEMs.
@ ID_POPUP_PCB_SWAP_UNIT_LAST
@ ID_POPUP_PCB_SWAP_UNIT_BASE
std::optional< VECTOR2I > OPT_VECTOR2I
std::function< bool(const SELECTION &)> SELECTION_CONDITION
Functor type that checks a specific condition for selected items.
Parameters that define a simple chamfer operation.
const VECTOR2I CalcArcMid(const VECTOR2I &aStart, const VECTOR2I &aEnd, const VECTOR2I &aCenter, bool aMinArcAngle=true)
Return the middle point of an arc, half-way between aStart and aEnd.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
@ PCB_GENERATOR_T
class PCB_GENERATOR, generator on a layer
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
@ PCB_ZONE_T
class ZONE, a copper pour area
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
@ PCB_SHAPE_LOCATE_CIRCLE_T
@ PCB_SHAPE_LOCATE_SEGMENT_T
@ PCB_SHAPE_LOCATE_RECT_T
@ PCB_TABLECELL_T
class PCB_TABLECELL, PCB_TEXTBOX for use in tables
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
@ PCB_SHAPE_LOCATE_BEZIER_T
@ PCB_PAD_T
class PAD, a pad in a footprint
@ PCB_SHAPE_LOCATE_POLY_T
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
@ PCB_DIMENSION_T
class PCB_DIMENSION_BASE: abstract dimension meta-type
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
@ PCB_POINT_T
class PCB_POINT, a 0-dimensional point
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
Casted dyn_cast(From aObject)
A lightweight dynamic downcast.
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D