66 wxLogWarning( wxT(
"Attempting to call fromTo() with non-existent from-to cache." ) );
80#define MISSING_LAYER_ARG( f ) wxString::Format( _( "Missing layer name argument to %s." ), f )
95 if( !arg || arg->
AsString().IsEmpty() )
104 [item, arg, aCtx]() ->
double
106 const wxString& layerName = arg->
AsString();
115 bool anyMatch =
false;
117 for(
unsigned ii = 0; ii < layerMap.GetCount(); ++ii )
119 wxPGChoiceEntry& entry = layerMap[ ii ];
121 if( entry.GetText().Matches( layerName ))
132 aCtx->
ReportError( wxString::Format(
_(
"Unrecognized layer '%s'" ),
147 std::shared_lock<std::shared_mutex> readLock( board->
m_CachesMutex );
152 return ( item->
GetLayerSet() & i->second ).any() ? 1.0 : 0.0;
157 for(
unsigned ii = 0; ii < layerMap.GetCount(); ++ii )
159 wxPGChoiceEntry& entry = layerMap[ ii ];
161 if( entry.GetText().Matches( layerName ) )
166 std::unique_lock<std::shared_mutex> writeLock( board->
m_CachesMutex );
170 return ( item->
GetLayerSet() & mask ).any() ? 1.0 : 0.0;
214 if(
ZONE* zone =
dynamic_cast<ZONE*
>( aItem ) )
215 aItemShape.reset( zone->GetBoardOutline().Clone() );
220 return footprintCourtyard.
Collide( aItemShape.get() );
233 if( aSelector.IsEmpty() )
237 if( aSelector[0] ==
'$' && aSelector.Last() ==
'}' && aSelector.Upper().StartsWith( wxT(
"${CLASS:" ) ) )
239 wxString
name = aSelector.Mid( 8, aSelector.Length() - 9 );
250 else if( aSelector.Find(
':' ) != wxNOT_FOUND && aFp->
GetFPIDAsString().Matches( aSelector ) )
268 const std::function<
bool(
FOOTPRINT* )>& aFunc )
270 if( aArg == wxT(
"A" ) )
273 return fp && aFunc( fp );
275 else if( aArg == wxT(
"B" ) )
278 return fp && aFunc( fp );
290 if( testFootprintSelector( fp, aArg ) && aFunc( fp ) )
303#define MISSING_FP_ARG( f ) \
304 wxString::Format( _( "Missing footprint argument (A, B, or reference designator) to %s." ), f )
315 if( !arg || arg->
AsString().IsEmpty() )
330 [item, arg, context]() ->
double
334 const wxString selector = arg->
AsString();
340 bool memoize = !transient && selector != wxT(
"A" ) && selector != wxT(
"B" );
347 return whole ? 1.0 : 0.0;
349 std::shared_ptr<SHAPE> itemShape;
391 if( !arg || arg->
AsString().IsEmpty() )
406 [item, arg, context]() ->
double
410 const wxString selector = arg->
AsString();
413 bool memoize = !transient && selector != wxT(
"A" ) && selector != wxT(
"B" );
420 return whole ? 1.0 : 0.0;
422 std::shared_ptr<SHAPE> itemShape;
446 return res ? 1.0 : 0.0;
460 if( !arg || arg->
AsString().IsEmpty() )
475 [item, arg, context]() ->
double
479 const wxString selector = arg->
AsString();
482 bool memoize = !transient && selector != wxT(
"A" ) && selector != wxT(
"B" );
489 return whole ? 1.0 : 0.0;
491 std::shared_ptr<SHAPE> itemShape;
515 return res ? 1.0 : 0.0;
524 std::shared_lock<std::shared_mutex> readLock( aBoard->
m_CachesMutex );
539 std::unique_lock<std::shared_mutex> writeLock( aBoard->
m_CachesMutex );
585 aCtx->
ReportError(
_(
"Footprint's courtyard is not a single, closed shape." ) );
597 aCtx->
ReportError(
_(
"Footprint has no front courtyard." ) );
612 aCtx->
ReportError(
_(
"Footprint has no back courtyard." ) );
625 ZONE* zone =
static_cast<ZONE*
>( aItem );
651 const std::function<
bool(
ZONE* )>& aFunc )
653 if( aArg == wxT(
"A" ) )
655 return aFunc(
dynamic_cast<ZONE*
>( aCtx->
GetItem( 0 ) ) );
657 else if( aArg == wxT(
"B" ) )
659 return aFunc(
dynamic_cast<ZONE*
>( aCtx->
GetItem( 1 ) ) );
668 auto it = cache.find( target );
670 if( it != cache.end() && it->second->Type() ==
PCB_ZONE_T )
671 return aFunc(
static_cast<ZONE*
>( it->second ) );
679 std::vector<ZONE*> matchingZones;
680 bool cacheHit =
false;
683 std::shared_lock<std::shared_mutex> readLock( aBoard->
m_CachesMutex );
688 matchingZones = it->second;
697 if( area->GetZoneName().Matches( aArg ) )
698 matchingZones.push_back( area );
703 for(
ZONE* area : footprint->Zones() )
705 if( area->GetZoneName().Matches( aArg ) )
706 matchingZones.push_back( area );
712 std::unique_lock<std::shared_mutex> writeLock( aBoard->
m_CachesMutex );
717 for(
ZONE* area : matchingZones )
744 m_item->SetLayerSet(
m_item->GetLayerSet().set( aLayer ) );
753#define MISSING_AREA_ARG( f ) \
754 wxString::Format( _( "Missing rule-area argument (A, B, or rule-area name) to %s." ), f )
765 if( !arg || arg->
AsString().IsEmpty() )
780 [item, arg, context]() ->
double
785 const wxString selector = arg->
AsString();
788 bool memoize = !transient && selector != wxT(
"A" ) && selector != wxT(
"B" );
795 return whole ? 1.0 : 0.0;
802 if( !aArea || aArea == item || aArea->
GetParent() == item )
813 scopedLayerSet.
Add( aLayer );
819 if( !commonLayers.any() )
828 testLayers.
set( aLayer );
830 testLayers = commonLayers;
833 std::vector<PCB_LAYER_ID> layersToCompute;
849 layersToCompute.push_back( layer );
856 layersToCompute.push_back( layer );
859 bool anyCollision =
false;
879 return res ? 1.0 : 0.0;
893 if( !arg || arg->
AsString().IsEmpty() )
908 [item, arg, context]() ->
double
914 const wxString selector = arg->
AsString();
917 bool memoize = !transient && selector != wxT(
"A" ) && selector != wxT(
"B" );
924 return whole ? 1.0 : 0.0;
931 if( !aArea || aArea == item || aArea->
GetParent() == item )
953 bool enclosedByArea =
false;
957 itemShape =
static_cast<ZONE*
>( item )->GetBoardOutline();
977 enclosedByArea =
false;
984 enclosedByArea = itemShape.
IsEmpty();
990 return enclosedByArea;
996 return res ? 1.0 : 0.0;
1001#define MISSING_GROUP_ARG( f ) \
1002 wxString::Format( _( "Missing group name argument to %s." ), f )
1012 if( !arg || arg->
AsString().IsEmpty() )
1027 [item, arg]() ->
double
1039 group =
group->AsEdaItem()->GetParentGroup();
1047#define MISSING_SHEET_ARG( f ) \
1048 wxString::Format( _( "Missing sheet name argument to %s." ), f )
1058 if( !arg || arg->
AsString().IsEmpty() )
1073 [item, arg]() ->
double
1084 wxString refName = arg->
AsString();
1086 if( sheetName.EndsWith( wxT(
"/" ) ) )
1087 sheetName.RemoveLast();
1088 if( refName.EndsWith( wxT(
"/" ) ) )
1089 refName.RemoveLast();
1091 if( sheetName.Matches( refName ) )
1094 if( ( refName.Matches( wxT(
"/" ) ) || refName.IsEmpty() )
1095 && sheetName.IsEmpty() )
1113 if( !arg || arg->
AsString().IsEmpty() )
1128 [item, arg]() ->
double
1139 wxString refName = arg->
AsString();
1141 if( sheetName.EndsWith( wxT(
"/" ) ) )
1142 sheetName.RemoveLast();
1143 if( refName.EndsWith( wxT(
"/" ) ) )
1144 refName.RemoveLast();
1146 wxArrayString sheetPath = wxSplit( sheetName,
'/' );
1147 wxArrayString refPath = wxSplit( refName,
'/' );
1149 if( refPath.size() > sheetPath.size() )
1152 if( ( refName.Matches( wxT(
"/" ) ) || refName.IsEmpty() ) && sheetName.IsEmpty() )
1157 for(
size_t i = 0; i < refPath.size(); i++ )
1159 if( !sheetPath[i].Matches( refPath[i] ) )
1168#define MISSING_REF_ARG( f ) \
1169 wxString::Format( _( "Missing footprint argument (reference designator) to %s." ), f )
1179 if( !arg || arg->
AsString().IsEmpty() )
1194 [item, arg]() ->
double
1259 if(
via->IsBlindVia() ||
via->IsBuriedVia() )
1276 [a, b, context]() ->
double
1283 wxString coupledNet;
1298 if( board->FindNet( coupledNet ) )
1311#define MISSING_DP_ARG( f ) \
1312 wxString::Format( _( "Missing diff-pair name argument to %s." ), f )
1324 if( !argv || argv->
AsString().IsEmpty() )
1336 [item, argv]() ->
double
1347 wxString baseName, coupledNet;
1352 if( baseName.Matches( arg ) )
1355 if( baseName.EndsWith(
"_" ) && baseName.BeforeLast(
'_' ).Matches( arg ) )
1375 if( !argv || argv->
AsString().IsEmpty() )
1379 _(
"Missing argument to '%s'" ), wxT(
"inNetChain()" ) ) );
1388 [item, argv]() ->
double
1399 const wxString& chainName = netinfo->
GetNetChain();
1401 if( chainName.IsEmpty() )
1406 return chainName.Matches( arg ) ? 1.0 : 0.0;
1432 return ( netinfo && !netinfo->
GetNetChain().IsEmpty() ) ? 1.0 : 0.0;
1447 if( !argv || argv->
AsString().IsEmpty() )
1451 _(
"Missing argument to '%s'" ), wxT(
"inNetChainClass()" ) ) );
1460 [item, argv]() ->
double
1471 const wxString& chainName = netinfo->
GetNetChain();
1473 if( chainName.IsEmpty() )
1478 std::shared_ptr<NET_SETTINGS> ns = board->GetDesignSettings().m_NetSettings;
1482 const wxString& className = ns->GetNetChainClass( chainName );
1484 if( className.IsEmpty() )
1489 return className.Matches( arg ) ? 1.0 : 0.0;
1512 aCtx->
ReportError( wxString::Format(
_(
"Missing field name argument to %s." ),
1513 wxT(
"getField()" ) ) );
1523 [item, arg]() -> wxString
1529 const wxString& fieldName = arg->
AsString();
1540 wxString
text = field ? field->
GetText() : wxString();
1561 if( !arg || arg->
AsString().IsEmpty() )
1564 aCtx->
ReportError(
_(
"Missing netclass name argument to hasNetclass()" ) );
1576 [item, arg]() ->
double
1600 if( !arg || arg->
AsString().IsEmpty() )
1603 aCtx->
ReportError(
_(
"Missing netclass name argument to hasExactNetclass()" ) );
1615 [item, arg]() ->
double
1622 wxString netclassName;
1626 std::shared_lock<std::shared_mutex> readLock( board->
m_CachesMutex );
1631 netclassName = it->second;
1634 if( netclassName.empty() )
1639 netclassName = netclass->
GetName();
1643 std::unique_lock<std::shared_mutex> writeLock( board->
m_CachesMutex );
1648 return ( netclassName == arg->
AsString() ) ? 1.0 : 0.0;
1661 if( !arg || arg->
AsString().IsEmpty() )
1664 aCtx->
ReportError(
_(
"Missing component class name argument to hasComponentClass()" ) );
1676 [item, arg]() ->
double
1681 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.
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
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_FIELD_CACHE_KEY, wxString > m_ItemFieldCache
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.
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.
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
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.
SHAPE_POLY_SET CloneDropTriangulation() const
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()
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)
#define MISSING_LAYER_ARG(f)
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)
#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)
static void inNetChainFunc(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 hasNetChainFunc(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 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