62        wxLogWarning( wxT( 
"Attempting to call fromTo() with non-existent from-to cache." ) );
 
 
   76#define MISSING_LAYER_ARG( f ) wxString::Format( _( "Missing layer name argument to %s." ), f ) 
   91    if( !arg || arg->
AsString().IsEmpty() )
 
  100            [item, arg, aCtx]() -> 
double 
  102                const wxString& layerName = arg->
AsString();
 
  111                    bool anyMatch = 
false;
 
  113                    for( 
unsigned ii = 0; ii < layerMap.GetCount(); ++ii )
 
  115                        wxPGChoiceEntry& entry = layerMap[ ii ];
 
  117                        if( entry.GetText().Matches( layerName ))
 
  128                        aCtx->
ReportError( wxString::Format( 
_( 
"Unrecognized layer '%s'" ),
 
  143                        std::shared_lock<std::shared_mutex> readLock( board->
m_CachesMutex );
 
  148                            return ( item->
GetLayerSet() & i->second ).any() ? 1.0 : 0.0;
 
  153                    for( 
unsigned ii = 0; ii < layerMap.GetCount(); ++ii )
 
  155                        wxPGChoiceEntry& entry = layerMap[ ii ];
 
  157                        if( entry.GetText().Matches( layerName ) )
 
  162                        std::unique_lock<std::shared_mutex> writeLock( board->
m_CachesMutex );
 
  166                    return ( item->
GetLayerSet() & mask ).any() ? 1.0 : 0.0;
 
 
  203        if( 
ZONE* zone = 
dynamic_cast<ZONE*
>( aItem ) )
 
  204            aItemShape.reset( zone->Outline()->Clone() );
 
  209    return footprintCourtyard.
Collide( aItemShape.get() );
 
 
  223    if( aSelector.Upper().StartsWith( wxT( 
"${CLASS:" ) ) && aSelector.EndsWith( 
'}' ) )
 
  225        wxString 
name = aSelector.Mid( 8, aSelector.Length() - 9 );
 
  236    else if( aSelector.Contains( 
':' ) && aFp->
GetFPIDAsString().Matches( aSelector ) )
 
 
  246                              const std::function<
bool( 
FOOTPRINT* )>& aFunc )
 
  248    if( aArg == wxT( 
"A" ) )
 
  252        if( fp && aFunc( fp ) )
 
  255    else if( aArg == wxT( 
"B" ) )
 
  259        if( fp && aFunc( fp ) )
 
 
  272#define MISSING_FP_ARG( f ) \ 
  273    wxString::Format( _( "Missing footprint argument (A, B, or reference designator) to %s." ), f ) 
 
  284    if( !arg || arg->
AsString().IsEmpty() )
 
  299            [item, arg, context]() -> 
double 
  302                std::shared_ptr<SHAPE> itemShape;
 
  307                            PTR_PTR_CACHE_KEY key = { fp, item };
 
  311                                std::shared_lock<std::shared_mutex> readLock( board->m_CachesMutex );
 
  313                                auto i = board->m_IntersectsCourtyardCache.find( key );
 
  315                                if( i != board->m_IntersectsCourtyardCache.end() )
 
  324                                std::unique_lock<std::shared_mutex> cacheLock( board->m_CachesMutex );
 
  325                                board->m_IntersectsCourtyardCache[ key ] = res;
 
 
  348    if( !arg || arg->
AsString().IsEmpty() )
 
  363            [item, arg, context]() -> 
double 
  366                std::shared_ptr<SHAPE> itemShape;
 
  371                            PTR_PTR_CACHE_KEY key = { fp, item };
 
  375                                std::shared_lock<std::shared_mutex> readLock( board->m_CachesMutex );
 
  377                                auto i = board->m_IntersectsFCourtyardCache.find( key );
 
  379                                if( i != board->m_IntersectsFCourtyardCache.end() )
 
  389                                std::unique_lock<std::shared_mutex> writeLock( board->m_CachesMutex );
 
  390                                board->m_IntersectsFCourtyardCache[ key ] = res;
 
 
  413    if( !arg || arg->
AsString().IsEmpty() )
 
  428            [item, arg, context]() -> 
double 
  431                std::shared_ptr<SHAPE> itemShape;
 
  436                            PTR_PTR_CACHE_KEY key = { fp, item };
 
  440                                std::shared_lock<std::shared_mutex> readLock( board->m_CachesMutex );
 
  442                                auto i = board->m_IntersectsBCourtyardCache.find( key );
 
  444                                if( i != board->m_IntersectsBCourtyardCache.end() )
 
  454                                std::unique_lock<std::shared_mutex> writeLock( board->m_CachesMutex );
 
  455                                board->m_IntersectsBCourtyardCache[ key ] = res;
 
 
  510                aCtx->
ReportError( 
_( 
"Footprint's courtyard is not a single, closed shape." ) );
 
  522                    aCtx->
ReportError( 
_( 
"Footprint has no front courtyard." ) );
 
  537                    aCtx->
ReportError( 
_( 
"Footprint has no back courtyard." ) );
 
  550        ZONE* zone = 
static_cast<ZONE*
>( aItem );
 
 
  576                  const std::function<
bool( 
ZONE* )>& aFunc )
 
  578    if( aArg == wxT( 
"A" ) )
 
  580        return aFunc( 
dynamic_cast<ZONE*
>( aCtx->
GetItem( 0 ) ) );
 
  582    else if( aArg == wxT( 
"B" ) )
 
  584        return aFunc( 
dynamic_cast<ZONE*
>( aCtx->
GetItem( 1 ) ) );
 
  594            if( area->m_Uuid == target )
 
  595                return aFunc( area );
 
  600            for( 
ZONE* area : footprint->Zones() )
 
  604                if( area->m_Uuid == target )
 
  605                    return aFunc( area );
 
  615            if( area->GetZoneName().Matches( aArg ) )
 
  625            for( 
ZONE* area : footprint->Zones() )
 
  628                if( area->GetZoneName().Matches( aArg ) )
 
 
  657        m_item->SetLayerSet( 
m_item->GetLayerSet().set( aLayer ) );
 
 
 
  666#define MISSING_AREA_ARG( f ) \ 
  667    wxString::Format( _( "Missing rule-area argument (A, B, or rule-area name) to %s." ), f ) 
 
  678    if( !arg || arg->
AsString().IsEmpty() )
 
  693            [item, arg, context]() -> 
