From 94afdcb92a7da66646e8b30c4892fe2ad7402ea3 Mon Sep 17 00:00:00 2001 From: Jon Evans Date: Sat, 10 Apr 2021 15:17:29 -0400 Subject: [PATCH] PNS: Allow control of area-restricted drag optimization CHANGED: The interactive router settings now include a switch to enable or disable optimization of the entire dragged track, which is now disabled by default. When enabled, the router will reroute the entire track (from the dragged segment to the closest pad/via in each direction) to be more optimal. When disabled, only the area around the dragged segment will be modified. CHANGED: The "optimizer effort" slider is removed from the interactive router settings dialog, as this setting did not have any meaningful impact in most cases and was a source of confusion. Fixes https://gitlab.com/kicad/code/kicad/-/issues/5918 --- pcbnew/dialogs/dialog_pns_settings.cpp | 6 +- pcbnew/dialogs/dialog_pns_settings_base.cpp | 53 +--- pcbnew/dialogs/dialog_pns_settings_base.fbp | 307 +------------------- pcbnew/dialogs/dialog_pns_settings_base.h | 7 +- pcbnew/router/pns_dragger.cpp | 50 ++-- pcbnew/router/pns_routing_settings.cpp | 5 +- pcbnew/router/pns_routing_settings.h | 6 +- 7 files changed, 43 insertions(+), 391 deletions(-) diff --git a/pcbnew/dialogs/dialog_pns_settings.cpp b/pcbnew/dialogs/dialog_pns_settings.cpp index 83bd6fa26a..ebd026d925 100644 --- a/pcbnew/dialogs/dialog_pns_settings.cpp +++ b/pcbnew/dialogs/dialog_pns_settings.cpp @@ -42,12 +42,11 @@ DIALOG_PNS_SETTINGS::DIALOG_PNS_SETTINGS( wxWindow* aParent, PNS::ROUTING_SETTIN m_removeLoops->SetValue( m_settings.RemoveLoops() ); m_suggestEnding->SetValue( m_settings.SuggestFinish() ); m_smartPads->SetValue( m_settings.SmartPads() ); - m_effort->SetValue( m_settings.OptimizerEffort() ); m_smoothDragged->SetValue( m_settings.SmoothDraggedSegments() ); m_violateDrc->SetValue( m_settings.GetAllowDRCViolationsSetting() ); m_freeAngleMode->SetValue( m_settings.GetFreeAngleMode() ); m_dragToolMode->SetSelection ( m_settings.InlineDragEnabled() ? 1 : 0 ); - m_optimizeDraggedTrack->SetValue( m_settings.GetOptimizeDraggedTrack() ); + m_optimizeEntireDraggedTrack->SetValue( m_settings.GetOptimizeEntireDraggedTrack() ); m_autoPosture->SetValue( m_settings.GetAutoPosture() ); m_fixAllSegments->SetValue( m_settings.GetFixAllSegments() ); @@ -74,10 +73,9 @@ void DIALOG_PNS_SETTINGS::OnOkClick( wxCommandEvent& aEvent ) m_settings.SetRemoveLoops( m_removeLoops->GetValue() ); m_settings.SetSuggestFinish ( m_suggestEnding->GetValue() ); m_settings.SetSmartPads( m_smartPads->GetValue() ); - m_settings.SetOptimizerEffort( (PNS::PNS_OPTIMIZATION_EFFORT) m_effort->GetValue() ); m_settings.SetSmoothDraggedSegments( m_smoothDragged->GetValue() ); m_settings.SetInlineDragEnabled( m_dragToolMode->GetSelection () ? true : false ); - m_settings.SetOptimizeDraggedTrack( m_optimizeDraggedTrack->GetValue() ); + m_settings.SetOptimizeEntireDraggedTrack( m_optimizeEntireDraggedTrack->GetValue() ); m_settings.SetAutoPosture( m_autoPosture->GetValue() ); m_settings.SetFixAllSegments( m_fixAllSegments->GetValue() ); diff --git a/pcbnew/dialogs/dialog_pns_settings_base.cpp b/pcbnew/dialogs/dialog_pns_settings_base.cpp index e5449ccfbc..6104a3e5a6 100644 --- a/pcbnew/dialogs/dialog_pns_settings_base.cpp +++ b/pcbnew/dialogs/dialog_pns_settings_base.cpp @@ -83,8 +83,10 @@ DIALOG_PNS_SETTINGS_BASE::DIALOG_PNS_SETTINGS_BASE( wxWindow* parent, wxWindowID bOptions->Add( m_suggestEnding, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - m_optimizeDraggedTrack = new wxCheckBox( bOptions->GetStaticBox(), wxID_ANY, _("Optimize track being dragged"), wxDefaultPosition, wxDefaultSize, 0 ); - bOptions->Add( m_optimizeDraggedTrack, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + m_optimizeEntireDraggedTrack = new wxCheckBox( bOptions->GetStaticBox(), wxID_ANY, _("Optimize entire track being dragged"), wxDefaultPosition, wxDefaultSize, 0 ); + m_optimizeEntireDraggedTrack->SetToolTip( _("When enabled, the entire track will be optimized and re-routed when dragged. When disabled, only the area near the segment being dragged will be optimized.") ); + + bOptions->Add( m_optimizeEntireDraggedTrack, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_autoPosture = new wxCheckBox( bOptions->GetStaticBox(), wxID_ANY, _("Use mouse path to set track posture"), wxDefaultPosition, wxDefaultSize, 0 ); m_autoPosture->SetToolTip( _("When enabled, the posture of tracks will be guided by how the mouse is moved from the starting location") ); @@ -96,53 +98,6 @@ DIALOG_PNS_SETTINGS_BASE::DIALOG_PNS_SETTINGS_BASE( wxWindow* parent, wxWindowID bOptions->Add( m_fixAllSegments, 0, wxALL, 5 ); - wxBoxSizer* bEffort; - bEffort = new wxBoxSizer( wxHORIZONTAL ); - - m_effortLabel = new wxStaticText( bOptions->GetStaticBox(), wxID_ANY, _("Optimizer effort:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_effortLabel->Wrap( -1 ); - m_effortLabel->SetToolTip( _("Defines how much time the router shall spend optimizing the routed/shoved traces.\nMore effort means cleaner routing (but slower), less effort means faster routing but somewhat jagged traces.") ); - - bEffort->Add( m_effortLabel, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 20 ); - - - bEffort->Add( 5, 0, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSlider; - bSlider = new wxBoxSizer( wxVERTICAL ); - - m_effort = new wxSlider( bOptions->GetStaticBox(), wxID_ANY, 1, 0, 2, wxDefaultPosition, wxDefaultSize, wxSL_AUTOTICKS|wxSL_BOTTOM|wxSL_HORIZONTAL|wxSL_TOP ); - m_effort->SetMinSize( wxSize( -1,28 ) ); - - bSlider->Add( m_effort, 1, wxEXPAND|wxTOP, 5 ); - - wxBoxSizer* bSliderLabels; - bSliderLabels = new wxBoxSizer( wxHORIZONTAL ); - - m_lowLabel = new wxStaticText( bOptions->GetStaticBox(), wxID_ANY, _("low"), wxDefaultPosition, wxDefaultSize, 0 ); - m_lowLabel->Wrap( -1 ); - m_lowLabel->SetFont( wxFont( 8, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) ); - - bSliderLabels->Add( m_lowLabel, 0, 0, 5 ); - - - bSliderLabels->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_highLabel = new wxStaticText( bOptions->GetStaticBox(), wxID_ANY, _("high"), wxDefaultPosition, wxDefaultSize, 0 ); - m_highLabel->Wrap( -1 ); - m_highLabel->SetFont( wxFont( 8, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) ); - - bSliderLabels->Add( m_highLabel, 0, 0, 5 ); - - - bSlider->Add( bSliderLabels, 0, wxEXPAND|wxBOTTOM, 5 ); - - - bEffort->Add( bSlider, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); - - - bOptions->Add( bEffort, 0, wxEXPAND|wxALL, 5 ); - bMainSizer->Add( bOptions, 1, wxEXPAND|wxALL, 5 ); diff --git a/pcbnew/dialogs/dialog_pns_settings_base.fbp b/pcbnew/dialogs/dialog_pns_settings_base.fbp index e6264aaafd..bd6deb731c 100644 --- a/pcbnew/dialogs/dialog_pns_settings_base.fbp +++ b/pcbnew/dialogs/dialog_pns_settings_base.fbp @@ -826,7 +826,7 @@ 0 0 wxID_ANY - Optimize track being dragged + Optimize entire track being dragged 0 @@ -834,7 +834,7 @@ 0 1 - m_optimizeDraggedTrack + m_optimizeEntireDraggedTrack 1 @@ -847,7 +847,7 @@ 0 - + When enabled, the entire track will be optimized and re-routed when dragged. When disabled, only the area near the segment being dragged will be optimized. wxFILTER_NONE wxDefaultValidator @@ -985,307 +985,6 @@ - - 5 - wxEXPAND|wxALL - 0 - - - bEffort - wxHORIZONTAL - none - - 20 - wxALIGN_CENTER_VERTICAL|wxBOTTOM - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Optimizer effort: - 0 - - 0 - - - 0 - - 1 - m_effortLabel - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - Defines how much time the router shall spend optimizing the routed/shoved traces. More effort means cleaner routing (but slower), less effort means faster routing but somewhat jagged traces. - - - - -1 - - - - 5 - wxEXPAND - 0 - - 0 - protected - 5 - - - - 5 - wxEXPAND|wxTOP|wxRIGHT|wxLEFT - 1 - - - bSlider - wxVERTICAL - none - - 5 - wxEXPAND|wxTOP - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - 2 - - 1 - - 0 - -1,-1 - 0 - -1,28 - 1 - m_effort - 1 - - - protected - 1 - - Resizable - 1 - - wxSL_AUTOTICKS|wxSL_BOTTOM|wxSL_HORIZONTAL|wxSL_TOP - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 1 - - - - - - - 5 - wxEXPAND|wxBOTTOM - 0 - - - bSliderLabels - wxHORIZONTAL - none - - 5 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - ,90,90,8,70,0 - 0 - 0 - wxID_ANY - low - 0 - - 0 - - - 0 - - 1 - m_lowLabel - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 5 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - ,90,90,8,70,0 - 0 - 0 - wxID_ANY - high - 0 - - 0 - - - 0 - - 1 - m_highLabel - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - - - - - diff --git a/pcbnew/dialogs/dialog_pns_settings_base.h b/pcbnew/dialogs/dialog_pns_settings_base.h index db8a83ca1b..f2b4d2ec55 100644 --- a/pcbnew/dialogs/dialog_pns_settings_base.h +++ b/pcbnew/dialogs/dialog_pns_settings_base.h @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -48,13 +47,9 @@ class DIALOG_PNS_SETTINGS_BASE : public DIALOG_SHIM wxCheckBox* m_smoothDragged; wxCheckBox* m_violateDrc; wxCheckBox* m_suggestEnding; - wxCheckBox* m_optimizeDraggedTrack; + wxCheckBox* m_optimizeEntireDraggedTrack; wxCheckBox* m_autoPosture; wxCheckBox* m_fixAllSegments; - wxStaticText* m_effortLabel; - wxSlider* m_effort; - wxStaticText* m_lowLabel; - wxStaticText* m_highLabel; wxStdDialogButtonSizer* m_stdButtons; wxButton* m_stdButtonsOK; wxButton* m_stdButtonsCancel; diff --git a/pcbnew/router/pns_dragger.cpp b/pcbnew/router/pns_dragger.cpp index 5e5844ab81..46c8c880b0 100644 --- a/pcbnew/router/pns_dragger.cpp +++ b/pcbnew/router/pns_dragger.cpp @@ -392,34 +392,36 @@ void DRAGGER::optimizeAndUpdateDraggedLine( LINE& aDragged, const LINE& aOrig, c lockV = aDragged.CLine().NearestPoint( aP ); - if( Settings().GetOptimizeDraggedTrack() ) + OPTIMIZER optimizer( m_lastNode ); + + int effort = OPTIMIZER::MERGE_SEGMENTS | OPTIMIZER::KEEP_TOPOLOGY; + + if( !Settings().GetOptimizeEntireDraggedTrack() ) + effort |= OPTIMIZER::RESTRICT_AREA; + + optimizer.SetEffortLevel( effort ); + + OPT_BOX2I affectedArea = aDragged.ChangedArea( &aOrig ); + VECTOR2I anchor( aP ); + + if( aDragged.CLine().Find( aP ) < 0 ) { - OPTIMIZER optimizer( m_lastNode ); + anchor = aDragged.CLine().NearestPoint( aP ); + } - optimizer.SetEffortLevel( OPTIMIZER::MERGE_SEGMENTS | OPTIMIZER::KEEP_TOPOLOGY ); + optimizer.SetPreserveVertex( anchor ); - OPT_BOX2I affectedArea = aDragged.ChangedArea( &aOrig ); - VECTOR2I anchor( aP ); + if( affectedArea ) + { + Dbg()->AddPoint( anchor, 3 ); + Dbg()->AddBox( *affectedArea, 2 ); + optimizer.SetRestrictArea( *affectedArea ); + optimizer.Optimize( &aDragged ); - if( aDragged.CLine().Find( aP ) < 0 ) - { - anchor = aDragged.CLine().NearestPoint( aP ); - } + OPT_BOX2I optArea = aDragged.ChangedArea( &aOrig ); - optimizer.SetPreserveVertex( anchor ); - - if( affectedArea ) - { - Dbg()->AddPoint( anchor, 3 ); - Dbg()->AddBox( *affectedArea, 2 ); - optimizer.SetRestrictArea( *affectedArea ); - optimizer.Optimize( &aDragged ); - - OPT_BOX2I optArea = aDragged.ChangedArea( &aOrig ); - - if( optArea ) - Dbg()->AddBox( *optArea, 4 ); - } + if( optArea ) + Dbg()->AddBox( *optArea, 4 ); } m_lastNode->Add( aDragged ); @@ -547,6 +549,8 @@ bool DRAGGER::dragShove( const VECTOR2I& aP ) else dragged.DragCorner( aP, m_draggedSegmentIndex ); + Dbg()->AddLine( dragged.CLine(), 5, 10000 ); + SHOVE::SHOVE_STATUS st = m_shove->ShoveLines( dragged ); if( st == SHOVE::SH_OK ) diff --git a/pcbnew/router/pns_routing_settings.cpp b/pcbnew/router/pns_routing_settings.cpp index 9324624d64..edbd105bf3 100644 --- a/pcbnew/router/pns_routing_settings.cpp +++ b/pcbnew/router/pns_routing_settings.cpp @@ -50,7 +50,7 @@ ROUTING_SETTINGS::ROUTING_SETTINGS( JSON_SETTINGS* aParent, const std::string& a m_inlineDragEnabled = false; m_snapToTracks = false; m_snapToPads = false; - m_optimizeDraggedTrack = true; + m_optimizeEntireDraggedTrack = false; m_cornerMode = CORNER_MODE::MITERED_45; m_autoPosture = true; m_fixAllSegments = true; @@ -90,7 +90,8 @@ ROUTING_SETTINGS::ROUTING_SETTINGS( JSON_SETTINGS* aParent, const std::string& a m_params.emplace_back( new PARAM( "inline_drag", &m_inlineDragEnabled, false ) ); m_params.emplace_back( new PARAM( "snap_to_tracks", &m_snapToTracks, false ) ); m_params.emplace_back( new PARAM( "snap_to_pads", &m_snapToPads, false ) ); - m_params.emplace_back( new PARAM( "optimize_dragged_track", &m_optimizeDraggedTrack, true ) ); + m_params.emplace_back( new PARAM( "optimize_dragged_track", + &m_optimizeEntireDraggedTrack, false ) ); m_params.emplace_back( new PARAM( "auto_posture", &m_autoPosture, true ) ); m_params.emplace_back( new PARAM( "fix_all_segments", &m_fixAllSegments, true ) ); diff --git a/pcbnew/router/pns_routing_settings.h b/pcbnew/router/pns_routing_settings.h index 0bf62dd240..c3a26f56c5 100644 --- a/pcbnew/router/pns_routing_settings.h +++ b/pcbnew/router/pns_routing_settings.h @@ -155,8 +155,8 @@ public: CORNER_MODE GetCornerMode() const { return m_cornerMode; } void SetCornerMode( CORNER_MODE aMode ) { m_cornerMode = aMode; } - bool GetOptimizeDraggedTrack() const { return m_optimizeDraggedTrack; } - void SetOptimizeDraggedTrack( bool aEnable ) { m_optimizeDraggedTrack = aEnable; } + bool GetOptimizeEntireDraggedTrack() const { return m_optimizeEntireDraggedTrack; } + void SetOptimizeEntireDraggedTrack( bool aEnable ) { m_optimizeEntireDraggedTrack = aEnable; } bool GetAutoPosture() const { return m_autoPosture; } void SetAutoPosture( bool aEnable ) { m_autoPosture = aEnable; } @@ -178,7 +178,7 @@ private: bool m_inlineDragEnabled; bool m_snapToTracks; bool m_snapToPads; - bool m_optimizeDraggedTrack; + bool m_optimizeEntireDraggedTrack; bool m_autoPosture; bool m_fixAllSegments;