You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Revit API按边过滤元素:获取所有边端点的性能优化求助

优化Revit边端点检索性能的方案

看起来你在遍历Revit文档所有元素获取边端点时遇到了性能瓶颈,这在大型模型里确实很常见。我看了你的代码,主要问题出在不必要的元素过滤和低效的几何处理上,下面给你几个针对性的优化方案:

一、先过滤掉不需要的元素,减少遍历范围

你的代码里同时包含了实例元素和类型元素(ElementIsElementTypeFilter(true)),但类型元素根本没有实际的几何图形,遍历它们纯属于浪费时间。另外,很多元素本身就没有几何(比如注释、视图等),也可以提前过滤掉:

// 优化后的元素收集器:只保留有几何的实例元素
var collector = new FilteredElementCollector(doc)
    .WhereElementIsNotElementType() // 排除类型元素,只留实例
    .WhereHasGeometry(); // 只保留包含几何图形的元素

如果你的需求只针对特定类别(比如墙、梁),还可以再加个类别过滤,进一步缩小范围:

// 比如只处理墙元素
var collector = new FilteredElementCollector(doc)
    .WhereElementIsNotElementType()
    .WhereHasGeometry()
    .WherePasses(new ElementCategoryFilter(BuiltInCategory.OST_Walls));

二、优化几何获取的配置

获取几何图形时,默认的Options会加载很多不必要的细节,我们可以调整参数来减少计算量:

var geometryOptions = new Options()
{
    DetailLevel = ViewDetailLevel.Coarse, // 选择粗糙的细节级别,大幅减少几何复杂度
    IncludeNonVisibleObjects = false, // 不需要不可见的几何,关掉节省时间
    ComputeReferences = false // 不需要几何引用的话,禁用这个选项提升性能
};

三、高效遍历与几何提取

不要先把所有元素加载到List里(collector.ToElements()),直接遍历Collector本身更高效。同时,只处理你需要的几何类型(比如Solid、CurveLoop),忽略无关的几何对象:

List<XYZ> coordinateList = new List<XYZ>(); // 用XYZ类型替代object,避免装箱拆箱

foreach (var elem in collector)
{
    GeometryElement geomElem = elem.get_Geometry(geometryOptions);
    if (geomElem == null) continue;

    foreach (GeometryObject geomObj in geomElem)
    {
        // 处理实体的边
        if (geomObj is Solid solid)
        {
            foreach (Edge edge in solid.Edges)
            {
                Curve edgeCurve = edge.AsCurve();
                coordinateList.Add(edgeCurve.GetEndPoint(0));
                coordinateList.Add(edgeCurve.GetEndPoint(1));
            }
        }
        // 处理曲线环的边
        else if (geomObj is CurveLoop curveLoop)
        {
            foreach (Curve curve in curveLoop)
            {
                coordinateList.Add(curve.GetEndPoint(0));
                coordinateList.Add(curve.GetEndPoint(1));
            }
        }
        // 按需处理其他几何类型(比如Mesh),不需要的话可以跳过
    }
}

四、额外优化:去重重复坐标(可选)

如果很多边共享端点,你可以用HashSet来避免重复添加,注意要处理XYZ的浮点精度问题:

// 自定义XYZ的相等比较器,处理浮点误差
public class XyzEqualityComparer : IEqualityComparer<XYZ>
{
    private const double Tolerance = 1e-9; // Revit的精度阈值
    public bool Equals(XYZ x, XYZ y)
    {
        return x.IsAlmostEqualTo(y, Tolerance);
    }
    public int GetHashCode(XYZ obj)
    {
        return (int)(obj.X * Tolerance) ^ (int)(obj.Y * Tolerance) ^ (int)(obj.Z * Tolerance);
    }
}

// 使用HashSet去重
HashSet<XYZ> uniqueCoordinates = new HashSet<XYZ>(new XyzEqualityComparer());
// 然后在添加时用uniqueCoordinates.Add(...)替代List.Add(...)

关键优化点总结

  • 排除无意义的元素:类型元素、无几何元素、非目标类别元素,从源头减少遍历量
  • 简化几何计算:降低细节级别,关闭不必要的几何选项
  • 高效遍历:直接遍历Collector,避免一次性加载所有元素
  • 强类型存储:用XYZ替代object,减少装箱开销

这些调整在大型模型里能带来非常明显的性能提升,你可以根据自己的实际需求调整细节。

内容的提问来源于stack exchange,提问作者Daniel Ignjat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:45:57