double 
  702                            if( !aArea || aArea == item || aArea->GetParent() == item )
 
  705                            SCOPED_LAYERSET scopedLayerSet( aArea );
 
  707                            if( context->GetConstraint() == SILK_CLEARANCE_CONSTRAINT )
 
  710                                if(    ( aArea->IsOnLayer( F_SilkS ) && IsFrontLayer( aLayer ) )
 
  711                                    || ( aArea->IsOnLayer( B_SilkS ) && IsBackLayer( aLayer ) ) )
 
  713                                    scopedLayerSet.Add( aLayer );
 
  719                            if( !commonLayers.any() )
 
  728                                testLayers.
set( aLayer );
 
  730                                testLayers = commonLayers;
 
  734                                PTR_PTR_LAYER_CACHE_KEY key = { aArea, item, layer };
 
  738                                    std::shared_lock<std::shared_mutex> readLock( board->m_CachesMutex );
 
  740                                    auto i = board->m_IntersectsAreaCache.find( key );
 
  742                                    if( i != board->m_IntersectsAreaCache.end() && i->second )
 
  750                                    std::unique_lock<std::shared_mutex> writeLock( board->m_CachesMutex );
 
  751                                    board->m_IntersectsAreaCache[ key ] = collides;
 
 
  778    if( !arg || arg->
AsString().IsEmpty() )
 
  793            [item, arg, context]() -> 
