Add 3rdparty/plugins to plugin search
This commit is contained in:
parent
4be115ca55
commit
78ab69027d
|
@ -69,20 +69,7 @@ bool SCRIPTING_TOOL::Init()
|
||||||
Py_DECREF( mod );
|
Py_DECREF( mod );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load pcbnew inside Python and load all the user plugins and package-based plugins
|
callLoadPlugins();
|
||||||
{
|
|
||||||
using namespace pybind11::literals;
|
|
||||||
|
|
||||||
auto locals = pybind11::dict( "sys_path"_a = TO_UTF8( SCRIPTING::PyScriptingPath( false ) ),
|
|
||||||
"user_path"_a = TO_UTF8( SCRIPTING::PyScriptingPath( true ) ) );
|
|
||||||
|
|
||||||
pybind11::exec( R"(
|
|
||||||
import sys
|
|
||||||
import pcbnew
|
|
||||||
pcbnew.LoadPlugins( sys_path, user_path )
|
|
||||||
)", pybind11::globals(), locals );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -97,18 +84,7 @@ int SCRIPTING_TOOL::reloadPlugins( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
{
|
{
|
||||||
PyLOCK lock;
|
PyLOCK lock;
|
||||||
std::string sys_path = SCRIPTING::PyScriptingPath( false ).ToStdString();
|
callLoadPlugins();
|
||||||
std::string user_path = SCRIPTING::PyScriptingPath( true ).ToStdString();
|
|
||||||
|
|
||||||
using namespace pybind11::literals;
|
|
||||||
auto locals = pybind11::dict( "sys_path"_a = sys_path,
|
|
||||||
"user_path"_a = user_path );
|
|
||||||
|
|
||||||
pybind11::exec( R"(
|
|
||||||
import sys
|
|
||||||
import pcbnew
|
|
||||||
pcbnew.LoadPlugins( sys_path, user_path )
|
|
||||||
)", pybind11::globals(), locals );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !m_isFootprintEditor )
|
if( !m_isFootprintEditor )
|
||||||
|
@ -123,9 +99,29 @@ pcbnew.LoadPlugins( sys_path, user_path )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCRIPTING_TOOL::callLoadPlugins()
|
||||||
|
{
|
||||||
|
// Load pcbnew inside Python and load all the user plugins and package-based plugins
|
||||||
|
using namespace pybind11::literals;
|
||||||
|
|
||||||
|
auto locals = pybind11::dict( "sys_path"_a = TO_UTF8( SCRIPTING::PyScriptingPath(
|
||||||
|
SCRIPTING::PATH_TYPE::STOCK ) ),
|
||||||
|
"user_path"_a = TO_UTF8( SCRIPTING::PyScriptingPath(
|
||||||
|
SCRIPTING::PATH_TYPE::USER ) ),
|
||||||
|
"third_party_path"_a = TO_UTF8( SCRIPTING::PyPluginsPath(
|
||||||
|
SCRIPTING::PATH_TYPE::THIRDPARTY ) ) );
|
||||||
|
|
||||||
|
pybind11::exec( R"(
|
||||||
|
import sys
|
||||||
|
import pcbnew
|
||||||
|
pcbnew.LoadPlugins( sys_path, user_path, third_party_path )
|
||||||
|
)", pybind11::globals(), locals );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int SCRIPTING_TOOL::showPluginFolder( const TOOL_EVENT& aEvent )
|
int SCRIPTING_TOOL::showPluginFolder( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
wxString pluginpath( SCRIPTING::PyPluginsPath( true ) );
|
wxString pluginpath( SCRIPTING::PyPluginsPath( SCRIPTING::PATH_TYPE::USER ) );
|
||||||
LaunchExternal( pluginpath );
|
LaunchExternal( pluginpath );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -49,6 +49,10 @@ private:
|
||||||
///< Reload Python plugins and reset toolbar (if in pcbnew)
|
///< Reload Python plugins and reset toolbar (if in pcbnew)
|
||||||
int reloadPlugins( const TOOL_EVENT& aEvent );
|
int reloadPlugins( const TOOL_EVENT& aEvent );
|
||||||
|
|
||||||
|
///< Call LoadPlugins method of the scripting module with apropriate paths
|
||||||
|
///< Must be called under PyLOCK
|
||||||
|
void callLoadPlugins();
|
||||||
|
|
||||||
///< Open the user's plugin folder in the system browser
|
///< Open the user's plugin folder in the system browser
|
||||||
int showPluginFolder( const TOOL_EVENT& aEvent );
|
int showPluginFolder( const TOOL_EVENT& aEvent );
|
||||||
|
|
||||||
|
|
|
@ -165,7 +165,7 @@ def LoadPluginModule(Dirname, ModuleName, FileName):
|
||||||
FULL_BACK_TRACE += traceback.format_exc()
|
FULL_BACK_TRACE += traceback.format_exc()
|
||||||
|
|
||||||
|
|
||||||
def LoadPlugins(bundlepath=None, userpath=None):
|
def LoadPlugins(bundlepath=None, userpath=None, thirdpartypath=None):
|
||||||
"""
|
"""
|
||||||
Initialise Scripting/Plugin python environment and load plugins.
|
Initialise Scripting/Plugin python environment and load plugins.
|
||||||
|
|
||||||
|
@ -192,6 +192,8 @@ def LoadPlugins(bundlepath=None, userpath=None):
|
||||||
<userpath>/
|
<userpath>/
|
||||||
<userpath>/plugins/
|
<userpath>/plugins/
|
||||||
|
|
||||||
|
The plugins from 3rd party packages:
|
||||||
|
$KICAD_3RD_PARTY/plugins/
|
||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
@ -207,8 +209,9 @@ def LoadPlugins(bundlepath=None, userpath=None):
|
||||||
So convert these utf8 encoding to unicode strings to avoid any encoding issue.
|
So convert these utf8 encoding to unicode strings to avoid any encoding issue.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
bundlepath = bundlepath.decode( 'UTF-8' );
|
bundlepath = bundlepath.decode( 'UTF-8' )
|
||||||
userpath = userpath.decode( 'UTF-8' );
|
userpath = userpath.decode( 'UTF-8' )
|
||||||
|
thirdpartypath = thirdpartypath.decode( 'UTF-8' )
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -220,7 +223,10 @@ def LoadPlugins(bundlepath=None, userpath=None):
|
||||||
to the windows separator, although using '/' works
|
to the windows separator, although using '/' works
|
||||||
"""
|
"""
|
||||||
if sys.platform.startswith('win32'):
|
if sys.platform.startswith('win32'):
|
||||||
bundlepath = bundlepath.replace("/","\\")
|
if bundlepath:
|
||||||
|
bundlepath = bundlepath.replace("/","\\")
|
||||||
|
if thirdpartypath:
|
||||||
|
thirdpartypath = thirdpartypath.replace("/","\\")
|
||||||
|
|
||||||
if bundlepath:
|
if bundlepath:
|
||||||
plugin_directories.append(bundlepath)
|
plugin_directories.append(bundlepath)
|
||||||
|
@ -234,6 +240,9 @@ def LoadPlugins(bundlepath=None, userpath=None):
|
||||||
plugin_directories.append(userpath)
|
plugin_directories.append(userpath)
|
||||||
plugin_directories.append(os.path.join(userpath, 'plugins'))
|
plugin_directories.append(os.path.join(userpath, 'plugins'))
|
||||||
|
|
||||||
|
if thirdpartypath:
|
||||||
|
plugin_directories.append(thirdpartypath)
|
||||||
|
|
||||||
global PLUGIN_DIRECTORIES_SEARCH
|
global PLUGIN_DIRECTORIES_SEARCH
|
||||||
PLUGIN_DIRECTORIES_SEARCH=""
|
PLUGIN_DIRECTORIES_SEARCH=""
|
||||||
for plugins_dir in plugin_directories: # save search path list for later use
|
for plugins_dir in plugin_directories: # save search path list for later use
|
||||||
|
|
|
@ -38,7 +38,7 @@ void KIPYTHON_FRAME::SetupPythonEditor()
|
||||||
PyLOCK lock;
|
PyLOCK lock;
|
||||||
|
|
||||||
// Make sure the kicad_pyshell module is in the path
|
// Make sure the kicad_pyshell module is in the path
|
||||||
wxString sysPath = SCRIPTING::PyScriptingPath( false );
|
wxString sysPath = SCRIPTING::PyScriptingPath( SCRIPTING::PATH_TYPE::STOCK );
|
||||||
auto locals = pybind11::dict( "stock_path"_a = sysPath.ToStdString() );
|
auto locals = pybind11::dict( "stock_path"_a = sysPath.ToStdString() );
|
||||||
|
|
||||||
pybind11::exec( R"(
|
pybind11::exec( R"(
|
||||||
|
|
|
@ -209,7 +209,7 @@ bool SCRIPTING::scriptingSetup()
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
wxFileName path( PyPluginsPath( true ) + wxT( "/" ) );
|
wxFileName path( PyPluginsPath( SCRIPTING::PATH_TYPE::USER ) + wxT( "/" ) );
|
||||||
|
|
||||||
// Ensure the user plugin path exists, and create it if not.
|
// Ensure the user plugin path exists, and create it if not.
|
||||||
// However, if it cannot be created, this is not a fatal error.
|
// However, if it cannot be created, this is not a fatal error.
|
||||||
|
@ -452,18 +452,25 @@ wxString PyErrStringWithTraceback()
|
||||||
/**
|
/**
|
||||||
* Find the Python scripting path.
|
* Find the Python scripting path.
|
||||||
*/
|
*/
|
||||||
wxString SCRIPTING::PyScriptingPath( bool aUserPath )
|
wxString SCRIPTING::PyScriptingPath( PATH_TYPE aPathType )
|
||||||
{
|
{
|
||||||
wxString path;
|
wxString path;
|
||||||
|
|
||||||
//@todo This should this be a user configurable variable eg KISCRIPT?
|
//@todo This should this be a user configurable variable eg KISCRIPT?
|
||||||
if( aUserPath )
|
switch( aPathType )
|
||||||
{
|
{
|
||||||
path = PATHS::GetUserScriptingPath();
|
case STOCK: path = PATHS::GetStockScriptingPath(); break;
|
||||||
}
|
case USER: path = PATHS::GetUserScriptingPath(); break;
|
||||||
else
|
case THIRDPARTY:
|
||||||
{
|
const ENV_VAR_MAP& env = Pgm().GetLocalEnvVariables();
|
||||||
path = PATHS::GetStockScriptingPath();
|
auto it = env.find( "KICAD6_3RD_PARTY" );
|
||||||
|
|
||||||
|
if( it != env.end() && !it->second.GetValue().IsEmpty() )
|
||||||
|
path = it->second.GetValue();
|
||||||
|
else
|
||||||
|
path = PATHS::GetDefault3rdPartyPath();
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxFileName scriptPath( path );
|
wxFileName scriptPath( path );
|
||||||
|
@ -479,9 +486,9 @@ wxString SCRIPTING::PyScriptingPath( bool aUserPath )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
wxString SCRIPTING::PyPluginsPath( bool aUserPath )
|
wxString SCRIPTING::PyPluginsPath( PATH_TYPE aPathType )
|
||||||
{
|
{
|
||||||
// Note we are using unix path separator, because window separator sometimes
|
// Note we are using unix path separator, because window separator sometimes
|
||||||
// creates issues when passing a command string to a python method by PyRun_SimpleString
|
// creates issues when passing a command string to a python method by PyRun_SimpleString
|
||||||
return PyScriptingPath( aUserPath ) + '/' + "plugins";
|
return PyScriptingPath( aPathType ) + '/' + "plugins";
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,8 +59,15 @@ public:
|
||||||
|
|
||||||
static bool IsModuleLoaded( std::string& aModule );
|
static bool IsModuleLoaded( std::string& aModule );
|
||||||
|
|
||||||
static wxString PyScriptingPath( bool aUserPath = false );
|
enum PATH_TYPE
|
||||||
static wxString PyPluginsPath( bool aUserPath = false );
|
{
|
||||||
|
STOCK,
|
||||||
|
USER,
|
||||||
|
THIRDPARTY
|
||||||
|
};
|
||||||
|
|
||||||
|
static wxString PyScriptingPath( PATH_TYPE aPathType = STOCK );
|
||||||
|
static wxString PyPluginsPath( PATH_TYPE aPathType = STOCK );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue