31using namespace std::placeholders;
75 if( aDirection.
x != 0 || aDirection.
y != 0 )
76 aDirections.push_back( aDirection );
81 std::vector<VECTOR2I> directions;
91 else if(
dynamic_cast<EC_45DEGREE*
>( aConstraint ) )
98 else if(
dynamic_cast<EC_VERTICAL*
>( aConstraint ) )
106 else if(
EC_LINE* lineConstraint =
dynamic_cast<EC_LINE*
>( aConstraint ) )
189 wxArrayString strings;
211 return wxT(
"RECT_RADIUS_TEXT_ITEM" );
247 if( aPoints.
SwapX() )
248 std::swap( topLeft.
x, botRight.
x );
250 if( aPoints.
SwapY() )
251 std::swap( topLeft.
y, botRight.
y );
304 PinEditedCorner( aEditedPoint, aPoints, topLeft, topRight, botLeft, botRight );
312 setLeft( topLeft.
x );
313 setRight( botRight.
x );
314 setBottom( botRight.
y );
319 aRectangle.
Move( moveVector );
323 int width =
std::abs( botRight.
x - topLeft.
x );
324 int height =
std::abs( botRight.
y - topLeft.
y );
325 int maxRadius = std::min( width, height ) / 2;
327 x = std::clamp( x, botRight.
x - maxRadius, botRight.
x );
339 setLeft( topLeft.
x );
344 setBottom( botRight.
y );
349 setRight( botRight.
x );
352 for(
unsigned i = 0; i < aPoints.
LinesSize(); ++i )
369 if( aPoints.
SwapX() )
370 std::swap( topLeft.
x, botRight.
x );
372 if( aPoints.
SwapY() )
373 std::swap( topLeft.
y, botRight.
y );
400 std::vector<EDA_ITEM*>& aUpdatedItems )
override
430 aTopLeft.
x = std::min( aTopLeft.
x, aHole.x - aHoleSize.
x / 2 - minWidth );
431 aTopLeft.
y = std::min( aTopLeft.
y, aHole.y - aHoleSize.
y / 2 - minHeight );
436 aTopLeft.
x = std::min( aTopLeft.
x, aBotRight.
x - minWidth );
437 aTopLeft.
y = std::min( aTopLeft.
y, aBotRight.
y - minHeight );
441 aTopRight.
y = aTopLeft.
y;
442 aBotLeft.
x = aTopLeft.
x;
449 aTopRight.
x = std::max( aTopRight.
x, aHole.x + aHoleSize.
x / 2 + minWidth );
450 aTopRight.
y = std::min( aTopRight.
y, aHole.y - aHoleSize.
y / 2 - minHeight );
455 aTopRight.
x = std::max( aTopRight.
x, aBotLeft.
x + minWidth );
456 aTopRight.
y = std::min( aTopRight.
y, aBotLeft.
y - minHeight );
460 aTopLeft.
y = aTopRight.
y;
461 aBotRight.
x = aTopRight.
x;
468 aBotLeft.
x = std::min( aBotLeft.
x, aHole.x - aHoleSize.
x / 2 - minWidth );
469 aBotLeft.
y = std::max( aBotLeft.
y, aHole.y + aHoleSize.
y / 2 + minHeight );
474 aBotLeft.
x = std::min( aBotLeft.
x, aTopRight.
x - minWidth );
475 aBotLeft.
y = std::max( aBotLeft.
y, aTopRight.
y + minHeight );
479 aBotRight.
y = aBotLeft.
y;
480 aTopLeft.
x = aBotLeft.
x;
487 aBotRight.
x = std::max( aBotRight.
x, aHole.x + aHoleSize.
x / 2 + minWidth );
488 aBotRight.
y = std::max( aBotRight.
y, aHole.y + aHoleSize.
y / 2 + minHeight );
493 aBotRight.
x = std::max( aBotRight.
x, aTopLeft.
x + minWidth );
494 aBotRight.
y = std::max( aBotRight.
y, aTopLeft.
y + minHeight );
498 aBotLeft.
y = aBotRight.
y;
499 aTopRight.
x = aBotRight.
x;
503 aTopLeft.
y = std::min( aTopLeft.
y, aBotRight.
y - minHeight );
507 aTopLeft.
x = std::min( aTopLeft.
x, aBotRight.
x - minWidth );
511 aBotRight.
y = std::max( aBotRight.
y, aTopLeft.
y + minHeight );
515 aBotRight.
x = std::max( aBotRight.
x, aTopLeft.
x + minWidth );
533 std::vector<EDA_ITEM*>& aUpdatedItems )
override
595 std::vector<EDA_ITEM*>& aUpdatedItems )
override
611 const VECTOR2I newOffset = xfrmOrigin - ( topLeft + botRight ) / 2;
626 oldCorner -= oldSize / 2;
630 newCorner = topRight;
631 oldCorner -=
VECTOR2I( -oldSize.
x, oldSize.
y ) / 2;
636 oldCorner -=
VECTOR2I( oldSize.
x, -oldSize.
y ) / 2;
640 newCorner = botRight;
641 oldCorner += oldSize / 2;
647 *newCorner -= xfrmOrigin;
648 oldCorner -= oldOrigin;
651 if(
sign( newCorner->x ) !=
sign( oldCorner.
x ) ||
sign( newCorner->y ) !=
sign( oldCorner.
y ) )
659 double ratio = oldLength > 0 ? ( newLength / oldLength ) : 1.0;
665 ratio = std::min( newWidth / oldSize.
x, newHeight / oldSize.
y );
702 auto set45Constraint =
731 std::vector<EDA_ITEM*>& aUpdatedItems )
override
760 std::vector<EDA_ITEM*>& aUpdatedItems )
override
766 aUpdatedItems.push_back( &
table );
768 if( !
m_cell.GetTextAngle().IsHorizontal() )
776 for(
int ii = 0; ii <
m_cell.GetColSpan() - 1; ++ii )
777 colWidth -=
table.GetColWidth(
m_cell.GetColumn() + ii );
785 int rowHeight =
m_cell.GetRectangleWidth();
787 for(
int ii = 0; ii <
m_cell.GetRowSpan() - 1; ++ii )
788 rowHeight -=
table.GetRowHeight(
m_cell.GetRow() + ii );
799 int colWidth =
m_cell.GetRectangleWidth();
801 for(
int ii = 0; ii <
m_cell.GetColSpan() - 1; ++ii )
802 colWidth -=
table.GetColWidth(
m_cell.GetColumn() + ii );
810 int rowHeight =
m_cell.GetRectangleHeight();
812 for(
int ii = 0; ii <
m_cell.GetRowSpan() - 1; ++ii )
813 rowHeight -=
table.GetRowHeight(
m_cell.GetRow() + ii );
840 if(
m_pad.IsLocked() )
855 if( !
m_pad.GetOrientation().IsCardinal() )
858 if(
m_pad.GetOrientation().IsVertical() )
859 std::swap( halfSize.
x, halfSize.
y );
862 aPoints.
AddPoint( shapePos - halfSize );
864 aPoints.
AddPoint( shapePos + halfSize );
884 int target =
locked ? 0 : 1;
892 else if( target == 1 )
894 shapePos.
x += halfSize.
x;
907 int target =
locked || !
m_pad.GetOrientation().IsCardinal() ? 0 : 4;
914 else if( target == 4 )
916 if(
m_pad.GetOrientation().IsVertical() )
917 std::swap( halfSize.
x, halfSize.
y );
921 shapePos.
y - halfSize.
y ) );
924 shapePos.
y + halfSize.
y ) );
938 std::vector<EDA_ITEM*>& aUpdatedItems )
override
965 botLeft, botRight, holeCenter, holeSize );
968 || (
m_pad.GetDrillSize().x &&
m_pad.GetDrillSize().y ) )
978 dist[0] =
center.x - topLeft.
x;
979 dist[1] =
center.y - topLeft.
y;
980 dist[2] = botRight.
x -
center.x;
981 dist[3] = botRight.
y -
center.y;
985 dist[0] =
center.x - botLeft.
x;
986 dist[1] =
center.y - topRight.
y;
987 dist[2] = topRight.
x -
center.x;
988 dist[3] = botLeft.
y -
center.y;
991 VECTOR2I padSize( dist[0] + dist[2], dist[1] + dist[3] );
992 VECTOR2I deltaOffset( padSize.
x / 2 - dist[2], padSize.
y / 2 - dist[3] );
994 if(
m_pad.GetOrientation().IsVertical() )
995 std::swap( padSize.
x, padSize.
y );
1014 bottom = botRight.
y;
1026 if(
m_pad.GetOrientation().IsVertical() )
1027 std::swap( padSize.
x, padSize.
y );
1069 std::vector<EDA_ITEM*>& aUpdatedItems )
override
1093 m_oldCrossBar(
SEG{ aDimension.GetCrossbarStart(), aDimension.GetCrossbarEnd() } )
1116 const VECTOR2I newProject = newCrossBar.LineProject( newTextPos );
1118 const VECTOR2I oldProjectedOffset =
1120 const VECTOR2I newProjectedOffset = newProject - newCrossBar.NearestPoint( newProject );
1122 const bool textWasLeftOf = oldProjectedOffset.
x < 0
1123 || ( oldProjectedOffset.
x == 0 && oldProjectedOffset.
y > 0 );
1124 const bool textIsLeftOf = newProjectedOffset.
x < 0
1125 || ( newProjectedOffset.
x == 0 && newProjectedOffset.
y > 0 );
1127 if( textWasLeftOf != textIsLeftOf )
1147 const EDA_ANGLE rotation = oldAngle - newAngle;
1160 rotTextOffsetFromCbCenter,
1161 newCrossBar.Center() );
1167 return newCbRefPt + rotTextOffsetFromCbEnd;
1180 const VECTOR2I newProjected = newCrossBar.A + ( newCrossBar.B - newCrossBar.A ) * oldRatio;
1181 return newProjected + rotCbNormalToText;
1234 std::vector<EDA_ITEM*>& aUpdatedItems )
override
1271 if( featureLine.
Cross( crossBar ) > 0 )
1283 if( featureLine.
Cross( crossBar ) > 0 )
1339 VECTOR2I direction = ( directionA < directionB ) ? directionA : directionB;
1345 if( !bounds.
Contains( cursorPos ) )
1368 m_dimension.SetHeight( vert ? featureLine.
x : featureLine.
y );
1424 std::vector<EDA_ITEM*>& aUpdatedItems )
override
1441 return std::nullopt;
1487 std::vector<EDA_ITEM*>& aUpdatedItems )
override
1537 return std::nullopt;
1577 std::vector<EDA_ITEM*>& aUpdatedItems )
override
1637 std::vector<EDA_ITEM*>& aUpdatedItems )
override
1656 if( item->Type() == PCB_SHAPE_T )
1658 PCB_SHAPE* shape = static_cast<PCB_SHAPE*>( item );
1659 m_shapes.push_back( shape );
1660 m_originalWidths[shape] = static_cast<double>( shape->GetWidth() );
1707 std::vector<EDA_ITEM*>& aUpdatedItems )
override
1726 shape->Move(
delta );
1731 aUpdatedItems.push_back( shape );
1744 double sx =
static_cast<double>( br.
x - tl.
x ) /
static_cast<double>( oldBox.
GetWidth() );
1745 double sy =
static_cast<double>( br.
y - tl.
y ) /
static_cast<double>( oldBox.
GetHeight() );
1746 double scale = ( sx + sy ) / 2.0;
1751 shape->Move( -oldCenter );
1752 shape->Scale(
scale );
1753 shape->Move( oldCenter );
1757 shapeIt->second = shapeIt->second *
scale;
1758 shape->SetWidth(
KiROUND( shapeIt->second ) );
1762 shape->SetWidth(
KiROUND( shape->GetWidth() *
scale ) );
1765 aUpdatedItems.push_back( shape );
1779 bbox.
Merge( shape->GetBoundingBox() );
1839 const auto type = aItem.
Type();
1858 double angleRad = aAngleDeg *
M_PI / 180.0;
1861 double chord = (
next - prev ).EuclideanNorm();
1862 double sinA = sin( angleRad );
1864 if( chord == 0.0 || fabs( sinA ) < 1e-9 )
1867 double radius = chord / ( 2.0 * sinA );
1872 double h_sq =
radius *
radius - ( chord * chord ) / 4.0;
1873 double h = h_sq > 0.0 ? sqrt( h_sq ) : 0.0;
1897 return d1 < d2 ? p1 : p2;
1906 wxASSERT_MSG(
m_selectionTool, wxT(
"pcbnew.InteractiveSelection tool is not available" ) );
1908 const auto arcIsEdited =
1909 [](
const SELECTION& aSelection ) ->
bool
1911 const EDA_ITEM* item = aSelection.Front();
1928 std::shared_ptr<EDIT_POINTS> points = std::make_shared<EDIT_POINTS>( aItem );
1936 switch( aItem->
Type() )
1941 m_editorBehavior = std::make_unique<REFERENCE_IMAGE_POINT_EDIT_BEHAVIOR>( refImage );
1947 m_editorBehavior = std::make_unique<BARCODE_POINT_EDIT_BEHAVIOR>( barcode );
1953 m_editorBehavior = std::make_unique<TEXTBOX_POINT_EDIT_BEHAVIOR>( textbox );
1963 m_editorBehavior = std::make_unique<EDA_SEGMENT_POINT_EDIT_BEHAVIOR>( *shape );
1967 m_editorBehavior = std::make_unique<RECTANGLE_POINT_EDIT_BEHAVIOR>( *shape );
1976 m_editorBehavior = std::make_unique<EDA_CIRCLE_POINT_EDIT_BEHAVIOR>( *shape );
1980 m_editorBehavior = std::make_unique<EDA_POLYGON_POINT_EDIT_BEHAVIOR>( *shape );
1984 m_editorBehavior = std::make_unique<EDA_BEZIER_POINT_EDIT_BEHAVIOR>( *shape,
1998 bool shapesOnly =
true;
2023 m_editorBehavior = std::make_unique<PCB_TABLECELL_POINT_EDIT_BEHAVIOR>( *cell );
2047 ZONE& zone =
static_cast<ZONE&
>( *aItem );
2055 m_editorBehavior = std::make_unique<GENERATOR_POINT_EDIT_BEHAVIOR>( *generator );
2063 m_editorBehavior = std::make_unique<ALIGNED_DIMENSION_POINT_EDIT_BEHAVIOR>( dimension );
2070 m_editorBehavior = std::make_unique<DIM_CENTER_POINT_EDIT_BEHAVIOR>( dimension );
2077 m_editorBehavior = std::make_unique<DIM_RADIAL_POINT_EDIT_BEHAVIOR>( dimension );
2084 m_editorBehavior = std::make_unique<DIM_LEADER_POINT_EDIT_BEHAVIOR>( dimension );
2159 if( selItem->GetEditFlags() || !selItem->IsBOARD_ITEM() )
2175 std::vector<std::unique_ptr<BOARD_ITEM>> clones;
2182 std::vector<PCB_SHAPE*> shapes;
2183 bool allShapes =
true;
2184 bool anyLocked =
false;
2191 shapes.push_back( shape );
2202 if( allShapes && shapes.size() > 1 && !anyLocked )
2205 std::move( shapes ), item );
2244 bool inDrag =
false;
2245 bool isConstrained =
false;
2246 bool haveSnapLineDirections =
false;
2248 auto updateSnapLineDirections =
2251 std::vector<VECTOR2I> directions;
2265 if( directions.empty() )
2267 grid.SetSnapLineDirections( {} );
2268 grid.SetSnapLineEnd( std::nullopt );
2269 haveSnapLineDirections =
false;
2273 grid.SetSnapLineDirections( directions );
2275 grid.SetSnapLineEnd( std::nullopt );
2276 haveSnapLineDirections =
true;
2286 grid.SetUseGrid(
getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
2315 frame()->UndoRedoBlock(
true );
2333 for(
size_t ii = 0; ii <
m_editPoints->PointsSize(); ++ii )
2349 shape->UpdateHatching();
2354 clones.emplace_back( clone );
2355 grid.AddConstructionItems( { clone },
false, true );
2357 updateSnapLineDirections();
2362 if( isConstrained != need_constraint )
2365 isConstrained = need_constraint;
2366 updateSnapLineDirections();
2371 bool ctrlHeld = evt->Modifier(
MD_CTRL );
2375 bool isPoly =
false;
2377 switch( item->
Type() )
2401 if( constraint->
GetMode() != targetMode )
2402 constraint->
SetMode( targetMode );
2420 if(
grid.GetUseGrid() )
2422 VECTOR2I gridPt =
grid.BestSnapAnchor( pos, {},
grid.GetItemGrid( item ), { item } );
2426 VECTOR2I deltaGrid = gridPt -
grid.BestSnapAnchor( last, {},
grid.GetItemGrid( item ),
2429 if( abs(
delta.x ) >
grid.GetGrid().x / 2 )
2430 pos.
x = last.
x + deltaGrid.
x;
2434 if( abs(
delta.y ) >
grid.GetGrid().y / 2 )
2435 pos.
y = last.
y + deltaGrid.
y;
2460 if( idx != wxNOT_FOUND )
2463 int nextIdx = ( idx + 1 ) %
m_editPoints->PointsSize();
2466 SEG segA( pos, prev );
2469 double snapAng = 45.0 * std::round( ang / 45.0 );
2471 if(
std::abs( ang - snapAng ) < 2.0 )
2481 bool constraintSnapped =
false;
2488 constraintSnapped =
true;
2492 if(
grid.GetSnap() && !snapLayers.empty() )
2495 VECTOR2I snapPos =
grid.BestSnapAnchor( constrainedPos, snapLayers,
2496 grid.GetItemGrid( item ), { item } );
2498 if( snapPos != constrainedPos )
2505 if( ( projectedPos - snapPos ).EuclideanNorm() > snapTolerance )
2514 constraintSnapped =
true;
2519 if(
grid.GetSnap() && !snapLayers.empty() )
2522 VECTOR2I snapPos =
grid.BestSnapAnchor( constrainedPos, snapLayers,
2523 grid.GetItemGrid( item ), { item } );
2528 if( snapPos != constrainedPos )
2538 if( ( projectedPos - snapPos ).EuclideanNorm() > snapTolerance )
2553 if( haveSnapLineDirections )
2555 if( constraintSnapped )
2558 grid.SetSnapLineEnd( std::nullopt );
2570 int radius = rect->GetCornerRadius();
2572 VECTOR2I topLeft = rect->GetTopLeft();
2573 VECTOR2I botRight = rect->GetBotRight();
2581 radiusHelper->
Hide();
2590 for(
size_t ii = 0; ii <
m_editPoints->PointsSize(); ++ii )
2603 else if( inDrag && evt->IsMouseUp(
BUT_LEFT ) )
2614 radiusHelper->
Hide();
2619 updateSnapLineDirections();
2635 commit.
Push(
_(
"Resize Table Cells" ) );
2639 commit.
Push(
_(
"Move Point" ) );
2645 shape->UpdateHatching();
2649 frame()->UndoRedoBlock(
false );
2650 updateSnapLineDirections();
2654 else if( evt->IsCancelInteractive() || evt->IsActivate() )
2669 shape->UpdateHatching();
2673 frame()->UndoRedoBlock(
false );
2674 updateSnapLineDirections();
2680 if( evt->IsActivate() && !evt->IsMoveTool() )
2710 evt->SetPassEvent();
2717 shape->UpdateHatching();
2735 grid.SetSnapLineDirections( {} );
2757 title =
_(
"Move Midpoint to Location" );
2758 msg =
_(
"Move Midpoint" );
2762 title =
_(
"Move Corner to Location" );
2763 msg =
_(
"Move Corner" );
2788 std::vector<EDA_ITEM*> updatedItems = { item };
2799 switch( item->
Type() )
2810 if(
pad->IsEntered() )
2817 textBox->ClearRenderCache();
2844 for(
EDA_ITEM* updatedItem : updatedItems )
2847 frame()->SetMsgPanel( item );
2864 int editedIndex = -1;
2865 bool editingLine =
false;
2870 for(
unsigned ii = 0; ii <
m_editPoints->PointsSize(); ++ii )
2880 if( editedIndex == -1 )
2882 for(
unsigned ii = 0; ii <
m_editPoints->LinesSize(); ++ii )
2901 if( editedIndex >= 0 )
2903 if( editingLine && editedIndex < (
int)
m_editPoints->LinesSize() )
2905 else if( !editingLine && editedIndex < (
int)
m_editPoints->PointsSize() )
2934 if(
frame()->ToolStackIsEmpty() )
2937 controls->ForceCursorPosition(
false );
2948 bool isPoly =
false;
2952 switch( parent->
Type() )
2969 if( line && isPoly )
2993 if( line && isPoly )
3028 auto vertexIdx = it.GetIndex();
3031 return std::make_pair(
true, vertexIdx );
3049 switch( item->
Type() )
3052 polyset =
static_cast<ZONE*
>( item )->Outline();
3057 polyset = &
static_cast<PCB_SHAPE*
>( item )->GetPolyShape();
3110 unsigned int nearestIdx = 0;
3111 unsigned int nextNearestIdx = 0;
3112 unsigned int nearestDist = INT_MAX;
3113 unsigned int firstPointInContour = 0;
3118 ZONE* zone =
static_cast<ZONE*
>( item );
3119 zoneOutline = zone->
Outline();
3138 for( ; iterator; iterator++, curr_idx++ )
3140 int jj = curr_idx+1;
3144 jj = firstPointInContour;
3145 firstPointInContour = curr_idx+1;
3148 SEG curr_segment( zoneOutline->
CVertex( curr_idx ), zoneOutline->
CVertex( jj ) );
3155 nearestIdx = curr_idx;
3156 nextNearestIdx = jj;
3163 SEG nearestSide( sideOrigin, sideEnd );
3168 if( nearestPoint == sideOrigin || nearestPoint == sideEnd )
3169 nearestPoint = ( sideOrigin + sideEnd ) / 2;
3171 zoneOutline->
InsertVertex( nextNearestIdx, nearestPoint );
3174 static_cast<ZONE*
>( item )->HatchBorder();
3176 commit.
Push(
_(
"Add Zone Corner" ) );
3178 else if( graphicItem )
3184 commit.
Modify( graphicItem );
3190 graphicItem->
SetEnd( nearestPoint );
3195 newSegment->
SetStart( nearestPoint );
3198 commit.
Add( newSegment );
3199 commit.
Push(
_(
"Split Segment" ) );
3204 commit.
Modify( graphicItem );
3210 graphicItem->
SetEnd( nearestPoint );
3219 commit.
Add( newArc );
3220 commit.
Push(
_(
"Split Arc" ) );
3248 ZONE* zone =
static_cast<ZONE*
>( item );
3269 const auto& vertexIdx = vertex.second;
3270 auto& outline = polygon->
Polygon( vertexIdx.m_polygon )[vertexIdx.m_contour];
3272 if( outline.PointCount() > 3 )
3281 if( vertexIdx.m_contour > 0 )
3297 commit.
Push(
_(
"Remove Zone Corner" ) );
3299 commit.
Push(
_(
"Remove Polygon Corner" ) );
3302 static_cast<ZONE*
>( item )->HatchBorder();
3325 ZONE* zone =
static_cast<ZONE*
>( item );
3346 unsigned int nearestIdx = 0;
3347 unsigned int nearestDist = INT_MAX;
3355 for( ; iterator; iterator++, curr_idx++ )
3362 nearestIdx = curr_idx;
3366 int prevIdx, nextIdx;
3374 setback = std::min( setback, (
int) ( segA.Length() * 0.25 ) );
3375 setback = std::min( setback, (
int) ( segB.Length() * 0.25 ) );
3379 std::optional<CHAMFER_RESULT> chamferResult =
ComputeChamferPoints( segA, segB, chamferParams );
3381 if( chamferResult && chamferResult->m_updated_seg_a && chamferResult->m_updated_seg_b )
3387 polygon->
InsertVertex( nearestIdx, chamferResult->m_updated_seg_b->B );
3388 polygon->
InsertVertex( nearestIdx, chamferResult->m_updated_seg_a->B );
3395 commit.
Push(
_(
"Break Zone Corner" ) );
3397 commit.
Push(
_(
"Break Polygon Corner" ) );
3400 static_cast<ZONE*
>( item )->HatchBorder();
ARC_EDIT_MODE
Settings for arc editing.
@ KEEP_CENTER_ADJUST_ANGLE_RADIUS
When editing endpoints, the angle and radius are adjusted.
constexpr EDA_IU_SCALE pcbIUScale
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.
virtual 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.
virtual 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 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
EDIT_CONSTRAINT that imposes a constraint that two points have to be located at angle of 45 degree mu...
EDIT_CONSTRAINT that imposes a constraint that a point has to be located at angle of 90 degree multip...
EDIT_CONSTRAINT for polygon line dragging.
POLYGON_LINE_MODE GetMode() const
Get the current constraint mode.
void SetMode(POLYGON_LINE_MODE aMode)
Set the constraint mode (allows switching between converging and fixed-length)
EDIT_CONSTRAINT that imposes a constraint that two points have to have the same Y coordinate.
EDIT_CONSTRAINT that imposes a constraint that a point has to lie on a line (determined by 2 points).
EDIT_CONSTRAINT for a EDIT_LINE, that constrains the line to move perpendicular to the line itself.
EDIT_CONSTRAINT that imposes a constraint that two points have to have the same X coordinate.
bool IsType(FRAME_T aType) 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 void SetParent(EDA_ITEM *aParent)
virtual EDA_ITEM * Clone() const
Create a duplicate of this item with linked list members set to NULL.
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
virtual VECTOR2I GetTopLeft() const
void SetCornerRadius(int aRadius)
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.
void SetStart(const VECTOR2I &aStart)
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
void SetEnd(const VECTOR2I &aEnd)
virtual void SetLeft(int val)
virtual void SetRight(int val)
int GetCornerRadius() const
VECTOR2I GetArcMid() const
EDA_TABLECELL_POINT_EDIT_BEHAVIOR(EDA_SHAPE &aCell)
Describe constraints between two edit handles.
Represent a line connecting two EDIT_POINTs.
void SetConstraint(EDIT_CONSTRAINT< EDIT_LINE > *aConstraint)
Set a constraint for and EDIT_POINT.
EDIT_CONSTRAINT< EDIT_LINE > * GetConstraint() const
Return the constraint imposed on an 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.
int GetY() const
Return Y coordinate of an EDIT_POINT.
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)
void SetConstraint(EDIT_CONSTRAINT< EDIT_POINT > *aConstraint)
Set a constraint for an EDIT_POINT.
int GetX() const
Return X coordinate of an EDIT_POINT.
void SetActive(bool aActive=true)
void SetDrawCircle(bool aDrawCircle=true)
static const TOOL_EVENT InhibitSelectionEditing
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 UninhibitSelectionEditing
Used to inform tool that it should display the disambiguation menu.
static const TOOL_EVENT PointSelectedEvent
static const TOOL_EVENT SelectedItemsMoved
Used to inform tools that the selection should temporarily be non-editable.
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.
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 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)
bool CanRemoveCorner(const SELECTION &aSelection)
Condition to display "Remove Corner" context menu entry.
void updateItem(BOARD_COMMIT &aCommit)
Update edit points with item's points.
VECTOR2I m_stickyDisplacement
int OnSelectionChange(const TOOL_EVENT &aEvent)
Change selection event handler.
void setAltConstraint(bool aEnabled)
Return a point that should be used as a constrainer for 45 degrees mode.
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
int modifiedSelection(const TOOL_EVENT &aEvent)
Change the edit method for arcs.
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.
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)
EDIT_POINT m_altConstrainer
ARC_EDIT_MODE m_arcEditMode
std::unique_ptr< KIGFX::PREVIEW::ANGLE_ITEM > m_angleItem
EDIT_POINT * m_editedPoint
void updateEditedPoint(const TOOL_EVENT &aEvent)
Set the current point being edited. NULL means none.
std::shared_ptr< EDIT_CONSTRAINT< EDIT_POINT > > m_altConstraint
int getEditedPointIndex() const
Return true if aPoint is the currently modified point.
void updatePoints()
Update which point is being edited.
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)
Update item's points with edit points.
PCB_SELECTION_TOOL * m_selectionTool
Object to handle a bitmap image that can be inserted in a PCB.
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
bool IsProxyItem() const override
void Move(const VECTOR2I &aMoveVector) override
Move this object.
PCB_TABLECELL_POINT_EDIT_BEHAVIOR(PCB_TABLECELL &aCell)
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.
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)
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
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 })
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)
static void UpdateItem(PCB_SHAPE &aRectangle, const EDIT_POINT &aEditedPoint, 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.
REFERENCE_IMAGE_POINT_EDIT_BEHAVIOR(PCB_REFERENCE_IMAGE &aRefImage)
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
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.
PCB_REFERENCE_IMAGE & m_refImage
A REFERENCE_IMAGE is a wrapper around a BITMAP_IMAGE that is displayed in an editor as a reference fo...
void SetTransformOriginOffset(const VECTOR2I &aCenter)
VECTOR2I GetTransformOriginOffset() const
Get the center of scaling, etc, relative to the image center (GetPosition()).
VECTOR2I GetPosition() const
double GetImageScale() const
void SetImageScale(double aScale)
Set the image "zoom" value.
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
SHAPE_GROUP_POINT_EDIT_BEHAVIOR(PCB_GROUP &aGroup)
SHAPE_GROUP_POINT_EDIT_BEHAVIOR(std::vector< PCB_SHAPE * > aShapes, BOARD_ITEM *aParent)
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.
bool UpdatePoints(EDIT_POINTS &aPoints) override
Update the list of the edit points for the item.
BOX2I getBoundingBox() const
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.
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.
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
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.
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.
#define IS_MOVING
Item being moved.
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
POLYGON_LINE_MODE
Mode for polygon line edge constraints.
@ CONVERGING
Adjacent lines converge/diverge, dragged line length changes.
@ FIXED_LENGTH
Dragged line maintains its length, adjacent lines adjust angles.
a few functions useful in geometry calculations.
VECTOR2< ret_type > GetClampedCoords(const VECTOR2< in_type > &aCoords, pad_type aPadding=1u)
Clamps a vector to values that can be negated, respecting numeric limits of coordinates data type wit...
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.
@ 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::pair< bool, SHAPE_POLY_SET::VERTEX_INDEX > findVertex(SHAPE_POLY_SET &aPolySet, const EDIT_POINT &aPoint)
static std::vector< VECTOR2I > getConstraintDirections(EDIT_CONSTRAINT< EDIT_POINT > *aConstraint)
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.
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_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
constexpr int sign(T val)
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D
Supplemental functions for working with vectors and simple objects that interact with vectors.