/*-------------------------------------------------------------------------
* 功能描述:RevitUtil
* 作者:xulisong
* 创建时间: 2019/6/24 9:55:09
* 版本号:v1.0
* -------------------------------------------------------------------------*/
using Autodesk.Revit.DB;
using SAGA.RevitUtils;
using SAGA.RevitUtils.Extends;
using SAGA.RevitUtils.Extends.Graphic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RevitToJBim.Common
{
public class RevitUtil
{
///
/// 获取FamilyInstance顶面轮廓
///
///
///
public static List GetTopPolygon(FamilyInstance fi)
{
List path = new List();
var faces = fi.GetOriginalFaces(XYZ.BasisZ);
var topface = faces.FirstOrDefault();
//传递的path中没有重复点
if (topface != null)
{
var curves = topface.GetCurves();
for (int i = 0; i < curves.Count; i++)
{
var current = curves[i];
var points = current.GetPoints();
points.RemoveAt(points.Count - 1);
path.AddRange(points);
}
}
return path;
}
///
/// 获取门窗到墙线上的投影线
///
///
///
public static List GetWindowDoorLocation(FamilyInstance fi)
{
//取几何实体顶点信息,将点到指定方向做投影
List xyzs = GetVertexPoints(fi);
XYZ handDirection = (fi.Host as Wall)?.Orientation;
if (handDirection != null)
{
handDirection = handDirection.CrossProduct(XYZ.BasisZ);
}
else if (handDirection == null)
{
handDirection = fi.HandOrientation;
}
var location = fi.GetLocationPoint();
if (location == null)
{
location = xyzs.FirstOrDefault();
}
double min=0, max=0;
XYZ minXYZ=XYZ.Zero, maxXYZ = XYZ.Zero;
for (int i = 0; i < xyzs.Count; i++)
{
var usePoint = xyzs[i];
var refDirection = usePoint - location;
var offset= refDirection.DotProduct(handDirection);
#region 初始化逻辑
if (i == 0)
{
minXYZ = maxXYZ = usePoint;
min = max = offset;
}
#endregion
#region 判定逻辑
else
{
if (offset < min)
{
minXYZ = usePoint;
min = offset;
continue;
}
if (max < offset)
{
maxXYZ = usePoint;
max = offset;
continue;
}
}
#endregion
}
return new List(){minXYZ,maxXYZ};
}
///
/// 获取元素顶点集合
///
///
public static List GetVertexPoints(Element element)
{
List xyzs = new List();
var solids=element.GetSolids();
foreach (var solid in solids)
{
foreach (Edge edge in solid.Edges)
{
xyzs.AddRange(edge.Tessellate());
}
}
return xyzs.Distinct(new XyzEqualComparer()).ToList();
}
///
/// 获取墙的轮廓线
///
///
///
public static List> GetWallPolygon(Wall wall)
{
/*
* 1找到墙的定位线,
* 2将定位线拆分成多段
* 3按照宽度,将多段定位线生成闭合区域
*/
var curve = wall.GetLocationCurve();
List> polygons = new List>();
var refs = HostObjectUtils.GetSideFaces(wall,ShellLayerType.Exterior).OfType();
foreach (Face face in refs)
{
List polygon = new List();
//foreach (Curve curve in face.ed)
//{
//}
}
//偏移位位置信息
return polygons;
}
}
}