From 6df774a62f868ddf20ecf7a95ffd8c58c3364d41 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Wed, 5 Oct 2022 18:08:07 +0200 Subject: [PATCH] Commit missing sin_lib_mgr.{cpp,h} --- eeschema/sim/sim_lib_mgr.cpp | 92 ++++++++++++++++++++++++++++++++++++ eeschema/sim/sim_lib_mgr.h | 54 +++++++++++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 eeschema/sim/sim_lib_mgr.cpp create mode 100644 eeschema/sim/sim_lib_mgr.h diff --git a/eeschema/sim/sim_lib_mgr.cpp b/eeschema/sim/sim_lib_mgr.cpp new file mode 100644 index 0000000000..0a5cfc8c8e --- /dev/null +++ b/eeschema/sim/sim_lib_mgr.cpp @@ -0,0 +1,92 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2022 Mikolaj Wielgus + * Copyright (C) 2022 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, you may find one here: + * https://www.gnu.org/licenses/gpl-3.0.html + * or you may search the http://www.gnu.org website for the version 3 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include +#include + + +SIM_LIB_MGR::SIM_LIB_MGR( const PROJECT& aPrj ) : m_project( aPrj ) +{ +} + + +SIM_MODEL& SIM_LIB_MGR::CreateModel( SCH_SYMBOL& aSymbol ) +{ + std::vector pins = aSymbol.GetLibPins(); + SCH_FIELD* libraryField = aSymbol.FindField( SIM_LIBRARY::LIBRARY_FIELD ); + + if( libraryField ) + { + wxString path = libraryField->GetShownText(); + wxString absolutePath = m_project.AbsolutePath( path ); + SIM_LIBRARY* library = nullptr; + + try + { + auto it = m_libraries.try_emplace( std::string( path.ToUTF8() ), + SIM_LIBRARY::Create( std::string( absolutePath.ToUTF8() ) ) ).first; + library = &*it->second; + } + catch( const IO_ERROR& e ) + { + THROW_IO_ERROR( + wxString::Format( _( "Error loading simulation model library '%s'.\n%s" ), + absolutePath, + e.What() ) ); + } + + SCH_FIELD* nameField = aSymbol.FindField( SIM_LIBRARY::NAME_FIELD ); + + if( !nameField ) + { + THROW_IO_ERROR( wxString::Format( _( "Error loading simulation model: no '%s' field" ), + SIM_LIBRARY::NAME_FIELD ) ); + } + + std::string baseModelName = std::string( nameField->GetShownText().ToUTF8() ); + SIM_MODEL* baseModel = library->FindModel( baseModelName ); + + if( !baseModel ) + { + THROW_IO_ERROR( + wxString::Format( _( "Error loading simulation model: could not find base model '%s' in library '%s'" ), + baseModelName, + absolutePath ) ); + } + + m_models.push_back( SIM_MODEL::Create( *baseModel, + static_cast( pins.size() ), + aSymbol.GetFields() ) ); + } + else + { + m_models.push_back( SIM_MODEL::Create( static_cast( pins.size() ), + aSymbol.GetFields() ) ); + } + + return *m_models.back(); +} diff --git a/eeschema/sim/sim_lib_mgr.h b/eeschema/sim/sim_lib_mgr.h new file mode 100644 index 0000000000..779fca94bd --- /dev/null +++ b/eeschema/sim/sim_lib_mgr.h @@ -0,0 +1,54 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2022 Mikolaj Wielgus + * Copyright (C) 2022 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, you may find one here: + * https://www.gnu.org/licenses/gpl-3.0.html + * or you may search the http://www.gnu.org website for the version 3 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef SIM_LIB_MGR_H +#define SIM_LIB_MGR_H + +#include +#include +#include + +class PROJECT; +class SCH_SYMBOL; +class SIM_LIBRARY; +class SIM_MODEL; + + +class SIM_LIB_MGR +{ +public: + SIM_LIB_MGR( const PROJECT& aPrj ); + + // TODO: The argument can be made const. + SIM_MODEL& CreateModel( SCH_SYMBOL& aSymbol ); + + +private: + const PROJECT& m_project; + std::map> m_libraries; + std::vector> m_models; +}; + + +#endif // SIM_LIB_MGR_H