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_PT( a->GetEllipseCenter(), b->GetEllipseCenter(),
"" );
221 TEST( a->GetEllipseMajorRadius(), b->GetEllipseMajorRadius(),
"" );
222 TEST( a->GetEllipseMinorRadius(), b->GetEllipseMinorRadius(),
"" );
223 TEST( a->GetEllipseRotation(), b->GetEllipseRotation(),
"" );
227 TEST( a->GetEllipseStartAngle(), b->GetEllipseStartAngle(),
"" );
228 TEST( a->GetEllipseEndAngle(), b->GetEllipseEndAngle(),
"" );
234 TEST( a->GetPolyShape().TotalVertices(), b->GetPolyShape().TotalVertices(),
"" );
236 for(
int poly = 0; poly < static_cast<int>( a->GetPolyShape().CPolygons().size() ); poly++ )
241 if( aPolygon.size() == 0 || bPolygon.size() == 0
242 || !aPolygon[0].CompareGeometry( bPolygon[0],
true,
EPSILON ) )
256 TEST( a->GetStroke(), b->GetStroke(),
"" );
257 TEST( a->GetFillMode(), b->GetFillMode(),
"" );
267#define REPORT_MSG( s, p ) aReporter.Report( wxString::Format( s, p ) )
339 wxString::Format(
_(
"%s pad to die length differs." ),
PAD_DESC( a ) ) );
341 wxString::Format(
_(
"%s position differs." ),
PAD_DESC( a ) ) );
344 wxString::Format(
_(
"%s has different numbers." ),
PAD_DESC( a ) ) );
356 bool allowExpansion =
false;
360 if( layerSettingsDiffer
368 aReporter->
Report( wxString::Format(
_(
"%s layers differ." ),
PAD_DESC( a ) ) );
374 wxString::Format(
_(
"%s pad type differs." ),
PAD_DESC( a ) ) );
376 wxString::Format(
_(
"%s fabrication property differs." ),
PAD_DESC( a ) ) );
381 wxString::Format(
_(
"%s orientation differs." ),
PAD_DESC( a ) ) );
392 wxString::Format(
_(
"%s pad shape type differs on layer %s." ),
397 wxString::Format(
_(
"%s size differs on layer %s." ),
402 wxString::Format(
_(
"%s trapezoid delta differs on layer %s." ),
410 wxString::Format(
_(
"%s rounded corners differ on layer %s." ),
419 wxString::Format(
_(
"%s chamfered corner sizes differ on layer %s." ),
425 wxString::Format(
_(
"%s chamfered corners differ on layer %s." ),
431 wxString::Format(
_(
"%s shape offset from hole differs on layer %s." ),
437 wxString::Format(
_(
"%s drill shape differs." ),
PAD_DESC( a ) ) );
439 wxString::Format(
_(
"%s drill size differs." ),
PAD_DESC( a ) ) );
454 bool primitivesDiffer =
false;
462 primitivesDiffer =
true;
466 for(
size_t ii = 0; ii < a->
GetPrimitives( aLayer ).size(); ++ii )
471 primitivesDiffer =
true;
478 firstDifferingLayer = aLayer;
482 if( primitivesDiffer )
485 layerName = board ? board->
GetLayerName( firstDifferingLayer )
490 aReporter->
Report( wxString::Format(
_(
"%s shape primitives differ on layer %s." ),
510 wxString::Format(
_(
"%s text differs." ),
ITEM_DESC( &curr_barcode ) ) );
513 wxString::Format(
_(
"%s position differs." ),
ITEM_DESC( &curr_barcode ) ) );
516 wxString::Format(
_(
"%s width differs." ),
ITEM_DESC( &curr_barcode ) ) );
518 wxString::Format(
_(
"%s height differs." ),
ITEM_DESC( &curr_barcode ) ) );
521 wxString::Format(
_(
"%s text size differs." ),
ITEM_DESC( &curr_barcode ) ) );
524 wxString::Format(
_(
"%s code differs." ),
ITEM_DESC( &curr_barcode ) ) );
526 wxString::Format(
_(
"%s error correction level differs." ),
ITEM_DESC( &curr_barcode ) ) );
601 if( curr_polygon.size() == 0 || ref_polygon.size() == 0
602 || !curr_polygon[0].CompareGeometry( ref_polygon[0],
true,
EPSILON ) )
631 wxString::Format(
_(
"%s corner smoothing setting differs." ),
ITEM_DESC( a ) ) );
633 wxString::Format(
_(
"%s corner smoothing radius differs." ),
ITEM_DESC( a ) ) );
635 wxString::Format(
_(
"%s name differs." ),
ITEM_DESC( a ) ) );
637 wxString::Format(
_(
"%s priority differs." ),
ITEM_DESC( a ) ) );
640 wxString::Format(
_(
"%s keep-out property differs." ),
ITEM_DESC( a ) ) );
642 wxString::Format(
_(
"%s keep out zone fill setting differs." ),
ITEM_DESC( a ) ) );
644 wxString::Format(
_(
"%s keep out footprints setting differs." ),
ITEM_DESC( a ) ) );
646 wxString::Format(
_(
"%s keep out pads setting differs." ),
ITEM_DESC( a ) ) );
648 wxString::Format(
_(
"%s keep out tracks setting differs." ),
ITEM_DESC( a ) ) );
650 wxString::Format(
_(
"%s keep out vias setting differs." ),
ITEM_DESC( a ) ) );
657 innerLayerExpansionAllowed ) )
663 aReporter->
Report( wxString::Format(
_(
"%s layers differ." ),
ITEM_DESC( a ) ) );
672 wxString::Format(
_(
"%s pad connection property differs." ),
ITEM_DESC( a ) ) );
674 wxString::Format(
_(
"%s local clearance differs." ),
ITEM_DESC( a ) ) );
676 wxString::Format(
_(
"%s thermal relief gap differs." ),
ITEM_DESC( a ) ) );
678 wxString::Format(
_(
"%s thermal relief spoke width differs." ),
ITEM_DESC( a ) ) );
681 wxString::Format(
_(
"%s min thickness differs." ),
ITEM_DESC( a ) ) );
684 wxString::Format(
_(
"%s remove islands setting differs." ),
ITEM_DESC( a ) ) );
686 wxString::Format(
_(
"%s minimum island size setting differs." ),
ITEM_DESC( a ) ) );
689 wxString::Format(
_(
"%s fill type differs." ),
ITEM_DESC( a ) ) );
691 wxString::Format(
_(
"%s hatch width differs." ),
ITEM_DESC( a ) ) );
693 wxString::Format(
_(
"%s hatch gap differs." ),
ITEM_DESC( a ) ) );
695 wxString::Format(
_(
"%s hatch orientation differs." ),
ITEM_DESC( a ) ) );
697 wxString::Format(
_(
"%s hatch smoothing level differs." ),
ITEM_DESC( a ) ) );
699 wxString::Format(
_(
"%s hatch smoothing amount differs." ),
ITEM_DESC( a ) ) );
701 wxString::Format(
_(
"%s minimum hatch hole setting differs." ),
ITEM_DESC( a ) ) );
707 wxString::Format(
_(
"%s outline corner count differs." ),
ITEM_DESC( a ) ) );
709 bool cornersDiffer =
false;
711 for(
int poly = 0; poly < static_cast<int>( a->
Outline()->
CPolygons().size() ); poly++ )
716 if( aPolygon.size() == 0 || bPolygon.size() == 0
717 || !aPolygon[0].CompareGeometry( bPolygon[0],
true,
EPSILON ) )
720 cornersDiffer =
true;
725 if( cornersDiffer && aReporter )
726 aReporter->
Report( wxString::Format(
_(
"%s corners differ." ),
ITEM_DESC( a ) ) );
742 wxString::Format(
_(
"Footprint stackup mode differs." ) ) );
747 TEST( aLayers, bLayers,
748 wxString::Format(
_(
"Footprint layers differ." ) ) );
771 bool mismatch =
false;
774 const LSET onlyInFp = fpLayers & ~brdLayers;
776 if( onlyInFp.count() )
780 aReporter->
Report( wxString::Format(
_(
"Footprint has %lu layers not on board: %s" ), onlyInFp.count(),
787 if( cuOnlyInBoard.count() )
791 aReporter->
Report( wxString::Format(
_(
"Board has %lu copper layers not in footprint: %s" ),
792 cuOnlyInBoard.count(),
811 std::unique_ptr<FOOTPRINT> temp(
static_cast<FOOTPRINT*
>( aLibFP->
Clone() ) );
828 for(
BOARD_ITEM* item : temp->GraphicalItems() )
829 item->NormalizeForCompare();
833 temp->SetParent(
nullptr );
840#define TEST_ATTR( a, b, attr, msg ) TEST( ( a & attr ), ( b & attr ), msg )
843 _(
"Footprint types differ." ) );
846 wxString::Format(
_(
"'%s' settings differ." ),
847 _(
"Allow bridged solder mask apertures between pads" ) ) );
853 wxString::Format(
_(
"'%s' settings differ." ),
854 _(
"Not in schematic" ) ) );
857 wxString::Format(
_(
"'%s' settings differ." ),
858 _(
"Exclude from position files" ) ) );
861 wxString::Format(
_(
"'%s' settings differ." ),
862 _(
"Exclude from bill of materials" ) ) );
865 wxString::Format(
_(
"'%s' settings differ." ),
866 _(
"Do not populate" ) ) );
869#define REPORT( msg ) { if( aReporter ) aReporter->Report( msg ); }
870#define CHECKPOINT { if( diff && !aReporter ) return diff; }
875 REPORT(
_(
"Footprint stackup differs." ) );
893 REPORT(
_(
"Pad clearance overridden." ) );
900 REPORT(
_(
"Solder mask expansion overridden." ) );
908 REPORT(
_(
"Solder paste absolute clearance overridden." ) );
915 REPORT(
_(
"Solder paste relative clearance overridden." ) );
922 REPORT(
_(
"Zone connection overridden." ) );
927 _(
"Net tie pad groups differ." ) );
932 _(
"Net tie pad groups differ." ) );
954 dummy.SetParentGroup(
nullptr );
955 dummy.SetParent(
nullptr );
958 board->UncacheItemSubtreeById( &
dummy );
961 item->NormalizeForCompare();
963 std::set<BOARD_ITEM*, FOOTPRINT::cmp_drawings> aShapes;
964 std::copy_if(
dummy.GraphicalItems().begin(),
dummy.GraphicalItems().end(),
965 std::inserter( aShapes, aShapes.begin() ),
968 return item->Type() == PCB_SHAPE_T;
971 std::set<BOARD_ITEM*, FOOTPRINT::cmp_drawings> bShapes;
973 std::inserter( bShapes, bShapes.begin() ),
976 return item->Type() == PCB_SHAPE_T;
979 if( aShapes.size() != bShapes.size() )
982 REPORT(
_(
"Graphic item count differs." ) );
986 for(
auto aIt = aShapes.begin(), bIt = bShapes.begin(); aIt != aShapes.end(); aIt++, bIt++ )
1003 std::set<BOARD_ITEM*, FOOTPRINT::cmp_drawings> aBarcodes;
1004 std::copy_if(
dummy.GraphicalItems().begin(),
dummy.GraphicalItems().end(),
1005 std::inserter( aBarcodes, aBarcodes.begin() ),
1008 return item->Type() == PCB_BARCODE_T;
1011 std::set<BOARD_ITEM*, FOOTPRINT::cmp_drawings> bBarcodes;
1013 std::inserter( bBarcodes, bBarcodes.begin() ),
1016 return item->Type() == PCB_BARCODE_T;
1019 if( aBarcodes.size() != bBarcodes.size() )
1022 REPORT(
_(
"Barcode count differs." ) );
1026 for(
auto aIt = aBarcodes.begin(), bIt = bBarcodes.begin(); aIt != aBarcodes.end(); aIt++, bIt++ )
1043 std::set<PAD*, FOOTPRINT::cmp_pads> aPads(
Pads().begin(),
Pads().
end() );
1044 std::set<PAD*, FOOTPRINT::cmp_pads> bLibPads( aLibFP->
Pads().begin(), aLibFP->
Pads().end() );
1046 if( aPads.size() != bLibPads.size() )
1049 REPORT(
_(
"Pad count differs." ) );
1053 for(
auto aIt = aPads.begin(), bLibIt = bLibPads.begin(); aIt != aPads.end(); aIt++, bLibIt++ )
1064 std::set<ZONE*, FOOTPRINT::cmp_zones> aZones(
Zones().begin(),
Zones().
end() );
1065 std::set<ZONE*, FOOTPRINT::cmp_zones> bZones( aLibFP->
Zones().begin(), aLibFP->
Zones().end() );
1067 if( aZones.size() != bZones.size() )
1070 REPORT(
_(
"Rule area count differs." ) );
1074 for(
auto aIt = aZones.begin(), bIt = bZones.begin(); aIt != aZones.end(); aIt++, bIt++ )
1089 REPORT_AUX(
_(
"No project loaded, skipping library parity tests." ) );
1093 if( !
reportPhase(
_(
"Loading footprint library table..." ) ) )
1096 std::map<LIB_ID, std::shared_ptr<FOOTPRINT>> libFootprintCache;
1101 const int progressDelta = 250;
1103 if( !
reportPhase(
_(
"Checking board footprints against library..." ) ) )
1117 LIB_ID fpID = footprint->GetFPID();
1122 if( libName.IsEmpty() )
1128 if( std::optional<LIBRARY_TABLE_ROW*> optRow = adapter->
GetRow( libName ); optRow )
1129 libTableRow = *optRow;
1136 msg.Printf(
_(
"The current configuration does not include the footprint library '%s'" ),
1138 drcItem->SetErrorMessage( msg );
1139 drcItem->SetItems( footprint );
1145 else if( !adapter->
HasLibrary( libName,
true ) )
1150 msg.Printf(
_(
"The footprint library '%s' is not enabled in the current configuration" ),
1152 drcItem->SetErrorMessage( msg );
1153 drcItem->SetItems( footprint );
1164 msg.Printf(
_(
"The footprint library '%s' was not found at '%s'" ),
1167 drcItem->SetErrorMessage( msg );
1168 drcItem->SetItems( footprint );
1175 auto cacheIt = libFootprintCache.find( fpID );
1176 std::shared_ptr<FOOTPRINT> libFootprint;
1178 if( cacheIt != libFootprintCache.end() )
1180 libFootprint = cacheIt->second;
1186 libFootprint.reset( adapter->
LoadFootprint( libName, fpName,
true ) );
1189 libFootprintCache[ fpID ] = libFootprint;
1201 msg.Printf(
_(
"Footprint '%s' not found in library '%s'" ),
1204 drcItem->SetErrorMessage( msg );
1205 drcItem->SetItems( footprint );
1214 msg.Printf(
_(
"Footprint '%s' does not match copy in library '%s'" ),
1217 drcItem->SetErrorMessage( msg );
1218 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)
int GetEllipseMinorRadius() const
const VECTOR2I & GetBezierC2() const
const VECTOR2I & GetEllipseCenter() const
EDA_ANGLE GetEllipseEndAngle() const
FILL_T GetFillMode() const
int GetEllipseMajorRadius() const
SHAPE_POLY_SET & GetPolyShape()
EDA_ANGLE GetEllipseRotation() const
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
EDA_ANGLE GetEllipseStartAngle() const
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)