router: Improved via placement code. - Blind/buried vias going through all layers are converted to TH vias. - If current layer is not set in the pair, router switches to the top layer instead of keep using the same layer. - Microvias switch between one of the outer layers and the adjacent one.

This commit is contained in:
Maciej Suminski 2015-09-24 18:34:22 +02:00
parent 504cf55642
commit f2807035df
1 changed files with 51 additions and 19 deletions

View File

@ -372,11 +372,11 @@ void ROUTER_TOOL::switchLayerOnViaPlacement()
optional<int> newLayer = m_router->Sizes().PairedLayer( cl );
if( newLayer )
{
m_router->SwitchLayer( *newLayer );
m_frame->SetActiveLayer( ToLAYER_ID( *newLayer ) );
}
if( !newLayer )
newLayer = m_router->Sizes().GetLayerTop();
m_router->SwitchLayer( *newLayer );
m_frame->SetActiveLayer( ToLAYER_ID( *newLayer ) );
}
@ -386,13 +386,13 @@ bool ROUTER_TOOL::onViaCommand( VIATYPE_T aType )
const int layerCount = bds.GetCopperLayerCount();
int currentLayer = m_router->GetCurrentLayer();
LAYER_ID pairTop = m_frame->GetScreen()->m_Route_Layer_TOP;
LAYER_ID pairBottom = m_frame->GetScreen()->m_Route_Layer_BOTTOM;
PNS_SIZES_SETTINGS sizes = m_router->Sizes();
// fixme: P&S supports more than one fixed layer pair. Update the dialog?
sizes.ClearLayerPairs();
sizes.AddLayerPair( m_frame->GetScreen()->m_Route_Layer_TOP,
m_frame->GetScreen()->m_Route_Layer_BOTTOM );
if( !m_router->IsPlacingVia() )
{
@ -419,24 +419,56 @@ bool ROUTER_TOOL::onViaCommand( VIATYPE_T aType )
// Can only place microvias if we're on an outer layer, or directly adjacent to one
if( ( aType == VIA_MICROVIA ) && ( currentLayer > In1_Cu ) && ( currentLayer < layerCount - 2 ) )
{
DisplayError( m_frame, _( "Microvias can be placed only on the outer layers." ) );
DisplayError( m_frame, _( "Microvias can be placed only between the outer layers " \
"(F.Cu/B.Cu) and the ones directly adjacent to them." ) );
return false;
}
}
// Cannot place blind vias with front/back as the layer pair, this doesn't make sense
if( ( aType == VIA_BLIND_BURIED ) && ( sizes.GetLayerTop() == F_Cu ) && ( sizes.GetLayerBottom() == B_Cu ) )
{
DisplayError( m_frame, _( "Only through vias can be placed between front and bottom layers." ) );
return false;
}
// Convert blind/buried via to a through hole one, if it goes through all layers
if( aType == VIA_BLIND_BURIED && ( ( currentLayer == B_Cu ) || ( currentLayer == F_Cu ) )
&& ( ( pairTop == B_Cu && pairBottom == F_Cu )
|| ( pairTop == F_Cu && pairBottom == B_Cu ) ) )
{
aType = VIA_THROUGH;
}
switch( aType )
{
case VIA_THROUGH:
sizes.SetViaDiameter( bds.GetCurrentViaSize() );
sizes.SetViaDrill( bds.GetCurrentViaDrill() );
sizes.AddLayerPair( F_Cu, B_Cu );
break;
case VIA_MICROVIA:
sizes.SetViaDiameter( bds.GetCurrentMicroViaSize() );
sizes.SetViaDrill( bds.GetCurrentMicroViaDrill() );
if( currentLayer == F_Cu || currentLayer == In1_Cu )
sizes.AddLayerPair( F_Cu, In1_Cu );
else if( currentLayer == B_Cu || currentLayer == layerCount - 2 )
sizes.AddLayerPair( B_Cu, layerCount - 2 );
else
wxASSERT( false );
break;
case VIA_BLIND_BURIED:
sizes.SetViaDiameter( bds.GetCurrentViaSize() );
sizes.SetViaDrill( bds.GetCurrentViaDrill() );
if( currentLayer == pairTop || currentLayer == pairBottom )
sizes.AddLayerPair( pairTop, pairBottom );
else
sizes.AddLayerPair( pairTop, currentLayer );
break;
default:
wxASSERT( false );
break;
}
sizes.SetViaType( aType );
if( VIA_MICROVIA == aType )
{
sizes.SetViaDiameter( bds.GetCurrentMicroViaSize() );
sizes.SetViaDrill( bds.GetCurrentMicroViaDrill() );
}
m_router->UpdateSizes( sizes );
m_router->ToggleViaPlacement();