123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- /*-------------------------------------------------------------------------
- * 功能描述:ComputerSpaceItem
- * 作者:xulisong
- * 创建时间: 2018/12/24 17:22:10
- * 版本号:v1.0
- * -------------------------------------------------------------------------*/
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using Autodesk.Revit.DB;
- using Autodesk.Revit.DB.Mechanical;
- using SAGA.DotNetUtils.Extend;
- using SAGA.RevitUtils;
- using SAGA.RevitUtils.Extends;
- using SAGA.RevitUtils.Utils;
- namespace SAGA.GplotRelationComputerManage
- {
- /// <summary>
- /// 计算相关信息
- /// </summary>
- public class ComputerSpaceItem
- {
- public ComputerSpaceItem(Space space)
- {
- this.Space = space;
- this.BimId = space.GetBimId();
- var mySegments = space.GetBoundarySegments(new SpatialElementBoundaryOptions());
- OriginCurves = new List<Curve>();
- var seg = mySegments.FirstOrDefault();
- if (seg != null)
- {
- this.OriginCurves = seg.Select(s => s.GetCurve()).ToList();
-
- }
- this.ZeroCurves = TransfomCurvesToZero(OriginCurves);
- Annular = InitAnnular(mySegments);
- }
- #region 存储逆时针多边形
- //private Annular m_Annular;
- /// <summary>
- /// 轮廓环形
- /// </summary>
- public Annular Annular { get; set; }
- private Annular InitAnnular(IList<IList<BoundarySegment>> segmentsList)
- {
- Annular annumlar = null;
- for (int i = 0; i < segmentsList.Count; i++)
- {
- var currentSegments = segmentsList[i];
- bool useSegments = false;
- var usePoints = new List<XYZ>();
- foreach (var boundarySegment in currentSegments)
- {
- if (!useSegments && !(this.Space.Document.GetElement(boundarySegment.ElementId) is FamilyInstance))
- {
- //如果边框都是由柱子组成,则不进行存储
- useSegments = true;
- }
- var curve = boundarySegment.GetCurve();
- var tempPoints = curve.Tessellate();
- //取出除最后一点外的所有点
- for (int j = 0; j < tempPoints.Count-1; j++)
- {
- usePoints.Add(tempPoints[j].NewZ(0));
- }
- }
- if (!useSegments)
- continue;
- if (i == 0)
- {
- #region 外轮廓处理,默认逆时针
- annumlar = new Annular(new Polygon(usePoints));
- #endregion
- }
- else
- {
- #region 内轮廓处理,默认顺时针。转成逆时针
- if (annumlar != null)
- {
- usePoints.Reverse();
- annumlar.InPolygons.Add(new Polygon(usePoints));
- }
- #endregion
- }
- }
- return annumlar;
- }
- #endregion
- public Space Space { get; private set; }
- /// <summary>
- /// bimId
- /// </summary>
- public string BimId { get; set; }
- /// <summary>
- /// 空间功能类型
- /// </summary>
- public string FuncType { get; set; }
- /// <summary>
- /// 原始边框
- /// </summary>
- public List<Curve> OriginCurves { get; set; }
- /// <summary>
- /// 投影边框
- /// </summary>
- public List<Curve> ZeroCurves { get; set; }
- /// <summary>
- /// 标志是否被处理
- /// </summary>
- public bool IsHandled { get; set; }
- #region 包围盒构件
- private Outline m_Box;
- public Outline Box
- {
- get
- {
- if (m_Box == null)
- {
- List<double> listX = new List<double>();
- List<double> listY = new List<double>();
- ZeroCurves.ForEach(c =>
- {
- var listXYZ = new List<XYZ>(c.Tessellate());
- listXYZ.ForEach(xyz =>
- {
- listX.Add(xyz.X);
- listY.Add(xyz.Y);
- });
- });
- var tupleX = GetMaxMin(listX);
- var tupleY = GetMaxMin(listY);
- if (tupleX == null || tupleY == null)
- {
- m_Box = new Outline(XYZ.Zero,XYZ.Zero);
- }
- else
- {
- double coff = 1;//扩充误差
- m_Box = new Outline(new XYZ(tupleX.Item2 - coff, tupleY.Item2 - coff,0),new XYZ(tupleX.Item1 + coff, tupleY.Item1+ coff,0));
-
- }
-
- }
- return m_Box;
- }
- }
- #endregion
- #region 私有方法
- private List<Curve> TransfomCurvesToZero(List<Curve> curves)
- {
- var zeroCurves = new List<Curve>();
- if (curves != null)
- {
- var z = curves.FirstOrDefault()?.StartPoint()?.Z;
- Transform tf = Transform.CreateTranslation(XYZ.Zero.NewZ(0 - z));
- foreach (var curve in curves)
- {
- zeroCurves.Add(curve.CreateTransformed(tf));
- }
- }
- return zeroCurves;
- }
- /// <summary>
- /// 取出集合的最大值和最小值Item1,最大值,Item2,最小值
- /// </summary>
- /// <param name="list"></param>
- /// <returns></returns>
- public Tuple<double, double> GetMaxMin(List<double> list)
- {
- if (list == null || !list.Any())
- {
- return null;
- }
- double min = list[0];
- double max = list[0];
- for (int i = 1; i < list.Count; i++)
- {
- var current = list[i];
- if (current > max)
- {
- max = current;
- }
- if (current < min)
- {
- min = current;
- }
- }
- return new Tuple<double, double>(max, min);
- }
- #endregion
- }
- }
|