27#include <unordered_set>
72std::optional<INTERSECTABLE_GEOM> GetBoardIntersectable(
const BOARD_ITEM& aItem )
74 switch( aItem.
Type() )
126std::optional<int64_t> FindSquareDistanceToItem(
const BOARD_ITEM& item,
const VECTOR2I& aPos )
128 std::optional<INTERSECTABLE_GEOM> intersectable = GetBoardIntersectable( item );
129 std::optional<NEARABLE_GEOM> nearable;
135 [&](
const auto& geom )
217 auto constructionItemsBatch = std::make_unique<CONSTRUCTION_MANAGER::CONSTRUCTION_ITEM_BATCH>();
219 std::vector<VECTOR2I> referenceOnlyPoints;
223 std::vector<KIGFX::CONSTRUCTION_GEOM::DRAWABLE> constructionDrawables;
225 switch( item->
Type() )
235 if( !aExtensionOnly )
251 constructionDrawables.emplace_back( shape.
GetStart() );
252 constructionDrawables.emplace_back( shape.
GetEnd() );
255 referenceOnlyPoints.emplace_back( shape.
GetStart() );
256 referenceOnlyPoints.emplace_back( shape.
GetEnd() );
262 if( !aExtensionOnly )
273 constructionDrawables.push_back( shape.
GetCenter() );
279 constructionDrawables.emplace_back( shape.
GetStart() );
280 constructionDrawables.emplace_back( shape.
GetEnd() );
283 referenceOnlyPoints.emplace_back( shape.
GetStart() );
284 referenceOnlyPoints.emplace_back( shape.
GetEnd() );
292 constructionDrawables.push_back( shape.
GetCenter() );
312 constructionDrawables.push_back( refImg.
GetPosition() );
318 constructionDrawables.push_back( seg );
332 std::vector<CONSTRUCTION_MANAGER::CONSTRUCTION_ITEM::DRAWABLE_ENTRY> drawableEntries;
333 drawableEntries.reserve( constructionDrawables.size() );
334 for(
auto& drawable : constructionDrawables )
336 drawableEntries.emplace_back(
343 std::move( drawableEntries ),
347 if( referenceOnlyPoints.size() )
358 const int c_gridSnapEpsilon_sq = 4;
365 std::vector<VECTOR2I> points;
367 const SEG testSegments[] = {
SEG( aligned, aligned +
VECTOR2( 1, 0 ) ),
372 for(
const SEG& seg : testSegments )
377 points.push_back( *vec );
384 for(
const VECTOR2I& pt : { aSeg.
A, aSeg.
B } )
386 SEG::ecoord d_sq = ( pt - aPoint ).SquaredEuclideanNorm();
388 if( d_sq < min_d_sq )
398 SEG::ecoord d_sq = ( pt - aligned ).SquaredEuclideanNorm();
400 if( d_sq < min_d_sq )
418 std::vector<VECTOR2I> points;
431 SEG::ecoord d_sq = ( pt - aPoint ).SquaredEuclideanNorm();
433 if( d_sq < min_d_sq )
443 SEG::ecoord d_sq = ( pt - aligned ).SquaredEuclideanNorm();
445 if( d_sq < min_d_sq )
458 wxLogTrace(
traceSnap,
"SnapToPad: mouse pos (%d, %d), pads count: %zu", aMousePos.
x, aMousePos.
y, aPads.size() );
463 if( item->
HitTest( aMousePos ) )
467 double minDist = std::numeric_limits<double>::max();
468 ANCHOR* nearestOrigin =
nullptr;
475 double dist = a.Distance( aMousePos );
484 return nearestOrigin ? nearestOrigin->
pos : aMousePos;
520 return static_cast<const FOOTPRINT&
>( aItem ).GetBoundingBox(
false );
551 settings = cfg->m_SnapInference;
555 settings = cfg->m_SnapInference;
561 settings = cfg->m_SnapInference;
572 wxLogTrace(
traceSnap,
"BestDragOrigin: mouse pos (%d, %d), items count: %zu", aMousePos.
x, aMousePos.
y,
576 computeAnchors( aItems, aMousePos,
true, aSelectionFilter,
nullptr,
true );
578 double lineSnapMinCornerDistance =
m_toolMgr->GetView()->ToWorld( 50 );
584 double minDist = std::numeric_limits<double>::max();
588 minDist = nearestOrigin->
Distance( aMousePos );
589 best = nearestOrigin;
591 wxLogTrace(
traceSnap,
" nearest origin winning at (%d, %d), distance=%f", nearestOrigin->
pos.
x,
592 nearestOrigin->
pos.
y, minDist );
597 double dist = nearestCorner->
Distance( aMousePos );
602 best = nearestCorner;
604 wxLogTrace(
traceSnap,
" nearest corner winning at (%d, %d), distance=%f", nearestCorner->
pos.
x,
605 nearestCorner->
pos.
y, dist );
611 double dist = nearestOutline->
Distance( aMousePos );
613 if( minDist > lineSnapMinCornerDistance && dist < minDist )
615 best = nearestOutline;
617 wxLogTrace(
traceSnap,
" nearest outline winning at (%d, %d), distance=%f", nearestOutline->
pos.
x,
618 nearestOutline->
pos.
y, dist );
626 std::optional<BOX2I> movingBounds;
640 && std::any_of( best->
items.begin(), best->
items.end(),
643 return aItem && aItem->Type() == PCB_PAD_T;
653 wxLogTrace(
traceSnap,
" have best: %s, returning (%d, %d)", best ?
"yes" :
"no", ret.
x, ret.
y );
661 std::vector<BOARD_ITEM*> item;
666 item.push_back( aReferenceItem );
671 layers =
LSET( { frame->GetActiveLayer() } );
678 return ResolveSnap( aOrigin, layers, aGrid, item );
683 const std::vector<BOARD_ITEM*>& aSkip,
684 std::optional<VECTOR2I> aMovingReferencePoint )
686 wxLogTrace(
traceSnap,
"ResolveSnap: origin (%d, %d), enableSnap=%d, enableGrid=%d, enableSnapLine=%d", aOrigin.
x,
690 const double snapScale = ranges.
scale;
691 const int snapRange = ranges.
range;
695 const bool constructionEnabled =
698 if( !constructionEnabled )
702 const BOX2I visibilityHorizon =
707 const std::vector<BOARD_ITEM*> visibleItems =
queryVisible( { visibilityHorizon }, aSkip );
708 computeAnchors( visibleItems, aOrigin,
false,
nullptr, &aLayers,
false );
731 if( aSkip.size() == 1 && aSkip.front() )
735 std::optional<std::pair<VECTOR2I, VECTOR2I>> endpoints;
756 endpoints->first.SquaredDistance( aOrigin ) > endpoints->second.SquaredDistance( aOrigin )
766 const bool geometryEnabled =
780 if( inferenceEnabled )
782 const auto eligibleInferenceTarget = [&](
BOARD_ITEM* aItem )
789 switch( aItem->
Type() )
802 if( !eligibleInferenceTarget( item ) )
805 if( !geometryEnabled )
808 std::optional<INTERSECTABLE_GEOM> geometry = GetBoardIntersectable( *item );
814 static_cast<int>( item->
Type() ), 0 },
815 std::move( *geometry ),
821 std::vector<BOARD_ITEM*> layoutItems;
830 BOX2I verticalStrip =
833 BOX2I horizontalStrip =
836 verticalStrip = verticalStrip.
Intersect( viewport );
837 horizontalStrip = horizontalStrip.
Intersect( viewport );
838 std::vector<BOARD_ITEM*> visibleLayoutItems =
queryVisible( { verticalStrip, horizontalStrip }, aSkip );
846 if( footprint && !insideFootprint )
847 layoutItems.push_back( footprint );
849 layoutItems.push_back( item );
852 std::sort( layoutItems.begin(), layoutItems.end(), std::less<>() );
853 layoutItems.erase( std::unique( layoutItems.begin(), layoutItems.end() ), layoutItems.end() );
857 std::unordered_set<BOARD_ITEM*> moving( aSkip.begin(), aSkip.end() );
864 moving.insert( parent );
872 if( !eligibleInferenceTarget( item ) || moving.count( item ) )
875 std::optional<SNAP_TARGET_ID> parent;
881 static_cast<int>( item->
Type() ), 0 },
883 std::move( parent ) } );
886 size_t padCenters = 0;
888 const auto addPadCenter = [&](
PAD* aPad )
890 if( !eligibleInferenceTarget( aPad ) || moving.count( aPad ) )
893 std::optional<SNAP_TARGET_ID> parent;
900 std::move( parent ) } );
908 addPadCenter(
static_cast<PAD*
>( item ) );
917 wxLogTrace( wxT(
"KICAD_SNAP_RESOLVER" ),
"layout targets=%zu pad-centers=%zu", layoutItems.size(),
922 enum class PRESENTATION_KIND
931 PRESENTATION_KIND kind;
932 std::optional<ANCHOR>
anchor;
933 bool proposeConstruction =
false;
947 frame.
candidates.push_back( std::move( candidate ) );
953 frame.
candidates.push_back( std::move( candidate ) );
958 std::vector<SNAP_CANDIDATE> alignment = inferenceProvider.
CollectAlignment( context, snapRange );
959 std::vector<SNAP_CANDIDATE> spacing = inferenceProvider.
CollectEqualSpacing( context, snapRange );
961 wxLogTrace( wxT(
"KICAD_SNAP_RESOLVER" ),
"layout candidates alignment=%zu spacing=%zu", alignment.size(),
965 frame.
candidates.push_back( std::move( candidate ) );
968 frame.
candidates.push_back( std::move( candidate ) );
973 const int snapIn = ranges.
in;
974 const int snapOut = ranges.
out;
976 wxLogTrace(
traceSnap,
" snapRange=%d, snapIn=%d, snapOut=%d", snapRange, snapIn, snapOut );
977 wxLogTrace(
traceSnap,
" visibleItems count=%zu, anchors count=%zu", visibleItems.size(),
m_anchors.size() );
978 wxLogTrace(
traceSnap,
" nearest anchor: %s at (%d, %d), distance=%f", nearest ?
"found" :
"none",
979 nearest ? nearest->
pos.
x : 0, nearest ? nearest->
pos.
y : 0,
980 nearest ? nearest->
Distance( aOrigin ) : -1.0 );
981 wxLogTrace(
traceSnap,
" nearestGrid: (%d, %d)", nearestGrid.
x, nearestGrid.
y );
988 ad->AddAnchor(
anchor.pos );
990 ad->SetNearest( nearest ?
OPT_VECTOR2I{ nearest->
pos } : std::nullopt );
995 std::optional<int> snapDist;
998 snapDist = nearest->
Distance( aOrigin );
1002 int existingDist =
m_snapItem->Distance( aOrigin );
1003 if( !snapDist || existingDist < *snapDist )
1004 snapDist = existingDist;
1007 wxLogTrace(
traceSnap,
" snapDist: %s (value=%d)", snapDist ?
"set" :
"none", snapDist ? *snapDist : -1 );
1015 const auto ptIsReferenceOnly = [&](
const VECTOR2I& aPt )
1018 return std::find( referenceOnlyPoints.begin(), referenceOnlyPoints.end(), aPt ) != referenceOnlyPoints.end();
1021 const auto proposeConstructionForItems = [&](
const std::vector<EDA_ITEM*>& aItems )
1025 std::vector<BOARD_ITEM*> items;
1041 items.push_back( boardItem );
1047 if( constructionEnabled )
1051 const auto anchorId = [&](
const ANCHOR& aAnchor )
1053 std::vector<SNAP_TARGET_ID> targets;
1055 for(
const EDA_ITEM* item : aAnchor.items )
1065 if( targets.empty() )
1068 targets.push_back( pointId.
target );
1072 const auto addAnchorCandidate = [&](
const ANCHOR& aAnchor,
bool aRetained )
1088 aAnchor.
pos, aAnchor.
Distance( aOrigin ) / snapScale ) );
1090 id, PRESENTATION{ PRESENTATION_KIND::ANCHOR_MARKER, aAnchor, !aRetained && !constructed } );
1097 const bool nearestCaptured = nearest && nearest->
Distance( aOrigin ) <= snapIn;
1098 bool keepConstructionProposal =
false;
1099 bool allowHoverActivation =
false;
1103 wxLogTrace(
traceSnap,
" Snap enabled, checking snap options..." );
1104 allowHoverActivation = !nearestCaptured;
1108 wxLogTrace(
traceSnap,
" Checking snap lines..." );
1113 if( !snapLineSnap && constructionEnabled )
1115 std::optional<VECTOR2I> constructionSnap =
1118 if( constructionSnap )
1119 snapLineSnap = *constructionSnap;
1122 if( snapLineSnap &&
m_skipPoint != *snapLineSnap )
1124 wxLogTrace(
traceSnap,
" Snap line found at (%d, %d)", snapLineSnap->x, snapLineSnap->y );
1126 if( !nearestCaptured )
1128 if( !ptIsReferenceOnly( *snapLineSnap ) )
1133 *snapLineSnap, snapLineSnap->Distance( aOrigin ) / snapScale ) );
1134 frame.
presentation.emplace(
id, PRESENTATION{ PRESENTATION_KIND::GUIDE, std::nullopt,
false } );
1138 wxLogTrace(
traceSnap,
" Snap line point is reference-only, continuing..." );
1139 keepConstructionProposal =
true;
1149 wxLogTrace(
traceSnap,
" Checking existing m_snapItem, dist=%d (snapOut=%d)", dist, snapOut );
1151 if( dist <= snapOut && !ptIsReferenceOnly(
m_snapItem->pos ) )
1153 if( nearest && ptIsReferenceOnly( nearest->
pos ) && nearest->
Distance( aOrigin ) <= snapRange )
1160 if( nearestCaptured )
1162 wxLogTrace(
traceSnap,
" Nearest anchor within snapIn range" );
1164 if( ptIsReferenceOnly( nearest->
pos ) )
1166 wxLogTrace(
traceSnap,
" Nearest anchor is reference-only, setting snap line origin" );
1168 keepConstructionProposal =
true;
1172 addAnchorCandidate( *nearest,
false );
1178 wxLogTrace(
traceSnap,
" Grid disabled, checking point-on-element snap..." );
1182 if( nearestPointOnAnElement && nearestPointOnAnElement->Distance( aOrigin ) <= snapRange )
1187 *nearestPointOnAnElement, nearestPointOnAnElement->Distance( aOrigin ) / snapScale ) );
1189 PRESENTATION{ PRESENTATION_KIND::POINT_ON_ELEMENT, std::nullopt,
false } );
1204 bool suppressHoverActivation =
false;
1208 const PRESENTATION& presentation = output.
presentation->payload;
1209 keepConstructionProposal =
true;
1211 if( presentation.kind == PRESENTATION_KIND::ANCHOR_MARKER && presentation.anchor )
1213 suppressHoverActivation =
true;
1218 if( presentation.proposeConstruction )
1219 proposeConstructionForItems(
m_snapItem->items );
1221 else if( presentation.kind == PRESENTATION_KIND::GUIDE )
1223 suppressHoverActivation =
true;
1228 else if( presentation.kind == PRESENTATION_KIND::POINT_ON_ELEMENT )
1242 if( constructionEnabled && canActivateByHitTest && allowHoverActivation && !suppressHoverActivation )
1246 if( item->
HitTest( aOrigin, 0 ) )
1248 proposeConstructionForItems( { item } );
1249 keepConstructionProposal =
true;
1255 if( !keepConstructionProposal )
1291 switch( aItem->
Type() )
1328 if( !
grid.overrides_enabled )
1334 if(
grid.override_connected )
1335 idx =
grid.override_connected_idx;
1340 if(
grid.override_wires )
1341 idx =
grid.override_wires_idx;
1346 if(
grid.override_vias )
1347 idx =
grid.override_vias_idx;
1352 if(
grid.override_text )
1353 idx =
grid.override_text_idx;
1358 if(
grid.override_graphics )
1359 idx =
grid.override_graphics_idx;
1367 if( idx >= 0 && idx < (
int)
grid.grids.size() )
1375 const std::vector<BOARD_ITEM*>& aSkip )
const
1377 std::vector<BOARD_ITEM*> items;
1378 std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> visibleItems;
1386 for(
const BOX2I& area : aAreas )
1388 if( area.GetWidth() > 0 && area.GetHeight() > 0 )
1389 view->
Query( area, visibleItems );
1392 for(
const auto& [viewItem, layer] : visibleItems )
1394 if( !viewItem->IsBOARD_ITEM() )
1399 if( inFootprintEditor )
1410 if(
IsPcbLayer( layer ) && parentFP->GetPrivateLayers().test( layer ) )
1416 if( view->
IsVisible( boardItem ) && ( !isHighContrast || activeLayers.count( layer ) )
1419 items.push_back( boardItem );
1423 std::sort( items.begin(), items.end(), std::less<>() );
1424 items.erase( std::unique( items.begin(), items.end() ), items.end() );
1426 std::unordered_set<BOARD_ITEM*> skippedItems;
1433 skippedItems.insert( item );
1437 skippedItems.insert( aChild );
1442 items.erase( std::remove_if( items.begin(), items.end(),
1445 return skippedItems.contains( aItem );
1471 std::vector<PCB_INTERSECTABLE> intersectables;
1472 intersectables.reserve( aItems.size() );
1476 const bool computeIntersections = !aForDrag;
1477 const bool computePointsOnElements = !aForDrag;
1478 const bool excludeGraphics = aSelectionFilter && !aSelectionFilter->
graphics;
1479 const bool excludeTracks = aSelectionFilter && !aSelectionFilter->
tracks;
1481 const auto itemIsSnappable =
1491 const auto processItem =
1495 if( !itemIsSnappable( item ) )
1503 if( computeIntersections || computePointsOnElements )
1505 std::optional<INTERSECTABLE_GEOM> intersectableGeom;
1507 if( !excludeGraphics
1510 intersectableGeom = GetBoardIntersectable( item );
1514 intersectableGeom = GetBoardIntersectable( item );
1517 if( intersectableGeom )
1518 intersectables.emplace_back( &item, *intersectableGeom );
1524 processItem( *item );
1536 [&](
const auto& visited )
1538 using ItemType = std::decay_t<
decltype( visited )>;
1540 if constexpr( std::is_same_v<ItemType, LINE>
1541 || std::is_same_v<ItemType, CIRCLE>
1542 || std::is_same_v<ItemType, HALF_LINE>
1543 || std::is_same_v<ItemType, SHAPE_ARC> )
1545 intersectables.emplace_back( involvedItem, visited );
1547 else if constexpr( std::is_same_v<ItemType, VECTOR2I> )
1563 if( computeIntersections )
1565 for( std::size_t ii = 0; ii < intersectables.size(); ++ii )
1569 for( std::size_t jj = ii + 1; jj < intersectables.size(); ++jj )
1575 if( intersectableA.
Item == intersectableB.
Item )
1578 std::vector<VECTOR2I> intersections;
1581 std::visit( visitor, intersectableB.
Geometry );
1584 for(
const VECTOR2I& intersection : intersections )
1586 std::vector<EDA_ITEM*> items = {
1587 intersectableA.
Item,
1588 intersectableB.
Item,
1601 if( computePointsOnElements )
1608 [&](
const auto& geom )
1613 intersectable.Geometry );
1625 switch( aPadStack.
Mode() )
1635 switch( aPadstackUniqueLayer )
1640 return aPadstackUniqueLayer == aRealLayer;
1645 wxFAIL_MSG( wxString::Format(
"Unexpected padstack unique layer %d in FRONT_INNER_BACK mode",
1646 aPadstackUniqueLayer ) );
1654 return aRealLayer == aPadstackUniqueLayer;
1665 std::vector<ANCHOR_SPEC> anchors;
1690 const auto checkVisibility =
1697 bool onActiveLayer = !isHighContrast;
1698 bool isLODVisible =
false;
1702 if( !onActiveLayer && activeLayers.count( layer ) )
1703 onActiveLayer =
true;
1706 isLODVisible =
true;
1708 if( onActiveLayer && isLODVisible )
1721 auto handlePadShape =
1760 trap_delta = aPad->
GetDelta( aLayer ) / 2;
1764 corners.
Append( -half_size.
x - trap_delta.
y, half_size.
y + trap_delta.
x );
1765 corners.
Append( half_size.
x + trap_delta.
y, half_size.
y - trap_delta.
x );
1766 corners.
Append( half_size.
x - trap_delta.
y, -half_size.
y + trap_delta.
x );
1767 corners.
Append( -half_size.
x + trap_delta.
y, -half_size.
y - trap_delta.
x );
1790 if( !outline->IsEmpty() )
1792 for(
const VECTOR2I& pt : outline->Outline( 0 ).CPoints() )
1806 std::vector<TYPED_POINT2I> snap_pts;
1808 if( hole_size.
x == hole_size.
y )
1831 const auto addRectPoints =
1838 const SEG second( topRight, aBox.
GetEnd() );
1839 const SEG third( aBox.
GetEnd(), bottomLeft );
1856 const auto handleShape =
1866 const int r = ( start -
end ).EuclideanNorm();
1946 switch( aItem->
Type() )
1951 bool footprintVisible = checkVisibility( footprint );
1957 if( aSelectionFilter && !aSelectionFilter->
pads )
1966 if( !checkVisibility(
pad ) )
1969 if( !
pad->GetBoundingBox().Contains( aRefPos ) )
1972 pad->Padstack().ForEachUniqueLayer(
1977 activeHighContrastPrimaryLayer ) )
1979 handlePadShape(
pad, aLayer );
1987 if( aSelectionFilter && !aSelectionFilter->
points )
1990 if( !checkVisibility( pt ) )
2001 if( !footprintVisible && !aFrom )
2004 if( aFrom && aSelectionFilter && !aSelectionFilter->
footprints )
2023 if( (
center - position ).SquaredEuclideanNorm() >
grid.SquaredEuclideanNorm() )
2032 if( aSelectionFilter && !aSelectionFilter->
pads )
2041 if( checkVisibility( aItem ) )
2045 pad->Padstack().ForEachUniqueLayer(
2050 activeHighContrastPrimaryLayer ) )
2052 handlePadShape(
pad, aLayer );
2062 if( aSelectionFilter && !aSelectionFilter->
text )
2071 if( checkVisibility( aItem ) )
2072 handleShape(
static_cast<PCB_SHAPE*
>( aItem ) );
2079 if( aSelectionFilter && !aSelectionFilter->
text )
2088 if( checkVisibility( aItem ) )
2093 VECTOR2I topLeft =
table->GetCell( 0, 0 )->GetCornersInSequence( drawAngle )[0];
2095 table->GetCell(
table->GetRowCount() - 1, 0 )->GetCornersInSequence( drawAngle )[3];
2096 VECTOR2I topRight =
table->GetCell( 0,
table->GetColCount() - 1 )->GetCornersInSequence( drawAngle )[1];
2098 ->GetCornersInSequence( drawAngle )[2];
2113 if( aSelectionFilter && !aSelectionFilter->
graphics )
2122 if( checkVisibility( aItem ) )
2123 handleShape(
static_cast<PCB_SHAPE*
>( aItem ) );
2131 if( aSelectionFilter && !aSelectionFilter->
tracks )
2140 if( checkVisibility( aItem ) )
2152 addAnchor( spec.pos, spec.flags, arc, spec.pointType );
2168 if( aSelectionFilter && !aSelectionFilter->
points )
2171 if( checkVisibility( aItem ) )
2179 if( aSelectionFilter && !aSelectionFilter->
vias )
2188 if( checkVisibility( aItem ) )
2194 if( aFrom && aSelectionFilter && !aSelectionFilter->
zones )
2197 if( checkVisibility( aItem ) )
2217 if( aFrom && aSelectionFilter && !aSelectionFilter->
dimensions )
2220 if( checkVisibility( aItem ) )
2232 if( aFrom && aSelectionFilter && !aSelectionFilter->
dimensions )
2235 if( checkVisibility( aItem ) )
2244 for(
int i = 0; i < 2; i++ )
2254 if( aFrom && aSelectionFilter && !aSelectionFilter->
dimensions )
2257 if( checkVisibility( aItem ) )
2269 if( aFrom && aSelectionFilter && !aSelectionFilter->
dimensions )
2272 if( checkVisibility( aItem ) )
2284 if( aFrom && aSelectionFilter && !aSelectionFilter->
text )
2287 if( checkVisibility( aItem ) )
2293 if( aFrom && aSelectionFilter && !aSelectionFilter->
otherItems )
2296 if( checkVisibility( aItem ) )
2302 addRectPoints( bbox, *barcode );
2310 if( checkVisibility( item ) )
2317 if( aFrom && aSelectionFilter && !aSelectionFilter->
graphics )
2320 if( checkVisibility( aItem ) )
2326 addRectPoints( bbox, *
image );
2348 ecoord minDist = std::numeric_limits<ecoord>::max();
2349 std::vector<ANCHOR*> anchorsAtMinDistance;
2355 if( ( aFlags &
anchor.flags ) != aFlags )
2358 if( !anchorsAtMinDistance.empty() &&
anchor.pos == anchorsAtMinDistance.front()->pos )
2361 anchorsAtMinDistance.push_back( &
anchor );
2365 const double dist =
anchor.pos.SquaredDistance( aPos );
2367 if( dist < minDist )
2371 anchorsAtMinDistance.clear();
2372 anchorsAtMinDistance.push_back( &
anchor );
2386 auto noRealItemsInAnchorAreInvolved =
2387 [&](
ANCHOR* aAnchor ) ->
bool
2392 if( !haveExtensions )
2400 if( !anchorIsConstructed )
2404 return !allRealAreInvolved;
2408 std::erase_if( anchorsAtMinDistance, noRealItemsInAnchorAreInvolved );
2415 ecoord minDistToItem = std::numeric_limits<ecoord>::max();
2421 ecoord distToNearestItem = std::numeric_limits<ecoord>::max();
2428 std::optional<ecoord> distToThisItem =
2429 FindSquareDistanceToItem(
static_cast<const BOARD_ITEM&
>( *item ), aPos );
2431 if( distToThisItem )
2432 distToNearestItem = std::min( distToNearestItem, *distToThisItem );
2437 distToNearestItem = std::min( distToNearestItem, minDist );
2439 if( distToNearestItem < minDistToItem )
2441 minDistToItem = distToNearestItem;
constexpr EDA_IU_SCALE pcbIUScale
constexpr BOX2I BOX2ISafe(const BOX2D &aInput)
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
virtual VECTOR2I GetCenter() const
This defaults to the center of the bounding box if not overridden.
FOOTPRINT * GetParentFootprint() const
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
virtual void RunOnChildren(const std::function< void(BOARD_ITEM *)> &aFunction, RECURSE_MODE aMode) const
Invoke a function on all children.
BOARD_ITEM_CONTAINER * GetParent() const
Information pertinent to a Pcbnew printed circuit board.
bool IsFootprintHolder() const
Find out if the board is being used to hold a single footprint for editing/viewing.
void AddListener(BOARD_LISTENER *aListener)
Add a listener to the board to receive calls whenever something on the board has been modified.
void RemoveListener(BOARD_LISTENER *aListener)
Remove the specified listener.
constexpr BOX2< Vec > Intersect(const BOX2< Vec > &aRect)
static constexpr BOX2< VECTOR2I > ByCorners(const VECTOR2I &aCorner1, const VECTOR2I &aCorner2)
constexpr const Vec GetEnd() const
constexpr size_type GetWidth() const
constexpr Vec Centre() const
constexpr const Vec GetCenter() const
constexpr size_type GetHeight() const
constexpr coord_type GetLeft() const
constexpr const Vec & GetOrigin() const
constexpr coord_type GetRight() const
constexpr coord_type GetTop() const
constexpr void Offset(coord_type dx, coord_type dy)
constexpr coord_type GetBottom() const
Represent basic circle geometry with utility geometry functions.
void ProposeConstructionItems(std::unique_ptr< CONSTRUCTION_ITEM_BATCH > aBatch, bool aIsPersistent)
Add a batch of construction items to the helper.
void CancelProposal()
Cancel outstanding proposals for new geometry.
void Clear()
Clear all construction items.
std::vector< CONSTRUCTION_ITEM > CONSTRUCTION_ITEM_BATCH
bool InvolvesAllGivenRealItems(const std::vector< EDA_ITEM * > &aItems) const
Check if all 'real' (non-null = constructed) the items in the batch are in the list of items currentl...
A base class for most all the KiCad significant classes used in schematics and boards.
virtual VECTOR2I GetPosition() const
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
KICAD_T Type() const
Returns the type of object.
virtual bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const
Test if aPosition is inside or on the boundary of this item.
int GetEllipseMinorRadius() const
const VECTOR2I & GetEllipseCenter() const
int GetEllipseMajorRadius() const
std::vector< VECTOR2I > GetPolyPoints() const
Duplicate the polygon outlines into a flat list of VECTOR2I points.
EDA_ANGLE GetEllipseRotation() const
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
VECTOR2I GetArcMid() const
void retainAcceptedSnaps(const SNAP_RESULT &aResult)
Record which snaps the resolver accepted so they can be re-biased on the next resolve,...
std::optional< VECTOR2I > SnapToConstructionLines(const VECTOR2I &aPoint, const VECTOR2I &aNearestGrid, const VECTOR2D &aGrid, double aSnapRange) const
void addAnchor(const VECTOR2I &aPos, int aFlags, EDA_ITEM *aItem, int aPointTypes=POINT_TYPE::PT_NONE)
SNAP_MANAGER & getSnapManager()
SNAP_RANGES computeSnapRanges(bool aClampToVisibleGrid) const
Compute the snap thresholds.
void emitAngleBranchCandidates(std::vector< SNAP_CANDIDATE > &aCandidates, const VECTOR2I &aOrigin, double aSnapScale) const
Emit the angle-restriction snap candidates (the two branches bracketing the cursor angle) into the cu...
void showConstructionGeometry(bool aShow)
SNAP_RESOLVER::FEASIBILITY_CALLBACK m_feasibilityCallback
std::vector< SEG > m_stationarySelfSegments
SNAP_RESOLVER::TRACE_CALLBACK snapTraceCallback(const SNAP_SOURCE_CONTEXT &aContext) const
VECTOR2I GetOrigin() const
std::optional< SNAP_STABLE_ID > m_retainedAngleBranch
std::optional< ANCHOR > m_snapItem
SNAP_REFERENCE_PREFERENCE m_layoutReferencePreference
KIGFX::ANCHOR_DEBUG * enableAndGetAnchorDebug()
Enable the anchor debug if permitted and return it.
KIGFX::SNAP_INDICATOR m_viewSnapPoint
void updateSnapPoint(const TYPED_POINT2I &aPoint)
KIGFX::ORIGIN_VIEWITEM m_viewAxis
std::vector< SNAP_STABLE_ID > m_stickySnapIds
void setLayoutReference(const VECTOR2I &aPoint, const std::optional< BOX2I > &aBounds, bool aAnchorPoint)
Record the classified drag reference and trace it.
void emitSelfAndGridCandidates(std::vector< SNAP_CANDIDATE > &aCandidates, const SNAP_SOURCE_CONTEXT &aContext, const VECTOR2I &aOrigin, const VECTOR2I &aNearestGrid, double aSnapScale, int aSnapRange, bool aUseGrid) const
Emit the point editor's unchanged self-geometry and the independent grid axes.
void applySnapResultGuides(const SNAP_RESULT &aResult)
std::vector< ANCHOR > m_anchors
View item to draw debug items for anchors.
A color representation with 4 components: red, green, blue, alpha.
COLOR4D WithAlpha(double aAlpha) const
Return a color with the same color, but the given alpha.
COLOR4D Brightened(double aFactor) const
Return a color that is brighter by a given factor, without modifying object.
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
const std::set< int > GetHighContrastLayers() const
Returns the set of currently high-contrast layers.
PCB_LAYER_ID GetPrimaryHighContrastLayer() const
Return the board layer which is in high-contrast mode.
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
bool GetHighContrast() const
bool IsBOARD_ITEM() const
virtual double ViewGetLOD(int aLayer, const VIEW *aView) const
Return the level of detail (LOD) of the item.
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.
int Query(const BOX2I &aRect, std::vector< LAYER_ITEM_PAIR > &aResult) const
Find all visible items that touch or are within the rectangle aRect.
bool IsLayerVisible(int aLayer) const
Return information about visibility of a particular layer.
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
bool IsVisible(const VIEW_ITEM *aItem) const
Return information if the item is visible (or not).
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Set the item visibility.
LSET is a set of PCB_LAYER_IDs.
static const LSET & AllLayersMask()
A PADSTACK defines the characteristics of a single or multi-layer pad, in the IPC sense of the word.
@ NORMAL
Shape is the same on all layers.
@ CUSTOM
Shapes can be defined on arbitrary layers.
@ FRONT_INNER_BACK
Up to three shapes can be defined (F_Cu, inner copper layers, B_Cu)
static constexpr PCB_LAYER_ID INNER_LAYERS
! The layer identifier to use for "inner layers" on top/inner/bottom padstacks
const VECTOR2I & GetDelta(PCB_LAYER_ID aLayer) const
VECTOR2I GetPosition() const override
VECTOR2I GetDrillSize() const
PAD_SHAPE GetShape(PCB_LAYER_ID aLayer) const
VECTOR2I GetSize(PCB_LAYER_ID aLayer) const
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
const std::shared_ptr< SHAPE_POLY_SET > & GetEffectivePolygon(PCB_LAYER_ID aLayer, ERROR_LOC aErrorLoc=ERROR_INSIDE) const
bool HasHole() const override
VECTOR2I ShapePos(PCB_LAYER_ID aLayer) const
const VECTOR2I & GetMid() const
virtual VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
const SHAPE_POLY_SET & GetSymbolPoly() const
Access the cached polygon for the barcode symbol only (no text, no margins/knockout).
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
PCB_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
virtual VECTOR2I GetEnd() const
virtual VECTOR2I GetStart() const
The dimension's origin is the first feature point for the dimension.
For better understanding of the points that make a dimension:
const VECTOR2I & GetCrossbarStart() const
const VECTOR2I & GetCrossbarEnd() const
Mark the center of a circle or arc with a cross shape.
A leader is a dimension-like object pointing to a specific point.
A radial dimension indicates either the radius or diameter of an arc or circle.
std::vector< NEARABLE_GEOM > m_pointOnLineCandidates
void OnBoardItemRemoved(BOARD &aBoard, BOARD_ITEM *aRemovedItem) override
std::vector< BOARD_ITEM * > queryVisible(std::initializer_list< BOX2I > aAreas, const std::vector< BOARD_ITEM * > &aSkip) const
static std::vector< ANCHOR_SPEC > GetArcAnchors(const PCB_ARC &aArc, bool aFrom)
Return the snap/drag anchor points that a track arc contributes.
SNAP_RESULT ResolveSnap(const VECTOR2I &aOrigin, BOARD_ITEM *aReferenceItem, GRID_HELPER_GRIDS aGrid=GRID_HELPER_GRIDS::GRID_CURRENT)
Chooses the "best" snap anchor around the given point, optionally taking layers from the reference it...
SNAP_INFERENCE_SETTINGS snapInferenceSettings() const
Snap inference settings for whichever editor owns this helper.
~PCB_GRID_HELPER() override
VECTOR2I AlignToArc(const VECTOR2I &aPoint, const SHAPE_ARC &aSeg)
VECTOR2I SnapToPad(const VECTOR2I &aMousePos, std::deque< PAD * > &aPads)
void OnBoardItemsRemoved(BOARD &aBoard, std::vector< BOARD_ITEM * > &aBoardItems) override
BOARD_ITEM * GetSnapped() const
Function GetSnapped If the PCB_GRID_HELPER has highlighted a snap point (target shown),...
VECTOR2D GetGridSize(GRID_HELPER_GRIDS aGrid) const override
Return the size of the specified grid.
VECTOR2I BestDragOrigin(const VECTOR2I &aMousePos, std::vector< BOARD_ITEM * > &aItem, GRID_HELPER_GRIDS aGrid=GRID_HELPER_GRIDS::GRID_CURRENT, const PCB_SELECTION_FILTER_OPTIONS *aSelectionFilter=nullptr)
bool editingInsideFootprint() const
True when the footprint's own contents are the layout objects.
void AddConstructionItems(std::vector< BOARD_ITEM * > aItems, bool aExtensionOnly, bool aIsPersistent)
Add construction geometry for a set of board items.
ANCHOR * nearestAnchor(const VECTOR2I &aPos, int aFlags)
Find the nearest anchor point to the given position with matching flags.
static BOX2I layoutBounds(const BOARD_ITEM &aItem)
MAGNETIC_SETTINGS * m_magneticSettings
GRID_HELPER_GRIDS GetItemGrid(const EDA_ITEM *aItem) const override
Get the coarsest grid that applies to an item.
VECTOR2I AlignToSegment(const VECTOR2I &aPoint, const SEG &aSeg)
virtual VECTOR2I Align(const VECTOR2I &aPoint, GRID_HELPER_GRIDS aGrid) const
void computeAnchors(const std::vector< BOARD_ITEM * > &aItems, const VECTOR2I &aRefPos, bool aFrom, const PCB_SELECTION_FILTER_OPTIONS *aSelectionFilter, const LSET *aLayers, bool aForDrag)
computeAnchors inserts the local anchor points in to the grid helper for the specified container of b...
A set of BOARD_ITEMs (i.e., without duplicates).
A PCB_POINT is a 0-dimensional point that is used to mark a position on a PCB, or more usually a foot...
Object to handle a bitmap image that can be inserted in a PCB.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
REFERENCE_IMAGE & GetReferenceImage()
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
VECTOR2I GetPosition() const override
VECTOR2I GetTextPos() const override
const VECTOR2I & GetStart() const
const VECTOR2I & GetEnd() const
A REFERENCE_IMAGE is a wrapper around a BITMAP_IMAGE that is displayed in an editor as a reference fo...
VECTOR2I GetTransformOriginOffset() const
Get the center of scaling, etc, relative to the image center (GetPosition()).
VECTOR2I GetPosition() const
BOX2I GetBoundingBox() const
ecoord SquaredDistance(const SEG &aSeg) const
VECTOR2I::extended_type ecoord
OPT_VECTOR2I IntersectLines(const SEG &aSeg) const
Compute the intersection point of lines passing through ends of (this) and aSeg.
const VECTOR2I & GetP1() const
int IntersectLine(const SEG &aSeg, std::vector< VECTOR2I > *aIpsBuffer) const
Find intersection points between this arc and aSeg, treating aSeg as an infinite line.
const VECTOR2I & GetP0() const
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
void Move(const VECTOR2I &aVector) override
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
void Rotate(const EDA_ANGLE &aAngle, const VECTOR2I &aCenter={ 0, 0 }) override
Rotate all vertices by a given angle.
virtual const SEG GetSegment(int aIndex) const override
const VECTOR2I NearestPoint(const VECTOR2I &aP, bool aAllowInternalShapePoints=true) const
Find a point on the line chain that is closest to point aP.
virtual size_t GetSegmentCount() const override
Represent a set of closed polygons.
CONST_ITERATOR CIterateWithHoles(int aOutline) const
const BOX2I BBox(int aClearance=0) const override
Compute a bounding box of the shape, with a margin of aClearance a collision.
static SHAPE_SEGMENT BySizeAndCenter(const VECTOR2I &aSize, const VECTOR2I &aCenter, const EDA_ANGLE &aRotation)
std::vector< SNAP_CANDIDATE > CollectObjectGeometry(const SNAP_SOURCE_CONTEXT &aContext, int aRadius) const
std::vector< SNAP_CANDIDATE > CollectEqualSpacing(const SNAP_SOURCE_CONTEXT &aContext, int aRadius) const
void AddBounds(SNAP_OBJECT_BOUNDS aBounds)
std::vector< SNAP_CANDIDATE > CollectTangentNormal(const SNAP_SOURCE_CONTEXT &aContext, int aRadius, bool aTangentEnabled, bool aNormalEnabled) const
void AddPath(SNAP_OBJECT_PATH aPath)
void AddAlignmentPoint(SNAP_ALIGNMENT_POINT aPoint)
std::vector< SNAP_CANDIDATE > CollectAlignment(const SNAP_SOURCE_CONTEXT &aContext, int aRadius) const
OPT_VECTOR2I GetNearestSnapLinePoint(const VECTOR2I &aCursor, const VECTOR2I &aNearestGrid, std::optional< int > aDistToNearest, int snapRange, const VECTOR2D &aGridSize=VECTOR2D(0, 0), const VECTOR2I &aGridOrigin=VECTOR2I(0, 0)) const
If the snap line is active, return the best snap point that is closest to the cursor.
void SetSnappedAnchor(const VECTOR2I &aAnchorPos)
Inform this manager that an anchor snap has been made.
void ClearSnapLine()
Clear the snap line origin and end points.
void SetSnapLineOrigin(const VECTOR2I &aOrigin)
The snap point is a special point that is located at the last point the cursor snapped to.
void SetSnapLineEnd(const OPT_VECTOR2I &aSnapPoint)
Set the end point of the snap line.
A SNAP_MANAGER glues together the snap line manager and construction manager., along with some other ...
SNAP_LINE_MANAGER & GetSnapLineManager()
CONSTRUCTION_MANAGER & GetConstructionManager()
const std::vector< VECTOR2I > & GetReferenceOnlyPoints() const
void SetReferenceOnlyPoints(std::vector< VECTOR2I > aPoints)
Set the reference-only points - these are points that are not snapped to, but can still be used for c...
void SetDimensionBrackets(std::vector< SEG > aBrackets)
Define a general 2D-vector/point.
constexpr extended_type SquaredDistance(const VECTOR2< T > &aVector) const
Compute the squared distance between two vectors.
static constexpr extended_type ECOORD_MAX
VECTOR2_TRAITS< int32_t >::extended_type extended_type
Handle a list of polygons defining a copper zone.
A type-safe container of any type.
static constexpr EDA_ANGLE ANGLE_90
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
SNAP_TARGET_ID SnapTargetId(const KIID &aId)
The snap identity of a document item.
bool m_ExtensionSnapActivateOnHover
If extension snaps are enabled, 'activate' items on hover, even if not near a snap point.
bool m_EnableExtensionSnaps
Enable snap anchors based on item line extensions.
const wxChar *const traceSnap
Flag to enable snap/grid helper debug tracing.
std::variant< LINE, HALF_LINE, SEG, CIRCLE, SHAPE_ARC, BOX2I > INTERSECTABLE_GEOM
A variant type that can hold any of the supported geometry types for intersection calculations.
bool IsPcbLayer(int aLayer)
Test whether a layer is a valid layer for Pcbnew.
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
@ LAYER_FOOTPRINTS_FR
Show footprints on front.
@ LAYER_AUX_ITEMS
Auxiliary items (guides, rule, etc).
@ LAYER_FOOTPRINTS_BK
Show footprints on back.
@ LAYER_ANCHOR
Anchor of items having an anchor point (texts, footprints).
bool IsInnerCopperLayer(int aLayerId)
Test whether a layer is an inner (In1_Cu to In30_Cu) copper layer.
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
std::vector< TYPED_POINT2I > GetCircleKeyPoints(const CIRCLE &aCircle, bool aIncludeCenter)
Get key points of an CIRCLE.
std::vector< TYPED_POINT2I > GetOvalKeyPoints(const SHAPE_SEGMENT &aOval, OVAL_KEY_POINT_FLAGS aFlags)
Get a list of interesting points on an oval (rectangle with semicircular end caps)
std::array< SEG, 4 > BoxToSegs(const BOX2I &aBox)
Decompose a BOX2 into four segments.
unsigned int OVAL_KEY_POINT_FLAGS
@ GEOMETRY
Position or shape has changed.
VECTOR2I GetNearestPoint(const NEARABLE_GEOM &aGeom, const VECTOR2I &aPt)
Get the nearest point on a geometry to a given point.
std::variant< LINE, HALF_LINE, SEG, CIRCLE, SHAPE_ARC, BOX2I, VECTOR2I > NEARABLE_GEOM
A variant type that can hold any of the supported geometry types for nearest point calculations.
BARCODE class definition.
static bool PadstackUniqueLayerAppliesToLayer(const PADSTACK &aPadStack, PCB_LAYER_ID aPadstackUniqueLayer, const PCB_LAYER_ID aRealLayer)
Class to handle a set of BOARD_ITEMs.
@ PT_INTERSECTION
The point is an intersection of two (or more) items.
@ PT_CENTER
The point is the center of something.
@ PT_CORNER
The point is a corner of a polygon, rectangle, etc (you may want to infer PT_END from this)
@ PT_NONE
No specific point type.
@ PT_QUADRANT
The point is on a quadrant of a circle (N, E, S, W points).
@ PT_END
The point is at the end of a segment, arc, etc.
@ PT_MID
The point is at the middle of a segment, arc, etc.
@ PT_ON_ELEMENT
The point is somewhere on another element, but not some specific point.
std::optional< VECTOR2I > OPT_VECTOR2I
VECTOR2I::extended_type ecoord
Utility functions for working with shapes.
SNAP_FRAME_OUTPUT< Payload > ResolveSnapFrame(SNAP_FRAME_INPUT< Payload > aInput)
SNAP_STABLE_ID MakePointSnapId(SNAP_ID_KIND aKind, const VECTOR2I &aPoint, int aFeatureIndex=0)
SNAP_STABLE_ID MakeCompositeSnapId(SNAP_ID_KIND aKind, const std::vector< SNAP_TARGET_ID > &aTargets, int aFeatureIndex=0)
SNAP_STABLE_ID MakeDerivedSnapId(SNAP_ID_KIND aKind, const SNAP_STABLE_ID &aSource, int aFeatureIndex=0, int aSolutionBranch=0)
KIGFX::CONSTRUCTION_GEOM::DRAWABLE Drawable
Items to be used for the construction of "virtual" anchors, for example, when snapping to a point inv...
std::vector< EDA_ITEM * > items
Items that are associated with this anchor (can be more than one, e.g.
double Distance(const VECTOR2I &aP) const
World-space snap thresholds derived from the screen-space snap radius.
int range
Snap radius, optionally clamped to the visible grid.
int in
Distance at which a candidate is picked up.
double scale
SNAP_SCREEN_RADIUS in world units.
int out
Distance at which a held candidate is released.
double rankingHysteresis
Resolver ranking stickiness, as a fraction of the radius.
A visitor that visits INTERSECTABLE_GEOM variant objects with another (which is held as state: m_othe...
A single anchor point contributed by an item, before it is registered with the helper.
PCB_INTERSECTABLE(BOARD_ITEM *aItem, INTERSECTABLE_GEOM aSeg)
INTERSECTABLE_GEOM Geometry
This file contains data structures that are saved in the project file or project local settings file ...
bool otherItems
Anything not fitting one of the above categories.
bool vias
Vias (all types>
bool graphics
Graphic lines, shapes, polygons.
bool footprints
Allow selecting entire footprints.
bool text
Text (free or attached to a footprint)
bool tracks
Copper tracks.
bool dimensions
Dimension items.
static SNAP_CANDIDATE Point(SNAP_STABLE_ID aId, SNAP_PRIORITY_TIER aPriority, SNAP_CANDIDATE_SUBTYPE aSubtype, const VECTOR2I &aPoint, double aResidual)
std::optional< SNAP_FRAME_PRESENTATION< Payload > > presentation
bool constructionExtensions
bool alignmentDistribution
std::optional< VECTOR2I > stationarySourceLeg
std::optional< BOX2I > movingBounds
std::optional< VECTOR2I > movingReferencePoint
std::optional< SNAP_STABLE_ID > movingItem
std::vector< SNAP_STABLE_ID > stationarySelfFeatures
SNAP_EDITOR_PROFILE profile
SNAP_REFERENCE_PREFERENCE referencePreference
SHAPE_CIRCLE circle(c.m_circle_center, c.m_circle_radius)
wxString result
Test unit parsing edge cases and error handling.
wxLogTrace helper definitions.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
@ PCB_ZONE_T
class ZONE, a copper pour area
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
@ PCB_MARKER_T
class PCB_MARKER, a marker used to show something
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
@ PCB_PAD_T
class PAD, a pad in a footprint
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
@ PCB_DIMENSION_T
class PCB_DIMENSION_BASE: abstract dimension meta-type
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
@ PCB_POINT_T
class PCB_POINT, a 0-dimensional point
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D