From bf758dce3e619e9bb3b1dddca6e54c0a2c2928ef Mon Sep 17 00:00:00 2001 From: Maciej Suminski Date: Thu, 11 Aug 2016 14:42:07 +0200 Subject: [PATCH] Tuners are common for all plots --- eeschema/sim/sim_plot_frame.cpp | 75 +++++++++------------------------ eeschema/sim/sim_plot_frame.h | 23 +++++----- 2 files changed, 29 insertions(+), 69 deletions(-) diff --git a/eeschema/sim/sim_plot_frame.cpp b/eeschema/sim/sim_plot_frame.cpp index 72c50f42b8..d3f0f7b6c1 100644 --- a/eeschema/sim/sim_plot_frame.cpp +++ b/eeschema/sim/sim_plot_frame.cpp @@ -167,6 +167,7 @@ void SIM_PLOT_FRAME::StartSimulation() m_simulator->SetReporter( new SIM_THREAD_REPORTER( this ) ); m_simulator->Init(); m_simulator->LoadNetlist( formatter.GetString() ); + applyTuners(); m_simulator->Run(); Layout(); @@ -229,23 +230,22 @@ void SIM_PLOT_FRAME::AddTuner( SCH_COMPONENT* aComponent ) return; const wxString& componentName = aComponent->GetField( REFERENCE )->GetText(); - auto& tunerList = m_plots[plotPanel].m_tuners; // Do not add multiple instances for the same component - auto tunerIt = std::find_if( tunerList.begin(), tunerList.end(), [&]( const TUNER_SLIDER* t ) + auto tunerIt = std::find_if( m_tuners.begin(), m_tuners.end(), [&]( const TUNER_SLIDER* t ) { return t->GetComponentName() == componentName; } ); - if( tunerIt != tunerList.end() ) + if( tunerIt != m_tuners.end() ) return; // We already have it try { TUNER_SLIDER* tuner = new TUNER_SLIDER( this, m_sidePanel, aComponent ); m_tuneSizer->Add( tuner ); - tunerList.push_back( tuner ); + m_tuners.push_back( tuner ); m_sidePanel->Layout(); } catch( ... ) @@ -257,12 +257,7 @@ void SIM_PLOT_FRAME::AddTuner( SCH_COMPONENT* aComponent ) void SIM_PLOT_FRAME::RemoveTuner( TUNER_SLIDER* aTuner ) { - SIM_PLOT_PANEL* plotPanel = CurrentPlot(); - - if( !plotPanel ) - return; - - m_plots[plotPanel].m_tuners.remove( aTuner ); + m_tuners.remove( aTuner ); aTuner->Destroy(); m_sidePanel->Layout(); } @@ -427,34 +422,24 @@ void SIM_PLOT_FRAME::updateSignalList() } -void SIM_PLOT_FRAME::updateTuners() -{ - SIM_PLOT_PANEL* plotPanel = CurrentPlot(); - - if( !plotPanel ) - return; - - for( unsigned int i = 0; i < m_tuneSizer->GetItemCount(); ++i ) - m_tuneSizer->Hide( i ); - - m_tuneSizer->Clear(); - - for( auto& tuner : m_plots[plotPanel].m_tuners ) - { - m_tuneSizer->Add( tuner ); - tuner->Show(); - } - - Layout(); -} - - void SIM_PLOT_FRAME::updateCursors() { wxQueueEvent( this, new wxCommandEvent( EVT_SIM_CURSOR_UPDATE ) ); } +void SIM_PLOT_FRAME::applyTuners() +{ + for( auto& tuner : m_tuners ) + { + /// @todo no ngspice hardcoding + std::string command( "alter @" + tuner->GetSpiceName() + + "=" + tuner->GetValue().ToSpiceString() ); + m_simulator->Command( command ); + } +} + + SIM_PLOT_TYPE SIM_PLOT_FRAME::GetXAxisType( SIM_TYPE aType ) const { switch( aType ) @@ -612,7 +597,6 @@ void SIM_PLOT_FRAME::onPlotClose( wxAuiNotebookEvent& event ) m_plots.erase( plotPanel ); updateSignalList(); - updateTuners(); updateCursors(); } @@ -620,7 +604,6 @@ void SIM_PLOT_FRAME::onPlotClose( wxAuiNotebookEvent& event ) void SIM_PLOT_FRAME::onPlotChanged( wxAuiNotebookEvent& event ) { updateSignalList(); - updateTuners(); updateCursors(); } @@ -803,21 +786,8 @@ void SIM_PLOT_FRAME::onSimUpdate( wxCommandEvent& aEvent ) StopSimulation(); m_simConsole->Clear(); - - // Apply tuned values - if( SIM_PLOT_PANEL* plotPanel = CurrentPlot() ) - { - for( auto& tuner : m_plots[plotPanel].m_tuners ) - { - /// @todo no ngspice hardcoding - std::string command( "alter @" + tuner->GetSpiceName() - + "=" + tuner->GetValue().ToSpiceString() ); - m_simulator->Command( command ); - -// printf("CMD: %s\n", command.c_str() ); - } - } - + // Do not export netlist, it is already stored in the simulator + applyTuners(); m_simulator->Run(); } @@ -830,13 +800,6 @@ void SIM_PLOT_FRAME::onSimReport( wxCommandEvent& aEvent ) } -SIM_PLOT_FRAME::PLOT_INFO::~PLOT_INFO() -{ - for( auto& t : m_tuners ) - t->Destroy(); -} - - SIM_PLOT_FRAME::SIGNAL_CONTEXT_MENU::SIGNAL_CONTEXT_MENU( const wxString& aSignal, SIM_PLOT_FRAME* aPlotFrame ) : m_signal( aSignal ), m_plotFrame( aPlotFrame ) diff --git a/eeschema/sim/sim_plot_frame.h b/eeschema/sim/sim_plot_frame.h index 6b6286b3f9..490196b426 100644 --- a/eeschema/sim/sim_plot_frame.h +++ b/eeschema/sim/sim_plot_frame.h @@ -167,16 +167,16 @@ class SIM_PLOT_FRAME : public SIM_PLOT_FRAME_BASE */ void updateSignalList(); - /** - * @brief Fills the tuners area with the ones related to the current plot. - */ - void updateTuners(); - /** * @brief Updates the cursor values list. */ void updateCursors(); + /** + * @brief Applies component values specified using tunder sliders to the current netlist. + */ + void applyTuners(); + SIM_PLOT_TYPE GetXAxisType( SIM_TYPE aType ) const; // Menu handlers @@ -231,22 +231,19 @@ class SIM_PLOT_FRAME : public SIM_PLOT_FRAME_BASE std::unique_ptr m_simulator; typedef std::map TRACE_MAP; - typedef std::list TUNER_LIST; - class PLOT_INFO + struct PLOT_INFO { - public: - ~PLOT_INFO(); - - ///> List of component value tuners - TUNER_LIST m_tuners; - ///> Map of the traces displayed on the plot TRACE_MAP m_traces; }; + ///> Map of plot panels and associated data std::map m_plots; + ///> List of currently displayed tuners + std::list m_tuners; + // Trick to preserve settings between runs DIALOG_SIM_SETTINGS m_settingsDlg;