31 #include <wx/dynlib.h> 32 #include <wx/filename.h> 34 #include <wx/stdpaths.h> 35 #include <wx/string.h> 52 #define MASK_3D_PLUGINMGR "3D_PLUGIN_MANAGER" 66 std::multimap< const wxString, KICAD_PLUGIN_LDR_3D* >::const_iterator sM =
m_ExtMap.begin();
67 std::multimap< const wxString, KICAD_PLUGIN_LDR_3D* >::const_iterator eM =
m_ExtMap.end();
73 sM->second->GetKicadPluginName() );
87 std::list< wxString >::const_iterator sFF =
m_FileFilters.begin();
88 std::list< wxString >::const_iterator eFF =
m_FileFilters.end();
107 std::list< KICAD_PLUGIN_LDR_3D* >::iterator sP =
m_Plugins.begin();
108 std::list< KICAD_PLUGIN_LDR_3D* >::iterator eP =
m_Plugins.end();
123 std::list< wxString > searchpaths;
124 std::list< wxString > pluginlist;
131 fn.Assign( wxStandardPaths::Get().GetExecutablePath() );
132 fn.AppendDir( wxT(
".." ) );
133 fn.AppendDir( wxT(
"plugins" ) );
134 fn.AppendDir( wxT(
"3d" ) );
136 std::string testpath = std::string( fn.GetPathWithSep().ToUTF8() );
140 wxDir debugPluginDir;
143 debugPluginDir.Open( testpath );
145 if( debugPluginDir.IsOpened() && debugPluginDir.GetFirst( &subdir, wxEmptyString, wxDIR_DIRS ) )
149 while( debugPluginDir.GetNext( &subdir ) )
155 checkPluginPath( std::string( fn.GetPathWithSep().ToUTF8() ), searchpaths );
165 checkPluginPath( PATHS::GetOSXKicadUserDataDir() + wxT(
"/PlugIns/3d" ), searchpaths );
168 checkPluginPath( PATHS::GetOSXKicadMachineDataDir() + wxT(
"/PlugIns/3d" ), searchpaths );
176 std::list< wxString >::iterator sPL = searchpaths.begin();
177 std::list< wxString >::iterator ePL = searchpaths.end();
182 __FILE__, __FUNCTION__, __LINE__, (*sPL).ToUTF8() );
188 if( pluginlist.empty() )
191 sPL = pluginlist.begin();
192 ePL = pluginlist.end();
198 if( pp->
Open( sPL->ToUTF8() ) )
201 __FILE__, __FUNCTION__, __LINE__ );
207 __FILE__, __FUNCTION__, __LINE__, nf );
209 for(
int i = 0; i < nf; ++i )
225 __FILE__, __FUNCTION__, __LINE__ );
234 __FILE__, __FUNCTION__, __LINE__ );
250 nameFilter = wxT(
"*" );
253 nameFilter.Append( wxDynamicLibrary::GetDllExt( wxDL_MODULE ) );
260 nameFilter.Append(
".so" );
263 wxString lp = wd.GetNameWithSep();
265 if( wd.GetFirst( &lName, nameFilter, wxDIR_FILES ) )
270 while( wd.GetNext( &lName ) )
282 std::list< wxString >& aPluginList )
286 if( aPath.empty() || !wxFileName::FileExists( aPath ) )
294 wxString wxpath =
path.GetFullPath();
295 std::list< wxString >::iterator bl = aPluginList.begin();
296 std::list< wxString >::iterator el = aPluginList.end();
300 if( 0 == (*bl).Cmp( wxpath ) )
306 aPluginList.push_back( wxpath );
308 wxLogTrace(
MASK_3D_PLUGINMGR, wxT(
" * [INFO] found 3D plugin '%s'\n" ), wxpath.GetData() );
313 std::list< wxString >& aSearchList )
319 wxLogTrace(
MASK_3D_PLUGINMGR, wxT(
" * [INFO] checking for 3D plugins in '%s'\n" ),
324 if( aPath.StartsWith( wxT(
"${" ) ) || aPath.StartsWith( wxT(
"$(" ) ) )
327 path.Assign( aPath, wxEmptyString );
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_to_find = raw.GetExt();
415 ext_to_find.MakeLower();
419 if( ext_to_find == wxT(
"gz" ) )
421 wxFileName second( raw.GetName() );
422 ext_to_find = second.GetExt() + wxT(
".gz" );
425 std::pair < std::multimap< const wxString, KICAD_PLUGIN_LDR_3D* >::iterator,
426 std::multimap< const wxString, KICAD_PLUGIN_LDR_3D* >::iterator > items;
428 items =
m_ExtMap.equal_range( ext_to_find );
429 std::multimap< const wxString, KICAD_PLUGIN_LDR_3D* >::iterator sL = items.first;
431 while( sL != items.second )
433 if( sL->second->CanRender() )
435 SCENEGRAPH* sp = sL->second->Load( aFileName.ToUTF8() );
439 sL->second->GetPluginInfo( aPluginInfo );
453 std::list< KICAD_PLUGIN_LDR_3D* >::iterator sP =
m_Plugins.begin();
454 std::list< KICAD_PLUGIN_LDR_3D* >::iterator eP =
m_Plugins.end();
457 __FILE__, __FUNCTION__, __LINE__, static_cast<int>(
m_Plugins.size() ) );
469 if(
nullptr == aTag || aTag[0] == 0 ||
m_Plugins.empty() )
472 std::string tname = aTag;
475 size_t cpos = tname.find(
':' );
478 if( cpos == std::string::npos || cpos == 0 )
481 pname = tname.substr( 0, cpos );
484 std::list< KICAD_PLUGIN_LDR_3D* >::iterator pS =
m_Plugins.begin();
485 std::list< KICAD_PLUGIN_LDR_3D* >::iterator pE =
m_Plugins.end();
490 (*pS)->GetPluginInfo( ptag );
494 if( !ptag.compare( 0, pname.size(), pname ) )
496 if( ptag.compare( tname ) )
void Close(void) override
Clean 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 plugins path.
bool Open(const wxString &aFullFileName) override
Open a plugin of the given class, performs version compatibility checks, and links all required funct...
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()