Browse Source

ADDED: Stepped simulation

Allows using the tune tool to re-run a simulation multiple times,
stepping over a range of values and overplotting the results

Fixes https://gitlab.com/kicad/code/kicad/issues/20508
master
Seth Hillbrand 2 weeks ago
parent
commit
bb2c4b55e6
  1. 260
      eeschema/sim/simulator_frame_ui.cpp
  2. 29
      eeschema/sim/simulator_frame_ui.h
  3. 92
      eeschema/widgets/tuner_slider.cpp
  4. 19
      eeschema/widgets/tuner_slider.h
  5. 27
      eeschema/widgets/tuner_slider_base.cpp
  6. 332
      eeschema/widgets/tuner_slider_base.fbp
  7. 11
      eeschema/widgets/tuner_slider_base.h

260
eeschema/sim/simulator_frame_ui.cpp

@ -24,6 +24,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <algorithm>
#include <memory>
#include <type_traits>
@ -1694,6 +1695,12 @@ void SIMULATOR_FRAME_UI::UpdateTunerValue( const SCH_SHEET_PATH& aSheetPath, con
void SIMULATOR_FRAME_UI::RemoveTuner( TUNER_SLIDER* aTuner )
{
m_tuners.remove( aTuner );
if( m_multiRunState.tuner == aTuner )
clearMultiRunState( true );
m_tunerOverrides.erase( aTuner );
aTuner->Destroy();
m_panelTuners->Layout();
OnModify();
@ -1974,6 +1981,57 @@ void SIMULATOR_FRAME_UI::updateTrace( const wxString& aVectorName, int aTraceTyp
sweepSize = aDataX->size() / sweepCount;
}
if( m_multiRunState.storePending )
recordMultiRunData( aVectorName, aTraceType, *aDataX, data_y );
if( hasMultiRunTrace( aVectorName, aTraceType ) )
{
const std::string key = multiRunTraceKey( aVectorName, aTraceType );
const auto traceIt = m_multiRunState.traces.find( key );
if( traceIt != m_multiRunState.traces.end() )
{
const MULTI_RUN_TRACE& traceData = traceIt->second;
if( !traceData.xValues.empty() && !traceData.yValues.empty() )
{
size_t sweepSizeMulti = traceData.xValues.size();
size_t runCount = traceData.yValues.size();
if( sweepSizeMulti > 0 && runCount > 0 )
{
std::vector<double> combinedX;
std::vector<double> combinedY;
combinedX.reserve( sweepSizeMulti * runCount );
combinedY.reserve( sweepSizeMulti * runCount );
for( const std::vector<double>& runY : traceData.yValues )
{
if( runY.size() != sweepSizeMulti )
continue;
combinedX.insert( combinedX.end(), traceData.xValues.begin(), traceData.xValues.end() );
combinedY.insert( combinedY.end(), runY.begin(), runY.end() );
}
if( TRACE* trace = aPlotTab->GetOrAddTrace( aVectorName, aTraceType ) )
{
if( combinedY.size() >= combinedX.size() && sweepSizeMulti > 0 )
{
int sweepCountCombined = combinedX.empty() ? 0 : static_cast<int>( combinedY.size() / sweepSizeMulti );
if( sweepCountCombined > 0 )
aPlotTab->SetTraceData( trace, combinedX, combinedY, sweepCountCombined, sweepSizeMulti );
}
}
return;
}
}
}
}
if( TRACE* trace = aPlotTab->GetOrAddTrace( aVectorName, aTraceType ) )
{
if( data_y.size() >= size )
@ -2225,7 +2283,14 @@ void SIMULATOR_FRAME_UI::applyTuners()
continue;
}
double floatVal = tuner->GetValue().ToDouble();
double floatVal;
auto overrideIt = m_tunerOverrides.find( tuner );
if( overrideIt != m_tunerOverrides.end() )
floatVal = overrideIt->second;
else
floatVal = tuner->GetValue().ToDouble();
simulator()->Command( item->model->SpiceGenerator().TunerCommand( *item, floatVal ) );
}
@ -3145,6 +3210,8 @@ void SIMULATOR_FRAME_UI::OnSimUpdate()
m_simConsole->Clear();
prepareMultiRunState();
// Do not export netlist, it is already stored in the simulator
applyTuners();
@ -3196,6 +3263,21 @@ void SIMULATOR_FRAME_UI::OnSimRefresh( bool aFinal )
if( !simTab )
return;
bool storeMultiRun = false;
if( aFinal && m_multiRunState.active )
{
if( m_multiRunState.currentStep < m_multiRunState.stepValues.size() )
{
storeMultiRun = true;
m_multiRunState.storePending = true;
}
}
else
{
m_multiRunState.storePending = false;
}
SIM_TYPE simType = simTab->GetSimType();
wxString msg;
@ -3375,6 +3457,182 @@ void SIMULATOR_FRAME_UI::OnSimRefresh( bool aFinal )
m_simConsole->SetInsertionPointEnd();
simulator()->Command( "print all" );
}
if( storeMultiRun )
{
m_multiRunState.storePending = false;
m_multiRunState.storedSteps = m_multiRunState.currentStep + 1;
}
if( aFinal && m_multiRunState.active )
{
if( m_multiRunState.currentStep + 1 < m_multiRunState.stepValues.size() )
{
m_multiRunState.currentStep++;
wxQueueEvent( m_simulatorFrame, new wxCommandEvent( EVT_SIM_UPDATE ) );
}
else
{
m_multiRunState.active = false;
m_multiRunState.stepValues.clear();
m_multiRunState.currentStep = 0;
m_multiRunState.storePending = false;
m_tunerOverrides.clear();
if( !m_multiRunState.traces.empty() )
{
auto iter = m_multiRunState.traces.begin();
if( iter != m_multiRunState.traces.end() )
m_multiRunState.storedSteps = iter->second.yValues.size();
}
}
}
}
void SIMULATOR_FRAME_UI::clearMultiRunState( bool aClearTraces )
{
m_multiRunState.active = false;
m_multiRunState.tuner = nullptr;
m_multiRunState.stepValues.clear();
m_multiRunState.currentStep = 0;
m_multiRunState.storePending = false;
if( aClearTraces )
{
m_multiRunState.traces.clear();
m_multiRunState.storedSteps = 0;
}
m_tunerOverrides.clear();
}
void SIMULATOR_FRAME_UI::prepareMultiRunState()
{
m_tunerOverrides.clear();
TUNER_SLIDER* multiTuner = nullptr;
for( TUNER_SLIDER* tuner : m_tuners )
{
if( tuner->GetRunMode() == TUNER_SLIDER::RUN_MODE::MULTI )
{
multiTuner = tuner;
break;
}
}
if( !multiTuner )
{
clearMultiRunState( true );
return;
}
if( m_multiRunState.active && m_multiRunState.tuner != multiTuner )
clearMultiRunState( true );
if( !m_multiRunState.active )
{
if( m_multiRunState.tuner != multiTuner || m_multiRunState.storedSteps > 0
|| !m_multiRunState.traces.empty() )
{
clearMultiRunState( true );
}
m_multiRunState.tuner = multiTuner;
m_multiRunState.stepValues = calculateMultiRunSteps( multiTuner );
m_multiRunState.currentStep = 0;
m_multiRunState.storePending = false;
if( m_multiRunState.stepValues.size() >= 2 )
{
m_multiRunState.active = true;
m_multiRunState.storedSteps = 0;
}
else
{
m_multiRunState.stepValues.clear();
return;
}
}
if( m_multiRunState.active && m_multiRunState.currentStep < m_multiRunState.stepValues.size() )
m_tunerOverrides[multiTuner] = m_multiRunState.stepValues[m_multiRunState.currentStep];
}
std::vector<double> SIMULATOR_FRAME_UI::calculateMultiRunSteps( TUNER_SLIDER* aTuner ) const
{
std::vector<double> steps;
if( !aTuner )
return steps;
double startValue = aTuner->GetMin().ToDouble();
double endValue = aTuner->GetMax().ToDouble();
int stepCount = std::max( 2, aTuner->GetStepCount() );
if( stepCount < 2 )
stepCount = 2;
double increment = ( endValue - startValue ) / static_cast<double>( stepCount - 1 );
steps.reserve( stepCount );
for( int ii = 0; ii < stepCount; ++ii )
steps.push_back( startValue + increment * ii );
return steps;
}
std::string SIMULATOR_FRAME_UI::multiRunTraceKey( const wxString& aVectorName, int aTraceType ) const
{
return fmt::format( "{}|{}", aVectorName.ToStdString(), aTraceType );
}
void SIMULATOR_FRAME_UI::recordMultiRunData( const wxString& aVectorName, int aTraceType,
const std::vector<double>& aX,
const std::vector<double>& aY )
{
if( aX.empty() || aY.empty() )
return;
std::string key = multiRunTraceKey( aVectorName, aTraceType );
MULTI_RUN_TRACE& trace = m_multiRunState.traces[key];
trace.traceType = aTraceType;
if( trace.xValues.empty() )
trace.xValues = aX;
if( trace.xValues.size() != aX.size() )
return;
size_t index = m_multiRunState.currentStep;
if( trace.yValues.size() <= index )
trace.yValues.resize( index + 1 );
trace.yValues[index] = aY;
}
bool SIMULATOR_FRAME_UI::hasMultiRunTrace( const wxString& aVectorName, int aTraceType ) const
{
std::string key = multiRunTraceKey( aVectorName, aTraceType );
auto it = m_multiRunState.traces.find( key );
if( it == m_multiRunState.traces.end() )
return false;
const MULTI_RUN_TRACE& trace = it->second;
return !trace.xValues.empty() && !trace.yValues.empty();
}

