using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
namespace ExportMap.cs
{
public class TBUtils
{
///
/// 获取源目录
///
public static string SourcesPath
{
get
{
return Path.Combine(Tools.BaseDir, "TerraBuilder");
}
}
///
/// 时间字符串
///
public static string TimeStr
{
get
{
return DateTime.Now.ToString("yyyyMMddhhmmss");
}
}
///
/// Mpt路径
///
public static string MptPath
{
get
{
return Tools.GetSetting("mpt");
}
}
private static bool isBusy = false;
///
/// 创建Mpt
///
public static string CreateMpt(string sourcePath, ref string err)
{
string time = TimeStr;
try
{
if (isBusy) throw new Exception("已有一个生成Mpt的任务正在执行");
isBusy = true;
string targetPath = Path.Combine(Tools.TempDir, time);
if (!Directory.Exists(targetPath)) Directory.CreateDirectory(targetPath);
MoveFilesToTemp(sourcePath, targetPath);
string tbp = GetNewTbp(time);
string js = GetNewJs(time, tbp, targetPath);
ReloadTB();
//string cmd = string.Format("\"C:\\Program Files\\Skyline\\TerraBuilder\\TerraBuilder.exe\" -script \"{0}\"", js); // -DisablePrint
//err = Tools.ExecCmd(new List { cmd });
err = Tools.ExecExe("\"C:/Program Files/Skyline/TerraBuilder/TerraBuilder.exe\"", string.Format("-script \"{0}\"", js));
isBusy = false;
return File.Exists(MptPath) ? MoveMpt(MptPath, sourcePath) : null;
}
catch (Exception ex)
{
LogOut.Error(ex.Message + "\r\n" + ex.StackTrace);
err = ex.Message;
isBusy = false;
return null;
}
finally
{
ending(time, sourcePath);
}
}
///
/// 测试
///
public static bool Test(ref string err)
{
string time = TimeStr;
try
{
if (isBusy) throw new Exception("已有一个生成Mpt的任务正在执行");
isBusy = true;
string js = Path.Combine(SourcesPath, "tb.js");
string newTbp = Path.Combine(Tools.TempDir, time, time + ".tbp");
File.Copy(Path.Combine(SourcesPath, "tb.tbp"), Path.Combine(SourcesPath, "tb01.tbp"), true);
//string cmd = string.Format("\"C:/Program Files/Skyline/TerraBuilder/TerraBuilder.exe\" -script \"{0}\"", js); // -DisablePrint
ReloadTB();
//err = Tools.ExecCmdForWin(new List { cmd });
err = Tools.ExecExe("\"C:/Program Files/Skyline/TerraBuilder/TerraBuilder.exe\"", string.Format("-script \"{0}\"", js), false);
isBusy = false;
return File.Exists(MptPath);
}
catch (Exception ex)
{
LogOut.Error(ex.Message + "\r\n" + ex.StackTrace);
err = ex.Message;
isBusy = false;
return false;
}
}
///
/// 获取新Tbp文件
///
private static string GetNewTbp(string time)
{
string tbp = Path.Combine(SourcesPath, "tb.tbp");
string newTbp = Path.Combine(Tools.TempDir, time, time + ".tbp");
File.Copy(tbp, newTbp);
return newTbp;
}
///
/// 移动文件至临时目录
///
private static void MoveFilesToTemp(string sourcePath, string targetPath)
{
LogOut.Info("TB.移动文件 -> " + sourcePath);
MoveFolder(Path.Combine(sourcePath, "数字正射影像图"), Path.Combine(targetPath, "img"));
MoveFolder(Path.Combine(sourcePath, "数字高程模型"), Path.Combine(targetPath, "dem"));
MoveFolder(Path.Combine(sourcePath, "中线裁剪范围"), Path.Combine(targetPath, "shp"));
}
///
/// 移动目录
///
private static void MoveFolder(string sourcePath, string targetPath)
{
if (!Directory.Exists(targetPath)) Directory.CreateDirectory(targetPath);
DirectoryInfo di = new DirectoryInfo(sourcePath);
FileInfo[] files = di.GetFiles();
if (null == files || 0 == files.Length) return;
foreach (FileInfo fi in files)
{
File.Move(fi.FullName, Path.Combine(targetPath, fi.Name));
}
}
///
/// 获取新JS
///
private static string GetNewJs(string time, string tbp, string targetPath)
{
string js = Path.Combine(SourcesPath, "template.js");
string img = GetFilePath(Path.Combine(targetPath, "img"), "*.tif");
string dem = GetFilePath(Path.Combine(targetPath, "dem"), "*.tif");
string shp = GetFilePath(Path.Combine(targetPath, "shp"), "*.shp");
string str = File.ReadAllText(js);
str = str.Replace("{tbp}", tbp)
.Replace("{img}", img)
.Replace("{dem}", dem)
.Replace("{shp}", shp)
.Replace("\\", "\\\\");
string newJs = Path.Combine(Tools.TempDir, time, time + ".js");
File.WriteAllText(newJs, str);
return newJs;
}
///
/// 获取文件路径
///
private static string GetFilePath(string path, string ext)
{
DirectoryInfo di = new DirectoryInfo(path);
FileInfo[] files = di.GetFiles(ext);
return null == files || 0 == files.Length ? string.Empty : files[0].FullName;
}
///
/// 重启TB程序
///
private static void ReloadTB()
{
List list = new List();
list.Add("taskkill /f /t /im TerraBuilder.exe");
//list.Add("taskkill /f /t /im TBFuser.exe");
//list.Add("start /d \"C:\\Program Files\\Skyline\\TerraBuilder Fuser\" TBFuser.exe /b");
Tools.ExecCmd(list);
}
///
/// 移动Mpt文件
///
private static string MoveMpt(string mpt, string targetPath)
{
string path = Path.Combine(targetPath, "Mpt");
if (!Directory.Exists(path)) Directory.CreateDirectory(path);
FileInfo fi = new FileInfo(mpt);
string newMpt = Path.Combine(path, fi.Name);
File.Move(mpt, newMpt);
string mIdx = mpt.Replace(".mpt", ".mIdx");
if (File.Exists(mIdx)) File.Move(mIdx, newMpt.Replace(".mpt", ".mIdx"));
string Strmi = mpt.Replace(".mpt", ".Strmi");
if (File.Exists(Strmi)) File.Move(Strmi, newMpt.Replace(".mpt", ".Strmi"));
return newMpt;
}
///
/// 收尾工作
///
private static void ending(string time, string sourcePath)
{
try
{
string path = Path.Combine(Tools.TempDir, time);
if (!Directory.Exists(path)) return;
string img = GetFilePath(Path.Combine(path, "img"), "*.tif");
if (null != img) MoveFile(img, Path.Combine(sourcePath, "数字正射影像图"));
string dem = GetFilePath(Path.Combine(path, "dem"), "*.tif");
if (null != dem) MoveFile(dem, Path.Combine(sourcePath, "数字高程模型"));
MoveFolder(Path.Combine(path, "shp"), Path.Combine(sourcePath, "中线裁剪范围"));
Directory.Delete(path, true);
}
catch (Exception ex)
{
LogOut.Error(ex.Message + "\r\n" + ex.StackTrace);
}
}
///
/// 移动文件
///
private static void MoveFile(string file, string targetPath)
{
FileInfo fi = new FileInfo(file);
File.Move(file, Path.Combine(targetPath, fi.Name));
}
}
}