Fixed library path resolution in Spice netlist exporter

SEARCH_STACK is a deprecated method for getting the list of paths where
one could look for a file. Instead it tries the project path and
environmental variables.
This commit is contained in:
Maciej Suminski 2017-11-19 11:37:27 +01:00
parent 31083a4060
commit 33cf082c41
6 changed files with 64 additions and 11 deletions

View File

@ -110,3 +110,43 @@ wxString NormalizePath( const wxFileName& aFilePath, const ENV_VAR_MAP* aEnvVars
return normalizedFullPath;
}
// Create file path by appending path and file name. This approach allows the filename
// to contain a relative path, whereas wxFileName::SetPath() would replace the
// relative path
static wxString createFilePath( const wxString& aPath, const wxString& aFileName )
{
wxString path( aPath );
if( !path.EndsWith( wxFileName::GetPathSeparator() ) )
path.Append( wxFileName::GetPathSeparator() );
return path + aFileName;
}
wxString ResolveFile( const wxString& aFileName, const ENV_VAR_MAP* aEnvVars,
const PROJECT* aProject )
{
if( aProject )
{
wxFileName fn( createFilePath( aProject->GetProjectPath(), aFileName ) );
if( fn.Exists() )
return fn.GetFullPath();
}
if( aEnvVars )
{
for( auto& entry : *aEnvVars )
{
wxFileName fn( createFilePath( entry.second.GetValue(), aFileName ) );
if( fn.Exists() )
return fn.GetFullPath();
}
}
return wxEmptyString;
}

View File

@ -35,6 +35,7 @@
#include <netlist.h>
#include <sch_reference_list.h>
#include <class_netlist_object.h>
#include <env_paths.h>
#include <wx/tokenzr.h>
#include <wx/regex.h>
@ -72,10 +73,10 @@ bool NETLIST_EXPORTER_PSPICE::Format( OUTPUTFORMATTER* aFormatter, unsigned aCtl
{
wxString full_path;
if( ( aCtl & NET_ADJUST_INCLUDE_PATHS ) && m_paths )
if( ( aCtl & NET_ADJUST_INCLUDE_PATHS ) )
{
// Look for the library in known search locations
full_path = m_paths->FindValidPath( lib );
full_path = ResolveFile( lib, &Pgm().GetLocalEnvVariables(), m_project );
if( full_path.IsEmpty() )
{

View File

@ -30,7 +30,7 @@
#include <list>
#include <map>
class SEARCH_STACK;
class PROJECT;
/// Flags for Spice netlist generation (can be combined)
enum SPICE_NETLIST_OPTIONS {
@ -99,9 +99,9 @@ struct SPICE_ITEM
class NETLIST_EXPORTER_PSPICE : public NETLIST_EXPORTER
{
public:
NETLIST_EXPORTER_PSPICE( NETLIST_OBJECT_LIST* aMasterList, SEARCH_STACK* aPaths = NULL ) :
NETLIST_EXPORTER_PSPICE( NETLIST_OBJECT_LIST* aMasterList, PROJECT* aProject = NULL ) :
NETLIST_EXPORTER( aMasterList ),
m_paths( aPaths )
m_project( aProject )
{
}
@ -228,8 +228,8 @@ private:
///> List of items representing schematic components in the Spice world
SPICE_ITEM_LIST m_spiceItems;
///> Paths to be searched for included Spice libraries
SEARCH_STACK* m_paths;
///> Project object to fetch its settings (e.g. paths)
PROJECT* m_project;
// Component fields that are processed during netlist export & simulation
static const std::vector<wxString> m_spiceFields;

View File

@ -36,8 +36,8 @@
class NETLIST_EXPORTER_PSPICE_SIM : public NETLIST_EXPORTER_PSPICE
{
public:
NETLIST_EXPORTER_PSPICE_SIM( NETLIST_OBJECT_LIST* aMasterList ) :
NETLIST_EXPORTER_PSPICE( aMasterList )
NETLIST_EXPORTER_PSPICE_SIM( NETLIST_OBJECT_LIST* aMasterList, PROJECT* aProject = nullptr ) :
NETLIST_EXPORTER_PSPICE( aMasterList, aProject )
{
}

View File

@ -459,7 +459,7 @@ void SIM_PLOT_FRAME::removePlot( const wxString& aPlotName, bool aErase )
void SIM_PLOT_FRAME::updateNetlistExporter()
{
m_exporter.reset( new NETLIST_EXPORTER_PSPICE_SIM( m_schematicFrame->BuildNetListBase() ) );
m_exporter.reset( new NETLIST_EXPORTER_PSPICE_SIM( m_schematicFrame->BuildNetListBase(), &Prj() ) );
}

View File

@ -29,7 +29,7 @@
/**
* Normalizes a file path to an environmental variable, if possible.
*
*
* @param aFilePath is the full file path (path and file name) to be normalized.
* @param aEnvVars is an optional map of environmental variables to try substition with.
* @param aProject is an optional project, to normalize the file path to the project path.
@ -39,4 +39,16 @@
wxString NormalizePath( const wxFileName& aFilePath, const ENV_VAR_MAP* aEnvVars,
const PROJECT* aProject );
/**
* Searches the default paths trying to find one with the requested file.
*
* @param aFileName is the name of the searched file. It might be a relative path.
* @param aEnvVars is an optional map of environmental variables that can contain paths.
* @param aProject is an optional project, to check the project path.
* @return Full path (apth and file name) if the file was found in one of the paths, otherwise
* an empty string.
*/
wxString ResolveFile( const wxString& aFileName, const ENV_VAR_MAP* aEnvVars,
const PROJECT* aProject );
#endif /* ENV_PATHS_H */