73using namespace std::placeholders;
75#include <wx/hyperlink.h>
103 ZONE* zone =
static_cast<ZONE*
>( aItem );
116 if( aSelection.
GetSize() != 1 )
172 else if( item->IsType( EDIT_TOOL::MirrorableItems ) )
202 std::shared_ptr<CONDITIONAL_MENU> menu = std::make_shared<CONDITIONAL_MENU>( aEditTool );
205 menu->SetUntranslatedTitle(
_HKI(
"Mirror / Rotate" ) );
207 bool isBoardEditor = aEditTool && aEditTool->
IsBoardEditor();
210 [isBoardEditor](
const SELECTION& aSelection )
229 std::shared_ptr<CONDITIONAL_MENU> menu = std::make_shared<CONDITIONAL_MENU>( aTool );
232 menu->SetUntranslatedTitle(
_HKI(
"Routing" ) );
234 auto notMovingCondition =
237 return aSelection.Empty() || !aSelection.Front()->IsMoving();
242 && notMovingCondition;
259 std::shared_ptr<CONDITIONAL_MENU> menu = std::make_shared<CONDITIONAL_MENU>( aTool );
262 menu->SetUntranslatedTitle(
_HKI(
"Position" ) );
264 auto notMovingCondition =
267 return aSelection.Empty() || !aSelection.Front()->IsMoving();
281 std::shared_ptr<CONDITIONAL_MENU> menu = std::make_shared<CONDITIONAL_MENU>( aTool );
283 menu->SetUntranslatedTitle(
_HKI(
"Shape Modification" ) );
298 auto hasCornerCondition =
306 auto hasMidpointCondition =
314 auto canAddCornerCondition =
317 const EDA_ITEM* item = aSelection.Front();
322 auto canChamferCornerCondition =
325 const EDA_ITEM* item = aSelection.Front();
330 auto canRemoveCornerCondition =
400 for(
const EDA_ITEM* it : aSelection )
411 const std::vector<FOOTPRINT::FP_UNIT_INFO>& units = fp->
GetUnitInfo();
413 if( units.size() < 2 )
416 const wxString& padNum =
pad->GetNumber();
417 bool inAnyUnit =
false;
421 for(
const wxString& pnum : u.m_pins )
439 else if( single != fp )
450 std::unordered_set<wxString> padNums;
452 for(
const EDA_ITEM* it : aSelection )
459 if(
pad->GetParentFootprint() != aFootprint )
462 padNums.insert(
pad->GetNumber() );
471 const std::unordered_set<wxString>& aSelPadNums )
473 std::vector<int> indices;
475 const std::vector<FOOTPRINT::FP_UNIT_INFO>& units = aFootprint->
GetUnitInfo();
477 for(
size_t i = 0; i < units.size(); ++i )
481 for(
const wxString& pn : units[i].m_pins )
483 if( aSelPadNums.count( pn ) )
491 indices.push_back(
static_cast<int>( i ) );
501 if( aUnitIndices.empty() )
504 const std::vector<FOOTPRINT::FP_UNIT_INFO>& units = aFootprint->
GetUnitInfo();
505 const size_t cnt = units[
static_cast<size_t>( aUnitIndices.front() )].m_pins.size();
507 for(
int idx : aUnitIndices )
509 if( units[
static_cast<size_t>( idx )].m_pins.size() != cnt )
520 std::vector<int> targets;
522 const std::vector<FOOTPRINT::FP_UNIT_INFO>& units = aFootprint->
GetUnitInfo();
523 const size_t pinCount = units[
static_cast<size_t>( aSourceIdx )].m_pins.size();
525 for(
size_t i = 0; i < units.size(); ++i )
527 if(
static_cast<int>( i ) == aSourceIdx )
530 if( units[i].m_pins.size() != pinCount )
533 targets.push_back(
static_cast<int>( i ) );
563 if( unitsHit.size() != 1 )
566 const int sourceIdx = unitsHit.front();
569 for(
int idx : targets )
572 label.Printf(
_(
"Swap with %s" ), fp->
GetUnitInfo()[
static_cast<size_t>( idx )].m_unitName );
580 int id = aEvent.GetId();
592 const std::vector<FOOTPRINT::FP_UNIT_INFO>& units = fp->
GetUnitInfo();
595 if( targetIdx < 0 || targetIdx >=
static_cast<int>( units.size() ) )
611 std::shared_ptr<GATE_SWAP_MENU> menu = std::make_shared<GATE_SWAP_MENU>();
612 menu->SetTool( aTool );
626 m_selectionTool->GetToolMenu().RegisterSubMenu( positioningToolsSubMenu );
632 m_selectionTool->GetToolMenu().RegisterSubMenu( shapeModificationSubMenu );
637 std::shared_ptr<CONDITIONAL_MENU> fpAttributesMenu = std::make_shared<CONDITIONAL_MENU>(
this );
638 fpAttributesMenu->SetUntranslatedTitle(
_HKI(
"Attributes" ) );
644 auto positioningToolsCondition =
648 subMenu->Evaluate( aSel );
649 return subMenu->GetMenuItemCount() > 0;
652 auto shapeModificationCondition =
656 subMenu->Evaluate( aSel );
657 return subMenu->GetMenuItemCount() > 0;
661 auto gateSwapSingleUnitOnOneFootprint =
673 if( unitsHit.size() != 1 )
676 const int sourceIdx = unitsHit.front();
678 return !targets.empty();
682 auto gateSwapMultipleUnitsOnOneFootprint =
694 if( unitsHit.size() < 2 )
700 auto propertiesCondition =
703 if( aSel.GetSize() == 0 )
717 if( aSel.GetSize() == 1 )
729 auto inFootprintEditor =
754 auto multipleFootprintsCondition =
757 bool foundFirst =
false;
773 auto excludeFromBOMCond =
776 wxString variantName;
777 int checked = 0, unchecked = 0;
780 variantName =
board->GetCurrentVariant();
786 if(
static_cast<const FOOTPRINT*
>( item )->GetExcludedFromBOMForVariant( variantName ) )
793 return checked > 0 && unchecked == 0;
796 auto excludeFromPosFilesCond =
799 wxString variantName;
800 int checked = 0, unchecked = 0;
803 variantName =
board->GetCurrentVariant();
809 if(
static_cast<const FOOTPRINT*
>( item )->GetExcludedFromPosFilesForVariant( variantName ) )
816 return checked > 0 && unchecked == 0;
819 auto excludeFromSimCond =
822 wxString variantName;
823 int checked = 0, unchecked = 0;
826 variantName =
board->GetCurrentVariant();
832 if(
static_cast<const FOOTPRINT*
>( item )->GetExcludedFromSimForVariant( variantName ) )
839 return checked > 0 && unchecked == 0;
842 auto noActiveToolCondition =
845 return frame()->ToolStackIsEmpty();
848 auto notMovingCondition =
851 return aSelection.Empty() || !aSelection.Front()->IsMoving();
854 auto noItemsCondition =
855 [
this](
const SELECTION& aSelections ) ->
bool
857 return frame()->GetBoard() && !
frame()->GetBoard()->IsEmpty();
868 && notMovingCondition && !inFootprintEditor;
907 menu.AddMenu( gateSwapSubMenu.get(), gateSwapSingleUnitOnOneFootprint );
922 && !inFootprintEditor );
932 menu.AddMenu( fpAttributesMenu.get(), singleFootprintCondition || multipleFootprintsCondition );
935 menu.AddSeparator( 100 );
936 menu.AddMenu( routingSubMenu.get(), isRoutable, 100 );
937 menu.AddMenu( mirrorRotateSubMenu.get(), canMirror, 100 );
938 menu.AddMenu( shapeModificationSubMenu.get(), shapeModificationCondition, 100 );
939 menu.AddMenu( positioningToolsSubMenu.get(), positioningToolsCondition, 100 );
941 menu.AddSeparator( 150 );
954 menu.AddSeparator( 2000 );
974 wxString footprintName;
975 wxArrayString fplist;
980 fplist.Add( fp->GetReference() + wxT(
" ( " ) + fp->GetValue() + wxT(
" )" ) );
990 footprintName.Trim(
true );
991 footprintName.Trim(
false );
993 if( !footprintName.IsEmpty() )
997 if( fp->GetReference().CmpNoCase( footprintName ) == 0 )
1054 frame()->ShowInfoBarMsg(
_(
"This selection cannot be dragged in this mode." ) );
1098 std::vector<PCB_TRACK*> tracks;
1099 std::vector<PCB_TRACK*> vias;
1100 std::vector<FOOTPRINT*> footprints;
1103 const auto gatherItemsByType =
1111 vias.push_back( track );
1113 tracks.push_back( track );
1123 gatherItemsByType();
1130 const auto draggable = [](
KICAD_T aType )
1136 bool anyDraggable =
false;
1138 for(
int ii = 0; ii < aCollector.
GetCount(); ++ii )
1139 anyDraggable |= draggable( aCollector[ii]->Type() );
1145 for(
int ii = aCollector.
GetCount() - 1; ii >= 0; --ii )
1147 if( !draggable( aCollector[ii]->Type() ) )
1152 else if( tracks.size() || vias.size() )
1166 gatherItemsByType();
1180 if( tracks.size() == 2 && vias.size() == 0 )
1182 if( connected( tracks[0], tracks[1]->GetStart() )
1183 || connected( tracks[0], tracks[1]->GetEnd() ) )
1185 aCollector.
Remove( tracks[1] );
1188 else if( tracks.size() == 2 && vias.size() == 1 )
1190 if( connected( tracks[0], vias[0]->GetPosition() )
1191 && connected( tracks[1], vias[0]->GetPosition() ) )
1193 aCollector.
Remove( tracks[0] );
1194 aCollector.
Remove( tracks[1] );
1220 wxString variantName;
1223 variantName =
board->GetCurrentVariant();
1225 bool new_state =
false;
1250 if( !variantName.IsEmpty() )
1278 if( !commit.
Empty() )
1279 commit.
Push(
_(
"Toggle Attribute" ) );
1294 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1299 aCollector.
Remove( item );
1325 via->SetDrill(
board()->GetDesignSettings().GetCurrentViaDrill() );
1334 wxCHECK( track, 0 );
1338 int new_width =
board()->GetDesignSettings().GetCurrentTrackWidth();
1343 commit.
Push(
_(
"Edit Track Width/Via Size" ) );
1368 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1373 aCollector.
Remove( item );
1390 if( newLayer == origLayer )
1401 wxCHECK( track, 0 );
1409 commit.
Push(
_(
"Edit Track Layer" ) );
1426 static int filletRadius = 0;
1432 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1437 aCollector.
Remove( item );
1448 frame()->ShowInfoBarMsg(
_(
"At least two straight track segments must be selected." ) );
1464 bool t1Start =
true;
1465 bool t2Start =
true;
1468 std::vector<FILLET_OP> filletOperations;
1469 bool operationPerformedOnAtLeastOne =
false;
1470 bool didOneAttemptFail =
false;
1471 std::set<PCB_TRACK*> processedTracks;
1473 auto processFilletOp =
1474 [&](
PCB_TRACK* aTrack,
bool aStartPoint )
1476 std::shared_ptr<CONNECTIVITY_DATA> c =
board()->GetConnectivity();
1478 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
1482 if( itemsOnAnchor.size() > 0 &&
selection.Contains( itemsOnAnchor.at( 0 ) )
1488 if( processedTracks.find( trackOther ) == processedTracks.end() )
1490 if( itemsOnAnchor.size() == 1 )
1493 filletOp.t1 = aTrack;
1494 filletOp.t2 = trackOther;
1495 filletOp.t1Start = aStartPoint;
1496 filletOp.t2Start = aTrack->
IsPointOnEnds( filletOp.t2->GetStart() );
1497 filletOperations.push_back( filletOp );
1503 didOneAttemptFail =
true;
1517 processFilletOp( track,
true );
1518 processFilletOp( track,
false );
1520 processedTracks.insert( track );
1526 std::vector<BOARD_ITEM*> itemsToAddToSelection;
1528 for( FILLET_OP filletOp : filletOperations )
1536 if( trackOnStart && trackOnEnd )
1539 if( ( trackOnStart || trackOnEnd ) && track1->
GetLayer() == track2->
GetLayer() )
1547 SHAPE_ARC sArc( t1Seg, t2Seg, filletRadius );
1550 auto setIfPointOnSeg =
1553 VECTOR2I segToVec = aSegment.NearestPoint( aVecToTest ) - aVecToTest;
1558 aPointToSet.
x = aVecToTest.x;
1559 aPointToSet.
y = aVecToTest.y;
1567 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP0() )
1568 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP0() ) )
1570 didOneAttemptFail =
true;
1574 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP1() )
1575 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP1() ) )
1577 didOneAttemptFail =
true;
1589 itemsToAddToSelection.push_back( tArc );
1594 if( filletOp.t1Start )
1597 track1->
SetEnd( t1newPoint );
1599 if( filletOp.t2Start )
1602 track2->
SetEnd( t2newPoint );
1604 operationPerformedOnAtLeastOne =
true;
1608 commit.
Push(
_(
"Fillet Tracks" ) );
1611 for(
BOARD_ITEM* item : itemsToAddToSelection )
1614 if( !operationPerformedOnAtLeastOne )
1615 frame()->ShowInfoBarMsg(
_(
"Unable to fillet the selected track segments." ) );
1616 else if( didOneAttemptFail )
1617 frame()->ShowInfoBarMsg(
_(
"Some of the track segments could not be filleted." ) );
1637 return std::nullopt;
1641 return aPersitentRadius;
1653 std::vector<WX_MULTI_ENTRY_DIALOG::ENTRY> entries{
1660 _(
"Add slots in acute corners" ),
1662 _(
"Add slots in acute corners to allow access to a cutter of the given radius" ),
1669 return std::nullopt;
1671 std::vector<WX_MULTI_ENTRY_DIALOG::RESULT> results = dlg.
GetValues();
1672 wxCHECK( results.size() == 2, std::nullopt );
1676 s_dogBoneParams.DogboneRadiusIU = std::get<long long int>( results[0] );
1677 s_dogBoneParams.AddSlots = std::get<bool>( results[1] );
1679 catch(
const std::bad_variant_access& )
1682 return std::nullopt;
1685 return s_dogBoneParams;
1697 const int default_setback =
pcbIUScale.mmToIU( 1 );
1699 static CHAMFER_PARAMS params{ default_setback, default_setback };
1701 WX_UNIT_ENTRY_DIALOG dlg( &aFrame,
_(
"Chamfer Lines" ),
_(
"Chamfer setback:" ), params.m_chamfer_setback_a );
1704 return std::nullopt;
1706 params.m_chamfer_setback_a = dlg.
GetValue();
1709 params.m_chamfer_setback_b = params.m_chamfer_setback_a;
1720 std::vector<VECTOR2I> pts;
1723 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1730 { PCB_SHAPE_LOCATE_SEGMENT_T, PCB_SHAPE_LOCATE_POLY_T, PCB_SHAPE_LOCATE_RECT_T } ) )
1732 aCollector.
Remove( item );
1741 std::set<PCB_SHAPE*> lines_to_add;
1742 std::vector<PCB_SHAPE*> items_to_remove;
1746 std::vector<VECTOR2I> pts;
1753 items_to_remove.push_back( graphic );
1756 pts.emplace_back( start );
1758 pts.emplace_back(
end );
1764 items_to_remove.push_back( graphic );
1766 for(
int jj = 0; jj < graphic->
GetPolyShape().VertexCount(); ++jj )
1770 for(
size_t jj = 1; jj < pts.size(); ++jj )
1778 lines_to_add.insert( line );
1781 if( pts.size() > 1 )
1786 line->
SetEnd( pts.front() );
1789 lines_to_add.insert( line );
1797 frame()->ShowInfoBarMsg(
_(
"Exactly two lines must be selected to extend them." ) );
1804 else if( segmentCount < 2 )
1806 frame()->ShowInfoBarMsg(
_(
"A shape with at least two lines must be selected." ) );
1824 for(
PCB_SHAPE* item : items_to_remove )
1835 std::vector<BOARD_ITEM*> items_to_select_on_success;
1838 std::vector<BOARD_ITEM*> items_to_deselect_on_success;
1843 auto item_modification_handler =
1850 items_to_select_on_success.push_back( &aItem );
1854 bool any_items_created = !lines_to_add.empty();
1855 auto item_creation_handler =
1856 [&]( std::unique_ptr<BOARD_ITEM> aItem )
1858 any_items_created =
true;
1859 items_to_select_on_success.push_back( aItem.get() );
1860 commit.
Add( aItem.release() );
1863 bool any_items_removed = !items_to_remove.empty();
1864 auto item_removal_handler =
1868 any_items_removed =
true;
1869 items_to_deselect_on_success.push_back( &aItem );
1875 item_removal_handler );
1878 std::unique_ptr<PAIRWISE_LINE_ROUTINE> pairwise_line_routine;
1882 static int s_filletRadius =
pcbIUScale.mmToIU( 1 );
1883 std::optional<int> filletRadiusIU =
GetRadiusParams( *
frame(),
_(
"Fillet Lines" ), s_filletRadius );
1885 if( filletRadiusIU.has_value() )
1887 pairwise_line_routine = std::make_unique<LINE_FILLET_ROUTINE>(
frame()->GetModel(), change_handler,
1895 if( dogboneParams.has_value() )
1897 pairwise_line_routine = std::make_unique<DOGBONE_CORNER_ROUTINE>(
frame()->GetModel(), change_handler,
1905 if( chamfer_params.has_value() )
1907 pairwise_line_routine = std::make_unique<LINE_CHAMFER_ROUTINE>(
frame()->GetModel(), change_handler,
1913 pairwise_line_routine = std::make_unique<LINE_EXTENSION_ROUTINE>(
frame()->GetModel(), change_handler );
1916 if( !pairwise_line_routine )
1927 if( ( a->GetFlags() & STRUCT_DELETED ) == 0 && ( b->GetFlags() & STRUCT_DELETED ) == 0 )
1929 PCB_SHAPE* line_a = static_cast<PCB_SHAPE*>( a );
1930 PCB_SHAPE* line_b = static_cast<PCB_SHAPE*>( b );
1932 pairwise_line_routine->ProcessLinePair( *line_a, *line_b );
1937 for(
BOARD_ITEM* item : items_to_select_on_success )
1938 m_selectionTool->AddItemToSel( item,
true );
1941 for(
BOARD_ITEM* item : items_to_deselect_on_success )
1942 m_selectionTool->RemoveItemFromSel( item,
true );
1944 if( any_items_removed )
1947 if( any_items_created )
1953 commit.Push( pairwise_line_routine->GetCommitDescription() );
1955 if(
const std::optional<wxString> msg = pairwise_line_routine->GetStatusMessage( segmentCount ) )
1956 frame()->ShowInfoBarMsg( *msg );
1967 std::vector<VECTOR2I> pts;
1970 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1974 if( !item->
IsType( { PCB_SHAPE_LOCATE_POLY_T, PCB_ZONE_T } ) )
1975 aCollector.
Remove( item );
1979 if( zone->IsTeardropArea() )
1980 aCollector.
Remove( item );
1990 static int s_toleranceValue =
pcbIUScale.mmToIU( 3 );
1999 if( s_toleranceValue <= 0 )
2004 std::vector<PCB_SHAPE*> shapeList;
2008 commit.Modify( item );
2022 zone->HatchBorder();
2026 commit.
Push(
_(
"Simplify Polygons" ) );
2040 std::vector<VECTOR2I> pts;
2043 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
2049 if( !item->
IsType( { PCB_SHAPE_LOCATE_SEGMENT_T,
2050 PCB_SHAPE_LOCATE_ARC_T,
2051 PCB_SHAPE_LOCATE_BEZIER_T } ) )
2053 aCollector.
Remove( item );
2063 static int s_toleranceValue =
pcbIUScale.mmToIU( 3 );
2072 if( s_toleranceValue <= 0 )
2077 std::vector<PCB_SHAPE*> shapeList;
2083 shapeList.push_back( shape );
2084 commit.Modify( shape );
2090 commit.Push(
_(
"Heal Shapes" ) );
2105 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
2109 static const std::vector<KICAD_T> polygonBooleanTypes = {
2115 if( !item->
IsType( polygonBooleanTypes ) )
2116 aCollector.
Remove( item );
2127 std::vector<PCB_SHAPE*> items_to_process;
2131 items_to_process.push_back(
static_cast<PCB_SHAPE*
>( item ) );
2136 if( item == last_item )
2137 std::swap( items_to_process.back(), items_to_process.front() );
2143 auto item_modification_handler =
2146 commit.Modify( &aItem );
2149 std::vector<BOARD_ITEM*> items_to_select_on_success;
2151 auto item_creation_handler =
2152 [&]( std::unique_ptr<BOARD_ITEM> aItem )
2154 items_to_select_on_success.push_back( aItem.get() );
2155 commit.Add( aItem.release() );
2158 auto item_removal_handler =
2161 commit.Remove( &aItem );
2166 item_removal_handler );
2169 std::unique_ptr<POLYGON_BOOLEAN_ROUTINE> boolean_routine;
2171 const auto create_routine =
2172 [&]() -> std::unique_ptr<POLYGON_BOOLEAN_ROUTINE>
2179 wxCHECK(
model,
nullptr );
2183 return std::make_unique<POLYGON_MERGE_ROUTINE>(
model, change_handler );
2187 return std::make_unique<POLYGON_SUBTRACT_ROUTINE>(
model, change_handler );
2191 return std::make_unique<POLYGON_INTERSECT_ROUTINE>(
model, change_handler );
2196 const auto run_routine =
2200 for(
PCB_SHAPE* shape : items_to_process )
2201 boolean_routine->ProcessShape( *shape );
2203 boolean_routine->Finalize();
2206 boolean_routine = create_routine();
2208 wxCHECK_MSG( boolean_routine, 0,
"Could not find a polygon routine for this action" );
2215 if( !boolean_routine->IsCommutative() && items_to_select_on_success.empty() )
2219 items_to_select_on_success.clear();
2221 std::map<const PCB_SHAPE*, VECTOR2I::extended_type> items_area;
2223 for(
PCB_SHAPE* shape : items_to_process )
2226 items_area[shape] = area;
2235 std::sort( items_to_process.begin(), items_to_process.end(),
2238 return items_area[a] > items_area[b];
2242 boolean_routine = create_routine();
2247 for(
BOARD_ITEM* item : items_to_select_on_success )
2253 commit.Push( boolean_routine->GetCommitDescription() );
2255 if(
const std::optional<wxString> msg = boolean_routine->GetStatusMessage() )
2256 frame()->ShowInfoBarMsg( *msg );
2285 auto containsReadOnlyGenChild =
2290 if( !item->IsBOARD_ITEM() )
2307 if( containsReadOnlyGenChild(
selection ) )
2319 std::vector<PCB_TABLECELL*> cells;
2370 if( !
frame()->GetPropertiesPanel()->IsShownOnScreen() )
2372 infobar->
AddLink(
_(
"Show Properties panel" ),
2373 [
this]( wxHyperlinkEvent& aHyperlinkEvent )
2375 frame()->ToggleProperties();
2380 infobar->
ShowMessageFor(
_(
"Use Properties panel to edit properties common to selected items." ),
2381 8000, wxICON_INFORMATION );
2390 std::vector<PCB_SHAPE*> shapes;
2392 constraintTool->SolveAfterEdit( shapes );
2407 for(
EDA_ITEM* eda_item : selCopy )
2409 if( !eda_item->IsBOARD_ITEM() )
2451 if( editFrame && item )
2464 std::unordered_set<BOARD_ITEM*> visited;
2469 if( !aItem || !visited.insert( aItem ).second )
2473 aShapes.push_back(
static_cast<PCB_SHAPE*
>( aItem ) );
2480 if( item->IsBOARD_ITEM() )
2490 if( !constraintTool )
2493 std::vector<PCB_SHAPE*> shapes;
2513 commit = &localCommit;
2537 std::optional<VECTOR2I> oldRefPt;
2542 oldRefPt =
selection.GetReferencePoint();
2571 bool usePcbShapeCenter =
false;
2578 usePcbShapeCenter =
true;
2582 usePcbShapeCenter =
true;
2588 else if( usePcbShapeCenter )
2600 if(
frame()->GetCanvas()->GetView()->GetGAL()->IsFlippedX() )
2601 rotateAngle = -rotateAngle;
2607 viewBBox.
Merge( item->ViewBBox() );
2616 typedef std::numeric_limits<int> coord_limits;
2621 bool outOfBounds = rotPos.
x < min || rotPos.
x > max || rotPos.
y < min || rotPos.
y > max || rotEnd.
x < min
2622 || rotEnd.
x > max || rotEnd.
y < min || rotEnd.
y > max;
2630 if( item->IsBOARD_ITEM() )
2634 board_item->
Rotate( refPt, rotateAngle );
2638 static_cast<FOOTPRINT*
>( board_item )->InvalidateComponentClassCache();
2646 localCommit.
Push(
_(
"Rotate" ) );
2665 selection.SetReferencePoint( *oldRefPt );
2686 MIRROR( tmpPt, aMirrorPoint, aFlipDirection );
2736 commit = &localCommit;
2758 int skippedFootprints = 0;
2759 int skippedGroups = 0;
2766 skippedFootprints++;
2781 switch( item->Type() )
2784 static_cast<PCB_SHAPE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2788 static_cast<ZONE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2793 static_cast<PCB_TEXT*
>( item )->
Mirror( mirrorPoint, flipDirection );
2802 static_cast<PCB_TABLE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2806 mirrorPad( *
static_cast<PAD*
>( item ), mirrorPoint, flipDirection );
2812 static_cast<PCB_TRACK*
>( item )->
Mirror( mirrorPoint, flipDirection );
2816 static_cast<PCB_GROUP*
>( item )->
Mirror( mirrorPoint, flipDirection );
2825 static_cast<PCB_POINT*
>( item )->
Mirror( mirrorPoint, flipDirection );
break;
2841 localCommit.
Push(
_(
"Mirror" ) );
2847 frame()->ShowInfoBarMsg(
_(
"Footprints cannot be mirrored. Use Flip to move them to "
2848 "the other side of the board." ) );
2852 frame()->ShowInfoBarMsg(
_(
"Groups containing footprints or other items that cannot be "
2853 "mirrored were skipped." ) );
2883 commit = &localCommit;
2913 setJustify(
static_cast<PCB_TEXT*
>( item ) );
2922 if( !localCommit.
Empty() )
2925 localCommit.
Push(
_(
"Left Justify" ) );
2927 localCommit.
Push(
_(
"Center Justify" ) );
2929 localCommit.
Push(
_(
"Right Justify" ) );
2959 commit = &localCommit;
2976 std::optional<VECTOR2I> oldRefPt;
2979 oldRefPt =
selection.GetReferencePoint();
3009 if( !item->IsBOARD_ITEM() )
3016 boardItem->
Flip( refPt, flipDirection );
3020 static_cast<FOOTPRINT*
>( boardItem )->InvalidateComponentClassCache();
3027 localCommit.
Push(
_(
"Change Side / Flip" ) );
3045 selection.SetReferencePoint( *oldRefPt );
3057 int commitFlags = 0;
3062 int itemsDeleted = 0;
3063 int fieldsHidden = 0;
3064 int fieldsAlreadyHidden = 0;
3068 if( !item->IsBOARD_ITEM() )
3074 switch( item->Type() )
3080 wxASSERT( parentFP );
3081 commit.
Modify( parentFP );
3090 fieldsAlreadyHidden++;
3093 getView()->Update( parentFP );
3111 commit.
Remove( board_item );
3121 commit.
Modify( board_item );
3122 static_cast<PCB_TABLECELL*
>( board_item )->SetText( wxEmptyString );
3134 commit.
Remove( board_item );
3141 commit.
Remove( board_item );
3151 if( !aIsCut && aItems.
GetSize() == 1 )
3154 ZONE* zone =
static_cast<ZONE*
>( board_item );
3156 int outlineIdx, holeIdx;
3177 commit.
Remove( board_item );
3189 if( stitch && !aItems.
Contains( stitch ) )
3197 commit.
Remove( board_item );
3209 commit.Push(
_(
"Delete" ), commitFlags );
3217 commit.
Remove( board_item );
3225 commit.
Remove( board_item );
3234 if( enteredGroup && enteredGroup->
GetItems().empty() )
3239 commit.
Push(
_(
"Cut" ), commitFlags );
3241 else if( itemsDeleted == 0 )
3243 if( fieldsHidden == 1 )
3244 commit.
Push(
_(
"Hide Field" ), commitFlags );
3245 else if( fieldsHidden > 1 )
3246 commit.
Push(
_(
"Hide Fields" ), commitFlags );
3247 else if( fieldsAlreadyHidden > 0 )
3248 editFrame->
ShowInfoBarError(
_(
"Use the Footprint Properties dialog to remove fields." ) );
3252 commit.
Push(
_(
"Delete" ), commitFlags );
3277 std::vector<BOARD_ITEM*> lockedItems;
3294 const bool hadInitialSelection = !
m_selectionTool->GetSelection().Empty();
3309 if( hadInitialSelection && selectionCopy.
Empty() )
3335 if( selectionCopy.
Empty() )
3378 if( ret == wxID_OK )
3386 selCenter += translation;
3388 if( !
frame()->GetPcbNewSettings()->m_Display.m_DisplayInvertYAxis )
3389 rotation = -rotation;
3393 if( !item->IsBOARD_ITEM() )
3401 boardItem->
Move( translation );
3403 switch( rotationAnchor )
3409 boardItem->
Rotate( selCenter, angle );
3412 boardItem->
Rotate(
frame()->GetScreen()->m_LocalOrigin, angle );
3415 boardItem->
Rotate(
board()->GetDesignSettings().GetAuxOrigin(), angle );
3420 getView()->Update( boardItem );
3423 commit.
Push(
_(
"Move Exactly" ) );
3445 return std::any_of( aSelection.
begin(), aSelection.
end(),
3448 PCB_GENERATOR* generator = dynamic_cast<PCB_GENERATOR*>( aItem );
3449 return !generator || generator->CanDuplicate();
3467 if(
PAD*
pad =
dynamic_cast<PAD*
>( item ) )
3510 std::vector<BOARD_ITEM*> new_items;
3515 std::map<KIID, KIID> idMap;
3521 if( !item->IsBOARD_ITEM() )
3533 switch( orig_item->
Type() )
3555 dupe_item = parentFootprint->
DuplicateItem(
true, &commit, orig_item );
3557 dupe_item = orig_item->
Duplicate(
true, &commit );
3567 new_items.push_back( dupe_item );
3568 commit.
Add( dupe_item );
3578 dupe_item = parentFootprint->
DuplicateItem(
true, &commit, orig_item );
3580 if( increment &&
static_cast<PAD*
>( dupe_item )->CanHaveNumber() )
3586 static_cast<PAD*
>( dupe_item )->SetNumber( padNumber );
3594 new_items.push_back( dupe_item );
3595 commit.
Add( dupe_item );
3608 dupe_item =
static_cast<PCB_GROUP*
>( orig_item )->DeepDuplicate(
true, &commit, &idMap );
3614 new_items.push_back( aItem );
3615 commit.
Add( aItem );
3620 new_items.push_back( dupe_item );
3621 commit.
Add( dupe_item );
3635 :
board()->Constraints();
3638 commit.
Add( clone );
3644 EDA_ITEMS nItems( new_items.begin(), new_items.end() );
3650 editFrame->
DisplayToolMsg( wxString::Format(
_(
"Duplicated %d item(s)" ), (
int) new_items.size() ) );
3655 commit.
Push(
_(
"Duplicate" ) );
3678 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3680 switch( aCollector[i]->Type() )
3684 default: aCollector.
Remove( i );
break;
3709 commit = &localCommit;
3713 switch( item->Type() )
3723 if( !
pad.CanHaveNumber() )
3732 pad.SetNumber( *newNumber );
3746 text.SetText( *newText );
3758 commit->
Push(
_(
"Increment" ) );
3766 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3768 if( aCollector[i]->Type() !=
PCB_PAD_T )
3776 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3787 if( aSelection.
Empty() )
3811 BOX2I nonFieldsBBox;
3815 if( !item->IsType( { PCB_TEXT_T, PCB_FIELD_T } ) )
3816 nonFieldsBBox.
Merge( item->GetBoundingBox() );
3831 const wxString& aCanceledMessage,
VECTOR2I& aReferencePoint )
3835 std::optional<VECTOR2I> pickedPoint;
3845 const auto setPickerLayerSet =
3852 layerFilter =
LSET( { editFrame->GetActiveLayer() } );
3860 setPickerLayerSet();
3863 [&](
const VECTOR2D& aPoint ) ->
bool
3865 pickedPoint = aPoint;
3867 if( !aSuccessMessage.empty() )
3889 if( !aCanceledMessage.empty() )
3901 [&](
const int& aFinalState )
3920 setPickerLayerSet();
3923 evt->SetPassEvent();
3934 canvas()->SetStatusPopup(
nullptr );
3938 aReferencePoint = *pickedPoint;
3940 return pickedPoint.has_value();
3948 TOOL_EVENT selectReferencePoint( aEvent.
Category(), aEvent.
Action(),
"pcbnew.InteractiveEdit.selectReferencePoint",
3969 std::vector<BOARD_ITEM*> items;
3973 if( item->IsBOARD_ITEM() )
3974 items.push_back(
static_cast<BOARD_ITEM*
>( item ) );
3981 if( !
pickReferencePoint(
_(
"Select reference point for the copy..." ),
_(
"Selection copied" ),
3982 _(
"Copy canceled" ), refPoint ) )
3992 selection.SetReferencePoint( refPoint );
3996 frame()->SetStatusText(
_(
"Selection copied" ) );
4018 const auto getItemText =
4021 switch( aItem.Type() )
4048 for(
int row = 0; row <
table.GetRowCount(); ++row )
4050 for(
int col = 0; col <
table.GetColCount(); ++col )
4055 if( col <
table.GetColCount() - 1 )
4059 if( row <
table.GetRowCount() - 1 )
4069 return wxEmptyString;
4072 wxArrayString itemTexts;
4076 if( item->IsBOARD_ITEM() )
4079 wxString itemText = getItemText( *boardItem );
4081 itemText.Trim(
false ).Trim(
true );
4083 if( !itemText.IsEmpty() )
4084 itemTexts.Add( std::move( itemText ) );
4089 if( !itemTexts.empty() )
4114 board()->BuildConnectivity();
4116 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 repeatLayout
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.
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
@ 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