DalLogOperate.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /* ==============================================================================
  2. * 功能描述:对revit日志的操作
  3. * 创 建 者:Garrett
  4. * 创建日期:2018/7/26 15:02:52
  5. * ==============================================================================*/
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using Autodesk.Revit.DB;
  12. using SAGA.DotNetUtils;
  13. using SAGA.DotNetUtils.Logger;
  14. using SAGA.MBI.Model;
  15. namespace SAGA.MBI.DataArrange
  16. {
  17. /// <summary>
  18. /// DalLogOperate
  19. /// </summary>
  20. public class DalLogOperate
  21. {
  22. /// <summary>
  23. /// 获取本层的日志记录
  24. /// </summary>
  25. /// <param name="doc"></param>
  26. /// <returns></returns>
  27. public static List<DocumentChangedLogMode> GetLogs(string path)
  28. {
  29. List<DocumentChangedLogMode> list = new List<DocumentChangedLogMode>();
  30. string logstr = ProjectLogManager.GetLogInfo(path);
  31. List<string> strs = logstr.Split(new string[] { "\r\n" }, StringSplitOptions.None).ToList();
  32. foreach (var str in strs)
  33. {
  34. try
  35. {
  36. if (str.IsNotNullEmpty())
  37. {
  38. var mode = str.JsonToObject<DocumentChangedLogMode>();
  39. list.Add(mode);
  40. }
  41. }
  42. catch (Exception e)
  43. {
  44. Log4Net.Info(e.StackTrace);
  45. }
  46. }
  47. return list;
  48. }
  49. /// <summary>
  50. /// 读取日志数据
  51. /// 工作区
  52. /// </summary>
  53. /// <param name="beginTime">开始时间</param>
  54. /// <param name="floorId">楼层Id</param>
  55. /// <returns></returns>
  56. public static List<DocumentChangedLogMode> LoadLog(DateTime beginTime, string floorId = "")
  57. {
  58. List<DocumentChangedLogMode> list = GetAllLogs();
  59. var datas = list.Where(t => DateTime.Parse(t.DataTime) >= beginTime);
  60. if (floorId != "") datas = datas.Where(t => t.DocName == floorId);
  61. return datas.ToList();
  62. }
  63. public static List<DocumentChangedLogMode> GetAllLogs()
  64. {
  65. List<DocumentChangedLogMode> allDatas = new List<DocumentChangedLogMode>();
  66. var allFloorIds = GetAllRevitFiles();
  67. foreach (var floorId in allFloorIds)
  68. {
  69. var logs = GetLogs(floorId);
  70. allDatas.AddRange(logs);
  71. }
  72. return allDatas;
  73. }
  74. public static List<string> GetAllRevitFiles()
  75. {
  76. List<string> floorId = new List<string>();
  77. var projectFloors = DalModeFileManange.GetMissFileFloors(false);
  78. projectFloors.ForEach((tni) => GetFilePaths(tni, floorId));
  79. return floorId;
  80. }
  81. /// <summary>
  82. /// 获取所有楼层信息
  83. /// </summary>
  84. /// <param name="tni"></param>
  85. /// <param name="files"></param>
  86. private static void GetFilePaths(TreeNodeItem tni, List<string> files)
  87. {
  88. if (tni.Item is MFloor floor)
  89. {
  90. files.Add(floor.Id);
  91. }
  92. else
  93. {
  94. foreach (TreeNodeItem t in tni.Children)
  95. {
  96. GetFilePaths(t, files);
  97. }
  98. }
  99. }
  100. /// <summary>
  101. /// 合并日志,最终输出为一条有用的日志;注意可能为null
  102. /// 移出所有add和del之间的日志,
  103. /// 没有成对的,取出add或del日志,
  104. /// 如果没有add和del日志取出第一条日志。
  105. /// </summary>
  106. /// <param name="logs"></param>
  107. /// <returns></returns>
  108. public static DocumentChangedLogMode CombineLogs(List<DocumentChangedLogMode> logs)
  109. {
  110. DocumentChangedLogMode log = null;
  111. while (true)
  112. {
  113. int addIndex = logs.FindIndex(t => t.Operator == DocumentChangedOperator.Add.ToString());
  114. int delIndex = logs.FindIndex(t => t.Operator == DocumentChangedOperator.Delete.ToString());
  115. if (addIndex != -1 && delIndex != -1)
  116. {
  117. int startIndex = addIndex > delIndex ? delIndex : addIndex;
  118. int count = Math.Abs(addIndex - delIndex) + 1;
  119. logs.RemoveRange(startIndex, count);
  120. continue;
  121. }
  122. if (addIndex != -1 || delIndex != -1)
  123. {
  124. int index = addIndex != -1 ? addIndex : delIndex;
  125. log = logs[index];
  126. }
  127. else
  128. {
  129. log = logs.FirstOrDefault();
  130. }
  131. break;
  132. }
  133. return log;
  134. }
  135. }
  136. }