72using namespace std::placeholders;
74#include <wx/hyperlink.h>
102 ZONE* zone =
static_cast<ZONE*
>( aItem );
115 if( aSelection.
GetSize() != 1 )
171 else if( item->IsType( EDIT_TOOL::MirrorableItems ) )
201 std::shared_ptr<CONDITIONAL_MENU> menu = std::make_shared<CONDITIONAL_MENU>( aEditTool );
204 menu->SetUntranslatedTitle(
_HKI(
"Mirror / Rotate" ) );
206 bool isBoardEditor = aEditTool && aEditTool->
IsBoardEditor();
209 [isBoardEditor](
const SELECTION& aSelection )
228 std::shared_ptr<CONDITIONAL_MENU> menu = std::make_shared<CONDITIONAL_MENU>( aTool );
231 menu->SetUntranslatedTitle(
_HKI(
"Routing" ) );
233 auto notMovingCondition =
236 return aSelection.Empty() || !aSelection.Front()->IsMoving();
241 && notMovingCondition;
258 std::shared_ptr<CONDITIONAL_MENU> menu = std::make_shared<CONDITIONAL_MENU>( aTool );
261 menu->SetUntranslatedTitle(
_HKI(
"Position" ) );
263 auto notMovingCondition =
266 return aSelection.Empty() || !aSelection.Front()->IsMoving();
280 std::shared_ptr<CONDITIONAL_MENU> menu = std::make_shared<CONDITIONAL_MENU>( aTool );
282 menu->SetUntranslatedTitle(
_HKI(
"Shape Modification" ) );
297 auto hasCornerCondition =
305 auto hasMidpointCondition =
313 auto canAddCornerCondition =
316 const EDA_ITEM* item = aSelection.Front();
321 auto canChamferCornerCondition =
324 const EDA_ITEM* item = aSelection.Front();
329 auto canRemoveCornerCondition =
399 for(
const EDA_ITEM* it : aSelection )
410 const std::vector<FOOTPRINT::FP_UNIT_INFO>& units = fp->
GetUnitInfo();
412 if( units.size() < 2 )
415 const wxString& padNum =
pad->GetNumber();
416 bool inAnyUnit =
false;
420 for(
const wxString& pnum : u.m_pins )
438 else if( single != fp )
449 std::unordered_set<wxString> padNums;
451 for(
const EDA_ITEM* it : aSelection )
458 if(
pad->GetParentFootprint() != aFootprint )
461 padNums.insert(
pad->GetNumber() );
470 const std::unordered_set<wxString>& aSelPadNums )
472 std::vector<int> indices;
474 const std::vector<FOOTPRINT::FP_UNIT_INFO>& units = aFootprint->
GetUnitInfo();
476 for(
size_t i = 0; i < units.size(); ++i )
480 for(
const wxString& pn : units[i].m_pins )
482 if( aSelPadNums.count( pn ) )
490 indices.push_back(
static_cast<int>( i ) );
500 if( aUnitIndices.empty() )
503 const std::vector<FOOTPRINT::FP_UNIT_INFO>& units = aFootprint->
GetUnitInfo();
504 const size_t cnt = units[
static_cast<size_t>( aUnitIndices.front() )].m_pins.size();
506 for(
int idx : aUnitIndices )
508 if( units[
static_cast<size_t>( idx )].m_pins.size() != cnt )
519 std::vector<int> targets;
521 const std::vector<FOOTPRINT::FP_UNIT_INFO>& units = aFootprint->
GetUnitInfo();
522 const size_t pinCount = units[
static_cast<size_t>( aSourceIdx )].m_pins.size();
524 for(
size_t i = 0; i < units.size(); ++i )
526 if(
static_cast<int>( i ) == aSourceIdx )
529 if( units[i].m_pins.size() != pinCount )
532 targets.push_back(
static_cast<int>( i ) );
562 if( unitsHit.size() != 1 )
565 const int sourceIdx = unitsHit.front();
568 for(
int idx : targets )
571 label.Printf(
_(
"Swap with %s" ), fp->
GetUnitInfo()[
static_cast<size_t>( idx )].m_unitName );
579 int id = aEvent.GetId();
591 const std::vector<FOOTPRINT::FP_UNIT_INFO>& units = fp->
GetUnitInfo();
594 if( targetIdx < 0 || targetIdx >=
static_cast<int>( units.size() ) )
610 std::shared_ptr<GATE_SWAP_MENU> menu = std::make_shared<GATE_SWAP_MENU>();
611 menu->SetTool( aTool );
625 m_selectionTool->GetToolMenu().RegisterSubMenu( positioningToolsSubMenu );
631 m_selectionTool->GetToolMenu().RegisterSubMenu( shapeModificationSubMenu );
636 std::shared_ptr<CONDITIONAL_MENU> fpAttributesMenu = std::make_shared<CONDITIONAL_MENU>(
this );
637 fpAttributesMenu->SetUntranslatedTitle(
_HKI(
"Attributes" ) );
643 auto positioningToolsCondition =
647 subMenu->Evaluate( aSel );
648 return subMenu->GetMenuItemCount() > 0;
651 auto shapeModificationCondition =
655 subMenu->Evaluate( aSel );
656 return subMenu->GetMenuItemCount() > 0;
660 auto gateSwapSingleUnitOnOneFootprint =
672 if( unitsHit.size() != 1 )
675 const int sourceIdx = unitsHit.front();
677 return !targets.empty();
681 auto gateSwapMultipleUnitsOnOneFootprint =
693 if( unitsHit.size() < 2 )
699 auto propertiesCondition =
702 if( aSel.GetSize() == 0 )
716 if( aSel.GetSize() == 1 )
728 auto inFootprintEditor =
753 auto multipleFootprintsCondition =
756 bool foundFirst =
false;
772 auto excludeFromBOMCond =
775 wxString variantName;
776 int checked = 0, unchecked = 0;
779 variantName =
board->GetCurrentVariant();
785 if(
static_cast<const FOOTPRINT*
>( item )->GetExcludedFromBOMForVariant( variantName ) )
792 return checked > 0 && unchecked == 0;
795 auto excludeFromPosFilesCond =
798 wxString variantName;
799 int checked = 0, unchecked = 0;
802 variantName =
board->GetCurrentVariant();
808 if(
static_cast<const FOOTPRINT*
>( item )->GetExcludedFromPosFilesForVariant( variantName ) )
815 return checked > 0 && unchecked == 0;
818 auto excludeFromSimCond =
821 wxString variantName;
822 int checked = 0, unchecked = 0;
825 variantName =
board->GetCurrentVariant();
831 if(
static_cast<const FOOTPRINT*
>( item )->GetExcludedFromSimForVariant( variantName ) )
838 return checked > 0 && unchecked == 0;
841 auto noActiveToolCondition =
844 return frame()->ToolStackIsEmpty();
847 auto notMovingCondition =
850 return aSelection.Empty() || !aSelection.Front()->IsMoving();
853 auto noItemsCondition =
854 [
this](
const SELECTION& aSelections ) ->
bool
856 return frame()->GetBoard() && !
frame()->GetBoard()->IsEmpty();
867 && notMovingCondition && !inFootprintEditor;
906 menu.AddMenu( gateSwapSubMenu.get(), gateSwapSingleUnitOnOneFootprint );
921 && !inFootprintEditor );
931 menu.AddMenu( fpAttributesMenu.get(), singleFootprintCondition || multipleFootprintsCondition );
934 menu.AddSeparator( 100 );
935 menu.AddMenu( routingSubMenu.get(), isRoutable, 100 );
936 menu.AddMenu( mirrorRotateSubMenu.get(), canMirror, 100 );
937 menu.AddMenu( shapeModificationSubMenu.get(), shapeModificationCondition, 100 );
938 menu.AddMenu( positioningToolsSubMenu.get(), positioningToolsCondition, 100 );
940 menu.AddSeparator( 150 );
953 menu.AddSeparator( 2000 );
973 wxString footprintName;
974 wxArrayString fplist;
979 fplist.Add( fp->GetReference() + wxT(
" ( " ) + fp->GetValue() + wxT(
" )" ) );
989 footprintName.Trim(
true );
990 footprintName.Trim(
false );
992 if( !footprintName.IsEmpty() )
996 if( fp->GetReference().CmpNoCase( footprintName ) == 0 )
1096 std::vector<PCB_TRACK*> tracks;
1097 std::vector<PCB_TRACK*> vias;
1098 std::vector<FOOTPRINT*> footprints;
1101 const auto gatherItemsByType =
1109 vias.push_back( track );
1111 tracks.push_back( track );
1121 gatherItemsByType();
1126 for(
int ii = aCollector.
GetCount() - 1; ii >= 0; --ii )
1132 else if( tracks.size() || vias.size() )
1146 gatherItemsByType();
1160 if( tracks.size() == 2 && vias.size() == 0 )
1162 if( connected( tracks[0], tracks[1]->GetStart() )
1163 || connected( tracks[0], tracks[1]->GetEnd() ) )
1165 aCollector.
Remove( tracks[1] );
1168 else if( tracks.size() == 2 && vias.size() == 1 )
1170 if( connected( tracks[0], vias[0]->GetPosition() )
1171 && connected( tracks[1], vias[0]->GetPosition() ) )
1173 aCollector.
Remove( tracks[0] );
1174 aCollector.
Remove( tracks[1] );
1200 wxString variantName;
1203 variantName =
board->GetCurrentVariant();
1205 bool new_state =
false;
1230 if( !variantName.IsEmpty() )
1258 if( !commit.
Empty() )
1259 commit.
Push(
_(
"Toggle Attribute" ) );
1274 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1279 aCollector.
Remove( item );
1305 via->SetDrill(
board()->GetDesignSettings().GetCurrentViaDrill() );
1314 wxCHECK( track, 0 );
1318 int new_width =
board()->GetDesignSettings().GetCurrentTrackWidth();
1323 commit.
Push(
_(
"Edit Track Width/Via Size" ) );
1348 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1353 aCollector.
Remove( item );
1370 if( newLayer == origLayer )
1381 wxCHECK( track, 0 );
1389 commit.
Push(
_(
"Edit Track Layer" ) );
1406 static int filletRadius = 0;
1412 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1417 aCollector.
Remove( item );
1428 frame()->ShowInfoBarMsg(
_(
"At least two straight track segments must be selected." ) );
1444 bool t1Start =
true;
1445 bool t2Start =
true;
1448 std::vector<FILLET_OP> filletOperations;
1449 bool operationPerformedOnAtLeastOne =
false;
1450 bool didOneAttemptFail =
false;
1451 std::set<PCB_TRACK*> processedTracks;
1453 auto processFilletOp =
1454 [&](
PCB_TRACK* aTrack,
bool aStartPoint )
1456 std::shared_ptr<CONNECTIVITY_DATA> c =
board()->GetConnectivity();
1458 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
1462 if( itemsOnAnchor.size() > 0 &&
selection.Contains( itemsOnAnchor.at( 0 ) )
1468 if( processedTracks.find( trackOther ) == processedTracks.end() )
1470 if( itemsOnAnchor.size() == 1 )
1473 filletOp.t1 = aTrack;
1474 filletOp.t2 = trackOther;
1475 filletOp.t1Start = aStartPoint;
1476 filletOp.t2Start = aTrack->
IsPointOnEnds( filletOp.t2->GetStart() );
1477 filletOperations.push_back( filletOp );
1483 didOneAttemptFail =
true;
1497 processFilletOp( track,
true );
1498 processFilletOp( track,
false );
1500 processedTracks.insert( track );
1506 std::vector<BOARD_ITEM*> itemsToAddToSelection;
1508 for( FILLET_OP filletOp : filletOperations )
1516 if( trackOnStart && trackOnEnd )
1519 if( ( trackOnStart || trackOnEnd ) && track1->
GetLayer() == track2->
GetLayer() )
1527 SHAPE_ARC sArc( t1Seg, t2Seg, filletRadius );
1530 auto setIfPointOnSeg =
1533 VECTOR2I segToVec = aSegment.NearestPoint( aVecToTest ) - aVecToTest;
1538 aPointToSet.
x = aVecToTest.x;
1539 aPointToSet.
y = aVecToTest.y;
1547 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP0() )
1548 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP0() ) )
1550 didOneAttemptFail =
true;
1554 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP1() )
1555 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP1() ) )
1557 didOneAttemptFail =
true;
1569 itemsToAddToSelection.push_back( tArc );
1574 if( filletOp.t1Start )
1577 track1->
SetEnd( t1newPoint );
1579 if( filletOp.t2Start )
1582 track2->
SetEnd( t2newPoint );
1584 operationPerformedOnAtLeastOne =
true;
1588 commit.
Push(
_(
"Fillet Tracks" ) );
1591 for(
BOARD_ITEM* item : itemsToAddToSelection )
1594 if( !operationPerformedOnAtLeastOne )
1595 frame()->ShowInfoBarMsg(
_(
"Unable to fillet the selected track segments." ) );
1596 else if( didOneAttemptFail )
1597 frame()->ShowInfoBarMsg(
_(
"Some of the track segments could not be filleted." ) );
1617 return std::nullopt;
1621 return aPersitentRadius;
1633 std::vector<WX_MULTI_ENTRY_DIALOG::ENTRY> entries{
1640 _(
"Add slots in acute corners" ),
1642 _(
"Add slots in acute corners to allow access to a cutter of the given radius" ),
1649 return std::nullopt;
1651 std::vector<WX_MULTI_ENTRY_DIALOG::RESULT> results = dlg.
GetValues();
1652 wxCHECK( results.size() == 2, std::nullopt );
1656 s_dogBoneParams.DogboneRadiusIU = std::get<long long int>( results[0] );
1657 s_dogBoneParams.AddSlots = std::get<bool>( results[1] );
1659 catch(
const std::bad_variant_access& )
1662 return std::nullopt;
1665 return s_dogBoneParams;
1677 const int default_setback =
pcbIUScale.mmToIU( 1 );
1679 static CHAMFER_PARAMS params{ default_setback, default_setback };
1681 WX_UNIT_ENTRY_DIALOG dlg( &aFrame,
_(
"Chamfer Lines" ),
_(
"Chamfer setback:" ), params.m_chamfer_setback_a );
1684 return std::nullopt;
1686 params.m_chamfer_setback_a = dlg.
GetValue();
1689 params.m_chamfer_setback_b = params.m_chamfer_setback_a;
1700 std::vector<VECTOR2I> pts;
1703 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1710 { PCB_SHAPE_LOCATE_SEGMENT_T, PCB_SHAPE_LOCATE_POLY_T, PCB_SHAPE_LOCATE_RECT_T } ) )
1712 aCollector.
Remove( item );
1721 std::set<PCB_SHAPE*> lines_to_add;
1722 std::vector<PCB_SHAPE*> items_to_remove;
1726 std::vector<VECTOR2I> pts;
1733 items_to_remove.push_back( graphic );
1736 pts.emplace_back( start );
1738 pts.emplace_back(
end );
1744 items_to_remove.push_back( graphic );
1746 for(
int jj = 0; jj < graphic->
GetPolyShape().VertexCount(); ++jj )
1750 for(
size_t jj = 1; jj < pts.size(); ++jj )
1758 lines_to_add.insert( line );
1761 if( pts.size() > 1 )
1766 line->
SetEnd( pts.front() );
1769 lines_to_add.insert( line );
1777 frame()->ShowInfoBarMsg(
_(
"Exactly two lines must be selected to extend them." ) );
1784 else if( segmentCount < 2 )
1786 frame()->ShowInfoBarMsg(
_(
"A shape with at least two lines must be selected." ) );
1804 for(
PCB_SHAPE* item : items_to_remove )
1815 std::vector<BOARD_ITEM*> items_to_select_on_success;
1818 std::vector<BOARD_ITEM*> items_to_deselect_on_success;
1823 auto item_modification_handler =
1830 items_to_select_on_success.push_back( &aItem );
1834 bool any_items_created = !lines_to_add.empty();
1835 auto item_creation_handler =
1836 [&]( std::unique_ptr<BOARD_ITEM> aItem )
1838 any_items_created =
true;
1839 items_to_select_on_success.push_back( aItem.get() );
1840 commit.
Add( aItem.release() );
1843 bool any_items_removed = !items_to_remove.empty();
1844 auto item_removal_handler =
1848 any_items_removed =
true;
1849 items_to_deselect_on_success.push_back( &aItem );
1855 item_removal_handler );
1858 std::unique_ptr<PAIRWISE_LINE_ROUTINE> pairwise_line_routine;
1862 static int s_filletRadius =
pcbIUScale.mmToIU( 1 );
1863 std::optional<int> filletRadiusIU =
GetRadiusParams( *
frame(),
_(
"Fillet Lines" ), s_filletRadius );
1865 if( filletRadiusIU.has_value() )
1867 pairwise_line_routine = std::make_unique<LINE_FILLET_ROUTINE>(
frame()->GetModel(), change_handler,
1875 if( dogboneParams.has_value() )
1877 pairwise_line_routine = std::make_unique<DOGBONE_CORNER_ROUTINE>(
frame()->GetModel(), change_handler,
1885 if( chamfer_params.has_value() )
1887 pairwise_line_routine = std::make_unique<LINE_CHAMFER_ROUTINE>(
frame()->GetModel(), change_handler,
1893 pairwise_line_routine = std::make_unique<LINE_EXTENSION_ROUTINE>(
frame()->GetModel(), change_handler );
1896 if( !pairwise_line_routine )
1907 if( ( a->GetFlags() & STRUCT_DELETED ) == 0 && ( b->GetFlags() & STRUCT_DELETED ) == 0 )
1909 PCB_SHAPE* line_a = static_cast<PCB_SHAPE*>( a );
1910 PCB_SHAPE* line_b = static_cast<PCB_SHAPE*>( b );
1912 pairwise_line_routine->ProcessLinePair( *line_a, *line_b );
1917 for(
BOARD_ITEM* item : items_to_select_on_success )
1918 m_selectionTool->AddItemToSel( item,
true );
1921 for(
BOARD_ITEM* item : items_to_deselect_on_success )
1922 m_selectionTool->RemoveItemFromSel( item,
true );
1924 if( any_items_removed )
1927 if( any_items_created )
1933 commit.Push( pairwise_line_routine->GetCommitDescription() );
1935 if(
const std::optional<wxString> msg = pairwise_line_routine->GetStatusMessage( segmentCount ) )
1936 frame()->ShowInfoBarMsg( *msg );
1947 std::vector<VECTOR2I> pts;
1950 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1954 if( !item->
IsType( { PCB_SHAPE_LOCATE_POLY_T, PCB_ZONE_T } ) )
1955 aCollector.
Remove( item );
1959 if( zone->IsTeardropArea() )
1960 aCollector.
Remove( item );
1970 static int s_toleranceValue =
pcbIUScale.mmToIU( 3 );
1979 if( s_toleranceValue <= 0 )
1984 std::vector<PCB_SHAPE*> shapeList;
1988 commit.Modify( item );
2002 zone->HatchBorder();
2006 commit.
Push(
_(
"Simplify Polygons" ) );
2020 std::vector<VECTOR2I> pts;
2023 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
2029 if( !item->
IsType( { PCB_SHAPE_LOCATE_SEGMENT_T,
2030 PCB_SHAPE_LOCATE_ARC_T,
2031 PCB_SHAPE_LOCATE_BEZIER_T } ) )
2033 aCollector.
Remove( item );
2043 static int s_toleranceValue =
pcbIUScale.mmToIU( 3 );
2052 if( s_toleranceValue <= 0 )
2057 std::vector<PCB_SHAPE*> shapeList;
2063 shapeList.push_back( shape );
2064 commit.Modify( shape );
2070 commit.Push(
_(
"Heal Shapes" ) );
2085 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
2089 static const std::vector<KICAD_T> polygonBooleanTypes = {
2095 if( !item->
IsType( polygonBooleanTypes ) )
2096 aCollector.
Remove( item );
2107 std::vector<PCB_SHAPE*> items_to_process;
2111 items_to_process.push_back(
static_cast<PCB_SHAPE*
>( item ) );
2116 if( item == last_item )
2117 std::swap( items_to_process.back(), items_to_process.front() );
2123 auto item_modification_handler =
2126 commit.Modify( &aItem );
2129 std::vector<BOARD_ITEM*> items_to_select_on_success;
2131 auto item_creation_handler =
2132 [&]( std::unique_ptr<BOARD_ITEM> aItem )
2134 items_to_select_on_success.push_back( aItem.get() );
2135 commit.Add( aItem.release() );
2138 auto item_removal_handler =
2141 commit.Remove( &aItem );
2146 item_removal_handler );
2149 std::unique_ptr<POLYGON_BOOLEAN_ROUTINE> boolean_routine;
2151 const auto create_routine =
2152 [&]() -> std::unique_ptr<POLYGON_BOOLEAN_ROUTINE>
2159 wxCHECK(
model,
nullptr );
2163 return std::make_unique<POLYGON_MERGE_ROUTINE>(
model, change_handler );
2167 return std::make_unique<POLYGON_SUBTRACT_ROUTINE>(
model, change_handler );
2171 return std::make_unique<POLYGON_INTERSECT_ROUTINE>(
model, change_handler );
2176 const auto run_routine =
2180 for(
PCB_SHAPE* shape : items_to_process )
2181 boolean_routine->ProcessShape( *shape );
2183 boolean_routine->Finalize();
2186 boolean_routine = create_routine();
2188 wxCHECK_MSG( boolean_routine, 0,
"Could not find a polygon routine for this action" );
2195 if( !boolean_routine->IsCommutative() && items_to_select_on_success.empty() )
2199 items_to_select_on_success.clear();
2201 std::map<const PCB_SHAPE*, VECTOR2I::extended_type> items_area;
2203 for(
PCB_SHAPE* shape : items_to_process )
2206 items_area[shape] = area;
2215 std::sort( items_to_process.begin(), items_to_process.end(),
2218 return items_area[a] > items_area[b];
2222 boolean_routine = create_routine();
2227 for(
BOARD_ITEM* item : items_to_select_on_success )
2233 commit.Push( boolean_routine->GetCommitDescription() );
2235 if(
const std::optional<wxString> msg = boolean_routine->GetStatusMessage() )
2236 frame()->ShowInfoBarMsg( *msg );
2265 auto containsReadOnlyGenChild =
2270 if( !item->IsBOARD_ITEM() )
2287 if( containsReadOnlyGenChild(
selection ) )
2299 std::vector<PCB_TABLECELL*> cells;
2344 if( !
frame()->GetPropertiesPanel()->IsShownOnScreen() )
2346 infobar->
AddLink(
_(
"Show Properties panel" ),
2347 [
this]( wxHyperlinkEvent& aHyperlinkEvent )
2349 frame()->ToggleProperties();
2354 infobar->
ShowMessageFor(
_(
"Use Properties panel to edit properties common to selected items." ),
2355 8000, wxICON_INFORMATION );
2364 std::vector<PCB_SHAPE*> shapes;
2366 constraintTool->SolveAfterEdit( shapes );
2381 for(
EDA_ITEM* eda_item : selCopy )
2383 if( !eda_item->IsBOARD_ITEM() )
2425 if( editFrame && item )
2438 std::unordered_set<BOARD_ITEM*> visited;
2443 if( !aItem || !visited.insert( aItem ).second )
2447 aShapes.push_back(
static_cast<PCB_SHAPE*
>( aItem ) );
2454 if( item->IsBOARD_ITEM() )
2464 if( !constraintTool )
2467 std::vector<PCB_SHAPE*> shapes;
2487 commit = &localCommit;
2511 std::optional<VECTOR2I> oldRefPt;
2516 oldRefPt =
selection.GetReferencePoint();
2545 bool usePcbShapeCenter =
false;
2552 usePcbShapeCenter =
true;
2556 usePcbShapeCenter =
true;
2562 else if( usePcbShapeCenter )
2574 if(
frame()->GetCanvas()->GetView()->GetGAL()->IsFlippedX() )
2575 rotateAngle = -rotateAngle;
2581 viewBBox.
Merge( item->ViewBBox() );
2590 typedef std::numeric_limits<int> coord_limits;
2595 bool outOfBounds = rotPos.
x < min || rotPos.
x > max || rotPos.
y < min || rotPos.
y > max || rotEnd.
x < min
2596 || rotEnd.
x > max || rotEnd.
y < min || rotEnd.
y > max;
2604 if( item->IsBOARD_ITEM() )
2608 board_item->
Rotate( refPt, rotateAngle );
2612 static_cast<FOOTPRINT*
>( board_item )->InvalidateComponentClassCache();
2620 localCommit.
Push(
_(
"Rotate" ) );
2639 selection.SetReferencePoint( *oldRefPt );
2660 MIRROR( tmpPt, aMirrorPoint, aFlipDirection );
2710 commit = &localCommit;
2732 int skippedFootprints = 0;
2733 int skippedGroups = 0;
2740 skippedFootprints++;
2755 switch( item->Type() )
2758 static_cast<PCB_SHAPE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2762 static_cast<ZONE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2767 static_cast<PCB_TEXT*
>( item )->
Mirror( mirrorPoint, flipDirection );
2776 static_cast<PCB_TABLE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2780 mirrorPad( *
static_cast<PAD*
>( item ), mirrorPoint, flipDirection );
2786 static_cast<PCB_TRACK*
>( item )->
Mirror( mirrorPoint, flipDirection );
2790 static_cast<PCB_GROUP*
>( item )->
Mirror( mirrorPoint, flipDirection );
2799 static_cast<PCB_POINT*
>( item )->
Mirror( mirrorPoint, flipDirection );
break;
2815 localCommit.
Push(
_(
"Mirror" ) );
2821 frame()->ShowInfoBarMsg(
_(
"Footprints cannot be mirrored. Use Flip to move them to "
2822 "the other side of the board." ) );
2826 frame()->ShowInfoBarMsg(
_(
"Groups containing footprints or other items that cannot be "
2827 "mirrored were skipped." ) );
2857 commit = &localCommit;
2887 setJustify(
static_cast<PCB_TEXT*
>( item ) );
2896 if( !localCommit.
Empty() )
2899 localCommit.
Push(
_(
"Left Justify" ) );
2901 localCommit.
Push(
_(
"Center Justify" ) );
2903 localCommit.
Push(
_(
"Right Justify" ) );
2933 commit = &localCommit;
2950 std::optional<VECTOR2I> oldRefPt;
2953 oldRefPt =
selection.GetReferencePoint();
2983 if( !item->IsBOARD_ITEM() )
2990 boardItem->
Flip( refPt, flipDirection );
2994 static_cast<FOOTPRINT*
>( boardItem )->InvalidateComponentClassCache();
3001 localCommit.
Push(
_(
"Change Side / Flip" ) );
3019 selection.SetReferencePoint( *oldRefPt );
3031 int commitFlags = 0;
3036 int itemsDeleted = 0;
3037 int fieldsHidden = 0;
3038 int fieldsAlreadyHidden = 0;
3042 if( !item->IsBOARD_ITEM() )
3048 switch( item->Type() )
3054 wxASSERT( parentFP );
3055 commit.
Modify( parentFP );
3064 fieldsAlreadyHidden++;
3067 getView()->Update( parentFP );
3085 commit.
Remove( board_item );
3095 commit.
Modify( board_item );
3096 static_cast<PCB_TABLECELL*
>( board_item )->SetText( wxEmptyString );
3108 commit.
Remove( board_item );
3115 commit.
Remove( board_item );
3125 if( !aIsCut && aItems.
GetSize() == 1 )
3128 ZONE* zone =
static_cast<ZONE*
>( board_item );
3130 int outlineIdx, holeIdx;
3151 commit.
Remove( board_item );
3163 if( stitch && !aItems.
Contains( stitch ) )
3171 commit.
Remove( board_item );
3183 commit.Push(
_(
"Delete" ), commitFlags );
3191 commit.
Remove( board_item );
3199 commit.
Remove( board_item );
3208 if( enteredGroup && enteredGroup->
GetItems().empty() )
3213 commit.
Push(
_(
"Cut" ), commitFlags );
3215 else if( itemsDeleted == 0 )
3217 if( fieldsHidden == 1 )
3218 commit.
Push(
_(
"Hide Field" ), commitFlags );
3219 else if( fieldsHidden > 1 )
3220 commit.
Push(
_(
"Hide Fields" ), commitFlags );
3221 else if( fieldsAlreadyHidden > 0 )
3222 editFrame->
ShowInfoBarError(
_(
"Use the Footprint Properties dialog to remove fields." ) );
3226 commit.
Push(
_(
"Delete" ), commitFlags );
3251 std::vector<BOARD_ITEM*> lockedItems;
3268 const bool hadInitialSelection = !
m_selectionTool->GetSelection().Empty();
3283 if( hadInitialSelection && selectionCopy.
Empty() )
3309 if( selectionCopy.
Empty() )
3352 if( ret == wxID_OK )
3360 selCenter += translation;
3362 if( !
frame()->GetPcbNewSettings()->m_Display.m_DisplayInvertYAxis )
3363 rotation = -rotation;
3367 if( !item->IsBOARD_ITEM() )
3375 boardItem->
Move( translation );
3377 switch( rotationAnchor )
3383 boardItem->
Rotate( selCenter, angle );
3386 boardItem->
Rotate(
frame()->GetScreen()->m_LocalOrigin, angle );
3389 boardItem->
Rotate(
board()->GetDesignSettings().GetAuxOrigin(), angle );
3394 getView()->Update( boardItem );
3397 commit.
Push(
_(
"Move Exactly" ) );
3419 return std::any_of( aSelection.
begin(), aSelection.
end(),
3422 PCB_GENERATOR* generator = dynamic_cast<PCB_GENERATOR*>( aItem );
3423 return !generator || generator->CanDuplicate();
3465 std::vector<BOARD_ITEM*> new_items;
3470 std::map<KIID, KIID> idMap;
3476 if( !item->IsBOARD_ITEM() )
3488 switch( orig_item->
Type() )
3510 dupe_item = parentFootprint->
DuplicateItem(
true, &commit, orig_item );
3512 dupe_item = orig_item->
Duplicate(
true, &commit );
3522 new_items.push_back( dupe_item );
3523 commit.
Add( dupe_item );
3533 dupe_item = parentFootprint->
DuplicateItem(
true, &commit, orig_item );
3535 if( increment &&
static_cast<PAD*
>( dupe_item )->CanHaveNumber() )
3541 static_cast<PAD*
>( dupe_item )->SetNumber( padNumber );
3549 new_items.push_back( dupe_item );
3550 commit.
Add( dupe_item );
3563 dupe_item =
static_cast<PCB_GROUP*
>( orig_item )->DeepDuplicate(
true, &commit, &idMap );
3569 new_items.push_back( aItem );
3570 commit.
Add( aItem );
3575 new_items.push_back( dupe_item );
3576 commit.
Add( dupe_item );
3590 :
board()->Constraints();
3593 commit.
Add( clone );
3599 EDA_ITEMS nItems( new_items.begin(), new_items.end() );
3605 editFrame->
DisplayToolMsg( wxString::Format(
_(
"Duplicated %d item(s)" ), (
int) new_items.size() ) );
3609 commit.
Push(
_(
"Duplicate" ) );
3627 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3629 switch( aCollector[i]->Type() )
3633 default: aCollector.
Remove( i );
break;
3658 commit = &localCommit;
3662 switch( item->Type() )
3672 if( !
pad.CanHaveNumber() )
3681 pad.SetNumber( *newNumber );
3695 text.SetText( *newText );
3707 commit->
Push(
_(
"Increment" ) );
3715 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3717 if( aCollector[i]->Type() !=
PCB_PAD_T )
3725 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3736 if( aSelection.
Empty() )
3760 BOX2I nonFieldsBBox;
3764 if( !item->IsType( { PCB_TEXT_T, PCB_FIELD_T } ) )
3765 nonFieldsBBox.
Merge( item->GetBoundingBox() );
3780 const wxString& aCanceledMessage,
VECTOR2I& aReferencePoint )
3784 std::optional<VECTOR2I> pickedPoint;
3794 const auto setPickerLayerSet =
3801 layerFilter =
LSET( { editFrame->GetActiveLayer() } );
3809 setPickerLayerSet();
3812 [&](
const VECTOR2D& aPoint ) ->
bool
3814 pickedPoint = aPoint;
3816 if( !aSuccessMessage.empty() )
3838 if( !aCanceledMessage.empty() )
3850 [&](
const int& aFinalState )
3869 setPickerLayerSet();
3872 evt->SetPassEvent();
3883 canvas()->SetStatusPopup(
nullptr );
3887 aReferencePoint = *pickedPoint;
3889 return pickedPoint.has_value();
3897 TOOL_EVENT selectReferencePoint( aEvent.
Category(), aEvent.
Action(),
"pcbnew.InteractiveEdit.selectReferencePoint",
3917 std::vector<BOARD_ITEM*> items;
3921 if( item->IsBOARD_ITEM() )
3922 items.push_back(
static_cast<BOARD_ITEM*
>( item ) );
3929 if( !
pickReferencePoint(
_(
"Select reference point for the copy..." ),
_(
"Selection copied" ),
3930 _(
"Copy canceled" ), refPoint ) )
3940 selection.SetReferencePoint( refPoint );
3944 frame()->SetStatusText(
_(
"Selection copied" ) );
3966 const auto getItemText =
3969 switch( aItem.Type() )
3996 for(
int row = 0; row <
table.GetRowCount(); ++row )
3998 for(
int col = 0; col <
table.GetColCount(); ++col )
4003 if( col <
table.GetColCount() - 1 )
4007 if( row <
table.GetRowCount() - 1 )
4017 return wxEmptyString;
4020 wxArrayString itemTexts;
4024 if( item->IsBOARD_ITEM() )
4027 wxString itemText = getItemText( *boardItem );
4029 itemText.Trim(
false ).Trim(
true );
4031 if( !itemText.IsEmpty() )
4032 itemTexts.Add( std::move( itemText ) );
4037 if( !itemTexts.empty() )
4062 board()->BuildConnectivity();
4064 canvas()->RedrawRatsnest();
constexpr EDA_IU_SCALE pcbIUScale
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
REMOVE_FLAGS
Remove event modifier flags.
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
Manage TOOL_ACTION objects.
void SetConditions(const TOOL_ACTION &aAction, const ACTION_CONDITIONS &aConditions)
Set the conditions the UI elements for activating a specific tool action should use for determining t...
void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Execute the changes.
void Revert() override
Revert the commit by restoring the modified items state.
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
virtual void SetNet(NETINFO_ITEM *aNetInfo)
Set a NET_INFO object for the item.
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
NETINFO_ITEM * GetNet() const
Return NETINFO_ITEM object for a given 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 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.
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.
Information pertinent to a Pcbnew printed circuit board.
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
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, INFOBAR_MESSAGE_TYPE aType=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...
virtual int GetUndoCommandCount() const
void DisplayToolMsg(const wxString &msg) override
A set of EDA_ITEMs (i.e., without duplicates).
std::unordered_set< EDA_ITEM * > & GetItems()
virtual EDA_ITEM * AsEdaItem()=0
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)
virtual EDA_GROUP * GetParentGroup() const
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()
bool IsHatchedFill() const
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
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 item had a property changed (except movement)
static const TOOL_EVENT ConnectivityChangedEvent
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.
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
void ForEachUniqueLayer(const std::function< void(PCB_LAYER_ID)> &aMethod) const
Runs the given callable for each active unique copper layer in this padstack, meaning F_Cu for MODE::...
@ NORMAL
Shape is the same on all layers.
static constexpr PCB_LAYER_ID ALL_LAYERS
! The layer identifier to use for the single defintion on normal padstacks
const VECTOR2I & GetDelta(PCB_LAYER_ID aLayer) const
VECTOR2I GetPosition() const override
void SetDelta(PCB_LAYER_ID aLayer, const VECTOR2I &aSize)
VECTOR2I GetOffset(PCB_LAYER_ID aLayer) const
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 PADSTACK & Padstack() 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 toggleExcludeFromSim
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 routerOptimizeSelected
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 toggleExcludeFromBOM
static TOOL_ACTION extendGraphic
Extend one graphical line or arc to the nearest boundary.
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 toggleExcludeFromPosFiles
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 pointEditorChamferCorner
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 pointEditorRemoveCorner
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 pointEditorAddCorner
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
static TOOL_ACTION trimGraphic
Trim a section from one graphical line or arc.
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.
A geometric constraint between board items (issue #2329).
DS_PROXY_VIEW_ITEM * GetDrawingSheet() const
static const TOOL_EVENT & SnappingModeChangedByKeyEvent()
Hotkey feedback.
virtual bool ChildrenAreReadOnly() const
A set of BOARD_ITEMs (i.e., without duplicates).
void RunOnChildren(const std::function< void(BOARD_ITEM *)> &aFunction, RECURSE_MODE aMode) const override
Invoke a function on all children.
Tool that displays edit points allowing to modify items by dragging the points.
bool CanRemoveCorner(const SELECTION &aSelection)
Condition to display "Remove Corner" context menu entry.
static bool CanChamferCorner(const EDA_ITEM &aItem)
Check if a corner of the given item can be chamfered (zones, polys only).
static bool CanAddCorner(const EDA_ITEM &aItem)
Check if a corner can be added to the given item (zones, polys, segments, arcs).
A PCB_POINT is a 0-dimensional point that is used to mark a position on a PCB, or more usually a foot...
Object to handle a bitmap image that can be inserted in a PCB.
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
void SetWidth(int aWidth) override
int GetWidth() const override
void SetEnd(const VECTOR2I &aEnd) override
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
void SetStart(const VECTOR2I &aStart) override
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
wxString GetShownText(RESOLUTION_CONTEXT aContext, int aDepth=0) const override
Return the string actually shown after processing of the base text.
wxString GetShownText(RESOLUTION_CONTEXT aContext, 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
void ExcludePosition(const VECTOR2I &aPos)
Add a board position to the exclusion set so the next Update() skips it.
bool ApproxCollinear(const SEG &aSeg, int aDistanceThreshold=1) const
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 bool ShowAlways(const SELECTION &aSelection)
The default condition function (always returns true).
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
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.
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 modified version of the wxInfoBar class that allows us to:
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
void ShowMessageFor(const wxString &aMessage, int aTime, int aFlags=wxICON_INFORMATION, MESSAGE_TYPE aType=WX_INFOBAR::MESSAGE_TYPE::GENERIC)
Show the infobar with the provided message and icon for a specific period of time.
void AddLink(const wxString &aLinkText, const std::function< void(wxHyperlinkEvent &)> &aFn)
Add a hypertext link to the infobar.
void AddCloseButton(const wxString &aTooltip=_("Hide this message."))
Add the default close button to the infobar on the right side.
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.
std::vector< PCB_CONSTRAINT * > CloneFullySelectedConstraints(const CONSTRAINTS &aSource, const std::map< KIID, KIID > &aIdMap)
Clone the constraints in aSource that a duplicate should carry.
@ ROTATE_AROUND_USER_ORIGIN
@ ROTATE_AROUND_SEL_CENTER
@ ROTATE_AROUND_AUX_ORIGIN
@ ROTATE_AROUND_ITEM_ANCHOR
static std::string ToStdString(const wxString &aStr)
#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)
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::deque< FOOTPRINT * > FOOTPRINTS
std::deque< PCB_CONSTRAINT * > CONSTRAINTS
bool IsGeneratedTableCell(const EDA_ITEM *aItem)
True for a cell whose text is generated from the board, so only its formatting is the user's.
@ ID_POPUP_PCB_SWAP_UNIT_LAST
@ ID_POPUP_PCB_SWAP_UNIT_BASE
std::vector< EDA_ITEM * > EDA_ITEMS
std::function< bool(const SELECTION &)> SELECTION_CONDITION
Functor type that checks a specific condition for selected items.
Increment event parameters.
Functors that can be used to figure out how the action controls should be displayed in the UI and if ...
Parameters that define a simple chamfer operation.
STRING_INCREMENTER incrementer
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.
constexpr KICAD_T BaseType(const KICAD_T aType)
Return the underlying type of the given type.
@ 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_GRID_ITEM_T
a subgrid placed on a board
@ 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
@ PCB_DRILL_CHART_T
class PCB_DRILL_CHART, a live drill chart derived from PCB_TABLE
Casted dyn_cast(From aObject)
A lightweight dynamic downcast.
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D