From 937854c5771d88903badc32eb5091eb138e9282d Mon Sep 17 00:00:00 2001 From: Jeff Young <jeff@rokeby.ie> Date: Thu, 1 Aug 2024 14:33:00 +0100 Subject: [PATCH] Make target length sticky within a session. Fixes https://gitlab.com/kicad/code/kicad/-/issues/18109 --- .../dialog_tuning_pattern_properties.cpp | 58 ++++++++++++++----- pcbnew/router/pns_meander.cpp | 5 +- pcbnew/router/pns_meander.h | 1 + 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/pcbnew/dialogs/dialog_tuning_pattern_properties.cpp b/pcbnew/dialogs/dialog_tuning_pattern_properties.cpp index de6734a99a..8e3e47bf0f 100644 --- a/pcbnew/dialogs/dialog_tuning_pattern_properties.cpp +++ b/pcbnew/dialogs/dialog_tuning_pattern_properties.cpp @@ -24,6 +24,10 @@ #include <drc/drc_engine.h> +long long int g_lastTargetLength = PNS::MEANDER_SETTINGS::LENGTH_UNCONSTRAINED; +int g_lastTargetSkew = 0; + + DIALOG_TUNING_PATTERN_PROPERTIES::DIALOG_TUNING_PATTERN_PROPERTIES( PCB_BASE_EDIT_FRAME* aFrame, PNS::MEANDER_SETTINGS& aSettings, PNS::ROUTER_MODE aMeanderType, @@ -63,6 +67,8 @@ DIALOG_TUNING_PATTERN_PROPERTIES::DIALOG_TUNING_PATTERN_PROPERTIES( PCB_BASE_EDI GetSizer()->SetSizeHints( this ); SetupStandardButtons(); + SetInitialFocus( m_targetLengthCtrl ); + GetSizer()->SetSizeHints( this ); Centre(); } @@ -71,12 +77,25 @@ DIALOG_TUNING_PATTERN_PROPERTIES::DIALOG_TUNING_PATTERN_PROPERTIES( PCB_BASE_EDI bool DIALOG_TUNING_PATTERN_PROPERTIES::TransferDataToWindow() { if( m_mode == PNS::PNS_MODE_TUNE_DIFF_PAIR_SKEW ) + { m_targetLength.SetValue( m_settings.m_targetSkew.Opt() ); + + if( m_targetLength.GetValue() == PNS::MEANDER_SETTINGS::SKEW_UNCONSTRAINED ) + m_targetLength.SetValue( g_lastTargetSkew ); + + if( m_targetLength.GetValue() == PNS::MEANDER_SETTINGS::SKEW_UNCONSTRAINED ) + m_targetLengthCtrl->SetValue( wxEmptyString ); + } else + { m_targetLength.SetValue( m_settings.m_targetLength.Opt() ); - if( m_targetLength.GetValue() == std::numeric_limits<int>::max() ) - m_targetLengthCtrl->SetValue( wxEmptyString ); + if( m_targetLength.GetValue() == PNS::MEANDER_SETTINGS::LENGTH_UNCONSTRAINED ) + m_targetLength.SetValue( g_lastTargetLength ); + + if( m_targetLength.GetValue() == PNS::MEANDER_SETTINGS::LENGTH_UNCONSTRAINED ) + m_targetLength.SetValue( wxEmptyString ); + } m_overrideCustomRules->SetValue( m_settings.m_overrideCustomRules ); @@ -100,22 +119,29 @@ bool DIALOG_TUNING_PATTERN_PROPERTIES::TransferDataToWindow() bool DIALOG_TUNING_PATTERN_PROPERTIES::TransferDataFromWindow() { - if(! m_targetLengthCtrl->GetValue().IsEmpty() ) + if( m_mode == PNS::PNS_MODE_TUNE_DIFF_PAIR_SKEW ) { - if( m_mode == PNS::PNS_MODE_TUNE_DIFF_PAIR_SKEW ) - { - if( m_targetLength.GetValue() != m_constraint.GetValue().Opt() ) - m_settings.SetTargetSkew( m_targetLength.GetValue() ); - else - m_settings.m_targetSkew = m_constraint.GetValue(); - } + if( m_targetLengthCtrl->GetValue().IsEmpty() ) + g_lastTargetSkew = PNS::MEANDER_SETTINGS::SKEW_UNCONSTRAINED; else - { - if( m_targetLength.GetValue() != m_constraint.GetValue().Opt() ) - m_settings.SetTargetLength( m_targetLength.GetValue() ); - else - m_settings.SetTargetLength( m_constraint.GetValue() ); - } + g_lastTargetSkew = m_targetLength.GetIntValue(); + + if( g_lastTargetSkew != m_constraint.GetValue().Opt() ) + m_settings.SetTargetSkew( g_lastTargetSkew ); + else + m_settings.m_targetSkew = m_constraint.GetValue(); + } + else + { + if( m_targetLengthCtrl->GetValue().IsEmpty() ) + g_lastTargetLength = PNS::MEANDER_SETTINGS::LENGTH_UNCONSTRAINED; + else + g_lastTargetLength = m_targetLength.GetIntValue(); + + if( g_lastTargetLength != m_constraint.GetValue().Opt() ) + m_settings.SetTargetLength( g_lastTargetLength ); + else + m_settings.SetTargetLength( m_constraint.GetValue() ); } m_settings.m_overrideCustomRules = m_overrideCustomRules->GetValue(); diff --git a/pcbnew/router/pns_meander.cpp b/pcbnew/router/pns_meander.cpp index 93384c49fe..34539245d4 100644 --- a/pcbnew/router/pns_meander.cpp +++ b/pcbnew/router/pns_meander.cpp @@ -30,6 +30,7 @@ namespace PNS { const long long int MEANDER_SETTINGS::DEFAULT_TOLERANCE( pcbIUScale.mmToIU( 0.1 ) ); const long long int MEANDER_SETTINGS::LENGTH_UNCONSTRAINED( 1000000 * pcbIUScale.IU_PER_MM ); +const int MEANDER_SETTINGS::SKEW_UNCONSTRAINED( std::numeric_limits<int>::max() ); MEANDER_SETTINGS::MEANDER_SETTINGS() @@ -55,7 +56,7 @@ void MEANDER_SETTINGS::SetTargetLength( long long int aOpt ) { m_targetLength.SetOpt( aOpt ); - if( aOpt == std::numeric_limits<long long int>::max() ) + if( aOpt == PNS::MEANDER_SETTINGS::LENGTH_UNCONSTRAINED ) { m_targetLength.SetMin( 0 ); m_targetLength.SetMax( aOpt ); @@ -84,7 +85,7 @@ void MEANDER_SETTINGS::SetTargetSkew( int aOpt ) { m_targetSkew.SetOpt( aOpt ); - if( aOpt == std::numeric_limits<int>::max() ) + if( aOpt == PNS::MEANDER_SETTINGS::SKEW_UNCONSTRAINED ) { m_targetSkew.SetMin( 0 ); m_targetSkew.SetMax( aOpt ); diff --git a/pcbnew/router/pns_meander.h b/pcbnew/router/pns_meander.h index ff17549816..f70dc19992 100644 --- a/pcbnew/router/pns_meander.h +++ b/pcbnew/router/pns_meander.h @@ -69,6 +69,7 @@ class MEANDER_SETTINGS public: static const long long int DEFAULT_TOLERANCE; static const long long int LENGTH_UNCONSTRAINED; + static const int SKEW_UNCONSTRAINED; MEANDER_SETTINGS();