public void CreateDemTileCreatorTest() { MockClasses.MockElevationMap map = new MockClasses.MockElevationMap(); ITileCreator demTileCreator = TileCreatorFactory.CreateDemTileCreator(map, ProjectionTypes.Mercator, Environment.CurrentDirectory); // Validate Mercator file Assert.AreEqual(ProjectionTypes.Mercator, demTileCreator.ProjectionType); }
public GameDataViewModel(GameData data, ITileCreator creator,SteamAPI steamAPI) : base(data, creator) { _steamAPI = steamAPI; UpdateImageFromSteamCommand= new LabeledRelayCommand("Update image from Steam", () => UpdateImageFromSteam(), () => Model != null); UpdateIsInstalledCommand = new LabeledRelayCommand("Update Installation status", () => UpdateIsInstalled(), () => Model != null); }
/// <summary> /// Processes the input equirectangular image. /// </summary> /// <param name="inputImage"> /// Input image path. /// </param> /// <param name="outputDir"> /// Output directory where pyramid is generated. /// </param> /// <param name="projection"> /// Projection type. /// </param> private static void ProcessEquirectangularImage(string inputImage, string outputDir, ProjectionTypes projection) { Trace.TraceInformation("{0}: Reading image..", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); ImageFormat imageFormat = ImageFormat.Png; // Set the grid boundaries var imageBoundary = new Boundary(-180, -90, 180, 90); // Build an image grid using the input image var imageGrid = new ImageGrid(inputImage, true); // Build the grid map for equirectangular projection using the image grid and boundary co-ordinates var equirectangularGridMap = new EquirectangularGridMap(imageGrid, imageBoundary); // Build the color map using equirectangular projection grid map var imageColorMap = new ImageColorMap(equirectangularGridMap); var maximumLevelsOfDetail = TileHelper.CalculateMaximumLevel(imageGrid.Height, imageGrid.Width, imageBoundary); // Define ITileCreator instance for creating image tiles. ITileCreator tileCreator = TileCreatorFactory.CreateImageTileCreator(imageColorMap, projection, outputDir); // Define plumbing for looping through all the tiles to be created for base image and pyramid. var tileGenerator = new TileGenerator(tileCreator); // Start building base image and the pyramid. Trace.TraceInformation("{0}: Building base and parent levels...", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); tileGenerator.Generate(maximumLevelsOfDetail); string fileName = Path.GetFileNameWithoutExtension(inputImage); // Generate Plate file. Trace.TraceInformation("{0}: Building Plate file...", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); ImageTileSerializer pyramid = new ImageTileSerializer(TileHelper.GetDefaultImageTilePathTemplate(outputDir), ImageFormat.Png); PlateFileGenerator plateGenerator = new PlateFileGenerator( Path.Combine(outputDir, fileName + ".plate"), maximumLevelsOfDetail, ImageFormat.Png); plateGenerator.CreateFromImageTile(pyramid); // Generate Thumbnail Images. Trace.TraceInformation("{0}: Building Thumbnail image..", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); string thumbnailFile = Path.Combine(outputDir, fileName + ".jpeg"); TileHelper.GenerateThumbnail(inputImage, 96, 45, thumbnailFile, ImageFormat.Jpeg); // Get the path of image tiles created and save it in WTML file. Trace.TraceInformation("{0}: Building WTML file..", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); string pyramidPath = WtmlCollection.GetWtmlTextureTilePath(TileHelper.GetDefaultImageTilePathTemplate(outputDir), imageFormat.ToString()); // Create and save WTML collection file. WtmlCollection wtmlCollection = new WtmlCollection(fileName, thumbnailFile, pyramidPath, maximumLevelsOfDetail, projection); string path = Path.Combine(outputDir, fileName + ".wtml"); wtmlCollection.Save(path); Trace.TraceInformation("{0}: Collection successfully generated.", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); }
public void CreateDemTileCreatorWithSerializerTest() { MockClasses.MockElevationMap map = new MockClasses.MockElevationMap(); MockClasses.MockDemTileSerializer mockSerializer = new MockClasses.MockDemTileSerializer(); ITileCreator demTileCreator = TileCreatorFactory.CreateDemTileCreator(map, ProjectionTypes.Toast, mockSerializer); // Validate Mercator file Assert.AreEqual(ProjectionTypes.Toast, demTileCreator.ProjectionType); }
public GameDataViewModel(GameData data, ITileCreator creator, SteamAPI steamAPI) : base(data, creator) { _steamAPI = steamAPI; UpdateImageFromSteamCommand = new LabeledRelayCommand("Update image from Steam", () => UpdateImageFromSteam(), () => Model != null); UpdateIsInstalledCommand = new LabeledRelayCommand("Update Installation status", () => UpdateIsInstalled(), () => Model != null); }
/// <summary> /// Initializes a new instance of the TileGenerator class. /// </summary> /// <param name="creator"> /// TileCreator object to be used. /// </param> public TileGenerator(ITileCreator creator) { if (creator == null) { throw new ArgumentNullException("creator"); } this.ParallelOptions = new ParallelOptions(); this.tileCreator = creator; }
/// <summary> /// Initializes a new instance of the TileGenerator class. /// </summary> /// <param name="creator"> /// TileCreator object to be used. /// </param> public TileGenerator(ITileCreator creator) { if (creator == null) { throw new ArgumentNullException("creator"); } this.ParallelOptions = new ParallelOptions(); this.tileCreator = creator; }
public TileCreator(ILoggerFacade logger) { logger.Log($"Windows Version : {Environment.OSVersion.Version}",Category.Info,Priority.High); if (Environment.OSVersion.Version.Build >= 10586) Creator = new Win10TP2TileCreator(logger); else Creator = null; if (Creator == null) throw new InvalidOperationException("This version of Windows does not support creating Tiles!"); }
public TileDataViewModel(TileData data,ITileCreator creator) { Model = data; TileCreator = creator; UpdateAvailableLinkTypes(); var dataChanged = (data as INotifyPropertyChanged); if(dataChanged!= null) { dataChanged.PropertyChanged += (o, e) => { UpdateAvailableLinkTypes(); }; } }
public TileDataViewModel(TileData data, ITileCreator creator) { Model = data; TileCreator = creator; UpdateAvailableLinkTypes(); var dataChanged = (data as INotifyPropertyChanged); if (dataChanged != null) { dataChanged.PropertyChanged += (o, e) => { UpdateAvailableLinkTypes(); }; } }
/// <summary> /// Processes the input equirectangular dataset. /// </summary> /// <param name="inputFile"> /// Input File path. /// </param> /// <param name="outputDir"> /// Output directory where pyramid is generated. /// </param> /// <param name="colorMapPath"> /// Map of color map file. /// </param> /// <param name="orientation"> /// Orientation of color map file. /// </param> /// <param name="projection"> /// Projection type. /// </param> public static void ProcessEquirectangularGrid(string inputFile, string outputDir, string colorMapPath, ColorMapOrientation orientation, ProjectionTypes projection) { Trace.TraceInformation("{0}: Reading input dataset...", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); // Get grid details from the input file var dataGridDetails = DataGridHelper.LoadFromFile(inputFile); // Populate the data grid using grid details var dataGrid = new DataGrid(dataGridDetails.Data, true); // Build a equirectangular projection grid map using the data grid and boundary details var equirectangularGridMap = new EquirectangularGridMap(dataGrid, dataGridDetails.Boundary); // Build a color map using equirectangular projection grid map var dataColorMap = new DataColorMap(colorMapPath, equirectangularGridMap, orientation, dataGridDetails.MinimumThreshold, dataGridDetails.MaximumThreshold); // Define an instance of ITileCreator to create image tiles. ITileCreator imageTileCreator = TileCreatorFactory.CreateImageTileCreator(dataColorMap, projection, outputDir); Trace.TraceInformation("{0}: Building base and parent levels...", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); TileGenerator tileGenerator = new TileGenerator(imageTileCreator); int zoomLevels = 5; tileGenerator.Generate(zoomLevels); string fileName = Path.GetFileNameWithoutExtension(inputFile); // Generate Thumbnail Images. Trace.TraceInformation("{0}: Building Thumbnail image..", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); ImageTileSerializer tileSerializer = new ImageTileSerializer(TileHelper.GetDefaultImageTilePathTemplate(outputDir), ImageFormat.Png); string thumbnailFile = Path.Combine(outputDir, fileName + ".jpeg"); TileHelper.GenerateThumbnail(tileSerializer.GetFileName(0, 0, 0), 96, 45, thumbnailFile, ImageFormat.Jpeg); // Create and save WTML file. Trace.TraceInformation("{0}: Generating WTML file...", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); string textureTilePath = WtmlCollection.GetWtmlTextureTilePath(TileHelper.GetDefaultImageTilePathTemplate(outputDir), ImageFormat.Png.ToString()); WtmlCollection wtmlCollection = new WtmlCollection(fileName, thumbnailFile, textureTilePath, zoomLevels, projection); wtmlCollection.IsElevationModel = false; string path = Path.Combine(outputDir, fileName + ".wtml"); wtmlCollection.Save(path); Trace.TraceInformation("{0}: Collection successfully generated.", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); }
public TileCreator(ILoggerFacade logger) { logger.Log($"Windows Version : {Environment.OSVersion.Version}", Category.Info, Priority.High); if (Environment.OSVersion.Version.Build >= 10586) { Creator = new Win10TP2TileCreator(logger); } else { Creator = null; } if (Creator == null) { throw new InvalidOperationException("This version of Windows does not support creating Tiles!"); } }
public override T GetTile <T>(ITileCreator <T> t) { return(t.GetTile(this)); }
/// <summary> /// Processes a list of input image tiles and generates pyramid for level N. /// </summary> /// <param name="inputFilePath">Xml file with list of image tile information.</param> /// <param name="outputDir">Output directory where the image tiles of pyramid has to be stored.</param> /// <param name="projection">Projection to be used.</param> /// <param name="inputBoundary">Input image boundary.</param> private static void ProcessMultipartEquirectangularImage(string inputFilePath, string outputDir, ProjectionTypes projection, Boundary inputBoundary) { ImageFormat imageFormat = ImageFormat.Png; Trace.TraceInformation("{0}: Reading image..", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); // Get the list of equirectangular images input. string[,] imageTiles = Program.GetInputImageList(inputFilePath); // Check if the image is circular. double longitudeDelta = inputBoundary.Right - inputBoundary.Left; bool circular = (360.0 - longitudeDelta) < 0.000001; // Build an image grid using the input images var imageGrid = new ImageGrid(imageTiles, circular); // Build the grid map for equirectangular projection using the image grid and boundary co-ordinates var equirectangularGridMap = new EquirectangularGridMap(imageGrid, inputBoundary); // Build the color map using equirectangular projection grid map var imageColorMap = new ImageColorMap(equirectangularGridMap); var maximumLevelsOfDetail = TileHelper.CalculateMaximumLevel(imageGrid.Height, imageGrid.Width, inputBoundary); // Define ITileCreator instance for creating image tiles. ITileCreator tileCreator = TileCreatorFactory.CreateImageTileCreator(imageColorMap, projection, outputDir); // Define bounds of the image. Image is assumed to cover the entire world. // If not, change the coordinates accordingly. // For Mercator projection, longitude spans from -180 to +180 and latitude from 90 to -90. Boundary gridBoundary = new Boundary(inputBoundary.Left, inputBoundary.Top, inputBoundary.Right, inputBoundary.Bottom); if (projection == ProjectionTypes.Toast) { // For Toast projection, longitude spans from 0 to +360 and latitude from 90 to -90. gridBoundary.Left += 180; gridBoundary.Right += 180; } // Define plumbing for looping through all the tiles to be created for base image and pyramid. var tileGenerator = new TileGenerator(tileCreator); // Start building base image and the pyramid. Trace.TraceInformation("{0}: Building base and parent levels...", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); tileGenerator.Generate(maximumLevelsOfDetail, gridBoundary); string fileName = Path.GetFileNameWithoutExtension(inputFilePath); // Generate Plate file. Trace.TraceInformation("{0}: Building Plate file...", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); ImageTileSerializer pyramid = new ImageTileSerializer(TileHelper.GetDefaultImageTilePathTemplate(outputDir), ImageFormat.Png); PlateFileGenerator plateGenerator = new PlateFileGenerator( Path.Combine(outputDir, fileName + ".plate"), maximumLevelsOfDetail, ImageFormat.Png); plateGenerator.CreateFromImageTile(pyramid); // Generate Thumbnail Images. Trace.TraceInformation("{0}: Building Thumbnail image..", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); string thumbnailFile = Path.Combine(outputDir, fileName + ".jpeg"); TileHelper.GenerateThumbnail(pyramid.GetFileName(0, 0, 0), 96, 45, thumbnailFile, ImageFormat.Jpeg); // Get the path of image tiles created and save it in WTML file. Trace.TraceInformation("{0}: Building WTML file..", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); string pyramidPath = WtmlCollection.GetWtmlTextureTilePath(TileHelper.GetDefaultImageTilePathTemplate(outputDir), imageFormat.ToString()); // Create and save WTML collection file. WtmlCollection wtmlCollection = new WtmlCollection(fileName, thumbnailFile, pyramidPath, maximumLevelsOfDetail, projection, inputBoundary); string path = Path.Combine(outputDir, fileName + ".wtml"); wtmlCollection.Save(path); Trace.TraceInformation("{0}: Collection successfully generated.", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); }
public ITile ConstructTile(ITileEntry tileEntry) { ITileCreator creator = TILE_CREATORS.Find(c => c.Applies(tileEntry)); return(creator.Create(tileEntry, this)); }
public SteamSelectorViewModel(IEventAggregator eventAggregator, ITileCreator tileCreator) { _tileDataSelectedEvent = eventAggregator.GetEvent <TileDataSelectedEvent>(); _tileDataSelectedEvent.Subscribe(o => { try { _reactingToTileDataSelectedEvent = true; SelectedGameData = o as GameDataViewModel; } finally { _reactingToTileDataSelectedEvent = false; } }); _tileCreator = tileCreator; RefreshCommand = new AsyncRelayCommand(() => Refresh(), null, true); UserData = CacheManager.LoadFromCache <UserData>().FirstOrDefault() ?? new UserData(); SteamAPI = new SteamAPI(UserData.SteamCommunityId); UserData.SteamCommunityIdChanged += async(o, e) => { await UserData.SaveToCacheAsync(); SteamAPI = new SteamAPI(UserData.SteamCommunityId); }; var cachedGameDatas = CacheManager.LoadFromCache <GameData>() .OrderBy(o => o.IsInstalled ? 0 : 1) .ThenBy(o => o.Name) .Select(o => new GameDataViewModel(o, _tileCreator, SteamAPI)); GameDatas.AddRange(cachedGameDatas); GameDatas.CollectionChanged += async(o, e) => { switch (e.Action) { case NotifyCollectionChangedAction.Add: foreach (GameData item in e.NewItems) { await item.SaveToCacheAsync(); } break; case NotifyCollectionChangedAction.Remove: foreach (GameData item in e.OldItems) { await item.RemoveFromCacheAsync(); } break; default: break; } }; Application.Current.Exit += (o, e) => { UserData.SaveToCache(); if (SelectedGameData != null) { SelectedGameData.GameModel.SaveToCache(); } }; }
public abstract T GetTile <T>(ITileCreator <T> t);
public async Task MakeThumbnailAsync(Bitmap imgOrig, ITileCreator creator, CancellationToken token) { using var stream = CreateThumbnailStream(imgOrig); await creator.AddThumbnailAsync(stream, token); }
public async Task TileBitmap(Bitmap bmp, ITileCreator creator, CancellationToken token) { int width = bmp.Width; int height = bmp.Height; double aspect = (double)width / (double)height; //narrower int levels = 1; int maxHeight = 256; int maxWidth = 512; do { if (aspect < 2) { if (maxHeight >= height) { break; } } else { if (maxWidth >= width) { break; } } levels++; maxHeight *= 2; maxWidth *= 2; } while (true); int xOffset = (maxWidth - width) / 2; int yOffset = (maxHeight - height) / 2; int l = levels; int gridX = 256; int gridY = 256; while (l > 0) { l--; int currentLevel = l; int tilesX = 2 * (int)Math.Pow(2, l); int tilesY = (int)Math.Pow(2, l); for (int y = 0; y < tilesY; y++) { for (int x = 0; x < tilesX; x++) { if ((((x + 1) * gridX) > xOffset) && (((y + 1) * gridX) > yOffset) && (((x) * gridX) < (xOffset + width)) && (((y) * gridX) < (yOffset + height))) { using Bitmap bmpTile = new Bitmap(256, 256); using (Graphics gfx = Graphics.FromImage(bmpTile)) { gfx.DrawImage(bmp, new Rectangle(0, 0, 256, 256), new Rectangle((x * gridX) - xOffset, (y * gridX) - yOffset, gridX, gridX), GraphicsUnit.Pixel); } using var stream = bmpTile.SaveToStream(ImageFormat.Png); await creator.AddTileAsync(stream, currentLevel, x, y, token); } } } gridX *= 2; gridY *= 2; } }
/// <summary> /// Processes the input equirectangular dataset. /// </summary> /// <param name="inputGrid"> /// Input image path. /// </param> /// <param name="outputDir"> /// Output directory where pyramid is generated. /// </param> /// <param name="projection"> /// Projection type. /// </param> private static void ProcessEquirectangularGrid(string inputGrid, string outputDir, ProjectionTypes projection) { Trace.TraceInformation("{0}: Reading dataset..", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); ImageFormat imageFormat = ImageFormat.Png; // Read and parse glacier bay dataset. // Define a color map with relief shading implemented. var datagridDetails = DataGridHelper.LoadFromFile(inputGrid); // Build a data grid using the input data set var dataGrid = new DataGrid(datagridDetails.Data, false); // Build the grid map for equirectangular projection using the data grid and boundary co-ordinates var equirectangularGridMap = new EquirectangularGridMap(dataGrid, datagridDetails.Boundary); // Build the color map using equirectangular projection grid map var dataColorMap = new ShadedReliefColorMap(equirectangularGridMap); var maximumLevelsOfDetail = 15; // Define an instance of ITileCreator to create image tiles. ITileCreator imageTileCreator = TileCreatorFactory.CreateImageTileCreator(dataColorMap, projection, outputDir); // Define an instance of ITileCreator to create DEM tiles. // Define serialization mechanism for storing and retrieving DEM tiles. ITileCreator demTileCreator = TileCreatorFactory.CreateDemTileCreator(dataColorMap, projection, outputDir); // MultiTile creator encapsulates image and DEM tile creators. var multiTileCreator = new MultiTileCreator(new Collection <ITileCreator>() { imageTileCreator, demTileCreator }, projection); // Define boundary for the region. var boundary = new Boundary(datagridDetails.Boundary.Left, datagridDetails.Boundary.Top, datagridDetails.Boundary.Right, datagridDetails.Boundary.Bottom); if (projection == ProjectionTypes.Toast) { boundary.Left += 180.0; boundary.Right += 180.0; } // Generate base tiles and fill up the pyramid. var tileGenerator = new TileGenerator(multiTileCreator); tileGenerator.Generate(maximumLevelsOfDetail, boundary); // Path of Mercator and Toast DEM tile server. const string MercatorDemTilePath = @"http://(web server address)?Q={0},{1},{2},Mercator,dem2178"; const string ToastDemTilePath = @"http://(web server address)?Q={0},{1},{2},Toast,dem1033"; string fileName = Path.GetFileNameWithoutExtension(inputGrid); // Generate Thumbnail Images. Trace.TraceInformation("{0}: Building Thumbnail image..", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); ImageTileSerializer tileSerializer = new ImageTileSerializer(TileHelper.GetDefaultImageTilePathTemplate(outputDir), ImageFormat.Png); string thumbnailFile = Path.Combine(outputDir, fileName + ".jpeg"); TileHelper.GenerateThumbnail(tileSerializer.GetFileName(0, 0, 0), 96, 45, thumbnailFile, ImageFormat.Jpeg); // Create and save WTML file. string textureTilePath = WtmlCollection.GetWtmlTextureTilePath(TileHelper.GetDefaultImageTilePathTemplate(outputDir), imageFormat.ToString()); var inputBoundary = new Boundary(datagridDetails.Boundary.Left, datagridDetails.Boundary.Top, datagridDetails.Boundary.Right, datagridDetails.Boundary.Bottom); WtmlCollection wtmlCollection = new WtmlCollection(fileName, thumbnailFile, textureTilePath, maximumLevelsOfDetail, projection, inputBoundary); wtmlCollection.ZoomLevel = 0.2; wtmlCollection.IsElevationModel = true; wtmlCollection.DemTilePath = projection == ProjectionTypes.Mercator ? MercatorDemTilePath : ToastDemTilePath; string path = Path.Combine(outputDir, fileName + ".wtml"); wtmlCollection.Save(path); Trace.TraceInformation("{0}: Collection successfully generated.", DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss", CultureInfo.InvariantCulture)); }
public SteamSelectorViewModel(IEventAggregator eventAggregator, ITileCreator tileCreator) { _tileDataSelectedEvent = eventAggregator.GetEvent<TileDataSelectedEvent>(); _tileDataSelectedEvent.Subscribe(o => { try { _reactingToTileDataSelectedEvent = true; SelectedGameData = o as GameDataViewModel; } finally { _reactingToTileDataSelectedEvent = false; } }); _tileCreator = tileCreator; RefreshCommand = new AsyncRelayCommand(() => Refresh(), null, true); UserData = CacheManager.LoadFromCache<UserData>().FirstOrDefault() ?? new UserData(); SteamAPI = new SteamAPI(UserData.SteamCommunityId); UserData.SteamCommunityIdChanged += async (o, e) => { await UserData.SaveToCacheAsync(); SteamAPI = new SteamAPI(UserData.SteamCommunityId); }; var cachedGameDatas = CacheManager.LoadFromCache<GameData>() .OrderBy(o => o.IsInstalled ? 0 : 1) .ThenBy(o => o.Name) .Select(o => new GameDataViewModel(o, _tileCreator, SteamAPI)); GameDatas.AddRange(cachedGameDatas); GameDatas.CollectionChanged += async (o, e) => { switch (e.Action) { case NotifyCollectionChangedAction.Add: foreach (GameData item in e.NewItems) await item.SaveToCacheAsync(); break; case NotifyCollectionChangedAction.Remove: foreach (GameData item in e.OldItems) await item.RemoveFromCacheAsync(); break; default: break; } }; Application.Current.Exit += (o, e) => { UserData.SaveToCache(); if (SelectedGameData != null) SelectedGameData.GameModel.SaveToCache(); }; }
private void loaderWorker_CreateTiles(object sender, System.ComponentModel.DoWorkEventArgs e) { _creator = TileCreatorFactory.GetFactory(_file).Create(_file as RlViewer.Files.LocatorFile, _settings.TileOutputAlgorithm); ((WorkerEventController)_creator).Report += (s, pe) => ProgressReporter(pe.Percent); ((WorkerEventController)_creator).CancelJob += (s, ce) => ce.Cancel = ((WorkerEventController)_creator).Cancelled; ((WorkerEventController)_creator).ReportName += (s, tne) => ThreadHelper.ThreadSafeUpdateToolStrip<ToolStripStatusLabel>(_form.StatusLabel, lbl => { lbl.Text = tne.Name; }); _cancellableAction = ((WorkerEventController)_creator); try { e.Result = _creator.GetTiles(_file.Properties.FilePath, _settings.ForceTileGeneration, _settings.AllowViewWhileLoading); } catch (OperationCanceledException) { e.Cancel = true; } catch (AggregateException aggrex) { if (aggrex.InnerException.GetType() == typeof(OperationCanceledException)) { e.Cancel = true; } } }