Better path handling for importing LTspice files.

This commit is contained in:
Jeff Young 2023-06-26 20:51:16 +01:00
parent 3bdc66d3ed
commit 4f52c69724
9 changed files with 74 additions and 74 deletions

View File

@ -27,8 +27,6 @@
#include <sch_plugins/ltspice/ltspice_sch_parser.h> #include <sch_plugins/ltspice/ltspice_sch_parser.h>
#include <sch_plugins/ltspice/ltspice_schematic.h> #include <sch_plugins/ltspice/ltspice_schematic.h>
#include <sch_io_mgr.h> #include <sch_io_mgr.h>
#include <base_units.h>
#include <core/kicad_algo.h>
#include <schematic.h> #include <schematic.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_sheet_pin.h> #include <sch_sheet_pin.h>
@ -38,7 +36,6 @@
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <sch_shape.h> #include <sch_shape.h>
#include <sch_bus_entry.h> #include <sch_bus_entry.h>
#include <kiplatform/environment.h>
void LTSPICE_SCH_PARSER::Parse( SCH_SHEET_PATH* aSheet, void LTSPICE_SCH_PARSER::Parse( SCH_SHEET_PATH* aSheet,
@ -77,8 +74,7 @@ void LTSPICE_SCH_PARSER::Parse( SCH_SHEET_PATH* aSheet,
void LTSPICE_SCH_PARSER::readIncludes( std::vector<LTSPICE_SCHEMATIC::LT_ASC>& outLT_ASCs ) void LTSPICE_SCH_PARSER::readIncludes( std::vector<LTSPICE_SCHEMATIC::LT_ASC>& outLT_ASCs )
{ {
static wxString ltSubDir = KIPLATFORM::ENV::GetDocumentsPath() + wxS( "/LTspiceXVII/lib/sub/" ); wxString ltSubDir = m_lt_schematic->GetLTspiceDataDir().GetFullPath() + wxS( "lib/sub/" );
wxString path; wxString path;
for( const LTSPICE_SCHEMATIC::LT_ASC& asc : outLT_ASCs ) for( const LTSPICE_SCHEMATIC::LT_ASC& asc : outLT_ASCs )
@ -349,22 +345,14 @@ VECTOR2I LTSPICE_SCH_PARSER::ToKicadFontSize( int aLTFontSize )
return VECTOR2I( schIUScale.MilsToIU( mils ), schIUScale.MilsToIU( mils ) ); return VECTOR2I( schIUScale.MilsToIU( mils ), schIUScale.MilsToIU( mils ) );
}; };
if( aLTFontSize == 1 ) if( aLTFontSize == 1 ) return MILS_SIZE( 36 );
return MILS_SIZE( 36 ); else if( aLTFontSize == 2 ) return MILS_SIZE( 42 );
else if( aLTFontSize == 2 ) else if( aLTFontSize == 3 ) return MILS_SIZE( 50 );
return MILS_SIZE( 42 ); else if( aLTFontSize == 4 ) return MILS_SIZE( 60 );
else if( aLTFontSize == 3 ) else if( aLTFontSize == 5 ) return MILS_SIZE( 72 );
return MILS_SIZE( 50 ); else if( aLTFontSize == 6 ) return MILS_SIZE( 88 );
else if( aLTFontSize == 4 ) else if( aLTFontSize == 7 ) return MILS_SIZE( 108 );
return MILS_SIZE( 60 ); else return ToKicadFontSize( 2 );
else if( aLTFontSize == 5 )
return MILS_SIZE( 72 );
else if( aLTFontSize == 6 )
return MILS_SIZE( 88 );
else if( aLTFontSize == 7 )
return MILS_SIZE( 108 );
else
return ToKicadFontSize( 2 );
} }
@ -903,7 +891,7 @@ SCH_LABEL_BASE* LTSPICE_SCH_PARSER::CreateSCH_LABEL( KICAD_T aType, const VECTOR
void LTSPICE_SCH_PARSER::CreateFields( LTSPICE_SCHEMATIC::LT_SYMBOL& aLTSymbol, void LTSPICE_SCH_PARSER::CreateFields( LTSPICE_SCHEMATIC::LT_SYMBOL& aLTSymbol,
SCH_SYMBOL* aSymbol, SCH_SHEET_PATH* aSheet ) SCH_SYMBOL* aSymbol, SCH_SHEET_PATH* aSheet )
{ {
wxString libPath = KIPLATFORM::ENV::GetDocumentsPath() + wxS( "/LTspiceXVII/lib/" ); wxString libPath = m_lt_schematic->GetLTspiceDataDir().GetFullPath() + wxS( "lib/" );
wxString symbolName = aLTSymbol.Name.Upper(); wxString symbolName = aLTSymbol.Name.Upper();
wxString type = aLTSymbol.SymAttributes[ wxS( "TYPE" ) ].Upper(); wxString type = aLTSymbol.SymAttributes[ wxS( "TYPE" ) ].Upper();
wxString prefix = aLTSymbol.SymAttributes[ wxS( "PREFIX" ) ].Upper(); wxString prefix = aLTSymbol.SymAttributes[ wxS( "PREFIX" ) ].Upper();

View File

@ -66,9 +66,6 @@ class SCH_SHAPE;
class LTSPICE_SCH_PARSER class LTSPICE_SCH_PARSER
{ {
public: public:
// Size of tiny net labels which none present in original design
const int SMALL_LABEL_SIZE = KiROUND( (double) SCH_IU_PER_MM * 0.4 );
explicit LTSPICE_SCH_PARSER( const wxString& aFilename, LTSPICE_SCHEMATIC* aLTSchematic ) : explicit LTSPICE_SCH_PARSER( const wxString& aFilename, LTSPICE_SCHEMATIC* aLTSchematic ) :
m_lt_schematic( aLTSchematic ), m_lt_schematic( aLTSchematic ),
m_powerSymbolIndex( 0 ) m_powerSymbolIndex( 0 )
@ -279,18 +276,8 @@ public:
void CreateCircle( LTSPICE_SCHEMATIC::LT_SYMBOL& aLTSymbol, int aIndex, SCH_SHEET_PATH* aSheet ); void CreateCircle( LTSPICE_SCHEMATIC::LT_SYMBOL& aLTSymbol, int aIndex, SCH_SHEET_PATH* aSheet );
private: private:
/**
* Method for setting Text Justification.
*
* @param aLineWidth object representing line width from ltspice.
*/
int getLineWidth( const LTSPICE_SCHEMATIC::LINEWIDTH& aLineWidth ); int getLineWidth( const LTSPICE_SCHEMATIC::LINEWIDTH& aLineWidth );
/**
* Method to get line Style For kicad.
*
* @param aLineStyle lineStyle from ltspice.
*/
PLOT_DASH_TYPE getLineStyle( const LTSPICE_SCHEMATIC::LINESTYLE& aLineStyle ); PLOT_DASH_TYPE getLineStyle( const LTSPICE_SCHEMATIC::LINESTYLE& aLineStyle );
STROKE_PARAMS getStroke( const LTSPICE_SCHEMATIC::LINEWIDTH& aLineWidth, STROKE_PARAMS getStroke( const LTSPICE_SCHEMATIC::LINEWIDTH& aLineWidth,
@ -300,7 +287,6 @@ private:
private: private:
LTSPICE_SCHEMATIC* m_lt_schematic; LTSPICE_SCHEMATIC* m_lt_schematic;
wxFileName m_libraryFileName;
VECTOR2I m_originOffset; VECTOR2I m_originOffset;
std::map<wxString, wxString> m_includes; std::map<wxString, wxString> m_includes;
int m_powerSymbolIndex; int m_powerSymbolIndex;

View File

@ -26,8 +26,7 @@
#include <schematic.h> #include <schematic.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <sch_screen.h> #include <sch_screen.h>
#include <sch_line.h> #include <kiplatform/environment.h>
#include <wildcards_and_files_ext.h>
/** /**
* @brief schematic PLUGIN for Ltspice (*.asc) and (.asy) format. * @brief schematic PLUGIN for Ltspice (*.asc) and (.asy) format.
@ -88,7 +87,17 @@ SCH_SHEET* SCH_LTSPICE_PLUGIN::Load( const wxString& aFileName, SCHEMATIC* aSche
wxCHECK_MSG( libTable, nullptr, "Could not load symbol lib table." ); wxCHECK_MSG( libTable, nullptr, "Could not load symbol lib table." );
LTSPICE_SCHEMATIC ascFile( aFileName ); wxFileName ltspiceDataDir( KIPLATFORM::ENV::GetUserDataPath(), wxEmptyString );
ltspiceDataDir.RemoveLastDir(); // "kicad"
ltspiceDataDir.AppendDir( wxS( "LTspice" ) );
if( !ltspiceDataDir.DirExists() )
{
ltspiceDataDir = wxFileName( KIPLATFORM::ENV::GetDocumentsPath(), wxEmptyString );
ltspiceDataDir.AppendDir( wxS( "LTspiceXVII" ) );
}
LTSPICE_SCHEMATIC ascFile( aFileName, ltspiceDataDir, nullptr, nullptr );
SCH_PLUGIN::SCH_PLUGIN_RELEASER sch_plugin; SCH_PLUGIN::SCH_PLUGIN_RELEASER sch_plugin;
sch_plugin.set( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) ); sch_plugin.set( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );

View File

@ -25,11 +25,9 @@
#include <sch_plugins/ltspice/ltspice_schematic.h> #include <sch_plugins/ltspice/ltspice_schematic.h>
#include <sch_plugins/ltspice/ltspice_sch_parser.h> #include <sch_plugins/ltspice/ltspice_sch_parser.h>
#include <sch_io_mgr.h>
#include <sch_screen.h> #include <sch_screen.h>
#include <wx/log.h> #include <wx/log.h>
#include <wx/dir.h> #include <wx/dir.h>
#include <kiplatform/environment.h>
#include <wildcards_and_files_ext.h> #include <wildcards_and_files_ext.h>
#include <sch_sheet.h> #include <sch_sheet.h>
#include <schematic.h> #include <schematic.h>
@ -164,9 +162,6 @@ void LTSPICE_SCHEMATIC::Load( SCHEMATIC* aSchematic, SCH_SHEET* aRootSheet,
curSheet->GetScreen()->SetFileName( m_schematic->Prj().GetProjectPath() + sheetName curSheet->GetScreen()->SetFileName( m_schematic->Prj().GetProjectPath() + sheetName
+ ".kicad_sch" ); + ".kicad_sch" );
// JEY TODO: do we need this?
//curSheet->addInstance( sheetPath );
} }
else else
{ {
@ -205,10 +200,10 @@ void LTSPICE_SCHEMATIC::GetAscAndAsyFilePaths( std::map<wxString, wxString>& aMa
std::map<wxString, wxString>& aMapOfAsyFiles, std::map<wxString, wxString>& aMapOfAsyFiles,
const wxFileName& parentFileName ) const wxFileName& parentFileName )
{ {
wxString ltSpiceFolder = KIPLATFORM::ENV::GetDocumentsPath() + wxS( "/LTspiceXVII" ); wxString ltSpiceFolder = m_ltspiceDataDir.GetFullPath();
wxString cmpFolder = ltSpiceFolder + wxS( "/lib/cmp/" ); wxString cmpFolder = ltSpiceFolder + wxS( "lib/cmp/" );
wxString subFolder = ltSpiceFolder + wxS( "/lib/sub/" ); wxString subFolder = ltSpiceFolder + wxS( "lib/sub/" );
wxString symFolder = ltSpiceFolder + wxS( "/lib/sym/" ); wxString symFolder = ltSpiceFolder + wxS( "lib/sym/" );
wxArrayString fileList; wxArrayString fileList;
wxDir::GetAllFiles( ltSpiceFolder, &fileList ); wxDir::GetAllFiles( ltSpiceFolder, &fileList );
@ -329,10 +324,7 @@ void LTSPICE_SCHEMATIC::tokensSizeRangeCheck( size_t aActualSize, int aExpectedM
void LTSPICE_SCHEMATIC::aggregateAttributeValue( wxArrayString& aTokens, int aIndex ) void LTSPICE_SCHEMATIC::aggregateAttributeValue( wxArrayString& aTokens, int aIndex )
{ {
/** // Merges a value which is across multiple tokens into one token with spaces in between.
* Merges a value which is across multiple tokens into one token appended with spaces in
* between.
*/
for( int i = aIndex + 1; i < (int) aTokens.GetCount(); i++ ) for( int i = aIndex + 1; i < (int) aTokens.GetCount(); i++ )
aTokens[ aIndex ] += " " + aTokens[i]; aTokens[ aIndex ] += " " + aTokens[i];
} }
@ -1038,7 +1030,6 @@ std::vector<LTSPICE_SCHEMATIC::LT_ASC> LTSPICE_SCHEMATIC::StructureBuilder()
else if( element == "VERSION" ) else if( element == "VERSION" )
{ {
wxString versionNumber = tokens[1]; wxString versionNumber = tokens[1];
ascFile.Version = integerCheck( versionNumber, lineNumber, fileName ); ascFile.Version = integerCheck( versionNumber, lineNumber, fileName );
} }

View File

@ -45,7 +45,6 @@ struct LTSPICE_FILE
ParentIndex( 0 ), ParentIndex( 0 ),
Sheet( nullptr ), Sheet( nullptr ),
Screen( nullptr ) Screen( nullptr )
{ } { }
bool operator<( const LTSPICE_FILE& t ) const bool operator<( const LTSPICE_FILE& t ) const
@ -276,17 +275,13 @@ public:
BOX2I BoundingBox; BOX2I BoundingBox;
}; };
explicit LTSPICE_SCHEMATIC( const wxString& aFilename, REPORTER* aReporter = nullptr, explicit LTSPICE_SCHEMATIC( const wxString& aFilename, const wxFileName& aLTspiceDataDir,
PROGRESS_REPORTER* aProgressReporter = nullptr ) REPORTER* aReporter, PROGRESS_REPORTER* aProgressReporter ) :
{ m_reporter( aReporter ),
m_schematic = nullptr; m_schematic( nullptr ),
m_rootSheet = nullptr; m_ltspiceDataDir( aLTspiceDataDir ),
m_plugin = nullptr; m_progressReporter( aProgressReporter )
m_designCenter.x = 0; {}
m_designCenter.y = 0;
m_reporter = aReporter;
m_progressReporter = aProgressReporter;
}
~LTSPICE_SCHEMATIC() {} ~LTSPICE_SCHEMATIC() {}
@ -352,6 +347,9 @@ public:
LT_SYMBOL SymbolBuilder( const wxString& aAscFileName, const wxString& aAsyFileContent, LT_SYMBOL SymbolBuilder( const wxString& aAscFileName, const wxString& aAsyFileContent,
LT_ASC& aAscFile ); LT_ASC& aAscFile );
const wxFileName& GetLTspiceDataDir() { return m_ltspiceDataDir; }
private: private:
/** /**
* Join value present across multiple tokens into one * Join value present across multiple tokens into one
@ -432,15 +430,10 @@ private:
static SYMBOLTYPE getSymbolType( const wxString& aValue ); static SYMBOLTYPE getSymbolType( const wxString& aValue );
private: private:
REPORTER* m_reporter; REPORTER* m_reporter;
SCHEMATIC* m_schematic; SCHEMATIC* m_schematic;
SCH_SHEET* m_rootSheet; wxFileName m_ltspiceDataDir;
SCH_PLUGIN::SCH_PLUGIN_RELEASER* m_plugin; PROGRESS_REPORTER* m_progressReporter; // optional; may be nullptr
wxFileName m_libraryFileName;
wxPoint m_designCenter; //< Used for calculating the required
//< offset to apply to the LTspice design
//< so that it fits in KiCad canvas
PROGRESS_REPORTER* m_progressReporter; // optional; may be nullptr
std::map<wxString, std::map<wxString, wxString>> m_fileCache; std::map<wxString, std::map<wxString, wxString>> m_fileCache;
}; };

View File

@ -109,6 +109,12 @@ wxString KIPLATFORM::ENV::GetUserConfigPath()
} }
wxString KIPLATFORM::ENV::GetUserDataPath()
{
return g_get_user_data_dir();
}
wxString KIPLATFORM::ENV::GetUserCachePath() wxString KIPLATFORM::ENV::GetUserCachePath()
{ {
return g_get_user_cache_dir(); return g_get_user_cache_dir();

View File

@ -65,6 +65,13 @@ namespace KIPLATFORM
*/ */
wxString GetUserConfigPath(); wxString GetUserConfigPath();
/**
* Retrieves the operating system specific path for a user's data store
*
* @return User config path
*/
wxString GetUserDataPath();
/** /**
* Retrieves the operating system specific path for user's application cache * Retrieves the operating system specific path for user's application cache
* *

View File

@ -102,6 +102,20 @@ wxString KIPLATFORM::ENV::GetUserConfigPath()
} }
wxString KIPLATFORM::ENV::GetUserDataPath()
{
// If called by a python script in stand-alone (outside KiCad), wxStandardPaths::Get()
// complains about not existing app. so use a dummy app
if( wxTheApp == nullptr )
{
wxApp dummy;
return wxStandardPaths::Get().GetUserDataDir();
}
return wxStandardPaths::Get().GetUserDataDir();
}
wxString KIPLATFORM::ENV::GetUserCachePath() wxString KIPLATFORM::ENV::GetUserCachePath()
{ {
// Unfortunately AppData/Local is the closest analog to "Cache" directories of other platforms // Unfortunately AppData/Local is the closest analog to "Cache" directories of other platforms

View File

@ -85,6 +85,12 @@ wxString KIPLATFORM::ENV::GetUserConfigPath()
} }
wxString KIPLATFORM::ENV::GetUserDataPath()
{
return wxStandardPaths::Get().GetUserDataDir();
}
wxString KIPLATFORM::ENV::GetUserCachePath() wxString KIPLATFORM::ENV::GetUserCachePath()
{ {
NSURL* url = [[NSFileManager defaultManager] URLForDirectory:NSCachesDirectory NSURL* url = [[NSFileManager defaultManager] URLForDirectory:NSCachesDirectory