123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507 |
- /* ==============================================================================
- * 功能描述:DalModeFileManange
- * 创 建 者:Garrett
- * 创建日期:2018/3/13 17:09:05
- * ==============================================================================*/
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Markup;
- using Autodesk.Revit.DB;
- using Autodesk.Revit.DB.Events;
- using Autodesk.Revit.UI;
- using DevExpress.Xpf.CodeView;
- using SAGA.DotNetUtils;
- using SAGA.DotNetUtils.Extend;
- using SAGA.DotNetUtils.Logger;
- using SAGA.DotNetUtils.Others;
- using SAGA.MBI.Calc;
- using SAGA.MBI.Common;
- using SAGA.MBI.Interaction;
- using SAGA.MBI.JsonConvert;
- using SAGA.MBI.Login;
- using SAGA.MBI.Model;
- using SAGA.MBI.RequestData;
- using SAGA.MBI.Tools;
- using SAGA.MBI.WinView.Login;
- using SAGA.MBI.WinView.TraceView;
- using SAGA.RevitUtils.Log;
- using SAGA.RevitUtils.MEP;
- using SAGA.RevitUtils.Windows;
- namespace SAGA.MBI.DataArrange
- {
- /// <summary>
- /// DalModeFileManange
- /// </summary>
- public class DalModeFileManange
- {
- /// <summary>
- /// 获取整颗树
- /// </summary>
- /// <param name="id"></param>
- /// <returns></returns>
- public static TreeNodeItem GetAllModeFiles()
- {
- Log4Net.Debug("开始:获取整颗树");
- MProject project = MBIControl.ProjectCur;
- var projectId = project.Id;
- TreeNodeItem treeNode0 = new TreeNodeItem(project);
- treeNode0.ImageStr = MBIConst.MBIImagePath + "/folder.png";
- List<MBuilding> buildings = ModeFileConvert.GetProjectBuildings(projectId);
- foreach (MBuilding building in buildings)
- {
- building.RelativePath = Path.Combine(project.RelativePath, building.Id);
- TreeNodeItem treeNode00 = new TreeNodeItem(building);
- treeNode00.ImageStr = MBIConst.MBIImagePath + "/folder.png";
- treeNode0.AddChild(treeNode00);
- List<MFloor> floors = ModeFileConvert.GetBuildingFloors(building.Id);
- foreach (MFloor floor in floors)
- {
- string fileName = "";
- floor.RelativePath = Path.Combine(building.RelativePath, fileName);
- TreeNodeItem treeNode000 = new TreeNodeItem(floor);
- treeNode000.ImageStr = MBIConst.MBIImagePath + "/page.png";
- treeNode00.AddChild(treeNode000);
- }
- SortTreeItem(treeNode00);
- }
- Log4Net.Debug("结束:获取整颗树");
- return treeNode0;
- }
- /// <summary>
- /// 获取缺少模型的Tree
- /// </summary>
- /// <param name="isMissFile">True 缺少模型;False 不缺少;null全部</param>
- /// <returns></returns>
- public static List<TreeNodeItem> GetMissFileFloors(bool isMissFile = true)
- {
- List<TreeNodeItem> trees = new List<TreeNodeItem>();
- foreach (TreeNodeItem buildingTree in MBIControl.ProjectTree.Children)
- {
- if (buildingTree.Item is MBuilding building)
- {
- TreeNodeItem tempbuildingTree = new TreeNodeItem(building);
- tempbuildingTree.ImageStr = MBIConst.MBIImagePath + "/folder.png";
- foreach (TreeNodeItem floorTree in buildingTree.Children)
- {
- if (floorTree.Item is MFloor floor)
- {
- if (isMissFile == null || isMissFile == floor.IsMissFile)
- {
- TreeNodeItem tempfloorTree = new TreeNodeItem(floor);
- tempfloorTree.ImageStr = MBIConst.MBIImagePath + "/page.png";
- tempbuildingTree.AddChild(tempfloorTree);
- }
- }
- }
- if (tempbuildingTree.Children.Count != 0)
- {
- trees.Add(tempbuildingTree);
- }
- DalModeFileManange.SortTreeItem(tempbuildingTree);
- }
- }
- return trees;
- }
- /// <summary>
- /// 对Tree进行排序
- /// </summary>
- /// <param name="parentItem"></param>
- public static void SortTreeItem(TreeNodeItem parentItem)
- {
- if (parentItem.Item is MBuilding)
- {
- var list = parentItem.Children.ToList();
- list.Sort(new TNMFloorComparer());
- parentItem.Children = new System.Collections.ObjectModel.ObservableCollection<TreeNodeItem>(list);
- }
- }
- /// <summary>
- /// 获取树结点下的楼层
- /// </summary>
- /// <param name="treeItem"></param>
- /// <param name="floors"></param>
- public static List<MFloor> GetAllFloors(TreeNodeItem treeItem)
- {
- List<MFloor> floors = new List<MFloor>();
- GetAllFloors(treeItem, floors);
- return floors;
- }
- /// <summary>
- /// 获取树结点下的楼层
- /// </summary>
- /// <param name="treeItem"></param>
- /// <param name="floors"></param>
- private static void GetAllFloors(TreeNodeItem treeItem, List<MFloor> floors)
- {
- foreach (var item in treeItem.Children)
- {
- var mode = item.Item;
- if (mode is MFloor floor)
- floors.Add(floor);
- else
- {
- GetAllFloors(item, floors);
- }
- }
- }
- /// <summary>
- /// 由楼层id获取Floor的前一个树节点
- /// 楼层的上一层 现行规则为:获取当前层的上一层,当前层楼层序列号为1,上一层序列号为5,直接返回序列号为5的楼层
- /// </summary>
- /// <param name="id"></param>
- /// <returns></returns>
- public static TreeNodeItem GetUpperFloorTreeById(string id)
- {
- TreeNodeItem tree = null;
- foreach (TreeNodeItem buildingTree in MBIControl.ProjectTree.Children)
- {
- TreeNodeItem parenttree = null;
- foreach (TreeNodeItem floorTree in buildingTree.Children)
- {
- if (floorTree.Item is MFloor floor)
- {
- if (floor.Id == id)
- {
- tree = floorTree;
- break;
- }
- }
- parenttree = floorTree;
- }
- if (tree != null)
- {
- tree = parenttree;
- break;
- }
-
- }
- return tree;
- }
- private static Dictionary<string, TreeNodeItem> m_ProjectTreeDic = new Dictionary<string, TreeNodeItem>();
- /// <summary>
- /// 刷新字典
- /// </summary>
- private static void ReLoadProjectTreeDic()
- {
- m_ProjectTreeDic.Clear();
- foreach (TreeNodeItem buildingTree in MBIControl.ProjectTree.Children)
- {
- if (buildingTree.Item is MBuilding building)
- {
- m_ProjectTreeDic.Add(building.Id, buildingTree);
- foreach (TreeNodeItem floorTree in buildingTree.Children)
- {
- if (floorTree.Item is MFloor floor)
- {
- m_ProjectTreeDic.Add(floor.Id, floorTree);
- }
- }
- }
- }
- }
- /// <summary>
- /// 由楼层id获取Building树节点
- /// </summary>
- /// <param name="id"></param>
- /// <returns></returns>
- public static TreeNodeItem GetBuildingItemByFloorId(string floorId)
- {
- TreeNodeItem tree = GetFloorTreeById(floorId);
- return tree?.Parent;
- }
- /// <summary>
- /// 由楼层id获取Floor树节点
- /// </summary>
- /// <param name="id"></param>
- /// <returns></returns>
- public static TreeNodeItem GetFloorTreeById(string id)
- {
- TreeNodeItem tree =m_ProjectTreeDic.GetValue(id);
- if (tree == null)
- {
- ReLoadProjectTreeDic();
- tree = m_ProjectTreeDic.GetValue(id);
- }
- return tree;
- }
- /// <summary>
- /// 新旧文件对比过后,需要删除的数据
- /// </summary>
- public static CalcContext GetDelContext(CalcContext oldContext, CalcContext newContext, bool isExceptSpace = false)
- {
- CalcContext context = new CalcContext(newContext.MFloor);
- var equips = oldContext.MEquipments.Except(newContext.MEquipments,
- new CommonEqualComparer<MEquipment>((a, b) => { return a.BimID == b.BimID; }));
- context.MEquipments.AddRange(equips);
- var equipParts = oldContext.MEquipmentParts.Except(newContext.MEquipmentParts,
- new CommonEqualComparer<MEquipmentPart>((a, b) =>
- {
- return a.BimID == b.BimID;
- }));
- context.MEquipmentParts.AddRange(equipParts);
- var beacons = oldContext.MBeacons.Except(newContext.MBeacons,
- new CommonEqualComparer<MBeacon>((a, b) => { return a.BimID == b.BimID; }));
- context.MBeacons.AddRange(beacons);
- //模型文件替换后,元空间重新上传,之前的不保留
- if (isExceptSpace)
- {
- var spaces = oldContext.MSpaces.Except(newContext.MSpaces,
- new CommonEqualComparer<MISpace>((a, b) => { return a.BimID == b.BimID; }));
- context.MSpaces.AddRange(spaces);
- }
- else
- {
- context.MSpaces.AddRange(oldContext.MSpaces);
- }
- return context;
- }
- /// <summary>
- /// 新旧文件对比过后,需要更新的数据
- /// </summary>
- public static CalcContext GetModifyContext(CalcContext oldContext, CalcContext newContext, bool isExceptSpace = false)
- {
- CalcContext context = new CalcContext(newContext.MFloor);
- var equips = oldContext.MEquipments.Intersect(newContext.MEquipments,
- new CommonEqualComparer<MEquipment>((a, b) => { return a.BimID == b.BimID; }));
- context.MEquipments.AddRange(equips);
- var equipParts = oldContext.MEquipmentParts.Intersect(newContext.MEquipmentParts,
- new CommonEqualComparer<MEquipmentPart>((a, b) =>
- {
- return a.BimID == b.BimID;
- }));
- context.MEquipmentParts.AddRange(equipParts);
- var beacons = oldContext.MBeacons.Intersect(newContext.MBeacons,
- new CommonEqualComparer<MBeacon>((a, b) => { return a.BimID == b.BimID; }));
- context.MBeacons.AddRange(beacons);
- //模型文件替换后,元空间重新上传,之前的不保留
- if (isExceptSpace)
- {
- var spaces = oldContext.MSpaces.Intersect(newContext.MSpaces,
- new CommonEqualComparer<MISpace>((a, b) => { return a.BimID == b.BimID; }));
- context.MSpaces.AddRange(spaces);
- }
- else
- {
- context.MSpaces.AddRange(oldContext.MSpaces);
- }
- return context;
- }
- /// <summary>
- /// 新旧文件对比过后,需要添加的数据
- /// </summary>
- public static CalcContext GetAddContext(CalcContext oldContext, CalcContext newContext, bool isExceptSpace = false)
- {
- CalcContext context = new CalcContext(newContext.MFloor);
- var equips = newContext.MEquipments.Except(oldContext.MEquipments,
- new CommonEqualComparer<MEquipment>((a, b) => { return a.BimID == b.BimID; }));
- context.MEquipments.AddRange(equips);
- var equipParts = newContext.MEquipmentParts.Except(oldContext.MEquipmentParts,
- new CommonEqualComparer<MEquipmentPart>((a, b) =>
- {
- return a.BimID == b.BimID;
- }));
- context.MEquipmentParts.AddRange(equipParts);
- var beacons = newContext.MBeacons.Except(oldContext.MBeacons,
- new CommonEqualComparer<MBeacon>((a, b) => { return a.BimID == b.BimID; }));
- context.MBeacons.AddRange(beacons);
- //模型文件替换后,元空间重新上传,之前的不保留
- if (isExceptSpace)
- {
- var spaces = newContext.MSpaces.Except(oldContext.MSpaces,
- new CommonEqualComparer<MISpace>((a, b) => { return a.BimID == b.BimID; }));
- context.MSpaces.AddRange(spaces);
- //处理设备所在空间
- context.RltEquipInSpaces.AddRange(newContext.RltEquipInSpaces.Where(t => context.MEquipments.Select(tt => tt.BimID).Contains((t)?.MEquipment.BimID)));
- context.RltEquipInSpaces.AddRange(newContext.RltEquipInSpaces.Where(t => context.MEquipmentParts.Select(tt => tt.BimID).Contains((t)?.MEquipment.BimID)));
- context.RltEquipInSpaces.AddRange(newContext.RltEquipInSpaces.Where(t => context.MSpaces.Select(tt => tt.BimID).Contains((t)?.MSpace.BimID)));
- context.RltBeaconinElementSps.AddRange(newContext.RltBeaconinElementSps.Where(t => context.MBeacons.Select(tt => tt.BimID).Contains((t)?.MBeacon.BimID)));
- }
- else
- {
- context.MSpaces.AddRange(newContext.MSpaces);
- context.RltEquipInSpaces.AddRange(newContext.RltEquipInSpaces);
- }
- return context;
- }
- /// <summary>
- /// 对将要显示的数据进行装饰
- /// 查询贴码类型
- /// </summary>
- /// <param name="context"></param>
- public static void WrapperContextFmInfo(CalcContext context)
- {
- foreach (var equip in context.MEquipments)
- {
- string fmid = equip.FMID;
- equip.HasFM = fmid.IsNotNullEmpty();
- //查询贴码类型
- MEquipFM fmmode = MatchFMConvert.GetFMInfoByFMId(fmid);
- equip.HasFMChecked = fmmode != null && fmmode.CodeType != -1;
- }
- foreach (var equip in context.MEquipmentParts)
- {
- string fmid = equip.FMID;
- equip.HasFM = fmid.IsNotNullEmpty();
- //查询贴码类型
- MEquipFM fmmode = MatchFMConvert.GetFMInfoByFMId(fmid);
- equip.HasFMChecked = fmmode != null && fmmode.CodeType != -1;
- }
- //信标默认都是已经贴码验证过的
- foreach (var equip in context.MBeacons)
- {
- equip.HasFM = true;
- equip.HasFMChecked = true;
- }
- }
- /// <summary>
- /// 有需要删除的岗位
- /// </summary>
- /// <param name="context"></param>
- /// <returns></returns>
- public static bool HasDutyItem(CalcContext context)
- {
- bool result = false;
- result = context.MEquipments.IsNotNullEmptyExt() || context.MEquipmentParts.IsNotNullEmptyExt() || context.MBeacons.IsNotNullEmptyExt();
- //如果有需要删除的岗位,对需要显示的数据进行装饰
- if (result)
- WrapperContextFmInfo(context);
- return result;
- }
- /// <summary>
- /// 上传楼层数据,删除所有数据,重新上传
- /// </summary>
- /// <param name="mode"></param>
- /// <returns></returns>
- public static bool UploadDataByDelAllThenReUpload(MFloor floor)
- {
- //删除旧数据
- bool result = DalCommon.DelFloorCloudData(floor.Id);
- if (!result) return !result;
- //计算并上传
- CalcContext context = ObjectCalc.Calc(floor);
- result = context.Upload();
- return result;
- }
- /// <summary>
- /// 上传楼层数据,新旧数据对比,多余的提示用户选择删除
- /// </summary>
- /// <param name="mode"></param>
- /// <returns></returns>
- public static bool UploadDataByIntersectOldAndNew(MFloor floor)
- {
- bool result = true;
- try
- {
- //Traceloger.Show();
- Traceloger.Log("从物理世界下载旧数据");
- var oldContext = DalCommon.DownLoadCouldData(floor);
- Traceloger.Log("从新模型计算新数据");
- var newContext = ObjectCalc.Calc(floor);
- //分组
- Traceloger.Log("获取要被删除的数据");
- var bedelContext = GetDelContext(oldContext, newContext);
- Traceloger.Log("获取新增加的数据");
- var beaddContext = GetAddContext(oldContext, newContext);
- Traceloger.Log("获取修改的数据");
- var bemodifyContext = GetModifyContext(oldContext, newContext);
- if (HasDutyItem(bedelContext))
- {
- VmSelectSaveDuty viewmode = new VmSelectSaveDuty();
- viewmode.DelContext = bedelContext;
- WinSelectSaveDuty win = new WinSelectSaveDuty();
- win.DataContext = viewmode;
- win.ShowDialog();
- }
- GenerateLog(bedelContext, beaddContext, bemodifyContext);
- //Traceloger.Log("执行删除数据操作");
- ////删除
- //bedelContext.Del();
- //Traceloger.Log("执行上传新数据操作");
- ////添加
- //beaddContext.Upload();
- //Traceloger.Close();
- }
- catch (Exception e)
- {
- MessageShowBase.Show(e);
- result = false;
- }
- return result;
- }
- /// <summary>
- /// 生成日志文件
- /// </summary>
- /// <param name="delContext"></param>
- /// <param name="addContext"></param>
- /// <param name="modifyContext"></param>
- public static void GenerateLog(CalcContext delContext, CalcContext addContext, CalcContext modifyContext)
- {
- try
- {
- addContext.OpenDocument();
- //删除临时日志,此时临时日志应该是空的,不用删除
- delContext.WriteToTempLogFile(DocumentChangedOperator.Delete);
- //为了取出Family,Type,Category
- modifyContext.RevitDoc = addContext.RevitDoc;
- modifyContext.WriteToTempLogFile(DocumentChangedOperator.Modified);
- addContext.WriteToTempLogFile(DocumentChangedOperator.Add);
- //清除旧的日志
- ProjectLogManager.ClearFiles(addContext.FloorId);
- #region 写入到日志中
- #region 将保存日志项目参数写入项目
- using (Transaction trans = new Transaction(addContext.RevitDoc, "日志"))
- {
- trans.Start();
- try
- {
- var newFileKey = ProjectLogManager.CreateLogFileKey(addContext.RevitDoc);
- DocumentLogManager.SetLogFileKey(addContext.RevitDoc, newFileKey);
- trans.Commit();
- }
- catch (Exception e)
- {
- MessageShowBase.Show(e);
- trans.RollBack();
- }
- }
- #endregion
- //其中包含Save,提交日志文件到服务器
- addContext.RevitDoc.CloseDoc();
- #endregion
- }
- catch (Exception e)
- {
- MessageShowBase.Show(e);
- }
- }
- }
- }
|