AirScout/MapTileGenerator/MainDlg.cs

153 wiersze
5.2 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace MapTileGenerator
{
public partial class MainDlg : Form
{
public MainDlg()
{
InitializeComponent();
}
private void Say(string text)
{
if (tsl_Main.Text != text)
{
tsl_Main.Text = text;
ss_Main.Refresh();
}
}
private void btn_Database_Click(object sender, EventArgs e)
{
OpenFileDialog Dlg = new OpenFileDialog();
Dlg.CheckFileExists = true;
Dlg.Filter = "GMap.NET database files (*.gmdb)|*.gmdb";
if (Dlg.ShowDialog() == DialogResult.OK)
{
tb_Database.Text = Dlg.FileName;
Properties.Settings.Default.Save();
// change ScoutBase database location
ScoutBase.Maps.Properties.Settings.Default.Database_UpdateURL = Properties.Settings.Default.Database;
}
}
private void btn_MapTilesRootPath_Click(object sender, EventArgs e)
{
FolderBrowserDialog Dlg = new FolderBrowserDialog();
if (Dlg.ShowDialog() == DialogResult.OK)
{
tb_MapTilesRootPath.Text = Dlg.SelectedPath;
Properties.Settings.Default.Save();
}
}
private void btn_Start_Click(object sender, EventArgs e)
{
List<MapTileInfo> tiles = MapData.Database.TilesGetAll();
int count = tiles.Count();
int i = 1;
foreach (MapTileInfo tile in tiles)
{
try
{
string dirname = Path.Combine(Properties.Settings.Default.MapTilesRootPath, tile.Zoom.ToString(), tile.X.ToString());
if (!Directory.Exists(dirname))
{
Directory.CreateDirectory(dirname);
}
string filename = Path.Combine(dirname, tile.Y.ToString()) + ".png";
MapTileData d = MapData.Database.TileDataFind(tile.ID);
if (d != null && !File.Exists(filename) || (File.GetLastWriteTime(filename) != tile.CacheTime))
{
using (BinaryWriter bw = new BinaryWriter(File.Create(filename)))
{
bw.Write(d.Tile);
}
File.SetCreationTime(filename, tile.CacheTime);
File.SetLastWriteTime(filename, tile.CacheTime);
File.SetLastAccessTime(filename, tile.CacheTime);
}
Say("Saving [" + i.ToString() + " of " + count.ToString() + "] " + filename);
}
catch (Exception ex)
{
Say(ex.Message);
}
i++;
Application.DoEvents();
}
Say("Ready.");
}
private void MainDlg_FormClosing(object sender, FormClosingEventArgs e)
{
Properties.Settings.Default.Save();
}
private void CombineImages(string[] files)
{
if (files.Count() == 0)
return;
//change the location to store the final image.
string finalImage = Path.Combine(Application.ExecutablePath, "zoom.png");
List<int> imageHeights = new List<int>();
int nIndex = 0;
int width = 0;
foreach (string file in files)
{
Image img = Image.FromFile(file);
imageHeights.Add(img.Height);
width += img.Width;
img.Dispose();
}
imageHeights.Sort();
int height = imageHeights[imageHeights.Count - 1];
Bitmap img3 = new Bitmap(width, height);
Graphics g = Graphics.FromImage(img3);
g.Clear(SystemColors.AppWorkspace);
foreach (string file in files)
{
Image img = Image.FromFile(file);
if (nIndex == 0)
{
g.DrawImage(img, new Point(0, 0));
nIndex++;
width = img.Width;
}
else
{
g.DrawImage(img, new Point(width, 0));
width += img.Width;
}
img.Dispose();
}
g.Dispose();
img3.Save(finalImage, System.Drawing.Imaging.ImageFormat.Png);
img3.Dispose();
pb_Zoom.Image = Image.FromFile(finalImage);
}
private void btn_CreatePNG_Click(object sender, EventArgs e)
{
FolderBrowserDialog Dlg = new FolderBrowserDialog();
{
if (Dlg.ShowDialog() == DialogResult.OK)
{
string[] files = Directory.GetFiles(Dlg.SelectedPath, "*.png");
Array.Sort(files);
CombineImages(files);
}
}
}
}
}