29#include <fmt/format.h>
30#include <wx/wfstream.h>
31#include <wx/stdstream.h>
33#include <wx/clipbrd.h>
59 int res = (int) aFirst | (
int) aSecond;
120 void showPopupMenu( wxMenu& menu, wxGridEvent& aEvent )
override;
144 if( panel->GetSimType() ==
ST_TRAN || panel->GetSimType() ==
ST_AC
145 || panel->GetSimType() ==
ST_DC || panel->GetSimType() ==
ST_SP )
153 if( panel->GetSimType() ==
ST_AC || panel->GetSimType() ==
ST_SP )
166 if( panel->GetSimType() ==
ST_TRAN )
168 menu.AppendSeparator();
169 menu.Append(
MYID_FOURIER,
_(
"Perform Fourier Analysis..." ) );
172 menu.AppendSeparator();
175 m_grid->PopupMenu( &menu );
184 std::vector<wxString> signals;
186 wxGridCellCoordsArray cells1 =
m_grid->GetSelectionBlockTopLeft();
187 wxGridCellCoordsArray cells2 =
m_grid->GetSelectionBlockBottomRight();
189 for(
size_t i = 0; i < cells1.Count(); i++ )
193 for(
int j = cells1[i].GetRow(); j < cells2[i].GetRow() + 1; j++ )
195 signals.push_back(
m_grid->GetCellValue( j, cells1[i].GetCol() ) );
200 wxGridCellCoordsArray cells3 =
m_grid->GetSelectedCells();
202 for(
size_t i = 0; i < cells3.Count(); i++ )
205 signals.push_back(
m_grid->GetCellValue( cells3[i].GetRow(), cells3[i].GetCol() ) );
208 if( signals.size() < 1 )
211 auto addMeasurement =
212 [
this](
const wxString& cmd, wxString signal )
214 if( signal.EndsWith(
_(
" (phase)" ) ) )
217 if( signal.EndsWith(
_(
" (gain)" ) ) || signal.EndsWith(
_(
" (amplitude)" ) ) )
219 signal = signal.Left( signal.length() - 7 );
221 if( signal.Upper().StartsWith( wxS(
"V(" ) ) )
222 signal = wxS(
"vdb" ) + signal.Mid( 1 );
230 for(
const wxString& signal : signals )
231 addMeasurement( wxS(
"MIN" ), signal );
235 for(
const wxString& signal : signals )
236 addMeasurement( wxS(
"MAX" ), signal );
240 for(
const wxString& signal : signals )
241 addMeasurement( wxS(
"AVG" ), signal );
245 for(
const wxString& signal : signals )
246 addMeasurement( wxS(
"RMS" ), signal );
250 for(
const wxString& signal : signals )
251 addMeasurement( wxS(
"PP" ), signal );
255 for(
const wxString& signal : signals )
256 addMeasurement( wxS(
"MIN_AT" ), signal );
260 for(
const wxString& signal : signals )
261 addMeasurement( wxS(
"MAX_AT" ), signal );
265 for(
const wxString& signal : signals )
266 addMeasurement( wxS(
"INTEG" ), signal );
271 wxString fundamental = wxT(
"1K" );
273 if( signals.size() == 1 )
274 title.Printf(
_(
"Fourier Analysis of %s" ), signals[0] );
276 title =
_(
"Fourier Analyses of Multiple Signals" );
286 for(
const wxString& signal : signals )
294 for(
const wxString& signal : signals )
302 if( wxTheClipboard->Open() )
304 wxTheClipboard->SetData(
new wxTextDataObject( txt ) );
305 wxTheClipboard->Flush();
306 wxTheClipboard->Close();
323 void showPopupMenu( wxMenu& menu, wxGridEvent& aEvent )
override;
343 menu.AppendSeparator();
353 [
this](
int row ) -> wxString
357 if( signal.EndsWith(
"[2 - 1]" ) )
358 signal = signal.Left( signal.length() - 7 );
369 if( formatDialog.
ShowModal() == wxID_OK )
371 for(
int row = 0; row <
m_grid->GetNumberRows(); ++row )
373 if( getSignalName( row ) == getSignalName(
m_menuRow ) )
396 void showPopupMenu( wxMenu& menu, wxGridEvent& aEvent )
override;
422 menu.AppendSeparator();
435 if( formatDialog.
ShowModal() == wxID_OK )
444 std::vector<int> measurements;
446 wxGridCellCoordsArray cells1 =
m_grid->GetSelectionBlockTopLeft();
447 wxGridCellCoordsArray cells2 =
m_grid->GetSelectionBlockBottomRight();
449 for(
size_t i = 0; i < cells1.Count(); i++ )
453 for(
int j = cells1[i].GetRow(); j < cells2[i].GetRow() + 1; j++ )
454 measurements.push_back( j );
458 wxGridCellCoordsArray cells3 =
m_grid->GetSelectedCells();
460 for(
size_t i = 0; i < cells3.Count(); i++ )
463 measurements.push_back( cells3[i].GetRow() );
466 if( measurements.size() < 1 )
471 sort( measurements.begin(), measurements.end(), std::greater<>() );
473 for(
int row : measurements )
506#define ID_SIM_REFRESH 10207
507#define REFRESH_INTERVAL 50
513 m_SuppressGridEvents( 0 ),
514 m_simulatorFrame( aSimulatorFrame ),
515 m_schematicFrame( aSchematicFrame ),
533 wxGridCellAttr* attr =
new wxGridCellAttr;
537 attr =
new wxGridCellAttr;
541 attr =
new wxGridCellAttr;
545 attr =
new wxGridCellAttr;
549 for(
int cursorId = 0; cursorId < 3; ++cursorId )
555 attr =
new wxGridCellAttr;
565 [&]( wxTimerEvent& aEvent )
574#ifndef wxHAS_NATIVE_TABART
592 for(
int ii = 0; ii < (int)
m_plotNotebook->GetPageCount(); ++ii )
596 simTab->OnLanguageChanged();
598 wxString pageTitle(
simulator()->TypeToName( simTab->GetSimType(),
true ) );
599 pageTitle.Prepend( wxString::Format(
_(
"Analysis %u - " ), ii+1 ) );
620 tuner->ShowChangedLanguage();
658 for( std::size_t i = 0; i < pageCount; ++i )
661 auto simTab =
dynamic_cast<SIM_TAB*
>( page );
662 wxASSERT( simTab !=
nullptr );
663 simTab->ApplyPreferences( aPrefs );
670 if( !
simulator()->Settings()->GetWorkbookFilename().IsEmpty() )
672 wxFileName filename =
simulator()->Settings()->GetWorkbookFilename();
676 simulator()->Settings()->SetWorkbookFilename(
"" );
680 wxString schTextSimCommand =
circuitModel()->GetSchTextSimCommand();
682 if( !schTextSimCommand.IsEmpty() )
715 std::sort( signals.begin(), signals.end(),
716 [](
const wxString& lhs,
const wxString& rhs )
719 if( lhs.Upper().StartsWith(
'V' ) && !rhs.Upper().StartsWith(
'V' ) )
721 else if( !lhs.Upper().StartsWith(
'V' ) && rhs.Upper().StartsWith(
'V' ) )
724 return StrNumCmp( lhs, rhs, true ) < 0;
741 std::vector<wxString> signals;
745 wxStringTokenizer tokenizer( plotPanel->
GetSimCommand(), wxT(
" \t\r\n" ), wxTOKEN_STRTOK );
747 while( tokenizer.HasMoreTokens() && tokenizer.GetNextToken().Lower() != wxT(
"fft" ) )
750 while( tokenizer.HasMoreTokens() )
751 signals.emplace_back( tokenizer.GetNextToken() );
758 for(
const wxString& signal :
m_signals )
759 signals.push_back( signal );
763 if( simType ==
ST_AC )
765 signals.push_back( signal +
_(
" (gain)" ) );
766 signals.push_back( signal +
_(
" (phase)" ) );
768 else if( simType ==
ST_SP )
770 signals.push_back( signal +
_(
" (amplitude)" ) );
771 signals.push_back( signal +
_(
" (phase)" ) );
775 signals.push_back( signal );
782 if( aFilter.IsEmpty() )
783 aFilter = wxS(
"*" );
788 for(
const wxString& signal : signals )
790 if( matcher.
Find( signal.Upper() ) )
799 wxGridCellAttr* attr =
new wxGridCellAttr;
800 attr->SetRenderer(
new wxGridCellBoolRenderer() );
802 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
807 attr =
new wxGridCellAttr;
812 attr =
new wxGridCellAttr;
816 attr =
new wxGridCellAttr;
824 attr =
new wxGridCellAttr;
827 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
832 attr =
new wxGridCellAttr;
833 attr->SetRenderer(
new wxGridCellBoolRenderer() );
835 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
839 attr =
new wxGridCellAttr;
840 attr->SetRenderer(
new wxGridCellBoolRenderer() );
842 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
859 wxString unconnected = wxString( wxS(
"unconnected-(" ) );
864 unconnected.Replace(
'(',
'_' );
867 [&](
const wxString& aSignalName )
869 if( simType ==
ST_AC )
871 m_signals.push_back( aSignalName +
_(
" (gain)" ) );
872 m_signals.push_back( aSignalName +
_(
" (phase)" ) );
874 else if( simType ==
ST_SP )
876 m_signals.push_back( aSignalName +
_(
" (amplitude)" ) );
877 m_signals.push_back( aSignalName +
_(
" (phase)" ) );
894 if( netname ==
"GND" || netname ==
"0" || netname.StartsWith( unconnected ) )
898 addSignal( wxString::Format( wxS(
"V(%s)" ), netname ) );
908 for(
const std::string&
name : item.model->SpiceGenerator().CurrentNames( item ) )
918 if( item.model->GetPinCount() >= 2 )
920 wxString
name = item.model->SpiceGenerator().ItemName( item );
921 addSignal( wxString::Format( wxS(
"P(%s)" ),
name ) );
928 addSignal( wxS(
"inoise_spectrum" ) );
929 addSignal( wxS(
"onoise_spectrum" ) );
932 if( simType ==
ST_SP )
934 std::vector<std::string> portnums;
938 wxString
name = item.model->SpiceGenerator().ItemName( item );
941 if( !
name.StartsWith(
"V" ) )
944 std::string portnum =
"";
946 if(
const SIM_MODEL::PARAM* portnum_param = item.model->FindParam(
"portnum" ) )
950 portnums.push_back( portnum );
953 for(
const std::string& portnum1 : portnums )
955 for(
const std::string& portnum2 : portnums )
957 addSignal( wxString::Format( wxS(
"S_%s_%s" ), portnum1, portnum2 ) );
963 for(
const wxString& directive :
circuitModel()->GetDirectives() )
965 wxStringTokenizer directivesTokenizer( directive, wxT(
"\r\n" ), wxTOKEN_STRTOK );
967 while( directivesTokenizer.HasMoreTokens() )
969 wxString line = directivesTokenizer.GetNextToken().Upper();
970 wxString directiveParams;
972 if( line.StartsWith( wxS(
".SAVE" ), &directiveParams )
973 || line.StartsWith( wxS(
".PROBE" ), &directiveParams ) )
975 wxStringTokenizer paramsTokenizer( directiveParams, wxT(
" \t" ), wxTOKEN_STRTOK );
977 while( paramsTokenizer.HasMoreTokens() )
978 addSignal( paramsTokenizer.GetNextToken() );
1001 wxString pageTitle(
simulator()->TypeToName( simType,
true ) );
1002 pageTitle.Prepend( wxString::Format(
_(
"Analysis %u - " ), (
unsigned int) ++
m_plotNumber ) );
1018 wxPoint pos = aEvent.GetPosition();
1019 wxRect ctrlRect =
m_filter->GetScreenRect();
1020 int buttonWidth = ctrlRect.GetHeight();
1022 if(
m_filter->IsSearchButtonVisible() && pos.x < buttonWidth )
1023 SetCursor( wxCURSOR_ARROW );
1024 else if(
m_filter->IsCancelButtonVisible() && pos.x > ctrlRect.GetWidth() - buttonWidth )
1025 SetCursor( wxCURSOR_ARROW );
1027 SetCursor( wxCURSOR_IBEAM );
1033 return wxString::Format( wxS(
"user%d" ), aUserDefinedSignalId );
1042 const wxString& aSignalName,
1045 std::map<wxString, int> suffixes;
1061 wxUniChar firstChar = aSignalName.Upper()[0];
1063 if( firstChar ==
'V' )
1065 else if( firstChar ==
'I' )
1067 else if( firstChar ==
'P' )
1073 wxString
name = aSignalName;
1075 for(
const auto& [ candidate, type ] : suffixes )
1077 if(
name.EndsWith( candidate ) )
1079 name =
name.Left(
name.Length() - candidate.Length() );
1082 *aTraceType |= type;
1090 if(
name == signal )
1108 int row = aEvent.GetRow();
1109 int col = aEvent.GetCol();
1117 if(
text == wxS(
"1" ) )
1144 for(
int ii = 0; ii <
m_signalsGrid->GetNumberRows(); ++ii )
1150 bool enable = ii == row &&
text == wxS(
"1" );
1152 plotTab->
EnableCursor( vectorName, traceType,
id, enable, signalName );
1172 int row = aEvent.GetRow();
1173 int col = aEvent.GetCol();
1179 CURSOR* cursor1 =
nullptr;
1180 CURSOR* cursor2 =
nullptr;
1193 if( cursorName == wxS(
"1" ) && cursor1 )
1195 else if( cursorName == wxS(
"2" ) && cursor2 )
1197 else if( cursorName ==
_(
"Diff" ) && cursor1 && cursor2 )
1205 wxFAIL_MSG( wxT(
"All other columns are supposed to be read-only!" ) );
1238 int row = aEvent.GetRow();
1239 int col = aEvent.GetCol();
1250 wxFAIL_MSG( wxT(
"All other columns are supposed to be read-only!" ) );
1258 for( row = rowCount - 1; row >= 0; row-- )
1268 int killRows = emptyRows - 1;
1271 else if( emptyRows == 0 )
1282 if( plotTab->GetLegendPosition() != plotTab->m_LastLegendPosition )
1284 plotTab->m_LastLegendPosition = plotTab->GetLegendPosition();
1307 static wxRegEx measureParamsRegEx( wxT(
"^"
1311 "([a-zA-Z]*)\\(([^\\)]+)\\)" ) );
1320 if(
text.IsEmpty() )
1327 wxString resultName = wxString::Format( wxS(
"meas_result_%u" ), aRow );
1328 wxString result = wxS(
"?" );
1330 if( measureParamsRegEx.Matches(
text ) )
1332 wxString func = measureParamsRegEx.GetMatch(
text, 1 ).Upper();
1333 wxString signalType = measureParamsRegEx.GetMatch(
text, 2 ).Upper();
1334 wxString deviceName = measureParamsRegEx.GetMatch(
text, 3 );
1338 if( signalType.EndsWith( wxS(
"DB" ) ) )
1340 units = wxS(
"dB" );
1342 else if( signalType.StartsWith(
'I' ) )
1346 else if( signalType.StartsWith(
'P' ) )
1350 text = func +
" " + deviceName +
":power";
1357 if( func.EndsWith( wxS(
"_AT" ) ) )
1360 units = wxS(
"Hz" );
1364 else if( func.StartsWith( wxS(
"INTEG" ) ) )
1369 if ( signalType.StartsWith(
'P' ) )
1372 units += wxS(
".s" );
1382 units += wxS(
"·Hz" );
1390 units += wxS(
"·?" );
1403 wxString cmd = wxString::Format( wxS(
"meas %s %s %s" ), simType, resultName,
text );
1404 simulator()->Command(
"echo " + cmd.ToStdString() );
1405 simulator()->Command( cmd.ToStdString() );
1407 std::vector<double> resultVec =
simulator()->GetGainVector( resultName.ToStdString() );
1409 if( resultVec.size() > 0 )
1424 wxString ref = aSymbol->
GetRef( &aSheetPath );
1429 if( tuner->GetSymbolRef() == ref )
1455 const wxString& aRef,
const wxString& aValue )
1463 + wxString::Format(
_(
"%s not found" ), aRef ) );
1476 + wxString::Format(
_(
"%s is not tunable" ), aRef ) );
1542 wxString cmd = wxString::Format( wxS(
"fourier %s %s" ),
1546 simulator()->Command( cmd.ToStdString() );
1560 m_simConsole->AppendText(
_(
"Error: no current simulation.\n" ) );
1569 m_simConsole->AppendText(
_(
"Error: simulation type not defined.\n" ) );
1575 m_simConsole->AppendText(
_(
"Error: simulation type doesn't support plotting.\n" ) );
1582 if( simType ==
ST_AC )
1587 else if( simType ==
ST_SP )
1597 plotTab->GetPlotWin()->UpdateAll();
1619 if( aNewSignals.count(
id ) == 0 )
1624 plotTab->
DeleteTrace( vectorName, traceType | subType );
1629 plotTab->
DeleteTrace( vectorName, traceType | subType );
1642 if(
TRACE* trace = plotTab->
GetTrace( vectorName, traceType | subType ) )
1643 trace->SetName( aNewSignals.at(
id ) );
1650 if(
TRACE* trace = plotTab->
GetTrace( vectorName, traceType | subType ) )
1651 trace->SetName( aNewSignals.at(
id ) );
1656 if(
TRACE* trace = plotTab->
GetTrace( vectorName, traceType ) )
1657 trace->SetName( aNewSignals.at(
id ) );
1685 wxString simVectorName = aVectorName;
1688 simVectorName = simVectorName.AfterFirst(
'(' ).BeforeLast(
')' ) + wxS(
":power" );
1693 simulator()->Command( wxString::Format( wxT(
"print %s" ), aVectorName ).ToStdString() );
1698 std::vector<double> data_x;
1699 std::vector<double> data_y;
1701 if( !aDataX || aClearData )
1705 if( aDataX->empty() && !aClearData )
1707 wxString xAxisName(
simulator()->GetXAxis( simType ) );
1709 if( xAxisName.IsEmpty() )
1712 *aDataX =
simulator()->GetGainVector( (
const char*) xAxisName.c_str() );
1715 unsigned int size = aDataX->size();
1721 data_y =
simulator()->GetGainVector( (
const char*) simVectorName.c_str(), size );
1723 data_y =
simulator()->GetPhaseVector( (
const char*) simVectorName.c_str(), size );
1725 wxFAIL_MSG( wxT(
"Plot type missing AC_PHASE or AC_MAG bit" ) );
1730 data_y =
simulator()->GetGainVector( (
const char*) simVectorName.c_str(), size );
1732 data_y =
simulator()->GetPhaseVector( (
const char*) simVectorName.c_str(), size );
1734 wxFAIL_MSG( wxT(
"Plot type missing AC_PHASE or SPT_SP_AMP bit" ) );
1739 data_y =
simulator()->GetGainVector( (
const char*) simVectorName.c_str(), -1 );
1745 data_y =
simulator()->GetGainVector( (
const char*) simVectorName.c_str(), size );
1749 wxFAIL_MSG( wxT(
"Unhandled plot type" ) );
1754 size_t sweepSize = std::numeric_limits<size_t>::max();
1756 if( simType ==
ST_DC
1763 sweepSize = aDataX->size() / sweepCount;
1768 if( data_y.size() >= size )
1769 aPlotTab->
SetTraceData( trace, *aDataX, data_y, sweepCount, sweepSize );
1778 for(
int row = 0; row <
m_signalsGrid->GetNumberRows(); ++row )
1784 if(
TRACE* trace = plotTab ? plotTab->
GetTrace( vectorName, traceType ) :
nullptr )
1788 wxGridCellAttr* attr =
new wxGridCellAttr;
1791 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
1797 attr =
new wxGridCellAttr;
1798 attr->SetRenderer(
new wxGridCellBoolRenderer() );
1799 attr->SetReadOnly();
1800 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
1803 attr =
new wxGridCellAttr;
1804 attr->SetRenderer(
new wxGridCellBoolRenderer() );
1805 attr->SetReadOnly();
1806 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
1809 if( trace->HasCursor( 1 ) )
1814 if( trace->HasCursor( 2 ) )
1823 wxGridCellAttr* attr =
new wxGridCellAttr;
1824 attr->SetReadOnly();
1828 attr =
new wxGridCellAttr;
1829 attr->SetReadOnly();
1833 attr =
new wxGridCellAttr;
1834 attr->SetReadOnly();
1844 auto quoteNetNames =
1845 [&]( wxString aExpression ) -> wxString
1848 aExpression.Replace( netname, quotedNetname );
1855 constexpr const char* cmd =
"let user{} = {}";
1857 simulator()->Command(
"echo " + fmt::format( cmd,
id, signal.ToStdString() ) );
1858 simulator()->Command( fmt::format( cmd,
id, quoteNetNames( signal ).ToStdString() ) );
1870 wxString ref = tuner->GetSymbolRef();
1871 KIID symbolId = tuner->GetSymbol( &sheetPath );
1877 reporter.
Report( wxString::Format(
_(
"%s not found" ), ref ) );
1885 reporter.
Report( wxString::Format(
_(
"%s is not tunable" ), ref ) );
1889 double floatVal = tuner->GetValue().ToDouble();
1902 wxTextFile file( aPath );
1907 wxString firstLine = file.GetFirstLine();
1909 bool legacy = firstLine.StartsWith( wxT(
"version " ) ) || firstLine.ToLong( &
dummy );
1934 wxFileName filename( aPath );
1938 simulator()->Settings()->SetWorkbookFilename( filename.GetFullPath() );
1946 wxFFileInputStream fp( aPath, wxT(
"rt" ) );
1947 wxStdInputStream fstream( fp );
1954 nlohmann::json js = nlohmann::json::parse( fstream,
nullptr,
true,
true );
1956 std::map<SIM_PLOT_TAB*, nlohmann::json> traceInfo;
1958 for(
const nlohmann::json& tab_js : js[
"tabs" ] )
1960 wxString simCommand;
1964 for(
const nlohmann::json& cmd : tab_js[
"commands" ] )
1966 if( cmd ==
".kicad adjustpaths" )
1968 else if( cmd ==
".save all" )
1970 else if( cmd ==
".probe alli" )
1972 else if( cmd ==
".probe allp" )
1974 else if( cmd ==
".kicad esavenone" )
1977 simCommand += wxString( cmd.get<wxString>() ).Trim();
1987 if( tab_js.contains(
"traces" ) )
1988 traceInfo[plotTab] = tab_js[
"traces" ];
1990 if( tab_js.contains(
"measurements" ) )
1992 for(
const nlohmann::json& m_js : tab_js[
"measurements" ] )
1993 plotTab->
Measurements().emplace_back( m_js[
"expr" ], m_js[
"format" ] );
1997 plotTab->
ShowGrid( tab_js[
"showGrid" ] );
1999 if( tab_js.contains(
"fixedY1scale" ) )
2001 const nlohmann::json& scale_js = tab_js[
"fixedY1scale" ];
2002 plotTab->
SetY1Scale(
true, scale_js[
"min" ], scale_js[
"max" ] );
2006 if( tab_js.contains(
"fixedY2scale" ) )
2008 const nlohmann::json& scale_js = tab_js[
"fixedY2scale" ];
2009 plotTab->
SetY2Scale(
true, scale_js[
"min" ], scale_js[
"max" ] );
2013 if( tab_js.contains(
"fixedY3scale" ) )
2016 const nlohmann::json& scale_js = tab_js[
"fixedY3scale" ];
2017 plotTab->
SetY3Scale(
true, scale_js[
"min" ], scale_js[
"max" ] );
2021 if( tab_js.contains(
"legend" ) )
2023 const nlohmann::json& legend_js = tab_js[
"legend" ];
2028 if( tab_js.contains(
"margins" ) )
2030 const nlohmann::json& margins_js = tab_js[
"margins" ];
2032 margins_js[
"right" ],
2033 margins_js[
"bottom" ],
2034 margins_js[
"left" ] );
2041 if( js.contains(
"user_defined_signals" ) )
2043 for(
const nlohmann::json& signal_js : js[
"user_defined_signals" ] )
2049 int aCursorId,
const nlohmann::json& aCursor_js )
2051 if( aCursorId == 1 || aCursorId == 2 )
2055 cursor->SetName( aSignalName );
2056 cursor->SetCoordX( aCursor_js[
"position" ] );
2058 aTrace->SetCursor( aCursorId,
cursor );
2066 for(
const auto& [ plotTab, traces_js ] : traceInfo )
2068 for(
const nlohmann::json& trace_js : traces_js )
2070 wxString signalName = trace_js[
"signal" ];
2072 TRACE* trace = plotTab->GetOrAddTrace( vectorName, trace_js[
"trace_type" ] );
2076 if( trace_js.contains(
"cursor1" ) )
2077 addCursor( plotTab, trace, signalName, 1, trace_js[
"cursor1" ] );
2079 if( trace_js.contains(
"cursor2" ) )
2080 addCursor( plotTab, trace, signalName, 2, trace_js[
"cursor2" ] );
2082 if( trace_js.contains(
"cursorD" ) )
2083 addCursor( plotTab, trace, signalName, 3, trace_js[
"cursorD" ] );
2085 if( trace_js.contains(
"color" ) )
2088 color.Set( wxString( trace_js[
"color"].get<wxString>() ) );
2090 plotTab->UpdateTraceStyle( trace );
2095 plotTab->UpdatePlotColors();
2103 firstTab->SetLastSchTextSimCommand( js[
"last_sch_text_sim_command" ] );
2106 catch( nlohmann::json::parse_error& error )
2108 wxLogTrace(
traceSettings, wxT(
"Json parse error reading %s: %s" ), aPath, error.what() );
2112 catch( nlohmann::json::type_error& error )
2114 wxLogTrace(
traceSettings, wxT(
"Json type error reading %s: %s" ), aPath, error.what() );
2118 catch( nlohmann::json::invalid_iterator& error )
2120 wxLogTrace(
traceSettings, wxT(
"Json invalid_iterator error reading %s: %s" ), aPath, error.what() );
2124 catch( nlohmann::json::out_of_range& error )
2126 wxLogTrace(
traceSettings, wxT(
"Json out_of_range error reading %s: %s" ), aPath, error.what() );
2132 wxLogTrace(
traceSettings, wxT(
"Error reading %s" ), aPath );
2144 wxFileName filename = aPath;
2149 file.Create( filename.GetFullPath(),
true );
2151 if( !file.IsOpened() )
2154 nlohmann::json tabs_js = nlohmann::json::array();
2165 nlohmann::json commands_js = nlohmann::json::array();
2172 commands_js.push_back(
".kicad adjustpaths" );
2175 commands_js.push_back(
".save all" );
2178 commands_js.push_back(
".probe alli" );
2181 commands_js.push_back(
".probe allp" );
2184 commands_js.push_back(
".kicad esavenone" );
2186 nlohmann::json tab_js = nlohmann::json(
2188 {
"commands", commands_js } } );
2192 nlohmann::json traces_js = nlohmann::json::array();
2194 auto findSignalName =
2195 [&](
const wxString& aVectorName ) -> wxString
2197 wxString vectorName;
2200 if( aVectorName.EndsWith(
_(
" (phase)" ) ) )
2201 suffix =
_(
" (phase)" );
2202 else if( aVectorName.EndsWith(
_(
" (gain)" ) ) )
2203 suffix =
_(
" (gain)" );
2205 vectorName = aVectorName.Left( aVectorName.Length() - suffix.Length() );
2210 return signal + suffix;
2216 for(
const auto& [
name, trace] : plotTab->GetTraces() )
2218 nlohmann::json trace_js = nlohmann::json(
2219 { {
"trace_type", (int) trace->GetType() },
2220 {
"signal", findSignalName( trace->GetDisplayName() ) },
2225 trace_js[
"cursor1"] = nlohmann::json(
2226 { {
"position",
cursor->GetCoords().x },
2233 trace_js[
"cursor2"] = nlohmann::json(
2234 { {
"position",
cursor->GetCoords().x },
2239 if( trace->GetCursor( 1 ) || trace->GetCursor( 2 ) )
2241 trace_js[
"cursorD"] = nlohmann::json(
2246 traces_js.push_back( trace_js );
2249 nlohmann::json measurements_js = nlohmann::json::array();
2251 for(
const auto& [
measurement, format ] : plotTab->Measurements() )
2253 measurements_js.push_back( nlohmann::json( { {
"expr",
measurement },
2254 {
"format", format } } ) );
2257 tab_js[
"traces" ] = traces_js;
2258 tab_js[
"measurements" ] = measurements_js;
2259 tab_js[
"dottedSecondary" ] = plotTab->GetDottedSecondary();
2260 tab_js[
"showGrid" ] = plotTab->IsGridShown();
2264 if( plotTab->GetY1Scale( &min, &max ) )
2265 tab_js[
"fixedY1scale" ] = nlohmann::json( { {
"min", min }, {
"max", max } } );
2267 if( plotTab->GetY2Scale( &min, &max ) )
2268 tab_js[
"fixedY2scale" ] = nlohmann::json( { {
"min", min }, {
"max", max } } );
2270 if( plotTab->GetY3Scale( &min, &max ) )
2271 tab_js[
"fixedY3scale" ] = nlohmann::json( { {
"min", min }, {
"max", max } } );
2273 if( plotTab->IsLegendShown() )
2275 tab_js[
"legend" ] = nlohmann::json( { {
"x", plotTab->GetLegendPosition().x },
2276 {
"y", plotTab->GetLegendPosition().y } } );
2279 mpWindow* plotWin = plotTab->GetPlotWin();
2281 tab_js[
"margins" ] = nlohmann::json( { {
"left", plotWin->
GetMarginLeft() },
2287 tabs_js.push_back( tab_js );
2290 nlohmann::json userDefinedSignals_js = nlohmann::json::array();
2293 userDefinedSignals_js.push_back( signal );
2295 nlohmann::json js = nlohmann::json( { {
"version", 6 },
2296 {
"tabs", tabs_js },
2297 {
"user_defined_signals", userDefinedSignals_js } } );
2308 std::stringstream buffer;
2309 buffer << std::setw( 2 ) << js << std::endl;
2311 bool res = file.Write( buffer.str() );
2318 simulator()->Settings()->SetWorkbookFilename( filename.GetFullPath() );
2336 default: wxFAIL_MSG( wxS(
"Unhandled simulation type" ) );
return SPT_UNKNOWN;
2355 &source, &
scale, &pts, &fStart, &fStop, &saveAll );
2370 for(
size_t page = 0; page <
m_plotNotebook->GetPageCount(); page++ )
2415 std::vector<std::pair<wxString, wxString>>& measurements = plotTab->Measurements();
2417 measurements.clear();
2455 simulator()->Command(
"setplot " + simTab->GetSpicePlotName().ToStdString() );
2469 for(
const auto& [
measurement, format ] : plotTab->Measurements() )
2477 if( plotTab->GetSimType() ==
ST_TRAN || plotTab->GetSimType() ==
ST_AC
2478 || plotTab->GetSimType() ==
ST_DC || plotTab->GetSimType() ==
ST_SP )
2515 CURSOR* cursor1 =
nullptr;
2516 wxString cursor1Name;
2517 wxString cursor1Units;
2518 CURSOR* cursor2 =
nullptr;
2519 wxString cursor2Name;
2520 wxString cursor2Units;
2523 [&](
TRACE* aTrace ) -> wxString
2544 [&](
TRACE* aTrace ) -> wxString
2565 [
this](
double aValue,
int aCursorId,
int aCol ) -> wxString
2578 cursor1Name = getNameY( trace );
2579 cursor1Units = getUnitsY( trace );
2581 wxRealPoint coords =
cursor->GetCoords();
2601 cursor2Name = getNameY( trace );
2602 cursor2Units = getUnitsY( trace );
2604 wxRealPoint coords =
cursor->GetCoords();
2619 if( cursor1 && cursor2 && cursor1Units == cursor2Units )
2628 signal = wxString::Format( wxS(
"%s[2 - 1]" ), cursor2->
GetName() );
2630 signal = wxString::Format( wxS(
"%s - %s" ), cursor2->
GetName(), cursor1->
GetName() );
2642 wxString valColName =
_(
"Value" );
2644 if( !cursor1Name.IsEmpty() )
2646 if( cursor2Name.IsEmpty() || cursor1Name == cursor2Name )
2647 valColName = cursor1Name;
2649 else if( !cursor2Name.IsEmpty() )
2651 valColName = cursor2Name;
2668 plotTab->ResetScales(
true );
2688 std::vector<wxString> signals;
2690 for(
const std::string& vec :
simulator()->AllVectors() )
2691 signals.emplace_back( vec );
2699 std::vector<wxString> signals;
2701 for(
const wxString& signal :
m_signals )
2702 signals.emplace_back( signal );
2705 signals.emplace_back( signal );
2737 if( simType ==
ST_NOISE && aFinal )
2739 m_simConsole->AppendText(
_(
"\n\nSimulation results:\n\n" ) );
2746 simulator()->CurrentPlotName().Mid( 5 ).ToLong( &number );
2748 for(
const std::string& vec :
simulator()->AllVectors() )
2750 std::vector<double> val_list =
simulator()->GetRealVector( vec, 1 );
2753 msg.Printf( wxS(
"%s: %sV\n" ), vec, value );
2759 simulator()->Command( fmt::format(
"setplot noise{}", number - 1 ) );
2764 wxCHECK_RET( plotTab, wxT(
"not a SIM_PLOT_TAB" ) );
2773 std::map<TRACE*, TRACE_INFO> traceMap;
2776 traceMap[ trace ] = { wxEmptyString,
SPT_UNKNOWN,
false };
2781 for(
const wxString& signal :
m_signals )
2786 if(
TRACE* trace = plotTab->
GetTrace( vectorName, traceType ) )
2787 traceMap[ trace ] = { vectorName, traceType,
false };
2795 if( simType ==
ST_AC )
2801 if(
TRACE* trace = plotTab->
GetTrace( vectorName, subType ) )
2802 traceMap[ trace ] = { vectorName, subType, !aFinal };
2805 else if( simType ==
ST_SP )
2811 if(
TRACE* trace = plotTab->
GetTrace( vectorName, subType ) )
2812 traceMap[trace] = { vectorName, subType, !aFinal };
2817 if(
TRACE* trace = plotTab->
GetTrace( vectorName, traceType ) )
2818 traceMap[ trace ] = { vectorName, traceType, !aFinal };
2824 for(
const auto& [ trace, traceInfo ] : traceMap )
2826 if( traceInfo.Vector.IsEmpty() )
2830 for(
const auto& [ trace,
info ] : traceMap )
2832 std::vector<double> data_x;
2834 if( !
info.Vector.IsEmpty() )
2852 else if( simType ==
ST_OP && aFinal )
2854 m_simConsole->AppendText(
_(
"\n\nSimulation results:\n\n" ) );
2857 for(
const std::string& vec :
simulator()->AllVectors() )
2859 std::vector<double> val_list =
simulator()->GetRealVector( vec, 1 );
2861 if( val_list.empty() )
2868 const size_t tab = 25;
2869 size_t padding = ( signal.length() < tab ) ? ( tab - signal.length() ) : 1;
2873 case SPT_VOLTAGE: value.Append( wxS(
"V" ) );
break;
2874 case SPT_CURRENT: value.Append( wxS(
"A" ) );
break;
2875 case SPT_POWER: value.Append( wxS(
"W" ) );
break;
2876 default: value.Append( wxS(
"?" ) );
break;
2879 msg.Printf( wxT(
"%s%s\n" ),
2880 ( signal + wxT(
":" ) ).Pad( padding, wxUniChar(
' ' ) ),
2887 signal = signal.SubString( 2, signal.Length() - 2 );
2890 signal += wxS(
":power" );
2895 else if( simType ==
ST_PZ && aFinal )
2897 m_simConsole->AppendText(
_(
"\n\nSimulation results:\n\n" ) );
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
void showPopupMenu(wxMenu &menu, wxGridEvent &aEvent) override
void doPopupSelection(wxCommandEvent &event) override
SIMULATOR_FRAME_UI * m_parent
CURSORS_GRID_TRICKS(SIMULATOR_FRAME_UI *aParent, WX_GRID *aGrid)
The SIMULATOR_FRAME holds the main user-interface for running simulations.
const wxRealPoint & GetCoords() const
void SetCoordX(double aValue)
bool Find(const wxString &aTerm, int &aMatchersTriggered, int &aPosition)
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
virtual void doPopupSelection(wxCommandEvent &event)
virtual void showPopupMenu(wxMenu &menu, wxGridEvent &aEvent)
WX_GRID * m_grid
I don't own the grid, but he owns me.
A color representation with 4 components: red, green, blue, alpha.
wxString ToCSSString() const
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
Hold a translatable error message and may be used when throwing exceptions containing a translated er...
const wxString What() const
void doPopupSelection(wxCommandEvent &event) override
void showPopupMenu(wxMenu &menu, wxGridEvent &aEvent) override
SIMULATOR_FRAME_UI * m_parent
MEASUREMENTS_GRID_TRICKS(SIMULATOR_FRAME_UI *aParent, WX_GRID *aGrid)
static void ConvertToSpiceMarkup(wxString *aNetName)
Remove formatting wrappers and replace illegal spice net name characters with underscores.
@ OPTION_SAVE_ALL_CURRENTS
@ OPTION_SAVE_ALL_VOLTAGES
@ OPTION_SAVE_ALL_DISSIPATIONS
@ OPTION_ADJUST_INCLUDE_PATHS
@ OPTION_ADJUST_PASSIVE_VALS
const SPICE_ITEM * FindItem(const wxString &aRefName) const
Find and return the item corresponding to aRefName.
A singleton reporter that reports to nowhere.
virtual const wxString GetProjectPath() const
Return the full path of the project.
Holds all the data relating to one schematic.
void SetOperatingPoint(const wxString &aSignal, double aValue)
Set operating points from a .op simulation.
void ClearOperatingPoints()
Clear operating points from a .op simulation.
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
EESCHEMA_SETTINGS * eeconfig() const
Schematic editor (Eeschema) main window.
void RefreshOperatingPointDisplay()
Refresh the display of any operaintg points.
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag and update other data struc...
SCHEMATIC & Schematic() const
void UpdateItem(EDA_ITEM *aItem, bool isAddOrDelete=false, bool aUpdateRtree=false) override
Mark an item for refresh.
Base class for any item which can be embedded within the SCHEMATIC container class,...
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
SCH_ITEM * GetItem(const KIID &aID) const
Fetch a SCH_ITEM by ID.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with SCH_FIELDs.
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
void doPopupSelection(wxCommandEvent &event) override
void showPopupMenu(wxMenu &menu, wxGridEvent &aEvent) override
SIMULATOR_FRAME_UI * m_parent
SIGNALS_GRID_TRICKS(SIMULATOR_FRAME_UI *aParent, WX_GRID *aGrid)
Class SIMULATOR_FRAME_UI_BASE.
wxBoxSizer * m_sizerTuners
WX_GRID * m_measurementsGrid
wxSplitterWindow * m_splitterLeftRight
wxSplitterWindow * m_splitterMeasurements
wxTextCtrl * m_simConsole
wxSplitterWindow * m_splitterCursors
wxSplitterWindow * m_splitterPlotAndConsole
wxSplitterWindow * m_splitterSignals
wxAuiNotebook * m_plotNotebook
The SIMULATOR_FRAME_UI holds the main user-interface for running simulations.
SIM_TAB * NewSimTab(const wxString &aSimCommand)
Create a new simulation tab for a given simulation type.
void SetUserDefinedSignals(const std::map< int, wxString > &aSignals)
void updatePlotCursors()
Update the cursor values (in the grid) and graphics (in the plot window).
void OnSimRefresh(bool aFinal)
void onPlotClose(wxAuiNotebookEvent &event) override
int m_splitterTuneValuesSashPosition
void onPlotChanged(wxAuiNotebookEvent &event) override
void rebuildSignalsGrid(wxString aFilter)
Rebuild the filtered list of signals in the signals grid.
void DoFourier(const wxString &aSignal, const wxString &aFundamental)
void rebuildMeasurementsGrid()
Rebuild the measurements grid for the current plot.
std::list< TUNER_SLIDER * > m_tuners
SPICE expressions need quoted versions of the netnames since KiCad allows '-' and '/' in netnames.
void rebuildSignalsList()
Rebuild the list of signals available from the netlist.
bool loadLegacyWorkbook(const wxString &aPath)
int m_splitterCursorsSashPosition
void UpdateMeasurement(int aRow)
Update a measurement in the measurements grid.
wxString getNoiseSource() const
std::vector< wxString > SimPlotVectors() const
unsigned int m_plotNumber
void SetSubWindowsSashSize()
void applyUserDefinedSignals()
Apply user-defined signals to the SPICE session.
std::map< wxString, wxString > m_quotedNetnames
SIM_PREFERENCES m_preferences
void DeleteMeasurement(int aRow)
Delete a row from the measurements grid.
SCH_EDIT_FRAME * m_schematicFrame
wxString vectorNameFromSignalName(SIM_PLOT_TAB *aPlotTab, const wxString &aSignalName, int *aTraceType)
Get the simulator output vector name for a given signal name and type.
void updateSignalsGrid()
Update the values in the signals grid.
int m_splitterLeftRightSashPosition
void onCursorsGridCellChanged(wxGridEvent &aEvent) override
void onPlotDragged(wxAuiNotebookEvent &event) override
std::vector< wxString > Signals() const
bool SaveWorkbook(const wxString &aPath)
Save plot, signal, cursor, measurement, etc.
std::vector< wxString > m_signals
SIM_TAB * GetCurrentSimTab() const
Return the currently opened plot panel (or NULL if there is none).
void updateMeasurementsFromGrid()
bool LoadWorkbook(const wxString &aPath)
Load plot, signal, cursor, measurement, etc.
SPICE_VALUE_FORMAT GetMeasureFormat(int aRow) const
Get/Set the format of a value in the measurements grid.
std::map< int, wxString > m_userDefinedSignals
void UpdateTunerValue(const SCH_SHEET_PATH &aSheetPath, const KIID &aSymbol, const wxString &aRef, const wxString &aValue)
Safely update a field of the associated symbol without dereferencing the symbol.
void AddTrace(const wxString &aName, SIM_TRACE_TYPE aType)
Add a new trace to the current plot.
void onPlotClosed(wxAuiNotebookEvent &event) override
void RemoveTuner(TUNER_SLIDER *aTuner)
Remove an existing tuner.
void SaveSettings(EESCHEMA_SETTINGS *aCfg)
std::shared_ptr< SPICE_CIRCUIT_MODEL > circuitModel() const
void OnFilterText(wxCommandEvent &aEvent) override
void onMeasurementsGridCellChanged(wxGridEvent &aEvent) override
void applyTuners()
Apply component values specified using tuner sliders to the current netlist.
bool loadJsonWorkbook(const wxString &aPath)
void OnFilterMouseMoved(wxMouseEvent &aEvent) override
void AddMeasurement(const wxString &aCmd)
Add a measurement to the measurements grid.
void onPlotChanging(wxAuiNotebookEvent &event) override
std::shared_ptr< SPICE_SIMULATOR > simulator() const
void onPlotCursorUpdate(wxCommandEvent &aEvent)
void onSignalsGridCellChanged(wxGridEvent &aEvent) override
void SetCursorFormat(int aCursorId, int aValueCol, const SPICE_VALUE_FORMAT &aFormat)
void InitWorkbook()
Load the currently active workbook stored in the project settings.
void ToggleDarkModePlots()
SIM_TRACE_TYPE getXAxisType(SIM_TYPE aType) const
Return X axis for a given simulation type.
void OnPlotSettingsChanged()
void SetMeasureFormat(int aRow, const SPICE_VALUE_FORMAT &aFormat)
int m_splitterSignalsSashPosition
void OnSimReport(const wxString &aMsg)
void ApplyPreferences(const SIM_PREFERENCES &aPrefs)
Called when settings are changed via the common Preferences dialog.
const SPICE_CIRCUIT_MODEL * GetExporter() const
Return the netlist exporter object used for simulations.
int m_splitterPlotAndConsoleSashPosition
SIMULATOR_FRAME * m_simulatorFrame
void ShowChangedLanguage()
void AddTuner(const SCH_SHEET_PATH &aSheetPath, SCH_SYMBOL *aSymbol)
Add a tuner for a symbol.
SPICE_VALUE_FORMAT GetCursorFormat(int aCursorId, int aValueCol) const
Get/Set the number of significant digits and the range for formatting a cursor value.
void OnUpdateUI(wxUpdateUIEvent &event) override
void updateTrace(const wxString &aVectorName, int aTraceType, SIM_PLOT_TAB *aPlotTab, std::vector< double > *aDataX=nullptr, bool aClearData=false)
Update a trace in a particular SIM_PLOT_TAB.
SIMULATOR_FRAME_UI(SIMULATOR_FRAME *aSimulatorFrame, SCH_EDIT_FRAME *aSchematicFrame)
SPICE_VALUE_FORMAT m_cursorFormats[3][2]
void LoadSettings(EESCHEMA_SETTINGS *aCfg)
The SIMULATOR_FRAME holds the main user-interface for running simulations.
bool LoadSimulator(const wxString &aSimCommand, unsigned aSimOptions)
Check and load the current netlist into the simulator.
std::shared_ptr< SPICE_CIRCUIT_MODEL > GetCircuitModel() const
SIM_TYPE GetCurrentSimType() const
void OnModify() override
Must be called after a model change in order to set the "modify" flag and do other frame-specific pro...
int GetCurrentOptions() const
std::shared_ptr< SPICE_SIMULATOR > GetSimulator() const
SIM_MODEL & CreateModel(SIM_MODEL::TYPE aType, const std::vector< SCH_PIN * > &aPins, REPORTER &aReporter)
virtual const PARAM * GetTunerParam() const
const SPICE_GENERATOR & SpiceGenerator() const
void WriteFields(std::vector< SCH_FIELD > &aFields) const
void SetParamValue(int aParamIndex, const std::string &aValue, SIM_VALUE::NOTATION aNotation=SIM_VALUE::NOTATION::SI)
static void FillDefaultColorList(bool aWhiteBg)
Fills m_colorList by a default set of colors.
bool DeleteTrace(const wxString &aVectorName, int aTraceType)
void EnableCursor(const wxString &aVectorName, int aType, int aCursorId, bool aEnable, const wxString &aSignalName)
Reset scale ranges to fit the current traces.
wxString GetLabelY1() const
mpWindow * GetPlotWin() const
void ShowGrid(bool aEnable)
wxString GetUnitsY2() const
void SetY2Scale(bool aLock, double aMin, double aMax)
TRACE * GetTrace(const wxString &aVecName, int aType) const
wxString GetLabelX() const
const std::map< wxString, TRACE * > & GetTraces() const
wxString GetLabelY3() const
void SetY1Scale(bool aLock, double aMin, double aMax)
void SetY3Scale(bool aLock, double aMin, double aMax)
std::vector< std::pair< wxString, wxString > > & Measurements()
void UpdateTraceStyle(TRACE *trace)
Update plot colors.
void SetLegendPosition(const wxPoint &aPosition)
void ResetScales(bool aIncludeX)
Update trace line style.
void ShowLegend(bool aEnable)
wxString GetLabelY2() const
void SetTraceData(TRACE *aTrace, std::vector< double > &aX, std::vector< double > &aY, int aSweepCount, size_t aSweepSize)
wxString GetUnitsX() const
void EnsureThirdYAxisExists()
TRACE * GetOrAddTrace(const wxString &aVectorName, int aType)
void SetDottedSecondary(bool aEnable)
Draw secondary signal traces (current or phase) with dotted lines.
void ApplyPreferences(const SIM_PREFERENCES &aPrefs) override
wxString GetUnitsY1() const
wxString GetUnitsY3() const
int GetSimOptions() const
SIM_TYPE GetSimType() const
const wxString & GetSimCommand() const
static bool IsPlottable(SIM_TYPE aSimType)
void SetSimOptions(int aOptions)
wxString GetLastSchTextSimCommand() const
void SetSpicePlotName(const wxString &aPlotName)
static std::string ToSpice(const std::string &aString)
Special netlist exporter flavor that allows one to override simulation commands.
static SIM_TYPE CommandToSimType(const wxString &aCmd)
Return simulation type basing on a simulation command directive.
virtual std::string TunerCommand(const SPICE_ITEM &aItem, double aValue) const
static wxString TypeToName(SIM_TYPE aType, bool aShortName)
Return a string with simulation name based on enum.
Helper class to recognize Spice formatted values.
wxString ToString() const
Return string value as when converting double to string (e.g.
wxString ToSpiceString() const
Return string value in Spice format (e.g.
~SUPPRESS_GRID_CELL_EVENTS()
SUPPRESS_GRID_CELL_EVENTS(SIMULATOR_FRAME_UI *aFrame)
SIMULATOR_FRAME_UI * m_frame
void SetTraceColour(const wxColour &aColour)
CURSOR * GetCursor(int aCursorId)
Custom widget to handle quick component values modification and simulation on the fly.
void ClearRows()
wxWidgets recently added an ASSERT which fires if the position is greater than or equal to the number...
A wrapper for reporting to a wxString object.
bool HasMessage() const override
Returns true if the reporter client is non-empty.
REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED) override
Report a string with a given severity.
const wxString & GetMessages() const
A KICAD version of wxTextEntryDialog which supports the various improvements/work-arounds from DIALOG...
wxString GetValue() const
const wxString & GetName() const
Get layer name.
const wxPen & GetPen() const
Get pen set for this layer.
Canvas for plotting mpLayer implementations.
int GetMarginLeft() const
void SetMargins(int top, int right, int bottom, int left)
Set window margins, creating a blank area where some kinds of layers cannot draw.
void UpdateAll()
Refresh display.
int GetMarginRight() const
int GetMarginBottom() const
bool AddLayer(mpLayer *layer, bool refreshDisplay=true)
Add a plot layer to the canvas.
void Fit() override
Set view to fit global bounding box of all plot layers and refresh display.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
Abstract pattern-matching tool and implementations.
@ GRIDTRICKS_FIRST_CLIENT_ID
static const std::string WorkbookFileExtension
KICOMMON_API wxFont GetStatusFont(wxWindow *aWindow)
SIM_TYPE
< Possible simulation types
void sortSignals(std::vector< wxString > &signals)
wxString vectorNameFromSignalId(int aUserDefinedSignalId)
MEASUREMENTS_GIRD_COLUMNS
SIM_TRACE_TYPE operator|(SIM_TRACE_TYPE aFirst, SIM_TRACE_TYPE aSecond)
@ MYID_DELETE_MEASUREMENT
std::vector< FAB_LAYER_COLOR > dummy
wxString UnescapeString(const wxString &aSource)
int measurements_panel_height
SIM_PREFERENCES preferences
Contains preferences pertaining to the simulator.
Definition of file extensions used in Kicad.