InstanceLocationOverlapCheck.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /* ==============================================================================
  2. * 功能描述:xyz坐标重叠检查
  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.Others;
  12. using SAGA.RevitUtils;
  13. using SAGA.RevitUtils.Extends;
  14. namespace Saga.PlugIn.ModelCheck
  15. {
  16. /// <summary>
  17. ///
  18. /// </summary>
  19. [ParseIndex(Index = 13)]
  20. class InstanceLocationOverlapCheck : ModeCheckBase
  21. {
  22. public InstanceLocationOverlapCheck()
  23. {
  24. Name = "xyz坐标重叠检查";
  25. }
  26. public override bool Check()
  27. {
  28. if (!RBase.IsRight)
  29. {
  30. IsRight = RBase.IsRight;
  31. return IsRight;
  32. }
  33. IsRight = SubCheck();
  34. return IsRight;
  35. }
  36. /// <summary>
  37. /// 族名称编码规范检查
  38. /// </summary>
  39. /// <returns></returns>
  40. private bool SubCheck()
  41. {
  42. bool unitResult = true;
  43. foreach (SagaSignCheckResult signResult in RBase.Results)
  44. {
  45. var doc = signResult.RDocument;
  46. var instances = doc.GetFamilyInstances();
  47. instances = instances.Where(t => t.GetLocationPoint() != null).ToList();
  48. var groups = instances.GroupBy(t => t.GetLocationPoint(),new XyzEqualComparer(0.01d));
  49. foreach (var group in groups)
  50. {
  51. var key = group.Key;
  52. if(key==null)continue;
  53. var list = group.ToList();
  54. if(list.Count==1)continue;
  55. var fi = list.FirstOrDefault();
  56. var result = GetCheckResult(fi);
  57. list.Remove(fi);
  58. if (result == null) continue;
  59. result.RMessage = $"与{string.Join(",", list.Select(t => t.Id.ToString()))}的坐标发生重叠,请检查";
  60. Results.Add(result);
  61. }
  62. }
  63. return Results.All(t => t.IsRight);
  64. }
  65. /// <summary>
  66. /// 获取检测结果
  67. /// </summary>
  68. /// <param name="fi"></param>
  69. /// <returns></returns>
  70. private InstanceLocationOverlapCheckResult GetCheckResult(Element fi)
  71. {
  72. var result = new InstanceLocationOverlapCheckResult(){IsRight = false};
  73. result.Id = fi.Id.ToString();
  74. result.FamilyName = fi.GetFamilyName();
  75. return result;
  76. }
  77. //[DataCheckProcessAspect]
  78. public override void Export()
  79. {
  80. // Check();
  81. try
  82. {
  83. IWorkbook book = DCRExport.GetWorkbook();
  84. ISheet sheet = book.GetSheet(Name);
  85. #region 添加数据
  86. int index = 3;
  87. foreach (InstanceLocationOverlapCheckResult result in Results)
  88. {
  89. //数量多过,只显示有问题的
  90. if (result.IsRight) continue;
  91. index++;
  92. IRow rowN = sheet.CreateRow(index);
  93. DataCheckNPOIStyle style = result.IsRight ? DataCheckNPOIStyle.Content : DataCheckNPOIStyle.Error;
  94. int j = -1;
  95. rowN.AddCell(++j, result.FamilyName, style);
  96. rowN.AddCell(++j, result.Id, style);
  97. string rowN4 = result.IsRight ? "通过" : "不通过";
  98. rowN.AddCell(++j, rowN4, style);
  99. rowN.AddCell(++j, result.RMessage, style);
  100. }
  101. #endregion
  102. }
  103. catch (Exception e)
  104. {
  105. MessageShowBase.Show(e);
  106. }
  107. }
  108. }
  109. class InstanceLocationOverlapCheckResult : ModeCheckResultBase
  110. {
  111. public string FamilyName { get; set; }
  112. public string Id { get; set; }
  113. }
  114. }