From 3c6b98a0d5e2f9080c16a518fd60db83dbc7240e Mon Sep 17 00:00:00 2001 From: Jon Evans Date: Sun, 6 Jun 2021 20:18:09 -0400 Subject: [PATCH] PNS: preserve auto-detected track width when changing via sizes Fixes https://gitlab.com/kicad/code/kicad/-/issues/8046 --- pcbnew/router/pns_kicad_iface.cpp | 1 + pcbnew/router/pns_line_placer.cpp | 12 ++++++++++-- pcbnew/router/pns_sizes_settings.h | 5 +++++ pcbnew/router/router_tool.cpp | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/pcbnew/router/pns_kicad_iface.cpp b/pcbnew/router/pns_kicad_iface.cpp index bf8fba98b8..5dac8b4a55 100644 --- a/pcbnew/router/pns_kicad_iface.cpp +++ b/pcbnew/router/pns_kicad_iface.cpp @@ -463,6 +463,7 @@ bool PNS_KICAD_IFACE_BASE::ImportSizes( PNS::SIZES_SETTINGS& aSizes, PNS::ITEM* } aSizes.SetTrackWidth( trackWidth ); + aSizes.SetTrackWidthIsExplicit( !found ); int viaDiameter = bds.m_ViasMinSize; int viaDrill = bds.m_MinThroughDrill; diff --git a/pcbnew/router/pns_line_placer.cpp b/pcbnew/router/pns_line_placer.cpp index de55256f4a..6836d3ec9e 100644 --- a/pcbnew/router/pns_line_placer.cpp +++ b/pcbnew/router/pns_line_placer.cpp @@ -1543,8 +1543,16 @@ void LINE_PLACER::UpdateSizes( const SIZES_SETTINGS& aSizes ) if( !m_idle ) { - m_head.SetWidth( m_sizes.TrackWidth() ); - m_tail.SetWidth( m_sizes.TrackWidth() ); + // If the track width was originally determined from the rules resolver ("use netclass + // width") or continuing from an existing track, we don't want to change the width unless + // the user is moving to an explicitly-specified value. + // NOTE: This doesn't quite correctly handle the case of moving *from* an explicit value + // *to* the "use netclass width" value, but that is more complicated to handle. + if( m_sizes.TrackWidthIsExplicit() ) + { + m_head.SetWidth( m_sizes.TrackWidth() ); + m_tail.SetWidth( m_sizes.TrackWidth() ); + } if( m_head.EndsWithVia() ) { diff --git a/pcbnew/router/pns_sizes_settings.h b/pcbnew/router/pns_sizes_settings.h index d9f34e3403..0ec6ad609f 100644 --- a/pcbnew/router/pns_sizes_settings.h +++ b/pcbnew/router/pns_sizes_settings.h @@ -40,6 +40,7 @@ public: SIZES_SETTINGS() : m_minClearance( 0 ), m_trackWidth( 155000 ), + m_trackWidthIsExplicit( true ), m_viaType( VIATYPE::THROUGH ), m_viaDiameter( 600000 ), m_viaDrill( 250000 ), @@ -61,6 +62,9 @@ public: int TrackWidth() const { return m_trackWidth; } void SetTrackWidth( int aWidth ) { m_trackWidth = aWidth; } + bool TrackWidthIsExplicit() const { return m_trackWidthIsExplicit; } + void SetTrackWidthIsExplicit( bool aIsExplicit ) { m_trackWidthIsExplicit = aIsExplicit; } + int DiffPairWidth() const { return m_diffPairWidth; } int DiffPairGap() const { return m_diffPairGap; } @@ -102,6 +106,7 @@ public: private: int m_minClearance; int m_trackWidth; + bool m_trackWidthIsExplicit; VIATYPE m_viaType; int m_viaDiameter; diff --git a/pcbnew/router/router_tool.cpp b/pcbnew/router/router_tool.cpp index be6675a6e8..f7df35be36 100644 --- a/pcbnew/router/router_tool.cpp +++ b/pcbnew/router/router_tool.cpp @@ -1873,7 +1873,7 @@ int ROUTER_TOOL::onTrackViaSizeChanged( const TOOL_EVENT& aEvent ) PNS::SIZES_SETTINGS sizes( m_router->Sizes() ); if( !m_router->GetCurrentNets().empty() ) - m_iface->ImportSizes( sizes, nullptr, m_router->GetCurrentNets()[0] ); + m_iface->ImportSizes( sizes, m_startItem, m_router->GetCurrentNets()[0] ); m_router->UpdateSizes( sizes );