31 #include <wx/dynlib.h> 32 #include <wx/filename.h> 34 #include <wx/stdpaths.h> 35 #include <wx/string.h> 53 #define MASK_3D_PLUGINMGR "3D_PLUGIN_MANAGER" 67 std::multimap< const wxString, KICAD_PLUGIN_LDR_3D* >::const_iterator sM =
m_ExtMap.begin();
68 std::multimap< const wxString, KICAD_PLUGIN_LDR_3D* >::const_iterator eM =
m_ExtMap.end();
74 sM->second->GetKicadPluginName() );
88 std::list< wxString >::const_iterator sFF =
m_FileFilters.begin();
89 std::list< wxString >::const_iterator eFF =
m_FileFilters.end();
108 std::list< KICAD_PLUGIN_LDR_3D* >::iterator sP =
m_Plugins.begin();
109 std::list< KICAD_PLUGIN_LDR_3D* >::iterator eP =
m_Plugins.end();
124 std::list< wxString > searchpaths;
125 std::list< wxString > pluginlist;
132 fn.Assign( wxStandardPaths::Get().GetExecutablePath() );
133 fn.AppendDir( wxT(
".." ) );
134 fn.AppendDir( wxT(
"plugins" ) );
135 fn.AppendDir( wxT(
"3d" ) );
137 std::string testpath = std::string( fn.GetPathWithSep().ToUTF8() );
141 wxDir debugPluginDir;
144 debugPluginDir.Open( testpath );
146 if( debugPluginDir.IsOpened() && debugPluginDir.GetFirst( &subdir, wxEmptyString, wxDIR_DIRS ) )
150 while( debugPluginDir.GetNext( &subdir ) )
156 checkPluginPath( std::string( fn.GetPathWithSep().ToUTF8() ), searchpaths );
166 checkPluginPath( PATHS::GetOSXKicadUserDataDir() + wxT(
"/PlugIns/3d" ), searchpaths );
169 checkPluginPath( PATHS::GetOSXKicadMachineDataDir() + wxT(
"/PlugIns/3d" ), searchpaths );
177 std::list< wxString >::iterator sPL = searchpaths.begin();
178 std::list< wxString >::iterator ePL = searchpaths.end();
183 __FILE__, __FUNCTION__, __LINE__, (*sPL).ToUTF8() );
189 if( pluginlist.empty() )
192 sPL = pluginlist.begin();
193 ePL = pluginlist.end();
199 if( pp->
Open( sPL->ToUTF8() ) )
202 __FILE__, __FUNCTION__, __LINE__ );
208 __FILE__, __FUNCTION__, __LINE__, nf );
210 for(
int i = 0; i < nf; ++i )
226 __FILE__, __FUNCTION__, __LINE__ );
235 __FILE__, __FUNCTION__, __LINE__ );
251 nameFilter = wxT(
"*" );
254 nameFilter.Append( wxDynamicLibrary::GetDllExt( wxDL_MODULE ) );
261 nameFilter.Append(
".so" );
264 wxString lp = wd.GetNameWithSep();
266 if( wd.GetFirst( &lName, nameFilter, wxDIR_FILES ) )
271 while( wd.GetNext( &lName ) )
283 std::list< wxString >& aPluginList )
287 if( aPath.empty() || !wxFileName::FileExists( aPath ) )
295 wxString wxpath =
path.GetFullPath();
296 std::list< wxString >::iterator bl = aPluginList.begin();
297 std::list< wxString >::iterator el = aPluginList.end();
301 if( 0 == (*bl).Cmp( wxpath ) )
307 aPluginList.push_back( wxpath );
309 wxLogTrace(
MASK_3D_PLUGINMGR,
" * [INFO] found 3D plugin '%s'\n", wxpath.GetData() );
314 std::list< wxString >& aSearchList )
320 wxLogTrace(
MASK_3D_PLUGINMGR,
" * [INFO] checking for 3D plugins in '%s'\n", aPath.GetData() );
324 if( aPath.StartsWith(
"${" ) || aPath.StartsWith(
"$(" ) )
327 path.Assign( aPath,
"" );
331 if( !wxFileName::DirExists(
path.GetFullPath() ) )
335 wxString wxpath =
path.GetFullPath();
336 std::list< wxString >::iterator bl = aSearchList.begin();
337 std::list< wxString >::iterator el = aSearchList.end();
341 if( 0 == (*bl).Cmp( wxpath ) )
347 aSearchList.push_back( wxpath );
354 if( aFilterString.empty() )
362 if( 0 == (*sFF).Cmp( aFilterString ) )
376 if(
nullptr == aPlugin )
382 __FILE__, __FUNCTION__, __LINE__, nExt );
384 for(
int i = 0; i < nExt; ++i )
390 ws = wxString::FromUTF8Unchecked( cp );
394 m_ExtMap.insert( std::pair< const wxString, KICAD_PLUGIN_LDR_3D* >( ws, aPlugin ) );
403 return &m_FileFilters;
409 wxFileName raw( aFileName );
410 wxString ext = raw.GetExt();
418 std::pair < std::multimap< const wxString, KICAD_PLUGIN_LDR_3D* >::iterator,
419 std::multimap< const wxString, KICAD_PLUGIN_LDR_3D* >::iterator > items;
421 items =
m_ExtMap.equal_range( ext );
422 std::multimap< const wxString, KICAD_PLUGIN_LDR_3D* >::iterator sL = items.first;
424 while( sL != items.second )
426 if( sL->second->CanRender() )
428 SCENEGRAPH* sp = sL->second->Load( aFileName.ToUTF8() );
432 sL->second->GetPluginInfo( aPluginInfo );
446 std::list< KICAD_PLUGIN_LDR_3D* >::iterator sP =
m_Plugins.begin();
447 std::list< KICAD_PLUGIN_LDR_3D* >::iterator eP =
m_Plugins.end();
450 __FILE__, __FUNCTION__, __LINE__, static_cast<int>(
m_Plugins.size() ) );
462 if(
nullptr == aTag || aTag[0] == 0 ||
m_Plugins.empty() )
465 std::string tname = aTag;
468 size_t cpos = tname.find(
':' );
471 if( cpos == std::string::npos || cpos == 0 )
474 pname = tname.substr( 0, cpos );
477 std::list< KICAD_PLUGIN_LDR_3D* >::iterator pS =
m_Plugins.begin();
478 std::list< KICAD_PLUGIN_LDR_3D* >::iterator pE =
m_Plugins.end();
483 (*pS)->GetPluginInfo( ptag );
487 if( !ptag.compare( 0, pname.size(), pname ) )
489 if( ptag.compare( tname ) )
void Close(void) override
Function Close cleans up and closes/unloads the plugin.
std::list< wxString > m_FileFilters
list of file filters
std::multimap< const wxString, KICAD_PLUGIN_LDR_3D * > m_ExtMap
mapping of extensions to available plugins
static wxString GetStockPlugins3DPath()
Gets the stock (install) 3d viewer pluginspath.
bool Open(const wxString &aFullFileName) override
Function Open opens a plugin of the given class, performs version compatibility checks,...
const wxString ExpandEnvVarSubstitutions(const wxString &aString, PROJECT *aProject)
Replace any environment variable & text variable references with their values.
void addFilterString(const wxString &aFilterString)
add an entry to the file filter list
describes the runtime-loadable interface to support loading and parsing of 3D models.
SCENEGRAPH * Load3DModel(const wxString &aFileName, std::string &aPluginInfo)
void listPlugins(const wxString &aPath, std::list< wxString > &aPluginList)
list potential plugins
static wxString GetUserPlugins3DPath()
Gets the user path for 3d viewer plugin.
std::list< KICAD_PLUGIN_LDR_3D * > m_Plugins
list of discovered plugins
char const * GetFileFilter(int aIndex)
#define MASK_3D_PLUGINMGR
Flag to enable 3D plugin manager debug tracing.
void checkPluginPath(const wxString &aPath, std::list< wxString > &aSearchList)
check the existence of a path and add it to the path search list
char const * GetModelExtension(int aIndex)
bool CheckTag(const char *aTag)
Check the given tag and returns true if the plugin named in the tag is not loaded or the plugin is lo...
std::list< wxString > const * GetFileFilters(void) const noexcept
Return the list of file filters; this will contain at least the default "All Files (*....
void addExtensionMap(KICAD_PLUGIN_LDR_3D *aPlugin)
add entries to the extension map
void loadPlugins(void)
load plugins
void ClosePlugins(void)
Iterate through all discovered plugins and closes them to reclaim memory.
Define the basic data set required to represent a 3D model.
void checkPluginName(const wxString &aPath, std::list< wxString > &aPluginList)
check the existence of a plugin name and add it to the list
virtual ~S3D_PLUGIN_MANAGER()