Check drilled holes against other holes, even if laser burned.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/18142
This commit is contained in:
parent
9f2c9636f0
commit
18e33a0957
|
@ -1189,16 +1189,11 @@ DRC_CONSTRAINT DRC_ENGINE::EvalRules( DRC_CONSTRAINT_T aConstraintType, const BO
|
|||
}
|
||||
}
|
||||
else if( c->constraint.m_Type == HOLE_TO_HOLE_CONSTRAINT
|
||||
&& ( !a->HasDrilledHole() || !b->HasDrilledHole() ) )
|
||||
&& ( !a->HasDrilledHole() && !b->HasDrilledHole() ) )
|
||||
{
|
||||
// Report non-drilled-holes as an implicit condition
|
||||
if( aReporter )
|
||||
{
|
||||
const BOARD_ITEM* x = !a->HasDrilledHole() ? a : b;
|
||||
|
||||
REPORT( wxString::Format( _( "%s is not a drilled hole; rule ignored." ),
|
||||
x->GetItemDescription( this ) ) )
|
||||
}
|
||||
REPORT( wxString::Format( _( "%s is not a drilled hole; rule ignored." ),
|
||||
a->GetItemDescription( this ) ) )
|
||||
}
|
||||
else if( !c->condition || c->condition->GetExpression().IsEmpty() )
|
||||
{
|
||||
|
|
|
@ -102,7 +102,7 @@ DRC_ITEM DRC_ITEM::holeClearance( DRCE_HOLE_CLEARANCE,
|
|||
wxT( "hole_clearance" ) );
|
||||
|
||||
DRC_ITEM DRC_ITEM::holeNearHole( DRCE_DRILLED_HOLES_TOO_CLOSE,
|
||||
_( "Drilled holes too close together" ),
|
||||
_( "Drilled hole too close to other hole" ),
|
||||
wxT( "hole_to_hole" ) );
|
||||
|
||||
DRC_ITEM DRC_ITEM::holesCoLocated( DRCE_DRILLED_HOLES_COLOCATED,
|
||||
|
|
|
@ -76,20 +76,17 @@ private:
|
|||
};
|
||||
|
||||
|
||||
static std::shared_ptr<SHAPE_CIRCLE> getDrilledHoleShape( BOARD_ITEM* aItem )
|
||||
static std::shared_ptr<SHAPE_CIRCLE> getHoleShape( BOARD_ITEM* aItem )
|
||||
{
|
||||
if( aItem->HasDrilledHole() )
|
||||
if( aItem->Type() == PCB_VIA_T )
|
||||
{
|
||||
if( aItem->Type() == PCB_VIA_T )
|
||||
{
|
||||
PCB_VIA* via = static_cast<PCB_VIA*>( aItem );
|
||||
return std::make_shared<SHAPE_CIRCLE>( via->GetCenter(), via->GetDrillValue() / 2 );
|
||||
}
|
||||
else if( aItem->Type() == PCB_PAD_T )
|
||||
{
|
||||
PAD* pad = static_cast<PAD*>( aItem );
|
||||
return std::make_shared<SHAPE_CIRCLE>( pad->GetPosition(), pad->GetDrillSize().x / 2 );
|
||||
}
|
||||
PCB_VIA* via = static_cast<PCB_VIA*>( aItem );
|
||||
return std::make_shared<SHAPE_CIRCLE>( via->GetCenter(), via->GetDrillValue() / 2 );
|
||||
}
|
||||
else if( aItem->Type() == PCB_PAD_T )
|
||||
{
|
||||
PAD* pad = static_cast<PAD*>( aItem );
|
||||
return std::make_shared<SHAPE_CIRCLE>( pad->GetPosition(), pad->GetDrillSize().x / 2 );
|
||||
}
|
||||
|
||||
return std::make_shared<SHAPE_CIRCLE>( VECTOR2I( 0, 0 ), 0 );
|
||||
|
@ -179,7 +176,7 @@ bool DRC_TEST_PROVIDER_HOLE_TO_HOLE::Run()
|
|||
// holes (which are generally drilled post laminataion).
|
||||
if( via->GetViaType() != VIATYPE::MICROVIA )
|
||||
{
|
||||
std::shared_ptr<SHAPE_CIRCLE> holeShape = getDrilledHoleShape( via );
|
||||
std::shared_ptr<SHAPE_CIRCLE> holeShape = getHoleShape( via );
|
||||
|
||||
m_holeTree.QueryColliding( via, Edge_Cuts, Edge_Cuts,
|
||||
// Filter:
|
||||
|
@ -221,10 +218,10 @@ bool DRC_TEST_PROVIDER_HOLE_TO_HOLE::Run()
|
|||
if( !reportProgress( ii++, count, progressDelta ) )
|
||||
return false; // DRC cancelled
|
||||
|
||||
// We only care about drilled (ie: round) holes
|
||||
// We only care about drilled (ie: round) pad holes
|
||||
if( pad->HasDrilledHole() )
|
||||
{
|
||||
std::shared_ptr<SHAPE_CIRCLE> holeShape = getDrilledHoleShape( pad );
|
||||
std::shared_ptr<SHAPE_CIRCLE> holeShape = getHoleShape( pad );
|
||||
|
||||
m_holeTree.QueryColliding( pad, Edge_Cuts, Edge_Cuts,
|
||||
// Filter:
|
||||
|
@ -276,11 +273,11 @@ bool DRC_TEST_PROVIDER_HOLE_TO_HOLE::testHoleAgainstHole( BOARD_ITEM* aItem, SHA
|
|||
if( !reportCoLocation && !reportHole2Hole )
|
||||
return false;
|
||||
|
||||
std::shared_ptr<SHAPE_CIRCLE> otherHole = getDrilledHoleShape( aOther );
|
||||
std::shared_ptr<SHAPE_CIRCLE> otherHole = getHoleShape( aOther );
|
||||
int epsilon = m_board->GetDesignSettings().GetDRCEpsilon();
|
||||
SEG::ecoord epsilon_sq = SEG::Square( epsilon );
|
||||
|
||||
// Blind-buried or microvias that don't overlap layers aren't an issue.
|
||||
// Blind-buried vias are drilled prior to stackup; they're only an issue if they share layers
|
||||
if( aItem->Type() == PCB_VIA_T && aOther->Type() == PCB_VIA_T )
|
||||
{
|
||||
LSET viaHoleLayers = static_cast<PCB_VIA*>( aItem )->GetLayerSet() & LSET::AllCuMask();
|
||||
|
@ -306,7 +303,7 @@ bool DRC_TEST_PROVIDER_HOLE_TO_HOLE::testHoleAgainstHole( BOARD_ITEM* aItem, SHA
|
|||
|
||||
auto constraint = m_drcEngine->EvalRules( HOLE_TO_HOLE_CONSTRAINT, aItem, aOther,
|
||||
UNDEFINED_LAYER /* holes pierce all layers */ );
|
||||
int minClearance = constraint.GetValue().Min() - epsilon;
|
||||
int minClearance = std::max( 0, constraint.GetValue().Min() - epsilon );
|
||||
|
||||
if( constraint.GetSeverity() != RPT_SEVERITY_IGNORE
|
||||
&& minClearance >= 0
|
||||
|
|
|
@ -422,7 +422,7 @@ public:
|
|||
|
||||
bool HasDrilledHole() const override
|
||||
{
|
||||
return m_viaType == VIATYPE::THROUGH;
|
||||
return m_viaType == VIATYPE::THROUGH || m_viaType == VIATYPE::BLIND_BURIED;
|
||||
}
|
||||
|
||||
std::shared_ptr<SHAPE_SEGMENT> GetEffectiveHoleShape() const override;
|
||||
|
|
|
@ -1112,7 +1112,7 @@ int BOARD_INSPECTION_TOOL::InspectClearance( const TOOL_EVENT& aEvent )
|
|||
r->Flush();
|
||||
}
|
||||
|
||||
if( a->HasDrilledHole() && b->HasDrilledHole() )
|
||||
if( a->HasDrilledHole() || b->HasDrilledHole() )
|
||||
{
|
||||
if( !pageAdded )
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue