Allow a single net collision with a free pad.
This commit is contained in:
parent
16b4f96405
commit
3534cfbba8
|
@ -414,6 +414,7 @@ void DRC_TEST_PROVIDER_COPPER_CLEARANCE::testTrackClearances()
|
||||||
|
|
||||||
reportAux( wxT( "Testing %d tracks & vias..." ), m_board->Tracks().size() );
|
reportAux( wxT( "Testing %d tracks & vias..." ), m_board->Tracks().size() );
|
||||||
|
|
||||||
|
std::map<BOARD_ITEM*, int> freePadsUsageMap;
|
||||||
std::unordered_map<PTR_PTR_CACHE_KEY, LSET> checkedPairs;
|
std::unordered_map<PTR_PTR_CACHE_KEY, LSET> checkedPairs;
|
||||||
|
|
||||||
for( PCB_TRACK* track : m_board->Tracks() )
|
for( PCB_TRACK* track : m_board->Tracks() )
|
||||||
|
@ -457,6 +458,24 @@ void DRC_TEST_PROVIDER_COPPER_CLEARANCE::testTrackClearances()
|
||||||
// Visitor:
|
// Visitor:
|
||||||
[&]( BOARD_ITEM* other ) -> bool
|
[&]( BOARD_ITEM* other ) -> bool
|
||||||
{
|
{
|
||||||
|
if( other->Type() == PCB_PAD_T && static_cast<PAD*>( other )->IsFreePad() )
|
||||||
|
{
|
||||||
|
if( other->GetEffectiveShape( layer )->Collide( trackShape.get() ) )
|
||||||
|
{
|
||||||
|
auto it = freePadsUsageMap.find( other );
|
||||||
|
|
||||||
|
if( it == freePadsUsageMap.end() )
|
||||||
|
{
|
||||||
|
freePadsUsageMap[ other ] = track->GetNetCode();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if( it->second == track->GetNetCode() )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return testTrackAgainstItem( track, trackShape.get(), layer, other );
|
return testTrackAgainstItem( track, trackShape.get(), layer, other );
|
||||||
},
|
},
|
||||||
m_board->m_DRCMaxClearance );
|
m_board->m_DRCMaxClearance );
|
||||||
|
|
|
@ -296,17 +296,6 @@ void DRC_TEST_PROVIDER_SOLDER_MASK::testSilkToMaskClearance()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool isMaskAperture( BOARD_ITEM* aItem )
|
|
||||||
{
|
|
||||||
static const LSET saved( 2, F_Mask, B_Mask );
|
|
||||||
|
|
||||||
LSET maskLayers = aItem->GetLayerSet() & saved;
|
|
||||||
LSET otherLayers = aItem->GetLayerSet() & ~saved;
|
|
||||||
|
|
||||||
return maskLayers.count() > 0 && otherLayers.count() == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool isNullAperture( BOARD_ITEM* aItem )
|
bool isNullAperture( BOARD_ITEM* aItem )
|
||||||
{
|
{
|
||||||
if( aItem->Type() == PCB_PAD_T )
|
if( aItem->Type() == PCB_PAD_T )
|
||||||
|
@ -329,6 +318,21 @@ bool isNullAperture( BOARD_ITEM* aItem )
|
||||||
// Simple mask apertures aren't associated with copper items, so they only constitute a bridge
|
// Simple mask apertures aren't associated with copper items, so they only constitute a bridge
|
||||||
// when they expose other copper items having at least two distinct nets. We use a map to record
|
// when they expose other copper items having at least two distinct nets. We use a map to record
|
||||||
// the first net exposed by each mask aperture (on each copper layer).
|
// the first net exposed by each mask aperture (on each copper layer).
|
||||||
|
//
|
||||||
|
// Note that this algorithm is also used for free pads.
|
||||||
|
|
||||||
|
bool isMaskAperture( BOARD_ITEM* aItem )
|
||||||
|
{
|
||||||
|
if( aItem->Type() == PCB_PAD_T && static_cast<PAD*>( aItem )->IsFreePad() )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
static const LSET saved( 2, F_Mask, B_Mask );
|
||||||
|
|
||||||
|
LSET maskLayers = aItem->GetLayerSet() & saved;
|
||||||
|
LSET otherLayers = aItem->GetLayerSet() & ~saved;
|
||||||
|
|
||||||
|
return maskLayers.count() > 0 && otherLayers.count() == 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool DRC_TEST_PROVIDER_SOLDER_MASK::checkMaskAperture( BOARD_ITEM* aMaskItem, BOARD_ITEM* aTestItem,
|
bool DRC_TEST_PROVIDER_SOLDER_MASK::checkMaskAperture( BOARD_ITEM* aMaskItem, BOARD_ITEM* aTestItem,
|
||||||
PCB_LAYER_ID aTestLayer, int aTestNet,
|
PCB_LAYER_ID aTestLayer, int aTestNet,
|
||||||
|
|
Loading…
Reference in New Issue