From 78b2e537775fa862c0f6e75c85d731ffdd099064 Mon Sep 17 00:00:00 2001 From: Alex Shvartzkop Date: Sat, 23 Nov 2024 17:26:14 +0300 Subject: [PATCH] Length tuning workflow improvements: -Allow changing length tuning settings before tuning has been started -Do not exit out of the length tuning tool after each placement -Keep specified settings between pattern placements Fixes https://gitlab.com/kicad/code/kicad/-/issues/18979 --- pcbnew/generators/pcb_tuning_pattern.cpp | 65 +++++++++++++++++------- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/pcbnew/generators/pcb_tuning_pattern.cpp b/pcbnew/generators/pcb_tuning_pattern.cpp index eb953d7325..415337f9c7 100644 --- a/pcbnew/generators/pcb_tuning_pattern.cpp +++ b/pcbnew/generators/pcb_tuning_pattern.cpp @@ -2246,10 +2246,20 @@ int DRAWING_TOOL::PlaceTuningPattern( const TOOL_EVENT& aEvent ) Activate(); BOARD* board = m_frame->GetBoard(); - std::shared_ptr& drcEngine = board->GetDesignSettings().m_DRCEngine; + BOARD_DESIGN_SETTINGS& bds = board->GetDesignSettings(); + std::shared_ptr& drcEngine = bds.m_DRCEngine; GENERATOR_TOOL* generatorTool = m_toolMgr->GetTool(); PNS::ROUTER* router = generatorTool->Router(); - LENGTH_TUNING_MODE mode = fromPNSMode( aEvent.Parameter() ); + PNS::ROUTER_MODE routerMode = aEvent.Parameter(); + LENGTH_TUNING_MODE mode = fromPNSMode( routerMode ); + PNS::MEANDER_SETTINGS meanderSettings; + + switch( mode ) + { + case LENGTH_TUNING_MODE::SINGLE: meanderSettings = bds.m_SingleTrackMeanderSettings; break; + case DIFF_PAIR: meanderSettings = bds.m_DiffPairMeanderSettings; break; + case DIFF_PAIR_SKEW: meanderSettings = bds.m_SkewMeanderSettings; break; + } KIGFX::VIEW_CONTROLS* controls = getViewControls(); PCB_SELECTION_TOOL* selectionTool = m_toolMgr->GetTool(); @@ -2270,6 +2280,20 @@ int DRAWING_TOOL::PlaceTuningPattern( const TOOL_EVENT& aEvent ) controls->ShowCursor( true ); }; + auto applyCommonSettings = [&]( PCB_TUNING_PATTERN* aPattern ) + { + auto origTargetLength = aPattern->GetSettings().m_targetLength; + auto origTargetSkew = aPattern->GetSettings().m_targetSkew; + + aPattern->GetSettings() = meanderSettings; + + if( meanderSettings.m_targetLength.IsNull() ) + aPattern->GetSettings().m_targetLength = origTargetLength; + + if( meanderSettings.m_targetSkew.IsNull() ) + aPattern->GetSettings().m_targetSkew = origTargetSkew; + }; + auto updateHoverStatus = [&]() { @@ -2285,6 +2309,8 @@ int DRAWING_TOOL::PlaceTuningPattern( const TOOL_EVENT& aEvent ) if( dummyPattern ) { + applyCommonSettings( dummyPattern.get() ); + dummyPattern->EditStart( generatorTool, m_board, nullptr ); dummyPattern->Update( generatorTool, m_board, nullptr ); @@ -2426,6 +2452,8 @@ int DRAWING_TOOL::PlaceTuningPattern( const TOOL_EVENT& aEvent ) m_tuningPattern = PCB_TUNING_PATTERN::CreateNew( generatorTool, m_frame, m_pickerItem, mode ); + applyCommonSettings( m_tuningPattern ); + int dummyDist; int dummyClearance = std::numeric_limits::max() / 2; VECTOR2I closestPt; @@ -2451,10 +2479,8 @@ int DRAWING_TOOL::PlaceTuningPattern( const TOOL_EVENT& aEvent ) m_tuningPattern->Update( generatorTool, m_board, &commit ); m_tuningPattern->EditPush( generatorTool, m_board, &commit, _( "Tune" ) ); - for( BOARD_ITEM* item : m_tuningPattern->GetItems() ) - item->SetSelected(); - - break; + m_tuningPattern = nullptr; + m_pickerItem = nullptr; } } else if( evt->IsClick( BUT_RIGHT ) ) @@ -2471,6 +2497,8 @@ int DRAWING_TOOL::PlaceTuningPattern( const TOOL_EVENT& aEvent ) placer->SpacingStep( evt->IsAction( &PCB_ACTIONS::spacingIncrease ) ? 1 : -1 ); m_tuningPattern->SetSpacing( placer->MeanderSettings().m_spacing ); + meanderSettings.m_spacing = placer->MeanderSettings().m_spacing; + updateTuningPattern(); } else @@ -2487,6 +2515,8 @@ int DRAWING_TOOL::PlaceTuningPattern( const TOOL_EVENT& aEvent ) placer->AmplitudeStep( evt->IsAction( &PCB_ACTIONS::amplIncrease ) ? 1 : -1 ); m_tuningPattern->SetMaxAmplitude( placer->MeanderSettings().m_maxAmplitude ); + meanderSettings.m_maxAmplitude = placer->MeanderSettings().m_maxAmplitude; + updateTuningPattern(); } else @@ -2495,12 +2525,12 @@ int DRAWING_TOOL::PlaceTuningPattern( const TOOL_EVENT& aEvent ) } } else if( evt->IsAction( &PCB_ACTIONS::properties ) - || evt->IsAction( &PCB_ACTIONS::lengthTunerSettings ) ) + || evt->IsAction( &PCB_ACTIONS::lengthTunerSettings ) ) { + DRC_CONSTRAINT constraint; + if( m_tuningPattern ) { - DRC_CONSTRAINT constraint; - if( !m_tuningPattern->GetItems().empty() ) { BOARD_ITEM* startItem = *m_tuningPattern->GetItems().begin(); @@ -2508,16 +2538,17 @@ int DRAWING_TOOL::PlaceTuningPattern( const TOOL_EVENT& aEvent ) constraint = drcEngine->EvalRules( LENGTH_CONSTRAINT, startItem, nullptr, startItem->GetLayer() ); } - - DIALOG_TUNING_PATTERN_PROPERTIES dlg( m_frame, m_tuningPattern->GetSettings(), - m_tuningPattern->GetPNSMode(), constraint ); - - if( dlg.ShowModal() == wxID_OK ) - updateTuningPattern(); } - else + + DIALOG_TUNING_PATTERN_PROPERTIES dlg( m_frame, meanderSettings, routerMode, + constraint ); + + if( dlg.ShowModal() == wxID_OK ) { - m_frame->ShowInfoBarWarning( _( "Select a track to tune first." ) ); + if( m_tuningPattern ) + applyCommonSettings( m_tuningPattern ); + + updateTuningPattern(); } } // TODO: It'd be nice to be able to say "don't allow any non-trivial editing actions",