Commit 59be0f6e authored by Andrew Zonenberg's avatar Andrew Zonenberg Committed by Maciej Suminski

1) Pad properties dialog can trigger divide-by-zero when "0" is entered as the pad size

2) PNS router incorrectly detects collisions with blind/buried vias that don't actually intersect the active layer
3) PNS router silently converts blind/buried vias to through-board vias when shoved
parents 33605eaa e6fba84e
...@@ -965,6 +965,11 @@ unsigned int D_PAD::ViewGetLOD( int aLayer ) const ...@@ -965,6 +965,11 @@ unsigned int D_PAD::ViewGetLOD( int aLayer ) const
// Netnames will be shown only if zoom is appropriate // Netnames will be shown only if zoom is appropriate
if( IsNetnameLayer( aLayer ) ) if( IsNetnameLayer( aLayer ) )
{ {
// Pad sizes can be zero briefly when someone is typing a number like "0.5" in the pad properties dialog.
// Fail gracefully if this happens.
if( ( m_Size.x == 0 ) && ( m_Size.y == 0 ) )
return UINT_MAX;
return ( 100000000 / std::max( m_Size.x, m_Size.y ) ); return ( 100000000 / std::max( m_Size.x, m_Size.y ) );
} }
......
...@@ -227,12 +227,15 @@ PNS_ITEM* PNS_ROUTER::syncTrack( TRACK* aTrack ) ...@@ -227,12 +227,15 @@ PNS_ITEM* PNS_ROUTER::syncTrack( TRACK* aTrack )
PNS_ITEM* PNS_ROUTER::syncVia( VIA* aVia ) PNS_ITEM* PNS_ROUTER::syncVia( VIA* aVia )
{ {
LAYER_ID top, bottom;
aVia->LayerPair( &top, &bottom );
PNS_VIA* v = new PNS_VIA( PNS_VIA* v = new PNS_VIA(
aVia->GetPosition(), aVia->GetPosition(),
PNS_LAYERSET( 0, MAX_CU_LAYERS - 1 ), PNS_LAYERSET( top, bottom ),
aVia->GetWidth(), aVia->GetWidth(),
aVia->GetDrillValue(), aVia->GetDrillValue(),
aVia->GetNetCode() ); aVia->GetNetCode(),
aVia->GetViaType() );
v->SetParent( aVia ); v->SetParent( aVia );
...@@ -759,8 +762,9 @@ void PNS_ROUTER::CommitRouting( PNS_NODE* aNode ) ...@@ -759,8 +762,9 @@ void PNS_ROUTER::CommitRouting( PNS_NODE* aNode )
via_board->SetWidth( via->Diameter() ); via_board->SetWidth( via->Diameter() );
via_board->SetDrill( via->Drill() ); via_board->SetDrill( via->Drill() );
via_board->SetNetCode( via->Net() ); via_board->SetNetCode( via->Net() );
via_board->SetLayerPair( ToLAYER_ID( m_settings.GetLayerTop() ), via_board->SetViaType( via->ViaType() ); // MUST be before SetLayerPair()
ToLAYER_ID( m_settings.GetLayerBottom() ) ); via_board->SetLayerPair( ToLAYER_ID( via->Layers().Start() ),
ToLAYER_ID( via->Layers().End() ) );
newBI = via_board; newBI = via_board;
break; break;
} }
......
...@@ -91,6 +91,7 @@ PNS_VIA* PNS_VIA::Clone ( ) const ...@@ -91,6 +91,7 @@ PNS_VIA* PNS_VIA::Clone ( ) const
v->m_shape = SHAPE_CIRCLE( m_pos, m_diameter / 2 ); v->m_shape = SHAPE_CIRCLE( m_pos, m_diameter / 2 );
v->m_rank = m_rank; v->m_rank = m_rank;
v->m_marker = m_marker; v->m_marker = m_marker;
v->m_viaType = m_viaType;
return v; return v;
} }
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
#include <geometry/shape_line_chain.h> #include <geometry/shape_line_chain.h>
#include <geometry/shape_circle.h> #include <geometry/shape_circle.h>
#include "../class_track.h"
#include "pns_item.h" #include "pns_item.h"
class PNS_NODE; class PNS_NODE;
...@@ -36,7 +38,7 @@ public: ...@@ -36,7 +38,7 @@ public:
{} {}
PNS_VIA( const VECTOR2I& aPos, const PNS_LAYERSET& aLayers, PNS_VIA( const VECTOR2I& aPos, const PNS_LAYERSET& aLayers,
int aDiameter, int aDrill, int aNet = -1 ) : int aDiameter, int aDrill, int aNet = -1, VIATYPE_T aViaType = VIA_THROUGH ) :
PNS_ITEM( VIA ) PNS_ITEM( VIA )
{ {
SetNet( aNet ); SetNet( aNet );
...@@ -45,6 +47,7 @@ public: ...@@ -45,6 +47,7 @@ public:
m_diameter = aDiameter; m_diameter = aDiameter;
m_drill = aDrill; m_drill = aDrill;
m_shape = SHAPE_CIRCLE( aPos, aDiameter / 2 ); m_shape = SHAPE_CIRCLE( aPos, aDiameter / 2 );
m_viaType = aViaType;
} }
...@@ -60,6 +63,7 @@ public: ...@@ -60,6 +63,7 @@ public:
m_rank = aB.m_rank; m_rank = aB.m_rank;
m_owner = aB.m_owner; m_owner = aB.m_owner;
m_drill = aB.m_drill; m_drill = aB.m_drill;
m_viaType = aB.m_viaType;
} }
const VECTOR2I& Pos() const const VECTOR2I& Pos() const
...@@ -73,6 +77,16 @@ public: ...@@ -73,6 +77,16 @@ public:
m_shape.SetCenter( aPos ); m_shape.SetCenter( aPos );
} }
VIATYPE_T ViaType() const
{
return m_viaType;
}
void SetViaType( VIATYPE_T aViaType )
{
m_viaType = aViaType;
}
int Diameter() const int Diameter() const
{ {
return m_diameter; return m_diameter;
...@@ -124,6 +138,7 @@ private: ...@@ -124,6 +138,7 @@ private:
int m_drill; int m_drill;
VECTOR2I m_pos; VECTOR2I m_pos;
SHAPE_CIRCLE m_shape; SHAPE_CIRCLE m_shape;
VIATYPE_T m_viaType;
}; };
#endif #endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment