Browse Source

Add proper collision test to via placer.

Also moves DISALLOW constraint processing outside the loop as it
performs it's own loop over any objects referenced by the rules.

Fixes https://gitlab.com/kicad/code/kicad/issues/11832
7.0
Jeff Young 3 years ago
parent
commit
73836b50fc
  1. 18
      pcbnew/tools/drawing_tool.cpp

18
pcbnew/tools/drawing_tool.cpp

@ -2527,16 +2527,10 @@ int DRAWING_TOOL::DrawVia( const TOOL_EVENT& aEvent )
if( ( aOther->Type() == PCB_ZONE_T || aOther->Type() == PCB_FP_ZONE_T )
&& static_cast<ZONE*>( aOther )->GetIsRuleArea() )
{
ZONE* zone = static_cast<ZONE*>( aOther );
ZONE* ruleArea = static_cast<ZONE*>( aOther );
if( zone->GetDoNotAllowVias() )
return true;
constraint = m_drcEngine->EvalRules( DISALLOW_CONSTRAINT, aVia, nullptr,
UNDEFINED_LAYER );
if( constraint.m_DisallowFlags && constraint.GetSeverity() != RPT_SEVERITY_IGNORE )
return true;
if( ruleArea->GetDoNotAllowVias() )
return ruleArea->Outline()->Collide( aVia->GetPosition(), aVia->GetWidth() / 2 );
return false;
}
@ -2642,6 +2636,12 @@ int DRAWING_TOOL::DrawVia( const TOOL_EVENT& aEvent )
checkedItems.insert( item );
}
DRC_CONSTRAINT constraint = m_drcEngine->EvalRules( DISALLOW_CONSTRAINT, aVia, nullptr,
UNDEFINED_LAYER );
if( constraint.m_DisallowFlags && constraint.GetSeverity() != RPT_SEVERITY_IGNORE )
return true;
return false;
}

Loading…
Cancel
Save