Move resolve function to general usage
Libraries are created multiple times, so we need to resolve the library locations each time Fixes https://gitlab.com/kicad/code/kicad/issues/13083
This commit is contained in:
parent
e91c039ed3
commit
6d5a9153ab
|
@ -25,6 +25,7 @@
|
||||||
#include <pgm_base.h>
|
#include <pgm_base.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
|
#include <functional>
|
||||||
#include <sch_symbol.h>
|
#include <sch_symbol.h>
|
||||||
|
|
||||||
// Include simulator headers after wxWidgets headers to avoid conflicts with Windows headers
|
// Include simulator headers after wxWidgets headers to avoid conflicts with Windows headers
|
||||||
|
@ -74,13 +75,54 @@ wxString SIM_LIB_MGR::ResolveLibraryPath( const wxString& aLibraryPath, const PR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string SIM_LIB_MGR::ResolveEmbeddedLibraryPath( const std::string& aLibPath, const std::string& aRelativeLib )
|
||||||
|
{
|
||||||
|
wxFileName testPath( aLibPath );
|
||||||
|
wxString fullPath( aLibPath );
|
||||||
|
|
||||||
|
if( !testPath.IsAbsolute() && !aRelativeLib.empty() )
|
||||||
|
{
|
||||||
|
wxString relLib( aRelativeLib );
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
relLib = ResolveLibraryPath( relLib, m_project );
|
||||||
|
}
|
||||||
|
catch( ... )
|
||||||
|
{}
|
||||||
|
|
||||||
|
wxFileName fn( relLib );
|
||||||
|
|
||||||
|
testPath.MakeAbsolute( fn.GetPath( true ) );
|
||||||
|
fullPath = testPath.GetFullPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
wxFileName fn( fullPath );
|
||||||
|
|
||||||
|
if( !fn.Exists() )
|
||||||
|
fullPath = aLibPath;
|
||||||
|
|
||||||
|
fullPath = ResolveLibraryPath( fullPath, m_project );
|
||||||
|
}
|
||||||
|
catch( ... )
|
||||||
|
{}
|
||||||
|
|
||||||
|
return fullPath.ToStdString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
SIM_LIBRARY& SIM_LIB_MGR::AddLibrary( const wxString& aLibraryPath, REPORTER* aReporter )
|
SIM_LIBRARY& SIM_LIB_MGR::AddLibrary( const wxString& aLibraryPath, REPORTER* aReporter )
|
||||||
{
|
{
|
||||||
// May throw an exception.
|
// May throw an exception.
|
||||||
wxString path = ResolveLibraryPath( aLibraryPath, m_project );
|
wxString path = ResolveLibraryPath( aLibraryPath, m_project );
|
||||||
|
|
||||||
|
std::function<std::string(const std::string&, const std::string&)> f2 =
|
||||||
|
std::bind( &SIM_LIB_MGR::ResolveEmbeddedLibraryPath, this, std::placeholders::_1, std::placeholders::_2 );
|
||||||
|
|
||||||
// May throw an exception.
|
// May throw an exception.
|
||||||
auto it = m_libraries.try_emplace( path, SIM_LIBRARY::Create( path, aReporter ) ) .first;
|
auto it = m_libraries.try_emplace( path, SIM_LIBRARY::Create( path, aReporter, &f2 ) ).first;
|
||||||
return *it->second;
|
return *it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,42 +133,7 @@ SIM_LIBRARY& SIM_LIB_MGR::SetLibrary( const wxString& aLibraryPath, REPORTER* aR
|
||||||
wxString path = ResolveLibraryPath( aLibraryPath, m_project );
|
wxString path = ResolveLibraryPath( aLibraryPath, m_project );
|
||||||
|
|
||||||
std::function<std::string(const std::string&, const std::string&)> f2 =
|
std::function<std::string(const std::string&, const std::string&)> f2 =
|
||||||
[&]( const std::string& aLibPath, const std::string& aRelativeLib ) -> std::string
|
std::bind( &SIM_LIB_MGR::ResolveEmbeddedLibraryPath, this, std::placeholders::_1, std::placeholders::_2 );
|
||||||
{
|
|
||||||
wxFileName testPath( aLibPath );
|
|
||||||
wxString fullPath( aLibPath );
|
|
||||||
|
|
||||||
if( !testPath.IsAbsolute() && !aRelativeLib.empty() )
|
|
||||||
{
|
|
||||||
wxString relLib( aRelativeLib );
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
relLib = ResolveLibraryPath( relLib, m_project );
|
|
||||||
}
|
|
||||||
catch( ... )
|
|
||||||
{}
|
|
||||||
|
|
||||||
wxFileName fn( relLib );
|
|
||||||
|
|
||||||
testPath.MakeAbsolute( fn.GetPath( true ) );
|
|
||||||
fullPath = testPath.GetFullPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
wxFileName fn( fullPath );
|
|
||||||
|
|
||||||
if( !fn.Exists() )
|
|
||||||
fullPath = aLibPath;
|
|
||||||
|
|
||||||
fullPath = ResolveLibraryPath( fullPath, m_project );
|
|
||||||
}
|
|
||||||
catch( ... )
|
|
||||||
{}
|
|
||||||
|
|
||||||
return fullPath.ToStdString();
|
|
||||||
};
|
|
||||||
|
|
||||||
std::unique_ptr<SIM_LIBRARY> library = SIM_LIBRARY::Create( path, aReporter, &f2 );
|
std::unique_ptr<SIM_LIBRARY> library = SIM_LIBRARY::Create( path, aReporter, &f2 );
|
||||||
|
|
||||||
|
@ -248,9 +255,12 @@ SIM_LIBRARY::MODEL SIM_LIB_MGR::CreateModel( const wxString& aLibraryPath,
|
||||||
wxString path = ResolveLibraryPath( aLibraryPath, m_project );
|
wxString path = ResolveLibraryPath( aLibraryPath, m_project );
|
||||||
SIM_LIBRARY* library = nullptr;
|
SIM_LIBRARY* library = nullptr;
|
||||||
|
|
||||||
|
std::function<std::string(const std::string&, const std::string&)> f2 =
|
||||||
|
std::bind( &SIM_LIB_MGR::ResolveEmbeddedLibraryPath, this, std::placeholders::_1, std::placeholders::_2 );
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
auto it = m_libraries.try_emplace( path, SIM_LIBRARY::Create( path ) ).first;
|
auto it = m_libraries.try_emplace( path, SIM_LIBRARY::Create( path, nullptr, &f2 ) ).first;
|
||||||
library = &*it->second;
|
library = &*it->second;
|
||||||
}
|
}
|
||||||
catch( const IO_ERROR& e )
|
catch( const IO_ERROR& e )
|
||||||
|
|
|
@ -73,6 +73,8 @@ public:
|
||||||
|
|
||||||
static wxString ResolveLibraryPath( const wxString& aLibraryPath, const PROJECT* aProject );
|
static wxString ResolveLibraryPath( const wxString& aLibraryPath, const PROJECT* aProject );
|
||||||
|
|
||||||
|
std::string ResolveEmbeddedLibraryPath( const std::string& aLibPath, const std::string& aRelativeLib );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const PROJECT* m_project;
|
const PROJECT* m_project;
|
||||||
std::map<wxString, std::unique_ptr<SIM_LIBRARY>> m_libraries;
|
std::map<wxString, std::unique_ptr<SIM_LIBRARY>> m_libraries;
|
||||||
|
|
Loading…
Reference in New Issue