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 } }