29#include <wx/stdpaths.h>
48#define MASK_3D_PLUGINMGR "3D_PLUGIN_MANAGER"
54 m_FileFilters.emplace_back(
_(
"All Files" ) + wxT(
" (*.*)|*.*" ) );
62 std::multimap< const wxString, KICAD_PLUGIN_LDR_3D* >::const_iterator sM =
m_ExtMap.begin();
63 std::multimap< const wxString, KICAD_PLUGIN_LDR_3D* >::const_iterator eM =
m_ExtMap.end();
69 sM->second->GetKicadPluginName() );
83 std::list< wxString >::const_iterator sFF =
m_FileFilters.begin();
84 std::list< wxString >::const_iterator eFF =
m_FileFilters.end();
103 std::list< KICAD_PLUGIN_LDR_3D* >::iterator sP =
m_Plugins.begin();
104 std::list< KICAD_PLUGIN_LDR_3D* >::iterator eP =
m_Plugins.end();
119 std::list<wxString> searchpaths;
120 std::list<wxString> pluginlist;
124 if( wxGetEnv( wxT(
"KICAD_RUN_FROM_BUILD_DIR" ),
nullptr ) )
127 fn.Assign( wxStandardPaths::Get().GetExecutablePath() );
128 fn.AppendDir( wxT(
".." ) );
129 fn.AppendDir( wxT(
"plugins" ) );
130 fn.AppendDir( wxT(
"3d" ) );
132 std::string testpath = std::string( fn.GetPathWithSep().ToUTF8() );
136 wxDir debugPluginDir;
139 debugPluginDir.Open( testpath );
141 if( debugPluginDir.IsOpened()
142 && debugPluginDir.GetFirst( &subdir, wxEmptyString, wxDIR_DIRS ) )
146 while( debugPluginDir.GetNext( &subdir ) )
152 checkPluginPath( std::string( fn.GetPathWithSep().ToUTF8() ), searchpaths );
154 if( wxGetEnv( wxT(
"KICAD_RUN_FROM_BUILD_DIR" ),
nullptr ) )
158 fn.Assign( wxStandardPaths::Get().GetExecutablePath() );
160 if( fn.GetName() == wxT(
"kicad" ) )
162 fn.AppendDir( wxT(
".." ) );
166 fn.AppendDir( wxT(
".." ) );
167 fn.AppendDir( wxT(
".." ) );
168 fn.AppendDir( wxT(
".." ) );
169 fn.AppendDir( wxT(
".." ) );
170 fn.AppendDir( wxT(
"kicad" ) );
171 fn.AppendDir( wxT(
"KiCad.app" ) );
172 fn.AppendDir( wxT(
"Contents" ) );
175 fn.AppendDir( wxT(
"PlugIns" ) );
176 fn.AppendDir( wxT(
"3d" ) );
179 std::string testpath = std::string( fn.GetPathWithSep().ToUTF8() );
189 checkPluginPath( PATHS::GetOSXKicadMachineDataDir() + wxT(
"/PlugIns/3d" ), searchpaths );
197 std::list< wxString >::iterator sPL = searchpaths.begin();
198 std::list< wxString >::iterator ePL = searchpaths.end();
203 __FILE__, __FUNCTION__, __LINE__, (*sPL).ToUTF8() );
209 if( pluginlist.empty() )
212 sPL = pluginlist.begin();
213 ePL = pluginlist.end();
219 if( pp->
Open( sPL->ToUTF8() ) )
222 __FILE__, __FUNCTION__, __LINE__ );
228 __FILE__, __FUNCTION__, __LINE__, nf );
230 for(
int i = 0; i < nf; ++i )
246 __FILE__, __FUNCTION__, __LINE__ );
255 __FILE__, __FUNCTION__, __LINE__ );
271 nameFilter = wxT(
"*" );
274 nameFilter.Append( wxDynamicLibrary::GetDllExt( wxDL_MODULE ) );
281 nameFilter.Append( wxS(
".so" ) );
284 wxString lp = wd.GetNameWithSep();
286 if( wd.GetFirst( &lName, nameFilter, wxDIR_FILES ) )
291 while( wd.GetNext( &lName ) )
303 std::list< wxString >& aPluginList )
307 if( aPath.empty() || !wxFileName::FileExists( aPath ) )
315 wxString wxpath =
path.GetFullPath();
316 std::list< wxString >::iterator bl = aPluginList.begin();
317 std::list< wxString >::iterator el = aPluginList.end();
321 if( 0 == (*bl).Cmp( wxpath ) )
328 if( wxGetEnv( wxT(
"KICAD_RUN_FROM_BUILD_DIR" ),
nullptr ) )
330 if( !
path.GetName().StartsWith(
"s3d_plugin" )
331 && !
path.GetName().StartsWith(
"libs3d_plugin" ) )
337 aPluginList.push_back( wxpath );
339 wxLogTrace(
MASK_3D_PLUGINMGR, wxT(
" * [INFO] found 3D plugin '%s'\n" ), wxpath.GetData() );
344 std::list< wxString >& aSearchList )
349 wxLogTrace(
MASK_3D_PLUGINMGR, wxT(
" * [INFO] checking if valid plugin directory '%s'\n" ),
353 path.AssignDir( aPath );
356 if( !wxFileName::DirExists(
path.GetFullPath() ) )
360 wxString wxpath =
path.GetFullPath();
361 std::list< wxString >::iterator bl = aSearchList.begin();
362 std::list< wxString >::iterator el = aSearchList.end();
366 if( 0 == (*bl).Cmp( wxpath ) )
372 aSearchList.push_back( wxpath );
379 if( aFilterString.empty() )
387 if( 0 == (*sFF).Cmp( aFilterString ) )
401 if(
nullptr == aPlugin )
407 __FILE__, __FUNCTION__, __LINE__, nExt );
409 for(
int i = 0; i < nExt; ++i )
434 wxFileName raw( aFileName );
435 wxString ext_to_find = raw.GetExt();
440 ext_to_find.MakeLower();
445 if( ext_to_find == wxT(
"gz" ) )
447 wxFileName second( raw.GetName() );
448 ext_to_find = second.GetExt() + wxT(
".gz" );
451 std::pair < std::multimap< const wxString, KICAD_PLUGIN_LDR_3D* >::iterator,
452 std::multimap< const wxString, KICAD_PLUGIN_LDR_3D* >::iterator > items;
454 items =
m_ExtMap.equal_range( ext_to_find );
455 std::multimap< const wxString, KICAD_PLUGIN_LDR_3D* >::iterator sL = items.first;
457 while( sL != items.second )
459 if( sL->second->CanRender() )
461 SCENEGRAPH* sp = sL->second->Load( aFileName.ToUTF8() );
465 sL->second->GetPluginInfo( aPluginInfo );
479 std::list< KICAD_PLUGIN_LDR_3D* >::iterator sP =
m_Plugins.begin();
480 std::list< KICAD_PLUGIN_LDR_3D* >::iterator eP =
m_Plugins.end();
483 __FILE__, __FUNCTION__, __LINE__,
static_cast<int>(
m_Plugins.size() ) );
495 if(
nullptr == aTag || aTag[0] == 0 ||
m_Plugins.empty() )
498 std::string tname = aTag;
501 size_t cpos = tname.find(
':' );
504 if( cpos == std::string::npos || cpos == 0 )
507 pname = tname.substr( 0, cpos );
510 std::list< KICAD_PLUGIN_LDR_3D* >::iterator pS =
m_Plugins.begin();
511 std::list< KICAD_PLUGIN_LDR_3D* >::iterator pE =
m_Plugins.end();
516 (*pS)->GetPluginInfo( ptag );
519 if( !ptag.compare( 0, pname.size(), pname ) )
521 if( ptag.compare( tname ) )
Describe the runtime-loadable interface to support loading and parsing of 3D models.
bool Open(const wxString &aFullFileName) override
Open a plugin of the given class, performs version compatibility checks, and links all required funct...
char const * GetFileFilter(int aIndex)
char const * GetModelExtension(int aIndex)
void Close(void) override
Clean up and closes/unloads the plugin.
static wxString GetStockPlugins3DPath()
Gets the stock (install) 3d viewer plugins path.
void addFilterString(const wxString &aFilterString)
add an entry to the file filter list
std::list< wxString > m_FileFilters
list of file filters
std::list< KICAD_PLUGIN_LDR_3D * > m_Plugins
list of discovered plugins
void ClosePlugins(void)
Iterate through all discovered plugins and closes them to reclaim memory.
virtual ~S3D_PLUGIN_MANAGER()
void loadPlugins(void)
load plugins
SCENEGRAPH * Load3DModel(const wxString &aFileName, std::string &aPluginInfo)
void checkPluginPath(const wxString &aPath, std::list< wxString > &aSearchList)
check the existence of a path and add it to the path search list
void listPlugins(const wxString &aPath, std::list< wxString > &aPluginList)
list potential plugins
std::list< wxString > const * GetFileFilters(void) const noexcept
Return the list of file filters; this will contain at least the default "All Files (*....
void checkPluginName(const wxString &aPath, std::list< wxString > &aPluginList)
check the existence of a plugin name and add it to the list
std::multimap< const wxString, KICAD_PLUGIN_LDR_3D * > m_ExtMap
mapping of extensions to available plugins
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...
void addExtensionMap(KICAD_PLUGIN_LDR_3D *aPlugin)
add entries to the extension map
Define the basic data set required to represent a 3D model.
const wxString ExpandEnvVarSubstitutions(const wxString &aString, const PROJECT *aProject)
Replace any environment variable & text variable references with their values.
#define MASK_3D_PLUGINMGR
Flag to enable 3D plugin manager debug tracing.
#define FN_NORMALIZE_FLAGS
Default flags to pass to wxFileName::Normalize().