EquipReferSystemCheck.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /* ==============================================================================
  2. * 功能描述:管网及相关设备检查检查
  3. * 创 建 者:Garrett
  4. * 创建日期:2018/10/23 15:08:55
  5. * ==============================================================================*/
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using Autodesk.Revit.DB;
  10. using NPOI.SS.UserModel;
  11. using SAGA.DotNetUtils.Logger;
  12. using SAGA.DotNetUtils.Others;
  13. using SAGA.RevitUtils.Extends;
  14. using SAGA.RevitUtils.MEP;
  15. namespace Saga.PlugIn.ModelCheck
  16. {
  17. /// <summary>
  18. /// UnitCheck
  19. /// </summary>
  20. class EquipReferSystemCheck : ModeCheckBase
  21. {
  22. public EquipReferSystemCheck()
  23. {
  24. Name = "管网及相关设备检查";
  25. RSPecificationSheet.Add("参考-管网及相关设备");
  26. }
  27. public override bool Check()
  28. {
  29. if (!RBase.IsRight)
  30. {
  31. IsRight = RBase.IsRight;
  32. return IsRight;
  33. }
  34. IsRight = GetCheckResult();
  35. return IsRight;
  36. }
  37. private List<DCR_EquipReferSystem> m_EquipReferSystems;
  38. private bool GetCheckResult()
  39. {
  40. bool unitResult = true;
  41. m_EquipReferSystems = DataCheckRule.GetEquipReferSystems();
  42. foreach (SagaSignCheckResult signResult in RBase.Results)
  43. {
  44. var list = Check(signResult);
  45. Results.AddRange(list);
  46. }
  47. return Results.All(t => t.IsRight);
  48. }
  49. /// <summary>
  50. /// 获取所有的设备或者部件
  51. /// </summary>
  52. /// <param name="document"></param>
  53. /// <returns></returns>
  54. private List<ModeCheckResultBase> Check(SagaSignCheckResult signResult)
  55. {
  56. List<ModeCheckResultBase> list = new List<ModeCheckResultBase>();
  57. var elements = signResult.RDocument.GetFamilyInstances();
  58. foreach (Element element in elements)
  59. {
  60. if (element.IsEquipment() || element.IsEquipmentPart())
  61. {
  62. var result = GetCheckResult(element);
  63. if (result == null) continue;
  64. result.RBase = signResult;
  65. list.Add(result);
  66. }
  67. }
  68. return list;
  69. }
  70. /// <summary>
  71. /// 获取检测结果
  72. /// </summary>
  73. /// <param name="fi"></param>
  74. /// <returns></returns>
  75. private ModeCheckResultBase GetCheckResult(Element element)
  76. {
  77. var result = new EquipReferSystemCheckResult();
  78. var code = element.GetFamilyCode();
  79. var referSystems = GetReferSystems(code);
  80. if (referSystems.Count == 0) return null;
  81. result.FamilyName = element.GetFamilyName();
  82. result.Id = element.Id.ToString();
  83. var tuple = CheckConType(element, referSystems);
  84. result.IsRight = !tuple.Item2.Any();
  85. result.PassConnectorsName += string.Join("、", tuple.Item1.ToArray());
  86. result.UnPassConnectorsName += string.Join("、", tuple.Item2.ToArray());
  87. if (!result.IsRight)
  88. {
  89. result.RMessage = $"连接件所连接的管道系统与规范不一致,请检查";
  90. }
  91. return result;
  92. }
  93. /// <summary>
  94. /// 可以与设备连接的系统
  95. /// </summary>
  96. /// <param name="code"></param>
  97. /// <returns></returns>
  98. private List<string> GetReferSystems(string code)
  99. {
  100. var item = m_EquipReferSystems.FirstOrDefault(t => t.EquipName == code)?.Systems ?? new List<string>();
  101. return item;
  102. }
  103. /// <summary>
  104. /// 检查连接件连接的管道系统是否符合规范
  105. /// </summary>
  106. /// <param name="result"></param>
  107. /// <param name="domain"></param>
  108. private Tuple<List<string>,List<string>> CheckConType(Element element, List<string> referSystems)
  109. {
  110. List<string> passList=new List<string>();
  111. List<string> unpassList=new List<string>();
  112. var connectors = element.GetAllConnectors();
  113. foreach (Connector connector in connectors)
  114. {
  115. try
  116. {
  117. var mepSystem = connector.MEPSystem;
  118. if (mepSystem == null) continue;
  119. var elementId = mepSystem.GetTypeId();
  120. var type = element.Document.GetElement(elementId);
  121. if (!referSystems.Contains(type.Name))
  122. {
  123. unpassList.Add(type.Name);
  124. }
  125. else
  126. {
  127. passList.Add(type.Name);
  128. }
  129. }
  130. catch (Exception e)
  131. {
  132. Log4Net.Info($"读取连接件系统错误。Id:{element.Id},Path:{element.Document.PathName}");
  133. }
  134. }
  135. return new Tuple<List<string>, List<string>>(passList, unpassList);
  136. }
  137. //[DataCheckProcessAspect]
  138. public override void Export()
  139. {
  140. try
  141. {
  142. IWorkbook book = DCRExport.GetWorkbook();
  143. //ISheet sheet = book.CreateSheet(Name);
  144. ISheet sheet = book.GetSheet(Name);
  145. #region 添加数据
  146. int index = 3;
  147. //添加 共检查XXX条数据,未通过检查的如下 提示
  148. IRow rowTip = sheet.CreateRow(index - 1);
  149. rowTip.AddCell(0, $"总检查{Results.Count}条数据,未通过检查的如下", DataCheckNPOIStyle.Title);
  150. foreach (EquipReferSystemCheckResult result in Results)
  151. {
  152. SagaSignCheckResult rbase = result.RBase as SagaSignCheckResult;
  153. if (rbase == null)
  154. continue;
  155. //数量多过,只显示有问题的
  156. if (result.IsRight) continue;
  157. index++;
  158. IRow rowN = sheet.CreateRow(index);
  159. DataCheckNPOIStyle style = result.IsRight ? DataCheckNPOIStyle.Content : DataCheckNPOIStyle.Error;
  160. int j = -1;
  161. rowN.AddCell(++j, result.FamilyName, style);
  162. rowN.AddCell(++j, result.Id, style);
  163. rowN.AddCell(++j, result.PassConnectorsName, style);
  164. rowN.AddCell(++j, result.UnPassConnectorsName, style);
  165. string rowN4 = result.IsRight ? "通过" : "不通过";
  166. rowN.AddCell(++j, rowN4, style);
  167. rowN.AddCell(++j, result.RMessage, style);
  168. }
  169. #endregion
  170. }
  171. catch (Exception e)
  172. {
  173. MessageShowBase.Show(e);
  174. }
  175. }
  176. }
  177. class EquipReferSystemCheckResult : ModeCheckResultBase
  178. {
  179. public string FamilyName { get; set; }
  180. public string Id { get; set; }
  181. /// <summary>
  182. /// 通过的连接件系统名称
  183. /// </summary>
  184. public string PassConnectorsName { get; set; }
  185. /// <summary>
  186. /// 不通过的连接件系统名称
  187. /// </summary>
  188. public string UnPassConnectorsName { get; set; }
  189. }
  190. }