-
1common/bitmap_info.cpp
-
2eeschema/CMakeLists.txt
-
2eeschema/menubar.cpp
-
4eeschema/sch_edit_frame.cpp
-
19eeschema/sim/sim_plot_colors.cpp
-
681eeschema/sim/sim_plot_frame.cpp
-
199eeschema/sim/sim_plot_frame.h
-
140eeschema/sim/sim_plot_frame_base.cpp
-
362eeschema/sim/sim_plot_frame_base.fbp
-
56eeschema/sim/sim_plot_frame_base.h
-
11eeschema/sim/sim_plot_panel.cpp
-
49eeschema/sim/sim_plot_panel.h
-
138eeschema/sim/toolbars_sim_plot_frame.cpp
-
2eeschema/toolbars_sch_editor.cpp
-
105eeschema/tools/ee_actions.cpp
-
20eeschema/tools/ee_actions.h
-
6eeschema/tools/ee_inspection_tool.cpp
-
443eeschema/tools/simulator_control.cpp
-
98eeschema/tools/simulator_control.h
-
1include/bitmaps/bitmaps_list.h
-
2include/tool/action_toolbar.h
-
1resources/bitmaps_png/CMakeLists.txt
-
BINresources/bitmaps_png/png/sim_command_24.png
-
BINresources/bitmaps_png/png/sim_run_24.png
-
BINresources/bitmaps_png/png/sim_stop_24.png
-
120resources/bitmaps_png/sources/light/sim_command.svg
-
31resources/bitmaps_png/sources/light/sim_run.svg
-
121resources/bitmaps_png/sources/light/sim_stop.svg
@ -0,0 +1,138 @@ |
|||
/*
|
|||
* This program source code file is part of KiCad, a free EDA CAD application. |
|||
* |
|||
* Copyright (C) 2023 CERN |
|||
* Copyright (C) 2023 KiCad Developers, see AUTHORS.txt for contributors. |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify it |
|||
* under the terms of the GNU General Public License as published by the |
|||
* Free Software Foundation, either version 3 of the License, or (at your |
|||
* option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, but |
|||
* WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License along |
|||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
|
|||
#include <sim/sim_plot_frame.h>
|
|||
#include <tool/action_menu.h>
|
|||
#include <tool/action_toolbar.h>
|
|||
#include <tool/common_control.h>
|
|||
#include <tool/tool_manager.h>
|
|||
#include <tools/ee_actions.h>
|
|||
#include <widgets/wx_menubar.h>
|
|||
|
|||
|
|||
void SIM_PLOT_FRAME::ReCreateHToolbar() |
|||
{ |
|||
if( m_toolBar ) |
|||
{ |
|||
m_toolBar->ClearToolbar(); |
|||
m_toolBar->SetToolManager( GetToolManager() ); |
|||
} |
|||
else |
|||
{ |
|||
m_toolBar = new ACTION_TOOLBAR( dynamic_cast<EDA_BASE_FRAME*>( this ), wxID_ANY, |
|||
wxDefaultPosition, wxDefaultSize, |
|||
KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT ); |
|||
} |
|||
|
|||
m_toolBar->Add( EE_ACTIONS::openWorkbook ); |
|||
m_toolBar->Add( EE_ACTIONS::saveWorkbook ); |
|||
|
|||
m_toolBar->AddScaledSeparator( this ); |
|||
m_toolBar->Add( EE_ACTIONS::simCommand ); |
|||
|
|||
m_toolBar->AddScaledSeparator( this ); |
|||
m_toolBar->Add( EE_ACTIONS::runSimulation ); |
|||
m_toolBar->Add( EE_ACTIONS::stopSimulation ); |
|||
|
|||
m_toolBar->AddScaledSeparator( this ); |
|||
m_toolBar->Add( ACTIONS::zoomInCenter ); |
|||
m_toolBar->Add( ACTIONS::zoomOutCenter ); |
|||
m_toolBar->Add( ACTIONS::zoomFitScreen ); |
|||
|
|||
m_toolBar->AddScaledSeparator( this ); |
|||
m_toolBar->Add( EE_ACTIONS::addSignals ); |
|||
m_toolBar->Add( EE_ACTIONS::simProbe ); |
|||
m_toolBar->Add( EE_ACTIONS::simTune ); |
|||
|
|||
m_toolBar->AddScaledSeparator( this ); |
|||
m_toolBar->Add( EE_ACTIONS::showNetlist ); |
|||
|
|||
// after adding the buttons to the toolbar, must call Realize() to reflect the changes
|
|||
m_toolBar->KiRealize(); |
|||
|
|||
m_toolBar->Refresh(); |
|||
} |
|||
|
|||
|
|||
void SIM_PLOT_FRAME::doReCreateMenuBar() |
|||
{ |
|||
COMMON_CONTROL* tool = m_toolManager->GetTool<COMMON_CONTROL>(); |
|||
// wxWidgets handles the OSX Application menu behind the scenes, but that means
|
|||
// we always have to start from scratch with a new wxMenuBar.
|
|||
wxMenuBar* oldMenuBar = dynamic_cast<EDA_BASE_FRAME*>( this )->GetMenuBar(); |
|||
WX_MENUBAR* menuBar = new WX_MENUBAR(); |
|||
|
|||
//-- File menu -----------------------------------------------------------
|
|||
//
|
|||
ACTION_MENU* fileMenu = new ACTION_MENU( false, tool ); |
|||
|
|||
fileMenu->Add( EE_ACTIONS::newPlot ); |
|||
|
|||
fileMenu->AppendSeparator(); |
|||
fileMenu->Add( EE_ACTIONS::openWorkbook ); |
|||
fileMenu->Add( EE_ACTIONS::saveWorkbook ); |
|||
fileMenu->Add( EE_ACTIONS::saveWorkbookAs ); |
|||
|
|||
fileMenu->AppendSeparator(); |
|||
fileMenu->Add( EE_ACTIONS::exportPlotAsPNG ); |
|||
fileMenu->Add( EE_ACTIONS::exportPlotAsCSV ); |
|||
|
|||
fileMenu->AppendSeparator(); |
|||
fileMenu->AddClose( _( "Simulator" ) ); |
|||
|
|||
//-- View menu -----------------------------------------------------------
|
|||
//
|
|||
ACTION_MENU* viewMenu = new ACTION_MENU( false, tool ); |
|||
|
|||
viewMenu->Add( ACTIONS::zoomInCenter ); |
|||
viewMenu->Add( ACTIONS::zoomOutCenter ); |
|||
viewMenu->Add( ACTIONS::zoomFitScreen ); |
|||
|
|||
viewMenu->AppendSeparator(); |
|||
viewMenu->Add( ACTIONS::toggleGrid, ACTION_MENU::CHECK ); |
|||
viewMenu->Add( EE_ACTIONS::toggleLegend, ACTION_MENU::CHECK ); |
|||
viewMenu->Add( EE_ACTIONS::toggleDottedSecondary, ACTION_MENU::CHECK ); |
|||
viewMenu->Add( EE_ACTIONS::toggleDarkModePlots, ACTION_MENU::CHECK ); |
|||
|
|||
//-- Simulation menu -----------------------------------------------------------
|
|||
//
|
|||
ACTION_MENU* simulationMenu = new ACTION_MENU( false, tool ); |
|||
|
|||
simulationMenu->Add( EE_ACTIONS::simCommand ); |
|||
simulationMenu->Add( EE_ACTIONS::runSimulation ); |
|||
|
|||
simulationMenu->AppendSeparator(); |
|||
simulationMenu->Add( EE_ACTIONS::addSignals ); |
|||
simulationMenu->Add( EE_ACTIONS::simProbe ); |
|||
simulationMenu->Add( EE_ACTIONS::simTune ); |
|||
|
|||
simulationMenu->AppendSeparator(); |
|||
simulationMenu->Add( EE_ACTIONS::showNetlist ); |
|||
|
|||
//-- Menubar -------------------------------------------------------------
|
|||
//
|
|||
menuBar->Append( fileMenu, _( "&File" ) ); |
|||
menuBar->Append( viewMenu, _( "&View" ) ); |
|||
menuBar->Append( simulationMenu, _( "&Simulation" ) ); |
|||
dynamic_cast<EDA_BASE_FRAME*>( this )->AddStandardHelpMenu( menuBar ); |
|||
|
|||
dynamic_cast<EDA_BASE_FRAME*>( this )->SetMenuBar( menuBar ); |
|||
delete oldMenuBar; |
|||
} |
|||
@ -0,0 +1,443 @@ |
|||
/*
|
|||
* This program source code file is part of KiCad, a free EDA CAD application. |
|||
* |
|||
* Copyright (C) 2023 KiCad Developers, see AUTHORS.txt for contributors. |
|||
* |
|||
* This program is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU General Public License |
|||
* as published by the Free Software Foundation; either version 2 |
|||
* of the License, or (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program; if not, you may find one here: |
|||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|||
* or you may search the http://www.gnu.org website for the version 2 license,
|
|||
* or you may write to the Free Software Foundation, Inc., |
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
|||
*/ |
|||
|
|||
#include <wx/ffile.h>
|
|||
#include <wx/filedlg.h>
|
|||
#include <wx_filename.h>
|
|||
#include <wx/stc/stc.h>
|
|||
|
|||
#include <kiway.h>
|
|||
#include <confirm.h>
|
|||
#include <wildcards_and_files_ext.h>
|
|||
#include <project/project_file.h>
|
|||
#include <sch_edit_frame.h>
|
|||
#include <sim/sim_plot_frame.h>
|
|||
#include <tool/tool_manager.h>
|
|||
#include <tools/ee_actions.h>
|
|||
#include <tools/simulator_control.h>
|
|||
#include <dialogs/dialog_signal_list.h>
|
|||
#include <scintilla_tricks.h>
|
|||
|
|||
|
|||
bool SIMULATOR_CONTROL::Init() |
|||
{ |
|||
Reset( MODEL_RELOAD ); |
|||
return true; |
|||
} |
|||
|
|||
|
|||
void SIMULATOR_CONTROL::Reset( RESET_REASON aReason ) |
|||
{ |
|||
m_plotFrame = getEditFrame<SIM_PLOT_FRAME>(); |
|||
|
|||
if( m_plotFrame ) |
|||
{ |
|||
m_schematicFrame = m_plotFrame->GetSchematicFrame(); |
|||
m_circuitModel = m_plotFrame->GetCircuitModel(); |
|||
m_simulator = m_plotFrame->GetSimulator(); |
|||
} |
|||
} |
|||
|
|||
|
|||
int SIMULATOR_CONTROL::NewPlot( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
SIM_TYPE type = m_circuitModel->GetSimType(); |
|||
|
|||
if( SIM_PANEL_BASE::IsPlottable( type ) ) |
|||
m_plotFrame->NewPlotPanel( m_circuitModel->GetSimCommand(), m_circuitModel->GetSimOptions() ); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int SIMULATOR_CONTROL::OpenWorkbook( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
wxFileDialog openDlg( m_plotFrame, _( "Open simulation workbook" ), getDefaultPath(), "", |
|||
WorkbookFileWildcard(), wxFD_OPEN | wxFD_FILE_MUST_EXIST ); |
|||
|
|||
if( openDlg.ShowModal() == wxID_CANCEL ) |
|||
return -1; |
|||
|
|||
m_plotFrame->LoadWorkbook( openDlg.GetPath() ); |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
wxString SIMULATOR_CONTROL::getDefaultFilename() |
|||
{ |
|||
wxFileName filename = m_simulator->Settings()->GetWorkbookFilename(); |
|||
|
|||
if( filename.GetName().IsEmpty() ) |
|||
{ |
|||
if( m_plotFrame->Prj().GetProjectName().IsEmpty() ) |
|||
{ |
|||
filename.SetName( _( "noname" ) ); |
|||
filename.SetExt( WorkbookFileExtension ); |
|||
} |
|||
else |
|||
{ |
|||
filename.SetName( m_plotFrame->Prj().GetProjectName() ); |
|||
filename.SetExt( WorkbookFileExtension ); |
|||
} |
|||
} |
|||
|
|||
return filename.GetFullName(); |
|||
} |
|||
|
|||
|
|||
wxString SIMULATOR_CONTROL::getDefaultPath() |
|||
{ |
|||
wxFileName path = m_simulator->Settings()->GetWorkbookFilename(); |
|||
|
|||
path.Normalize( FN_NORMALIZE_FLAGS|wxPATH_NORM_ENV_VARS, m_plotFrame->Prj().GetProjectPath() ); |
|||
return path.GetPath(); |
|||
} |
|||
|
|||
|
|||
int SIMULATOR_CONTROL::SaveWorkbook( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
wxString filename; |
|||
|
|||
if( aEvent.IsAction( &EE_ACTIONS::saveWorkbook ) ) |
|||
filename = m_simulator->Settings()->GetWorkbookFilename(); |
|||
|
|||
if( filename.IsEmpty() ) |
|||
{ |
|||
wxFileDialog saveAsDlg( m_plotFrame, _( "Save Simulation Workbook As" ), getDefaultPath(), |
|||
getDefaultFilename(), WorkbookFileWildcard(), |
|||
wxFD_SAVE | wxFD_OVERWRITE_PROMPT ); |
|||
|
|||
if( saveAsDlg.ShowModal() == wxID_CANCEL ) |
|||
return -1; |
|||
|
|||
filename = saveAsDlg.GetPath(); |
|||
} |
|||
|
|||
m_plotFrame->SaveWorkbook( m_plotFrame->Prj().AbsolutePath( filename ) ); |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int SIMULATOR_CONTROL::ExportPlotAsPNG( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
if( !m_plotFrame->GetCurrentPlot() ) |
|||
return -1; |
|||
|
|||
wxFileDialog saveDlg( m_plotFrame, _( "Save Plot as Image" ), "", "", PngFileWildcard(), |
|||
wxFD_SAVE | wxFD_OVERWRITE_PROMPT ); |
|||
|
|||
if( saveDlg.ShowModal() == wxID_CANCEL ) |
|||
return -1; |
|||
|
|||
m_plotFrame->GetCurrentPlot()->GetPlotWin()->SaveScreenshot( saveDlg.GetPath(), |
|||
wxBITMAP_TYPE_PNG ); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int SIMULATOR_CONTROL::ExportPlotAsCSV( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
if( !m_plotFrame->GetCurrentPlot() ) |
|||
return -1; |
|||
|
|||
const wxChar SEPARATOR = ';'; |
|||
|
|||
wxFileDialog saveDlg( m_plotFrame, _( "Save Plot Data" ), "", "", CsvFileWildcard(), |
|||
wxFD_SAVE | wxFD_OVERWRITE_PROMPT ); |
|||
|
|||
if( saveDlg.ShowModal() == wxID_CANCEL ) |
|||
return -1; |
|||
|
|||
wxFFile out( saveDlg.GetPath(), "wb" ); |
|||
|
|||
std::map<wxString, TRACE*> traces = m_plotFrame->GetCurrentPlot()->GetTraces(); |
|||
|
|||
if( traces.size() == 0 ) |
|||
return -1; |
|||
|
|||
SIM_TYPE simType = m_circuitModel->GetSimType(); |
|||
|
|||
std::size_t rowCount = traces.begin()->second->GetDataX().size(); |
|||
|
|||
// write column header names on the first row
|
|||
wxString xAxisName( m_simulator->GetXAxis( simType ) ); |
|||
out.Write( wxString::Format( wxT( "%s%c" ), xAxisName, SEPARATOR ) ); |
|||
|
|||
for( const auto& [name, trace] : traces ) |
|||
out.Write( wxString::Format( wxT( "%s%c" ), name, SEPARATOR ) ); |
|||
|
|||
out.Write( wxS( "\r\n" ) ); |
|||
|
|||
// write each row's numerical value
|
|||
for ( std::size_t curRow=0; curRow < rowCount; curRow++ ) |
|||
{ |
|||
double xAxisValue = traces.begin()->second->GetDataX().at( curRow ); |
|||
out.Write( wxString::Format( wxT( "%g%c" ), xAxisValue, SEPARATOR ) ); |
|||
|
|||
for( const auto& [name, trace] : traces ) |
|||
{ |
|||
double yAxisValue = trace->GetDataY().at( curRow ); |
|||
out.Write( wxString::Format( wxT( "%g%c" ), yAxisValue, SEPARATOR ) ); |
|||
} |
|||
|
|||
out.Write( wxS( "\r\n" ) ); |
|||
} |
|||
|
|||
out.Close(); |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int SIMULATOR_CONTROL::Close( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
m_plotFrame->Close(); |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int SIMULATOR_CONTROL::Zoom( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
if( m_plotFrame->GetCurrentPlot() ) |
|||
{ |
|||
if( aEvent.IsAction( &ACTIONS::zoomInCenter ) ) |
|||
m_plotFrame->GetCurrentPlot()->GetPlotWin()->ZoomIn(); |
|||
else if( aEvent.IsAction( &ACTIONS::zoomOutCenter ) ) |
|||
m_plotFrame->GetCurrentPlot()->GetPlotWin()->ZoomOut(); |
|||
else if( aEvent.IsAction( &ACTIONS::zoomFitScreen ) ) |
|||
m_plotFrame->GetCurrentPlot()->GetPlotWin()->Fit(); |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int SIMULATOR_CONTROL::ToggleGrid( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
SIM_PLOT_PANEL* plot = m_plotFrame->GetCurrentPlot(); |
|||
|
|||
if( plot ) |
|||
plot->ShowGrid( !plot->IsGridShown() ); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int SIMULATOR_CONTROL::ToggleLegend( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
SIM_PLOT_PANEL* plot = m_plotFrame->GetCurrentPlot(); |
|||
|
|||
if( plot ) |
|||
plot->ShowLegend( !plot->IsLegendShown() ); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int SIMULATOR_CONTROL::ToggleDottedSecondary( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
SIM_PLOT_PANEL* plot = m_plotFrame->GetCurrentPlot(); |
|||
|
|||
if( plot ) |
|||
plot->SetDottedSecondary( !plot->GetDottedSecondary() ); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int SIMULATOR_CONTROL::ToggleDarkModePlots( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
m_plotFrame->ToggleDarkModePlots(); |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int SIMULATOR_CONTROL::EditSimCommand( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
m_plotFrame->EditSimCommand(); |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int SIMULATOR_CONTROL::RunSimulation( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
if( m_simulator->IsRunning() ) |
|||
m_simulator->Stop(); |
|||
else |
|||
m_plotFrame->StartSimulation(); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int SIMULATOR_CONTROL::AddSignals( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
SIM_PLOT_PANEL* plotPanel = m_plotFrame->GetCurrentPlot(); |
|||
|
|||
if( !plotPanel || !m_circuitModel || plotPanel->GetType() != m_circuitModel->GetSimType() ) |
|||
{ |
|||
DisplayInfoMessage( m_plotFrame, _( "You need to run plot-providing simulation first." ) ); |
|||
return -1; |
|||
} |
|||
|
|||
DIALOG_SIGNAL_LIST dialog( m_plotFrame, m_circuitModel.get() ); |
|||
dialog.ShowModal(); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int SIMULATOR_CONTROL::Probe( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
if( m_schematicFrame == nullptr ) |
|||
return -1; |
|||
|
|||
wxWindow* blocking_dialog = m_schematicFrame->Kiway().GetBlockingDialog(); |
|||
|
|||
if( blocking_dialog ) |
|||
blocking_dialog->Close( true ); |
|||
|
|||
m_schematicFrame->GetToolManager()->RunAction( EE_ACTIONS::simProbe ); |
|||
m_schematicFrame->Raise(); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int SIMULATOR_CONTROL::Tune( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
if( m_schematicFrame == nullptr ) |
|||
return -1; |
|||
|
|||
wxWindow* blocking_dialog = m_schematicFrame->Kiway().GetBlockingDialog(); |
|||
|
|||
if( blocking_dialog ) |
|||
blocking_dialog->Close( true ); |
|||
|
|||
m_schematicFrame->GetToolManager()->RunAction( EE_ACTIONS::simTune ); |
|||
m_schematicFrame->Raise(); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
class NETLIST_VIEW_DIALOG : public DIALOG_SHIM |
|||
{ |
|||
public: |
|||
enum |
|||
{ |
|||
MARGIN_LINE_NUMBERS |
|||
}; |
|||
|
|||
void onClose( wxCloseEvent& evt ) |
|||
{ |
|||
wxPostEvent( this, wxCommandEvent( wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL ) ); |
|||
} |
|||
|
|||
NETLIST_VIEW_DIALOG( wxWindow* parent, const wxString& source) : |
|||
DIALOG_SHIM( parent, wxID_ANY, _( "SPICE Netlist" ), wxDefaultPosition, |
|||
wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ) |
|||
{ |
|||
wxStyledTextCtrl* textCtrl = new wxStyledTextCtrl( this, wxID_ANY ); |
|||
textCtrl->SetMinSize( wxSize( 600, 400 ) ); |
|||
|
|||
textCtrl->SetMarginWidth( MARGIN_LINE_NUMBERS, 50 ); |
|||
textCtrl->StyleSetForeground( wxSTC_STYLE_LINENUMBER, wxColour( 75, 75, 75 ) ); |
|||
textCtrl->StyleSetBackground( wxSTC_STYLE_LINENUMBER, wxColour( 220, 220, 220 ) ); |
|||
textCtrl->SetMarginType( MARGIN_LINE_NUMBERS, wxSTC_MARGIN_NUMBER ); |
|||
|
|||
wxFont fixedFont = KIUI::GetMonospacedUIFont(); |
|||
|
|||
for( int i = 0; i < wxSTC_STYLE_MAX; ++i ) |
|||
textCtrl->StyleSetFont( i, fixedFont ); |
|||
|
|||
textCtrl->StyleClearAll(); // Addresses a bug in wx3.0 where styles are not correctly set
|
|||
|
|||
textCtrl->SetWrapMode( wxSTC_WRAP_WORD ); |
|||
|
|||
textCtrl->SetText( source ); |
|||
|
|||
textCtrl->SetLexer( wxSTC_LEX_SPICE ); |
|||
|
|||
wxBoxSizer* sizer = new wxBoxSizer( wxVERTICAL ); |
|||
sizer->Add( textCtrl, 1, wxEXPAND | wxALL, 5 ); |
|||
SetSizer( sizer ); |
|||
|
|||
Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( NETLIST_VIEW_DIALOG::onClose ), |
|||
nullptr, this ); |
|||
|
|||
m_scintillaTricks = std::make_unique<SCINTILLA_TRICKS>( textCtrl, wxT( "{}" ), false ); |
|||
|
|||
finishDialogSettings(); |
|||
} |
|||
|
|||
std::unique_ptr<SCINTILLA_TRICKS> m_scintillaTricks; |
|||
}; |
|||
|
|||
|
|||
int SIMULATOR_CONTROL::ShowNetlist( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
if( m_schematicFrame == nullptr || m_simulator == nullptr ) |
|||
return -1; |
|||
|
|||
wxString errors; |
|||
WX_STRING_REPORTER reporter( &errors ); |
|||
STRING_FORMATTER formatter; |
|||
|
|||
m_circuitModel->SetSimOptions( m_plotFrame->GetCurrentOptions() ); |
|||
m_circuitModel->GetNetlist( &formatter, reporter ); |
|||
|
|||
NETLIST_VIEW_DIALOG dlg( m_plotFrame, errors.IsEmpty() ? formatter.GetString() : errors ); |
|||
dlg.ShowModal(); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
void SIMULATOR_CONTROL::setTransitions() |
|||
{ |
|||
Go( &SIMULATOR_CONTROL::NewPlot, EE_ACTIONS::newPlot.MakeEvent() ); |
|||
Go( &SIMULATOR_CONTROL::OpenWorkbook, EE_ACTIONS::openWorkbook.MakeEvent() ); |
|||
Go( &SIMULATOR_CONTROL::SaveWorkbook, EE_ACTIONS::saveWorkbook.MakeEvent() ); |
|||
Go( &SIMULATOR_CONTROL::SaveWorkbook, EE_ACTIONS::saveWorkbookAs.MakeEvent() ); |
|||
Go( &SIMULATOR_CONTROL::ExportPlotAsPNG, EE_ACTIONS::exportPlotAsPNG.MakeEvent() ); |
|||
Go( &SIMULATOR_CONTROL::ExportPlotAsCSV, EE_ACTIONS::exportPlotAsCSV.MakeEvent() ); |
|||
Go( &SIMULATOR_CONTROL::Close, ACTIONS::quit.MakeEvent() ); |
|||
|
|||
Go( &SIMULATOR_CONTROL::Zoom, ACTIONS::zoomInCenter.MakeEvent() ); |
|||
Go( &SIMULATOR_CONTROL::Zoom, ACTIONS::zoomOutCenter.MakeEvent() ); |
|||
Go( &SIMULATOR_CONTROL::Zoom, ACTIONS::zoomFitScreen.MakeEvent() ); |
|||
Go( &SIMULATOR_CONTROL::ToggleGrid, ACTIONS::toggleGrid.MakeEvent() ); |
|||
Go( &SIMULATOR_CONTROL::ToggleLegend, EE_ACTIONS::toggleLegend.MakeEvent() ); |
|||
Go( &SIMULATOR_CONTROL::ToggleDottedSecondary, EE_ACTIONS::toggleDottedSecondary.MakeEvent() ); |
|||
Go( &SIMULATOR_CONTROL::ToggleDarkModePlots, EE_ACTIONS::toggleDarkModePlots.MakeEvent() ); |
|||
|
|||
Go( &SIMULATOR_CONTROL::EditSimCommand, EE_ACTIONS::simCommand.MakeEvent() ); |
|||
Go( &SIMULATOR_CONTROL::RunSimulation, EE_ACTIONS::runSimulation.MakeEvent() ); |
|||
Go( &SIMULATOR_CONTROL::RunSimulation, EE_ACTIONS::stopSimulation.MakeEvent() ); |
|||
Go( &SIMULATOR_CONTROL::AddSignals, EE_ACTIONS::addSignals.MakeEvent() ); |
|||
Go( &SIMULATOR_CONTROL::Probe, EE_ACTIONS::simProbe.MakeEvent() ); |
|||
Go( &SIMULATOR_CONTROL::Tune, EE_ACTIONS::simTune.MakeEvent() ); |
|||
|
|||
Go( &SIMULATOR_CONTROL::ShowNetlist, EE_ACTIONS::showNetlist.MakeEvent() ); |
|||
} |
|||
@ -0,0 +1,98 @@ |
|||
/* |
|||
* This program source code file is part of KiCad, a free EDA CAD application. |
|||
* |
|||
* Copyright (C) 2023 KiCad Developers, see AUTHORS.txt for contributors. |
|||
* |
|||
* This program is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU General Public License |
|||
* as published by the Free Software Foundation; either version 2 |
|||
* of the License, or (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program; if not, you may find one here: |
|||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html |
|||
* or you may search the http://www.gnu.org website for the version 2 license, |
|||
* or you may write to the Free Software Foundation, Inc., |
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
|||
*/ |
|||
|
|||
|
|||
#ifndef SIMULATOR_CONTROL_H |
|||
#define SIMULATOR_CONTROL_H |
|||
|
|||
#include <tool/tool_interactive.h> |
|||
|
|||
class SIM_PLOT_FRAME; |
|||
class NGSPICE_CIRCUIT_MODEL; |
|||
class SPICE_SIMULATOR; |
|||
|
|||
|
|||
/** |
|||
* Handle actions for the various symbol editor and viewers. |
|||
*/ |
|||
class SIMULATOR_CONTROL : public wxEvtHandler, public TOOL_INTERACTIVE |
|||
{ |
|||
public: |
|||
SIMULATOR_CONTROL() : |
|||
TOOL_INTERACTIVE( "eeschema.SimulatorControl" ), |
|||
m_plotFrame( nullptr ), |
|||
m_schematicFrame( nullptr ) |
|||
{ } |
|||
|
|||
virtual ~SIMULATOR_CONTROL() { } |
|||
|
|||
/// @copydoc TOOL_INTERACTIVE::Init() |
|||
bool Init() override; |
|||
|
|||
/// @copydoc TOOL_INTERACTIVE::Reset() |
|||
void Reset( RESET_REASON aReason ) override; |
|||
|
|||
int NewPlot( const TOOL_EVENT& aEvent ); |
|||
int OpenWorkbook( const TOOL_EVENT& aEvent ); |
|||
int SaveWorkbook( const TOOL_EVENT& aEvent ); |
|||
int ExportPlotAsPNG( const TOOL_EVENT& aEvent ); |
|||
int ExportPlotAsCSV( const TOOL_EVENT& aEvent ); |
|||
int Close( const TOOL_EVENT& aEvent ); |
|||
|
|||
int Zoom( const TOOL_EVENT& aEvent ); |
|||
int ToggleGrid( const TOOL_EVENT& aEvent ); |
|||
int ToggleLegend( const TOOL_EVENT& aEvent ); |
|||
int ToggleDottedSecondary( const TOOL_EVENT& aEvent ); |
|||
int ToggleDarkModePlots( const TOOL_EVENT& aEvent ); |
|||
|
|||
int EditSimCommand( const TOOL_EVENT& aEvent ); |
|||
int RunSimulation( const TOOL_EVENT& aEvent ); |
|||
int AddSignals( const TOOL_EVENT& aEvent ); |
|||
int Probe( const TOOL_EVENT& aEvent ); |
|||
int Tune( const TOOL_EVENT& aEvent ); |
|||
|
|||
int ShowNetlist( const TOOL_EVENT& aEvent ); |
|||
|
|||
private: |
|||
/** |
|||
* Return the default filename (with extension) to be used in file browser dialog. |
|||
*/ |
|||
wxString getDefaultFilename(); |
|||
|
|||
/** |
|||
* Return the default path to be used in file browser dialog. |
|||
*/ |
|||
wxString getDefaultPath(); |
|||
|
|||
///< Set up handlers for various events. |
|||
void setTransitions() override; |
|||
|
|||
private: |
|||
SIM_PLOT_FRAME* m_plotFrame; |
|||
SCH_EDIT_FRAME* m_schematicFrame; |
|||
std::shared_ptr<NGSPICE_CIRCUIT_MODEL> m_circuitModel; |
|||
std::shared_ptr<SPICE_SIMULATOR> m_simulator; |
|||
}; |
|||
|
|||
|
|||
#endif // SIMULATOR_CONTROL_H |
|||
|
After Width: 24 | Height: 24 | Size: 1.1 KiB |
|
Before Width: 24 | Height: 24 | Size: 251 B After Width: 24 | Height: 24 | Size: 274 B |
|
Before Width: 24 | Height: 24 | Size: 187 B After Width: 24 | Height: 24 | Size: 118 B |
@ -0,0 +1,120 @@ |
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
|||
<svg |
|||
id="Слой_1" |
|||
data-name="Слой 1" |
|||
viewBox="0 0 24 24" |
|||
version="1.1" |
|||
sodipodi:docname="sim_command.svg" |
|||
inkscape:version="1.2.1 (9c6d41e, 2022-07-14)" |
|||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" |
|||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" |
|||
xmlns="http://www.w3.org/2000/svg" |
|||
xmlns:svg="http://www.w3.org/2000/svg" |
|||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" |
|||
xmlns:cc="http://creativecommons.org/ns#" |
|||
xmlns:dc="http://purl.org/dc/elements/1.1/"> |
|||
<sodipodi:namedview |
|||
pagecolor="#ffffff" |
|||
bordercolor="#666666" |
|||
borderopacity="1" |
|||
objecttolerance="10" |
|||
gridtolerance="10" |
|||
guidetolerance="10" |
|||
inkscape:pageopacity="0" |
|||
inkscape:pageshadow="2" |
|||
inkscape:window-width="1728" |
|||
inkscape:window-height="987" |
|||
id="namedview30" |
|||
showgrid="true" |
|||
inkscape:zoom="39.543586" |
|||
inkscape:cx="13.301778" |
|||
inkscape:cy="11.923552" |
|||
inkscape:window-x="0" |
|||
inkscape:window-y="38" |
|||
inkscape:window-maximized="0" |
|||
inkscape:document-rotation="0" |
|||
inkscape:current-layer="Слой_1" |
|||
inkscape:showpageshadow="2" |
|||
inkscape:pagecheckerboard="0" |
|||
inkscape:deskcolor="#d1d1d1"> |
|||
<inkscape:grid |
|||
type="xygrid" |
|||
id="grid_kicad" |
|||
spacingx="0.5" |
|||
spacingy="0.5" |
|||
color="#9999ff" |
|||
opacity="0.13" |
|||
empspacing="2" /> |
|||
</sodipodi:namedview> |
|||
<metadata |
|||
id="metadata43"> |
|||
<rdf:RDF> |
|||
<cc:Work |
|||
rdf:about=""> |
|||
<cc:license |
|||
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" /> |
|||
<dc:format>image/svg+xml</dc:format> |
|||
<dc:type |
|||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> |
|||
<dc:title>simulator</dc:title> |
|||
</cc:Work> |
|||
<cc:License |
|||
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/"> |
|||
<cc:permits |
|||
rdf:resource="http://creativecommons.org/ns#Reproduction" /> |
|||
<cc:permits |
|||
rdf:resource="http://creativecommons.org/ns#Distribution" /> |
|||
<cc:requires |
|||
rdf:resource="http://creativecommons.org/ns#Notice" /> |
|||
<cc:requires |
|||
rdf:resource="http://creativecommons.org/ns#Attribution" /> |
|||
<cc:permits |
|||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /> |
|||
<cc:requires |
|||
rdf:resource="http://creativecommons.org/ns#ShareAlike" /> |
|||
</cc:License> |
|||
</rdf:RDF> |
|||
</metadata> |
|||
<defs |
|||
id="defs159987"> |
|||
<style |
|||
id="style159985">.cls-1{fill:#b9b9b9;}.cls-2,.cls-3{fill:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.25px;}.cls-2{stroke:#bf2641;}.cls-3{stroke:#1a81c4;}</style> |
|||
</defs> |
|||
<title |
|||
id="title159989">simulator</title> |
|||
<circle |
|||
style="fill:#ffffff;fill-opacity:1;stroke:#545454;stroke-width:1.37198;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" |
|||
id="path841" |
|||
cx="11.987356" |
|||
cy="11.987356" |
|||
r="10.289825" /> |
|||
<path |
|||
style="fill:none;stroke:#545454;stroke-width:0.953986;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" |
|||
d="M 2.251549,12.5 H 19.543938" |
|||
id="path843" |
|||
sodipodi:nodetypes="cc" /> |
|||
<path |
|||
style="fill:none;stroke:#545454;stroke-width:0.898072;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" |
|||
d="M 5.5,16.008526 V 4.7248423" |
|||
id="path845" |
|||
sodipodi:nodetypes="cc" /> |
|||
<path |
|||
style="fill:none;stroke:#1a81c4;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" |
|||
d="m 3.5,14.5 c 0,0 1.3518787,-7 2.8518787,-7 1.5,0 1.6002744,8.070806 3.0698938,8.060622 C 11.421725,15.546763 10.617219,4.5 12.617219,4.5 c 2,0 1.314653,14.512198 2.814653,14.512198 1.201824,0 1.002258,-3.266618 1.988097,-4.624305 C 17.831854,13.820649 18.5,13 19,13" |
|||
id="path865" |
|||
sodipodi:nodetypes="cssssac" /> |
|||
<ellipse |
|||
style="fill:none;fill-opacity:1;stroke:#545454;stroke-width:1.37119;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" |
|||
id="circle851" |
|||
cx="12" |
|||
cy="12.012644" |
|||
rx="10.277575" |
|||
ry="10.290219" /> |
|||
<path |
|||
class="cls-9" |
|||
d="m 24.229709,19.089216 -1.2674,-0.907 -0.015,0.027 c 0.03833,-0.2274 0.06148,-0.4572 0.0693,-0.6877 -0.0073,-0.2452 -0.03199,-0.4896 -0.0738,-0.7314 l 0.0074,0.013 1.2576,-0.92 c 0.275446,-0.2018 0.355047,-0.5785 0.1848,-0.8745 l -1.1327,-1.9683 c -0.170254,-0.296 -0.535927,-0.4167 -0.8489,-0.28 l -1.4277,0.6248 0.0124,0.022 c -0.387558,-0.3119 -0.817708,-0.5668 -1.2774,-0.757 l -0.1694,-1.5386 c -0.0375,-0.3393 -0.324184,-0.5962 -0.6656,-0.5964 h -2.271 c -0.341492,10e-5 -0.628287,0.257 -0.6658,0.5964 l -0.17,1.5453 c -0.477874,0.201 -0.923129,0.4721 -1.3211,0.8044 l 0.018,-0.032 -1.4342,-0.61 c -0.31434,-0.1335 -0.678759,-0.01 -0.846,0.2886 l -1.1118,1.98 c -0.167055,0.2979 -0.08336,0.6737 0.1943,0.8725 l 1.2674,0.907 0.0276,-0.049 c -0.03953,0.2327 -0.06322,0.4678 -0.0709,0.7037 0.0069,0.2554 0.03249,0.51 0.0767,0.7616 l -0.021,-0.037 -1.2576,0.9205 c -0.275495,0.2017 -0.355223,0.5783 -0.1851,0.8744 l 1.1327,1.9684 c 0.170418,0.2959 0.536051,0.4162 0.8489,0.2795 l 1.4279,-0.6249 -0.0293,-0.051 c 0.391248,0.32 0.826895,0.5814 1.2933,0.7762 l 0.17,1.5487 c 0.03751,0.3393 0.324184,0.5962 0.6656,0.5964 h 2.271 c 0.341416,-2e-4 0.628095,-0.2571 0.6656,-0.5964 l 0.1705,-1.5484 c 0.47629,-0.1988 0.920456,-0.4672 1.318,-0.7963 l -0.0154,0.027 1.4344,0.61 c 0.314288,0.1334 0.678633,0.01 0.8459,-0.2885 l 1.1117,-1.98 c 0.167077,-0.2977 0.08356,-0.6735 -0.1939,-0.8724 z m -6.4714,0.4685 c -1.656272,0 -2.371671,-2.145 -1.410892,-3.2684 1.001032,-1.1704 3.291346,-0.4321 3.327109,1.1884 0.107235,0.9522 -0.534865,2.0799 -1.916217,2.08 z" |
|||
id="path158639" |
|||
style="fill:#bf2641;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:2.3;stroke-dasharray:none;stroke-opacity:1" |
|||
inkscape:connector-curvature="0" |
|||
sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccscc" /> |
|||
</svg> |
|||
@ -1,35 +1,92 @@ |
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
|||
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" |
|||
xmlns:cc="http://creativecommons.org/ns#" |
|||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" |
|||
xmlns:svg="http://www.w3.org/2000/svg" |
|||
xmlns="http://www.w3.org/2000/svg" |
|||
<svg |
|||
id="Слой_1" |
|||
data-name="Слой 1" |
|||
viewBox="0 0 24 24" |
|||
version="1.1" |
|||
sodipodi:docname="sim_stop.svg" |
|||
inkscape:version="1.2.1 (9c6d41e, 2022-07-14)" |
|||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" |
|||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" |
|||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" id="Слой_1" data-name="Слой 1" viewBox="0 0 24 24" version="1.1" sodipodi:docname="sim_stop.svg" inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"> |
|||
<sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1609" inkscape:window-height="1286" id="namedview30" showgrid="true" inkscape:zoom="27.961538" inkscape:cx="3.3259971" inkscape:cy="13" inkscape:window-x="0" inkscape:window-y="37" inkscape:window-maximized="0" inkscape:document-rotation="0" inkscape:current-layer="Слой_1"> |
|||
<inkscape:grid type="xygrid" id="grid_kicad" spacingx="0.5" spacingy="0.5" color="#9999ff" opacity="0.13" empspacing="2" /> |
|||
</sodipodi:namedview> |
|||
<metadata id="metadata43"> |
|||
<rdf:RDF> |
|||
<cc:Work rdf:about=""> |
|||
<cc:license rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" /> |
|||
<dc:format>image/svg+xml</dc:format> |
|||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> |
|||
<dc:title>add_arc</dc:title> |
|||
</cc:Work> |
|||
<cc:License rdf:about="http://creativecommons.org/licenses/by-sa/4.0/"> |
|||
<cc:permits rdf:resource="http://creativecommons.org/ns#Reproduction" /> |
|||
<cc:permits rdf:resource="http://creativecommons.org/ns#Distribution" /> |
|||
<cc:requires rdf:resource="http://creativecommons.org/ns#Notice" /> |
|||
<cc:requires rdf:resource="http://creativecommons.org/ns#Attribution" /> |
|||
<cc:permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /> |
|||
<cc:requires rdf:resource="http://creativecommons.org/ns#ShareAlike" /> |
|||
</cc:License> |
|||
</rdf:RDF> |
|||
</metadata> |
|||
<defs id="defs159975"> |
|||
<style id="style159973">.cls-1{fill:#bf2641;}</style> |
|||
</defs> |
|||
<title id="title159977">sim_stop</title> |
|||
<path class="cls-1" d="M 20,0 H 4 A 4,4 0 0 0 0,4 v 16 a 4,4 0 0 0 4,4 h 16 a 4,4 0 0 0 4,-4 V 4 A 4,4 0 0 0 20,0 Z" id="path159979" /> |
|||
xmlns="http://www.w3.org/2000/svg" |
|||
xmlns:svg="http://www.w3.org/2000/svg" |
|||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" |
|||
xmlns:cc="http://creativecommons.org/ns#" |
|||
xmlns:dc="http://purl.org/dc/elements/1.1/"> |
|||
<sodipodi:namedview |
|||
pagecolor="#ffffff" |
|||
bordercolor="#666666" |
|||
borderopacity="1" |
|||
objecttolerance="10" |
|||
gridtolerance="10" |
|||
guidetolerance="10" |
|||
inkscape:pageopacity="0" |
|||
inkscape:pageshadow="2" |
|||
inkscape:window-width="1609" |
|||
inkscape:window-height="987" |
|||
id="namedview30" |
|||
showgrid="true" |
|||
inkscape:zoom="27.961538" |
|||
inkscape:cx="2.3067401" |
|||
inkscape:cy="13" |
|||
inkscape:window-x="0" |
|||
inkscape:window-y="38" |
|||
inkscape:window-maximized="0" |
|||
inkscape:document-rotation="0" |
|||
inkscape:current-layer="Слой_1" |
|||
inkscape:showpageshadow="2" |
|||
inkscape:pagecheckerboard="0" |
|||
inkscape:deskcolor="#d1d1d1"> |
|||
<inkscape:grid |
|||
type="xygrid" |
|||
id="grid_kicad" |
|||
spacingx="0.5" |
|||
spacingy="0.5" |
|||
color="#9999ff" |
|||
opacity="0.13" |
|||
empspacing="2" /> |
|||
</sodipodi:namedview> |
|||
<metadata |
|||
id="metadata43"> |
|||
<rdf:RDF> |
|||
<cc:Work |
|||
rdf:about=""> |
|||
<cc:license |
|||
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" /> |
|||
<dc:format>image/svg+xml</dc:format> |
|||
<dc:type |
|||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> |
|||
<dc:title>add_arc</dc:title> |
|||
</cc:Work> |
|||
<cc:License |
|||
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/"> |
|||
<cc:permits |
|||
rdf:resource="http://creativecommons.org/ns#Reproduction" /> |
|||
<cc:permits |
|||
rdf:resource="http://creativecommons.org/ns#Distribution" /> |
|||
<cc:requires |
|||
rdf:resource="http://creativecommons.org/ns#Notice" /> |
|||
<cc:requires |
|||
rdf:resource="http://creativecommons.org/ns#Attribution" /> |
|||
<cc:permits |
|||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /> |
|||
<cc:requires |
|||
rdf:resource="http://creativecommons.org/ns#ShareAlike" /> |
|||
</cc:License> |
|||
</rdf:RDF> |
|||
</metadata> |
|||
<defs |
|||
id="defs159975"> |
|||
<style |
|||
id="style159973">.cls-1{fill:#bf2641;}</style> |
|||
</defs> |
|||
<title |
|||
id="title159977">sim_stop</title> |
|||
<rect |
|||
style="fill:#1a81c4;fill-opacity:1;stroke-width:0.63381;stroke-dasharray:none" |
|||
id="rect1852" |
|||
width="17.953234" |
|||
height="17.953234" |
|||
x="3.0041265" |
|||
y="3.0041268" /> |
|||
</svg> |
|||