|
@@ -4,30 +4,27 @@
|
|
|
* 创建日期:2018/3/30 18:16:55
|
|
|
* ==============================================================================*/
|
|
|
|
|
|
-using System;
|
|
|
-using System.Collections.Generic;
|
|
|
-using System.Collections.ObjectModel;
|
|
|
-using System.IO;
|
|
|
-using System.Linq;
|
|
|
-using System.Reflection;
|
|
|
using Autodesk.Revit.DB;
|
|
|
using Autodesk.Revit.DB.Mechanical;
|
|
|
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.Extend;
|
|
|
-using SAGA.MBI.FileStream;
|
|
|
-using SAGA.MBI.Interaction;
|
|
|
-using SAGA.MBI.JsonConvert;
|
|
|
using SAGA.MBI.Model;
|
|
|
using SAGA.MBI.RequestData;
|
|
|
using SAGA.MBI.Tools;
|
|
|
using SAGA.MBI.WinView.Upload;
|
|
|
using SAGA.RevitUtils;
|
|
|
using SAGA.RevitUtils.Extends;
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Collections.ObjectModel;
|
|
|
+using System.IO;
|
|
|
+using System.Linq;
|
|
|
+using System.Reflection;
|
|
|
+using SAGA.RevitUtils.MEP;
|
|
|
|
|
|
namespace SAGA.MBI.DataArrange
|
|
|
{
|
|
@@ -224,10 +221,11 @@ namespace SAGA.MBI.DataArrange
|
|
|
/// </summary>
|
|
|
public static VMUploadModeManage PrepareUploadFloors()
|
|
|
{
|
|
|
+ Log4Net.Info("PrepareUpload Start");
|
|
|
string currentFloor = string.Empty;
|
|
|
+ VMUploadModeManage vm = new VMUploadModeManage();
|
|
|
try
|
|
|
{
|
|
|
- VMUploadModeManage vm = new VMUploadModeManage();
|
|
|
//获取有模型文件的楼层
|
|
|
var allFloors = GetHasFileFloors();
|
|
|
//获取MD5改变的文件
|
|
@@ -240,74 +238,16 @@ namespace SAGA.MBI.DataArrange
|
|
|
foreach (UploadFloor uploadFloor in modifyFloors)
|
|
|
{
|
|
|
if (uploadFloor == null) continue;
|
|
|
- //检测到自己加锁 才读取日志
|
|
|
- if (uploadFloor.MFloor.FloorLock.LockState != MFloorLockState.LockBySelf)
|
|
|
- continue;
|
|
|
currentFloor = uploadFloor.MFloor.ToString();
|
|
|
- Document document = null;
|
|
|
try
|
|
|
{
|
|
|
- #region 同步空间名称
|
|
|
- document = ExternalDataWrapper.Current.App.OpenDocumentFile(uploadFloor.MFloor.FullPath);
|
|
|
- MBIModelInfoManager.SyncPlatformToRevit(document);
|
|
|
- #endregion
|
|
|
-
|
|
|
- #region 跟据日志整理跟要上传的数据
|
|
|
- //检测有日志文件,才上传
|
|
|
- var logs = DalLogOperate.GetLogs(uploadFloor.MFloor.Id);
|
|
|
- if (!logs.Any()) continue;
|
|
|
- uploadFloor.CalcContext = DalCommon.DownLoadCouldData(uploadFloor.MFloor);
|
|
|
- CalcContext context = uploadFloor.CalcContext;
|
|
|
-
|
|
|
- //按id分组后的日志
|
|
|
- var floorLogsGroupByBimId = logs.GroupBy(t => t.Id);
|
|
|
- //所有的拓扑图类型
|
|
|
- var tempGriphs = new List<MTopologyGriph>(topologyGriphs);
|
|
|
- foreach (IGrouping<string, DocumentChangedLogMode> logGroup in floorLogsGroupByBimId)
|
|
|
+ #region 日志影响拓扑图
|
|
|
+ foreach (var topologyGriph in topologyGriphs)
|
|
|
{
|
|
|
- DocumentChangedLogMode log = logGroup.LastOrDefault();
|
|
|
- if (log == null) continue;
|
|
|
- var bimId = CommonTool.GetCloudBIMId(log.DocName, log.Id);
|
|
|
- var elem = document.GetElement(log.Id.ToInt());
|
|
|
- //日志影响构件
|
|
|
- var operate =
|
|
|
- (DocumentChangedOperator)Enum.Parse(typeof(DocumentChangedOperator), log.Operator);
|
|
|
- var mode = context.FindItem(bimId);
|
|
|
- //模型和物理世界都找不到这条数据,Next
|
|
|
- if (mode == null && elem == null) continue;
|
|
|
- switch (operate)
|
|
|
- {
|
|
|
- case DocumentChangedOperator.Add:
|
|
|
- case DocumentChangedOperator.Modified:
|
|
|
- case DocumentChangedOperator.Delete:
|
|
|
- OperateModifyLog(mode, elem, context);
|
|
|
- break;
|
|
|
- case DocumentChangedOperator.DeleteSaveDuty:
|
|
|
- OperateDelSaveDutyLog(mode);
|
|
|
- break;
|
|
|
- }
|
|
|
- #region 日志影响拓扑图
|
|
|
- //日志影响拓扑图,影响则标记,从所有中移除
|
|
|
- var useGriphs = new List<MTopologyGriph>(topologyGriphs);
|
|
|
- foreach (var topologyGriph in tempGriphs)
|
|
|
- {
|
|
|
- if (topologyGriph.IsAffectGriph(log))
|
|
|
- {
|
|
|
- useGriphs.Add(topologyGriph);
|
|
|
- uploadFloor.ReferGriphs.Add(topologyGriph);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- tempGriphs.RemoveAll(t => useGriphs.Contains(t));
|
|
|
-
|
|
|
- #endregion
|
|
|
+ uploadFloor.ReferGriphs.Add(topologyGriph);
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
#endregion
|
|
|
|
|
|
- //处理设备所在空间
|
|
|
- CheckEquipSpaceRlt(context);
|
|
|
uploadFloor.IsUpload = true;
|
|
|
|
|
|
}
|
|
@@ -317,18 +257,18 @@ namespace SAGA.MBI.DataArrange
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
|
- document?.CloseDoc();
|
|
|
}
|
|
|
}
|
|
|
vm.UploadFloors = modifyFloors;
|
|
|
vm.MTopologyGriphs = PrepareMTopologyGriphs(modifyFloors);
|
|
|
- return vm;
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
MessageShow.Show(e, strMessage: $"楼层 { currentFloor ?? string.Empty} 打开异常或网络异常,请检查后再进行操作!\r\n");
|
|
|
- return null;
|
|
|
+ vm = null;
|
|
|
}
|
|
|
+ Log4Net.Info("PrepareUpload Start");
|
|
|
+ return vm;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -353,7 +293,7 @@ namespace SAGA.MBI.DataArrange
|
|
|
//不知什么原因,日志就显示add,但物理世界存在这条信息
|
|
|
if (mode != null)
|
|
|
{
|
|
|
- IsEquipClassCodeChanged(mode,elem, revitmode, context);
|
|
|
+ IsEquipClassCodeChanged(mode, elem, revitmode, context);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -381,7 +321,7 @@ namespace SAGA.MBI.DataArrange
|
|
|
{
|
|
|
//待建模型清单新建的设备
|
|
|
cloudmode.BimID = revitmode.BimID;
|
|
|
- IsEquipClassCodeChanged(cloudmode,elem, revitmode, context);
|
|
|
+ IsEquipClassCodeChanged(cloudmode, elem, revitmode, context);
|
|
|
context.Add(cloudmode);
|
|
|
}
|
|
|
}
|
|
@@ -397,7 +337,7 @@ namespace SAGA.MBI.DataArrange
|
|
|
/// <param name="tempmode"></param>
|
|
|
/// <param name="context"></param>
|
|
|
/// <returns></returns>
|
|
|
- private static bool IsEquipClassCodeChanged(MRevitEquipBase mode,Element elem, MRevitEquipBase tempmode, CalcContext context)
|
|
|
+ private static bool IsEquipClassCodeChanged(MRevitEquipBase mode, Element elem, MRevitEquipBase tempmode, CalcContext context)
|
|
|
{
|
|
|
bool result = false;
|
|
|
|
|
@@ -652,13 +592,96 @@ namespace SAGA.MBI.DataArrange
|
|
|
list.Add(new MTopologyGriph() { Name = "空间流通网络" });
|
|
|
return list;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- public enum UploadType
|
|
|
- {
|
|
|
- //文件模型修正
|
|
|
- ModeModify,
|
|
|
- //更新模型文件
|
|
|
- FileReplace
|
|
|
+ /// <summary>
|
|
|
+ /// 新旧文件对比过后,需要添加的数据
|
|
|
+ /// </summary>
|
|
|
+ public static void WrapperContext(CalcContext cloudContext, CalcContext localContext)
|
|
|
+ {
|
|
|
+ CalcContext addContext = null;
|
|
|
+ CalcContext delContext = null;
|
|
|
+ CalcContext modifyContext = null;
|
|
|
+ var cloudDutys = cloudContext.GetAllDutys();
|
|
|
+ var localDutys = localContext.GetAllDutys();
|
|
|
+ //设置初始状态
|
|
|
+ cloudContext.SetState(DocumentChangedOperator.None);
|
|
|
+ localContext.SetState(DocumentChangedOperator.None);
|
|
|
+ #region Modify
|
|
|
+ foreach (var lduty in localContext.GetAllDutys())
|
|
|
+ {
|
|
|
+ string bimId = lduty.BimID;
|
|
|
+ var cdutys = cloudDutys.Where(t => t.BimID == bimId).ToList();
|
|
|
+ MRevitEquipBase cduty = null;
|
|
|
+ //如果对应多个岗位,仅保留信息点多的岗位,删除其它岗位
|
|
|
+ if (cdutys.Any())
|
|
|
+ {
|
|
|
+ if (cdutys.Count() > 1)
|
|
|
+ {//信息点的个数从大到小排序
|
|
|
+ cdutys.Sort((x, y) => { return -x.CloundJObject.Count.CompareTo(y.CloundJObject.Count); });
|
|
|
+ //删除多余的岗位
|
|
|
+ for (int i = 1; i < cdutys.Count; i++)
|
|
|
+ {
|
|
|
+ cdutys[i].Operator = DocumentChangedOperator.Delete;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ cduty = cdutys.FirstOrDefault();
|
|
|
+ }
|
|
|
+ if (cduty == null)
|
|
|
+ continue;
|
|
|
+ //判断族编码是否更改
|
|
|
+ if (EquipmentCodeMap.GetOriginCode(lduty.EquipClassCode) !=
|
|
|
+ EquipmentCodeMap.GetOriginCode(cduty.EquipClassCode))
|
|
|
+ {
|
|
|
+ //族编码更改。删除旧岗位,创建新岗位
|
|
|
+ cduty.Operator = DocumentChangedOperator.Delete;
|
|
|
+ lduty.Operator = DocumentChangedOperator.Add;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ lduty.Id = cduty.Id;
|
|
|
+ lduty.Operator = DocumentChangedOperator.Modified;
|
|
|
+ cduty.Operator = DocumentChangedOperator.Modified;
|
|
|
+ }
|
|
|
+ //处理设备所在空间的关系
|
|
|
+ //??删除重建??没错
|
|
|
+ var equipInSpace = localContext.RltEquipInSpaces.FirstOrDefault(t => t.MEquipment.BimID == bimId);
|
|
|
+ if (equipInSpace == null) continue;
|
|
|
+ equipInSpace.Operator = DocumentChangedOperator.Delete;
|
|
|
+ localContext.RltEquipInSpaces.Add(new RltEquipInSpace(equipInSpace.MSpace, equipInSpace.MEquipment) { Operator = DocumentChangedOperator.Add });
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region Delete
|
|
|
+
|
|
|
+ //CloudDuty,有两种操作,更新和删除。更新等价于None
|
|
|
+ foreach (var duty in cloudDutys)
|
|
|
+ {
|
|
|
+ //物理世界修改,不做处理
|
|
|
+ if (duty.Operator == DocumentChangedOperator.Modified)
|
|
|
+ {
|
|
|
+ duty.Operator = DocumentChangedOperator.None;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ duty.Operator = DocumentChangedOperator.Delete;
|
|
|
+ //删除时,会删除所在空间和所在楼层的关系
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region Add
|
|
|
+
|
|
|
+ //LocalDuty,有两种操作,更新和增加。除Modify以外的全部为添加
|
|
|
+ foreach (var duty in localDutys)
|
|
|
+ {
|
|
|
+ if (duty.Operator == DocumentChangedOperator.Modified) continue;
|
|
|
+ duty.Operator = DocumentChangedOperator.Add;
|
|
|
+ //添加时,添加设备所在元空间关系
|
|
|
+ localContext.RltEquipInSpaces.Where(t => t.MEquipment.BimID == duty.BimID).ToList()
|
|
|
+ .ForEach(t => t.Operator = DocumentChangedOperator.Add);
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
}
|