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 { /// /// 模型转换工具 /// public class ConvertUtils { /// /// 工作配置 /// public static string JobConfig = "{{ \"format\": \"3dtiles\", \"mode\": 0, \"outputPath\": \"{0}\", \"outputOptions\": null, \"levelOfDetail\": -1, \"levelOfDetailText\": \"Auto\", \"georeferenced\": null }}"; /// /// Roamer.exe /// public static string RoamerExe = "\"C:\\Program Files\\Autodesk\\Navisworks Manage 2020\\Roamer.exe\""; /// /// 获取发布地址 /// public static string GetReleaseUrl(SysMeta meta) { return "{host}/LFData/3d/3dtiles/" + meta.type + "/" + meta.id + "/tileset.json"; } /// /// 模型转换 /// public static List Convert(XYZArgs args) { string uploadFolder = Tools.GetSetting("uploadFolder"); string tilesFolder = Path.Combine(Tools.GetSetting("lfData"), "3d\\3dtiles"); List list = XYZUtils.SelectMetas(args.ids, "and type in ('ifc', 'fbx', 'rvt')"); if (null == list || list.Count == 0) return null; Tools.SetIsModel(args, list); List ids = new List(); 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 (args.isNew && Directory.Exists(outPath)) Tools.DelPath(outPath); if (!Directory.Exists(outPath)) Directory.CreateDirectory(outPath); if (File.Exists(jsonFile)) File.Delete(jsonFile); WriteText(configFile, string.Format(JobConfig, outPath.Replace("\\", "\\\\"))); SysTask task = TaskDBHelper.CreateTask(args, meta, "BIM", "三维模型(BIM)"); ExecNavisworks(task, modelFile, configFile); File.Delete(configFile); if (File.Exists(jsonFile)) { string path = jsonFile.Replace(Tools.GetSetting("lfData") + "\\", ""); int pubid = InsertToDB(meta, args, path); if (pubid > 0) ids.Add(pubid); } } return ids; } /// /// 运行Navisworks /// public static void ExecNavisworks(SysTask task, string modelFile, string configFile) { Process p = null; try { //string args = string.Format("-licensing AdLM -OpenFile \"{0}\" -ExecuteAddInPlugin \"EngineBatch_Sample.SmartEarth\" \"{1}\" -log \"{2}\" -NoGui -Exit", modelFile, configFile, Path.Combine(ExportUtil.SourcesPath, "ns_log.txt")); 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); task.pid = p.Id; task.id = TaskDBHelper.Insert(task); p.WaitForInputIdle(); // 让组件等候相关的进程进入闲置状态 p.WaitForExit(); // 让组件无限期地等待关联进程退出 task = TaskDBHelper.SelectById(task.id); if (null != task && task.status < 2) { task.status = 2; TaskDBHelper.Update(task); } } catch (Exception ex) { LogOut.Error(ex.Message + "\r\n" + ex.StackTrace); task = TaskDBHelper.SelectById(task.id); if (null != task && task.status < 2) { task.err = ex.Message; task.status = 4; TaskDBHelper.Update(task); } } finally { if (p != null) { p.Close(); p = null; } } } /// /// 写文本文件 /// private static void WriteText(string file, string str) { File.WriteAllText(file, str); LogOut.Info("JobConfig:" + str); } /// /// 插入数据库 /// private static int InsertToDB(SysMeta meta, XYZArgs args, string path) { //if (PubDBHelper.IsPublish(meta.id)) return 1; int pubid = PubDBHelper.GetPushlishId(meta.id); if (pubid > 0) { PubDBHelper.UpdatePublish(pubid, meta.name, args.userId, null); return pubid; } SysPublish sys = Tools.NewPublish(meta, args, GetReleaseUrl(meta), path); pubid = PubDBHelper.InsertPublish(sys); if (pubid > 0) { sys.id = pubid; PubDBHelper.InsertLayer(sys, meta); PubDBHelper.InsertMetaPub(meta.id, pubid, args.userId); } return pubid; } } }