61 virtual bool Run()
override;
63 virtual const wxString
GetName()
const override {
return wxT(
"library_parity" ); };
72#define TEST( a, b, msg ) \
78 if( aReporter && wxString( msg ).length() ) \
79 aReporter->Report( msg ); \
82 if( diff && !aReporter ) \
87#define TEST_PT( a, b, msg ) \
89 if( abs( a.x - b.x ) > EPSILON \
90 || abs( a.y - b.y ) > EPSILON ) \
94 if( aReporter && wxString( msg ).length() ) \
95 aReporter->Report( msg ); \
98 if( diff && !aReporter ) \
102#define EPSILON_D 0.000010
103#define TEST_D( a, b, msg ) \
105 if( abs( a - b ) > EPSILON_D ) \
109 if( aReporter && wxString( msg ).length() ) \
110 aReporter->Report( msg ); \
113 if( diff && !aReporter ) \
117#define ITEM_DESC( item ) ( item )->GetItemDescription( &g_unitsProvider, true )
118#define PAD_DESC( pad ) wxString::Format( _( "Pad %s" ), ( pad )->GetNumber() )
136 bool aAllowCuExpansion )
138 if( !aAllowCuExpansion )
140 return aItem == bLib;
145 const LSET aNonCu = aItem & nonCuMask;
146 const LSET bNonCu = bLib & nonCuMask;
148 if( aNonCu != bNonCu )
163 const LSET missingInnerInA = bInner & ~aInner;
164 if( missingInnerInA.count() )
172 const std::shared_ptr<PCB_SHAPE>& b )
177 TEST( a->GetShape(), b->GetShape(),
"" );
179 switch( a->GetShape() )
183 BOX2I aRect( a->GetStart(), a->GetEnd() - a->GetStart() );
184 BOX2I bRect( b->GetStart(), b->GetEnd() - b->GetStart() );
196 TEST_PT( a->GetStart(), b->GetStart(),
"" );
197 TEST_PT( a->GetEnd(), b->GetEnd(),
"" );
201 TEST_PT( a->GetStart(), b->GetStart(),
"" );
202 TEST_PT( a->GetEnd(), b->GetEnd(),
"" );
206 if( ( a->GetArcMid() - b->GetArcMid() ).EuclideanNorm() >
pcbIUScale.mmToIU( 0.0005 ) )
212 TEST_PT( a->GetStart(), b->GetStart(),
"" );
213 TEST_PT( a->GetEnd(), b->GetEnd(),
"" );
214 TEST_PT( a->GetBezierC1(), b->GetBezierC1(),
"" );
215 TEST_PT( a->GetBezierC2(), b->GetBezierC2(),
"" );
220 TEST( a->GetPolyShape().TotalVertices(), b->GetPolyShape().TotalVertices(),
"" );
222 for(
int poly = 0; poly < static_cast<int>( a->GetPolyShape().CPolygons().size() ); poly++ )
227 if( aPolygon.size() == 0 || bPolygon.size() == 0
228 || !aPolygon[0].CompareGeometry( bPolygon[0],
true,
EPSILON ) )
242 TEST( a->GetStroke(), b->GetStroke(),
"" );
243 TEST( a->GetFillMode(), b->GetFillMode(),
"" );
253#define REPORT_MSG( s, p ) aReporter.Report( wxString::Format( s, p ) )
325 wxString::Format(
_(
"%s pad to die length differs." ),
PAD_DESC( a ) ) );
327 wxString::Format(
_(
"%s position differs." ),
PAD_DESC( a ) ) );
330 wxString::Format(
_(
"%s has different numbers." ),
PAD_DESC( a ) ) );
342 bool allowExpansion =
false;
346 if( layerSettingsDiffer
354 aReporter->
Report( wxString::Format(
_(
"%s layers differ." ),
PAD_DESC( a ) ) );
360 wxString::Format(
_(
"%s pad type differs." ),
PAD_DESC( a ) ) );
362 wxString::Format(
_(
"%s fabrication property differs." ),
PAD_DESC( a ) ) );
367 wxString::Format(
_(
"%s orientation differs." ),
PAD_DESC( a ) ) );
378 wxString::Format(
_(
"%s pad shape type differs on layer %s." ),
383 wxString::Format(
_(
"%s size differs on layer %s." ),
388 wxString::Format(
_(
"%s trapezoid delta differs on layer %s." ),
396 wxString::Format(
_(
"%s rounded corners differ on layer %s." ),
405 wxString::Format(
_(
"%s chamfered corner sizes differ on layer %s." ),
411 wxString::Format(
_(
"%s chamfered corners differ on layer %s." ),
417 wxString::Format(
_(
"%s shape offset from hole differs on layer %s." ),
423 wxString::Format(
_(
"%s drill shape differs." ),
PAD_DESC( a ) ) );
425 wxString::Format(
_(
"%s drill size differs." ),
PAD_DESC( a ) ) );
440 bool primitivesDiffer =
false;
448 primitivesDiffer =
true;
452 for(
size_t ii = 0; ii < a->
GetPrimitives( aLayer ).size(); ++ii )
457 primitivesDiffer =
true;
464 firstDifferingLayer = aLayer;
468 if( primitivesDiffer )
471 layerName = board ? board->
GetLayerName( firstDifferingLayer )
476 aReporter->
Report( wxString::Format(
_(
"%s shape primitives differ on layer %s." ),
496 wxString::Format(
_(
"%s text differs." ),
ITEM_DESC( &curr_barcode ) ) );
499 wxString::Format(
_(
"%s position differs." ),
ITEM_DESC( &curr_barcode ) ) );
502 wxString::Format(
_(
"%s width differs." ),
ITEM_DESC( &curr_barcode ) ) );
504 wxString::Format(
_(
"%s height differs." ),
ITEM_DESC( &curr_barcode ) ) );
507 wxString::Format(
_(
"%s text size differs." ),
ITEM_DESC( &curr_barcode ) ) );
510 wxString::Format(
_(
"%s code differs." ),
ITEM_DESC( &curr_barcode ) ) );
512 wxString::Format(
_(
"%s error correction level differs." ),
ITEM_DESC( &curr_barcode ) ) );
573 if( curr_polygon.size() == 0 || ref_polygon.size() == 0
574 || !curr_polygon[0].CompareGeometry( ref_polygon[0],
true,
EPSILON ) )
603 wxString::Format(
_(
"%s corner smoothing setting differs." ),
ITEM_DESC( a ) ) );
605 wxString::Format(
_(
"%s corner smoothing radius differs." ),
ITEM_DESC( a ) ) );
607 wxString::Format(
_(
"%s name differs." ),
ITEM_DESC( a ) ) );
609 wxString::Format(
_(
"%s priority differs." ),
ITEM_DESC( a ) ) );
612 wxString::Format(
_(
"%s keep-out property differs." ),
ITEM_DESC( a ) ) );
614 wxString::Format(
_(
"%s keep out zone fill setting differs." ),
ITEM_DESC( a ) ) );
616 wxString::Format(
_(
"%s keep out footprints setting differs." ),
ITEM_DESC( a ) ) );
618 wxString::Format(
_(
"%s keep out pads setting differs." ),
ITEM_DESC( a ) ) );
620 wxString::Format(
_(
"%s keep out tracks setting differs." ),
ITEM_DESC( a ) ) );
622 wxString::Format(
_(
"%s keep out vias setting differs." ),
ITEM_DESC( a ) ) );
630 innerLayerExpansionAllowed ) )
636 aReporter->
Report( wxString::Format(
_(
"%s layers differ." ),
ITEM_DESC( a ) ) );
645 wxString::Format(
_(
"%s pad connection property differs." ),
ITEM_DESC( a ) ) );
647 wxString::Format(
_(
"%s local clearance differs." ),
ITEM_DESC( a ) ) );
649 wxString::Format(
_(
"%s thermal relief gap differs." ),
ITEM_DESC( a ) ) );
651 wxString::Format(
_(
"%s thermal relief spoke width differs." ),
ITEM_DESC( a ) ) );
654 wxString::Format(
_(
"%s min thickness differs." ),
ITEM_DESC( a ) ) );
657 wxString::Format(
_(
"%s remove islands setting differs." ),
ITEM_DESC( a ) ) );
659 wxString::Format(
_(
"%s minimum island size setting differs." ),
ITEM_DESC( a ) ) );
662 wxString::Format(
_(
"%s fill type differs." ),
ITEM_DESC( a ) ) );
664 wxString::Format(
_(
"%s hatch width differs." ),
ITEM_DESC( a ) ) );
666 wxString::Format(
_(
"%s hatch gap differs." ),
ITEM_DESC( a ) ) );
668 wxString::Format(
_(
"%s hatch orientation differs." ),
ITEM_DESC( a ) ) );
670 wxString::Format(
_(
"%s hatch smoothing level differs." ),
ITEM_DESC( a ) ) );
672 wxString::Format(
_(
"%s hatch smoothing amount differs." ),
ITEM_DESC( a ) ) );
674 wxString::Format(
_(
"%s minimum hatch hole setting differs." ),
ITEM_DESC( a ) ) );
680 wxString::Format(
_(
"%s outline corner count differs." ),
ITEM_DESC( a ) ) );
682 bool cornersDiffer =
false;
684 for(
int poly = 0; poly < static_cast<int>( a->
Outline()->
CPolygons().size() ); poly++ )
689 if( aPolygon.size() == 0 || bPolygon.size() == 0
690 || !aPolygon[0].CompareGeometry( bPolygon[0],
true,
EPSILON ) )
693 cornersDiffer =
true;
698 if( cornersDiffer && aReporter )
699 aReporter->
Report( wxString::Format(
_(
"%s corners differ." ),
ITEM_DESC( a ) ) );
715 wxString::Format(
_(
"Footprint stackup mode differs." ) ) );
720 TEST( aLayers, bLayers,
721 wxString::Format(
_(
"Footprint layers differ." ) ) );
744 bool mismatch =
false;
747 const LSET onlyInFp = fpLayers & ~brdLayers;
749 if( onlyInFp.count() )
753 aReporter->
Report( wxString::Format(
_(
"Footprint has %lu layers not on board: %s" ), onlyInFp.count(),
760 if( cuOnlyInBoard.count() )
764 aReporter->
Report( wxString::Format(
_(
"Board has %lu copper layers not in footprint: %s" ),
765 cuOnlyInBoard.count(),
784 std::unique_ptr<FOOTPRINT> temp(
static_cast<FOOTPRINT*
>( aLibFP->
Clone() ) );
801 for(
BOARD_ITEM* item : temp->GraphicalItems() )
802 item->NormalizeForCompare();
806 temp->SetParent(
nullptr );
813#define TEST_ATTR( a, b, attr, msg ) TEST( ( a & attr ), ( b & attr ), msg )
816 _(
"Footprint types differ." ) );
819 wxString::Format(
_(
"'%s' settings differ." ),
820 _(
"Allow bridged solder mask apertures between pads" ) ) );
826 wxString::Format(
_(
"'%s' settings differ." ),
827 _(
"Not in schematic" ) ) );
830 wxString::Format(
_(
"'%s' settings differ." ),
831 _(
"Exclude from position files" ) ) );
834 wxString::Format(
_(
"'%s' settings differ." ),
835 _(
"Exclude from bill of materials" ) ) );
838 wxString::Format(
_(
"'%s' settings differ." ),
839 _(
"Do not populate" ) ) );
842#define REPORT( msg ) { if( aReporter ) aReporter->Report( msg ); }
843#define CHECKPOINT { if( diff && !aReporter ) return diff; }
848 REPORT(
_(
"Footprint stackup differs." ) );
866 REPORT(
_(
"Pad clearance overridden." ) );
873 REPORT(
_(
"Solder mask expansion overridden." ) );
881 REPORT(
_(
"Solder paste absolute clearance overridden." ) );
888 REPORT(
_(
"Solder paste relative clearance overridden." ) );
895 REPORT(
_(
"Zone connection overridden." ) );
900 _(
"Net tie pad groups differ." ) );
905 _(
"Net tie pad groups differ." ) );
927 dummy.SetParentGroup(
nullptr );
928 dummy.SetParent(
nullptr );
931 board->UncacheItemSubtreeById( &
dummy );
934 item->NormalizeForCompare();
936 std::set<BOARD_ITEM*, FOOTPRINT::cmp_drawings> aShapes;
937 std::copy_if(
dummy.GraphicalItems().begin(),
dummy.GraphicalItems().end(),
938 std::inserter( aShapes, aShapes.begin() ),
941 return item->Type() == PCB_SHAPE_T;
944 std::set<BOARD_ITEM*, FOOTPRINT::cmp_drawings> bShapes;
946 std::inserter( bShapes, bShapes.begin() ),
949 return item->Type() == PCB_SHAPE_T;
952 if( aShapes.size() != bShapes.size() )
955 REPORT(
_(
"Graphic item count differs." ) );
959 for(
auto aIt = aShapes.begin(), bIt = bShapes.begin(); aIt != aShapes.end(); aIt++, bIt++ )
976 std::set<BOARD_ITEM*, FOOTPRINT::cmp_drawings> aBarcodes;
977 std::copy_if(
dummy.GraphicalItems().begin(),
dummy.GraphicalItems().end(),
978 std::inserter( aBarcodes, aBarcodes.begin() ),
981 return item->Type() == PCB_BARCODE_T;
984 std::set<BOARD_ITEM*, FOOTPRINT::cmp_drawings> bBarcodes;
986 std::inserter( bBarcodes, bBarcodes.begin() ),
989 return item->Type() == PCB_BARCODE_T;
992 if( aBarcodes.size() != bBarcodes.size() )
995 REPORT(
_(
"Barcode count differs." ) );
999 for(
auto aIt = aBarcodes.begin(), bIt = bBarcodes.begin(); aIt != aBarcodes.end(); aIt++, bIt++ )
1016 std::set<PAD*, FOOTPRINT::cmp_pads> aPads(
Pads().begin(),
Pads().
end() );
1017 std::set<PAD*, FOOTPRINT::cmp_pads> bLibPads( aLibFP->
Pads().begin(), aLibFP->
Pads().end() );
1019 if( aPads.size() != bLibPads.size() )
1022 REPORT(
_(
"Pad count differs." ) );
1026 for(
auto aIt = aPads.begin(), bLibIt = bLibPads.begin(); aIt != aPads.end(); aIt++, bLibIt++ )
1037 std::set<ZONE*, FOOTPRINT::cmp_zones> aZones(
Zones().begin(),
Zones().
end() );
1038 std::set<ZONE*, FOOTPRINT::cmp_zones> bZones( aLibFP->
Zones().begin(), aLibFP->
Zones().end() );
1040 if( aZones.size() != bZones.size() )
1043 REPORT(
_(
"Rule area count differs." ) );
1047 for(
auto aIt = aZones.begin(), bIt = bZones.begin(); aIt != aZones.end(); aIt++, bIt++ )
1062 REPORT_AUX(
_(
"No project loaded, skipping library parity tests." ) );
1066 if( !
reportPhase(
_(
"Loading footprint library table..." ) ) )
1069 std::map<LIB_ID, std::shared_ptr<FOOTPRINT>> libFootprintCache;
1074 const int progressDelta = 250;
1076 if( !
reportPhase(
_(
"Checking board footprints against library..." ) ) )
1090 LIB_ID fpID = footprint->GetFPID();
1095 if( libName.IsEmpty() )
1101 if( std::optional<LIBRARY_TABLE_ROW*> optRow = adapter->
GetRow( libName ); optRow )
1102 libTableRow = *optRow;
1109 msg.Printf(
_(
"The current configuration does not include the footprint library '%s'" ),
1111 drcItem->SetErrorMessage( msg );
1112 drcItem->SetItems( footprint );
1118 else if( !adapter->
HasLibrary( libName,
true ) )
1123 msg.Printf(
_(
"The footprint library '%s' is not enabled in the current configuration" ),
1125 drcItem->SetErrorMessage( msg );
1126 drcItem->SetItems( footprint );
1137 msg.Printf(
_(
"The footprint library '%s' was not found at '%s'" ),
1140 drcItem->SetErrorMessage( msg );
1141 drcItem->SetItems( footprint );
1148 auto cacheIt = libFootprintCache.find( fpID );
1149 std::shared_ptr<FOOTPRINT> libFootprint;
1151 if( cacheIt != libFootprintCache.end() )
1153 libFootprint = cacheIt->second;
1159 libFootprint.reset( adapter->
LoadFootprint( libName, fpName,
true ) );
1162 libFootprintCache[ fpID ] = libFootprint;
1174 msg.Printf(
_(
"Footprint '%s' not found in library '%s'" ),
1177 drcItem->SetErrorMessage( msg );
1178 drcItem->SetItems( footprint );
1187 msg.Printf(
_(
"Footprint '%s' does not match copy in library '%s'" ),
1190 drcItem->SetErrorMessage( msg );
1191 drcItem->SetItems( footprint );
constexpr EDA_IU_SCALE pcbIUScale
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
BOARD_ITEM(BOARD_ITEM *aParent, KICAD_T idtype, PCB_LAYER_ID aLayer=F_Cu)
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
FOOTPRINT * GetParentFootprint() const
VECTOR2I GetFPRelativePosition() const
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
virtual bool IsOnCopperLayer() const
Information pertinent to a Pcbnew printed circuit board.
const FOOTPRINTS & Footprints() const
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
PROJECT * GetProject() const
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
constexpr const Vec GetEnd() const
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
constexpr const Vec & GetOrigin() const
static std::shared_ptr< DRC_ITEM > Create(int aErrorCode)
Constructs a DRC_ITEM for the given error code.
virtual ~DRC_TEST_PROVIDER_LIBRARY_PARITY()=default
virtual bool Run() override
Run this provider against the given PCB with configured options (if any).
virtual const wxString GetName() const override
DRC_TEST_PROVIDER_LIBRARY_PARITY()
virtual bool reportPhase(const wxString &aStageName)
void reportViolation(std::shared_ptr< DRC_ITEM > &item, const VECTOR2I &aMarkerPos, int aMarkerLayer, const std::function< void(PCB_MARKER *)> &aPathGenerator=[](PCB_MARKER *){})
virtual bool reportProgress(size_t aCount, size_t aSize, size_t aDelta=1)
const VECTOR2I & GetBezierC2() const
FILL_T GetFillMode() const
SHAPE_POLY_SET & GetPolyShape()
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
wxString SHAPE_T_asString() const
const VECTOR2I & GetBezierC1() const
VECTOR2I GetArcMid() const
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
bool IsLibraryLoaded(const wxString &aNickname)
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library tables.
std::optional< LIBRARY_TABLE_ROW * > GetRow(const wxString &aNickname, LIBRARY_TABLE_SCOPE aScope=LIBRARY_TABLE_SCOPE::BOTH) const
Like LIBRARY_MANAGER::GetRow but filtered to the LIBRARY_TABLE_TYPE of this adapter.
std::optional< wxString > GetFullURI(LIBRARY_TABLE_TYPE aType, const wxString &aNickname, bool aSubstituted=false)
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
A logical library item identifier and consists of various portions much like a URI.
const UTF8 & GetLibItemName() const
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
LSET is a set of PCB_LAYER_IDs.
static const LSET & AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
static LSET AllNonCuMask()
Return a mask holding all layer minus CU layers.
static const LSET & ExternalCuMask()
Return a mask holding the Front and Bottom layers.
static LSET AllCuMask(int aCuLayerCount)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
static LSET UserDefinedLayersMask(int aUserDefinedLayerCount=MAX_USER_DEFINED_LAYERS)
Return a mask with the requested number of user defined layers.
bool Contains(PCB_LAYER_ID aLayer) const
See if the layer set contains a PCB layer.
void ForEachUniqueLayer(const std::function< void(PCB_LAYER_ID)> &aMethod) const
Runs the given callable for each active unique copper layer in this padstack, meaning F_Cu for MODE::...
std::vector< PCB_LAYER_ID > UniqueLayers() const
PAD_PROP GetProperty() const
bool GetRemoveUnconnected() const
const std::vector< std::shared_ptr< PCB_SHAPE > > & GetPrimitives(PCB_LAYER_ID aLayer) const
Accessor to the basic shape list for custom-shaped pads.
std::optional< double > GetLocalSolderPasteMarginRatio() const
const VECTOR2I & GetDrillSize() const
PAD_ATTRIB GetAttribute() const
const wxString & GetNumber() const
const VECTOR2I & GetDelta(PCB_LAYER_ID aLayer) const
EDA_ANGLE GetThermalSpokeAngle() const
double GetRoundRectRadiusRatio(PCB_LAYER_ID aLayer) const
PAD_SHAPE GetShape(PCB_LAYER_ID aLayer) const
bool GetKeepTopBottom() const
std::optional< int > GetLocalClearance() const override
Return any local clearances set in the "classic" (ie: pre-rule) system.
const PADSTACK & Padstack() const
const VECTOR2I & GetOffset(PCB_LAYER_ID aLayer) const
PAD_DRILL_SHAPE GetDrillShape() const
int GetChamferPositions(PCB_LAYER_ID aLayer) const
std::optional< int > GetLocalSolderPasteMargin() const
std::optional< int > GetLocalSolderMaskMargin() const
EDA_ANGLE GetFPRelativeOrientation() const
double GetChamferRectRatio(PCB_LAYER_ID aLayer) const
std::optional< int > GetLocalThermalSpokeWidthOverride() const
ZONE_CONNECTION GetLocalZoneConnection() const
CUSTOM_SHAPE_ZONE_MODE GetCustomShapeInZoneOpt() const
int GetThermalGap() const
int GetLocalThermalGapOverride(wxString *aSource) const
int GetPadToDieLength() const
const VECTOR2I & GetSize(PCB_LAYER_ID aLayer) const
VECTOR2I GetPosition() const override
Get the position (center) of the barcode in internal units.
int GetHeight() const
Get the barcode height (in internal units).
BARCODE_ECC_T GetErrorCorrection() const
BARCODE_T GetKind() const
Returns the type of the barcode (QR, CODE_39, etc.).
int GetWidth() const
Get the barcode width (in internal units).
STROKE_PARAMS GetStroke() const override
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
static FOOTPRINT_LIBRARY_ADAPTER * FootprintLibAdapter(PROJECT *aProject)
Container for project specific data.
A pure virtual class used to derive REPORTER objects from.
virtual REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)
Report a string with a given severity.
int TotalVertices() const
Return total number of vertices stored in the set.
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
const POLYGON & CPolygon(int aIndex) const
const std::vector< POLYGON > & CPolygons() const
Handle a list of polygons defining a copper zone.
bool GetIsRuleArea() const
Accessors to parameters used in Rule Area zones:
std::optional< int > GetLocalClearance() const override
bool GetDoNotAllowVias() const
bool GetDoNotAllowPads() const
bool GetDoNotAllowTracks() const
ISLAND_REMOVAL_MODE GetIslandRemovalMode() const
SHAPE_POLY_SET * Outline()
long long int GetMinIslandArea() const
const wxString & GetZoneName() const
int GetMinThickness() const
ZONE_CONNECTION GetPadConnection() const
int GetHatchThickness() const
double GetHatchHoleMinArea() const
int GetThermalReliefSpokeWidth() const
EDA_ANGLE GetHatchOrientation() const
bool GetDoNotAllowFootprints() const
ZONE_FILL_MODE GetFillMode() const
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
double GetHatchSmoothingValue() const
bool GetDoNotAllowZoneFills() const
int GetHatchSmoothingLevel() const
unsigned int GetCornerRadius() const
int GetCornerSmoothingType() const
int GetThermalReliefGap() const
unsigned GetAssignedPriority() const
@ DRCE_LIB_FOOTPRINT_ISSUES
@ DRCE_LIB_FOOTPRINT_MISMATCH
UNITS_PROVIDER g_unitsProvider(pcbIUScale, EDA_UNITS::MM)
bool footprintVsBoardStackup(const FOOTPRINT &aFp, const BOARD &aBoard, REPORTER *aReporter)
Report board->footprint stackup differences.
#define TEST_PT(a, b, msg)
bool padNeedsUpdate(const PAD *a, const PAD *bLib, REPORTER *aReporter)
bool primitiveNeedsUpdate(const std::shared_ptr< PCB_SHAPE > &a, const std::shared_ptr< PCB_SHAPE > &b)
static bool boardLayersMatchWithInnerLayerExpansion(const LSET &aItem, const LSET &bLib, bool aAllowCuExpansion)
bool padHasOverrides(const PAD *a, const PAD *b, REPORTER &aReporter)
bool shapeNeedsUpdate(const PCB_SHAPE &curr_shape, const PCB_SHAPE &ref_shape)
bool zoneNeedsUpdate(const ZONE *a, const ZONE *b, REPORTER *aReporter)
bool barcodeNeedsUpdate(const PCB_BARCODE &curr_barcode, const PCB_BARCODE &ref_barcode)
#define TEST_ATTR(a, b, attr, msg)
#define TEST_D(a, b, msg)
bool stackupNeedsUpdate(const FOOTPRINT &a, const FOOTPRINT &b, REPORTER *aReporter)
Compare the stackup related settings of two footprints.
LSET getBoardNormalizedLayerSet(const BOARD_ITEM *aLibItem, const BOARD *aBoard)
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
wxString LayerName(int aLayer)
Returns the default display name for a given layer.
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
#define UNIMPLEMENTED_FOR(type)
@ TOP_BOTTOM
Flip top to bottom (around the X axis)
wxString AccumulateNames(const LSEQ &aLayers, const BOARD *aBoard)
Accumulate layer names from a layer set into a comma separated string.
static DRC_REGISTER_TEST_PROVIDER< DRC_TEST_PROVIDER_ANNULAR_WIDTH > dummy
BARCODE class definition.
std::vector< FAB_LAYER_COLOR > dummy
wxString UnescapeString(const wxString &aSource)