diff --git a/pcbnew/class_track.cpp b/pcbnew/class_track.cpp index 7f3f0a035..4c544f9e6 100644 --- a/pcbnew/class_track.cpp +++ b/pcbnew/class_track.cpp @@ -1033,6 +1033,15 @@ unsigned int VIA::ViewGetLOD( int aLayer, KIGFX::VIEW* aView ) const return std::numeric_limits::max(); } +int TRACK::GetLengthPadToDie() +{ + BOARD* board = GetBoard(); + double trackLen = 0; + double lenPadToDie = 0; + board->MarkTrace( this, NULL, &trackLen, &lenPadToDie, false ); + + return lenPadToDie; +} // see class_track.h void TRACK::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList ) diff --git a/pcbnew/class_track.h b/pcbnew/class_track.h index 7b4602e53..f2285f3e7 100644 --- a/pcbnew/class_track.h +++ b/pcbnew/class_track.h @@ -222,6 +222,8 @@ public: virtual bool HitTest( const EDA_RECT& aRect, bool aContained = true, int aAccuracy = 0 ) const override; + int GetLengthPadToDie(); + /** * Function GetVia * finds the first VIA object at \a aPosition on \a aLayer starting at the trace. diff --git a/pcbnew/dialogs/dialog_pns_length_tuning_settings.cpp b/pcbnew/dialogs/dialog_pns_length_tuning_settings.cpp index 1c490a2fc..59cb39df1 100644 --- a/pcbnew/dialogs/dialog_pns_length_tuning_settings.cpp +++ b/pcbnew/dialogs/dialog_pns_length_tuning_settings.cpp @@ -98,6 +98,8 @@ void DIALOG_PNS_LENGTH_TUNING_SETTINGS::OnOkClick( wxCommandEvent& aEvent ) else m_settings.m_targetLength = m_targetLength.GetValue(); + m_settings.m_useLenPadToDie = m_useLenPadToDie->GetValue(); + if( m_settings.m_maxAmplitude < m_settings.m_minAmplitude ) m_settings.m_maxAmplitude = m_settings.m_minAmplitude; diff --git a/pcbnew/dialogs/dialog_pns_length_tuning_settings_base.cpp b/pcbnew/dialogs/dialog_pns_length_tuning_settings_base.cpp index d6a0104f4..0cf12ccd4 100644 --- a/pcbnew/dialogs/dialog_pns_length_tuning_settings_base.cpp +++ b/pcbnew/dialogs/dialog_pns_length_tuning_settings_base.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Mar 9 2015) +// C++ code generated with wxFormBuilder (version Aug 23 2017) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! @@ -75,6 +75,10 @@ DIALOG_PNS_LENGTH_TUNING_SETTINGS_BASE::DIALOG_PNS_LENGTH_TUNING_SETTINGS_BASE( m_targetLengthUnit->Wrap( -1 ); fgSizerLenSkew->Add( m_targetLengthUnit, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_useLenPadToDie = new wxCheckBox( this, wxID_ANY, _("sub PadToDie"), wxDefaultPosition, wxDefaultSize, 0 ); + m_useLenPadToDie->SetValue(true); + fgSizerLenSkew->Add( m_useLenPadToDie, 0, wxALL, 5 ); + sbSizer1->Add( fgSizerLenSkew, 1, wxEXPAND, 5 ); diff --git a/pcbnew/dialogs/dialog_pns_length_tuning_settings_base.fbp b/pcbnew/dialogs/dialog_pns_length_tuning_settings_base.fbp index 367f0ed40..3f7d644e4 100644 --- a/pcbnew/dialogs/dialog_pns_length_tuning_settings_base.fbp +++ b/pcbnew/dialogs/dialog_pns_length_tuning_settings_base.fbp @@ -921,6 +921,94 @@ + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + sub PadToDie + + 0 + + + 0 + + 1 + m_useLenPadToDie + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pcbnew/dialogs/dialog_pns_length_tuning_settings_base.h b/pcbnew/dialogs/dialog_pns_length_tuning_settings_base.h index a4c73f476..b9c4ec1c7 100644 --- a/pcbnew/dialogs/dialog_pns_length_tuning_settings_base.h +++ b/pcbnew/dialogs/dialog_pns_length_tuning_settings_base.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Mar 9 2015) +// C++ code generated with wxFormBuilder (version Aug 23 2017) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! @@ -22,6 +22,7 @@ class DIALOG_SHIM; #include #include #include +#include #include #include #include @@ -51,6 +52,7 @@ class DIALOG_PNS_LENGTH_TUNING_SETTINGS_BASE : public DIALOG_SHIM wxStaticText* m_targetLengthLabel; wxTextCtrl* m_targetLengthText; wxStaticText* m_targetLengthUnit; + wxCheckBox* m_useLenPadToDie; wxStaticBitmap* m_legend; wxStaticText* m_staticText9; wxTextCtrl* m_minAmplText; diff --git a/pcbnew/router/length_tuner_tool.cpp b/pcbnew/router/length_tuner_tool.cpp index a98ce5d1a..99665c967 100644 --- a/pcbnew/router/length_tuner_tool.cpp +++ b/pcbnew/router/length_tuner_tool.cpp @@ -147,6 +147,7 @@ void LENGTH_TUNER_TOOL::performTuning() PNS::MEANDER_PLACER_BASE* placer = static_cast( m_router->Placer() ); + m_savedMeanderSettings.m_lenPadToDie = m_startItemLenToDie; placer->UpdateSettings( m_savedMeanderSettings ); VECTOR2I end( m_startSnapPoint ); diff --git a/pcbnew/router/pns_meander.h b/pcbnew/router/pns_meander.h index 03d29a243..64dea4393 100644 --- a/pcbnew/router/pns_meander.h +++ b/pcbnew/router/pns_meander.h @@ -65,6 +65,7 @@ public: m_step = 50000; m_spacing = 600000; m_targetLength = 100000000; + m_lenPadToDie = 0; m_targetSkew = 0; m_cornerStyle = MEANDER_STYLE_ROUND; m_cornerRadiusPercentage = 100; @@ -82,6 +83,10 @@ public: int m_step; ///> desired length of the tuned line/diff pair int m_targetLength; + ///> length PadToDie + int m_lenPadToDie; + ///> target path include lenPadToDie + bool m_useLenPadToDie; ///> type of corners for the meandered line MEANDER_STYLE m_cornerStyle; ///> rounding percentage (0 - 100) diff --git a/pcbnew/router/pns_meander_placer.cpp b/pcbnew/router/pns_meander_placer.cpp index e0f876d7b..221d3e322 100644 --- a/pcbnew/router/pns_meander_placer.cpp +++ b/pcbnew/router/pns_meander_placer.cpp @@ -106,7 +106,8 @@ int MEANDER_PLACER::origPathLength() const bool MEANDER_PLACER::Move( const VECTOR2I& aP, ITEM* aEndItem ) { - return doMove( aP, aEndItem, m_settings.m_targetLength ); + + return doMove( aP, aEndItem, m_settings.m_useLenPadToDie ? m_settings.m_targetLength - m_settings.m_lenPadToDie : m_settings.m_targetLength ); } diff --git a/pcbnew/router/pns_tool_base.cpp b/pcbnew/router/pns_tool_base.cpp index 22cb6179c..edf8e4303 100644 --- a/pcbnew/router/pns_tool_base.cpp +++ b/pcbnew/router/pns_tool_base.cpp @@ -251,6 +251,16 @@ void TOOL_BASE::updateStartItem( TOOL_EVENT& aEvent ) if( !snapEnabled && m_startItem && !m_startItem->Layers().Overlaps( tl ) ) m_startItem = nullptr; + m_startItemLenToDie = 0; + if( m_startItem ) + { + TRACK *track = dyn_cast( m_startItem->Parent() ); + if( track ) + { + m_startItemLenToDie = track->GetLengthPadToDie(); + } + } + m_startSnapPoint = snapToItem( snapEnabled, m_startItem, p ); if( checkSnap ( m_startItem )) diff --git a/pcbnew/router/pns_tool_base.h b/pcbnew/router/pns_tool_base.h index 327c7ac33..3643c637b 100644 --- a/pcbnew/router/pns_tool_base.h +++ b/pcbnew/router/pns_tool_base.h @@ -67,6 +67,7 @@ protected: ROUTING_SETTINGS m_savedSettings; ///< Stores routing settings between router invocations SIZES_SETTINGS m_savedSizes; ///< Stores sizes settings between router invocations ITEM* m_startItem; + int m_startItemLenToDie; int m_startLayer; VECTOR2I m_startSnapPoint;