我们先看看Plugin类的继承图,看看到底都有些什么插件,然后在分析一般性的插件加载全过程。 
哦,原来这么多插件,我们要基于WW开发自己的应用,只需继承Plugin类写出自己的插件功能即可的。 我们现在分析插件加载过程,请确保你看过WorldWind学习系列二:擒贼先擒王篇2 中的(5.加载上次使用的配置信息)。加载的插件入口就是WorldWind.cs的Main()中调用的LoadSettings()静态方法。 1.读取WorldWind的配置中插件信息 加载WorldWind配置 private static void LoadSettings()
{
try
{
//先读取上次使用时保存的“使用插件配置文件”,如果存在,则从文件中读取配置实例化WorldWindSettings
Settings = (WorldWindSettings) SettingsBase.Load(Settings, SettingsBase.LocationType.User);
if(!File.Exists(Settings.FileName))
{
//我们假定是配置文件不存在,这就是一个个地加载插件,保存到ArrayList中
Settings.PluginsLoadedOnStartup.Add("ShapeFileInfoTool");
//Settings.PluginsLoadedOnStartup.Add("OverviewFormLoader");
//Settings.PluginsLoadedOnStartup.Add("Atmosphere");
Settings.PluginsLoadedOnStartup.Add("SkyGradient");
Settings.PluginsLoadedOnStartup.Add("BmngLoader");
//Settings.PluginsLoadedOnStartup.Add("Compass");
//Settings.PluginsLoadedOnStartup.Add("ExternalLayerManagerLoader");
Settings.PluginsLoadedOnStartup.Add("MeasureTool");
//Settings.PluginsLoadedOnStartup.Add("MovieRecorder");
Settings.PluginsLoadedOnStartup.Add("NRLWeatherLoader");
Settings.PluginsLoadedOnStartup.Add("ShapeFileLoader");
Settings.PluginsLoadedOnStartup.Add("Stars3D");
Settings.PluginsLoadedOnStartup.Add("GlobalClouds");
Settings.PluginsLoadedOnStartup.Add("PlaceFinderLoader");
Settings.PluginsLoadedOnStartup.Add("LightController");
Settings.PluginsLoadedOnStartup.Add("Earthquake_2.0.2.1");
Settings.PluginsLoadedOnStartup.Add("Historical_Earthquake_2.0.2.2");
Settings.PluginsLoadedOnStartup.Add("KMLImporter");
//Settings.PluginsLoadedOnStartup.Add("doublezoom");
//Settings.PluginsLoadedOnStartup.Add("PlanetaryRings");
Settings.PluginsLoadedOnStartup.Add("TimeController");
//Settings.PluginsLoadedOnStartup.Add("WavingFlags");
Settings.PluginsLoadedOnStartup.Add("ScaleBarLegend");
Settings.PluginsLoadedOnStartup.Add("Compass3D");
Settings.PluginsLoadedOnStartup.Add("AnaglyphStereo");
Settings.PluginsLoadedOnStartup.Add("GlobeIcon");
}
// decrypt encoded user credentials
DataProtector dp = new DataProtector(DataProtector.Store.USE_USER_STORE);
if(Settings.ProxyUsername.Length > 0) Settings.ProxyUsername = dp.TransparentDecrypt(Settings.ProxyUsername);
if(Settings.ProxyPassword.Length > 0) Settings.ProxyPassword = dp.TransparentDecrypt(Settings.ProxyPassword);
}
catch(Exception caught)
{
Log.Write(caught);
}
}
2.Main()中后面调用MainApplication()方法,该MainApplication()调用 OpenStartupWorld(),用来初始化启动World对象。OpenStartupWorld()方法首先确定加载的是Earth/Moon 等,然后开始加载一个星球。 加载一个星球代码 ///
/// Loads a new planet
///
private void OpenWorld(string worldXmlFile)
{
if(this.worldWindow.CurrentWorld != null)
{
try
{
this.worldWindow.ResetToolbar();
}
catch
{}
try
{
foreach(PluginInfo p in this.compiler.Plugins)
{
try
{
if(p.Plugin.IsLoaded)
p.Plugin.Unload();
}
catch
{}
}
}
catch
{}
try
{
this.worldWindow.CurrentWorld.Dispose();
|