57 virtual bool Run()
override;
59 virtual const wxString
GetName()
const override {
return wxT(
"library_parity" ); };
68#define TEST( a, b, msg ) \
74 if( aReporter && wxString( msg ).length() ) \
75 aReporter->Report( msg ); \
78 if( diff && !aReporter ) \
83#define TEST_PT( a, b, msg ) \
85 if( abs( a.x - b.x ) > EPSILON \
86 || abs( a.y - b.y ) > EPSILON ) \
90 if( aReporter && wxString( msg ).length() ) \
91 aReporter->Report( msg ); \
94 if( diff && !aReporter ) \
98#define EPSILON_D 0.000010
99#define TEST_D( a, b, msg ) \
101 if( abs( a - b ) > EPSILON_D ) \
105 if( aReporter && wxString( msg ).length() ) \
106 aReporter->Report( msg ); \
109 if( diff && !aReporter ) \
113#define ITEM_DESC( item ) ( item )->GetItemDescription( &g_unitsProvider, true )
114#define PAD_DESC( pad ) wxString::Format( _( "Pad %s" ), ( pad )->GetNumber() )
132 bool aAllowCuExpansion )
134 if( !aAllowCuExpansion )
136 return aItem == bLib;
141 const LSET aNonCu = aItem & nonCuMask;
142 const LSET bNonCu = bLib & nonCuMask;
144 if( aNonCu != bNonCu )
159 const LSET missingInnerInA = bInner & ~aInner;
160 if( missingInnerInA.count() )
168 const std::shared_ptr<PCB_SHAPE>& b )
173 TEST( a->GetShape(), b->GetShape(),
"" );
175 switch( a->GetShape() )
179 BOX2I aRect( a->GetStart(), a->GetEnd() - a->GetStart() );
180 BOX2I bRect( b->GetStart(), b->GetEnd() - b->GetStart() );
192 TEST_PT( a->GetStart(), b->GetStart(),
"" );
193 TEST_PT( a->GetEnd(), b->GetEnd(),
"" );
197 TEST_PT( a->GetStart(), b->GetStart(),
"" );
198 TEST_PT( a->GetEnd(), b->GetEnd(),
"" );
202 if( ( a->GetArcMid() - b->GetArcMid() ).EuclideanNorm() >
pcbIUScale.mmToIU( 0.0005 ) )
208 TEST_PT( a->GetStart(), b->GetStart(),
"" );
209 TEST_PT( a->GetEnd(), b->GetEnd(),
"" );
210 TEST_PT( a->GetBezierC1(), b->GetBezierC1(),
"" );
211 TEST_PT( a->GetBezierC2(), b->GetBezierC2(),
"" );
216 TEST_PT( a->GetEllipseCenter(), b->GetEllipseCenter(),
"" );
217 TEST( a->GetEllipseMajorRadius(), b->GetEllipseMajorRadius(),
"" );
218 TEST( a->GetEllipseMinorRadius(), b->GetEllipseMinorRadius(),
"" );
219 TEST( a->GetEllipseRotation(), b->GetEllipseRotation(),
"" );
223 TEST( a->GetEllipseStartAngle(), b->GetEllipseStartAngle(),
"" );
224 TEST( a->GetEllipseEndAngle(), b->GetEllipseEndAngle(),
"" );
230 TEST( a->GetPolyShape().TotalVertices(), b->GetPolyShape().TotalVertices(),
"" );
232 for(
int poly = 0; poly < static_cast<int>( a->GetPolyShape().CPolygons().size() ); poly++ )
237 if( aPolygon.size() == 0 || bPolygon.size() == 0
238 || !aPolygon[0].CompareGeometry( bPolygon[0],
true,
EPSILON ) )
252 TEST( a->GetStroke(), b->GetStroke(),
"" );
253 TEST( a->GetFillMode(), b->GetFillMode(),
"" );
263#define REPORT_MSG( s, p ) aReporter.Report( wxString::Format( s, p ) )
335 wxString::Format(
_(
"%s pad to die length differs." ),
PAD_DESC( a ) ) );
337 wxString::Format(
_(
"%s position differs." ),
PAD_DESC( a ) ) );
340 wxString::Format(
_(
"%s has different numbers." ),
PAD_DESC( a ) ) );
352 bool allowExpansion =
false;
356 if( layerSettingsDiffer
364 aReporter->
Report( wxString::Format(
_(
"%s layers differ." ),
PAD_DESC( a ) ) );
370 wxString::Format(
_(
"%s pad type differs." ),
PAD_DESC( a ) ) );
372 wxString::Format(
_(
"%s fabrication property differs." ),
PAD_DESC( a ) ) );
377 wxString::Format(
_(
"%s orientation differs." ),
PAD_DESC( a ) ) );
388 wxString::Format(
_(
"%s pad shape type differs on layer %s." ),
393 wxString::Format(
_(
"%s size differs on layer %s." ),
398 wxString::Format(
_(
"%s trapezoid delta differs on layer %s." ),
406 wxString::Format(
_(
"%s rounded corners differ on layer %s." ),
415 wxString::Format(
_(
"%s chamfered corner sizes differ on layer %s." ),
421 wxString::Format(
_(
"%s chamfered corners differ on layer %s." ),
427 wxString::Format(
_(
"%s shape offset from hole differs on layer %s." ),
433 wxString::Format(
_(
"%s drill shape differs." ),
PAD_DESC( a ) ) );
435 wxString::Format(
_(
"%s drill size differs." ),
PAD_DESC( a ) ) );
450 bool primitivesDiffer =
false;
458 primitivesDiffer =
true;
462 for(
size_t ii = 0; ii < a->
GetPrimitives( aLayer ).size(); ++ii )
467 primitivesDiffer =
true;
474 firstDifferingLayer = aLayer;
478 if( primitivesDiffer )
481 layerName = board ? board->
GetLayerName( firstDifferingLayer )
486 aReporter->
Report( wxString::Format(
_(
"%s shape primitives differ on layer %s." ),
506 wxString::Format(
_(
"%s text differs." ),
ITEM_DESC( &curr_barcode ) ) );
509 wxString::Format(
_(
"%s position differs." ),
ITEM_DESC( &curr_barcode ) ) );
512 wxString::Format(
_(
"%s width differs." ),
ITEM_DESC( &curr_barcode ) ) );
514 wxString::Format(
_(
"%s height differs." ),
ITEM_DESC( &curr_barcode ) ) );
517 wxString::Format(
_(
"%s text size differs." ),
ITEM_DESC( &curr_barcode ) ) );
520 wxString::Format(
_(
"%s code differs." ),
ITEM_DESC( &curr_barcode ) ) );
522 wxString::Format(
_(
"%s error correction level differs." ),
ITEM_DESC( &curr_barcode ) ) );
595 for(
int poly = 0; poly < static_cast<int>( aLib.
CPolygons().size() ); poly++ )
600 if( curr_polygon.size() == 0 || ref_polygon.size() == 0
601 || !curr_polygon[0].CompareGeometry( ref_polygon[0],
true,
EPSILON ) )
630 wxString::Format(
_(
"%s corner smoothing setting differs." ),
ITEM_DESC( a ) ) );
632 wxString::Format(
_(
"%s corner smoothing radius differs." ),
ITEM_DESC( a ) ) );
634 wxString::Format(
_(
"%s name differs." ),
ITEM_DESC( a ) ) );
636 wxString::Format(
_(
"%s priority differs." ),
ITEM_DESC( a ) ) );
639 wxString::Format(
_(
"%s keep-out property differs." ),
ITEM_DESC( a ) ) );
641 wxString::Format(
_(
"%s keep out zone fill setting differs." ),
ITEM_DESC( a ) ) );
643 wxString::Format(
_(
"%s keep out footprints setting differs." ),
ITEM_DESC( a ) ) );
645 wxString::Format(
_(
"%s keep out pads setting differs." ),
ITEM_DESC( a ) ) );
647 wxString::Format(
_(
"%s keep out tracks setting differs." ),
ITEM_DESC( a ) ) );
649 wxString::Format(
_(
"%s keep out vias setting differs." ),
ITEM_DESC( a ) ) );
656 innerLayerExpansionAllowed ) )
662 aReporter->
Report( wxString::Format(
_(
"%s layers differ." ),
ITEM_DESC( a ) ) );
671 wxString::Format(
_(
"%s pad connection property differs." ),
ITEM_DESC( a ) ) );
673 wxString::Format(
_(
"%s local clearance differs." ),
ITEM_DESC( a ) ) );
675 wxString::Format(
_(
"%s thermal relief gap differs." ),
ITEM_DESC( a ) ) );
677 wxString::Format(
_(
"%s thermal relief spoke width differs." ),
ITEM_DESC( a ) ) );
680 wxString::Format(
_(
"%s min thickness differs." ),
ITEM_DESC( a ) ) );
683 wxString::Format(
_(
"%s remove islands setting differs." ),
ITEM_DESC( a ) ) );
685 wxString::Format(
_(
"%s minimum island size setting differs." ),
ITEM_DESC( a ) ) );
688 wxString::Format(
_(
"%s fill type differs." ),
ITEM_DESC( a ) ) );
690 wxString::Format(
_(
"%s hatch width differs." ),
ITEM_DESC( a ) ) );
692 wxString::Format(
_(
"%s hatch gap differs." ),
ITEM_DESC( a ) ) );
694 wxString::Format(
_(
"%s hatch orientation differs." ),
ITEM_DESC( a ) ) );
696 wxString::Format(
_(
"%s hatch smoothing level differs." ),
ITEM_DESC( a ) ) );
698 wxString::Format(
_(
"%s hatch smoothing amount differs." ),
ITEM_DESC( a ) ) );
700 wxString::Format(
_(
"%s minimum hatch hole setting differs." ),
ITEM_DESC( a ) ) );
709 wxString::Format(
_(
"%s outline corner count differs." ),
ITEM_DESC( a ) ) );
711 bool cornersDiffer =
false;
713 for(
int poly = 0; poly < static_cast<int>( aLibOutline.
CPolygons().size() ); poly++ )
718 if( aPolygon.size() == 0 || bPolygon.size() == 0
719 || !aPolygon[0].CompareGeometry( bPolygon[0],
true,
EPSILON ) )
722 cornersDiffer =
true;
727 if( cornersDiffer && aReporter )
728 aReporter->
Report( wxString::Format(
_(
"%s corners differ." ),
ITEM_DESC( a ) ) );
744 wxString::Format(
_(
"Footprint stackup mode differs." ) ) );
749 TEST( aLayers, bLayers,
750 wxString::Format(
_(
"Footprint layers differ." ) ) );
773 bool mismatch =
false;
776 const LSET onlyInFp = fpLayers & ~brdLayers;
778 if( onlyInFp.count() )
782 aReporter->
Report( wxString::Format(
_(
"Footprint has %lu layers not on board: %s" ), onlyInFp.count(),
789 if( cuOnlyInBoard.count() )
793 aReporter->
Report( wxString::Format(
_(
"Board has %lu copper layers not in footprint: %s" ),
794 cuOnlyInBoard.count(),
808 std::unique_ptr<FOOTPRINT> temp(
static_cast<FOOTPRINT*
>( aLibFP->
Clone() ) );
812 for(
BOARD_ITEM* item : temp->GraphicalItems() )
813 item->NormalizeForCompare();
817 temp->SetParent(
nullptr );
824#define TEST_ATTR( a, b, attr, msg ) TEST( ( a & attr ), ( b & attr ), msg )
827 _(
"Footprint types differ." ) );
830 wxString::Format(
_(
"'%s' settings differ." ),
831 _(
"Allow bridged solder mask apertures between pads" ) ) );
837 wxString::Format(
_(
"'%s' settings differ." ),
838 _(
"Not in schematic" ) ) );
841 wxString::Format(
_(
"'%s' settings differ." ),
842 _(
"Exclude from position files" ) ) );
845 wxString::Format(
_(
"'%s' settings differ." ),
846 _(
"Exclude from bill of materials" ) ) );
849 wxString::Format(
_(
"'%s' settings differ." ),
850 _(
"Do not populate" ) ) );
853#define REPORT( msg ) { if( aReporter ) aReporter->Report( msg ); }
854#define CHECKPOINT { if( diff && !aReporter ) return diff; }
859 REPORT(
_(
"Footprint stackup differs." ) );
877 REPORT(
_(
"Pad clearance overridden." ) );
884 REPORT(
_(
"Solder mask expansion overridden." ) );
892 REPORT(
_(
"Solder paste absolute clearance overridden." ) );
899 REPORT(
_(
"Solder paste relative clearance overridden." ) );
906 REPORT(
_(
"Zone connection overridden." ) );
911 _(
"Net tie pad groups differ." ) );
916 _(
"Net tie pad groups differ." ) );
938 dummy.SetParentGroup(
nullptr );
939 dummy.SetParent(
nullptr );
942 board->UncacheItemSubtreeById( &
dummy );
945 item->NormalizeForCompare();
947 std::set<BOARD_ITEM*, FOOTPRINT::cmp_drawings> aShapes;
948 std::copy_if(
dummy.GraphicalItems().begin(),
dummy.GraphicalItems().end(),
949 std::inserter( aShapes, aShapes.begin() ),
952 return item->Type() == PCB_SHAPE_T;
955 std::set<BOARD_ITEM*, FOOTPRINT::cmp_drawings> bShapes;
957 std::inserter( bShapes, bShapes.begin() ),
960 return item->Type() == PCB_SHAPE_T;
963 if( aShapes.size() != bShapes.size() )
966 REPORT(
_(
"Graphic item count differs." ) );
970 for(
auto aIt = aShapes.begin(), bIt = bShapes.begin(); aIt != aShapes.end(); aIt++, bIt++ )
987 std::set<BOARD_ITEM*, FOOTPRINT::cmp_drawings> aBarcodes;
988 std::copy_if(
dummy.GraphicalItems().begin(),
dummy.GraphicalItems().end(),
989 std::inserter( aBarcodes, aBarcodes.begin() ),
992 return item->Type() == PCB_BARCODE_T;
995 std::set<BOARD_ITEM*, FOOTPRINT::cmp_drawings> bBarcodes;
997 std::inserter( bBarcodes, bBarcodes.begin() ),
1000 return item->Type() == PCB_BARCODE_T;
1003 if( aBarcodes.size() != bBarcodes.size() )
1006 REPORT(
_(
"Barcode count differs." ) );
1010 for(
auto aIt = aBarcodes.begin(), bIt = bBarcodes.begin(); aIt != aBarcodes.end(); aIt++, bIt++ )
1027 std::set<PAD*, FOOTPRINT::cmp_pads> aPads(
Pads().begin(),
Pads().
end() );
1028 std::set<PAD*, FOOTPRINT::cmp_pads> bLibPads( aLibFP->
Pads().begin(), aLibFP->
Pads().end() );
1030 if( aPads.size() != bLibPads.size() )
1033 REPORT(
_(
"Pad count differs." ) );
1037 for(
auto aIt = aPads.begin(), bLibIt = bLibPads.begin(); aIt != aPads.end(); aIt++, bLibIt++ )
1048 std::set<ZONE*, FOOTPRINT::cmp_zones> aZones(
Zones().begin(),
Zones().
end() );
1049 std::set<ZONE*, FOOTPRINT::cmp_zones> bZones( aLibFP->
Zones().begin(), aLibFP->
Zones().end() );
1051 if( aZones.size() != bZones.size() )
1054 REPORT(
_(
"Rule area count differs." ) );
1058 for(
auto aIt = aZones.begin(), bIt = bZones.begin(); aIt != aZones.end(); aIt++, bIt++ )
1073 REPORT_AUX(
_(
"No project loaded, skipping library parity tests." ) );
1077 if( !
reportPhase(
_(
"Loading footprint library table..." ) ) )
1080 std::map<LIB_ID, std::shared_ptr<FOOTPRINT>> libFootprintCache;
1085 const int progressDelta = 250;
1087 if( !
reportPhase(
_(
"Checking board footprints against library..." ) ) )
1101 LIB_ID fpID = footprint->GetFPID();
1106 if( libName.IsEmpty() )
1112 if( std::optional<LIBRARY_TABLE_ROW*> optRow = adapter->
GetRow( libName ); optRow )
1113 libTableRow = *optRow;
1120 msg.Printf(
_(
"The current configuration does not include the footprint library '%s'" ),
1122 drcItem->SetErrorMessage( msg );
1123 drcItem->SetItems( footprint );
1129 else if( !adapter->
HasLibrary( libName,
true ) )
1134 msg.Printf(
_(
"The footprint library '%s' is not enabled in the current configuration" ),
1136 drcItem->SetErrorMessage( msg );
1137 drcItem->SetItems( footprint );
1148 msg.Printf(
_(
"The footprint library '%s' was not found at '%s'" ),
1151 drcItem->SetErrorMessage( msg );
1152 drcItem->SetItems( footprint );
1159 auto cacheIt = libFootprintCache.find( fpID );
1160 std::shared_ptr<FOOTPRINT> libFootprint;
1162 if( cacheIt != libFootprintCache.end() )
1164 libFootprint = cacheIt->second;
1170 libFootprint.reset( adapter->
LoadFootprint( libName, fpName,
true ) );
1173 libFootprintCache[ fpID ] = libFootprint;
1185 msg.Printf(
_(
"Footprint '%s' not found in library '%s'" ),
1188 drcItem->SetErrorMessage( msg );
1189 drcItem->SetItems( footprint );
1198 msg.Printf(
_(
"Footprint '%s' does not match copy in library '%s'" ),
1201 drcItem->SetErrorMessage( msg );
1202 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 & GetEllipseCenter() const
EDA_ANGLE GetEllipseEndAngle() const
FILL_T GetFillMode() const
int GetEllipseMajorRadius() const
EDA_ANGLE GetEllipseRotation() const
EDA_ANGLE GetEllipseStartAngle() const
wxString SHAPE_T_asString() 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
PAD_ATTRIB GetAttribute() const
const wxString & GetNumber() const
const VECTOR2I & GetDelta(PCB_LAYER_ID aLayer) const
EDA_ANGLE GetThermalSpokeAngle() const
VECTOR2I GetOffset(PCB_LAYER_ID aLayer) const
VECTOR2I GetDrillSize() const
double GetRoundRectRadiusRatio(PCB_LAYER_ID aLayer) const
PAD_SHAPE GetShape(PCB_LAYER_ID aLayer) const
bool GetKeepTopBottom() const
VECTOR2I GetSize(PCB_LAYER_ID aLayer) const
std::optional< int > GetLocalClearance() const override
Return any local clearances set in the "classic" (ie: pre-rule) system.
const PADSTACK & Padstack() 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
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).
VECTOR2I GetLibraryBezierC1() const
VECTOR2I GetLibraryEnd() const
VECTOR2I GetLibraryStart() const
STROKE_PARAMS GetStroke() const override
SHAPE_POLY_SET GetLibraryPolyShape() const
VECTOR2I GetLibraryBezierC2() const
VECTOR2I GetLibraryArcMid() const
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.
Represent a set of closed polygons.
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
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
SHAPE_POLY_SET GetLibraryOutline() 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)
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)