using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
namespace FWindSoft.Revit
{
public static class GeometryElementExtension
{
///
/// 查找原始的几何对象
///
///
///
///
public static List GetGeometryOriginalObjects(this GeometryElement geoElement) where T : GeometryObject
{
List listRtn = new List();
List useElements = new List() { geoElement };
for (int i = 0; i < useElements.Count; i++)
{
var useGeoElement = useElements[i];
foreach (var geoObject in useGeoElement)
{
//系统族、相交切割后的外部族
if (geoObject is T)
{
listRtn.Add(geoObject as T);
}
else if (geoObject is GeometryInstance)
{
var childElment = (geoObject as GeometryInstance).GetInstanceGeometry();
if (childElment != null)
{
useElements.Add(childElment);
}
}
else if (geoObject is GeometryElement)
{
useElements.Add(geoObject as GeometryElement);
}
}
}
return listRtn;
}
public static List GetGeometryObjects(this GeometryElement geoElement) where T : GeometryObject
{
List listRtn = geoElement.GetGeometryOriginalObjects();
if (listRtn.Count==0)
{
//计算为几何信息复制,可能引用相关有问题
var geoElementNew = geoElement.GetTransformed(Transform.Identity);
listRtn = geoElementNew.GetGeometryOriginalObjects();
}
return listRtn;
}
///
/// 获取指定元素的几何描述
///
///
///
///
///
public static GeometryElement GetGeometryElement(this Element element, bool visibleObj = false, View view = null)
{
var options = new Options();
options.ComputeReferences = true;
options.IncludeNonVisibleObjects = visibleObj;
if (view == null)
{
options.DetailLevel = ViewDetailLevel.Fine;
}
else
{
options.View = view;
}
return element.get_Geometry(options);
}
///
/// 获取几何Solid
///
///
///
///
///
public static List GetSolids(this Element elem, View view = null, bool visibleObj = false)
{
var geoElement = elem.GetGeometryElement(visibleObj, view);
return geoElement.GetGeometryObjects();
}
///
/// 获取几何Solid;最大的默认第一个
///
///
///
public static Solid GetSolid(this Element elem)
{
Solid solid = null;
List listRtn = elem.GetSolids();
if (listRtn != null && listRtn.Count > 0)
{
solid = listRtn[0];
}
return solid;
}
#region 当前集合信息
///
/// 获取元素当前的面信息
///
///
///
///
public static List GetFaces(this Element elem, View view = null)
{
var listRtn = new List();
List listSoild = elem.GetSolids(view);
foreach (var solid in listSoild)
{
listRtn.AddRange(solid.Faces.OfType());
}
return listRtn;
}
#endregion
#region 原始为切割几何信息
///
/// 未切割的Edge
///
///
///
public static List GetOriginalEdges(this FamilyInstance instance)
{
var listRtn = new List();
List listSoild = instance.GetOriginalSolids();
foreach (var solid in listSoild)
{
listRtn.AddRange(solid.Edges.OfType());
}
return listRtn;
}
///
/// 法向相等的某一面 ljy
///
///
///
///
public static List GetOriginalFaces(this FamilyInstance instance, XYZ normal)
{
var faces = instance.GetOriginalFaces();
return faces.Where(p => p is PlanarFace&& (p as PlanarFace).FaceNormal.IsSameDirection(normal)).ToList();
}
///
/// 未切割的Face
///
///
///
public static List GetOriginalFaces(this FamilyInstance instance)
{
var listRtn = new List();
List listSoild = instance.GetOriginalSolids();
foreach (var solid in listSoild)
{
listRtn.AddRange(solid.Faces.OfType());
}
return listRtn;
} ///
/// 未切割的Solid
///
///
///
public static List GetOriginalSolids(this FamilyInstance instance)
{
var options = new Options();
//不能计算reference
options.ComputeReferences = false;
var geoElement = instance.GetOriginalGeometry(options);
if (geoElement == null)
{
return null;
}
var transform = instance.GetTransform();
geoElement = geoElement.GetTransformed(transform);
var listSoild = geoElement.GetGeometryObjects();
if (listSoild.Count == 0)
{
listSoild = new List();
}
return listSoild;
}
#endregion
}
}