27using namespace std::placeholders;
75 if( aDirection.
x != 0 || aDirection.
y != 0 )
76 aDirections.push_back( aDirection );
81 std::vector<VECTOR2I> directions;
86 switch( aRelation->
Kind() )
142 if( !aShape || !aPoints || !aEditedPoint )
150 if( position == aShape->
GetStart() )
153 if( position == aShape->
GetEnd() )
167 if( aEditedPoint == &aPoints->
Point( i ) )
171 for(
unsigned i = 0; i < aPoints->
LinesSize() && i < 4; ++i )
173 if( aEditedPoint == &aPoints->
Line( i ) )
179 for(
unsigned i = 0; i < aPoints->
PointsSize(); ++i )
181 if( aEditedPoint == &aPoints->
Point( i ) )
185 for(
unsigned i = 0; i < aPoints->
LinesSize(); ++i )
187 if( aEditedPoint == &aPoints->
Line( i ) )
251 wxArrayString strings;
273 return wxT(
"RECT_RADIUS_TEXT_ITEM" );
309 if( aPoints.
SwapX() )
310 std::swap( topLeft.
x, botRight.
x );
312 if( aPoints.
SwapY() )
313 std::swap( topLeft.
y, botRight.
y );
370 PinEditedCorner( aEditedPoint, aPoints, topLeft, topRight, botLeft, botRight,
371 { 0, 0 }, { 0, 0 }, aMinSize );
379 setLeft( topLeft.
x );
380 setRight( botRight.
x );
381 setBottom( botRight.
y );
386 aRectangle.
Move( moveVector );
390 int width =
std::abs( botRight.
x - topLeft.
x );
391 int height =
std::abs( botRight.
y - topLeft.
y );
392 int maxRadius = std::min( width, height ) / 2;
394 x = std::clamp( x, botRight.
x - maxRadius, botRight.
x );
406 setLeft( topLeft.
x );
411 setBottom( botRight.
y );
416 setRight( botRight.
x );
419 for(
unsigned i = 0; i < aPoints.
LinesSize(); ++i )
437 if( aPoints.
SwapX() )
438 std::swap( topLeft.
x, botRight.
x );
440 if( aPoints.
SwapY() )
441 std::swap( topLeft.
y, botRight.
y );
468 std::vector<EDA_ITEM*>& aUpdatedItems )
override
490 const VECTOR2I& aMinSize = { 0, 0 } )
500 aTopLeft.
x = std::min( aTopLeft.
x, aHole.x - aHoleSize.
x / 2 - minWidth );
501 aTopLeft.
y = std::min( aTopLeft.
y, aHole.y - aHoleSize.
y / 2 - minHeight );
506 aTopLeft.
x = std::min( aTopLeft.
x, aBotRight.
x - minWidth );
507 aTopLeft.
y = std::min( aTopLeft.
y, aBotRight.
y - minHeight );
511 aTopRight.
y = aTopLeft.
y;
512 aBotLeft.
x = aTopLeft.
x;
519 aTopRight.
x = std::max( aTopRight.
x, aHole.x + aHoleSize.
x / 2 + minWidth );
520 aTopRight.
y = std::min( aTopRight.
y, aHole.y - aHoleSize.
y / 2 - minHeight );
525 aTopRight.
x = std::max( aTopRight.
x, aBotLeft.
x + minWidth );
526 aTopRight.
y = std::min( aTopRight.
y, aBotLeft.
y - minHeight );
530 aTopLeft.
y = aTopRight.
y;
531 aBotRight.
x = aTopRight.
x;
538 aBotLeft.
x = std::min( aBotLeft.
x, aHole.x - aHoleSize.
x / 2 - minWidth );
539 aBotLeft.
y = std::max( aBotLeft.
y, aHole.y + aHoleSize.
y / 2 + minHeight );
544 aBotLeft.
x = std::min( aBotLeft.
x, aTopRight.
x - minWidth );
545 aBotLeft.
y = std::max( aBotLeft.
y, aTopRight.
y + minHeight );
549 aBotRight.
y = aBotLeft.
y;
550 aTopLeft.
x = aBotLeft.
x;
557 aBotRight.
x = std::max( aBotRight.
x, aHole.x + aHoleSize.
x / 2 + minWidth );
558 aBotRight.
y = std::max( aBotRight.
y, aHole.y + aHoleSize.
y / 2 + minHeight );
563 aBotRight.
x = std::max( aBotRight.
x, aTopLeft.
x + minWidth );
564 aBotRight.
y = std::max( aBotRight.
y, aTopLeft.
y + minHeight );
568 aBotLeft.
y = aBotRight.
y;
569 aTopRight.
x = aBotRight.
x;
573 aTopLeft.
y = std::min( aTopLeft.
y, aBotRight.
y - minHeight );
577 aTopLeft.
x = std::min( aTopLeft.
x, aBotRight.
x - minWidth );
581 aBotRight.
y = std::max( aBotRight.
y, aTopLeft.
y + minHeight );
585 aBotRight.
x = std::max( aBotRight.
x, aTopLeft.
x + minWidth );
603 std::vector<EDA_ITEM*>& aUpdatedItems )
override
628 std::vector<EDA_ITEM*>& aUpdatedItems )
override
666 auto set45Constraint =
695 std::vector<EDA_ITEM*>& aUpdatedItems )
override
744 wxFAIL_MSG( wxT(
"MakePoints: unhandled PCB_GRID_TYPE" ) );
775 wxFAIL_MSG( wxT(
"UpdatePoints: unhandled PCB_GRID_TYPE" ) );
781 std::vector<EDA_ITEM*>& aUpdatedItems )
override
798 const double dragAngle = std::atan2( worldOff.
y, worldOff.
x );
799 const int newRadius = std::max( 1,
KiROUND( std::hypot( worldOff.
x, worldOff.
y ) ) );
800 const double orientOld =
m_gridItem.GetOrientation().AsRadians();
801 const double phiMaxOld =
m_gridItem.GetPhiExtent().AsRadians();
806 const auto wrap2pi = [](
double a )
810 while( a >= 2 *
M_PI )
819 const double newOrient = -dragAngle;
820 const double newPhiMax = wrap2pi( phiMaxOld - orientOld - dragAngle );
828 const double newPhiMax = wrap2pi( dragAngle + orientOld );
835 const double newOrient = phiMaxOld / 2.0 - dragAngle;
847 const int newHalfX = std::max( 1,
std::abs( local.
x ) );
848 const int newHalfY = std::max( 1,
std::abs( local.
y ) );
857 wxFAIL_MSG( wxT(
"UpdateItem: unhandled PCB_GRID_TYPE" ) );
880 const int sx = ( aX == 0 ) ? -1 : +1;
881 const int sy = ( aY == 0 ) ? -1 : +1;
889 const double phi =
m_gridItem.GetPhiExtent().AsRadians();
896 const double phi =
m_gridItem.GetPhiExtent().AsRadians() / 2.0;
930 std::vector<EDA_ITEM*>& aUpdatedItems )
override
936 aUpdatedItems.push_back( &
table );
942 int colWidth =
m_cell.GetRectangleWidth();
944 for(
int ii = 0; ii <
m_cell.GetColSpan() - 1; ++ii )
945 colWidth -=
table.GetColWidth(
m_cell.GetColumn() + ii );
953 int rowHeight =
m_cell.GetRectangleHeight();
955 for(
int ii = 0; ii <
m_cell.GetRowSpan() - 1; ++ii )
956 rowHeight -=
table.GetRowHeight(
m_cell.GetRow() + ii );
969 std::vector<VECTOR2I> corners =
m_cell.GetCorners();
971 return aPoint ==
COL_WIDTH ? ( corners[1] + corners[2] ) / 2 : ( corners[2] + corners[3] ) / 2;
1004 if(
m_pad.IsLocked() )
1019 if( !
m_pad.GetOrientation().IsCardinal() )
1022 if(
m_pad.GetOrientation().IsVertical() )
1023 std::swap( halfSize.
x, halfSize.
y );
1026 aPoints.
AddPoint( shapePos - halfSize );
1028 aPoints.
AddPoint( shapePos + halfSize );
1048 int target =
locked ? 0 : 1;
1056 else if( target == 1 )
1058 shapePos.
x += halfSize.
x;
1071 int target =
locked || !
m_pad.GetOrientation().IsCardinal() ? 0 : 4;
1078 else if( target == 4 )
1080 if(
m_pad.GetOrientation().IsVertical() )
1081 std::swap( halfSize.
x, halfSize.
y );
1085 shapePos.
y - halfSize.
y ) );
1088 shapePos.
y + halfSize.
y ) );
1102 std::vector<EDA_ITEM*>& aUpdatedItems )
override
1129 botLeft, botRight, holeCenter, holeSize );
1132 || (
m_pad.GetDrillSize().x &&
m_pad.GetDrillSize().y ) )
1142 dist[0] =
center.x - topLeft.
x;
1143 dist[1] =
center.y - topLeft.
y;
1144 dist[2] = botRight.
x -
center.x;
1145 dist[3] = botRight.
y -
center.y;
1149 dist[0] =
center.x - botLeft.
x;
1150 dist[1] =
center.y - topRight.
y;
1151 dist[2] = topRight.
x -
center.x;
1152 dist[3] = botLeft.
y -
center.y;
1155 VECTOR2I padSize( dist[0] + dist[2], dist[1] + dist[3] );
1156 VECTOR2I deltaOffset( padSize.
x / 2 - dist[2], padSize.
y / 2 - dist[3] );
1158 if(
m_pad.GetOrientation().IsVertical() )
1159 std::swap( padSize.
x, padSize.
y );
1178 bottom = botRight.
y;
1190 if(
m_pad.GetOrientation().IsVertical() )
1191 std::swap( padSize.
x, padSize.
y );
1233 std::vector<EDA_ITEM*>& aUpdatedItems )
override
1257 m_oldCrossBar(
SEG{ aDimension.GetCrossbarStart(), aDimension.GetCrossbarEnd() } )
1280 const VECTOR2I newProject = newCrossBar.LineProject( newTextPos );
1282 const VECTOR2I oldProjectedOffset =
1284 const VECTOR2I newProjectedOffset = newProject - newCrossBar.NearestPoint( newProject );
1286 const bool textWasLeftOf = oldProjectedOffset.
x < 0
1287 || ( oldProjectedOffset.
x == 0 && oldProjectedOffset.
y > 0 );
1288 const bool textIsLeftOf = newProjectedOffset.
x < 0
1289 || ( newProjectedOffset.
x == 0 && newProjectedOffset.
y > 0 );
1291 if( textWasLeftOf != textIsLeftOf )
1311 const EDA_ANGLE rotation = oldAngle - newAngle;
1324 rotTextOffsetFromCbCenter,
1325 newCrossBar.Center() );
1331 return newCbRefPt + rotTextOffsetFromCbEnd;
1344 const VECTOR2I newProjected = newCrossBar.A + ( newCrossBar.B - newCrossBar.A ) * oldRatio;
1345 return newProjected + rotCbNormalToText;
1400 std::vector<EDA_ITEM*>& aUpdatedItems )
override
1437 if( featureLine.
Cross( crossBar ) > 0 )
1449 if( featureLine.
Cross( crossBar ) > 0 )
1516 if( !bounds.
Contains( cursorPos ) )
1539 m_dimension.SetHeight( vert ? featureLine.
x : featureLine.
y );
1594 std::vector<EDA_ITEM*>& aUpdatedItems )
override
1611 return std::nullopt;
1657 std::vector<EDA_ITEM*>& aUpdatedItems )
override
1709 return std::nullopt;
1748 std::vector<EDA_ITEM*>& aUpdatedItems )
override
1808 std::vector<EDA_ITEM*>& aUpdatedItems )
override
1832 if( item->Type() == PCB_SHAPE_T )
1834 PCB_SHAPE* shape = static_cast<PCB_SHAPE*>( item );
1835 m_shapes.push_back( shape );
1836 m_originalWidths[shape] = static_cast<double>( shape->GetWidth() );
1842 const std::optional<VECTOR2I>& aPinned ) :
1885 std::vector<EDA_ITEM*>& aUpdatedItems )
override
1910 shape->Move(
delta );
1915 aUpdatedItems.push_back( shape );
1944 const double MIN_ARM_RATIO = 0.1;
1950 double floor =
static_cast<double>( diagonal.
SquaredEuclideanNorm() ) * MIN_ARM_RATIO * MIN_ARM_RATIO;
1961 scale =
static_cast<double>( oldArm.
Dot( newArm ) ) / span;
1965 double sx =
static_cast<double>( br.
x - tl.
x ) /
static_cast<double>( oldBox.
GetWidth() );
1966 double sy =
static_cast<double>( br.
y - tl.
y ) /
static_cast<double>( oldBox.
GetHeight() );
1968 scale = ( sx + sy ) / 2.0;
1982 shape->Move( -origin );
1983 shape->Scale(
scale );
1984 shape->Move( origin );
1988 shapeIt->second = shapeIt->second *
scale;
1989 shape->SetWidth(
KiROUND( shapeIt->second ) );
1993 shape->SetWidth(
KiROUND( shape->GetWidth() *
scale ) );
1996 aUpdatedItems.push_back( shape );
2012 bbox.
Merge( shape->GetBoundingBox() );
2088 const auto type = aItem.
Type();
2107 double angleRad = aAngleDeg *
M_PI / 180.0;
2110 double chord = (
next - prev ).EuclideanNorm();
2111 double sinA = sin( angleRad );
2113 if( chord == 0.0 || fabs( sinA ) < 1e-9 )
2116 double radius = chord / ( 2.0 * sinA );
2121 double h_sq =
radius *
radius - ( chord * chord ) / 4.0;
2122 double h = h_sq > 0.0 ? sqrt( h_sq ) : 0.0;
2146 return d1 < d2 ? p1 : p2;
2155 wxASSERT_MSG(
m_selectionTool, wxT(
"pcbnew.InteractiveSelection tool is not available" ) );
2157 const auto arcIsEdited =
2158 [](
const SELECTION& aSelection ) ->
bool
2160 const EDA_ITEM* item = aSelection.Front();
2177 std::shared_ptr<EDIT_POINTS> points = std::make_shared<EDIT_POINTS>( aItem );
2185 switch( aItem->
Type() )
2197 m_editorBehavior = std::make_unique<BARCODE_POINT_EDIT_BEHAVIOR>( barcode );
2209 m_editorBehavior = std::make_unique<TEXTBOX_POINT_EDIT_BEHAVIOR>( textbox );
2219 m_editorBehavior = std::make_unique<EDA_SEGMENT_POINT_EDIT_BEHAVIOR>( *shape );
2223 m_editorBehavior = std::make_unique<RECTANGLE_POINT_EDIT_BEHAVIOR>( *shape );
2233 m_editorBehavior = std::make_unique<EDA_CIRCLE_POINT_EDIT_BEHAVIOR>( *shape );
2237 m_editorBehavior = std::make_unique<EDA_POLYGON_POINT_EDIT_BEHAVIOR>( *shape );
2241 m_editorBehavior = std::make_unique<EDA_BEZIER_POINT_EDIT_BEHAVIOR>( *shape,
2247 m_editorBehavior = std::make_unique<EDA_ELLIPSE_POINT_EDIT_BEHAVIOR>( *shape );
2260 bool shapesOnly =
true;
2285 m_editorBehavior = std::make_unique<PCB_TABLECELL_POINT_EDIT_BEHAVIOR>( *cell );
2309 ZONE& zone =
static_cast<ZONE&
>( *aItem );
2319 m_editorBehavior = std::make_unique<GENERATOR_POLY_POINT_EDIT_BEHAVIOR>( *generator );
2325 m_editorBehavior = std::make_unique<GENERATOR_POINT_EDIT_BEHAVIOR>( *generator );
2334 m_editorBehavior = std::make_unique<ALIGNED_DIMENSION_POINT_EDIT_BEHAVIOR>( dimension );
2341 m_editorBehavior = std::make_unique<DIM_CENTER_POINT_EDIT_BEHAVIOR>( dimension );
2348 m_editorBehavior = std::make_unique<DIM_RADIAL_POINT_EDIT_BEHAVIOR>( dimension );
2355 m_editorBehavior = std::make_unique<DIM_LEADER_POINT_EDIT_BEHAVIOR>( dimension );
2430 if( selItem->GetEditFlags() || !selItem->IsBOARD_ITEM() )
2437 if( !item || ( item->
IsLocked() && !overrideLocks ) )
2445 grid.SetPointEditProfile(
true );
2449 std::vector<std::unique_ptr<BOARD_ITEM>> clones;
2456 std::vector<PCB_SHAPE*> shapes;
2457 std::set<KIID> shapeIds;
2458 bool allShapes =
true;
2459 bool anyLocked =
false;
2466 shapes.push_back( shape );
2467 shapeIds.insert( shape->
m_Uuid );
2478 std::vector<VECTOR2I> pinned;
2480 if( allShapes && shapes.size() > 1 )
2484 if( allShapes && shapes.size() > 1 && ( !anyLocked || overrideLocks ) && pinned.size() < 2 )
2486 std::optional<VECTOR2I>
pin;
2488 if( !pinned.empty() )
2489 pin = pinned.front();
2491 m_editorBehavior = std::make_unique<SHAPE_GROUP_POINT_EDIT_BEHAVIOR>( std::move( shapes ), item,
pin );
2531 bool inDrag =
false;
2532 bool isConstrained =
false;
2533 bool haveSnapLineDirections =
false;
2535 auto updateSnapLineDirections =
2538 std::vector<VECTOR2I> directions;
2552 if( directions.empty() )
2554 grid.SetSnapLineDirections( {} );
2555 grid.SetSnapLineEnd( std::nullopt );
2556 haveSnapLineDirections =
false;
2562 grid.SetSnapLineDirections( directions );
2563 grid.SetSnapLineOrigin( origin );
2564 grid.SetSnapLineEnd( std::nullopt );
2565 haveSnapLineDirections =
true;
2571 auto installFeasibilityCallback =
2574 grid.SetFeasibilityCallback( {} );
2581 grid.SetFeasibilityCallback(
2583 const std::vector<SNAP_CANDIDATE>& aCandidates )
2585 return session->ResolveCandidates( aContext, aCandidates );
2593 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2594 installFeasibilityCallback();
2623 frame()->UndoRedoBlock(
true );
2638 if( std::optional<CONSTRAINT_MEMBER> member =
2646 installFeasibilityCallback();
2655 for(
size_t ii = 0; ii <
m_editPoints->PointsSize(); ++ii )
2671 shape->UpdateHatching();
2676 clones.emplace_back( clone );
2677 grid.AddConstructionItems( { clone },
false, true );
2679 updateSnapLineDirections();
2683 bool ctrlHeld = evt->Modifier(
MD_CTRL );
2687 if( isConstrained != need_constraint )
2690 isConstrained = need_constraint;
2691 updateSnapLineDirections();
2694 if( need_constraint )
2702 grid.SetAngleRestriction( std::nullopt, 0.0 );
2709 bool isPoly =
false;
2711 switch( item->
Type() )
2734 if( policy->
GetMode() != targetMode )
2735 policy->
SetMode( targetMode );
2753 if(
grid.GetUseGrid() )
2758 bool snappedAlongPerp =
false;
2780 double step = std::hypot( gridSize.
x * perpUnit.
x,
2781 gridSize.
y * perpUnit.
y );
2785 double offset =
VECTOR2D( pos - origCenter ).
Dot( perpUnit );
2786 double snapped = std::round( offset / step ) * step;
2789 snappedAlongPerp =
true;
2794 if( !snappedAlongPerp )
2797 grid.ResolveSnap( pos, {},
grid.GetItemGrid( item ), { item } )
2804 -
grid.ResolveSnap( last, {},
grid.GetItemGrid( item ), { item } )
2807 if( abs(
delta.x ) >
grid.GetGrid().x / 2 )
2808 pos.
x = last.
x + deltaGrid.
x;
2812 if( abs(
delta.y ) >
grid.GetGrid().y / 2 )
2813 pos.
y = last.
y + deltaGrid.
y;
2835 bool isFreePolygon =
2843 if( idx != wxNOT_FOUND )
2846 int nextIdx = ( idx + 1 ) %
m_editPoints->PointsSize();
2849 SEG segA( pos, prev );
2852 double snapAng = 45.0 * std::round( ang / 45.0 );
2854 if(
std::abs( ang - snapAng ) < 2.0 )
2861 grid.ResolveSnap( snapped, {},
grid.GetItemGrid( item ), { item } )
2865 snapped =
std::abs( griddedAng - snapAng ) < 2.0 ? gridded : pos;
2868 if( snapped != pos )
2879 bool constraintSnapped =
false;
2880 std::vector<VECTOR2I> stationarySelfPoints;
2881 std::vector<SEG> stationarySelfSegments;
2889 for(
unsigned i = 0; i <
m_editPoints->PointsSize(); ++i )
2896 && &point != &editedLine->
GetEnd() ) ) )
2898 stationarySelfPoints.push_back( point.
GetPosition() );
2902 for(
unsigned i = 0; i <
m_editPoints->LinesSize(); ++i )
2906 if( &stationaryLine != editedLine
2913 && &stationaryLine.
GetEnd() != &editedLine->
GetEnd() ) ) )
2915 stationarySelfSegments.emplace_back(
2928 int opposite = ( editedIndex + 2 ) % 4;
2929 stationarySelfPoints.push_back(
m_editPoints->Point( opposite ).GetPosition() );
2933 for(
unsigned i = 0; i <
m_editPoints->LinesSize() && i < 4; ++i )
2948 constexpr int arcStart = 0;
2949 constexpr int arcMid = 1;
2950 constexpr int arcEnd = 2;
2951 constexpr int arcCenter = 3;
2955 if( editedIndex != arcStart )
2956 stationarySelfPoints.push_back(
m_editPoints->Point( arcStart ).GetPosition() );
2958 if( editedIndex != arcEnd )
2959 stationarySelfPoints.push_back(
m_editPoints->Point( arcEnd ).GetPosition() );
2961 else if( editedIndex == arcStart || editedIndex == arcMid || editedIndex == arcEnd )
2963 stationarySelfPoints.push_back(
m_editPoints->Point( arcCenter ).GetPosition() );
2968 grid.SetStationarySelfGeometry( std::move( stationarySelfPoints ),
2969 std::move( stationarySelfSegments ) );
2975 grid.ResolveSnap( pos, snapLayers,
grid.GetItemGrid( item ), { item } )
2977 constraintSnapped =
true;
2983 constraintSnapped =
true;
2988 if(
grid.GetSnap() && !snapLayers.empty() )
2992 grid.ResolveSnap( constrainedPos, snapLayers,
grid.GetItemGrid( item ),
2997 if( snapPos != constrainedPos )
3003 if( projectedPos != snapPos )
3011 grid.ResolveSnap( pos, snapLayers,
grid.GetItemGrid( item ), { item } )
3019 if( haveSnapLineDirections )
3022 grid.SetSnapLineOrigin( snapOrigin );
3024 if( constraintSnapped )
3027 grid.SetSnapLineEnd( std::nullopt );
3041 int radius = rect->GetCornerRadius();
3043 VECTOR2I topLeft = rect->GetTopLeft();
3044 VECTOR2I botRight = rect->GetBotRight();
3062 for(
size_t ii = 0; ii <
m_editPoints->PointsSize(); ++ii )
3075 else if( inDrag && evt->IsMouseUp(
BUT_LEFT ) )
3093 updateSnapLineDirections();
3110 commit.
Push(
_(
"Resize Table Cells" ) );
3114 commit.
Push(
_(
"Move Point" ) );
3120 shape->UpdateHatching();
3125 frame()->UndoRedoBlock(
false );
3126 updateSnapLineDirections();
3130 else if( evt->IsCancelInteractive() || evt->IsActivate() )
3145 shape->UpdateHatching();
3150 frame()->UndoRedoBlock(
false );
3151 updateSnapLineDirections();
3157 if( evt->IsActivate() && !evt->IsMoveTool() )
3188 evt->SetPassEvent();
3199 shape->UpdateHatching();
3223 grid.SetSnapLineDirections( {} );
3245 title =
_(
"Move Midpoint to Location" );
3246 msg =
_(
"Move Midpoint" );
3250 title =
_(
"Move Corner to Location" );
3251 msg =
_(
"Move Corner" );
3276 std::vector<EDA_ITEM*> updatedItems = { item };
3288 auto anyConstraints =
3300 if( !fp->Constraints().empty() )
3308 groupBehavior && anyConstraints() )
3311 std::vector<PCB_SHAPE*> modified;
3316 aCommit.Modify( aNeighbor );
3320 updatedItems.push_back( neighbor );
3328 std::optional<CONSTRAINT_MEMBER> member;
3329 std::optional<std::pair<CONSTRAINT_MEMBER, VECTOR2I>> coDragged;
3367 if( !member.has_value() )
3369 for(
unsigned i = 0; i <
m_editPoints->LinesSize() && i < 4; ++i )
3388 for(
unsigned i = 0; i <
m_editPoints->PointsSize(); ++i )
3404 if( !member.has_value() )
3406 for(
unsigned i = 0; i <
m_editPoints->LinesSize(); ++i )
3431 std::vector<PCB_SHAPE*> modified;
3435 auto stageNeighbor = [&](
BOARD_ITEM* aItem )
3440 updatedItems.push_back( aItem );
3443 if( member.has_value() )
3457 false, {}, coDragged );
3462 false,
false, {}, coDragged );
3479 updatedItems.push_back( neighbor );
3484 switch( item->
Type() )
3495 if(
pad->IsEntered() )
3502 textBox->ClearRenderCache();
3530 for(
EDA_ITEM* updatedItem : updatedItems )
3533 frame()->SetMsgPanel( item );
3550 int editedIndex = -1;
3551 bool editingLine =
false;
3556 for(
unsigned ii = 0; ii <
m_editPoints->PointsSize(); ++ii )
3566 if( editedIndex == -1 )
3568 for(
unsigned ii = 0; ii <
m_editPoints->LinesSize(); ++ii )
3589 if( editedIndex >= 0 )
3591 if( editingLine && editedIndex < (
int)
m_editPoints->LinesSize() )
3593 else if( !editingLine && editedIndex < (
int)
m_editPoints->PointsSize() )
3622 if(
frame()->ToolStackIsEmpty() )
3625 controls->ForceCursorPosition(
false );
3636 bool isPoly =
false;
3640 switch( parent->
Type() )
3657 if( line && isPoly )
3681 if( line && isPoly )
3716 auto vertexIdx = it.GetIndex();
3719 return std::make_pair(
true, vertexIdx );
3737 switch( item->
Type() )
3740 polyset =
static_cast<ZONE*
>( item )->Outline();
3745 polyset = &
static_cast<PCB_SHAPE*
>( item )->GetPolyShape();
3798 unsigned int nearestIdx = 0;
3799 unsigned int nextNearestIdx = 0;
3800 unsigned int nearestDist = INT_MAX;
3801 unsigned int firstPointInContour = 0;
3806 ZONE* zone =
static_cast<ZONE*
>( item );
3807 zoneOutline = zone->
Outline();
3826 for( ; iterator; iterator++, curr_idx++ )
3828 int jj = curr_idx+1;
3832 jj = firstPointInContour;
3833 firstPointInContour = curr_idx+1;
3836 SEG curr_segment( zoneOutline->
CVertex( curr_idx ), zoneOutline->
CVertex( jj ) );
3843 nearestIdx = curr_idx;
3844 nextNearestIdx = jj;
3851 SEG nearestSide( sideOrigin, sideEnd );
3856 if( nearestPoint == sideOrigin || nearestPoint == sideEnd )
3857 nearestPoint = ( sideOrigin + sideEnd ) / 2;
3859 zoneOutline->
InsertVertex( nextNearestIdx, nearestPoint );
3863 if( graphicItem && nextNearestIdx < (
unsigned) zoneOutline->
COutline( 0 ).
PointCount() )
3866 [&](
BOARD_ITEM* aConstraint ) { commit.Modify( aConstraint ); },
3867 [&](
BOARD_ITEM* aConstraint ) { commit.Remove( aConstraint ); } );
3871 static_cast<ZONE*
>( item )->HatchBorder();
3873 commit.
Push(
_(
"Add Zone Corner" ) );
3875 else if( graphicItem )
3881 commit.
Modify( graphicItem );
3887 graphicItem->
SetEnd( nearestPoint );
3892 newSegment->
SetStart( nearestPoint );
3895 commit.
Add( newSegment );
3896 commit.
Push(
_(
"Split Segment" ) );
3901 commit.
Modify( graphicItem );
3907 graphicItem->
SetEnd( nearestPoint );
3916 commit.
Add( newArc );
3917 commit.
Push(
_(
"Split Arc" ) );
3945 ZONE* zone =
static_cast<ZONE*
>( item );
3966 const auto& vertexIdx = vertex.second;
3967 auto& outline = polygon->
Polygon( vertexIdx.m_polygon )[vertexIdx.m_contour];
3969 if( outline.PointCount() > 3 )
3980 [&](
BOARD_ITEM* aConstraint ) { commit.Modify( aConstraint ); },
3981 [&](
BOARD_ITEM* aConstraint ) { commit.Remove( aConstraint ); } );
3987 if( vertexIdx.m_contour > 0 )
4003 commit.
Push(
_(
"Remove Zone Corner" ) );
4005 commit.
Push(
_(
"Remove Polygon Corner" ) );
4008 static_cast<ZONE*
>( item )->HatchBorder();
4031 ZONE* zone =
static_cast<ZONE*
>( item );
4052 unsigned int nearestIdx = 0;
4053 unsigned int nearestDist = INT_MAX;
4061 for( ; iterator; iterator++, curr_idx++ )
4068 nearestIdx = curr_idx;
4072 int prevIdx, nextIdx;
4080 setback = std::min( setback, (
int) ( segA.Length() * 0.25 ) );
4081 setback = std::min( setback, (
int) ( segB.Length() * 0.25 ) );
4085 std::optional<CHAMFER_RESULT> chamferResult =
ComputeChamferPoints( segA, segB, chamferParams );
4087 if( chamferResult && chamferResult->m_updated_seg_a && chamferResult->m_updated_seg_b )
4093 polygon->
InsertVertex( nearestIdx, chamferResult->m_updated_seg_b->B );
4094 polygon->
InsertVertex( nearestIdx, chamferResult->m_updated_seg_a->B );
4100 auto modify = [&](
BOARD_ITEM* aConstraint ) { commit.
Modify( aConstraint ); };
4101 auto remove = [&](
BOARD_ITEM* aConstraint ) { commit.
Remove( aConstraint ); };
4112 commit.
Push(
_(
"Break Zone Corner" ) );
4114 commit.
Push(
_(
"Break Polygon Corner" ) );
4117 static_cast<ZONE*
>( item )->HatchBorder();
ARC_EDIT_MODE
Settings for arc editing.
@ KEEP_ENDPOINTS_OR_START_DIRECTION
Whe editing endpoints, the other end remains in place.
@ KEEP_CENTER_ADJUST_ANGLE_RADIUS
When editing endpoints, the angle and radius are adjusted.
constexpr EDA_IU_SCALE pcbIUScale
std::vector< VECTOR2I > ConstraintPinnedPositions(BOARD *aBoard, const std::set< KIID > &aItems)
The distinct board positions that fixed positions pin on aItems.
void ReSolveAfterShapeResize(BOARD *aBoard, PCB_SHAPE *aShape, std::vector< PCB_SHAPE * > *aModified, const std::function< void(BOARD_ITEM *)> &aBeforeModify)
Re-solve after a resize, e.g. a circle radius edit. Holds aShape fixed so its neighbors adjust.
CONSTRAINT_DIAGNOSIS SolveCluster(BOARD *aBoard, const CONSTRAINT_MEMBER &aDragged, const VECTOR2I &aCursor, std::vector< PCB_SHAPE * > *aModified, const std::function< void(BOARD_ITEM *)> &aBeforeModify, bool aIncludeDragged, bool aStabilize, const std::set< KIID > &aEdited, const std::optional< std::pair< CONSTRAINT_MEMBER, VECTOR2I > > &aCoDragged, const std::set< KIID > &aFixedShapes, bool aHoldDraggedRigid)
Gather the cluster of shapes transitively constrained with the dragged shape, solve with the dragged ...
bool ReSolveShapeClustersHoldingEdited(BOARD *aBoard, const std::vector< PCB_SHAPE * > &aEditedShapes, std::vector< PCB_SHAPE * > *aModified, const std::function< void(BOARD_ITEM *)> &aBeforeModify)
Re-solve clusters whose new geometry is authoritative holding every edited shape fully fixed so only ...
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
static TOOL_ACTION cycleArcEditMode
static TOOL_ACTION pointEditorArcKeepCenter
static TOOL_ACTION pointEditorArcKeepRadius
static TOOL_ACTION reselectItem
static TOOL_ACTION activatePointEditor
static TOOL_ACTION selectionClear
Clear the current selection.
static TOOL_ACTION pointEditorArcKeepEndpoint
PCB_DIM_ALIGNED & m_dimension
void updateOrthogonalDimension(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints)
Update orthogonal dimension points.
ALIGNED_DIMENSION_POINT_EDIT_BEHAVIOR(PCB_DIM_ALIGNED &aDimension)
void updateAlignedDimension(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints)
Update non-orthogonal dimension points.
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
OPT_VECTOR2I Get45DegreeConstrainer(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints) const override
Get the 45-degree constrainer for the item, when the given point is moved.
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
BARCODE_POINT_EDIT_BEHAVIOR(PCB_BARCODE &aBarcode)
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
PCB_SHAPE makeDummyRect()
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Execute the changes.
COMMIT & Stage(EDA_ITEM *aItem, CHANGE_TYPE aChangeType, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE) override
Add a change of the item aItem of type aChangeType to the change list.
void Revert() override
Revert the commit by restoring the modified items state.
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.
bool IsLocked() const override
FOOTPRINT * GetParentFootprint() const
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
constexpr void SetMaximum()
constexpr const Vec GetEnd() const
constexpr size_type GetWidth() const
constexpr Vec Centre() 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 size_type GetHeight() const
constexpr coord_type GetLeft() const
constexpr bool Contains(const Vec &aPoint) const
constexpr const Vec & GetOrigin() const
constexpr coord_type GetRight() const
constexpr coord_type GetTop() const
constexpr coord_type GetBottom() const
Represent a set of changes (additions, deletions or modifications) of a data model (e....
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.
Class to help update the text position of a dimension when the crossbar changes.
DIM_ALIGNED_TEXT_UPDATER(PCB_DIM_ALIGNED &aDimension)
VECTOR2I getDimensionNewTextPosition()
PCB_DIM_ALIGNED & m_dimension
const VECTOR2I m_originalTextPos
void UpdateTextAfterChange()
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
PCB_DIM_CENTER & m_dimension
OPT_VECTOR2I Get45DegreeConstrainer(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints) const override
Get the 45-degree constrainer for the item, when the given point is moved.
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
DIM_CENTER_POINT_EDIT_BEHAVIOR(PCB_DIM_CENTER &aDimension)
DIM_LEADER_POINT_EDIT_BEHAVIOR(PCB_DIM_LEADER &aDimension)
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
PCB_DIM_LEADER & m_dimension
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
DIM_RADIAL_POINT_EDIT_BEHAVIOR(PCB_DIM_RADIAL &aDimension)
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
OPT_VECTOR2I Get45DegreeConstrainer(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints) const override
Get the 45-degree constrainer for the item, when the given point is moved.
PCB_DIM_RADIAL & m_dimension
bool IsType(FRAME_T aType) const
bool GetOverrideLocks() const
A base class for most all the KiCad significant classes used in schematics and boards.
KICAD_T Type() const
Returns the type of object.
virtual EDA_ITEM * Clone() const
Create a duplicate of this item with linked list members set to NULL.
virtual void SetParent(EDA_ITEM *aParent)
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
virtual VECTOR2I GetTopLeft() const
SHAPE_POLY_SET & GetPolyShape()
virtual VECTOR2I GetBotRight() const
virtual void SetBottom(int val)
virtual void SetTop(int val)
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
virtual void SetLeft(int val)
virtual void SetRight(int val)
int GetCornerRadius() const
VECTOR2I GetArcMid() const
EDA_TABLECELL_POINT_EDIT_BEHAVIOR(EDA_SHAPE &aCell)
Represent a line connecting two EDIT_POINTs.
POLYGON_EDGE_DRAG_POLICY * GetDragPolicy() const
void SetRelation(std::unique_ptr< EDIT_RELATION > aRelation)
Set a relation for an EDIT_LINE.
EDIT_POINT & GetEnd()
Return the end EDIT_POINT.
EDIT_POINT & GetOrigin()
Return the origin EDIT_POINT.
EDIT_POINTS is a VIEW_ITEM that manages EDIT_POINTs and EDIT_LINEs and draws them.
unsigned int PointsSize() const
Return number of stored EDIT_POINTs.
void AddPoint(const EDIT_POINT &aPoint)
Add an EDIT_POINT.
void SetSwapY(bool aSwap)
void Clear()
Clear all stored EDIT_POINTs and EDIT_LINEs.
EDIT_LINE & Line(unsigned int aIndex)
void AddIndicatorLine(EDIT_POINT &aOrigin, EDIT_POINT &aEnd)
Adds an EDIT_LINE that is shown as an indicator, rather than an editable line (no center point drag,...
void SetSwapX(bool aSwap)
unsigned int LinesSize() const
Return number of stored EDIT_LINEs.
EDIT_POINT & Point(unsigned int aIndex)
void AddLine(const EDIT_LINE &aLine)
Adds an EDIT_LINE.
Represent a single point that can be used for modifying items.
virtual void SetPosition(const VECTOR2I &aPosition)
Set new coordinates for an EDIT_POINT.
virtual VECTOR2I GetPosition() const
Return coordinates of an EDIT_POINT.
void SetSnapConstraint(SNAP_CONSTRAINT_TYPE aConstraint)
int GetX() const
Return X coordinate of an EDIT_POINT.
void SetRelation(std::unique_ptr< EDIT_RELATION > aRelation)
Set a relation for an EDIT_POINT.
void SetActive(bool aActive=true)
void SetDrawCircle(bool aDrawCircle=true)
static std::unique_ptr< EDIT_RELATION > Angle90(const EDIT_POINT &aReference)
static std::unique_ptr< EDIT_RELATION > Angle45(const EDIT_POINT &aReference)
static std::unique_ptr< EDIT_RELATION > PerpendicularTranslation(const EDIT_LINE &aLine)
const VECTOR2I & Direction() const
static std::unique_ptr< EDIT_RELATION > PointOnLine(const EDIT_POINT &aConstrained, const EDIT_POINT &aReference)
EDIT_RELATION_KIND Kind() const
static const TOOL_EVENT InhibitSelectionEditing
Used to inform tools that the selection should temporarily be non-editable.
static const TOOL_EVENT SelectedEvent
static const TOOL_EVENT SelectedItemsModified
Selected item had a property changed (except movement)
static const TOOL_EVENT UninhibitSelectionEditing
static const TOOL_EVENT PointSelectedEvent
static const TOOL_EVENT SelectedItemsMoved
Selected items were moved, this can be very high frequency on the canvas, use with care.
static const TOOL_EVENT UnselectedEvent
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
PCB_GENERATOR & m_generator
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
GENERATOR_POINT_EDIT_BEHAVIOR(PCB_GENERATOR &aGenerator)
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
PCB_GENERATOR_POLY & m_gen
GENERATOR_POLY_POINT_EDIT_BEHAVIOR(PCB_GENERATOR_POLY &aGen)
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
VECTOR2I toLocal(const VECTOR2I &aWorld) const
VECTOR2I radiusEndLocal() const
VECTOR2I arcEndLocal() const
GRID_POINT_EDIT_BEHAVIOR(PCB_GRID_ITEM &aGridItem)
VECTOR2I arcMidLocal() const
VECTOR2I cornerLocal(int aX, int aY) const
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
VECTOR2I toWorld(const VECTOR2I &aLocal) const
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
PCB_GRID_ITEM & m_gridItem
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const override
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
An interface for classes handling user events controlling the view behavior such as zooming,...
virtual void ForceCursorPosition(bool aEnabled, const VECTOR2D &aPosition=VECTOR2D(0, 0))
Place the cursor immediately at a given point.
virtual void ShowCursor(bool aEnabled)
Enable or disables display of cursor.
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
virtual void SetAutoPan(bool aEnabled)
Turn on/off auto panning (this feature is used when there is a tool active (eg.
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
LSET is a set of PCB_LAYER_IDs.
static const LSET & AllLayersMask()
static constexpr PCB_LAYER_ID TEMP_ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
PAD_POINT_EDIT_BEHAVIOR(PAD &aPad, PCB_LAYER_ID aLayer)
ARC_EDIT_MODE m_ArcEditMode
static TOOL_ACTION layerChanged
static TOOL_ACTION pointEditorMoveMidpoint
static TOOL_ACTION genFinishEdit
static TOOL_ACTION genStartEdit
static TOOL_ACTION pointEditorMoveCorner
static TOOL_ACTION genCancelEdit
static TOOL_ACTION genUpdateEdit
static TOOL_ACTION pointEditorChamferCorner
static TOOL_ACTION pointEditorRemoveCorner
static TOOL_ACTION pointEditorAddCorner
Common, abstract interface for edit frames.
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
PCBNEW_SETTINGS * GetPcbNewSettings() const
virtual MAGNETIC_SETTINGS * GetMagneticItemsSettings()
FOOTPRINT_EDITOR_SETTINGS * GetFootprintEditorSettings() const
For better understanding of the points that make a dimension:
Mark the center of a circle or arc with a cross shape.
A leader is a dimension-like object pointing to a specific point.
An orthogonal dimension is like an aligned dimension, but the extension lines are locked to the X or ...
void SetOrientation(DIR aOrientation)
Set the orientation of the dimension line (so, perpendicular to the feature lines).
DIR GetOrientation() const
A radial dimension indicates either the radius or diameter of an arc or circle.
virtual wxString GetCommitMessage() const =0
A set of BOARD_ITEMs (i.e., without duplicates).
std::unordered_set< BOARD_ITEM * > GetBoardItems() const
int changeArcEditMode(const TOOL_EVENT &aEvent)
Change the edit method for arcs.
bool CanRemoveCorner(const SELECTION &aSelection)
Condition to display "Remove Corner" context menu entry.
void updateItem(BOARD_COMMIT &aCommit)
Update item's points with edit points.
VECTOR2I m_stickyDisplacement
int OnSelectionChange(const TOOL_EVENT &aEvent)
Change selection event handler.
void setAltConstraint(bool aEnabled)
Set up an alternative constraint (typically enabled upon a modifier key being pressed).
static const unsigned int COORDS_PADDING
EDIT_POINT * m_hoveredPoint
int addCorner(const TOOL_EVENT &aEvent)
bool HasPoint()
Indicate the cursor is over an edit point.
EDIT_POINT m_original
Original pos for the current drag point.
static bool CanChamferCorner(const EDA_ITEM &aItem)
Check if a corner of the given item can be chamfered (zones, polys only).
EDIT_POINT get45DegConstrainer() const
Return a point that should be used as a constrainer for 45 degrees mode.
int modifiedSelection(const TOOL_EVENT &aEvent)
void Reset(RESET_REASON aReason) override
Bring the tool to a known, initial state.
std::unique_ptr< POINT_EDIT_BEHAVIOR > m_editorBehavior
int removeCorner(const TOOL_EVENT &aEvent)
bool Init() override
Init() is called once upon a registration of the tool.
std::shared_ptr< BOARD_CONSTRAINT_DRAG_SESSION > m_constraintDragSession
std::unique_ptr< EDIT_RELATION > m_altConstraint
RECT_RADIUS_TEXT_ITEM * m_radiusHelper
int movePoint(const TOOL_EVENT &aEvent)
TOOL_ACTION handlers.
static bool CanAddCorner(const EDA_ITEM &aItem)
Check if a corner can be added to the given item (zones, polys, segments, arcs).
void setEditedPoint(EDIT_POINT *aPoint)
Set the current point being edited. NULL means none.
EDIT_POINT m_altConstrainer
bool isModified(const EDIT_POINT &aPoint) const
Return true if aPoint is the currently modified point.
ARC_EDIT_MODE m_arcEditMode
std::unique_ptr< KIGFX::PREVIEW::ANGLE_ITEM > m_angleItem
EDIT_POINT * m_editedPoint
void updateEditedPoint(const TOOL_EVENT &aEvent)
Update which point is being edited.
int getEditedPointIndex() const
void updatePoints()
Update edit points with item's points.
int chamferCorner(const TOOL_EVENT &aEvent)
void setTransitions() override
Set up handlers for various events.
std::shared_ptr< EDIT_POINTS > m_editPoints
std::shared_ptr< EDIT_POINTS > makePoints(EDA_ITEM *aItem)
PCB_SELECTION_TOOL * m_selectionTool
Object to handle a bitmap image that can be inserted in a PCB.
REFERENCE_IMAGE & GetReferenceImage()
void SetCornerRadius(int aCornerRadius) override
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
void SetEnd(const VECTOR2I &aEnd) override
bool IsProxyItem() const override
void Move(const VECTOR2I &aMoveVector) override
Move this object.
void SetStart(const VECTOR2I &aStart) override
VECTOR2I unturned(const VECTOR2I &aPoint) const
VECTOR2I edgeMidpoint(TABLECELL_POINTS aPoint) const
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
PCB_TABLECELL_POINT_EDIT_BEHAVIOR(PCB_TABLECELL &aCell)
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
A helper class interface to manage the edit points for a single item.
static bool isModified(const EDIT_POINT &aEditedPoint, const EDIT_POINT &aPoint)
Checks if two points are the same instance - which means the point is being edited.
void SetMode(POLYGON_LINE_MODE aMode)
POLYGON_LINE_MODE GetMode() const
const VECTOR2I & GetOriginalCenter() const
const VECTOR2I & GetPerpVector() const
POLYGON_POINT_EDIT_BEHAVIOR(SHAPE_POLY_SET &aPolygon)
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
static void UpdateItem(SCH_SHAPE &aRect, const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, const VECTOR2I &aMinSize={ 0, 0 })
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
static void UpdateItem(PCB_SHAPE &aRectangle, const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, const VECTOR2I &aMinSize={ 0, 0 })
static void UpdatePoints(SCH_SHAPE &aRect, EDIT_POINTS &aPoints)
static void PinEditedCorner(const EDIT_POINT &aEditedPoint, const EDIT_POINTS &aPoints, int minWidth, int minHeight, VECTOR2I &topLeft, VECTOR2I &topRight, VECTOR2I &botLeft, VECTOR2I &botRight)
Update the coordinates of 4 corners of a rectangle, according to constraints and the moved corner.
static void PinEditedCorner(const EDIT_POINT &aEditedPoint, const EDIT_POINTS &aEditPoints, VECTOR2I &aTopLeft, VECTOR2I &aTopRight, VECTOR2I &aBotLeft, VECTOR2I &aBotRight, const VECTOR2I &aHole={ 0, 0 }, const VECTOR2I &aHoleSize={ 0, 0 }, const VECTOR2I &aMinSize={ 0, 0 })
Update the coordinates of 4 corners of a rectangle, according to constraints and the moved corner.
static void MakePoints(SCH_SHAPE &aRect, EDIT_POINTS &aPoints)
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
static void MakePoints(const PCB_SHAPE &aRectangle, EDIT_POINTS &aPoints)
Standard rectangle points construction utility (other shapes may use this as well)
static void UpdatePoints(const PCB_SHAPE &aRectangle, EDIT_POINTS &aPoints)
RECTANGLE_POINT_EDIT_BEHAVIOR(PCB_SHAPE &aRectangle)
const EDA_IU_SCALE & m_iuScale
wxString GetClass() const override
Return the class name.
std::vector< int > ViewGetLayers() const override
Return the all the layers within the VIEW the object is painted on.
const BOX2I ViewBBox() const override
Return the bounding box of the item covering all its layers.
void Set(int aRadius, const VECTOR2I &aCorner, const VECTOR2I &aQuadrant, EDA_UNITS aUnits)
RECT_RADIUS_TEXT_ITEM(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits)
void ViewDraw(int aLayer, KIGFX::VIEW *aView) const override
Draw the parts of the object belonging to layer aLayer.
const VECTOR2I NearestPoint(const VECTOR2I &aP) const
Compute a point on the segment (this) that is closest to point aP.
int Distance(const SEG &aSeg) const
Compute minimum Euclidean distance to segment aSeg.
EDA_ANGLE Angle(const SEG &aOther) const
Determine the smallest angle between two segments.
Class that groups generic conditions for selected items.
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.
VECTOR2I NearestPoint(const VECTOR2I &aP) const
const VECTOR2I & GetP1() const
std::optional< VECTOR2I > m_pinned
const std::vector< PCB_SHAPE * > & GetShapes() const
SHAPE_GROUP_POINT_EDIT_BEHAVIOR(PCB_GROUP &aGroup)
BOARD_ITEM * GetParent() const
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
std::unordered_map< PCB_SHAPE *, double > m_originalWidths
std::vector< PCB_SHAPE * > m_shapes
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
SHAPE_GROUP_POINT_EDIT_BEHAVIOR(std::vector< PCB_SHAPE * > aShapes, BOARD_ITEM *aParent, const std::optional< VECTOR2I > &aPinned)
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
BOX2I getBoundingBox() const
int PointCount() const
Return the number of points (vertices) in this line chain.
bool IsEndContour() const
Represent a set of closed polygons.
ITERATOR_TEMPLATE< VECTOR2I > ITERATOR
ITERATOR IterateWithHoles(int aOutline)
void InsertVertex(int aGlobalIndex, const VECTOR2I &aNewVertex)
Adds a vertex in the globally indexed position aGlobalIndex.
POLYGON & Polygon(int aIndex)
Return the aIndex-th subpolygon in the set.
void RemoveVertex(int aGlobalIndex)
Delete the aGlobalIndex-th vertex.
void RemoveContour(int aContourIdx, int aPolygonIdx=-1)
Delete the aContourIdx-th contour of the aPolygonIdx-th polygon in the set.
bool GetNeighbourIndexes(int aGlobalIndex, int *aPrevious, int *aNext) const
Return the global indexes of the previous and the next corner of the aGlobalIndex-th corner of a cont...
ITERATOR Iterate(int aFirst, int aLast, bool aIterateHoles=false)
Return an object to iterate through the points of the polygons between aFirst and aLast.
const VECTOR2I & CVertex(int aIndex, int aOutline, int aHole) const
Return the index-th vertex in a given hole outline within a given outline.
int OutlineCount() const
Return the number of outlines in the set.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
A textbox is edited as a rectnagle when it is orthogonally aligned.
TEXTBOX_POINT_EDIT_BEHAVIOR(PCB_TEXTBOX &aTextbox)
void MakePoints(EDIT_POINTS &aPoints) override
Construct the initial set of edit points for the item and append to the given list.
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
EDA_UNITS GetUserUnits() const
constexpr extended_type Cross(const VECTOR2< T > &aVector) const
Compute cross product of self with aVector.
double Distance(const VECTOR2< extended_type > &aVector) const
Compute the distance between two vectors.
constexpr extended_type SquaredEuclideanNorm() const
Compute the squared euclidean norm of the vector, which is defined as (x ** 2 + y ** 2).
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
constexpr extended_type Dot(const VECTOR2< T > &aVector) const
Compute dot product of self with aVector.
VECTOR2< T > Resize(T aNewLength) const
Return a vector of the same direction, but length specified in aNewLength.
VECTOR2I GetValue()
Return the value in internal units.
ZONE_POINT_EDIT_BEHAVIOR(ZONE &aZone)
void UpdateItem(const EDIT_POINT &aEditedPoint, EDIT_POINTS &aPoints, COMMIT &aCommit, std::vector< EDA_ITEM * > &aUpdatedItems) override
Update the item with the new positions of the edit points.
Handle a list of polygons defining a copper zone.
void SetNeedRefill(bool aNeedRefill)
SHAPE_POLY_SET * Outline()
This file is part of the common library.
void RemapPolygonVertexMembers(BOARD *aBoard, const KIID &aPoly, int aChangedIndex, int aDelta, const std::function< void(BOARD_ITEM *)> &aBeforeModify, const std::function< void(BOARD_ITEM *)> &aBeforeRemove)
Repoint persisted VERTEX constraint members after an outline edit of polygon aPoly inserts or removes...
std::optional< CONSTRAINT_ANCHOR_POINT > ConstraintShapeVertex(const PCB_SHAPE *aShape, int aIndex)
VERTEX anchor at ordinal aIndex of a rectangle or eligible polygon or std::nullopt if the shape has n...
bool ConstraintPolygonIsModelable(const PCB_SHAPE *aShape)
True when polygon has one non empty hole free arc free outline making it solver eligible Shared by ad...
std::optional< CHAMFER_RESULT > ComputeChamferPoints(const SEG &aSegA, const SEG &aSegB, const CHAMFER_PARAMS &aChamferParams)
Compute the chamfer points for a given line pair and chamfer parameters.
static constexpr double MIN_SCALE
static bool empty(const wxTextEntryBase *aCtrl)
const int minSize
Push and Shove router track width and via size dialog.
#define IS_MOVING
Item being moved.
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
a few functions useful in geometry calculations.
VECTOR2< ret_type > GetClampedCoords(const VECTOR2< in_type > &aCoords, pad_type aPadding=1u)
Clamp a vector to values that can be negated, respecting numeric limits of coordinates data type with...
bool IsFrontLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a front layer.
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
@ LAYER_GP_OVERLAY
General purpose overlay.
@ LAYER_SELECT_OVERLAY
Selected items overlay.
PCB_LAYER_ID
A quick note on layer IDs:
constexpr int Mils2IU(const EDA_IU_SCALE &aIuScale, int mils)
bool PointProjectsOntoSegment(const VECTOR2I &aPoint, const SEG &aSeg)
Determine if a point projects onto a segment.
double GetLengthRatioFromStart(const VECTOR2I &aPoint, const SEG &aSeg)
Get the ratio of the vector to a point from the segment's start, compared to the segment's length.
const VECTOR2I & GetNearestEndpoint(const SEG &aSeg, const VECTOR2I &aPoint)
Get the nearest end of a segment to a point.
bool PointIsInDirection(const VECTOR2< T > &aPoint, const VECTOR2< T > &aDirection, const VECTOR2< T > &aFrom)
void DrawTextNextToCursor(KIGFX::VIEW *aView, const VECTOR2D &aCursorPos, const VECTOR2D &aTextQuadrant, const wxArrayString &aStrings, bool aDrawingDropShadows)
Draw strings next to the cursor.
wxString DimensionLabel(const wxString &prefix, double aVal, const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, bool aIncludeUnits=true)
Get a formatted string showing a dimension to a sane precision with an optional prefix and unit suffi...
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
BARCODE class definition.
@ VERTEX
An indexed rectangle corner or polygon outline vertex; pairs with CONSTRAINT_MEMBER::m_index.
@ START
First endpoint of a segment or arc.
@ END
Second endpoint of a segment or arc.
@ CENTER
Center of an arc or circle.
@ MANUAL
Text placement is manually set by the user.
#define STATUS_ITEMS_ONLY
Class to handle a set of BOARD_ITEMs.
static VECTOR2I snapCorner(const VECTOR2I &aPrev, const VECTOR2I &aNext, const VECTOR2I &aGuess, double aAngleDeg)
static std::optional< CONSTRAINT_MEMBER > constraintMemberForEditPoint(PCB_SHAPE *aShape, EDIT_POINTS *aPoints, EDIT_POINT *aEditedPoint)
static std::pair< bool, SHAPE_POLY_SET::VERTEX_INDEX > findVertex(SHAPE_POLY_SET &aPolySet, const EDIT_POINT &aPoint)
static std::vector< VECTOR2I > getConstraintDirections(EDIT_RELATION *aRelation)
TEXTBOX_POINT_COUNT
Text boxes have different point counts depending on their orientation.
static void appendDirection(std::vector< VECTOR2I > &aDirections, const VECTOR2I &aDirection)
ARC_EDIT_MODE IncrementArcEditMode(ARC_EDIT_MODE aMode)
#define CHECK_POINT_COUNT(aPoints, aExpected)
#define CHECK_POINT_COUNT_GE(aPoints, aExpected)
static float distance(const SFVEC2UI &a, const SFVEC2UI &b)
std::optional< VECTOR2I > OPT_VECTOR2I
std::vector< FAB_LAYER_COLOR > dummy
Parameters that define a simple chamfer operation.
One participant in a constraint: a referenced board item plus the feature of that item that participa...
Structure to hold the necessary information in order to index a vertex on a SHAPE_POLY_SET object: th...
KIBIS top(path, &reporter)
GR_TEXT_H_ALIGN_T
This is API surface mapped to common.types.HorizontalAlignment.
VECTOR2I GetRotated(const VECTOR2I &aVector, const EDA_ANGLE &aAngle)
Return a new VECTOR2I that is the result of rotating aVector by aAngle.
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.
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_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_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
@ NOT_USED
the 3d code uses this value
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
@ PCB_TABLECELL_T
class PCB_TABLECELL, PCB_TEXTBOX for use in tables
@ PCB_GRID_ITEM_T
a subgrid placed on a board
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
@ PCB_PAD_T
class PAD, a pad in a footprint
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D
Supplemental functions for working with vectors and simple objects that interact with vectors.