using ExportMap.db;
|
using ExportMap.Models;
|
using System;
|
using System.Collections.Generic;
|
using System.Diagnostics;
|
using System.IO;
|
using System.Linq;
|
using System.Web;
|
|
namespace ExportMap.cs
|
{
|
/// <summary>
|
/// 模型转换工具
|
/// </summary>
|
public class ConvertUtils
|
{
|
/// <summary>
|
/// 工作配置
|
/// </summary>
|
public static string JobConfig = "{{ \"format\": \"3dtiles\", \"mode\": 0, \"outputPath\": \"{0}\", \"outputOptions\": null, \"levelOfDetail\": -1, \"levelOfDetailText\": \"Auto\", \"georeferenced\": null }}";
|
|
/// <summary>
|
/// Roamer.exe
|
/// </summary>
|
public static string RoamerExe = "\"C:\\Program Files\\Autodesk\\Navisworks Manage 2020\\Roamer.exe\"";
|
|
/// <summary>
|
/// 获取发布地址
|
/// </summary>
|
public static string GetReleaseUrl(SysMeta meta)
|
{
|
return "http://{host}/LFData/3d/3dtiles/" + meta.type + "/" + meta.id + "/tileset.json";
|
}
|
|
/// <summary>
|
/// 模型转换
|
/// </summary>
|
public static int Convert(XYZArgs args)
|
{
|
int count = 0;
|
string uploadFolder = Tools.GetSetting("uploadFolder");
|
string tilesFolder = Path.Combine(Tools.GetSetting("lfData"), "3d\\3dtiles");
|
|
List<SysMeta> list = XYZUtils.SelectMetas(args.ids, "and type in ('ifc', 'fbx', 'rvt')");
|
if (null == list || list.Count == 0) return 0;
|
|
foreach (SysMeta meta in list)
|
{
|
string modelFile = Path.Combine(uploadFolder, meta.path);
|
if (!File.Exists(modelFile)) continue;
|
|
string configFile = Path.Combine(Tools.TempDir, ExportUtil.DateStr + ".json");
|
string outPath = Path.Combine(tilesFolder, meta.type, meta.id.ToString());
|
string jsonFile = Path.Combine(outPath, "tileset.json");
|
|
if (!Directory.Exists(outPath)) Directory.CreateDirectory(outPath);
|
if (File.Exists(jsonFile)) File.Delete(jsonFile);
|
|
WriteText(configFile, string.Format(JobConfig, outPath.Replace("\\", "\\\\")));
|
ExecNavisworks(modelFile, configFile);
|
|
File.Delete(configFile);
|
if (File.Exists(jsonFile))
|
{
|
string path = jsonFile.Replace(Tools.GetSetting("lfData") + "\\", "");
|
InsertToDB(meta, args, path);
|
|
count++;
|
}
|
}
|
|
return count;
|
}
|
|
/// <summary>
|
/// 运行Navisworks
|
/// </summary>
|
public static void ExecNavisworks(string modelFile, string configFile)
|
{
|
Process p = null;
|
try
|
{
|
//string log = Path.Combine(ExportUtil.SourcesPath, "ns_log.txt");
|
//string args = string.Format("-licensing AdLM -OpenFile \"{0}\" -ExecuteAddInPlugin \"EngineBatch_Sample.SmartEarth\" \"{1}\" -log \"{2}\" -NoGui -Exit", modelFile, configFile, log);
|
string args = string.Format("-licensing AdLM -OpenFile \"{0}\" -ExecuteAddInPlugin \"EngineBatch_Sample.SmartEarth\" \"{1}\" -NoGui -Exit", modelFile, configFile);
|
LogOut.Info("Args:" + args);
|
|
// 启动进程
|
p = Process.Start(RoamerExe, args);
|
|
// 让组件等候相关的进程进入闲置状态
|
p.WaitForInputIdle();
|
|
// 让组件无限期地等待关联进程退出
|
p.WaitForExit();
|
}
|
catch (Exception ex)
|
{
|
LogOut.Error(ex.StackTrace);
|
}
|
finally
|
{
|
if (p != null)
|
{
|
p.Close();
|
p.Dispose();
|
p = null;
|
}
|
}
|
}
|
|
/// <summary>
|
/// 写文本文件
|
/// </summary>
|
private static void WriteText(string file, string str)
|
{
|
File.WriteAllText(file, str);
|
LogOut.Info("JobConfig:" + str);
|
}
|
|
/// <summary>
|
/// 插入数据库
|
/// </summary>
|
private static void InsertToDB(SysMeta meta, XYZArgs args, string path)
|
{
|
if (PubDBHelper.IsPublish(meta.id)) return;
|
|
SysPublish sys = NewPublish(meta, args);
|
sys.path = path;
|
|
int pubid = PubDBHelper.InsertPublish(sys);
|
if (pubid > 0)
|
{
|
sys.id = pubid;
|
PubDBHelper.InsertLayer(sys, meta, 100);
|
PubDBHelper.InsertMetaPub(meta.id, pubid, args.userId);
|
}
|
}
|
|
/// <summary>
|
/// 创建数据发布类
|
/// </summary>
|
private static SysPublish NewPublish(SysMeta meta, XYZArgs args)
|
{
|
SysPublish sp = new SysPublish();
|
sp.name = meta.name;
|
sp.url = GetReleaseUrl(meta);
|
sp.type = meta.type;
|
sp.status = 3;
|
sp.dirid = meta.dircode;
|
sp.depid = args.depcode;
|
sp.min = 0;
|
sp.max = 0;
|
sp.json = null;
|
sp.create_user = args.userId;
|
sp.geom = null;
|
sp.bak = null;
|
|
return sp;
|
}
|
}
|
}
|