63 if( !argFrom || argFrom->
AsString().IsEmpty() )
67 aCtx->
ReportError( wxString::Format(
_(
"Missing 'from' pad argument (footprint reference designator "
68 "followed by hyphen and pad number) to %s." ),
69 wxT(
"fromTo()" ) ) );
75 if( !argTo || argTo->
AsString().IsEmpty() )
79 aCtx->
ReportError( wxString::Format(
_(
"Missing 'to' pad argument (footprint reference designator "
80 "followed by hyphen and pad number) to %s." ),
81 wxT(
"fromTo()" ) ) );
91 wxLogWarning( wxT(
"Attempting to call fromTo() with non-existent from-to cache." ) );
115 if( !arg || arg->
AsString().IsEmpty() )
119 aCtx->
ReportError( wxString::Format(
_(
"Missing layer name argument to %s." ),
120 wxT(
"existsOnLayer()" ) ) );
127 [item, arg, aCtx]() ->
double
129 const wxString& layerName = arg->
AsString();
138 bool anyMatch =
false;
140 for(
unsigned ii = 0; ii < layerMap.GetCount(); ++ii )
142 wxPGChoiceEntry& entry = layerMap[ ii ];
144 if( entry.GetText().Matches( layerName ))
155 aCtx->
ReportError( wxString::Format(
_(
"Unrecognized layer '%s'" ),
170 std::shared_lock<std::shared_mutex> readLock( board->
m_CachesMutex );
175 return ( item->
GetLayerSet() & i->second ).any() ? 1.0 : 0.0;
180 for(
unsigned ii = 0; ii < layerMap.GetCount(); ++ii )
182 wxPGChoiceEntry& entry = layerMap[ ii ];
184 if( entry.GetText().Matches( layerName ) )
189 std::unique_lock<std::shared_mutex> writeLock( board->
m_CachesMutex );
193 return ( item->
GetLayerSet() & mask ).any() ? 1.0 : 0.0;
235 return footprintCourtyard.
Collide( aItemShape.get() );
237 else if(
ZONE* zone =
dynamic_cast<ZONE*
>( aItem ) )
244 if( zone->GetParentFootprint() )
245 zoneOutlineStorage = zone->GetBoardOutline();
249 return footprintCourtyard.
Collide( zoneOutline );
267 if( aSelector.IsEmpty() )
271 if( aSelector[0] ==
'$' && aSelector.Last() ==
'}' && aSelector.Upper().StartsWith( wxT(
"${CLASS:" ) ) )
273 wxString
name = aSelector.Mid( 8, aSelector.Length() - 9 );
284 else if( aSelector.Find(
':' ) != wxNOT_FOUND && aFp->
GetFPIDAsString().Matches( aSelector ) )
303 if( aArg == wxT(
"A" ) )
306 return fp && aFunc( fp );
308 else if( aArg == wxT(
"B" ) )
311 return fp && aFunc( fp );
323 if( testFootprintSelector( fp, aArg ) && aFunc( fp ) )
336#define MISSING_FP_ARG( f ) \
337 wxString::Format( _( "Missing footprint argument (A, B, or reference designator) to %s." ), f )
348 if( !arg || arg->
AsString().IsEmpty() )
363 [item, arg, context]() ->
double
367 const wxString selector = arg->
AsString();
373 bool memoize = !transient && selector != wxT(
"A" ) && selector != wxT(
"B" );
380 return whole ? 1.0 : 0.0;
382 std::shared_ptr<SHAPE> itemShape;
424 if( !arg || arg->
AsString().IsEmpty() )
439 [item, arg, context]() ->
double
443 const wxString selector = arg->
AsString();
446 bool memoize = !transient && selector != wxT(
"A" ) && selector != wxT(
"B" );
453 return whole ? 1.0 : 0.0;
455 std::shared_ptr<SHAPE> itemShape;
479 return res ? 1.0 : 0.0;
493 if( !arg || arg->
AsString().IsEmpty() )
508 [item, arg, context]() ->
double
512 const wxString selector = arg->
AsString();
515 bool memoize = !transient && selector != wxT(
"A" ) && selector != wxT(
"B" );
522 return whole ? 1.0 : 0.0;
524 std::shared_ptr<SHAPE> itemShape;
548 return res ? 1.0 : 0.0;
557 std::shared_lock<std::shared_mutex> readLock( aBoard->
m_CachesMutex );
572 std::unique_lock<std::shared_mutex> writeLock( aBoard->
m_CachesMutex );
618 aCtx->
ReportError(
_(
"Footprint's courtyard is not a single, closed shape." ) );
630 aCtx->
ReportError(
_(
"Footprint has no front courtyard." ) );
645 aCtx->
ReportError(
_(
"Footprint has no back courtyard." ) );
657 ZONE* zone =
static_cast<ZONE*
>( aItem );
666 if( zoneRTree->QueryColliding( areaBBox, &areaOutline, aLayer ) )
671 std::unique_ptr<DRC_RTREE> rtree = std::make_unique<DRC_RTREE>();
675 if( rtree->QueryColliding( areaBBox, &areaOutline, aLayer ) )
692 return areaOutline.
Collide( zonePoly );
706 const std::function<
bool(
ZONE* )>& aFunc )
708 if( aArg == wxT(
"A" ) )
710 return aFunc(
dynamic_cast<ZONE*
>( aCtx->
GetItem( 0 ) ) );
712 else if( aArg == wxT(
"B" ) )
714 return aFunc(
dynamic_cast<ZONE*
>( aCtx->
GetItem( 1 ) ) );
723 auto it = cache.find( target );
725 if( it != cache.end() && it->second->Type() ==
PCB_ZONE_T )
726 return aFunc(
static_cast<ZONE*
>( it->second ) );
734 std::vector<ZONE*> matchingZones;
735 bool cacheHit =
false;
738 std::shared_lock<std::shared_mutex> readLock( aBoard->
m_CachesMutex );
743 matchingZones = it->second;
752 if( area->GetZoneName().Matches( aArg ) )
753 matchingZones.push_back( area );
758 for(
ZONE* area : footprint->Zones() )
760 if( area->GetZoneName().Matches( aArg ) )
761 matchingZones.push_back( area );
767 std::unique_lock<std::shared_mutex> writeLock( aBoard->
m_CachesMutex );
772 for(
ZONE* area : matchingZones )
799 m_item->SetLayerSet(
m_item->GetLayerSet().set( aLayer ) );
808#define MISSING_AREA_ARG( f ) \
809 wxString::Format( _( "Missing rule-area argument (A, B, or rule-area name) to %s." ), f )
820 if( !arg || arg->
AsString().IsEmpty() )
840 [item, arg, context, aForKeepout]() ->
double
845 const wxString selector = arg->
AsString();
854 bool memoize = !transient && selector != wxT(
"A" ) && selector != wxT(
"B" );
857 if( memoize && resultsCache.Get( { item, selector, aLayer, context->GetConstraint() }, whole ) )
858 return whole ? 1.0 : 0.0;
865 if( !aArea || aArea == item || aArea->
GetParent() == item )
876 scopedLayerSet.
Add( aLayer );
882 if( !commonLayers.any() )
891 testLayers.
set( aLayer );
893 testLayers = commonLayers;
896 std::vector<PCB_LAYER_ID> layersToCompute;
904 if( intersectsCache.Get( { aArea, item, layer }, cached ) )
911 layersToCompute.push_back( layer );
918 layersToCompute.push_back( layer );
921 bool anyCollision =
false;
925 bool collides =
collidesWithArea( item, layer, context, aArea, aForKeepout );
928 intersectsCache.Set( { aArea, item, layer }, collides );
938 resultsCache.Set( { item, selector, aLayer, context->
GetConstraint() },
res );
940 return res ? 1.0 : 0.0;
966 if( !arg || arg->
AsString().IsEmpty() )
981 [item, arg, context]() ->
double
987 const wxString selector = arg->
AsString();
990 bool memoize = !transient && selector != wxT(
"A" ) && selector != wxT(
"B" );
996 return whole ? 1.0 : 0.0;
1003 if( !aArea || aArea == item || aArea->
GetParent() == item )
1016 bool cached =
false;
1025 bool enclosedByArea =
false;
1029 itemShape =
static_cast<ZONE*
>( item )->GetBoardOutline();
1049 enclosedByArea =
false;
1060 areaOutline = aArea->
Outline();
1065 enclosedByArea = itemShape.
IsEmpty();
1071 return enclosedByArea;
1077 return res ? 1.0 : 0.0;
1090 if( !arg || arg->
AsString().IsEmpty() )
1094 aCtx->
ReportError( wxString::Format(
_(
"Missing group name argument to %s." ),
1095 wxT(
"memberOfGroup()" ) ) );
1108 [item, arg]() ->
double
1120 group =
group->AsEdaItem()->GetParentGroup();
1128#define MISSING_SHEET_ARG( f ) \
1129 wxString::Format( _( "Missing sheet name argument to %s." ), f )
1139 if( !arg || arg->
AsString().IsEmpty() )
1154 [item, arg]() ->
double
1165 wxString refName = arg->
AsString();
1167 if( sheetName.EndsWith( wxT(
"/" ) ) )
1168 sheetName.RemoveLast();
1169 if( refName.EndsWith( wxT(
"/" ) ) )
1170 refName.RemoveLast();
1172 if( sheetName.Matches( refName ) )
1175 if( ( refName.Matches( wxT(
"/" ) ) || refName.IsEmpty() )
1176 && sheetName.IsEmpty() )
1194 if( !arg || arg->
AsString().IsEmpty() )
1209 [item, arg]() ->
double
1220 wxString refName = arg->
AsString();
1222 if( sheetName.EndsWith( wxT(
"/" ) ) )
1223 sheetName.RemoveLast();
1224 if( refName.EndsWith( wxT(
"/" ) ) )
1225 refName.RemoveLast();
1227 wxArrayString sheetPath = wxSplit( sheetName,
'/' );
1228 wxArrayString refPath = wxSplit( refName,
'/' );
1230 if( refPath.size() > sheetPath.size() )
1233 if( ( refName.Matches( wxT(
"/" ) ) || refName.IsEmpty() )
1234 && sheetName.IsEmpty() )
1239 for(
size_t i = 0; i < refPath.size(); i++ )
1241 if( !sheetPath[i].Matches( refPath[i] ) )
1258 if( !arg || arg->
AsString().IsEmpty() )
1262 aCtx->
ReportError( wxString::Format(
_(
"Missing footprint argument (reference designator) to %s." ),
1263 wxT(
"memberOfFootprint()" ) ) );
1276 [item, arg]() ->
double
1347 std::shared_lock<std::shared_mutex> readLock( board->
m_CachesMutex );
1358 std::set<const PCB_VIA*> stacked;
1361 stacked.insert( column.begin(), column.end() );
1364 std::unique_lock<std::shared_mutex> writeLock( board->
m_CachesMutex );
1368 if( stacked.count(
via ) )
1385 if(
via->IsBlindVia() ||
via->IsBuriedVia() )
1402 [a, b, context]() ->
double
1409 wxString coupledNet;
1424 if( board->FindNet( coupledNet ) )
1447 if( !argv || argv->
AsString().IsEmpty() )
1451 aCtx->
ReportError( wxString::Format(
_(
"Missing diff-pair name argument to %s." ),
1452 wxT(
"inDiffPair()" ) ) );
1462 [item, argv]() ->
double
1473 wxString baseName, coupledNet;
1478 if( baseName.Matches( arg ) )
1481 if( baseName.EndsWith(
"_" ) && baseName.BeforeLast(
'_' ).Matches( arg ) )
1501 if( !argv || argv->
AsString().IsEmpty() )
1505 aCtx->
ReportError( wxString::Format(
_(
"Missing net-chain name argument to %s" ),
1506 wxT(
"inNetChain()" ) ) );
1516 [item, argv]() ->
double
1526 const wxString& chainName = netinfo->
GetNetChain();
1528 if( chainName.IsEmpty() )
1533 return chainName.Matches( arg ) ? 1.0 : 0.0;
1558 return ( netinfo && !netinfo->
GetNetChain().IsEmpty() ) ? 1.0 : 0.0;
1573 if( !argv || argv->
AsString().IsEmpty() )
1577 aCtx->
ReportError( wxString::Format(
_(
"Missing netclass name argument to %s" ),
1578 wxT(
"inNetChainClass()" ) ) );
1588 [item, argv]() ->
double
1598 const wxString& chainName = netinfo->
GetNetChain();
1600 if( chainName.IsEmpty() )
1605 std::shared_ptr<NET_SETTINGS> ns = board->GetDesignSettings().m_NetSettings;
1609 const wxString& className = ns->GetNetChainClass( chainName );
1611 if( className.IsEmpty() )
1616 return className.Matches( arg ) ? 1.0 : 0.0;
1635 if( !arg || arg->
AsString().IsEmpty() )
1639 aCtx->
ReportError( wxString::Format(
_(
"Missing field name argument to %s." ),
1640 wxT(
"getField()" ) ) );
1650 [item, arg]() -> wxString
1656 const wxString& fieldName = arg->
AsString();
1667 wxString
text = field ? field->
GetText() : wxString();
1688 if( !arg || arg->
AsString().IsEmpty() )
1692 aCtx->
ReportError( wxString::Format(
_(
"Missing netclass name argument to %s." ),
1693 wxT(
"hasNetclass()" ) ) );
1706 [item, arg]() ->
double
1730 if( !arg || arg->
AsString().IsEmpty() )
1734 aCtx->
ReportError( wxString::Format(
_(
"Missing netclass name argument to %s." ),
1735 wxT(
"hasExactNetclass()" ) ) );
1748 [item, arg]() ->
double
1755 wxString netclassName;
1759 std::shared_lock<std::shared_mutex> readLock( board->
m_CachesMutex );
1764 netclassName = it->second;
1767 if( netclassName.empty() )
1772 netclassName = netclass->
GetName();
1776 std::unique_lock<std::shared_mutex> writeLock( board->
m_CachesMutex );
1781 return ( netclassName == arg->
AsString() ) ? 1.0 : 0.0;
1794 if( !arg || arg->
AsString().IsEmpty() )
1798 aCtx->
ReportError( wxString::Format(
_(
"Missing component class name argument to %s." ),
1799 wxT(
"hasComponentClass()" ) ) );
1812 [item, arg]() ->
double
1817 footprint =
static_cast<FOOTPRINT*
>( item );
1848 aCtx->
ReportError( wxString::Format(
_(
"Missing property name argument to %s." ),
1849 wxT(
"customProperty()" ) ) );
1859 [item, arg]() -> wxString
1861 const wxString key = arg->
AsString();
1869 if( parentFp->GetCustomProperty( key, value ) )
1892 aCtx->
ReportError( wxString::Format(
_(
"Missing property name argument to %s." ),
1893 wxT(
"hasCustomProperty()" ) ) );
1903 [item, arg]() ->
double
1905 const wxString key = arg->
AsString();
1913 if( parentFp->GetCustomProperty( key, value ) )
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 std::shared_ptr< SHAPE_SEGMENT > GetEffectiveHoleShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, DRC_CONSTRAINT_T aUsage=NULL_CONSTRAINT) const
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 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 > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT, DRC_CONSTRAINT_T aUsage=NULL_CONSTRAINT) const
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
Information pertinent to a Pcbnew printed circuit board.
SHARDED_CACHE< PTR_PTR_LAYER_CACHE_KEY, bool > m_IntersectsAreaCache
SHARDED_CACHE< ITEM_SELECTOR_LAYER_CACHE_KEY, bool > m_IntersectsCourtyardResultCache
std::unordered_map< const BOARD_ITEM *, wxString > m_ItemNetclassCache
SHARDED_CACHE< PTR_PTR_LAYER_CACHE_KEY, bool > m_EnclosedByAreaCache
SHARDED_CACHE< ITEM_SELECTOR_LAYER_CACHE_KEY, bool > m_EnclosedByAreaResultCache
SHARDED_CACHE< PTR_PTR_CACHE_KEY, bool > m_IntersectsBCourtyardCache
NETINFO_ITEM * FindNet(int aNetcode) const
Search for a net with the given netcode.
const ZONES & Zones() const
SHARDED_CACHE< PTR_PTR_CACHE_KEY, bool > m_IntersectsCourtyardCache
SHARDED_CACHE< PTR_PTR_LAYER_CACHE_KEY, bool > m_IntersectsKeepoutCache
const FOOTPRINTS & Footprints() const
std::unordered_map< wxString, LSET > m_LayerExpressionCache
SHARDED_CACHE< PTR_PTR_CACHE_KEY, bool > m_IntersectsFCourtyardCache
std::unordered_map< const ZONE *, SHAPE_POLY_SET > m_DeflatedZoneOutlineCache
SHARDED_CACHE< ITEM_SELECTOR_LAYER_CACHE_KEY, bool > m_IntersectsFCourtyardResultCache
SHARDED_CACHE< ITEM_SELECTOR_LAYER_CACHE_KEY, bool > m_IntersectsKeepoutResultCache
SHARDED_CACHE< ITEM_FIELD_CACHE_KEY, wxString > m_ItemFieldCache
std::optional< std::set< const PCB_VIA * > > m_StackedMicroviaCache
SHARDED_CACHE< ITEM_SELECTOR_LAYER_CACHE_KEY, bool > m_IntersectsAreaResultCache
std::unordered_map< ZONE *, std::unique_ptr< DRC_RTREE > > m_CopperZoneRTreeCache
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
std::shared_mutex m_CachesMutex
std::shared_ptr< const FOOTPRINT_COURTYARD_INDEX > GetFootprintCourtyardIndex()
Return a spatial index of footprint courtyards, building it on first use.
const std::unordered_map< KIID, BOARD_ITEM * > & GetItemByIdCache() const
std::unordered_map< wxString, std::vector< ZONE * > > m_ZonesByNameCache
SHARDED_CACHE< ITEM_SELECTOR_LAYER_CACHE_KEY, bool > m_IntersectsBCourtyardResultCache
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.
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.
bool GetCustomProperty(const wxString &aKey, wxString &aValue) const
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.
LSEQ UIOrder() const
Return the copper, technical and user layers in the order shown in layer widget.
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 & GetNetChain() const
const wxString & GetNetname() const
PAD_ATTRIB GetAttribute() const
PCBEXPR_BUILTIN_FUNCTIONS()
void RegisterAllFunctions()
std::map< wxString, LIBEVAL::FUNC_CALL_REF > m_funcs
void RegisterFunc(const wxString &funcSignature, LIBEVAL::FUNC_CALL_REF funcPtr, bool aIsGeometryDependent=false)
int GetConstraint() const
PCB_LAYER_ID GetLayer() const
BOARD_ITEM * GetItem(int index) const
BOARD_ITEM * GetObject(const LIBEVAL::CONTEXT *aCtx) const
static std::vector< std::vector< PCB_VIA * > > CollectMicroviaColumns(BOARD *aBoard)
Runs of microvias that land on one another, each ordered from its outermost hop down.
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 IsEmpty() const
Return true if the set is empty (no polygons at all)
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.
void BooleanSubtract(const SHAPE_POLY_SET &b)
Perform boolean polyset difference.
const BOX2I BBox(int aClearance=0) const override
Compute a bounding box of the shape, with a margin of aClearance a collision.
bool Get(const KEY &aKey, VALUE &aValue) const
Look up a key. Returns false on a miss and leaves aValue untouched.
void Set(const KEY &aKey, const VALUE &aValue)
Handle a list of polygons defining a copper zone.
const BOX2I GetBoundingBox() const override
SHAPE_POLY_SET * Outline()
SHAPE_POLY_SET GetBoardOutline() const
virtual bool IsOnLayer(PCB_LAYER_ID) const override
Test to see if this object is on the given layer.
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
@ NET_CHAIN_LENGTH_CONSTRAINT
@ SILK_CLEARANCE_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
bool IsFrontLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a front layer.
bool IsBackLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a back layer.
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)
static SHAPE_POLY_SET getDeflatedZoneOutline(BOARD *aBoard, ZONE *aArea)
static void intersectsBackCourtyardFunc(LIBEVAL::CONTEXT *aCtx, void *self)
static void memberOfGroupFunc(LIBEVAL::CONTEXT *aCtx, void *self)
static bool searchFootprintsNearItem(BOARD *aBoard, const wxString &aArg, PCBEXPR_CONTEXT *aCtx, BOARD_ITEM *aItem, const std::function< bool(FOOTPRINT *)> &aFunc)
bool collidesWithArea(BOARD_ITEM *aItem, PCB_LAYER_ID aLayer, PCBEXPR_CONTEXT *aCtx, ZONE *aArea, bool aForKeepout)
#define MISSING_AREA_ARG(f)
static void isCoupledDiffPairFunc(LIBEVAL::CONTEXT *aCtx, void *self)
static void doIntersectsAreaFunc(LIBEVAL::CONTEXT *aCtx, void *self, bool aForKeepout)
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)
static void hasCustomPropertyFunc(LIBEVAL::CONTEXT *aCtx, void *self)
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)
static void intersectsKeepoutFunc(LIBEVAL::CONTEXT *aCtx, void *self)
static void inNetChainFunc(LIBEVAL::CONTEXT *aCtx, void *self)
static void enclosedByAreaFunc(LIBEVAL::CONTEXT *aCtx, void *self)
static void customPropertyFunc(LIBEVAL::CONTEXT *aCtx, void *self)
static void memberOfSheetOrChildrenFunc(LIBEVAL::CONTEXT *aCtx, void *self)
static void memberOfFootprintFunc(LIBEVAL::CONTEXT *aCtx, void *self)
static void hasNetChainFunc(LIBEVAL::CONTEXT *aCtx, void *self)
static void isMicroVia(LIBEVAL::CONTEXT *aCtx, void *self)
static void getFieldFunc(LIBEVAL::CONTEXT *aCtx, void *self)
static void hasNetclassFunc(LIBEVAL::CONTEXT *aCtx, void *self)
bool fromToFunc(LIBEVAL::CONTEXT *aCtx, void *self)
static void isStackedViaFunc(LIBEVAL::CONTEXT *aCtx, void *self)
static void intersectsCourtyardFunc(LIBEVAL::CONTEXT *aCtx, void *self)
static void inNetChainClassFunc(LIBEVAL::CONTEXT *aCtx, void *self)
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