29
eeschema/sim/simulator_frame_ui.h

@ -337,6 +337,14 @@ private:
*/
SIM_TRACE_TYPE getXAxisType( SIM_TYPE aType ) const;
void clearMultiRunState( bool aClearTraces );
void prepareMultiRunState();
std::vector<double> calculateMultiRunSteps( TUNER_SLIDER* aTuner ) const;
std::string multiRunTraceKey( const wxString& aVectorName, int aTraceType ) const;
void recordMultiRunData( const wxString& aVectorName, int aTraceType,
const std::vector<double>& aX, const std::vector<double>& aY );
bool hasMultiRunTrace( const wxString& aVectorName, int aTraceType ) const;
wxString getNoiseSource() const;
void parseTraceParams( SIM_PLOT_TAB* aPlotTab, TRACE* aTrace, const wxString& aSignalName,
@ -378,6 +386,27 @@ private:
std::vector<wxString> m_signals;
std::map<int, wxString> m_userDefinedSignals;
std::list<TUNER_SLIDER*> m_tuners;
std::map<const TUNER_SLIDER*, double> m_tunerOverrides;
struct MULTI_RUN_TRACE
{
int traceType = SPT_UNKNOWN;
std::vector<double> xValues;
std::vector<std::vector<double>> yValues;
};
struct MULTI_RUN_STATE
{
bool active = false;
TUNER_SLIDER* tuner = nullptr;
std::vector<double> stepValues;
size_t currentStep = 0;
size_t storedSteps = 0;
bool storePending = false;
std::map<std::string, MULTI_RUN_TRACE> traces;
};
MULTI_RUN_STATE m_multiRunState;
///< SPICE expressions need quoted versions of the netnames since KiCad allows '-' and '/'
///< in netnames.

92
eeschema/widgets/tuner_slider.cpp

@ -33,6 +33,7 @@
#include <widgets/bitmap_button.h>
#include <widgets/std_bitmap_button.h>
#include <algorithm>
#include <cmath> // log log1p expm1
#include <complex> // norm
@ -49,6 +50,7 @@ TUNER_SLIDER::TUNER_SLIDER( SIMULATOR_FRAME_UI* aFrame, wxWindow* aParent,
m_min( 0.0 ),
m_max( 0.0 ),
m_value( 0.0 ),
m_runMode( RUN_MODE::SINGLE ),
m_frame( aFrame )
{
#if _WIN32
@ -77,6 +79,11 @@ TUNER_SLIDER::TUNER_SLIDER( SIMULATOR_FRAME_UI* aFrame, wxWindow* aParent,
m_e192->SetBitmap( KiBitmapBundle( BITMAPS::e_192 ) );
m_e192->SetIsCheckButton();
m_modeChoice->SetSelection( 0 );
m_stepCount->SetRange( 2, 100 );
m_stepCount->SetValue( 5 );
updateModeControls();
const SIM_MODEL::PARAM* tunerParam = item->model->GetTunerParam();
if( !tunerParam )
@ -119,9 +126,32 @@ TUNER_SLIDER::TUNER_SLIDER( SIMULATOR_FRAME_UI* aFrame, wxWindow* aParent,
}
int TUNER_SLIDER::GetStepCount() const
{
return std::max( 2, m_stepCount->GetValue() );
}
void TUNER_SLIDER::ShowChangedLanguage()
{
m_name->SetLabel( wxString::Format( _( "Tune %s" ), m_ref ) );
wxArrayString modeChoices;
modeChoices.Add( _( "Single Run" ) );
modeChoices.Add( _( "Multi Run" ) );
int selection = m_modeChoice->GetSelection();
m_modeChoice->Set( modeChoices );
if( selection < 0 || selection >= static_cast<int>( modeChoices.size() ) )
selection = 0;
m_modeChoice->SetSelection( selection );
m_stepsLabel->SetLabel( _( "Steps" ) );
updateModeControls();
}
@ -144,6 +174,22 @@ void TUNER_SLIDER::onESeries( wxCommandEvent& event )
}
void TUNER_SLIDER::onRunModeChanged( wxCommandEvent& event )
{
int selection = m_modeChoice->GetSelection();
if( selection == wxNOT_FOUND )
selection = 0;
m_runMode = ( selection == 1 ) ? RUN_MODE::MULTI : RUN_MODE::SINGLE;
updateModeControls();
updateComponentValue();
event.Skip();
}
bool TUNER_SLIDER::SetValue( const SPICE_VALUE& aVal )
{
// Get the value into the current range boundaries
@ -201,6 +247,22 @@ void TUNER_SLIDER::updateComponentValue()
wxQueueEvent( m_frame, new wxCommandEvent( EVT_SIM_UPDATE ) );
}
void TUNER_SLIDER::updateModeControls()
{
bool enableSteps = ( m_runMode == RUN_MODE::MULTI );
m_stepCount->Enable( enableSteps );
m_stepsLabel->Enable( enableSteps );
// In Multi Run mode, the middle value text and slider are not directly editable,
// and save/trash actions are disabled. Re-enable for Single Run.
bool enableDirectControls = ( m_runMode == RUN_MODE::SINGLE );
m_valueText->Enable( enableDirectControls );
m_slider->Enable( enableDirectControls );
m_saveBtn->Enable( enableDirectControls );
m_closeBtn->Enable( enableDirectControls );
}
void TUNER_SLIDER::updateSlider()
{
@ -300,6 +362,9 @@ void TUNER_SLIDER::updateMax()
{
SPICE_VALUE newMax( m_maxText->GetValue() );
SetMax( newMax );
// If in Multi Run mode, changing the range should trigger a re-run
if( m_runMode == RUN_MODE::MULTI )
updateComponentValue();
}
catch( const KI_PARAM_ERROR& )
{
@ -330,6 +395,9 @@ void TUNER_SLIDER::updateMin()
{
SPICE_VALUE newMin( m_minText->GetValue() );
SetMin( newMin );
// If in Multi Run mode, changing the range should trigger a re-run
if( m_runMode == RUN_MODE::MULTI )
updateComponentValue();
}
catch( const KI_PARAM_ERROR& )
{
@ -404,3 +472,27 @@ void TUNER_SLIDER::onMinTextEnter( wxCommandEvent& event )
{
updateMin();
}
void TUNER_SLIDER::onStepsChanged( wxSpinEvent& event )
{
updateComponentValue();
event.Skip();
}
void TUNER_SLIDER::onStepsTextEnter( wxCommandEvent& event )
{
long steps;
if( !event.GetString().ToLong( &steps ) )
steps = m_stepCount->GetValue();
if( steps < 2 )
steps = 2;
m_stepCount->SetValue( static_cast<int>( steps ) );
updateComponentValue();
event.Skip();
}

19
eeschema/widgets/tuner_slider.h

@ -43,6 +43,12 @@ class SCH_SYMBOL;
class TUNER_SLIDER : public TUNER_SLIDER_BASE
{
public:
enum class RUN_MODE
{
SINGLE,
MULTI
};
TUNER_SLIDER( SIMULATOR_FRAME_UI* aPanel, wxWindow* aParent, const SCH_SHEET_PATH& aSheetPath,
SCH_SYMBOL* aSymbol );
@ -51,6 +57,13 @@ public:
return m_ref;
}
RUN_MODE GetRunMode() const
{
return m_runMode;
}
int GetStepCount() const;
const SPICE_VALUE& GetMin() const
{
return m_min;
@ -83,11 +96,14 @@ private:
void updateSlider();
void updateValueText();
void updateModeControls();
void updateMax();
void updateValue();
void updateMin();
void onESeries( wxCommandEvent& event ) override;
void onRunModeChanged( wxCommandEvent& event ) override;
void onClose( wxCommandEvent& event ) override;
void onSave( wxCommandEvent& event ) override;
void onSliderScroll( wxScrollEvent& event ) override;
@ -100,6 +116,8 @@ private:
void onMaxTextEnter( wxCommandEvent& event ) override;
void onValueTextEnter( wxCommandEvent& event ) override;
void onMinTextEnter( wxCommandEvent& event ) override;
void onStepsChanged( wxSpinEvent& event ) override;
void onStepsTextEnter( wxCommandEvent& event ) override;
private:
KIID m_symbol;
@ -110,6 +128,7 @@ private:
SPICE_VALUE m_max;
SPICE_VALUE m_value;
RUN_MODE m_runMode;
SIMULATOR_FRAME_UI* m_frame;
};

27
eeschema/widgets/tuner_slider_base.cpp

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 4.1.0-0-g733bf3d)
// C++ code generated with wxFormBuilder (version 4.2.1-75-g9786507b-dirty)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -33,6 +33,25 @@ TUNER_SLIDER_BASE::TUNER_SLIDER_BASE( wxWindow* parent, wxWindowID id, const wxP
bSizer6->Add( bSizerUpper, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
wxBoxSizer* bSizerMode;
bSizerMode = new wxBoxSizer( wxHORIZONTAL );
wxString m_modeChoiceChoices[] = { _("Single Run"), _("Multi Run") };
int m_modeChoiceNChoices = sizeof( m_modeChoiceChoices ) / sizeof( wxString );
m_modeChoice = new wxChoice( m_panel1, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_modeChoiceNChoices, m_modeChoiceChoices, 0 );
m_modeChoice->SetSelection( 0 );
bSizerMode->Add( m_modeChoice, 1, wxEXPAND|wxRIGHT, 5 );
m_stepsLabel = new wxStaticText( m_panel1, wxID_ANY, _("Steps"), wxDefaultPosition, wxDefaultSize, 0 );
m_stepsLabel->Wrap( -1 );
bSizerMode->Add( m_stepsLabel, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
m_stepCount = new wxSpinCtrl( m_panel1, wxID_ANY, wxT("2"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS|wxTE_PROCESS_ENTER, 2, 100, 2 );
bSizerMode->Add( m_stepCount, 0, wxALIGN_CENTER_VERTICAL, 5 );
bSizer6->Add( bSizerMode, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
m_staticline4 = new wxStaticLine( m_panel1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
bSizer6->Add( m_staticline4, 0, wxEXPAND|wxTOP|wxBOTTOM, 2 );
@ -135,6 +154,9 @@ TUNER_SLIDER_BASE::TUNER_SLIDER_BASE( wxWindow* parent, wxWindowID id, const wxP
bSizerMain->Fit( this );
// Connect Events
m_modeChoice->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( TUNER_SLIDER_BASE::onRunModeChanged ), NULL, this );
m_stepCount->Connect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( TUNER_SLIDER_BASE::onStepsChanged ), NULL, this );
m_stepCount->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onStepsTextEnter ), NULL, this );
m_e24->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( TUNER_SLIDER_BASE::onESeries ), NULL, this );
m_e48->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( TUNER_SLIDER_BASE::onESeries ), NULL, this );
m_e96->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( TUNER_SLIDER_BASE::onESeries ), NULL, this );
@ -168,6 +190,9 @@ TUNER_SLIDER_BASE::TUNER_SLIDER_BASE( wxWindow* parent, wxWindowID id, const wxP
TUNER_SLIDER_BASE::~TUNER_SLIDER_BASE()
{
// Disconnect Events
m_modeChoice->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( TUNER_SLIDER_BASE::onRunModeChanged ), NULL, this );
m_stepCount->Disconnect( wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler( TUNER_SLIDER_BASE::onStepsChanged ), NULL, this );
m_stepCount->Disconnect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( TUNER_SLIDER_BASE::onStepsTextEnter ), NULL, this );
m_e24->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( TUNER_SLIDER_BASE::onESeries ), NULL, this );
m_e48->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( TUNER_SLIDER_BASE::onESeries ), NULL, this );
m_e96->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( TUNER_SLIDER_BASE::onESeries ), NULL, this );

332
eeschema/widgets/tuner_slider_base.fbp

@ -1,34 +1,36 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="17"/>
<FileVersion major="1" minor="18"/>
<object class="Project" expanded="true">
<property name="class_decoration"></property>
<property name="code_generation">C++</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="cpp_class_decoration"></property>
<property name="cpp_disconnect_events">1</property>
<property name="cpp_event_generation">connect</property>
<property name="cpp_help_provider">none</property>
<property name="cpp_namespace"></property>
<property name="cpp_precompiled_header"></property>
<property name="cpp_use_array_enum">0</property>
<property name="cpp_use_enum">0</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file">tuner_slider_base</property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="image_path_wrapper_function_name"></property>
<property name="indent_with_spaces"></property>
<property name="internationalize">1</property>
<property name="lua_skip_events">1</property>
<property name="lua_ui_table">UI</property>
<property name="name">TUNER_SLIDER_BASE</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="php_disconnect_events">0</property>
<property name="php_disconnect_mode">source_name</property>
<property name="php_skip_events">1</property>
<property name="python_disconnect_events">0</property>
<property name="python_disconnect_mode">source_name</property>
<property name="python_image_path_wrapper_function_name"></property>
<property name="python_indent_with_spaces"></property>
<property name="python_skip_events">1</property>
<property name="relative_path">1</property>
<property name="skip_lua_events">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="ui_table">UI</property>
<property name="use_array_enum">0</property>
<property name="use_enum">0</property>
<property name="use_microsoft_bom">0</property>
<property name="use_native_eol">0</property>
<object class="Panel" expanded="true">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
@ -67,10 +69,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -137,10 +139,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -192,6 +194,210 @@
</object>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="true">
<property name="minimum_size"></property>
<property name="name">bSizerMode</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="false">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxRIGHT</property>
<property name="proportion">1</property>
<object class="wxChoice" expanded="false">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="choices">&quot;Single Run&quot; &quot;Multi Run&quot;</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_modeChoice</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="selection">0</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChoice">onRunModeChanged</event>
</object>
</object>
<object class="sizeritem" expanded="false">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="false">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Steps</property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_stepsLabel</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
</object>
</object>
<object class="sizeritem" expanded="false">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL</property>
<property name="proportion">0</property>
<object class="wxSpinCtrl" expanded="false">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="initial">2</property>
<property name="max">100</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min">2</property>
<property name="min_size">60,-1</property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_stepCount</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxSP_ARROW_KEYS|wxTE_PROCESS_ENTER</property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="value">2</property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnSpinCtrl">onStepsChanged</event>
<event name="OnTextEnter">onStepsTextEnter</event>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">2</property>
<property name="flag">wxEXPAND|wxTOP|wxBOTTOM</property>
@ -201,10 +407,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -269,10 +475,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="auth_needed">0</property>
<property name="best_size"></property>
<property name="bg"></property>
@ -344,10 +550,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="auth_needed">0</property>
<property name="best_size"></property>
<property name="bg"></property>
@ -418,10 +624,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="auth_needed">0</property>
<property name="best_size"></property>
<property name="bg"></property>
@ -503,10 +709,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="auth_needed">0</property>
<property name="best_size"></property>
<property name="bg"></property>
@ -588,10 +794,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="auth_needed">0</property>
<property name="best_size"></property>
<property name="bg"></property>
@ -683,10 +889,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -771,10 +977,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -798,7 +1004,7 @@
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="maxlength">0</property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">70,-1</property>
@ -838,10 +1044,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -865,7 +1071,7 @@
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="maxlength">0</property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">70,-1</property>
@ -905,10 +1111,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
@ -932,7 +1138,7 @@
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="maxlength">0</property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">70,-1</property>
@ -985,10 +1191,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="auth_needed">0</property>
<property name="best_size"></property>
<property name="bg"></property>
@ -1060,10 +1266,10 @@
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="auth_needed">0</property>
<property name="best_size"></property>
<property name="bg"></property>

11
eeschema/widgets/tuner_slider_base.h

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 4.1.0-0-g733bf3d)
// C++ code generated with wxFormBuilder (version 4.2.1-75-g9786507b-dirty)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -20,6 +20,8 @@ class STD_BITMAP_BUTTON;
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/sizer.h>
#include <wx/choice.h>
#include <wx/spinctrl.h>
#include <wx/statline.h>
#include <wx/bmpbuttn.h>
#include <wx/bitmap.h>
@ -32,7 +34,6 @@ class STD_BITMAP_BUTTON;
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class TUNER_SLIDER_BASE
///////////////////////////////////////////////////////////////////////////////
@ -43,6 +44,9 @@ class TUNER_SLIDER_BASE : public wxPanel
protected:
wxPanel* m_panel1;
wxStaticText* m_name;
wxChoice* m_modeChoice;
wxStaticText* m_stepsLabel;
wxSpinCtrl* m_stepCount;
wxStaticLine* m_staticline4;
BITMAP_BUTTON* m_e24;
BITMAP_BUTTON* m_separator;
@ -57,6 +61,9 @@ class TUNER_SLIDER_BASE : public wxPanel
STD_BITMAP_BUTTON* m_closeBtn;
// Virtual event handlers, override them in your derived class
virtual void onRunModeChanged( wxCommandEvent& event ) { event.Skip(); }
virtual void onStepsChanged( wxSpinEvent& event ) { event.Skip(); }
virtual void onStepsTextEnter( wxCommandEvent& event ) { event.Skip(); }
virtual void onESeries( wxCommandEvent& event ) { event.Skip(); }
virtual void onSliderScroll( wxScrollEvent& event ) { event.Skip(); }
virtual void onSliderChanged( wxScrollEvent& event ) { event.Skip(); }

Loading…
Cancel
Save