Renaming for clarity and a performance improvement in corner rounding.
This commit is contained in:
parent
208dd5cbd5
commit
d12e5d824e
|
@ -440,6 +440,7 @@ static void insideArea( LIBEVAL::CONTEXT* aCtx, void* self )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
BOARD* board = item->GetBoard();
|
BOARD* board = item->GetBoard();
|
||||||
|
BOARD_DESIGN_SETTINGS& bds = board->GetDesignSettings();
|
||||||
EDA_RECT itemBBox;
|
EDA_RECT itemBBox;
|
||||||
std::shared_ptr<SHAPE> shape;
|
std::shared_ptr<SHAPE> shape;
|
||||||
|
|
||||||
|
@ -448,17 +449,17 @@ static void insideArea( LIBEVAL::CONTEXT* aCtx, void* self )
|
||||||
else
|
else
|
||||||
itemBBox = item->GetBoundingBox();
|
itemBBox = item->GetBoundingBox();
|
||||||
|
|
||||||
auto realInsideZone =
|
auto itemIsInsideArea =
|
||||||
[&]( ZONE* zone ) -> bool
|
[&]( ZONE* area ) -> bool
|
||||||
{
|
{
|
||||||
if( !zone->GetCachedBoundingBox().Intersects( itemBBox ) )
|
if( !area->GetCachedBoundingBox().Intersects( itemBBox ) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Collisions include touching, so we need to deflate outline by enough to
|
// Collisions include touching, so we need to deflate outline by enough to
|
||||||
// exclude touching. This is particularly important for detecting copper fills
|
// exclude touching. This is particularly important for detecting copper fills
|
||||||
// as they will be exactly touching along the entire border.
|
// as they will be exactly touching along the entire border.
|
||||||
SHAPE_POLY_SET zoneOutline = *zone->Outline();
|
SHAPE_POLY_SET areaOutline = *area->Outline();
|
||||||
zoneOutline.Deflate( Millimeter2iu( 0.001 ), 4 );
|
areaOutline.Deflate( bds.GetDRCEpsilon(), 0, SHAPE_POLY_SET::ALLOW_ACUTE_CORNERS );
|
||||||
|
|
||||||
if( item->GetFlags() & HOLE_PROXY )
|
if( item->GetFlags() & HOLE_PROXY )
|
||||||
{
|
{
|
||||||
|
@ -467,14 +468,14 @@ static void insideArea( LIBEVAL::CONTEXT* aCtx, void* self )
|
||||||
PAD* pad = static_cast<PAD*>( item );
|
PAD* pad = static_cast<PAD*>( item );
|
||||||
const SHAPE_SEGMENT* holeShape = pad->GetEffectiveHoleShape();
|
const SHAPE_SEGMENT* holeShape = pad->GetEffectiveHoleShape();
|
||||||
|
|
||||||
return zoneOutline.Collide( holeShape );
|
return areaOutline.Collide( holeShape );
|
||||||
}
|
}
|
||||||
else if( item->Type() == PCB_VIA_T )
|
else if( item->Type() == PCB_VIA_T )
|
||||||
{
|
{
|
||||||
VIA* via = static_cast<VIA*>( item );
|
VIA* via = static_cast<VIA*>( item );
|
||||||
const SHAPE_CIRCLE holeShape( via->GetPosition(), via->GetDrillValue() );
|
const SHAPE_CIRCLE holeShape( via->GetPosition(), via->GetDrillValue() );
|
||||||
|
|
||||||
return zoneOutline.Collide( &holeShape );
|
return areaOutline.Collide( &holeShape );
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -492,7 +493,7 @@ static void insideArea( LIBEVAL::CONTEXT* aCtx, void* self )
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ( zone->GetLayerSet() & LSET::FrontMask() ).any() )
|
if( ( area->GetLayerSet() & LSET::FrontMask() ).any() )
|
||||||
{
|
{
|
||||||
SHAPE_POLY_SET courtyard = footprint->GetPolyCourtyardFront();
|
SHAPE_POLY_SET courtyard = footprint->GetPolyCourtyardFront();
|
||||||
|
|
||||||
|
@ -505,11 +506,11 @@ static void insideArea( LIBEVAL::CONTEXT* aCtx, void* self )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return zoneOutline.Collide( &courtyard.Outline( 0 ) );
|
return areaOutline.Collide( &courtyard.Outline( 0 ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ( zone->GetLayerSet() & LSET::BackMask() ).any() )
|
if( ( area->GetLayerSet() & LSET::BackMask() ).any() )
|
||||||
{
|
{
|
||||||
SHAPE_POLY_SET courtyard = footprint->GetPolyCourtyardBack();
|
SHAPE_POLY_SET courtyard = footprint->GetPolyCourtyardBack();
|
||||||
|
|
||||||
|
@ -522,7 +523,7 @@ static void insideArea( LIBEVAL::CONTEXT* aCtx, void* self )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return zoneOutline.Collide( &courtyard.Outline( 0 ) );
|
return areaOutline.Collide( &courtyard.Outline( 0 ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -531,18 +532,18 @@ static void insideArea( LIBEVAL::CONTEXT* aCtx, void* self )
|
||||||
|
|
||||||
if( item->Type() == PCB_ZONE_T || item->Type() == PCB_FP_ZONE_T )
|
if( item->Type() == PCB_ZONE_T || item->Type() == PCB_FP_ZONE_T )
|
||||||
{
|
{
|
||||||
ZONE* itemZone = static_cast<ZONE*>( item );
|
ZONE* zone = static_cast<ZONE*>( item );
|
||||||
|
|
||||||
if( !itemZone->IsFilled() )
|
if( !zone->IsFilled() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
DRC_RTREE* itemRTree = board->m_CopperZoneRTrees[ itemZone ].get();
|
DRC_RTREE* zoneRTree = board->m_CopperZoneRTrees[ zone ].get();
|
||||||
|
|
||||||
if( itemRTree )
|
if( zoneRTree )
|
||||||
{
|
{
|
||||||
for( PCB_LAYER_ID layer : zone->GetLayerSet().Seq() )
|
for( PCB_LAYER_ID layer : area->GetLayerSet().Seq() )
|
||||||
{
|
{
|
||||||
if( itemRTree->QueryColliding( itemBBox, &zoneOutline, layer, 0 ) )
|
if( zoneRTree->QueryColliding( itemBBox, &areaOutline, layer, 0 ) )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -554,24 +555,24 @@ static void insideArea( LIBEVAL::CONTEXT* aCtx, void* self )
|
||||||
if( !shape )
|
if( !shape )
|
||||||
shape = item->GetEffectiveShape( context->GetLayer() );
|
shape = item->GetEffectiveShape( context->GetLayer() );
|
||||||
|
|
||||||
return zoneOutline.Collide( shape.get() );
|
return areaOutline.Collide( shape.get() );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
auto insideZone =
|
auto checkArea =
|
||||||
[&]( ZONE* zone ) -> bool
|
[&]( ZONE* area ) -> bool
|
||||||
{
|
{
|
||||||
if( !zone || zone == item || zone->GetParent() == item )
|
if( !area || area == item || area->GetParent() == item )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
std::unique_lock<std::mutex> cacheLock( board->m_CachesMutex );
|
std::unique_lock<std::mutex> cacheLock( board->m_CachesMutex );
|
||||||
std::pair<BOARD_ITEM*, BOARD_ITEM*> key( zone, item );
|
std::pair<BOARD_ITEM*, BOARD_ITEM*> key( area, item );
|
||||||
auto i = board->m_InsideAreaCache.find( key );
|
auto i = board->m_InsideAreaCache.find( key );
|
||||||
|
|
||||||
if( i != board->m_InsideAreaCache.end() )
|
if( i != board->m_InsideAreaCache.end() )
|
||||||
return i->second;
|
return i->second;
|
||||||
|
|
||||||
bool isInside = realInsideZone( zone );
|
bool isInside = itemIsInsideArea( area );
|
||||||
|
|
||||||
board->m_InsideAreaCache[ key ] = isInside;
|
board->m_InsideAreaCache[ key ] = isInside;
|
||||||
return isInside;
|
return isInside;
|
||||||
|
@ -579,25 +580,25 @@ static void insideArea( LIBEVAL::CONTEXT* aCtx, void* self )
|
||||||
|
|
||||||
if( arg->AsString() == "A" )
|
if( arg->AsString() == "A" )
|
||||||
{
|
{
|
||||||
if( insideZone( dynamic_cast<ZONE*>( context->GetItem( 0 ) ) ) )
|
if( checkArea( dynamic_cast<ZONE*>( context->GetItem( 0 ) ) ) )
|
||||||
result->Set( 1.0 );
|
result->Set( 1.0 );
|
||||||
}
|
}
|
||||||
else if( arg->AsString() == "B" )
|
else if( arg->AsString() == "B" )
|
||||||
{
|
{
|
||||||
if( insideZone( dynamic_cast<ZONE*>( context->GetItem( 1 ) ) ) )
|
if( checkArea( dynamic_cast<ZONE*>( context->GetItem( 1 ) ) ) )
|
||||||
result->Set( 1.0 );
|
result->Set( 1.0 );
|
||||||
}
|
}
|
||||||
else if( KIID::SniffTest( arg->AsString() ) )
|
else if( KIID::SniffTest( arg->AsString() ) )
|
||||||
{
|
{
|
||||||
KIID target( arg->AsString() );
|
KIID target( arg->AsString() );
|
||||||
|
|
||||||
for( ZONE* candidate : board->Zones() )
|
for( ZONE* area : board->Zones() )
|
||||||
{
|
{
|
||||||
// Only a single zone can match the UUID; exit once we find a match whether
|
// Only a single zone can match the UUID; exit once we find a match whether
|
||||||
// "inside" or not
|
// "inside" or not
|
||||||
if( candidate->m_Uuid == target )
|
if( area->m_Uuid == target )
|
||||||
{
|
{
|
||||||
if( insideZone( candidate ) )
|
if( checkArea( area ) )
|
||||||
result->Set( 1.0 );
|
result->Set( 1.0 );
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -606,13 +607,13 @@ static void insideArea( LIBEVAL::CONTEXT* aCtx, void* self )
|
||||||
|
|
||||||
for( FOOTPRINT* footprint : board->Footprints() )
|
for( FOOTPRINT* footprint : board->Footprints() )
|
||||||
{
|
{
|
||||||
for( ZONE* candidate : footprint->Zones() )
|
for( ZONE* area : footprint->Zones() )
|
||||||
{
|
{
|
||||||
// Only a single zone can match the UUID; exit once we find a match whether
|
// Only a single zone can match the UUID; exit once we find a match whether
|
||||||
// "inside" or not
|
// "inside" or not
|
||||||
if( candidate->m_Uuid == target )
|
if( area->m_Uuid == target )
|
||||||
{
|
{
|
||||||
if( insideZone( candidate ) )
|
if( checkArea( area ) )
|
||||||
result->Set( 1.0 );
|
result->Set( 1.0 );
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -622,12 +623,12 @@ static void insideArea( LIBEVAL::CONTEXT* aCtx, void* self )
|
||||||
}
|
}
|
||||||
else // Match on zone name
|
else // Match on zone name
|
||||||
{
|
{
|
||||||
for( ZONE* candidate : board->Zones() )
|
for( ZONE* area : board->Zones() )
|
||||||
{
|
{
|
||||||
if( candidate->GetZoneName().Matches( arg->AsString() ) )
|
if( area->GetZoneName().Matches( arg->AsString() ) )
|
||||||
{
|
{
|
||||||
// Many zones can match the name; exit only when we find an "inside"
|
// Many zones can match the name; exit only when we find an "inside"
|
||||||
if( insideZone( candidate ) )
|
if( checkArea( area ) )
|
||||||
{
|
{
|
||||||
result->Set( 1.0 );
|
result->Set( 1.0 );
|
||||||
return;
|
return;
|
||||||
|
@ -637,12 +638,12 @@ static void insideArea( LIBEVAL::CONTEXT* aCtx, void* self )
|
||||||
|
|
||||||
for( FOOTPRINT* footprint : board->Footprints() )
|
for( FOOTPRINT* footprint : board->Footprints() )
|
||||||
{
|
{
|
||||||
for( ZONE* candidate : footprint->Zones() )
|
for( ZONE* area : footprint->Zones() )
|
||||||
{
|
{
|
||||||
// Many zones can match the name; exit only when we find an "inside"
|
// Many zones can match the name; exit only when we find an "inside"
|
||||||
if( candidate->GetZoneName().Matches( arg->AsString() ) )
|
if( area->GetZoneName().Matches( arg->AsString() ) )
|
||||||
{
|
{
|
||||||
if( insideZone( candidate ) )
|
if( checkArea( area ) )
|
||||||
{
|
{
|
||||||
result->Set( 1.0 );
|
result->Set( 1.0 );
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in New Issue