66using namespace std::placeholders;
68#include <wx/hyperlink.h>
73#include <dialogs/dialog_tablecell_properties.h>
74#include <dialogs/dialog_table_properties.h>
94 ZONE* zone =
static_cast<ZONE*
>( aItem );
107 if( aSelection.
GetSize() != 1 )
149 auto menu = std::make_shared<CONDITIONAL_MENU>( aTool );
152 menu->SetUntranslatedTitle(
_HKI(
"Mirror / Rotate" ) );
154 auto canMirror = [](
const SELECTION& aSelection )
178 auto menu = std::make_shared<CONDITIONAL_MENU>( aTool );
181 menu->SetUntranslatedTitle(
_HKI(
"Routing" ) );
183 auto notMovingCondition = [](
const SELECTION& aSelection )
185 return aSelection.Empty() || !aSelection.Front()->IsMoving();
203 auto menu = std::make_shared<CONDITIONAL_MENU>( aTool );
206 menu->SetUntranslatedTitle(
_HKI(
"Position" ) );
208 auto notMovingCondition = [](
const SELECTION& aSelection )
210 return aSelection.Empty() || !aSelection.Front()->IsMoving();
224 auto menu = std::make_shared<CONDITIONAL_MENU>( aTool );
226 menu->SetUntranslatedTitle(
_HKI(
"Shape Modification" ) );
241 auto hasCornerCondition = [aTool](
const SELECTION& aSelection )
248 auto hasMidpointCondition = [aTool](
const SELECTION& aSelection )
255 auto canAddCornerCondition = [](
const SELECTION& aSelection )
257 const EDA_ITEM* item = aSelection.Front();
262 auto canChamferCornerCondition = [](
const SELECTION& aSelection )
264 const EDA_ITEM* item = aSelection.Front();
269 auto canRemoveCornerCondition = [aTool](
const SELECTION& aSelection )
335 for(
const EDA_ITEM* it : aSelection )
348 if( units.size() < 2 )
351 const wxString& padNum =
pad->GetNumber();
352 bool inAnyUnit =
false;
354 for(
const auto& u : units )
356 for(
const auto& pnum : u.m_pins )
374 else if( single != fp )
385 std::unordered_set<wxString> padNums;
387 for(
const EDA_ITEM* it : aSelection )
394 if(
pad->GetParentFootprint() != aFootprint )
397 padNums.insert(
pad->GetNumber() );
406 const std::unordered_set<wxString>& aSelPadNums )
408 std::vector<int> indices;
412 for(
size_t i = 0; i < units.size(); ++i )
416 for(
const auto& pn : units[i].m_pins )
418 if( aSelPadNums.count( pn ) )
426 indices.push_back(
static_cast<int>( i ) );
436 if( aUnitIndices.empty() )
440 const size_t cnt = units[
static_cast<size_t>( aUnitIndices.front() )].m_pins.size();
442 for(
int idx : aUnitIndices )
444 if( units[
static_cast<size_t>( idx )].m_pins.size() != cnt )
455 std::vector<int> targets;
458 const size_t pinCount = units[
static_cast<size_t>( aSourceIdx )].m_pins.size();
460 for(
size_t i = 0; i < units.size(); ++i )
462 if(
static_cast<int>( i ) == aSourceIdx )
465 if( units[i].m_pins.size() != pinCount )
468 targets.push_back(
static_cast<int>( i ) );
498 if( unitsHit.size() != 1 )
501 const int sourceIdx = unitsHit.front();
504 for(
int idx : targets )
507 label.Printf(
_(
"Swap with %s" ), fp->
GetUnitInfo()[
static_cast<size_t>( idx )].m_unitName );
515 int id = aEvent.GetId();
530 if( targetIdx < 0 || targetIdx >=
static_cast<int>( units.size() ) )
546 auto menu = std::make_shared<GATE_SWAP_MENU>();
547 menu->SetTool( aTool );
561 m_selectionTool->GetToolMenu().RegisterSubMenu( positioningToolsSubMenu );
567 m_selectionTool->GetToolMenu().RegisterSubMenu( shapeModificationSubMenu );
572 auto fpAttributesMenu = std::make_shared<CONDITIONAL_MENU>(
this );
573 fpAttributesMenu->SetUntranslatedTitle(
_HKI(
"Attributes" ) );
578 auto positioningToolsCondition = [
this](
const SELECTION& aSel )
581 subMenu->Evaluate( aSel );
582 return subMenu->GetMenuItemCount() > 0;
585 auto shapeModificationCondition = [
this](
const SELECTION& aSel )
588 subMenu->Evaluate( aSel );
589 return subMenu->GetMenuItemCount() > 0;
593 auto gateSwapSingleUnitOnOneFootprint = [](
const SELECTION& aSelection )
604 if( unitsHit.size() != 1 )
607 const int sourceIdx = unitsHit.front();
609 return !targets.empty();
613 auto gateSwapMultipleUnitsOnOneFootprint = [](
const SELECTION& aSelection )
624 if( unitsHit.size() < 2 )
630 auto propertiesCondition = [
this](
const SELECTION& aSel )
632 if( aSel.GetSize() == 0 )
646 if( aSel.GetSize() == 1 )
658 auto inFootprintEditor = [
this](
const SELECTION& aSelection )
663 auto canMirror = [
this](
const SELECTION& aSelection )
676 auto singleFootprintCondition =
679 auto multipleFootprintsCondition = [](
const SELECTION& aSelection )
681 bool foundFirst =
false;
697 auto excludeFromBOMCond = [
this](
const SELECTION& aSel )
699 wxString variantName;
700 int checked = 0, unchecked = 0;
703 variantName =
board->GetCurrentVariant();
709 if(
static_cast<const FOOTPRINT*
>( item )->GetExcludedFromBOMForVariant( variantName ) )
716 return checked > 0 && unchecked == 0;
719 auto excludeFromPosFilesCond = [
this](
const SELECTION& aSel )
721 wxString variantName;
722 int checked = 0, unchecked = 0;
725 variantName =
board->GetCurrentVariant();
731 if(
static_cast<const FOOTPRINT*
>( item )->GetExcludedFromPosFilesForVariant( variantName ) )
738 return checked > 0 && unchecked == 0;
741 auto noActiveToolCondition = [
this](
const SELECTION& aSelection )
743 return frame()->ToolStackIsEmpty();
746 auto notMovingCondition = [](
const SELECTION& aSelection )
748 return aSelection.Empty() || !aSelection.Front()->IsMoving();
751 auto noItemsCondition = [
this](
const SELECTION& aSelections ) ->
bool
753 return frame()->GetBoard() && !
frame()->GetBoard()->IsEmpty();
756 auto isSkippable = [
this](
const SELECTION& aSelection )
762 && notMovingCondition && !inFootprintEditor;
800 menu.AddMenu( gateSwapSubMenu.get(), gateSwapSingleUnitOnOneFootprint );
815 && !inFootprintEditor );
825 menu.AddMenu( fpAttributesMenu.get(), singleFootprintCondition || multipleFootprintsCondition );
828 menu.AddSeparator( 100 );
829 menu.AddMenu( routingSubMenu.get(), isRoutable, 100 );
830 menu.AddMenu( mirrorRotateSubMenu.get(), canMirror, 100 );
831 menu.AddMenu( shapeModificationSubMenu.get(), shapeModificationCondition, 100 );
832 menu.AddMenu( positioningToolsSubMenu.get(), positioningToolsCondition, 100 );
834 menu.AddSeparator( 150 );
847 menu.AddSeparator( 2000 );
866 wxString footprintName;
867 wxArrayString fplist;
872 fplist.Add( fp->GetReference() + wxT(
" ( " ) + fp->GetValue() + wxT(
" )" ) );
882 footprintName.Trim(
true );
883 footprintName.Trim(
false );
885 if( !footprintName.IsEmpty() )
889 if( fp->GetReference().CmpNoCase( footprintName ) == 0 )
989 std::vector<PCB_TRACK*> tracks;
990 std::vector<PCB_TRACK*> vias;
991 std::vector<FOOTPRINT*> footprints;
994 const auto gatherItemsByType = [&]()
1001 vias.push_back( track );
1003 tracks.push_back( track );
1013 gatherItemsByType();
1018 for(
int ii = aCollector.
GetCount() - 1; ii >= 0; --ii )
1024 else if( tracks.size() || vias.size() )
1038 gatherItemsByType();
1051 if( tracks.size() == 2 && vias.size() == 0 )
1053 if( connected( tracks[0], tracks[1]->GetStart() )
1054 || connected( tracks[0], tracks[1]->GetEnd() ) )
1056 aCollector.
Remove( tracks[1] );
1059 else if( tracks.size() == 2 && vias.size() == 1 )
1061 if( connected( tracks[0], vias[0]->GetPosition() )
1062 && connected( tracks[1], vias[0]->GetPosition() ) )
1064 aCollector.
Remove( tracks[0] );
1065 aCollector.
Remove( tracks[1] );
1091 wxString variantName;
1094 variantName =
board->GetCurrentVariant();
1096 bool new_state =
false;
1119 if( !variantName.IsEmpty() )
1143 if( !commit.
Empty() )
1144 commit.
Push(
_(
"Toggle Attribute" ) );
1159 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1164 aCollector.
Remove( item );
1194 new_width =
board()->GetDesignSettings().GetCurrentViaSize();
1195 new_drill =
board()->GetDesignSettings().GetCurrentViaDrill();
1198 via->SetDrill( new_drill );
1206 wxCHECK( track, 0 );
1210 int new_width =
board()->GetDesignSettings().GetCurrentTrackWidth();
1215 commit.
Push(
_(
"Edit Track Width/Via Size" ) );
1240 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1245 aCollector.
Remove( item );
1262 if( newLayer == origLayer )
1273 wxCHECK( track, 0 );
1281 commit.
Push(
_(
"Edit Track Layer" ) );
1298 static int filletRadius = 0;
1304 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1309 aCollector.
Remove( item );
1319 frame()->ShowInfoBarMsg(
_(
"At least two straight track segments must be selected." ) );
1335 bool t1Start =
true;
1336 bool t2Start =
true;
1339 std::vector<FILLET_OP> filletOperations;
1340 bool operationPerformedOnAtLeastOne =
false;
1341 bool didOneAttemptFail =
false;
1342 std::set<PCB_TRACK*> processedTracks;
1344 auto processFilletOp = [&](
PCB_TRACK* aTrack,
bool aStartPoint )
1346 std::shared_ptr<CONNECTIVITY_DATA> c =
board()->GetConnectivity();
1348 std::vector<BOARD_CONNECTED_ITEM*> itemsOnAnchor;
1352 if( itemsOnAnchor.size() > 0 &&
selection.Contains( itemsOnAnchor.at( 0 ) )
1358 if( processedTracks.find( trackOther ) == processedTracks.end() )
1360 if( itemsOnAnchor.size() == 1 )
1363 filletOp.t1 = aTrack;
1364 filletOp.t2 = trackOther;
1365 filletOp.t1Start = aStartPoint;
1366 filletOp.t2Start = aTrack->
IsPointOnEnds( filletOp.t2->GetStart() );
1367 filletOperations.push_back( filletOp );
1373 didOneAttemptFail =
true;
1387 processFilletOp( track,
true );
1388 processFilletOp( track,
false );
1390 processedTracks.insert( track );
1396 std::vector<BOARD_ITEM*> itemsToAddToSelection;
1398 for( FILLET_OP filletOp : filletOperations )
1406 if( trackOnStart && trackOnEnd )
1409 if( ( trackOnStart || trackOnEnd ) && track1->
GetLayer() == track2->
GetLayer() )
1417 SHAPE_ARC sArc( t1Seg, t2Seg, filletRadius );
1420 auto setIfPointOnSeg = [](
VECTOR2I& aPointToSet,
const SEG& aSegment,
const VECTOR2I& aVecToTest )
1422 VECTOR2I segToVec = aSegment.NearestPoint( aVecToTest ) - aVecToTest;
1427 aPointToSet.
x = aVecToTest.x;
1428 aPointToSet.
y = aVecToTest.y;
1436 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP0() )
1437 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP0() ) )
1439 didOneAttemptFail =
true;
1443 if( !setIfPointOnSeg( t1newPoint, t1Seg, sArc.
GetP1() )
1444 && !setIfPointOnSeg( t2newPoint, t2Seg, sArc.
GetP1() ) )
1446 didOneAttemptFail =
true;
1458 itemsToAddToSelection.push_back( tArc );
1463 if( filletOp.t1Start )
1466 track1->
SetEnd( t1newPoint );
1468 if( filletOp.t2Start )
1471 track2->
SetEnd( t2newPoint );
1473 operationPerformedOnAtLeastOne =
true;
1477 commit.
Push(
_(
"Fillet Tracks" ) );
1480 for(
BOARD_ITEM* item : itemsToAddToSelection )
1483 if( !operationPerformedOnAtLeastOne )
1484 frame()->ShowInfoBarMsg(
_(
"Unable to fillet the selected track segments." ) );
1485 else if( didOneAttemptFail )
1486 frame()->ShowInfoBarMsg(
_(
"Some of the track segments could not be filleted." ) );
1506 return std::nullopt;
1510 return aPersitentRadius;
1522 std::vector<WX_MULTI_ENTRY_DIALOG::ENTRY> entries{
1529 _(
"Add slots in acute corners" ),
1531 _(
"Add slots in acute corners to allow access to a cutter of the given radius" ),
1538 return std::nullopt;
1540 std::vector<WX_MULTI_ENTRY_DIALOG::RESULT> results = dlg.
GetValues();
1541 wxCHECK( results.size() == 2, std::nullopt );
1545 s_dogBoneParams.DogboneRadiusIU = std::get<long long int>( results[0] );
1546 s_dogBoneParams.AddSlots = std::get<bool>( results[1] );
1548 catch(
const std::bad_variant_access& )
1551 return std::nullopt;
1554 return s_dogBoneParams;
1568 const int default_setback =
pcbIUScale.mmToIU( 1 );
1570 static CHAMFER_PARAMS params{ default_setback, default_setback };
1572 WX_UNIT_ENTRY_DIALOG dlg( &aFrame,
_(
"Chamfer Lines" ),
_(
"Chamfer setback:" ), params.m_chamfer_setback_a );
1575 return std::nullopt;
1577 params.m_chamfer_setback_a = dlg.
GetValue();
1580 params.m_chamfer_setback_b = params.m_chamfer_setback_a;
1591 std::vector<VECTOR2I> pts;
1594 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1601 { PCB_SHAPE_LOCATE_SEGMENT_T, PCB_SHAPE_LOCATE_POLY_T, PCB_SHAPE_LOCATE_RECT_T } ) )
1603 aCollector.
Remove( item );
1612 std::set<PCB_SHAPE*> lines_to_add;
1613 std::vector<PCB_SHAPE*> items_to_remove;
1617 std::vector<VECTOR2I> pts;
1624 items_to_remove.push_back( graphic );
1627 pts.emplace_back( start );
1629 pts.emplace_back(
end );
1635 items_to_remove.push_back( graphic );
1637 for(
int jj = 0; jj < graphic->
GetPolyShape().VertexCount(); ++jj )
1641 for(
size_t jj = 1; jj < pts.size(); ++jj )
1649 lines_to_add.insert( line );
1652 if( pts.size() > 1 )
1657 line->
SetEnd( pts.front() );
1660 lines_to_add.insert( line );
1668 frame()->ShowInfoBarMsg(
_(
"Exactly two lines must be selected to extend them." ) );
1675 else if( segmentCount < 2 )
1677 frame()->ShowInfoBarMsg(
_(
"A shape with at least two lines must be selected." ) );
1695 for(
PCB_SHAPE* item : items_to_remove )
1706 std::vector<BOARD_ITEM*> items_to_select_on_success;
1709 std::vector<BOARD_ITEM*> items_to_deselect_on_success;
1714 auto item_modification_handler = [&](
BOARD_ITEM& aItem )
1720 items_to_select_on_success.push_back( &aItem );
1724 bool any_items_created = !lines_to_add.empty();
1725 auto item_creation_handler = [&]( std::unique_ptr<BOARD_ITEM> aItem )
1727 any_items_created =
true;
1728 items_to_select_on_success.push_back( aItem.get() );
1729 commit.
Add( aItem.release() );
1732 bool any_items_removed = !items_to_remove.empty();
1733 auto item_removal_handler = [&](
BOARD_ITEM& aItem )
1736 any_items_removed =
true;
1737 items_to_deselect_on_success.push_back( &aItem );
1743 item_removal_handler );
1746 std::unique_ptr<PAIRWISE_LINE_ROUTINE> pairwise_line_routine;
1750 static int s_filletRadius =
pcbIUScale.mmToIU( 1 );
1751 std::optional<int> filletRadiusIU =
GetRadiusParams( *
frame(),
_(
"Fillet Lines" ), s_filletRadius );
1753 if( filletRadiusIU.has_value() )
1755 pairwise_line_routine =
1756 std::make_unique<LINE_FILLET_ROUTINE>(
frame()->GetModel(), change_handler, *filletRadiusIU );
1763 if( dogboneParams.has_value() )
1765 pairwise_line_routine =
1766 std::make_unique<DOGBONE_CORNER_ROUTINE>(
frame()->GetModel(), change_handler, *dogboneParams );
1773 if( chamfer_params.has_value() )
1775 pairwise_line_routine =
1776 std::make_unique<LINE_CHAMFER_ROUTINE>(
frame()->GetModel(), change_handler, *chamfer_params );
1781 pairwise_line_routine = std::make_unique<LINE_EXTENSION_ROUTINE>(
frame()->GetModel(), change_handler );
1784 if( !pairwise_line_routine )
1795 if( ( a->GetFlags() & STRUCT_DELETED ) == 0 && ( b->GetFlags() & STRUCT_DELETED ) == 0 )
1797 PCB_SHAPE* line_a = static_cast<PCB_SHAPE*>( a );
1798 PCB_SHAPE* line_b = static_cast<PCB_SHAPE*>( b );
1800 pairwise_line_routine->ProcessLinePair( *line_a, *line_b );
1805 for(
BOARD_ITEM* item : items_to_select_on_success )
1806 m_selectionTool->AddItemToSel( item,
true );
1809 for(
BOARD_ITEM* item : items_to_deselect_on_success )
1810 m_selectionTool->RemoveItemFromSel( item,
true );
1812 if( any_items_removed )
1815 if( any_items_created )
1821 commit.Push( pairwise_line_routine->GetCommitDescription() );
1823 if(
const std::optional<wxString> msg = pairwise_line_routine->GetStatusMessage( segmentCount ) )
1824 frame()->ShowInfoBarMsg( *msg );
1835 std::vector<VECTOR2I> pts;
1838 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1842 if( !item->
IsType( { PCB_SHAPE_LOCATE_POLY_T, PCB_ZONE_T } ) )
1843 aCollector.
Remove( item );
1847 if( zone->IsTeardropArea() )
1848 aCollector.
Remove( item );
1858 static int s_toleranceValue =
pcbIUScale.mmToIU( 3 );
1867 if( s_toleranceValue <= 0 )
1872 std::vector<PCB_SHAPE*> shapeList;
1876 commit.Modify( item );
1890 zone->HatchBorder();
1894 commit.
Push(
_(
"Simplify Polygons" ) );
1908 std::vector<VECTOR2I> pts;
1911 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1918 { PCB_SHAPE_LOCATE_SEGMENT_T, PCB_SHAPE_LOCATE_ARC_T, PCB_SHAPE_LOCATE_BEZIER_T } ) )
1920 aCollector.
Remove( item );
1930 static int s_toleranceValue =
pcbIUScale.mmToIU( 3 );
1939 if( s_toleranceValue <= 0 )
1944 std::vector<PCB_SHAPE*> shapeList;
1950 shapeList.push_back( shape );
1951 commit.Modify( shape );
1957 commit.Push(
_(
"Heal Shapes" ) );
1972 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1976 static const std::vector<KICAD_T> polygonBooleanTypes = {
1982 if( !item->
IsType( polygonBooleanTypes ) )
1983 aCollector.
Remove( item );
1994 std::vector<PCB_SHAPE*> items_to_process;
1998 items_to_process.push_back(
static_cast<PCB_SHAPE*
>( item ) );
2003 if( item == last_item )
2004 std::swap( items_to_process.back(), items_to_process.front() );
2010 auto item_modification_handler = [&](
BOARD_ITEM& aItem )
2012 commit.Modify( &aItem );
2015 std::vector<BOARD_ITEM*> items_to_select_on_success;
2017 auto item_creation_handler = [&]( std::unique_ptr<BOARD_ITEM> aItem )
2019 items_to_select_on_success.push_back( aItem.get() );
2020 commit.Add( aItem.release() );
2023 auto item_removal_handler = [&](
BOARD_ITEM& aItem )
2025 commit.Remove( &aItem );
2030 item_removal_handler );
2033 std::unique_ptr<POLYGON_BOOLEAN_ROUTINE> boolean_routine;
2035 const auto create_routine = [&]() -> std::unique_ptr<POLYGON_BOOLEAN_ROUTINE>
2042 wxCHECK(
model,
nullptr );
2046 return std::make_unique<POLYGON_MERGE_ROUTINE>(
model, change_handler );
2050 return std::make_unique<POLYGON_SUBTRACT_ROUTINE>(
model, change_handler );
2054 return std::make_unique<POLYGON_INTERSECT_ROUTINE>(
model, change_handler );
2059 const auto run_routine = [&]()
2062 for(
PCB_SHAPE* shape : items_to_process )
2063 boolean_routine->ProcessShape( *shape );
2065 boolean_routine->Finalize();
2068 boolean_routine = create_routine();
2070 wxCHECK_MSG( boolean_routine, 0,
"Could not find a polygon routine for this action" );
2077 if( !boolean_routine->IsCommutative() && items_to_select_on_success.empty() )
2081 items_to_select_on_success.clear();
2083 std::map<const PCB_SHAPE*, VECTOR2I::extended_type> items_area;
2085 for(
PCB_SHAPE* shape : items_to_process )
2088 items_area[shape] = area;
2097 std::sort( items_to_process.begin(), items_to_process.end(),
2100 return items_area[a] > items_area[b];
2104 boolean_routine = create_routine();
2109 for(
BOARD_ITEM* item : items_to_select_on_success )
2115 commit.Push( boolean_routine->GetCommitDescription() );
2117 if(
const std::optional<wxString> msg = boolean_routine->GetStatusMessage() )
2118 frame()->ShowInfoBarMsg( *msg );
2140 std::vector<PCB_TABLECELL*> cells;
2191 for(
EDA_ITEM* eda_item : selCopy )
2193 if( !eda_item->IsBOARD_ITEM() )
2235 if( editFrame && item )
2255 commit = &localCommit;
2278 std::optional<VECTOR2I> oldRefPt;
2283 oldRefPt =
selection.GetReferencePoint();
2309 bool usePcbShapeCenter =
false;
2316 usePcbShapeCenter =
true;
2320 usePcbShapeCenter =
true;
2326 else if( usePcbShapeCenter )
2338 if(
frame()->GetCanvas()->GetView()->GetGAL()->IsFlippedX() )
2339 rotateAngle = -rotateAngle;
2345 viewBBox.
Merge( item->ViewBBox() );
2354 typedef std::numeric_limits<int> coord_limits;
2359 bool outOfBounds = rotPos.
x < min || rotPos.
x > max || rotPos.
y < min || rotPos.
y > max || rotEnd.
x < min
2360 || rotEnd.
x > max || rotEnd.
y < min || rotEnd.
y > max;
2368 if( item->IsBOARD_ITEM() )
2372 board_item->
Rotate( refPt, rotateAngle );
2376 static_cast<FOOTPRINT*
>( board_item )->InvalidateComponentClassCache();
2383 localCommit.
Push(
_(
"Rotate" ) );
2400 selection.SetReferencePoint( *oldRefPt );
2418 MIRROR( tmpPt, aMirrorPoint, aFlipDirection );
2451 commit = &localCommit;
2473 int skippedFootprints = 0;
2480 skippedFootprints++;
2488 switch( item->Type() )
2491 static_cast<PCB_SHAPE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2495 static_cast<ZONE*
>( item )->
Mirror( mirrorPoint, flipDirection );
2500 static_cast<PCB_TEXT*
>( item )->
Mirror( mirrorPoint, flipDirection );
2510 mirrorPad( *
static_cast<PAD*
>( item ), mirrorPoint, flipDirection );
2516 static_cast<PCB_TRACK*
>( item )->
Mirror( mirrorPoint, flipDirection );
2520 static_cast<PCB_GROUP*
>( item )->
Mirror( mirrorPoint, flipDirection );
2529 static_cast<PCB_POINT*
>( item )->
Mirror( mirrorPoint, flipDirection );
break;
2540 localCommit.
Push(
_(
"Mirror" ) );
2544 frame()->ShowInfoBarMsg(
_(
"Footprints cannot be mirrored. Use Flip to move them to "
2545 "the other side of the board." ) );
2575 commit = &localCommit;
2589 auto setJustify = [&](
EDA_TEXT* aTextItem )
2604 setJustify(
static_cast<PCB_TEXT*
>( item ) );
2613 if( !localCommit.
Empty() )
2616 localCommit.
Push(
_(
"Left Justify" ) );
2618 localCommit.
Push(
_(
"Center Justify" ) );
2620 localCommit.
Push(
_(
"Right Justify" ) );
2650 commit = &localCommit;
2667 std::optional<VECTOR2I> oldRefPt;
2670 oldRefPt =
selection.GetReferencePoint();
2700 if( !item->IsBOARD_ITEM() )
2707 boardItem->
Flip( refPt, flipDirection );
2711 static_cast<FOOTPRINT*
>( boardItem )->InvalidateComponentClassCache();
2717 localCommit.
Push(
_(
"Change Side / Flip" ) );
2733 selection.SetReferencePoint( *oldRefPt );
2745 int commitFlags = 0;
2750 int itemsDeleted = 0;
2751 int fieldsHidden = 0;
2752 int fieldsAlreadyHidden = 0;
2756 if( !item->IsBOARD_ITEM() )
2762 switch( item->Type() )
2768 wxASSERT( parentFP );
2769 commit.
Modify( parentFP );
2778 fieldsAlreadyHidden++;
2781 getView()->Update( parentFP );
2798 commit.
Remove( board_item );
2804 commit.
Modify( board_item );
2805 static_cast<PCB_TABLECELL*
>( board_item )->SetText( wxEmptyString );
2817 commit.
Remove( board_item );
2824 commit.
Remove( board_item );
2834 if( !aIsCut && aItems.
GetSize() == 1 )
2837 ZONE* zone =
static_cast<ZONE*
>( board_item );
2839 int outlineIdx, holeIdx;
2860 commit.
Remove( board_item );
2871 commit.Push(
_(
"Delete" ), commitFlags );
2879 commit.
Remove( board_item );
2887 commit.
Remove( board_item );
2896 if( enteredGroup && enteredGroup->
GetItems().empty() )
2901 commit.
Push(
_(
"Cut" ), commitFlags );
2903 else if( itemsDeleted == 0 )
2905 if( fieldsHidden == 1 )
2906 commit.
Push(
_(
"Hide Field" ), commitFlags );
2907 else if( fieldsHidden > 1 )
2908 commit.
Push(
_(
"Hide Fields" ), commitFlags );
2909 else if( fieldsAlreadyHidden > 0 )
2910 editFrame->
ShowInfoBarError(
_(
"Use the Footprint Properties dialog to remove fields." ) );
2914 commit.
Push(
_(
"Delete" ), commitFlags );
2925 std::vector<BOARD_ITEM*> lockedItems;
2943 const bool hadInitialSelection = !
m_selectionTool->GetSelection().Empty();
2958 if( hadInitialSelection && selectionCopy.
Empty() )
2988 if( selectionCopy.
Empty() )
3036 if( ret == wxID_OK )
3044 selCenter += translation;
3046 if( !
frame()->GetPcbNewSettings()->m_Display.m_DisplayInvertYAxis )
3047 rotation = -rotation;
3051 if( !item->IsBOARD_ITEM() )
3059 boardItem->
Move( translation );
3061 switch( rotationAnchor )
3067 boardItem->
Rotate(
board()->GetDesignSettings().GetAuxOrigin(), angle );
3072 getView()->Update( boardItem );
3075 commit.
Push(
_(
"Move Exactly" ) );
3131 std::vector<BOARD_ITEM*> new_items;
3138 if( !item->IsBOARD_ITEM() )
3150 switch( orig_item->
Type() )
3170 dupe_item = parentFootprint->
DuplicateItem(
true, &commit, orig_item );
3172 dupe_item = orig_item->
Duplicate(
true, &commit );
3183 new_items.push_back( dupe_item );
3184 commit.
Add( dupe_item );
3194 dupe_item = parentFootprint->
DuplicateItem(
true, &commit, orig_item );
3196 if( increment &&
static_cast<PAD*
>( dupe_item )->CanHaveNumber() )
3202 static_cast<PAD*
>( dupe_item )->SetNumber( padNumber );
3209 new_items.push_back( dupe_item );
3210 commit.
Add( dupe_item );
3219 dupe_item =
static_cast<PCB_GROUP*
>( orig_item )->DeepDuplicate(
true, &commit );
3225 new_items.push_back( aItem );
3226 commit.
Add( aItem );
3231 new_items.push_back( dupe_item );
3232 commit.
Add( dupe_item );
3244 EDA_ITEMS nItems( new_items.begin(), new_items.end() );
3250 editFrame->
DisplayToolMsg( wxString::Format(
_(
"Duplicated %d item(s)" ), (
int) new_items.size() ) );
3254 commit.
Push(
_(
"Duplicate" ) );
3272 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3274 switch( aCollector[i]->Type() )
3278 default: aCollector.
Remove( i );
break;
3303 commit = &localCommit;
3307 switch( item->Type() )
3317 if( !
pad.CanHaveNumber() )
3321 std::optional<wxString> newNumber = incrementer.Increment(
pad.GetNumber(), param.
Delta, param.
Index );
3326 pad.SetNumber( *newNumber );
3335 std::optional<wxString> newText = incrementer.Increment(
text.GetText(), param.
Delta, param.
Index );
3340 text.SetText( *newText );
3352 commit->
Push(
_(
"Increment" ) );
3360 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3362 if( aCollector[i]->Type() !=
PCB_PAD_T )
3370 for(
int i = aCollector.
GetCount() - 1; i >= 0; i-- )
3381 if( aSelection.
Empty() )
3405 BOX2I nonFieldsBBox;
3409 if( !item->IsType( { PCB_TEXT_T, PCB_FIELD_T } ) )
3410 nonFieldsBBox.
Merge( item->GetBoundingBox() );
3425 const wxString& aCanceledMessage,
VECTOR2I& aReferencePoint )
3429 std::optional<VECTOR2I> pickedPoint;
3439 const auto setPickerLayerSet =
3446 layerFilter =
LSET( { editFrame->GetActiveLayer() } );
3454 setPickerLayerSet();
3457 [&](
const VECTOR2D& aPoint ) ->
bool
3459 pickedPoint = aPoint;
3461 if( !aSuccessMessage.empty() )
3483 if( !aCanceledMessage.empty() )
3495 [&](
const int& aFinalState )
3514 setPickerLayerSet();
3517 evt->SetPassEvent();
3528 canvas()->SetStatusPopup(
nullptr );
3532 aReferencePoint = *pickedPoint;
3534 return pickedPoint.has_value();
3542 TOOL_EVENT selectReferencePoint( aEvent.
Category(), aEvent.
Action(),
"pcbnew.InteractiveEdit.selectReferencePoint",
3545 frame()->PushTool( selectReferencePoint );
3562 std::vector<BOARD_ITEM*> items;
3566 if( item->IsBOARD_ITEM() )
3567 items.push_back(
static_cast<BOARD_ITEM*
>( item ) );
3574 if( !
pickReferencePoint(
_(
"Select reference point for the copy..." ),
_(
"Selection copied" ),
3575 _(
"Copy canceled" ), refPoint ) )
3577 frame()->PopTool( selectReferencePoint );
3586 selection.SetReferencePoint( refPoint );
3590 frame()->SetStatusText(
_(
"Selection copied" ) );
3593 frame()->PopTool( selectReferencePoint );
3613 const auto getItemText = [&](
const BOARD_ITEM& aItem ) -> wxString
3615 switch( aItem.Type() )
3627 return text.GetShownText(
true );
3641 for(
int row = 0; row <
table.GetRowCount(); ++row )
3643 for(
int col = 0; col <
table.GetColCount(); ++col )
3648 if( col <
table.GetColCount() - 1 )
3654 if( row <
table.GetRowCount() - 1 )
3665 return wxEmptyString;
3668 wxArrayString itemTexts;
3672 if( item->IsBOARD_ITEM() )
3675 wxString itemText = getItemText( *boardItem );
3677 itemText.Trim(
false ).Trim(
true );
3679 if( !itemText.IsEmpty() )
3681 itemTexts.Add( std::move( itemText ) );
3687 if( !itemTexts.empty() )
3689 SaveClipboard( wxJoin( itemTexts,
'\n',
'\0' ).ToStdString() );
3714 board()->BuildConnectivity();
3716 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
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...
virtual void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Execute the changes.
virtual void Revert() override
Revert the commit by restoring the modified items state.
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 #NET_INFO 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...
void DisplayToolMsg(const wxString &msg) override
std::unordered_set< EDA_ITEM * > & GetItems()
A base class for most all the KiCad significant classes used in schematics and boards.
virtual VECTOR2I GetPosition() const
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
virtual bool IsType(const std::vector< KICAD_T > &aScanTypes) const
Check whether the item is one of the listed types.
SHAPE_POLY_SET & GetPolyShape()
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 items were moved, this can be very high frequency on the canvas, use with care.
static const TOOL_EVENT ConnectivityChangedEvent
Selected item had a property changed (except movement)
static const TOOL_EVENT UnselectedEvent
Used when the right click button is pressed, or when the select tool is in effect.
static const std::vector< KICAD_T > DraggableItems
A scan list for items that can be dragged.
A handler that is based on a set of callbacks provided by the user of the ITEM_MODIFICATION_ROUTINE.
bool IsBOARD_ITEM() const
virtual wxString GetClass() const =0
Return the class name.
LSET is a set of PCB_LAYER_IDs.
static const LSET & AllLayersMask()
A collection of nets and the parameters used to route or test these nets.
int GetuViaDiameter() const
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
const VECTOR2I & GetDelta(PCB_LAYER_ID aLayer) const
VECTOR2I GetPosition() const override
void SetDelta(PCB_LAYER_ID aLayer, const VECTOR2I &aSize)
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
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
void SetOrientation(const EDA_ANGLE &aAngle)
Set the rotation angle of the pad.
static TOOL_ACTION drag45Degree
static TOOL_ACTION duplicateIncrement
Activation of the duplication tool with incrementing (e.g. pad number)
static TOOL_ACTION layerPrev
static TOOL_ACTION changeTrackWidth
Update selected tracks & vias to the current track & via dimensions.
static TOOL_ACTION unrouteSelected
Removes all tracks from the selected items to the first pad.
static TOOL_ACTION mirrorH
Mirroring of selected items.
static TOOL_ACTION updateFootprint
static TOOL_ACTION breakTrack
Break a single track into two segments at the cursor.
static TOOL_ACTION pointEditorMoveMidpoint
static TOOL_ACTION getAndPlace
Find an item and start moving.
static TOOL_ACTION routerRouteSelectedFromEnd
static TOOL_ACTION swapPadNets
Swap nets between selected pads/gates (and connected copper)
static TOOL_ACTION properties
Activation of the edit tool.
static TOOL_ACTION editFpInFpEditor
static TOOL_ACTION moveWithReference
move with a reference point
static TOOL_ACTION changeTrackLayerPrev
static TOOL_ACTION swap
Swapping of selected items.
static TOOL_ACTION routerAutorouteSelected
static TOOL_ACTION moveExact
Activation of the exact move tool.
static TOOL_ACTION intersectPolygons
Intersection of multiple polygons.
static TOOL_ACTION pointEditorMoveCorner
static TOOL_ACTION genRemove
static TOOL_ACTION selectConnection
Select tracks between junctions or expands an existing selection to pads or the entire connection.
static TOOL_ACTION assignNetClass
static TOOL_ACTION packAndMoveFootprints
Pack and start moving selected footprints.
static TOOL_ACTION copyWithReference
copy command with manual reference point selection
static TOOL_ACTION healShapes
Connect selected shapes, possibly extending or cutting them, or adding extra geometry.
static TOOL_ACTION toggleExcludeFromBOM
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
Common, abstract interface for edit frames.
virtual void OnEditItemRequest(BOARD_ITEM *aItem)
Install the corresponding dialog editor for the given item.
void OpenVertexEditor(BOARD_ITEM *aItem)
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
DS_PROXY_VIEW_ITEM * GetDrawingSheet() const
static const TOOL_EVENT & SnappingModeChangedByKeyEvent()
Hotkey feedback.
A set of BOARD_ITEMs (i.e., without duplicates).
Tool that displays edit points allowing to modify items by dragging the points.
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...
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(bool aAllowExtraText, int aDepth=0) const override
Return the string actually shown after processing of the base text.
wxString GetShownText(bool aAllowExtraText, int aDepth=0) const override
Return the string actually shown after processing of the base text.
void SetHasSolderMask(bool aVal)
virtual double GetLength() const
Get the length of the track using the hypotenuse calculation.
void SetEnd(const VECTOR2I &aEnd)
bool HasSolderMask() const
void SetStart(const VECTOR2I &aStart)
void SetLocalSolderMaskMargin(std::optional< int > aMargin)
std::optional< int > GetLocalSolderMaskMargin() const
const VECTOR2I & GetStart() const
const VECTOR2I & GetEnd() const
EDA_ITEM_FLAGS IsPointOnEnds(const VECTOR2I &point, int min_dist=0) const
Return STARTPOINT if point if near (dist = min_dist) start point, ENDPOINT if point if near (dist = m...
virtual void SetWidth(int aWidth)
virtual int GetWidth() const
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
const VECTOR2I & GetP1() const
const VECTOR2I & GetP0() const
Represent a set of closed polygons.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
void SimplifyOutlines(int aMaxError=0)
Simplifies the lines in the polyset.
const VECTOR2I & CVertex(int aIndex, int aOutline, int aHole) const
Return the index-th vertex in a given hole outline within a given outline.
static const int MIN_PRECISION_IU
This is the minimum precision for all the points in a shape.
Heuristically increment a string's n'th part from the right.
void SetSkipIOSQXZ(bool aSkip)
If a alphabetic part is found, skip the letters I, O, S, Q, X, Z.
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
VECTOR2_TRAITS< int32_t >::extended_type extended_type
A dialog like WX_UNIT_ENTRY_DIALOG, but with multiple entries.
std::vector< RESULT > GetValues() const
Returns the values in the order they were added.
An extension of WX_TEXT_ENTRY_DIALOG that uses UNIT_BINDER to request a dimension (e....
int GetValue()
Return the value in internal units.
Handle a list of polygons defining a copper zone.
bool UnFill()
Removes the zone filling.
bool HitTestCutout(const VECTOR2I &aRefPos, int *aOutlineIdx=nullptr, int *aHoleIdx=nullptr) const
Test if the given point is contained within a cutout of the zone.
void HatchBorder()
Compute the hatch lines depending on the hatch parameters and stores it in the zone's attribute m_bor...
void RemoveCutout(int aOutlineIdx, int aHoleIdx)
Remove a cutout from the zone.
bool IsTeardropArea() const
bool SaveClipboard(const std::string &aTextUTF8)
Store information to the system clipboard.
@ ROTATE_AROUND_USER_ORIGIN
@ ROTATE_AROUND_SEL_CENTER
@ ROTATE_AROUND_AUX_ORIGIN
@ ROTATE_AROUND_ITEM_ANCHOR
#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
@ 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.
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.
std::vector< std::vector< std::string > > table
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
@ PCB_GENERATOR_T
class PCB_GENERATOR, generator on a layer
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
@ PCB_ZONE_T
class ZONE, a copper pour area
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
@ PCB_SHAPE_LOCATE_CIRCLE_T
@ PCB_SHAPE_LOCATE_SEGMENT_T
@ PCB_SHAPE_LOCATE_RECT_T
@ PCB_TABLECELL_T
class PCB_TABLECELL, PCB_TEXTBOX for use in tables
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
@ PCB_SHAPE_LOCATE_BEZIER_T
@ PCB_PAD_T
class PAD, a pad in a footprint
@ PCB_SHAPE_LOCATE_POLY_T
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
@ PCB_DIMENSION_T
class PCB_DIMENSION_BASE: abstract dimension meta-type
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
@ PCB_POINT_T
class PCB_POINT, a 0-dimensional point
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
Casted dyn_cast(From aObject)
A lightweight dynamic downcast.
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D