|
@@ -9,6 +9,7 @@ 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;
|
|
@@ -52,10 +53,10 @@ namespace SAGA.MBI.DataArrange
|
|
|
/// <summary>
|
|
|
/// 对比文件,开始下载
|
|
|
/// </summary>
|
|
|
- public static void BeginDownLoadFile()
|
|
|
+ public static bool BeginDownLoadFile()
|
|
|
{
|
|
|
List<Tuple<string, int, string>> tuples = DalVisionOperate.GetNeedDownLoadFiles();
|
|
|
- int i = 0;
|
|
|
+ int i = 0,j = 0;
|
|
|
int count = tuples.Count;
|
|
|
foreach (var tuple in tuples)
|
|
|
{
|
|
@@ -68,11 +69,17 @@ namespace SAGA.MBI.DataArrange
|
|
|
|
|
|
//下载成功清除本机本层的日志数据,其它用户的日志上传成功的时候才清除日志
|
|
|
ProjectLogManager.ClearFile(tuple.Item1);
|
|
|
+ j++;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
if (count >= 1)
|
|
|
//下载完成提示窗体;文件服务器缺少文件,会出现进度条无法关闭的情况;
|
|
|
UpLoadFileRequest.CloseDownloadWin(count == i, hasTip: true);
|
|
|
+ return i == j;
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// 重新下载模型文件
|
|
@@ -235,72 +242,86 @@ namespace SAGA.MBI.DataArrange
|
|
|
if (uploadFloor.MFloor.FloorLock.LockState != MFloorLockState.LockBySelf)
|
|
|
continue;
|
|
|
currentFloor = uploadFloor.MFloor.FullPath;
|
|
|
- #region 同步空间名称
|
|
|
- var document = ExternalDataWrapper.Current.App.OpenDocumentFile(uploadFloor.MFloor.FullPath);
|
|
|
- MBIModelInfoManager.SyncPlatformToRevit(document);
|
|
|
- #endregion
|
|
|
- //检测有日志文件,才上传
|
|
|
- var logs = DalLogOperate.GetLogs(uploadFloor.MFloor.Id);
|
|
|
- if (!logs.Any()) continue;
|
|
|
- CalcContext context = DalCommon.DownLoadCouldData(uploadFloor.MFloor);
|
|
|
- context.OpenDocument();
|
|
|
- uploadFloor.CalcContext = context;
|
|
|
- //按id分组后的日志
|
|
|
- var floorLogsGroupByBimId = logs.GroupBy(t => t.Id);
|
|
|
- //所有的拓扑图类型
|
|
|
- var tempGriphs = new List<MTopologyGriph>(topologyGriphs);
|
|
|
- foreach (IGrouping<string, DocumentChangedLogMode> logGroup in floorLogsGroupByBimId)
|
|
|
+ Document document = null;
|
|
|
+ try
|
|
|
{
|
|
|
- DocumentChangedLogMode log = logGroup.FirstOrDefault();
|
|
|
- if (log == null) continue;
|
|
|
- var bimId = CommonTool.GetCloudBIMId(log.DocName, log.Id);
|
|
|
- var elem = context.RevitDoc.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 同步空间名称
|
|
|
+ document = ExternalDataWrapper.Current.App.OpenDocumentFile(uploadFloor.MFloor.FullPath);
|
|
|
+ MBIModelInfoManager.SyncPlatformToRevit(document);
|
|
|
+ #endregion
|
|
|
|
|
|
- //日志影响拓扑图,影响则标记,从所有中移除
|
|
|
- var useGriphs = new List<MTopologyGriph>(topologyGriphs);
|
|
|
- foreach (var topologyGriph in tempGriphs)
|
|
|
+ //检测有日志文件,才上传
|
|
|
+ var logs = DalLogOperate.GetLogs(uploadFloor.MFloor.Id);
|
|
|
+ if (!logs.Any()) continue;
|
|
|
+ uploadFloor.CalcContext = DalCommon.DownLoadCouldData(uploadFloor.MFloor);
|
|
|
+ //按id分组后的日志
|
|
|
+ var floorLogsGroupByBimId = logs.GroupBy(t => t.Id);
|
|
|
+ //所有的拓扑图类型
|
|
|
+ var tempGriphs = new List<MTopologyGriph>(topologyGriphs);
|
|
|
+ foreach (IGrouping<string, DocumentChangedLogMode> logGroup in floorLogsGroupByBimId)
|
|
|
{
|
|
|
- if (topologyGriph.IsAffectGriph(log))
|
|
|
+ CalcContext context = uploadFloor.CalcContext;
|
|
|
+ DocumentChangedLogMode log = logGroup.FirstOrDefault();
|
|
|
+ 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)
|
|
|
{
|
|
|
- useGriphs.Add(topologyGriph);
|
|
|
- uploadFloor.ReferGriphs.Add(topologyGriph);
|
|
|
+ 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
|
|
|
+
|
|
|
+ //处理设备所在空间
|
|
|
+ CheckEquipSpaceRlt(context);
|
|
|
+ uploadFloor.IsUpload = true;
|
|
|
}
|
|
|
- tempGriphs.RemoveAll(t => useGriphs.Contains(t));
|
|
|
+
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ Console.WriteLine(e);
|
|
|
+ throw;
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ document?.CloseDoc();
|
|
|
}
|
|
|
- //处理设备所在空间
|
|
|
- CheckEquipSpaceRlt(context);
|
|
|
- uploadFloor.IsUpload = true;
|
|
|
}
|
|
|
vm.UploadFloors = modifyFloors;
|
|
|
vm.MTopologyGriphs = PrepareMTopologyGriphs(modifyFloors);
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
- //MessageShowBase.Show(e);
|
|
|
- MessageShow.Show(e, strMessage: $"楼层 { currentFloor ?? string.Empty} 打开异常,请检查!");
|
|
|
- }
|
|
|
- finally
|
|
|
- {
|
|
|
- CloseFloorDoc(modifyFloors);
|
|
|
+ MessageShow.Show(e, strMessage: $"楼层 { currentFloor ?? string.Empty} 打开异常或网络异常,请检查后再进行操作!");
|
|
|
+ vm = null;
|
|
|
}
|
|
|
|
|
|
return vm;
|
|
@@ -386,6 +407,7 @@ namespace SAGA.MBI.DataArrange
|
|
|
//如果设备族四位或六位改了,需要将岗位删除,重建岗位
|
|
|
if (mode.EquipClassCode != tempmode.EquipClassCode)
|
|
|
{
|
|
|
+ SetSavePropertyValue(tempmode, mode);
|
|
|
mode.Operator = DocumentChangedOperator.Delete;
|
|
|
tempmode.Operator = DocumentChangedOperator.Add;
|
|
|
context.Add(tempmode);
|
|
@@ -399,7 +421,29 @@ namespace SAGA.MBI.DataArrange
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
+ /// <summary>
|
|
|
+ /// 编码更改时保留的信息点
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="mode"></param>
|
|
|
+ /// <param name="oldmode"></param>
|
|
|
+ public static void SetSavePropertyValue(MRevitEquipBase mode, MRevitEquipBase oldmode)
|
|
|
+ {
|
|
|
+ string[] saveProperties = new[] { "LocalId", "LocalName" };
|
|
|
+ var oldProperties = oldmode.GetType().GetProperties();
|
|
|
|
|
|
+ foreach (PropertyInfo property in oldProperties)
|
|
|
+ {
|
|
|
+ string name = property.Name;
|
|
|
+ if (saveProperties.Contains(name))
|
|
|
+ {
|
|
|
+ object value = property.GetValue(oldmode);
|
|
|
+ if (value != null)
|
|
|
+ {
|
|
|
+ property.SetValue(mode, value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
/// <summary>
|
|
|
/// 1,处理是无用的空间,周长为零
|
|
|
/// 2,对象被删除
|
|
@@ -493,7 +537,7 @@ namespace SAGA.MBI.DataArrange
|
|
|
/// <param name="context"></param>
|
|
|
private static void OperateEquipInSpace(MRevitEquipBase mode, CalcContext context)
|
|
|
{
|
|
|
- if (mode.Operator == DocumentChangedOperator.None) return;
|
|
|
+ //if (mode.Operator == DocumentChangedOperator.None) return;
|
|
|
var revitId = mode.BimID.GetBIMID();
|
|
|
var fi = context.RevitDoc.GetElement(revitId) as FamilyInstance;
|
|
|
Autodesk.Revit.DB.Mechanical.Space space = fi?.Space;
|
|
@@ -507,13 +551,26 @@ namespace SAGA.MBI.DataArrange
|
|
|
case DocumentChangedOperator.Add:
|
|
|
context.RltEquipInSpaces.Add(new RltEquipInSpace(mspace, mode) { Operator = DocumentChangedOperator.Add });
|
|
|
break;
|
|
|
+ case DocumentChangedOperator.Delete:
|
|
|
+ context.RltEquipInSpaces.Add(new RltEquipInSpace(null, mode) { Operator = DocumentChangedOperator.Delete });
|
|
|
+ break;
|
|
|
case DocumentChangedOperator.Modified:
|
|
|
//修改为,先删除,再新建
|
|
|
context.RltEquipInSpaces.Add(new RltEquipInSpace(null, mode) { Operator = DocumentChangedOperator.Delete });
|
|
|
context.RltEquipInSpaces.Add(new RltEquipInSpace(mspace, mode) { Operator = DocumentChangedOperator.Add });
|
|
|
break;
|
|
|
- case DocumentChangedOperator.Delete:
|
|
|
- context.RltEquipInSpaces.Add(new RltEquipInSpace(null, mode) { Operator = DocumentChangedOperator.Delete });
|
|
|
+ case DocumentChangedOperator.None:
|
|
|
+ //空间更改可能不引起设备修改,所以设备所在元空间关系跟据元空间状态重新计算。
|
|
|
+ if (mspace.Operator == DocumentChangedOperator.Add ||
|
|
|
+ mspace.Operator == DocumentChangedOperator.Modified)
|
|
|
+ {
|
|
|
+ context.RltEquipInSpaces.Add(new RltEquipInSpace(null, mode) { Operator = DocumentChangedOperator.Delete });
|
|
|
+ context.RltEquipInSpaces.Add(new RltEquipInSpace(mspace, mode) { Operator = DocumentChangedOperator.Add });
|
|
|
+ }
|
|
|
+ else if (mspace.Operator == DocumentChangedOperator.Delete)
|
|
|
+ {
|
|
|
+ context.RltEquipInSpaces.Add(new RltEquipInSpace(null, mode) { Operator = DocumentChangedOperator.Delete });
|
|
|
+ }
|
|
|
break;
|
|
|
}
|
|
|
}
|