ComputerSpaceItem.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. /*-------------------------------------------------------------------------
  2. * 功能描述:ComputerSpaceItem
  3. * 作者:xulisong
  4. * 创建时间: 2018/12/24 17:22:10
  5. * 版本号:v1.0
  6. * -------------------------------------------------------------------------*/
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using Autodesk.Revit.DB;
  13. using Autodesk.Revit.DB.Mechanical;
  14. using SAGA.DotNetUtils.Extend;
  15. using SAGA.RevitUtils;
  16. using SAGA.RevitUtils.Extends;
  17. using SAGA.RevitUtils.Utils;
  18. namespace SAGA.GplotRelationComputerManage
  19. {
  20. /// <summary>
  21. /// 计算相关信息
  22. /// </summary>
  23. public class ComputerSpaceItem
  24. {
  25. public ComputerSpaceItem(Space space)
  26. {
  27. this.Space = space;
  28. this.BimId = space.GetBimId();
  29. var mySegments = space.GetBoundarySegments(new SpatialElementBoundaryOptions());
  30. OriginCurves = new List<Curve>();
  31. var seg = mySegments.FirstOrDefault();
  32. if (seg != null)
  33. {
  34. this.OriginCurves = seg.Select(s => s.GetCurve()).ToList();
  35. }
  36. this.ZeroCurves = TransfomCurvesToZero(OriginCurves);
  37. Annular = InitAnnular(mySegments);
  38. }
  39. #region 存储逆时针多边形
  40. //private Annular m_Annular;
  41. /// <summary>
  42. /// 轮廓环形
  43. /// </summary>
  44. public Annular Annular { get; set; }
  45. private Annular InitAnnular(IList<IList<BoundarySegment>> segmentsList)
  46. {
  47. Annular annumlar = null;
  48. for (int i = 0; i < segmentsList.Count; i++)
  49. {
  50. var currentSegments = segmentsList[i];
  51. bool useSegments = false;
  52. var usePoints = new List<XYZ>();
  53. foreach (var boundarySegment in currentSegments)
  54. {
  55. if (!useSegments && !(this.Space.Document.GetElement(boundarySegment.ElementId) is FamilyInstance))
  56. {
  57. //如果边框都是由柱子组成,则不进行存储
  58. useSegments = true;
  59. }
  60. var curve = boundarySegment.GetCurve();
  61. var tempPoints = curve.Tessellate();
  62. //取出除最后一点外的所有点
  63. for (int j = 0; j < tempPoints.Count-1; j++)
  64. {
  65. usePoints.Add(tempPoints[j].NewZ(0));
  66. }
  67. }
  68. if (!useSegments)
  69. continue;
  70. if (i == 0)
  71. {
  72. #region 外轮廓处理,默认逆时针
  73. annumlar = new Annular(new Polygon(usePoints));
  74. #endregion
  75. }
  76. else
  77. {
  78. #region 内轮廓处理,默认顺时针。转成逆时针
  79. if (annumlar != null)
  80. {
  81. usePoints.Reverse();
  82. annumlar.InPolygons.Add(new Polygon(usePoints));
  83. }
  84. #endregion
  85. }
  86. }
  87. return annumlar;
  88. }
  89. #endregion
  90. public Space Space { get; private set; }
  91. /// <summary>
  92. /// bimId
  93. /// </summary>
  94. public string BimId { get; set; }
  95. /// <summary>
  96. /// 空间功能类型
  97. /// </summary>
  98. public string FuncType { get; set; }
  99. /// <summary>
  100. /// 原始边框
  101. /// </summary>
  102. public List<Curve> OriginCurves { get; set; }
  103. /// <summary>
  104. /// 投影边框
  105. /// </summary>
  106. public List<Curve> ZeroCurves { get; set; }
  107. /// <summary>
  108. /// 标志是否被处理
  109. /// </summary>
  110. public bool IsHandled { get; set; }
  111. #region 包围盒构件
  112. private Outline m_Box;
  113. public Outline Box
  114. {
  115. get
  116. {
  117. if (m_Box == null)
  118. {
  119. List<double> listX = new List<double>();
  120. List<double> listY = new List<double>();
  121. ZeroCurves.ForEach(c =>
  122. {
  123. var listXYZ = new List<XYZ>(c.Tessellate());
  124. listXYZ.ForEach(xyz =>
  125. {
  126. listX.Add(xyz.X);
  127. listY.Add(xyz.Y);
  128. });
  129. });
  130. var tupleX = GetMaxMin(listX);
  131. var tupleY = GetMaxMin(listY);
  132. if (tupleX == null || tupleY == null)
  133. {
  134. m_Box = new Outline(XYZ.Zero,XYZ.Zero);
  135. }
  136. else
  137. {
  138. double coff = 1;//扩充误差
  139. m_Box = new Outline(new XYZ(tupleX.Item2 - coff, tupleY.Item2 - coff,0),new XYZ(tupleX.Item1 + coff, tupleY.Item1+ coff,0));
  140. }
  141. }
  142. return m_Box;
  143. }
  144. }
  145. #endregion
  146. #region 私有方法
  147. private List<Curve> TransfomCurvesToZero(List<Curve> curves)
  148. {
  149. var zeroCurves = new List<Curve>();
  150. if (curves != null)
  151. {
  152. var z = curves.FirstOrDefault()?.StartPoint()?.Z;
  153. Transform tf = Transform.CreateTranslation(XYZ.Zero.NewZ(0 - z));
  154. foreach (var curve in curves)
  155. {
  156. zeroCurves.Add(curve.CreateTransformed(tf));
  157. }
  158. }
  159. return zeroCurves;
  160. }
  161. /// <summary>
  162. /// 取出集合的最大值和最小值Item1,最大值,Item2,最小值
  163. /// </summary>
  164. /// <param name="list"></param>
  165. /// <returns></returns>
  166. public Tuple<double, double> GetMaxMin(List<double> list)
  167. {
  168. if (list == null || !list.Any())
  169. {
  170. return null;
  171. }
  172. double min = list[0];
  173. double max = list[0];
  174. for (int i = 1; i < list.Count; i++)
  175. {
  176. var current = list[i];
  177. if (current > max)
  178. {
  179. max = current;
  180. }
  181. if (current < min)
  182. {
  183. min = current;
  184. }
  185. }
  186. return new Tuple<double, double>(max, min);
  187. }
  188. #endregion
  189. }
  190. }