|
|
|
@ -128,6 +128,8 @@ static void existsOnLayerFunc( LIBEVAL::CONTEXT* aCtx, void *self ) |
|
|
|
aCtx->ReportError( wxString::Format( _( "Unrecognized layer '%s'" ), |
|
|
|
layerName ) ); |
|
|
|
} |
|
|
|
|
|
|
|
return 0.0; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
@ -136,12 +138,18 @@ static void existsOnLayerFunc( LIBEVAL::CONTEXT* aCtx, void *self ) |
|
|
|
*/ |
|
|
|
|
|
|
|
BOARD* board = item->GetBoard(); |
|
|
|
std::unique_lock<std::shared_mutex> cacheLock( board->m_CachesMutex ); |
|
|
|
|
|
|
|
{ |
|
|
|
std::shared_lock<std::shared_mutex> readLock( board->m_CachesMutex ); |
|
|
|
|
|
|
|
auto i = board->m_LayerExpressionCache.find( layerName ); |
|
|
|
|
|
|
|
if( i != board->m_LayerExpressionCache.end() ) |
|
|
|
return ( item->GetLayerSet() & i->second ).any() ? 1.0 : 0.0; |
|
|
|
} |
|
|
|
|
|
|
|
LSET mask; |
|
|
|
|
|
|
|
if( i == board->m_LayerExpressionCache.end() ) |
|
|
|
{ |
|
|
|
for( unsigned ii = 0; ii < layerMap.GetCount(); ++ii ) |
|
|
|
{ |
|
|
|
wxPGChoiceEntry& entry = layerMap[ ii ]; |
|
|
|
@ -150,18 +158,13 @@ static void existsOnLayerFunc( LIBEVAL::CONTEXT* aCtx, void *self ) |
|
|
|
mask.set( ToLAYER_ID( entry.GetValue() ) ); |
|
|
|
} |
|
|
|
|
|
|
|
board->m_LayerExpressionCache[ layerName ] = mask; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
mask = i->second; |
|
|
|
std::unique_lock<std::shared_mutex> writeLock( board->m_CachesMutex ); |
|
|
|
board->m_LayerExpressionCache[ layerName ] = mask; |
|
|
|
} |
|
|
|
|
|
|
|
if( ( item->GetLayerSet() & mask ).any() ) |
|
|
|
return 1.0; |
|
|
|
return ( item->GetLayerSet() & mask ).any() ? 1.0 : 0.0; |
|
|
|
} |
|
|
|
|
|
|
|
return 0.0; |
|
|
|
} ); |
|
|
|
} |
|
|
|
|
|
|
|
@ -273,10 +276,11 @@ static void intersectsCourtyardFunc( LIBEVAL::CONTEXT* aCtx, void* self ) |
|
|
|
[&]( FOOTPRINT* fp ) |
|
|
|
{ |
|
|
|
PTR_PTR_CACHE_KEY key = { fp, item }; |
|
|
|
std::unique_lock<std::shared_mutex> cacheLock( board->m_CachesMutex ); |
|
|
|
|
|
|
|
if( ( item->GetFlags() & ROUTER_TRANSIENT ) == 0 ) |
|
|
|
{ |
|
|
|
std::shared_lock<std::shared_mutex> readLock( board->m_CachesMutex ); |
|
|
|
|
|
|
|
auto i = board->m_IntersectsCourtyardCache.find( key ); |
|
|
|
|
|
|
|
if( i != board->m_IntersectsCourtyardCache.end() ) |
|
|
|
@ -287,7 +291,10 @@ static void intersectsCourtyardFunc( LIBEVAL::CONTEXT* aCtx, void* self ) |
|
|
|
|| collidesWithCourtyard( item, itemShape, context, fp, B_Cu ); |
|
|
|
|
|
|
|
if( ( item->GetFlags() & ROUTER_TRANSIENT ) == 0 ) |
|
|
|
{ |
|
|
|
std::unique_lock<std::shared_mutex> cacheLock( board->m_CachesMutex ); |
|
|
|
board->m_IntersectsCourtyardCache[ key ] = res; |
|
|
|
} |
|
|
|
|
|
|
|
return res; |
|
|
|
} ) ) |
|
|
|
@ -333,10 +340,11 @@ static void intersectsFrontCourtyardFunc( LIBEVAL::CONTEXT* aCtx, void* self ) |
|
|
|
[&]( FOOTPRINT* fp ) |
|
|
|
{ |
|
|
|
PTR_PTR_CACHE_KEY key = { fp, item }; |
|
|
|
std::unique_lock<std::shared_mutex> cacheLock( board->m_CachesMutex ); |
|
|
|
|
|
|
|
if( ( item->GetFlags() & ROUTER_TRANSIENT ) == 0 ) |
|
|
|
{ |
|
|
|
std::shared_lock<std::shared_mutex> readLock( board->m_CachesMutex ); |
|
|
|
|
|
|
|
auto i = board->m_IntersectsFCourtyardCache.find( key ); |
|
|
|
|
|
|
|
if( i != board->m_IntersectsFCourtyardCache.end() ) |
|
|
|
@ -346,7 +354,10 @@ static void intersectsFrontCourtyardFunc( LIBEVAL::CONTEXT* aCtx, void* self ) |
|
|
|
bool res = collidesWithCourtyard( item, itemShape, context, fp, F_Cu ); |
|
|
|
|
|
|
|
if( ( item->GetFlags() & ROUTER_TRANSIENT ) == 0 ) |
|
|
|
{ |
|
|
|
std::unique_lock<std::shared_mutex> writeLock( board->m_CachesMutex ); |
|
|
|
board->m_IntersectsFCourtyardCache[ key ] = res; |
|
|
|
} |
|
|
|
|
|
|
|
return res; |
|
|
|
} ) ) |
|
|
|
@ -392,10 +403,11 @@ static void intersectsBackCourtyardFunc( LIBEVAL::CONTEXT* aCtx, void* self ) |
|
|
|
[&]( FOOTPRINT* fp ) |
|
|
|
{ |
|
|
|
PTR_PTR_CACHE_KEY key = { fp, item }; |
|
|
|
std::unique_lock<std::shared_mutex> cacheLock( board->m_CachesMutex ); |
|
|
|
|
|
|
|
if( ( item->GetFlags() & ROUTER_TRANSIENT ) == 0 ) |
|
|
|
{ |
|
|
|
std::shared_lock<std::shared_mutex> readLock( board->m_CachesMutex ); |
|
|
|
|
|
|
|
auto i = board->m_IntersectsBCourtyardCache.find( key ); |
|
|
|
|
|
|
|
if( i != board->m_IntersectsBCourtyardCache.end() ) |
|
|
|
@ -405,7 +417,10 @@ static void intersectsBackCourtyardFunc( LIBEVAL::CONTEXT* aCtx, void* self ) |
|
|
|
bool res = collidesWithCourtyard( item, itemShape, context, fp, B_Cu ); |
|
|
|
|
|
|
|
if( ( item->GetFlags() & ROUTER_TRANSIENT ) == 0 ) |
|
|
|
{ |
|
|
|
std::unique_lock<std::shared_mutex> writeLock( board->m_CachesMutex ); |
|
|
|
board->m_IntersectsBCourtyardCache[ key ] = res; |
|
|
|
} |
|
|
|
|
|
|
|
return res; |
|
|
|
} ) ) |
|
|
|
@ -650,7 +665,6 @@ static void intersectsAreaFunc( LIBEVAL::CONTEXT* aCtx, void* self ) |
|
|
|
return false; |
|
|
|
|
|
|
|
LSET testLayers; |
|
|
|
PTR_PTR_LAYER_CACHE_KEY key; |
|
|
|
|
|
|
|
if( aLayer != UNDEFINED_LAYER ) |
|
|
|
testLayers.set( aLayer ); |
|
|
|
@ -659,10 +673,11 @@ static void intersectsAreaFunc( LIBEVAL::CONTEXT* aCtx, void* self ) |
|
|
|
|
|
|
|
for( PCB_LAYER_ID layer : testLayers.UIOrder() ) |
|
|
|
{ |
|
|
|
PTR_PTR_LAYER_CACHE_KEY key = { aArea, item, layer }; |
|
|
|
|
|
|
|
if( ( item->GetFlags() & ROUTER_TRANSIENT ) == 0 ) |
|
|
|
{ |
|
|
|
std::shared_lock<std::shared_mutex> cacheLock( board->m_CachesMutex ); |
|
|
|
key = { aArea, item, layer }; |
|
|
|
std::shared_lock<std::shared_mutex> readLock( board->m_CachesMutex ); |
|
|
|
|
|
|
|
auto i = board->m_IntersectsAreaCache.find( key ); |
|
|
|
|
|
|
|
@ -674,7 +689,7 @@ static void intersectsAreaFunc( LIBEVAL::CONTEXT* aCtx, void* self ) |
|
|
|
|
|
|
|
if( ( item->GetFlags() & ROUTER_TRANSIENT ) == 0 ) |
|
|
|
{ |
|
|
|
std::unique_lock<std::shared_mutex> cacheLock( board->m_CachesMutex ); |
|
|
|
std::unique_lock<std::shared_mutex> writeLock( board->m_CachesMutex ); |
|
|
|
board->m_IntersectsAreaCache[ key ] = collides; |
|
|
|
} |
|
|
|
|
|
|
|
@ -736,11 +751,12 @@ static void enclosedByAreaFunc( LIBEVAL::CONTEXT* aCtx, void* self ) |
|
|
|
if( !aArea->GetBoundingBox().Intersects( itemBBox ) ) |
|
|
|
return false; |
|
|
|
|
|
|
|
std::unique_lock<std::shared_mutex> cacheLock( board->m_CachesMutex ); |
|
|
|
PTR_PTR_LAYER_CACHE_KEY key = { aArea, item, layer }; |
|
|
|
|
|
|
|
if( ( item->GetFlags() & ROUTER_TRANSIENT ) == 0 ) |
|
|
|
{ |
|
|
|
std::shared_lock<std::shared_mutex> readLock( board->m_CachesMutex ); |
|
|
|
|
|
|
|
auto i = board->m_EnclosedByAreaCache.find( key ); |
|
|
|
|
|
|
|
if( i != board->m_EnclosedByAreaCache.end() ) |
|
|
|
@ -767,7 +783,10 @@ static void enclosedByAreaFunc( LIBEVAL::CONTEXT* aCtx, void* self ) |
|
|
|
} |
|
|
|
|
|
|
|
if( ( item->GetFlags() & ROUTER_TRANSIENT ) == 0 ) |
|
|
|
{ |
|
|
|
std::unique_lock<std::shared_mutex> writeLock( board->m_CachesMutex ); |
|
|
|
board->m_EnclosedByAreaCache[ key ] = enclosedByArea; |
|
|
|
} |
|
|
|
|
|
|
|
return enclosedByArea; |
|
|
|
} ) ) |
|
|
|
|