From 77b361a07774bd9190dc6245ad4b35a894831442 Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Sat, 31 Dec 2022 16:53:37 +0000 Subject: [PATCH] Add reference material to SPICE model pin assignment tab. Fixes https://gitlab.com/kicad/code/kicad/issues/13309 --- eeschema/dialogs/dialog_sim_model.cpp | 22 +++- eeschema/dialogs/dialog_sim_model_base.cpp | 44 ++++++- eeschema/dialogs/dialog_sim_model_base.fbp | 132 ++++++++++++++++++++- eeschema/dialogs/dialog_sim_model_base.h | 2 + eeschema/sim/sim_model.cpp | 2 +- eeschema/sim/sim_model_subckt.cpp | 11 ++ eeschema/sim/sim_model_subckt.h | 2 + 7 files changed, 208 insertions(+), 7 deletions(-) diff --git a/eeschema/dialogs/dialog_sim_model.cpp b/eeschema/dialogs/dialog_sim_model.cpp index b70c8c9775..e15f44dfee 100644 --- a/eeschema/dialogs/dialog_sim_model.cpp +++ b/eeschema/dialogs/dialog_sim_model.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -41,7 +42,7 @@ #include #include #include -#include "fmt/format.h" +#include using CATEGORY = SIM_MODEL::PARAM::CATEGORY; @@ -103,6 +104,8 @@ DIALOG_SIM_MODEL::DIALOG_SIM_MODEL( wxWindow* aParent, T_symb m_pinAssignmentsGrid->PushEventHandler( new GRID_TRICKS( m_pinAssignmentsGrid ) ); + m_subcktLabel->SetFont( KIUI::GetInfoFont( m_subcktLabel ) ); + // Now all widgets have the size fixed, call FinishDialogSettings finishDialogSettings(); } @@ -637,7 +640,19 @@ void DIALOG_SIM_MODEL::updatePinAssignments() } // TODO: Show a preview of the symbol with the pin numbers shown. - // TODO: Maybe show a preview of the code for subcircuits and code models. + + SIM_MODEL* model = &curModel(); + + if( model->GetType() == SIM_MODEL::TYPE::SUBCKT ) + { + SIM_MODEL_SUBCKT* subckt = static_cast( model ); + m_subckt->SetText( subckt->GetSpiceCode() ); + } + else + { + m_subcktLabel->Show( false ); + m_subckt->Show( false ); + } } @@ -653,7 +668,8 @@ void DIALOG_SIM_MODEL::removeOrphanedPinAssignments() template -void DIALOG_SIM_MODEL::loadLibrary( const wxString& aLibraryPath, bool aForceReload ) +void DIALOG_SIM_MODEL::loadLibrary( const wxString& aLibraryPath, + bool aForceReload ) { auto libraries = m_libraryModelsMgr.GetLibraries(); diff --git a/eeschema/dialogs/dialog_sim_model_base.cpp b/eeschema/dialogs/dialog_sim_model_base.cpp index ac94e97495..f4c8b0fc07 100644 --- a/eeschema/dialogs/dialog_sim_model_base.cpp +++ b/eeschema/dialogs/dialog_sim_model_base.cpp @@ -249,13 +249,55 @@ DIALOG_SIM_MODEL_BASE::DIALOG_SIM_MODEL_BASE( wxWindow* parent, wxWindowID id, c m_pinAssignmentsGrid->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP ); bSizer10->Add( m_pinAssignmentsGrid, 1, wxALL|wxEXPAND, 5 ); + m_subcktLabel = new wxStaticText( m_pinAssignmentsPanel, wxID_ANY, _("Reference"), wxDefaultPosition, wxDefaultSize, 0 ); + m_subcktLabel->Wrap( -1 ); + bSizer10->Add( m_subcktLabel, 0, wxTOP|wxRIGHT|wxLEFT, 8 ); + + m_subckt = new wxStyledTextCtrl( m_pinAssignmentsPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, wxEmptyString ); + m_subckt->SetUseTabs( true ); + m_subckt->SetTabWidth( 4 ); + m_subckt->SetIndent( 4 ); + m_subckt->SetTabIndents( true ); + m_subckt->SetBackSpaceUnIndents( true ); + m_subckt->SetViewEOL( false ); + m_subckt->SetViewWhiteSpace( false ); + m_subckt->SetMarginWidth( 2, 0 ); + m_subckt->SetIndentationGuides( true ); + m_subckt->SetReadOnly( false ); + m_subckt->SetMarginType( 1, wxSTC_MARGIN_SYMBOL ); + m_subckt->SetMarginMask( 1, wxSTC_MASK_FOLDERS ); + m_subckt->SetMarginWidth( 1, 16); + m_subckt->SetMarginSensitive( 1, true ); + m_subckt->SetProperty( wxT("fold"), wxT("1") ); + m_subckt->SetFoldFlags( wxSTC_FOLDFLAG_LINEBEFORE_CONTRACTED | wxSTC_FOLDFLAG_LINEAFTER_CONTRACTED ); + m_subckt->SetMarginType( 0, wxSTC_MARGIN_NUMBER ); + m_subckt->SetMarginWidth( 0, m_subckt->TextWidth( wxSTC_STYLE_LINENUMBER, wxT("_99999") ) ); + m_subckt->MarkerDefine( wxSTC_MARKNUM_FOLDER, wxSTC_MARK_BOXPLUS ); + m_subckt->MarkerSetBackground( wxSTC_MARKNUM_FOLDER, wxColour( wxT("BLACK") ) ); + m_subckt->MarkerSetForeground( wxSTC_MARKNUM_FOLDER, wxColour( wxT("WHITE") ) ); + m_subckt->MarkerDefine( wxSTC_MARKNUM_FOLDEROPEN, wxSTC_MARK_BOXMINUS ); + m_subckt->MarkerSetBackground( wxSTC_MARKNUM_FOLDEROPEN, wxColour( wxT("BLACK") ) ); + m_subckt->MarkerSetForeground( wxSTC_MARKNUM_FOLDEROPEN, wxColour( wxT("WHITE") ) ); + m_subckt->MarkerDefine( wxSTC_MARKNUM_FOLDERSUB, wxSTC_MARK_EMPTY ); + m_subckt->MarkerDefine( wxSTC_MARKNUM_FOLDEREND, wxSTC_MARK_BOXPLUS ); + m_subckt->MarkerSetBackground( wxSTC_MARKNUM_FOLDEREND, wxColour( wxT("BLACK") ) ); + m_subckt->MarkerSetForeground( wxSTC_MARKNUM_FOLDEREND, wxColour( wxT("WHITE") ) ); + m_subckt->MarkerDefine( wxSTC_MARKNUM_FOLDEROPENMID, wxSTC_MARK_BOXMINUS ); + m_subckt->MarkerSetBackground( wxSTC_MARKNUM_FOLDEROPENMID, wxColour( wxT("BLACK") ) ); + m_subckt->MarkerSetForeground( wxSTC_MARKNUM_FOLDEROPENMID, wxColour( wxT("WHITE") ) ); + m_subckt->MarkerDefine( wxSTC_MARKNUM_FOLDERMIDTAIL, wxSTC_MARK_EMPTY ); + m_subckt->MarkerDefine( wxSTC_MARKNUM_FOLDERTAIL, wxSTC_MARK_EMPTY ); + m_subckt->SetSelBackground( true, wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHT ) ); + m_subckt->SetSelForeground( true, wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHTTEXT ) ); + bSizer10->Add( m_subckt, 1, wxEXPAND | wxALL, 5 ); + m_pinAssignmentsPanel->SetSizer( bSizer10 ); m_pinAssignmentsPanel->Layout(); bSizer10->Fit( m_pinAssignmentsPanel ); m_notebook->AddPage( m_pinAssignmentsPanel, _("Pin Assignments"), false ); - bSizer8->Add( m_notebook, 1, wxEXPAND|wxALL, 10 ); + bSizer8->Add( m_notebook, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 10 ); wxBoxSizer* bSizer81; bSizer81 = new wxBoxSizer( wxHORIZONTAL ); diff --git a/eeschema/dialogs/dialog_sim_model_base.fbp b/eeschema/dialogs/dialog_sim_model_base.fbp index 55a07d930b..593b8abb20 100644 --- a/eeschema/dialogs/dialog_sim_model_base.fbp +++ b/eeschema/dialogs/dialog_sim_model_base.fbp @@ -63,7 +63,7 @@ none 10 - wxEXPAND|wxALL + wxEXPAND|wxTOP|wxRIGHT|wxLEFT 1 1 @@ -167,7 +167,7 @@ Resizable 1 - ; ; forward_declare + 0 @@ -1886,6 +1886,134 @@ onPinAssignmentsGridSize + + 8 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Reference + 0 + + 0 + + + 0 + + 1 + m_subcktLabel + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + 1 + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + 1 + + 0 + 0 + wxID_ANY + 1 + 1 + + 0 + + + 0 + + 1 + m_subckt + 1 + + + protected + 1 + + 0 + Resizable + 1 + + ; ; forward_declare + 1 + 4 + 0 + + 1 + 0 + 0 + + + + + diff --git a/eeschema/dialogs/dialog_sim_model_base.h b/eeschema/dialogs/dialog_sim_model_base.h index 67ed3542d4..8d0b9fe1bf 100644 --- a/eeschema/dialogs/dialog_sim_model_base.h +++ b/eeschema/dialogs/dialog_sim_model_base.h @@ -79,6 +79,8 @@ class DIALOG_SIM_MODEL_BASE : public DIALOG_SHIM wxCheckBox* m_saveInValueCheckbox; wxPanel* m_pinAssignmentsPanel; WX_GRID* m_pinAssignmentsGrid; + wxStaticText* m_subcktLabel; + wxStyledTextCtrl* m_subckt; wxStdDialogButtonSizer* m_sdbSizer1; wxButton* m_sdbSizer1OK; wxButton* m_sdbSizer1Cancel; diff --git a/eeschema/sim/sim_model.cpp b/eeschema/sim/sim_model.cpp index dd3c3d5b39..0214c24069 100644 --- a/eeschema/sim/sim_model.cpp +++ b/eeschema/sim/sim_model.cpp @@ -80,7 +80,7 @@ SIM_MODEL::DEVICE_INFO SIM_MODEL::DeviceInfo( DEVICE_T aDeviceType ) case DEVICE_T::V: return { "V", "Voltage Source", true }; case DEVICE_T::I: return { "I", "Current Source", true }; - case DEVICE_T::KIBIS: return { "IBIS", "IBIS Model", false }; + case DEVICE_T::KIBIS: return { "IBIS", "IBIS Model", false }; case DEVICE_T::SUBCKT: return { "SUBCKT", "Subcircuit", false }; case DEVICE_T::XSPICE: return { "XSPICE", "XSPICE Code Model", true }; diff --git a/eeschema/sim/sim_model_subckt.cpp b/eeschema/sim/sim_model_subckt.cpp index 881784944c..517d4cd1b7 100644 --- a/eeschema/sim/sim_model_subckt.cpp +++ b/eeschema/sim/sim_model_subckt.cpp @@ -155,3 +155,14 @@ void SIM_MODEL_SUBCKT::SetBaseModel( const SIM_MODEL& aBaseModel ) AddParam( param.info ); } + +std::string SIM_MODEL_SUBCKT::GetSpiceCode() const +{ + if( !m_spiceCode.empty() ) + return m_spiceCode; + + if( const SIM_MODEL_SUBCKT* baseModel = dynamic_cast( m_baseModel ) ) + return baseModel->GetSpiceCode(); + + return ""; +} \ No newline at end of file diff --git a/eeschema/sim/sim_model_subckt.h b/eeschema/sim/sim_model_subckt.h index 4f60642c57..c6fa108e55 100644 --- a/eeschema/sim/sim_model_subckt.h +++ b/eeschema/sim/sim_model_subckt.h @@ -57,6 +57,8 @@ public: void SetBaseModel( const SIM_MODEL& aBaseModel ) override; + std::string GetSpiceCode() const; + private: bool requiresSpiceModelLine() const override { return true; }