double 
  803                            if( !aArea || aArea == item || aArea->GetParent() == item )
 
  806                            if( item->Type() != PCB_FOOTPRINT_T )
 
  808                                if( !( aArea->GetLayerSet() & item->GetLayerSet() ).any() )
 
  819                                std::shared_lock<std::shared_mutex> readLock( board->m_CachesMutex );
 
  821                                auto i = board->m_EnclosedByAreaCache.find( key );
 
  823                                if( i != board->m_EnclosedByAreaCache.end() )
 
  832                                itemShape = *static_cast<ZONE*>( item )->Outline();
 
  836                                FOOTPRINT* fp = static_cast<FOOTPRINT*>( item );
 
  838                                for( PCB_LAYER_ID testLayer : aArea->GetLayerSet() )
 
  840                                    fp->TransformPadsToPolySet( itemShape, testLayer, 0,
 
  841                                                                maxError, ERROR_OUTSIDE );
 
  842                                    fp->TransformFPShapesToPolySet( itemShape, testLayer, 0,
 
  843                                                                    maxError, ERROR_OUTSIDE );
 
  852                            if( itemShape.IsEmpty() )
 
  855                                enclosedByArea = false;
 
  859                                itemShape.BooleanSubtract( *aArea->Outline() );
 
  861                                enclosedByArea = itemShape.IsEmpty();
 
  866                                std::unique_lock<std::shared_mutex> writeLock( board->m_CachesMutex );
 
  867                                board->m_EnclosedByAreaCache[ key ] = enclosedByArea;
 
  870                            return enclosedByArea;
 
 
  881#define MISSING_GROUP_ARG( f ) \ 
  882    wxString::Format( _( "Missing group name argument to %s." ), f ) 
 
  892    if( !arg || arg->
AsString().IsEmpty() )
 
  907            [item, arg]() -> 
double 
 
  927#define MISSING_SHEET_ARG( f ) \ 
  928    wxString::Format( _( "Missing sheet name argument to %s." ), f ) 
 
  938    if( !arg || arg->
AsString().IsEmpty() )
 
  953            [item, arg]() -> 
double 
  966                if( sheetName.EndsWith( wxT(
"/") ) )
 
  967                    sheetName.RemoveLast();
 
  968                if( refName.EndsWith( wxT(
"/") ) )
 
  969                    refName.RemoveLast();
 
  971                if( sheetName.Matches( refName ) )
 
  974                if( ( refName.Matches( wxT( 
"/" ) ) || refName.IsEmpty() )
 
  975                    && sheetName.IsEmpty() )
 
 
  993    if( !arg || arg->
AsString().IsEmpty() )
 
 1008            [item, arg]() -> 
double 
 1019                wxString refName = arg->
AsString();
 
 1021                if( sheetName.EndsWith( wxT( 
"/" ) ) )
 
 1022                    sheetName.RemoveLast();
 
 1023                if( refName.EndsWith( wxT( 
"/" ) ) )
 
 1024                    refName.RemoveLast();
 
 1026                wxArrayString sheetPath = wxSplit( sheetName, 
'/' );
 
 1027                wxArrayString refPath = wxSplit( refName, 
'/' );
 
 1029                if( refPath.size() > sheetPath.size() )
 
 1032                if( ( refName.Matches( wxT( 
"/" ) ) || refName.IsEmpty() ) && sheetName.IsEmpty() )
 
 1037                for( 
size_t i = 0; i < refPath.size(); i++ )
 
 1039                    if( !sheetPath[i].Matches( refPath[i] ) )
 
 
 1048#define MISSING_REF_ARG( f ) \ 
 1049    wxString::Format( _( "Missing footprint argument (reference designator) to %s." ), f ) 
 
 1059    if( !arg || arg->
AsString().IsEmpty() )
 
 1074            [item, arg]() -> 
double 
 
 1148        if( 
via->IsBlindVia() || 
via->IsBuriedVia() )
 
 
 1165            [a, b, context]() -> 
double 
 1172                wxString coupledNet;
 
 1186                        if( board->FindNet( coupledNet ) )
 
 
 1199#define MISSING_DP_ARG( f ) \ 
 1200    wxString::Format( _( "Missing diff-pair name argument to %s." ), f ) 
 
 1212    if( !argv || argv->
AsString().IsEmpty() )
 
 1224            [item, argv]() -> 
double 
 1235                    wxString baseName, coupledNet;
 
 1240                        if( baseName.Matches( arg ) )
 
 1243                        if( baseName.EndsWith( 
"_" ) && baseName.BeforeLast( 
'_' ).Matches( arg ) )
 
 
 1267            aCtx->
ReportError( wxString::Format( 
_( 
"Missing field name argument to %s." ),
 
 1268                                                 wxT( 
"getField()" ) ) );
 
 1278            [item, arg]() -> wxString
 
 
 1303    if( !arg || arg->
AsString().IsEmpty() )
 
 1306            aCtx->
ReportError( 
_( 
"Missing netclass name argument to hasNetclass()" ) );
 
 1318            [item, arg]() -> 
double 
 
 1342    if( !arg || arg->
AsString().IsEmpty() )
 
 1345            aCtx->
