Ease acquisition of a target item.
pickSingleItem() had a two-attempt algorithm, but the second attempt was never made because we'd check for no hits before throwing out the aAvoidItems. The second attempt would fail anyway because QueryHoverItems() ignored the aUseClearance flag when not idle, and didn't factor in the actual clearance.
This commit is contained in:
parent
1d19672054
commit
d040690f60
|
@ -119,8 +119,25 @@ bool ROUTER::RoutingInProgress() const
|
|||
|
||||
const ITEM_SET ROUTER::QueryHoverItems( const VECTOR2I& aP, bool aUseClearance )
|
||||
{
|
||||
NODE* node;
|
||||
int clearance;
|
||||
|
||||
if( m_state == IDLE || m_placer == nullptr )
|
||||
{
|
||||
node = m_world.get();
|
||||
clearance = 0;
|
||||
}
|
||||
else if( m_mode == PNS_MODE_ROUTE_SINGLE )
|
||||
{
|
||||
node = m_placer->CurrentNode();
|
||||
clearance = m_sizes.Clearance() + m_sizes.TrackWidth() / 2;
|
||||
}
|
||||
else if( m_mode == PNS_MODE_ROUTE_DIFF_PAIR )
|
||||
{
|
||||
node = m_placer->CurrentNode();
|
||||
clearance = m_sizes.Clearance() + m_sizes.DiffPairWidth() / 2;
|
||||
}
|
||||
|
||||
if( aUseClearance )
|
||||
{
|
||||
NODE::OBSTACLES obs;
|
||||
|
@ -131,7 +148,8 @@ const ITEM_SET ROUTER::QueryHoverItems( const VECTOR2I& aP, bool aUseClearance )
|
|||
test.SetLayers( LAYER_RANGE::All() );
|
||||
|
||||
opts.m_differentNetsOnly = false;
|
||||
m_world->QueryColliding( &test, obs, opts );
|
||||
opts.m_overrideClearance = clearance;
|
||||
node->QueryColliding( &test, obs, opts );
|
||||
|
||||
PNS::ITEM_SET ret;
|
||||
|
||||
|
@ -142,12 +160,7 @@ const ITEM_SET ROUTER::QueryHoverItems( const VECTOR2I& aP, bool aUseClearance )
|
|||
}
|
||||
else
|
||||
{
|
||||
return m_world->HitTest( aP );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return m_placer->CurrentNode()->HitTest( aP );
|
||||
return node->HitTest( aP );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -110,10 +110,21 @@ ITEM* TOOL_BASE::pickSingleItem( const VECTOR2I& aWhere, int aNet, int aLayer, b
|
|||
dist[i] = VECTOR2I::ECOORD_MAX;
|
||||
}
|
||||
|
||||
ITEM_SET candidates = m_router->QueryHoverItems( aWhere );
|
||||
auto haveCandidates =
|
||||
[&]()
|
||||
{
|
||||
for( ITEM* item : prioritized )
|
||||
{
|
||||
if( item )
|
||||
return true;
|
||||
}
|
||||
|
||||
if( candidates.Empty() )
|
||||
candidates = m_router->QueryHoverItems( aWhere, true );
|
||||
return false;
|
||||
};
|
||||
|
||||
for( bool useClearance : { false, true } )
|
||||
{
|
||||
ITEM_SET candidates = m_router->QueryHoverItems( aWhere, useClearance );
|
||||
|
||||
for( ITEM* item : candidates.Items() )
|
||||
{
|
||||
|
@ -191,14 +202,16 @@ ITEM* TOOL_BASE::pickSingleItem( const VECTOR2I& aWhere, int aNet, int aLayer, b
|
|||
}
|
||||
}
|
||||
|
||||
if( haveCandidates() )
|
||||
break;
|
||||
}
|
||||
|
||||
ITEM* rv = nullptr;
|
||||
|
||||
bool highContrast = ( frame()->GetDisplayOptions().m_ContrastModeDisplay != HIGH_CONTRAST_MODE::NORMAL );
|
||||
|
||||
for( int i = 0; i < candidateCount; i++ )
|
||||
for( ITEM* item : prioritized )
|
||||
{
|
||||
ITEM* item = prioritized[i];
|
||||
|
||||
if( highContrast && item && !item->Layers().Overlaps( tl ) )
|
||||
item = nullptr;
|
||||
|
||||
|
|
Loading…
Reference in New Issue