diff --git a/CMakeLists.txt b/CMakeLists.txt index 67964436db..11b1792ac2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -521,7 +521,7 @@ set( INC_AFTER #if ( KICAD_SPICE ) -# find_package(MathGL2 2.3.4 COMPONENTS wx REQUIRED ) +#find_package(MathGL2 2.1 COMPONENTS wx REQUIRED ) #endif () # Find Python and other scripting resources diff --git a/eeschema/CMakeLists.txt b/eeschema/CMakeLists.txt index 523bea3f00..2405ec36d2 100644 --- a/eeschema/CMakeLists.txt +++ b/eeschema/CMakeLists.txt @@ -249,7 +249,7 @@ set_source_files_properties( ../common/single_top.cpp PROPERTIES ) #if (KICAD_SPICE) - set ( EESCHEMA_LINK_LIBS ${wxWidgets_LIBRARIES} mgl mgl-wx) + set ( EESCHEMA_LINK_LIBS ${wxWidgets_LIBRARIES} mgl-wx mgl mgl-wx) #else() # set ( EESCHEMA_LINK_LIBS ${wxWidgets_LIBRARIES} ) #endif() diff --git a/eeschema/noname.sch b/eeschema/noname.sch index d63205268f..2366ad21a5 100644 --- a/eeschema/noname.sch +++ b/eeschema/noname.sch @@ -126,18 +126,7 @@ F 6 "R" V 5750 4000 60 0001 C CNN "Spice_Primitive" -1 0 0 1 $EndComp Text Notes 4300 4900 0 60 ~ 0 -*.tran 1u 10m\n -$Comp -L SPICE_PROBE U1 -U 1 1 573367CB -P 4400 3700 -F 0 "U1" H 4400 3700 60 0001 C CNN -F 1 "SPICE_PROBE" H 4400 3700 60 0001 C CNN -F 2 "" H 4400 3700 60 0000 C CNN -F 3 "" H 4400 3700 60 0000 C CNN - 1 4400 3700 - 1 0 0 -1 -$EndComp +.tran 1u 10m\n Wire Wire Line 4400 4350 4400 4250 Wire Wire Line @@ -162,36 +151,12 @@ Wire Wire Line 4400 3850 4400 3700 Wire Wire Line 4400 3700 4500 3700 -Connection ~ 5650 3700 -Connection ~ 4400 3700 Text Notes 4300 4800 0 60 ~ 0 .include diodes.lib\n Text Label 4400 3800 0 60 ~ 0 in -$Comp -L SPICE_PROBE U? -U 1 1 5734D78F -P 4900 3700 -F 0 "U?" H 4900 3700 60 0001 C CNN -F 1 "SPICE_PROBE" H 4900 3700 60 0001 C CNN -F 2 "" H 4900 3700 60 0000 C CNN -F 3 "" H 4900 3700 60 0000 C CNN - 1 4900 3700 - 1 0 0 -1 -$EndComp -$Comp -L SPICE_PROBE U? -U 1 1 5734D7B3 -P 5400 3700 -F 0 "U?" H 5400 3700 60 0001 C CNN -F 1 "SPICE_PROBE" H 5400 3700 60 0001 C CNN -F 2 "" H 5400 3700 60 0000 C CNN -F 3 "" H 5400 3700 60 0000 C CNN - 1 5400 3700 - 1 0 0 -1 -$EndComp Text Label 5550 3700 0 60 ~ 0 rect Text Notes 4300 5000 0 60 ~ 0 -.ac dec 10 1 1Meg\n +*.ac dec 10 1 1Meg\n $EndSCHEMATC diff --git a/eeschema/sim/ngspice.cpp b/eeschema/sim/ngspice.cpp index 322d354bb7..c51c557d8c 100644 --- a/eeschema/sim/ngspice.cpp +++ b/eeschema/sim/ngspice.cpp @@ -28,6 +28,8 @@ public: const vector GetPlot( std::string name, int max_len = -1); + void dump(); + private: @@ -155,13 +157,12 @@ bool NGSPICE::LoadNetlist(const string& netlist) bool NGSPICE::Command(const string& cmd ) { m_ngSpice_Command( (char*)(cmd + string("\n")).c_str()); - + dump(); return true; } -#if 0 -bool NGSPICE::Run() +void NGSPICE::dump() { // m_ngSpice_Command("run\n"); char **plots = m_ngSpice_AllPlots(); @@ -189,7 +190,7 @@ bool NGSPICE::Run() } -#endif + NGSPICE::~NGSPICE() { diff --git a/eeschema/sim/sim_plot_frame.cpp b/eeschema/sim/sim_plot_frame.cpp index f04663420c..e56cc4ab08 100644 --- a/eeschema/sim/sim_plot_frame.cpp +++ b/eeschema/sim/sim_plot_frame.cpp @@ -76,6 +76,9 @@ SIM_PLOT_FRAME::SIM_PLOT_FRAME( KIWAY *aKiway, wxWindow* parent ) { m_exporter = NULL; m_simulator = NULL; + m_currentPlot = NULL; + + NewPlot(); } SIM_PLOT_FRAME::~SIM_PLOT_FRAME() @@ -101,7 +104,7 @@ void SIM_PLOT_FRAME::StartSimulation() STRING_FORMATTER formatter; m_exporter->Format( &formatter, GNL_ALL ); - m_plotPanel->DeleteTraces(); + //m_plotPanel->DeleteTraces(); printf("*******************\n%s\n", (const char *)formatter.GetString().c_str()); @@ -109,7 +112,7 @@ void SIM_PLOT_FRAME::StartSimulation() m_simulator->Command("run\n"); auto mapping = m_exporter->GetNetIndexMap(); - auto data_t = m_simulator->GetPlot("time"); +// auto data_t = m_simulator->GetPlot("time"); for(auto name : m_exporter->GetProbeList()) { @@ -117,14 +120,20 @@ void SIM_PLOT_FRAME::StartSimulation() sprintf(spiceName,"V(%d)", mapping[name] ); //printf("probe %s->%s\n", (const char *) name.c_str(), spiceName); - auto data_y = m_simulator->GetPlot(spiceName); + // auto data_y = m_simulator->GetPlot(spiceName); //printf("%d - %d data points\n", data_t.size(), data_y.size() ); - m_plotPanel->AddTrace(wxT("V(") + name + wxT(")"), data_t.size(), data_t.data(), data_y.data(), 0); + // m_plotPanel->AddTrace(wxT("V(") + name + wxT(")"), data_t.size(), data_t.data(), data_y.data(), 0); } delete m_simulator; m_simulator = NULL; //m_simulator->Command("quit\n"); - +} + +void SIM_PLOT_FRAME::NewPlot() +{ + SIM_PLOT_PANEL *plot = new SIM_PLOT_PANEL ( this, wxID_ANY ); + m_plotNotebook->AddPage ( plot, wxT("Plot1"), true ); + m_currentPlot = plot; } diff --git a/eeschema/sim/sim_plot_frame.h b/eeschema/sim/sim_plot_frame.h index 0d4e334c55..98a3c0dc8b 100644 --- a/eeschema/sim/sim_plot_frame.h +++ b/eeschema/sim/sim_plot_frame.h @@ -15,6 +15,7 @@ Subclass of SIM_PLOT_FRAME_BASE, which is generated by wxFormBuilder. class SPICE_SIMULATOR; class NETLIST_EXPORTER_PSPICE; +class SIM_PLOT_PANEL; /** Implementing SIM_PLOT_FRAME_BASE */ class SIM_PLOT_FRAME : public SIM_PLOT_FRAME_BASE @@ -24,6 +25,8 @@ class SIM_PLOT_FRAME : public SIM_PLOT_FRAME_BASE SIM_PLOT_FRAME(KIWAY *aKiway, wxWindow* parent ); ~SIM_PLOT_FRAME(); + + void SetSchFrame( SCH_EDIT_FRAME* schFrame ) { m_schematicFrame = schFrame; @@ -31,8 +34,15 @@ class SIM_PLOT_FRAME : public SIM_PLOT_FRAME_BASE void StartSimulation(); + void NewPlot(); + + + private: + virtual void onNewPlot( wxCommandEvent& event ) { NewPlot(); } + + SIM_PLOT_PANEL *m_currentPlot; SCH_EDIT_FRAME *m_schematicFrame; NETLIST_EXPORTER_PSPICE *m_exporter; SPICE_SIMULATOR *m_simulator; diff --git a/eeschema/sim/sim_plot_frame_base.cpp b/eeschema/sim/sim_plot_frame_base.cpp index fba4149597..5abf5aa814 100644 --- a/eeschema/sim/sim_plot_frame_base.cpp +++ b/eeschema/sim/sim_plot_frame_base.cpp @@ -5,8 +5,6 @@ // PLEASE DO "NOT" EDIT THIS FILE! /////////////////////////////////////////////////////////////////////////// -#include "sim_plot_panel.h" - #include "sim_plot_frame_base.h" /////////////////////////////////////////////////////////////////////////// @@ -16,61 +14,156 @@ SIM_PLOT_FRAME_BASE::SIM_PLOT_FRAME_BASE( KIWAY* aKiway, wxWindow* aParent ) : wxDefaultPosition, wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE, wxT("Spice Simulation" ) ) { - this->SetSizeHints( wxSize( 1920,1000 ), wxSize( 1920,1000 ) ); - + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + m_menubar1 = new wxMenuBar( 0 ); m_menu1 = new wxMenu(); - wxMenuItem* m_menuItem2; - m_menuItem2 = new wxMenuItem( m_menu1, wxID_ANY, wxString( wxT("Save Plot") ) , wxEmptyString, wxITEM_NORMAL ); - m_menu1->Append( m_menuItem2 ); - + wxMenuItem* m_menuItem7; + m_menuItem7 = new wxMenuItem( m_menu1, wxID_ANY, wxString( wxT("New Plot") ) , wxEmptyString, wxITEM_NORMAL ); + m_menu1->Append( m_menuItem7 ); + m_menu1->AppendSeparator(); - + + wxMenuItem* m_menuItem8; + m_menuItem8 = new wxMenuItem( m_menu1, wxID_ANY, wxString( wxT("Open Workbook") ) , wxEmptyString, wxITEM_NORMAL ); + m_menu1->Append( m_menuItem8 ); + + wxMenuItem* m_menuItem2; + m_menuItem2 = new wxMenuItem( m_menu1, wxID_ANY, wxString( wxT("Save Workbook") ) , wxEmptyString, wxITEM_NORMAL ); + m_menu1->Append( m_menuItem2 ); + + m_menu1->AppendSeparator(); + wxMenuItem* m_menuItem1; m_menuItem1 = new wxMenuItem( m_menu1, wxID_ANY, wxString( wxT("Exit Simulation") ) , wxEmptyString, wxITEM_NORMAL ); m_menu1->Append( m_menuItem1 ); - - m_menubar1->Append( m_menu1, wxT("File") ); - + + m_menubar1->Append( m_menu1, wxT("File") ); + + m_menu2 = new wxMenu(); + wxMenuItem* m_menuItem3; + m_menuItem3 = new wxMenuItem( m_menu2, wxID_ANY, wxString( wxT("Zoom In") ) , wxEmptyString, wxITEM_NORMAL ); + m_menu2->Append( m_menuItem3 ); + + wxMenuItem* m_menuItem4; + m_menuItem4 = new wxMenuItem( m_menu2, wxID_ANY, wxString( wxT("Zoom Out") ) , wxEmptyString, wxITEM_NORMAL ); + m_menu2->Append( m_menuItem4 ); + + wxMenuItem* m_menuItem5; + m_menuItem5 = new wxMenuItem( m_menu2, wxID_ANY, wxString( wxT("Fit on Screen") ) , wxEmptyString, wxITEM_NORMAL ); + m_menu2->Append( m_menuItem5 ); + + m_menu2->AppendSeparator(); + + wxMenuItem* m_menuItem6; + m_menuItem6 = new wxMenuItem( m_menu2, wxID_ANY, wxString( wxT("Show grid") ) , wxEmptyString, wxITEM_CHECK ); + m_menu2->Append( m_menuItem6 ); + + m_menubar1->Append( m_menu2, wxT("View") ); + this->SetMenuBar( m_menubar1 ); - + wxBoxSizer* bSizer1; bSizer1 = new wxBoxSizer( wxVERTICAL ); - - m_auiToolBar1 = new wxAuiToolBar( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxAUI_TB_HORZ_LAYOUT ); - m_toolZoomIn = m_auiToolBar1->AddTool( wxID_ANY, wxT("Zoom In"), wxNullBitmap /*wxBitmap( wxT("zoom.png"), wxBITMAP_TYPE_ANY )*/, wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString, NULL ); - - m_auiToolBar1->Realize(); - - bSizer1->Add( m_auiToolBar1, 0, wxALL, 5 ); - - m_splitter1 = new wxSplitterWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_3D ); + + m_splitter1 = new wxSplitterWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_BORDER ); m_splitter1->SetSashGravity( 0.2 ); m_splitter1->SetSashSize( 0 ); m_splitter1->Connect( wxEVT_IDLE, wxIdleEventHandler( SIM_PLOT_FRAME_BASE::m_splitter1OnIdle ), NULL, this ); - - m_plotPanel = new SIM_PLOT_PANEL( m_splitter1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + + m_panel31 = new wxPanel( m_splitter1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer5; + bSizer5 = new wxBoxSizer( wxVERTICAL ); + + m_splitter2 = new wxSplitterWindow( m_panel31, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_3DBORDER ); + m_splitter2->Connect( wxEVT_IDLE, wxIdleEventHandler( SIM_PLOT_FRAME_BASE::m_splitter2OnIdle ), NULL, this ); + + m_panel61 = new wxPanel( m_splitter2, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel61->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + wxBoxSizer* bSizer6; + bSizer6 = new wxBoxSizer( wxVERTICAL ); + + m_plotNotebook = new wxAuiNotebook( m_panel61, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxAUI_NB_DEFAULT_STYLE ); + m_plotNotebook->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + + bSizer6->Add( m_plotNotebook, 1, wxEXPAND, 5 ); + + + m_panel61->SetSizer( bSizer6 ); + m_panel61->Layout(); + bSizer6->Fit( m_panel61 ); + m_panel7 = new wxPanel( m_splitter2, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer7; + bSizer7 = new wxBoxSizer( wxVERTICAL ); + + m_staticText2 = new wxStaticText( m_panel7, wxID_ANY, wxT("Signals"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE ); + m_staticText2->Wrap( -1 ); + bSizer7->Add( m_staticText2, 0, wxALL|wxEXPAND, 5 ); + + m_signals = new wxListBox( m_panel7, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_MULTIPLE|wxLB_SORT ); + bSizer7->Add( m_signals, 0, wxALL|wxEXPAND, 5 ); + + m_staticText21 = new wxStaticText( m_panel7, wxID_ANY, wxT("Parameters"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE ); + m_staticText21->Wrap( -1 ); + bSizer7->Add( m_staticText21, 0, wxALL|wxEXPAND, 5 ); + + m_signals1 = new wxListBox( m_panel7, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_MULTIPLE|wxLB_SORT ); + bSizer7->Add( m_signals1, 0, wxALL|wxEXPAND, 5 ); + + wxFlexGridSizer* fgSizer1; + fgSizer1 = new wxFlexGridSizer( 1, 3, 0, 0 ); + fgSizer1->SetFlexibleDirection( wxBOTH ); + fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_button1 = new wxButton( m_panel7, wxID_ANY, wxT("Probe"), wxDefaultPosition, wxDefaultSize, 0 ); + fgSizer1->Add( m_button1, 0, wxALL, 5 ); + + m_button2 = new wxButton( m_panel7, wxID_ANY, wxT("Tune"), wxDefaultPosition, wxDefaultSize, 0 ); + fgSizer1->Add( m_button2, 0, wxALL, 5 ); + + + bSizer7->Add( fgSizer1, 0, wxEXPAND, 5 ); + + + m_panel7->SetSizer( bSizer7 ); + m_panel7->Layout(); + bSizer7->Fit( m_panel7 ); + m_splitter2->SplitVertically( m_panel61, m_panel7, 0 ); + bSizer5->Add( m_splitter2, 1, wxEXPAND, 5 ); + + + m_panel31->SetSizer( bSizer5 ); + m_panel31->Layout(); + bSizer5->Fit( m_panel31 ); m_panel3 = new wxPanel( m_splitter1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer* bSizer3; bSizer3 = new wxBoxSizer( wxVERTICAL ); - + m_simConsole = new wxRichTextCtrl( m_panel3, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxVSCROLL|wxHSCROLL|wxNO_BORDER|wxWANTS_CHARS ); bSizer3->Add( m_simConsole, 1, wxEXPAND | wxALL, 5 ); - - + + m_panel3->SetSizer( bSizer3 ); m_panel3->Layout(); bSizer3->Fit( m_panel3 ); - m_splitter1->SplitHorizontally( m_plotPanel, m_panel3, 700 ); + m_splitter1->SplitHorizontally( m_panel31, m_panel3, 700 ); bSizer1->Add( m_splitter1, 1, wxEXPAND, 5 ); - - + + this->SetSizer( bSizer1 ); this->Layout(); - + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( m_menuItem7->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::onNewPlot ) ); } SIM_PLOT_FRAME_BASE::~SIM_PLOT_FRAME_BASE() { + // Disconnect Events + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIM_PLOT_FRAME_BASE::onNewPlot ) ); + } diff --git a/eeschema/sim/sim_plot_frame_base.h b/eeschema/sim/sim_plot_frame_base.h index 3889326dad..d7056336a7 100644 --- a/eeschema/sim/sim_plot_frame_base.h +++ b/eeschema/sim/sim_plot_frame_base.h @@ -11,7 +11,6 @@ #include #include class KIWAY_PLAYER; -class SIM_PLOT_PANEL; #include "kiway_player.h" #include @@ -23,12 +22,14 @@ class SIM_PLOT_PANEL; #include #include #include -#include -#include -#include -#include +#include #include +#include +#include +#include +#include #include +#include #include /////////////////////////////////////////////////////////////////////////// @@ -44,12 +45,25 @@ class SIM_PLOT_FRAME_BASE : public KIWAY_PLAYER protected: wxMenuBar* m_menubar1; wxMenu* m_menu1; - wxAuiToolBar* m_auiToolBar1; - wxAuiToolBarItem* m_toolZoomIn; + wxMenu* m_menu2; wxSplitterWindow* m_splitter1; - SIM_PLOT_PANEL* m_plotPanel; + wxPanel* m_panel31; + wxSplitterWindow* m_splitter2; + wxPanel* m_panel61; + wxAuiNotebook* m_plotNotebook; + wxPanel* m_panel7; + wxStaticText* m_staticText2; + wxListBox* m_signals; + wxStaticText* m_staticText21; + wxListBox* m_signals1; + wxButton* m_button1; + wxButton* m_button2; wxPanel* m_panel3; wxRichTextCtrl* m_simConsole; + + // Virtual event handlers, overide them in your derived class + virtual void onNewPlot( wxCommandEvent& event ) { event.Skip(); } + public: SIM_PLOT_FRAME_BASE( KIWAY* aKiway, wxWindow* aParent ); @@ -60,8 +74,13 @@ class SIM_PLOT_FRAME_BASE : public KIWAY_PLAYER m_splitter1->SetSashPosition( 700 ); m_splitter1->Disconnect( wxEVT_IDLE, wxIdleEventHandler( SIM_PLOT_FRAME_BASE::m_splitter1OnIdle ), NULL, this ); } + + void m_splitter2OnIdle( wxIdleEvent& ) + { + m_splitter2->SetSashPosition( 0 ); + m_splitter2->Disconnect( wxEVT_IDLE, wxIdleEventHandler( SIM_PLOT_FRAME_BASE::m_splitter2OnIdle ), NULL, this ); + } }; - #endif //__SIM_PLOT_FRAME_BASE_H__ diff --git a/eeschema/sim/sim_plot_panel.cpp b/eeschema/sim/sim_plot_panel.cpp index 22b9598347..9e74dd34b0 100644 --- a/eeschema/sim/sim_plot_panel.cpp +++ b/eeschema/sim/sim_plot_panel.cpp @@ -12,7 +12,7 @@ static int drawPlotFunc( mglGraph *graph ) //graph->SetRanges(-10e-3,10e-3,-2,2); graph->Axis("x"); graph->Label('x',"Time",0); - graph->AddRange('x', 0, 10e-3); + graph->SetRange('x', 0, 10e-3); graph->Axis("y"); graph->Label('y',"Voltage",0); @@ -47,7 +47,7 @@ SIM_PLOT_PANEL::SIM_PLOT_PANEL( wxWindow * parent, AutoResize = true; SetDraw( drawPlotFunc ); - Update(); +// Update(); }