EquipReferSystemCheck.cs 7.4 KB

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