69std::optional<INTERSECTABLE_GEOM> GetBoardIntersectable( 
const BOARD_ITEM& aItem )
 
   71    switch( aItem.
Type() )
 
  123std::optional<int64_t> FindSquareDistanceToItem( 
const BOARD_ITEM& item, 
const VECTOR2I& aPos )
 
  125    std::optional<INTERSECTABLE_GEOM> intersectable = GetBoardIntersectable( item );
 
  126    std::optional<NEARABLE_GEOM>      nearable;
 
  132                [&]( 
const auto& geom )
 
  204    auto constructionItemsBatch = std::make_unique<CONSTRUCTION_MANAGER::CONSTRUCTION_ITEM_BATCH>();
 
  206    std::vector<VECTOR2I> referenceOnlyPoints;
 
  210        std::vector<KIGFX::CONSTRUCTION_GEOM::DRAWABLE> constructionDrawables;
 
  212        switch( item->
Type() )
 
  222                if( !aExtensionOnly )
 
  238                    constructionDrawables.emplace_back( shape.
GetStart() );
 
  239                    constructionDrawables.emplace_back( shape.
GetEnd() );
 
  242                    referenceOnlyPoints.emplace_back( shape.
GetStart() );
 
  243                    referenceOnlyPoints.emplace_back( shape.
GetEnd() );
 
  249                if( !aExtensionOnly )
 
  260                constructionDrawables.push_back( shape.
GetCenter() );
 
  266                    constructionDrawables.emplace_back( shape.
GetStart() );
 
  267                    constructionDrawables.emplace_back( shape.
GetEnd() );
 
  270                    referenceOnlyPoints.emplace_back( shape.
GetStart() );
 
  271                    referenceOnlyPoints.emplace_back( shape.
GetEnd() );
 
  279                constructionDrawables.push_back( shape.
GetCenter() );
 
  293            constructionDrawables.push_back( refImg.
GetPosition() );
 
  299                constructionDrawables.push_back( seg );
 
  313        std::vector<CONSTRUCTION_MANAGER::CONSTRUCTION_ITEM::DRAWABLE_ENTRY> drawableEntries;
 
  314        drawableEntries.reserve( constructionDrawables.size() );
 
  315        for( 
auto& drawable : constructionDrawables )
 
  317            drawableEntries.emplace_back(
 
  324                std::move( drawableEntries ),
 
  328    if( referenceOnlyPoints.size() )
 
 
  339    const int c_gridSnapEpsilon_sq = 4;
 
  346    std::vector<VECTOR2I> points;
 
  348    const SEG testSegments[] = { 
SEG( aligned, aligned + 
VECTOR2( 1, 0 ) ),
 
  353    for( 
const SEG& seg : testSegments )
 
  358            points.push_back( *vec );
 
  365    for( 
const VECTOR2I& pt : { aSeg.
A, aSeg.
B } )
 
  367        SEG::ecoord d_sq = ( pt - aPoint ).SquaredEuclideanNorm();
 
  369        if( d_sq < min_d_sq )
 
  379        SEG::ecoord d_sq = ( pt - aligned ).SquaredEuclideanNorm();
 
  381        if( d_sq < min_d_sq )
 
 
  399    std::vector<VECTOR2I> points;
 
  412        SEG::ecoord d_sq = ( pt - aPoint ).SquaredEuclideanNorm();
 
  414        if( d_sq < min_d_sq )
 
  424        SEG::ecoord d_sq = ( pt - aligned ).SquaredEuclideanNorm();
 
  426        if( d_sq < min_d_sq )
 
 
  443        if( item->
HitTest( aMousePos ) )
 
  447    double  minDist = std::numeric_limits<double>::max();
 
  448    ANCHOR* nearestOrigin = 
nullptr;
 
  455        double dist = a.Distance( aMousePos );
 
  464    return nearestOrigin ? nearestOrigin->
pos : aMousePos;
 
 
  469                                          std::vector<BOARD_ITEM*>& aItems,
 
  475    computeAnchors( aItems, aMousePos, 
true, aSelectionFilter, 
nullptr, 
true );
 
  477    double lineSnapMinCornerDistance = 
m_toolMgr->GetView()->ToWorld( 50 );
 
  483    double minDist = std::numeric_limits<double>::max();
 
  487        minDist = nearestOrigin->
Distance( aMousePos );
 
  488        best = nearestOrigin;
 
  493        double dist = nearestCorner->
Distance( aMousePos );
 
  498            best = nearestCorner;
 
  504        double dist = nearestOutline->
Distance( aMousePos );
 
  506        if( minDist > lineSnapMinCornerDistance && dist < minDist )
 
  507            best = nearestOutline;
 
  510    return best ? best->
pos : aMousePos;
 
 
  518    std::vector<BOARD_ITEM*> item;
 
  523        item.push_back( aReferenceItem );
 
 
  536                                          const std::vector<BOARD_ITEM*>& aSkip )
 
  538    wxLogTrace( 
traceSnap, 
"BestSnapAnchor: origin (%d, %d), enableSnap=%d, enableGrid=%d, enableSnapLine=%d",
 
  542    const int snapSize = 25;
 
  549    double snapScale = 
m_toolMgr->GetView()->ToWorld( snapSize );
 
  555    const BOX2I visibilityHorizon =
 
  560    const std::vector<BOARD_ITEM*> visibleItems = 
queryVisible( visibilityHorizon, aSkip );
 
  561    computeAnchors( visibleItems, aOrigin, 
false, 
nullptr, &aLayers, 
false );
 
  567    const int hysteresisWorld =
 
  569    const int snapIn = std::max( 0, snapRange - hysteresisWorld );
 
  570    const int snapOut = snapRange + hysteresisWorld;
 
  572    wxLogTrace( 
traceSnap, 
"  snapRange=%d, snapIn=%d, snapOut=%d, hysteresis=%d",
 
  573                snapRange, snapIn, snapOut, hysteresisWorld );
 
  574    wxLogTrace( 
traceSnap, 
"  visibleItems count=%zu, anchors count=%zu",
 
  576    wxLogTrace( 
traceSnap, 
"  nearest anchor: %s at (%d, %d), distance=%f",
 
  577                nearest ? 
"found" : 
"none",
 
  578                nearest ? nearest->
pos.
x : 0,
 
  579                nearest ? nearest->
pos.
y : 0,
 
  580                nearest ? nearest->
Distance( aOrigin ) : -1.0 );
 
  581    wxLogTrace( 
traceSnap, 
"  nearestGrid: (%d, %d)", nearestGrid.
x, nearestGrid.
y );
 
  588            ad->AddAnchor( 
anchor.pos );
 
  590        ad->SetNearest( nearest ? 
OPT_VECTOR2I{ nearest->
pos } : std::nullopt );
 
  595    std::optional<int> snapDist;
 
  598        snapDist = nearest->
Distance( aOrigin );
 
  602        int existingDist = 
m_snapItem->Distance( aOrigin );
 
  603        if( !snapDist || existingDist < *snapDist )
 
  604            snapDist = existingDist;
 
  607    wxLogTrace( 
traceSnap, 
"  snapDist: %s (value=%d)",
 
  608                snapDist ? 
"set" : 
"none", snapDist ? *snapDist : -1 );
 
  616    const auto ptIsReferenceOnly =
 
  620                return std::find( referenceOnlyPoints.begin(), referenceOnlyPoints.end(), aPt )
 
  621                       != referenceOnlyPoints.end();
 
  624    const auto proposeConstructionForItems =
 
  625            [&]( 
const std::vector<EDA_ITEM*>& aItems )
 
  629                std::vector<BOARD_ITEM*> items;
 
  645                            items.push_back( boardItem );
 
  654    bool snapValid = 
false;
 
  658        wxLogTrace( 
traceSnap, 
"  Snap enabled, checking snap options..." );
 
  663            wxLogTrace( 
traceSnap, 
"    Checking snap lines..." );
 
  666                    aOrigin, nearestGrid, snapDist, snapRange, gridSize, 
GetOrigin() );
 
  670                std::optional<VECTOR2I> constructionSnap =
 
  673                if( constructionSnap )
 
  674                    snapLineSnap = *constructionSnap;
 
  680                wxLogTrace( 
traceSnap, 
"    Snap line found at (%d, %d)",
 
  681                            snapLineSnap->x, snapLineSnap->y );
 
  685                bool preferAnchor = 
false;
 
  686                if( nearest && nearest->
Distance( aOrigin ) <= snapIn )
 
  689                    wxLogTrace( 
traceSnap, 
"    Preferring anchor over snap line (anchorDist=%f, snapRange=%d)",
 
  690                                nearest->
Distance( aOrigin ), snapRange );
 
  696                        wxLogTrace( 
traceSnap, 
"    Nearest anchor at (%d, %d), distance=%f is out of range (snapRange=%d)",
 
  703                        wxLogTrace( 
traceSnap, 
"    No nearest anchor to consider" );
 
  719                    if( !ptIsReferenceOnly( *snapLineSnap ) )
 
  721                        wxLogTrace( 
traceSnap, 
"  RETURNING snap line point (non-reference): (%d, %d)",
 
  722                                    snapLineSnap->x, snapLineSnap->y );
 
  723                        return *snapLineSnap;
 
  727                        wxLogTrace( 
traceSnap, 
"    Snap line point is reference-only, continuing..." );
 
  732                    wxLogTrace( 
traceSnap, 
"    Skipping snap line, will use anchor instead" );
 
  741            wxLogTrace( 
traceSnap, 
"    Checking existing m_snapItem, dist=%d (snapOut=%d)",
 
  744            if( dist <= snapOut )
 
  746                if( nearest && ptIsReferenceOnly( nearest->
pos ) &&
 
  747                        nearest->
Distance( aOrigin ) <= snapRange )
 
  753                wxLogTrace( 
traceSnap, 
"  RETURNING existing m_snapItem: (%d, %d)",
 
  758            wxLogTrace( 
traceSnap, 
"    m_snapItem too far, clearing..." );
 
  763        if( nearest && nearest->
Distance( aOrigin ) <= snapIn )
 
  765            wxLogTrace( 
traceSnap, 
"    Nearest anchor within snapIn range" );
 
  771            if( ptIsReferenceOnly( nearest->
pos ) )
 
  773                wxLogTrace( 
traceSnap, 
"    Nearest anchor is reference-only, setting snap line origin" );
 
  780                wxLogTrace( 
traceSnap, 
"    Nearest anchor accepted, constructed=%d", anchorIsConstructed );
 
  787                if( !anchorIsConstructed )
 
  788                    proposeConstructionForItems( nearest->
items );
 
  797                wxLogTrace( 
traceSnap, 
"  RETURNING nearest anchor: (%d, %d)",
 
  806            wxLogTrace( 
traceSnap, 
"    No nearest anchor within snapIn range" );
 
  810            if( canActivateByHitTest )
 
  812                wxLogTrace( 
traceSnap, 
"    Checking hit test for construction activation..." );
 
  817                const int hoverAccuracy = 0;
 
  821                    if( item->
HitTest( aOrigin, hoverAccuracy ) )
 
  823                        wxLogTrace( 
traceSnap, 
"    Hit item, proposing construction geometry" );
 
  824                        proposeConstructionForItems( { item } );
 
  838            wxLogTrace( 
traceSnap, 
"    Grid disabled, checking point-on-element snap..." );
 
  843            if( nearestPointOnAnElement && nearestPointOnAnElement->Distance( aOrigin ) <= snapRange )
 
  845                wxLogTrace( 
traceSnap, 
"  RETURNING point-on-element: (%d, %d)",
 
  846                            nearestPointOnAnElement->x, nearestPointOnAnElement->y );
 
  853                return *nearestPointOnAnElement;
 
  860    wxLogTrace( 
traceSnap, 
"  RETURNING grid snap: (%d, %d)", nearestGrid.
x, nearestGrid.
y );
 
 
  894    switch( aItem->
Type() )
 
 
  931    if( !
grid.overrides_enabled )
 
  937        if( 
grid.override_connected )
 
  938            idx = 
grid.override_connected_idx;
 
  943        if( 
grid.override_wires )
 
  944            idx = 
grid.override_wires_idx;
 
  949        if( 
grid.override_vias )
 
  950            idx = 
grid.override_vias_idx;
 
  955        if( 
grid.override_text )
 
  956            idx = 
grid.override_text_idx;
 
  961        if( 
grid.override_graphics )
 
  962            idx = 
grid.override_graphics_idx;
 
  970    if( idx >= 0 && idx < (
int) 
grid.grids.size() )
 
 
  977std::vector<BOARD_ITEM*>
 
  980    std::set<BOARD_ITEM*> items;
 
  981    std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> visibleItems;
 
  989    view->
Query( aArea, visibleItems );
 
  991    for( 
const auto& [ viewItem, layer ] : visibleItems )
 
  993        if( !viewItem->IsBOARD_ITEM() )
 
 1009                if( 
IsPcbLayer( layer ) && parentFP->GetPrivateLayers().test( layer ) )
 
 1016                && ( !isHighContrast || activeLayers.count( layer ) )
 
 1019            items.insert ( boardItem );
 
 1023    std::function<void( 
BOARD_ITEM* )> skipItem =
 
 1026                items.erase( aItem );
 
 1039    return {items.begin(), items.end()};
 
 
 1058                                      const VECTOR2I& aRefPos, 
bool aFrom,
 
 1060                                      const LSET* aMatchLayers, 
bool aForDrag )
 
 1062    std::vector<PCB_INTERSECTABLE> intersectables;
 
 1066    const bool computeIntersections = !aForDrag;
 
 1067    const bool computePointsOnElements = !aForDrag;
 
 1068    const bool excludeGraphics = aSelectionFilter && !aSelectionFilter->
graphics;
 
 1069    const bool excludeTracks = aSelectionFilter && !aSelectionFilter->
tracks;
 
 1071    const auto itemIsSnappable =
 
 1081    const auto processItem =
 
 1085                if( !itemIsSnappable( item ) )
 
 1093                if( computeIntersections || computePointsOnElements )
 
 1095                    std::optional<INTERSECTABLE_GEOM> intersectableGeom;
 
 1097                    if( !excludeGraphics
 
 1100                        intersectableGeom = GetBoardIntersectable( item );
 
 1104                        intersectableGeom = GetBoardIntersectable( item );
 
 1107                    if( intersectableGeom )
 
 1108                        intersectables.emplace_back( &item, *intersectableGeom );
 
 1114        processItem( *item );
 
 1126                        [&]( 
const auto& visited )
 
 1128                            using ItemType = std::decay_t<
decltype( visited )>;
 
 1130                            if constexpr( std::is_same_v<ItemType, LINE>
 
 1131                                          || std::is_same_v<ItemType, CIRCLE>
 
 1132                                          || std::is_same_v<ItemType, HALF_LINE>
 
 1133                                          || std::is_same_v<ItemType, SHAPE_ARC> )
 
 1135                                intersectables.emplace_back( involvedItem, visited );
 
 1137                            else if constexpr( std::is_same_v<ItemType, VECTOR2I> )
 
 1153    if( computeIntersections )
 
 1155        for( std::size_t ii = 0; ii < intersectables.size(); ++ii )
 
 1159            for( std::size_t jj = ii + 1; jj < intersectables.size(); ++jj )
 
 1165                if( intersectableA.
Item == intersectableB.
Item )
 
 1168                std::vector<VECTOR2I>      intersections;
 
 1171                std::visit( visitor, intersectableB.
Geometry );
 
 1174                for( 
const VECTOR2I& intersection : intersections )
 
 1176                    std::vector<EDA_ITEM*> items = {
 
 1177                        intersectableA.
Item,
 
 1178                        intersectableB.
Item,
 
 1191    if( computePointsOnElements )
 
 1198                    [&]( 
const auto& geom )
 
 1203                    intersectable.Geometry );
 
 
 1215    switch( aPadStack.
Mode() )
 
 1225        switch( aPadstackUniqueLayer )
 
 1230            return aPadstackUniqueLayer == aRealLayer;
 
 1235            wxFAIL_MSG( wxString::Format( 
"Unexpected padstack unique layer %d in FRONT_INNER_BACK mode",
 
 1236                                          aPadstackUniqueLayer ) );
 
 1244        return aRealLayer == aPadstackUniqueLayer;
 
 
 1261    const auto checkVisibility =
 
 1268                bool onActiveLayer = !isHighContrast;
 
 1269                bool isLODVisible = 
false;
 
 1273                    if( !onActiveLayer && activeLayers.count( layer ) )
 
 1274                        onActiveLayer = 
true;
 
 1277                        isLODVisible = 
true;
 
 1279                    if( onActiveLayer && isLODVisible )
 
 1292    auto handlePadShape =
 
 1331                        trap_delta = aPad->
GetDelta( aLayer ) / 2;
 
 1335                    corners.
Append( -half_size.
x - trap_delta.
y, half_size.
y + trap_delta.
x );
 
 1336                    corners.
Append( half_size.
x + trap_delta.
y, half_size.
y - trap_delta.
x );
 
 1337                    corners.
Append( half_size.
x - trap_delta.
y, -half_size.
y + trap_delta.
x );
 
 1338                    corners.
Append( -half_size.
x + trap_delta.
y, -half_size.
y - trap_delta.
x );
 
 1361                    if( !outline->IsEmpty() )
 
 1363                        for( 
const VECTOR2I& pt : outline->Outline( 0 ).CPoints() )
 
 1377                    std::vector<TYPED_POINT2I> snap_pts;
 
 1379                    if( hole_size.
x == hole_size.
y )
 
 1402    const auto addRectPoints =
 
 1409                const SEG second( topRight, aBox.
GetEnd() );
 
 1410                const SEG third( aBox.
GetEnd(), bottomLeft );
 
 1427    const auto handleShape =
 
 1437                        const int r = ( start - 
end ).EuclideanNorm();
 
 1492    switch( aItem->
Type() )
 
 1502                    if( aSelectionFilter && !aSelectionFilter->
pads )
 
 1511                if( !checkVisibility( 
pad ) )
 
 1514                if( !
pad->GetBoundingBox().Contains( aRefPos ) )
 
 1517                pad->Padstack().ForEachUniqueLayer(
 
 1522                                                                      activeHighContrastPrimaryLayer ) )
 
 1524                                handlePadShape( 
pad, aLayer );
 
 1532                if( aSelectionFilter && !aSelectionFilter->
points )
 
 1535                if( !checkVisibility( pt ) )
 
 1541            if( aFrom && aSelectionFilter && !aSelectionFilter->
footprints )
 
 1553            if( ( 
center - position ).SquaredEuclideanNorm() > 
grid.SquaredEuclideanNorm() )
 
 1562                if( aSelectionFilter && !aSelectionFilter->
pads )
 
 1571            if( checkVisibility( aItem ) )
 
 1575                pad->Padstack().ForEachUniqueLayer(
 
 1580                                                                      activeHighContrastPrimaryLayer ) )
 
 1582                                handlePadShape( 
pad, aLayer );
 
 1592                if( aSelectionFilter && !aSelectionFilter->
text )
 
 1601            if( checkVisibility( aItem ) )
 
 1602                handleShape( 
static_cast<PCB_SHAPE*
>( aItem ) );
 
 1609                if( aSelectionFilter && !aSelectionFilter->
text )
 
 1618            if( checkVisibility( aItem ) )
 
 1623                VECTOR2I  topLeft = 
table->GetCell( 0, 0 )->GetCornersInSequence( drawAngle )[0];
 
 1625                        table->GetCell( 
table->GetRowCount() - 1, 0 )->GetCornersInSequence( drawAngle )[3];
 
 1626                VECTOR2I topRight = 
table->GetCell( 0, 
table->GetColCount() - 1 )->GetCornersInSequence( drawAngle )[1];
 
 1628                                               ->GetCornersInSequence( drawAngle )[2];
 
 1643                if( aSelectionFilter && !aSelectionFilter->
graphics )
 
 1652            if( checkVisibility( aItem ) )
 
 1653                handleShape( 
static_cast<PCB_SHAPE*
>( aItem ) );
 
 1661                if( aSelectionFilter && !aSelectionFilter->
tracks )
 
 1670            if( checkVisibility( aItem ) )
 
 1687            if( aSelectionFilter && !aSelectionFilter->
points )
 
 1690            if( checkVisibility( aItem ) )
 
 1698                if( aSelectionFilter && !aSelectionFilter->
vias )
 
 1707            if( checkVisibility( aItem ) )
 
 1713            if( aFrom && aSelectionFilter && !aSelectionFilter->
zones )
 
 1716            if( checkVisibility( aItem ) )
 
 1736            if( aFrom && aSelectionFilter && !aSelectionFilter->
dimensions )
 
 1739            if( checkVisibility( aItem ) )
 
 1751            if( aFrom && aSelectionFilter && !aSelectionFilter->
dimensions )
 
 1754            if( checkVisibility( aItem ) )
 
 1763                for( 
int i = 0; i < 2; i++ )
 
 1773            if( aFrom && aSelectionFilter && !aSelectionFilter->
dimensions )
 
 1776            if( checkVisibility( aItem ) )
 
 1788            if( aFrom && aSelectionFilter && !aSelectionFilter->
dimensions )
 
 1791            if( checkVisibility( aItem ) )
 
 1803            if( aFrom && aSelectionFilter && !aSelectionFilter->
text )
 
 1806            if( checkVisibility( aItem ) )
 
 1814                if( checkVisibility( item ) )
 
 1821            if( aFrom && aSelectionFilter && !aSelectionFilter->
graphics )
 
 1824            if( checkVisibility( aItem ) )
 
 1830                addRectPoints( bbox, *aItem );
 
 
 1852    ecoord               minDist = std::numeric_limits<ecoord>::max();
 
 1853    std::vector<ANCHOR*> anchorsAtMinDistance;
 
 1859        if( ( aFlags & 
anchor.flags ) != aFlags )
 
 1862        if( !anchorsAtMinDistance.empty() && 
anchor.pos == anchorsAtMinDistance.front()->pos )
 
 1865            anchorsAtMinDistance.push_back( &
anchor );
 
 1869            const double dist = 
anchor.pos.SquaredDistance( aPos );
 
 1871            if( dist < minDist )
 
 1875                anchorsAtMinDistance.clear();
 
 1876                anchorsAtMinDistance.push_back( &
anchor );
 
 1889    const auto    noRealItemsInAnchorAreInvolved = [&]( 
ANCHOR* aAnchor ) -> 
bool 
 1894        if( !haveExtensions )
 
 1902        if( !anchorIsConstructed )
 
 1906        return !allRealAreInvolved;
 
 1910    std::erase_if( anchorsAtMinDistance, noRealItemsInAnchorAreInvolved );
 
 1917    ecoord  minDistToItem = std::numeric_limits<ecoord>::max();
 
 1923        ecoord distToNearestItem = std::numeric_limits<ecoord>::max();
 
 1930            std::optional<ecoord> distToThisItem =
 
 1931                    FindSquareDistanceToItem( 
static_cast<const BOARD_ITEM&
>( *item ), aPos );
 
 1933            if( distToThisItem )
 
 1934                distToNearestItem = std::min( distToNearestItem, *distToThisItem );
 
 1939        distToNearestItem = std::min( distToNearestItem, minDist );
 
 1941        if( distToNearestItem < minDistToItem )
 
 1943            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.
 
static constexpr BOX2< VECTOR2I > ByCorners(const VECTOR2I &aCorner1, const VECTOR2I &aCorner2)
 
constexpr const Vec GetEnd() const
 
constexpr Vec Centre() const
 
constexpr const Vec GetCenter() const
 
constexpr coord_type GetLeft() const
 
constexpr const Vec & GetOrigin() const
 
constexpr coord_type GetRight() const
 
constexpr coord_type GetTop() const
 
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.
 
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
 
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.
 
std::vector< VECTOR2I > GetPolyPoints() const
Duplicate the polygon outlines into a flat list of VECTOR2I points.
 
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
 
const VECTOR2I & GetTextPos() const
 
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()
 
void showConstructionGeometry(bool aShow)
 
VECTOR2D GetVisibleGrid() const
 
VECTOR2I GetOrigin() const
 
std::optional< ANCHOR > m_snapItem
 
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< 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.
 
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 & GetDrillSize() const
 
const VECTOR2I & GetDelta(PCB_LAYER_ID aLayer) const
 
VECTOR2I GetPosition() const override
 
PAD_SHAPE GetShape(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 & GetSize(PCB_LAYER_ID aLayer) const
 
const VECTOR2I & GetMid() const
 
virtual const VECTOR2I & GetStart() const
The dimension's origin is the first feature point for the dimension.
 
virtual const VECTOR2I & GetEnd() const
 
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
 
~PCB_GRID_HELPER() override
 
VECTOR2I AlignToArc(const VECTOR2I &aPoint, const SHAPE_ARC &aSeg)
 
VECTOR2I SnapToPad(const VECTOR2I &aMousePos, std::deque< PAD * > &aPads)
 
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 BestSnapAnchor(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...
 
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)
 
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.
 
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...
 
std::vector< BOARD_ITEM * > queryVisible(const BOX2I &aArea, const std::vector< BOARD_ITEM * > &aSkip) const
 
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
 
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
 
static SHAPE_SEGMENT BySizeAndCenter(const VECTOR2I &aSize, const VECTOR2I &aCenter, const EDA_ANGLE &aRotation)
 
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 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...
 
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.
 
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_AUX_ITEMS
Auxiliary items (guides, rule, etc).
 
@ 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.
 
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.
 
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
 
A visitor that visits INTERSECTABLE_GEOM variant objects with another (which is held as state: m_othe...
 
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 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.
 
SHAPE_CIRCLE circle(c.m_circle_center, c.m_circle_radius)
 
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