ReportError( 
_( 
"Missing netclass name argument to hasExactNetclass()" ) );
 
 1357            [item, arg]() -> 
double 
 
 1381    if( !arg || arg->
AsString().IsEmpty() )
 
 1385                    _( 
"Missing component class name argument to hasComponentClass()" ) );
 
 1397            [item, arg]() -> 
double 
 1402                    footprint = 
static_cast<FOOTPRINT*
>( item );
 
 
constexpr int ARC_LOW_DEF
 
BASE_SET & set(size_t pos)
 
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
 
virtual NETCLASS * GetEffectiveNetClass() const
Return the NETCLASS for this item.
 
wxString GetNetname() const
 
NETINFO_ITEM * GetNet() const
Return #NET_INFO object for a given item.
 
int GetDRCEpsilon() const
Return an epsilon which accounts for rounding errors, etc.
 
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
 
virtual bool IsConnected() const
Returns information if the object is derived from BOARD_CONNECTED_ITEM.
 
virtual void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const
Convert the item shape to a closed polygon.
 
virtual bool IsOnLayer(PCB_LAYER_ID aLayer) const
Test to see if this object is on the given layer.
 
virtual std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
 
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
 
FOOTPRINT * GetParentFootprint() const
 
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
 
BOARD_ITEM_CONTAINER * GetParent() const
 
virtual std::shared_ptr< SHAPE_SEGMENT > GetEffectiveHoleShape() const
 
Information pertinent to a Pcbnew printed circuit board.
 
NETINFO_ITEM * FindNet(int aNetcode) const
Search for a net with the given netcode.
 
const ZONES & Zones() const
 
const FOOTPRINTS & Footprints() const
 
std::unordered_map< wxString, LSET > m_LayerExpressionCache
 
std::unordered_map< ZONE *, std::unique_ptr< DRC_RTREE > > m_CopperZoneRTreeCache
 
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
 
std::shared_mutex m_CachesMutex
 
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
 
constexpr bool Intersects(const BOX2< Vec > &aRect) const
 
A lightweight representation of a component class.
 
bool ContainsClassName(const wxString &className) const
Determines if this (effective) component class contains a specific constituent class.
 
std::shared_ptr< FROM_TO_CACHE > GetFromToCache()
 
static int MatchDpSuffix(const wxString &aNetName, wxString &aComplementNet, wxString &aBaseDpName)
Check if the given net is a diff pair, returning its polarity and complement if so.
 
Implement an R-tree for fast spatial and layer indexing of connectable items.
 
int QueryColliding(BOARD_ITEM *aRefItem, PCB_LAYER_ID aRefLayer, PCB_LAYER_ID aTargetLayer, std::function< bool(BOARD_ITEM *)> aFilter=nullptr, std::function< bool(BOARD_ITEM *)> aVisitor=nullptr, int aClearance=0) const
This is a fast test which essentially does bounding-box overlap given a worst-case clearance.
 
A set of EDA_ITEMs (i.e., without duplicates).
 
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
 
virtual EDA_GROUP * GetParentGroup() const
 
KICAD_T Type() const
Returns the type of object.
 
EDA_ITEM_FLAGS GetFlags() const
 
virtual const wxString & GetText() const
Return the string associated with the text object.
 
static ENUM_MAP< T > & Instance()
 
static bool SniffTest(const wxString &aCandidate)
Returns true if a string has the correct formatting to be a KIID.
 
void ReportError(const wxString &aErrorMsg)
 
virtual const wxString & AsString() const
 
LSET is a set of PCB_LAYER_IDs.
 
static const LSET & FrontMask()
Return a mask holding all technical layers and the external CU layer on front side.
 
static const LSET & BackMask()
Return a mask holding all technical layers and the external CU layer on back side.
 
bool Contains(PCB_LAYER_ID aLayer) const
See if the layer set contains a PCB layer.
 
A collection of nets and the parameters used to route or test these nets.
 
bool ContainsNetclassWithName(const wxString &netclass) const
Determines if the given netclass name is a constituent of this (maybe aggregate) netclass.
 
const wxString GetName() const
Gets the name of this (maybe aggregate) netclass in a format for internal usage or for export to exte...
 
Handle the data for a net.
 
const wxString & GetNetname() const
 
PAD_ATTRIB GetAttribute() const
 
PCBEXPR_BUILTIN_FUNCTIONS()
 
