Finer-grained messages for diff pads.

This commit is contained in:
Jeff Young 2023-08-03 17:38:22 +01:00
parent a90c9d7c93
commit 297bbca0ea
2 changed files with 118 additions and 57 deletions

View File

@ -119,6 +119,8 @@ public:
} while (0) } while (0)
#define ITEM_DESC( item ) ( item )->GetItemDescription( &g_unitsProvider ) #define ITEM_DESC( item ) ( item )->GetItemDescription( &g_unitsProvider )
#define PAD_DESC( pad ) wxString::Format( _( "Pad %s" ), ( pad )->GetNumber() )
UNITS_PROVIDER g_unitsProvider( pcbIUScale, EDA_UNITS::MILLIMETRES ); UNITS_PROVIDER g_unitsProvider( pcbIUScale, EDA_UNITS::MILLIMETRES );
@ -173,52 +175,118 @@ bool primitiveNeedsUpdate( const std::shared_ptr<PCB_SHAPE>& a,
} }
bool padNeedsUpdate( const PAD* a, const PAD* b ) bool padHasOverrides( const PAD* a, const PAD* b, REPORTER* aReporter )
{
bool diff = false;
TEST( a->GetLocalClearance(), b->GetLocalClearance(),
wxString::Format( _( "%s has clearance override." ), PAD_DESC( a ) ) );
TEST( a->GetLocalSolderMaskMargin(), b->GetLocalSolderMaskMargin(),
wxString::Format( _( "%s has solder mask expansion override." ), PAD_DESC( a ) ) );
TEST( a->GetLocalSolderPasteMargin(), b->GetLocalSolderPasteMargin(),
wxString::Format( _( "%s has solder paste clearance override." ), PAD_DESC( a ) ) );
TEST_D( a->GetLocalSolderPasteMarginRatio(), b->GetLocalSolderPasteMarginRatio(),
wxString::Format( _( "%s has solder paste clearance override." ), PAD_DESC( a ) ) );
TEST( a->GetZoneConnection(), b->GetZoneConnection(),
wxString::Format( _( "%s has zone connection override." ), PAD_DESC( a ) ) );
TEST( a->GetThermalGap(), b->GetThermalGap(),
wxString::Format( _( "%s has thermal relief gap override." ), PAD_DESC( a ) ) );
TEST( a->GetThermalSpokeWidth(), b->GetThermalSpokeWidth(),
wxString::Format( _( "%s has thermal relief spoke width override." ), PAD_DESC( a ) ) );
TEST_D( a->GetThermalSpokeAngle().AsDegrees(), b->GetThermalSpokeAngle().AsDegrees(),
wxString::Format( _( "%s has thermal relief spoke angle override." ), PAD_DESC( a ) ) );
TEST( a->GetCustomShapeInZoneOpt(), b->GetCustomShapeInZoneOpt(),
wxString::Format( _( "%s has zone knockout setting override." ), PAD_DESC( a ) ) );
return diff;
}
bool padNeedsUpdate( const PAD* a, const PAD* b, REPORTER* aReporter )
{ {
REPORTER* aReporter = nullptr;
bool diff = false; bool diff = false;
TEST( a->GetPadToDieLength(), b->GetPadToDieLength(), "" ); TEST( a->GetPadToDieLength(), b->GetPadToDieLength(),
TEST( a->GetFPRelativePosition(), b->GetFPRelativePosition(), "" ); wxString::Format( _( "%s pad to die length differs." ), PAD_DESC( a ) ) );
TEST( a->GetFPRelativePosition(), b->GetFPRelativePosition(),
wxString::Format( _( "%s position differs." ), PAD_DESC( a ) ) );
TEST( a->GetNumber(), b->GetNumber(), "" ); TEST( a->GetNumber(), b->GetNumber(),
wxString::Format( _( "%s has different numbers." ), PAD_DESC( a ) ) );
// These are assigned from the schematic and not from the library // These are assigned from the schematic and not from the library
// TEST( a->GetPinFunction(), b->GetPinFunction() ); // TEST( a->GetPinFunction(), b->GetPinFunction() );
// TEST( a->GetPinType(), b->GetPinType() ); // TEST( a->GetPinType(), b->GetPinType() );
TEST( a->GetRemoveUnconnected(), b->GetRemoveUnconnected(), "" ); bool layerSettingsDiffer = a->GetRemoveUnconnected() != b->GetRemoveUnconnected();
// NB: KeepTopBottom is undefined if RemoveUnconnected is NOT set. // NB: KeepTopBottom is undefined if RemoveUnconnected is NOT set.
if( a->GetRemoveUnconnected() ) if( a->GetRemoveUnconnected() )
TEST( a->GetKeepTopBottom(), b->GetKeepTopBottom(), "" ); layerSettingsDiffer |= a->GetKeepTopBottom() != b->GetKeepTopBottom();
TEST( a->GetShape(), b->GetShape(), "" );
// Trim layersets to the current board before comparing // Trim layersets to the current board before comparing
LSET enabledLayers = a->GetBoard()->GetEnabledLayers(); LSET enabledLayers = a->GetBoard()->GetEnabledLayers();
LSET aLayers = a->GetLayerSet() & enabledLayers; LSET aLayers = a->GetLayerSet() & enabledLayers;
LSET bLayers = b->GetLayerSet() & enabledLayers; LSET bLayers = b->GetLayerSet() & enabledLayers;
TEST( aLayers, bLayers, "" );
TEST( a->GetAttribute(), b->GetAttribute(), "" ); if( layerSettingsDiffer || aLayers != bLayers )
TEST( a->GetProperty(), b->GetProperty(), "" ); {
diff = true;
if( aReporter )
aReporter->Report( wxString::Format( _( "%s layers differ." ), PAD_DESC( a ) ) );
else
return true;
}
TEST( a->GetShape(), b->GetShape(),
wxString::Format( _( "%s pad shape type differs." ), PAD_DESC( a ) ) );
TEST( a->GetAttribute(), b->GetAttribute(),
wxString::Format( _( "%s pad type differs." ), PAD_DESC( a ) ) );
TEST( a->GetProperty(), b->GetProperty(),
wxString::Format( _( "%s fabrication property differs." ), PAD_DESC( a ) ) );
// The pad orientation, for historical reasons is the pad rotation + parent rotation. // The pad orientation, for historical reasons is the pad rotation + parent rotation.
TEST_D( ( a->GetOrientation() - a->GetParentFootprint()->GetOrientation() ).Normalize().AsDegrees(), TEST_D( ( a->GetOrientation() - a->GetParentFootprint()->GetOrientation() ).Normalize().AsDegrees(),
( b->GetOrientation() - b->GetParentFootprint()->GetOrientation() ).Normalize().AsDegrees(), ( b->GetOrientation() - b->GetParentFootprint()->GetOrientation() ).Normalize().AsDegrees(),
"" ); wxString::Format( _( "%s orientation differs." ), PAD_DESC( a ) ) );
TEST( a->GetSize(), b->GetSize(), "" ); TEST( a->GetSize(), b->GetSize(),
TEST( a->GetDelta(), b->GetDelta(), "" ); wxString::Format( _( "%s size differs." ), PAD_DESC( a ) ) );
TEST( a->GetRoundRectCornerRadius(), b->GetRoundRectCornerRadius(), "" ); TEST( a->GetDelta(), b->GetDelta(),
TEST_D( a->GetRoundRectRadiusRatio(), b->GetRoundRectRadiusRatio(), "" ); wxString::Format( _( "%s trapezoid delta differs." ), PAD_DESC( a ) ) );
TEST_D( a->GetChamferRectRatio(), b->GetChamferRectRatio(), "" );
TEST( a->GetChamferPositions(), b->GetChamferPositions(), "" );
TEST( a->GetOffset(), b->GetOffset(), "" );
TEST( a->GetDrillShape(), b->GetDrillShape(), "" ); if( a->GetRoundRectCornerRadius() != b->GetRoundRectCornerRadius()
TEST( a->GetDrillSize(), b->GetDrillSize(), "" ); || a->GetRoundRectRadiusRatio() != b->GetRoundRectRadiusRatio() )
{
diff = true;
if( aReporter )
aReporter->Report( wxString::Format( _( "%s rounded corners differ." ), PAD_DESC( a ) ) );
else
return true;
}
if( a->GetChamferRectRatio() != b->GetChamferRectRatio()
|| a->GetChamferPositions() != b->GetChamferPositions() )
{
diff = true;
if( aReporter )
aReporter->Report( wxString::Format( _( "%s chamfered corners differ." ), PAD_DESC( a ) ) );
else
return true;
}
TEST( a->GetOffset(), b->GetOffset(),
wxString::Format( _( "%s shape offset from hole differs." ), PAD_DESC( a ) ) );
TEST( a->GetDrillShape(), b->GetDrillShape(),
wxString::Format( _( "%s drill shape differs." ), PAD_DESC( a ) ) );
TEST( a->GetDrillSize(), b->GetDrillSize(),
wxString::Format( _( "%s drill size differs." ), PAD_DESC( a ) ) );
// Clearance and zone connection overrides are as likely to be set at the board level as in // Clearance and zone connection overrides are as likely to be set at the board level as in
// the library. // the library.
@ -228,38 +296,38 @@ bool padNeedsUpdate( const PAD* a, const PAD* b )
// //
// On the other hand, if we report them then boards that override at the board level are // On the other hand, if we report them then boards that override at the board level are
// going to be VERY noisy. // going to be VERY noisy.
#if 0 //
if( padHasOverrides( a, b ) // So we just do it when we have a reporter.
return true; if( aReporter && padHasOverrides( a, b, aReporter ) )
#endif diff = true;
TEST( a->GetPrimitives().size(), b->GetPrimitives().size(), "" ); bool primitivesDiffer = false;
for( size_t ii = 0; ii < a->GetPrimitives().size(); ++ii ) if( a->GetPrimitives().size() != b->GetPrimitives().size() )
{ {
if( primitiveNeedsUpdate( a->GetPrimitives()[ii], b->GetPrimitives()[ii] ) ) primitivesDiffer = true;
return true; }
else
{
for( size_t ii = 0; ii < a->GetPrimitives().size(); ++ii )
{
if( primitiveNeedsUpdate( a->GetPrimitives()[ii], b->GetPrimitives()[ii] ) )
{
primitivesDiffer = true;
break;
}
}
} }
return diff; if( primitivesDiffer )
} {
diff = true;
if( aReporter )
bool padHasOverrides( const PAD* a, const PAD* b ) aReporter->Report( wxString::Format( _( "%s shape primitives differ." ), PAD_DESC( a ) ) );
{ else
REPORTER* aReporter = nullptr; return true;
bool diff = false; }
TEST( a->GetLocalClearance(), b->GetLocalClearance(), "" );
TEST( a->GetLocalSolderMaskMargin(), b->GetLocalSolderMaskMargin(), "" );
TEST( a->GetLocalSolderPasteMargin(), b->GetLocalSolderPasteMargin(), "" );
TEST_D( a->GetLocalSolderPasteMarginRatio(), b->GetLocalSolderPasteMarginRatio(), "" );
TEST( a->GetZoneConnection(), b->GetZoneConnection(), "" );
TEST( a->GetThermalGap(), b->GetThermalGap(), "" );
TEST( a->GetThermalSpokeWidth(), b->GetThermalSpokeWidth(), "" );
TEST_D( a->GetThermalSpokeAngle().AsDegrees(), b->GetThermalSpokeAngle().AsDegrees(), "" );
TEST( a->GetCustomShapeInZoneOpt(), b->GetCustomShapeInZoneOpt(), "" );
return diff; return diff;
} }
@ -611,16 +679,10 @@ bool FOOTPRINT::FootprintNeedsUpdate( const FOOTPRINT* aLibFootprint, REPORTER*
{ {
for( auto aIt = aPads.begin(), bIt = bPads.begin(); aIt != aPads.end(); aIt++, bIt++ ) for( auto aIt = aPads.begin(), bIt = bPads.begin(); aIt != aPads.end(); aIt++, bIt++ )
{ {
if( padNeedsUpdate( *aIt, *bIt ) ) if( padNeedsUpdate( *aIt, *bIt, aReporter ) )
{
diff = true; diff = true;
REPORT( wxString::Format( _( "Pad %s differs." ), (*aIt)->GetNumber() ) ); else if( aReporter && padHasOverrides( *aIt, *bIt, aReporter ) )
}
else if( aReporter && padHasOverrides( *aIt, *bIt ) )
{
diff = true; diff = true;
REPORT( wxString::Format( _( "Pad %s has overrides." ), (*aIt)->GetNumber() ) );
}
} }
} }

View File

@ -79,7 +79,6 @@ void DRC_TEST_PROVIDER_ZONE_CONNECTIONS::testZoneLayer( ZONE* aZone, PCB_LAYER_I
BOARD_DESIGN_SETTINGS& bds = board->GetDesignSettings(); BOARD_DESIGN_SETTINGS& bds = board->GetDesignSettings();
std::shared_ptr<CONNECTIVITY_DATA> connectivity = board->GetConnectivity(); std::shared_ptr<CONNECTIVITY_DATA> connectivity = board->GetConnectivity();
DRC_CONSTRAINT constraint; DRC_CONSTRAINT constraint;
wxString msg;
const std::shared_ptr<SHAPE_POLY_SET>& zoneFill = aZone->GetFilledPolysList( aLayer ); const std::shared_ptr<SHAPE_POLY_SET>& zoneFill = aZone->GetFilledPolysList( aLayer );
ISOLATED_ISLANDS isolatedIslands; ISOLATED_ISLANDS isolatedIslands;