diff --git a/eeschema/sim/sim_plot_panel.cpp b/eeschema/sim/sim_plot_panel.cpp index 7e02383ea4..24c101d535 100644 --- a/eeschema/sim/sim_plot_panel.cpp +++ b/eeschema/sim/sim_plot_panel.cpp @@ -32,8 +32,6 @@ #include #include -#include - static wxString formatFloat( double x, int nDigits ) { @@ -318,6 +316,32 @@ SIM_PLOT_PANEL::SIM_PLOT_PANEL( const wxString& aCommand, wxWindow* parent, UpdatePlotColors(); + updateAxes(); + + // a mpInfoLegend displays le name of traces on the left top panel corner: + m_legend = new mpInfoLegend( wxRect( 0, 40, 200, 40 ), wxTRANSPARENT_BRUSH ); + m_legend->SetVisible( false ); + m_plotWin->AddLayer( m_legend ); + + m_plotWin->EnableDoubleBuffer( true ); + m_plotWin->UpdateAll(); + + m_sizer->Add( m_plotWin, 1, wxALL | wxEXPAND, 1 ); + SetSizer( m_sizer ); +} + + +SIM_PLOT_PANEL::~SIM_PLOT_PANEL() +{ + // ~mpWindow destroys all the added layers, so there is no need to destroy m_traces contents +} + + +void SIM_PLOT_PANEL::updateAxes() +{ + if( m_axis_x ) + return; + switch( GetType() ) { case ST_AC: @@ -370,34 +394,28 @@ SIM_PLOT_PANEL::SIM_PLOT_PANEL( const wxString& aCommand, wxWindow* parent, m_axis_y2->SetNameAlign ( mpALIGN_RIGHT ); m_plotWin->AddLayer( m_axis_y2 ); } - - // a mpInfoLegend displays le name of traces on the left top panel corner: - m_legend = new mpInfoLegend( wxRect( 0, 40, 200, 40 ), wxTRANSPARENT_BRUSH ); - m_legend->SetVisible( false ); - m_plotWin->AddLayer( m_legend ); - - m_plotWin->EnableDoubleBuffer( true ); - m_plotWin->UpdateAll(); - - m_sizer->Add( m_plotWin, 1, wxALL | wxEXPAND, 1 ); - SetSizer( m_sizer ); } - -SIM_PLOT_PANEL::~SIM_PLOT_PANEL() -{ - // ~mpWindow destroys all the added layers, so there is no need to destroy m_traces contents -} - - void SIM_PLOT_PANEL::prepareDCAxes() { - wxRegEx simCmd( "^.dc[[:space:]]+([[:alnum:]]+\\M).*", wxRE_ADVANCED | wxRE_ICASE ); + wxString sim_cmd = getSimCommand().Lower(); + wxString rem; - if( simCmd.Matches( getSimCommand() ) ) + if( sim_cmd.StartsWith( ".dc ", &rem ) ) { - switch( static_cast( simCmd.GetMatch( getSimCommand().Lower(), 1 ).GetChar( 0 ) ) ) + wxChar ch; + + try { + ch = rem.GetChar( 0 ); + } + catch( ... ) + {;} + + switch( ch ) + { + // Make sure that we have a reliable default (even if incorrectly labeled) + default: case 'v': m_axis_x = new LIN_SCALE( _( "Voltage (swept)" ), wxT( "V" ), mpALIGN_BOTTOM ); @@ -442,7 +460,7 @@ void SIM_PLOT_PANEL::UpdatePlotColors() void SIM_PLOT_PANEL::UpdateTraceStyle( TRACE* trace ) { int type = trace->GetType(); - wxPenStyle penStyle = ( ( type & SPT_AC_PHASE || type & SPT_CURRENT ) && m_dotted_cp ) + wxPenStyle penStyle = ( ( ( type & SPT_AC_PHASE ) || ( type & SPT_CURRENT ) ) && m_dotted_cp ) ? wxPENSTYLE_DOT : wxPENSTYLE_SOLID; trace->SetPen( wxPen( trace->GetTraceColour(), 2, penStyle ) ); @@ -456,6 +474,8 @@ bool SIM_PLOT_PANEL::addTrace( const wxString& aTitle, const wxString& aName, in TRACE* trace = nullptr; wxString name = aTitle; + updateAxes(); + // Find previous entry, if there is one auto prev = m_traces.find( name ); bool addedNewEntry = ( prev == m_traces.end() ); diff --git a/eeschema/sim/sim_plot_panel.h b/eeschema/sim/sim_plot_panel.h index b79af8f8ee..459ba72d19 100644 --- a/eeschema/sim/sim_plot_panel.h +++ b/eeschema/sim/sim_plot_panel.h @@ -301,6 +301,9 @@ private: ///< @brief Construct the plot axes for DC simulation plot. void prepareDCAxes(); + ///> Create/Ensure axes are available for plotting + void updateAxes(); + SIM_PLOT_COLORS m_colors; // Top-level plot window