void RegisterFunc(const wxString &funcSignature, LIBEVAL::FUNC_CALL_REF funcPtr)
 
void RegisterAllFunctions()
 
std::map< wxString, LIBEVAL::FUNC_CALL_REF > m_funcs
 
int GetConstraint() const
 
PCB_LAYER_ID GetLayer() const
 
BOARD_ITEM * GetItem(int index) const
 
BOARD_ITEM * GetObject(const LIBEVAL::CONTEXT *aCtx) const
 
void Add(PCB_LAYER_ID aLayer)
 
SCOPED_LAYERSET(BOARD_ITEM *aItem)
 
Represent a set of closed polygons.
 
void ClearArcs()
Removes all arc references from all the outlines and holes in the polyset.
 
bool Collide(const SHAPE *aShape, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const override
Check if the boundary of shape (this) lies closer to the shape aShape than aClearance,...
 
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
 
void Deflate(int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError)
 
int OutlineCount() const
Return the number of outlines in the set.
 
SHAPE_POLY_SET CloneDropTriangulation() const
 
Handle a list of polygons defining a copper zone.
 
const BOX2I GetBoundingBox() const override
 
SHAPE_POLY_SET * Outline()
 
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
 
@ ALLOW_ACUTE_CORNERS
just inflate the polygon. Acute angles create spikes
 
@ DIFF_PAIR_GAP_CONSTRAINT
 
#define ROUTER_TRANSIENT
transient items that should NOT be cached
 
#define HOLE_PROXY
Indicates the BOARD_ITEM is a proxy for its hole.
 
#define MALFORMED_COURTYARDS
 
PCB_LAYER_ID
A quick note on layer IDs:
 
PCB_LAYER_ID ToLAYER_ID(int aLayer)
 
@ PTH
Plated through hole pad.
 
Class to handle a set of BOARD_ITEMs.
 
static void intersectsFrontCourtyardFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
#define MISSING_SHEET_ARG(f)
 
bool collidesWithCourtyard(BOARD_ITEM *aItem, std::shared_ptr< SHAPE > &aItemShape, PCBEXPR_CONTEXT *aCtx, FOOTPRINT *aFootprint, PCB_LAYER_ID aSide)
 
#define MISSING_LAYER_ARG(f)
 
static void intersectsBackCourtyardFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
static void memberOfGroupFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
#define MISSING_AREA_ARG(f)
 
static void isCoupledDiffPairFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
static void isPlatedFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
bool searchAreas(BOARD *aBoard, const wxString &aArg, PCBEXPR_CONTEXT *aCtx, const std::function< bool(ZONE *)> &aFunc)
 
static void isBuriedVia(LIBEVAL::CONTEXT *aCtx, void *self)
 
static void existsOnLayerFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
#define MISSING_GROUP_ARG(f)
 
static bool testFootprintSelector(FOOTPRINT *aFp, const wxString &aSelector)
 
static void isBlindBuriedViaFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
static void memberOfSheetFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
static void hasComponentClassFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
static void isBlindVia(LIBEVAL::CONTEXT *aCtx, void *self)
 
static void hasExactNetclassFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
#define MISSING_REF_ARG(f)
 
#define MISSING_DP_ARG(f)
 
static void enclosedByAreaFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
static void memberOfSheetOrChildrenFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
static void memberOfFootprintFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
static void isMicroVia(LIBEVAL::CONTEXT *aCtx, void *self)
 
static void getFieldFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
bool collidesWithArea(BOARD_ITEM *aItem, PCB_LAYER_ID aLayer, PCBEXPR_CONTEXT *aCtx, ZONE *aArea)
 
static void hasNetclassFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
bool fromToFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
static void intersectsCourtyardFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
static bool searchFootprints(BOARD *aBoard, const wxString &aArg, PCBEXPR_CONTEXT *aCtx, const std::function< bool(FOOTPRINT *)> &aFunc)
 
static void inDiffPairFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
static void intersectsAreaFunc(LIBEVAL::CONTEXT *aCtx, void *self)
 
#define MISSING_FP_ARG(f)
 
std::vector< FAB_LAYER_COLOR > dummy
 
wxString result
Test unit parsing edge cases and error handling.
 
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
 
@ PCB_ZONE_T
class ZONE, a copper pour area
 
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
 
@ PCB_PAD_T
class PAD, a pad in a footprint