ConnectorCheck.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  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;
  12. using SAGA.DotNetUtils.Extend;
  13. using SAGA.DotNetUtils.Others;
  14. using SAGA.RevitUtils.Extends;
  15. using SAGA.RevitUtils.MEP;
  16. namespace Saga.PlugIn.ModelCheck
  17. {
  18. /// <summary>
  19. /// UnitCheck
  20. /// </summary>
  21. class ConnectorCheck : ModeCheckBase
  22. {
  23. public ConnectorCheck()
  24. {
  25. Name = "连接件检查";
  26. RSPecificationSheet.Add("参考-连接件对照表");
  27. }
  28. public override bool Check()
  29. {
  30. if (!RBase.IsRight)
  31. {
  32. IsRight = RBase.IsRight;
  33. return IsRight;
  34. }
  35. IsRight = GetCheckResult();
  36. return IsRight;
  37. }
  38. private bool GetCheckResult()
  39. {
  40. bool unitResult = true;
  41. m_ProDefineConnectors = GetPreDefineConnectors();
  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 (var 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. private string m_HaveConnectorSing = "√";
  71. private List<DCR_Connector> m_ProDefineConnectors;
  72. public List<DCR_Connector> GetPreDefineConnectors()
  73. {
  74. var list = new List<DCR_Connector>();
  75. var alllist = DataCheckRule.GetPreDefineConnectors();
  76. foreach (DCR_Connector connector in alllist)
  77. {
  78. var pipeType = connector.PipeConnector;
  79. var hvacType = connector.HvacConnector;
  80. if (pipeType == m_HaveConnectorSing || hvacType == m_HaveConnectorSing)
  81. {
  82. list.Add(connector);
  83. if (connector.PName.IsNotNullEmpty() && connector.PCode.IsNotNullEmpty())
  84. {
  85. //部件单独提出来当做一项
  86. var pconnector = new DCR_Connector()
  87. {
  88. Code = connector.PCode,
  89. Name = connector.Name,
  90. PipeConnector = connector.PipeConnector,
  91. HvacConnector = connector.HvacConnector
  92. };
  93. list.Add(pconnector);
  94. }
  95. }
  96. }
  97. return list;
  98. }
  99. /// <summary>
  100. /// 获取检测结果
  101. /// </summary>
  102. /// <param name="fi"></param>
  103. /// <returns></returns>
  104. private ModeCheckResultBase GetCheckResult(Element element)
  105. {
  106. if (element == null) return null;
  107. var result = new ConnectorCheckResult();
  108. var code = element.GetFamilyCode();
  109. var defineConType = GetDefineConType(code);
  110. if (defineConType == null) return null;
  111. result.FamilyName = element.GetFamilyName();
  112. result.Type = code.Length == 4 ? DCElementType.Equipment : DCElementType.EuipmentPart;
  113. result.Id = element.Id.ToString();
  114. result.IsRight = true;
  115. CheckConType(result, element, defineConType.Item1);
  116. CheckConType(result, element, defineConType.Item2);
  117. return result;
  118. }
  119. /// <summary>
  120. /// 获取定义的风和水连接件类型
  121. /// </summary>
  122. /// <param name="code"></param>
  123. /// <returns></returns>
  124. private Tuple<Domain, Domain> GetDefineConType(string code)
  125. {
  126. var item = m_ProDefineConnectors.FirstOrDefault(t => t.Code == code);
  127. if (item == null) return null;
  128. var pipeType = item.PipeConnector;
  129. var hvacType = item.HvacConnector;
  130. var pipeConType = pipeType == m_HaveConnectorSing ? Domain.DomainPiping : Domain.DomainUndefined;
  131. var hvacConType = hvacType == m_HaveConnectorSing ? Domain.DomainHvac : Domain.DomainUndefined;
  132. return new Tuple<Domain, Domain>(pipeConType, hvacConType);
  133. }
  134. /// <summary>
  135. /// 检查连接件类型是否存在
  136. /// </summary>
  137. /// <param name="result"></param>
  138. /// <param name="domain"></param>
  139. private void CheckConType(ConnectorCheckResult result,Element fi, Domain domain)
  140. {
  141. if (domain != Domain.DomainUndefined)
  142. {
  143. var connectors = fi.GetConnectors(domain);
  144. if (!connectors.Any())
  145. {
  146. result.IsRight = false;
  147. result.RMessage += $"缺少 {DomainToString(domain)} 连接件;";
  148. }
  149. else
  150. {
  151. if (!connectors.All(t => t.IsConnected))
  152. {
  153. result.IsRight = false;
  154. result.RMessage += $"发现 {DomainToString(domain)}连接件未连接;";
  155. }
  156. }
  157. }
  158. }
  159. private string DomainToString(Domain domain)
  160. {
  161. string str = "";
  162. switch (domain)
  163. {
  164. case Domain.DomainPiping:
  165. str = "水管";
  166. break;
  167. case Domain.DomainHvac:
  168. str = "风管";
  169. break;
  170. default:
  171. str = "未知";
  172. break;
  173. }
  174. return str;
  175. }
  176. //[DataCheckProcessAspect]
  177. public override void Export()
  178. {
  179. try
  180. {
  181. IWorkbook book = DCRExport.GetWorkbook();
  182. //ISheet sheet = book.CreateSheet(Name);
  183. ISheet sheet = book.GetSheet(Name);
  184. #region 添加数据
  185. int index = 3;
  186. //添加 共检查XXX条数据,未通过检查的如下 提示
  187. IRow rowTip = sheet.CreateRow(index - 1);
  188. rowTip.AddCell(0, $"总检查{Results.Count}条数据,未通过检查的如下", DataCheckNPOIStyle.Title);
  189. foreach (ConnectorCheckResult result in Results)
  190. {
  191. SagaSignCheckResult rbase = result.RBase as SagaSignCheckResult;
  192. if (rbase == null)
  193. continue;
  194. //数量多过,只显示有问题的
  195. if (result.IsRight) continue;
  196. index++;
  197. IRow rowN = sheet.CreateRow(index);
  198. DataCheckNPOIStyle style = result.IsRight ? DataCheckNPOIStyle.Content : DataCheckNPOIStyle.Error;
  199. int j = -1;
  200. rowN.AddCell(++j, result.FamilyName, style);
  201. rowN.AddCell(++j, result.Type.GetDescription(), style);
  202. rowN.AddCell(++j, result.Id, style);
  203. string rowN4 = result.IsRight ? "通过" : "不通过";
  204. rowN.AddCell(++j, rowN4, style);
  205. rowN.AddCell(++j, result.RMessage, style);
  206. }
  207. #endregion
  208. }
  209. catch (Exception e)
  210. {
  211. MessageShowBase.Show(e);
  212. }
  213. }
  214. }
  215. class ConnectorCheckResult : ModeCheckResultBase
  216. {
  217. public string FamilyName { get; set; }
  218. public DCElementType Type { get; set; }
  219. public string Id { get; set; }
  220. }
  221. }