ConnectorCheck.cs 8.5 KB

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