快速检索房间内的高程

问题描述 投票:0回答:1

是否有类似于 ElementIntersectsSolidFilter 的东西,我可以用它来查找特定房间内存在的所有 ElevationMarkers 或视图?

我们的立面视图命名标准应包括房间名称和房间编号,当用户更改房间名称时,我正在尝试自动重命名这些立面。

我编写了一个 DMU,它通过创建临时平面图视图 (tempView) 和 使用 FilteredElementCollector:

List<ElevationMarker> markersMaybeInRoom = new FilteredElementCollector(doc, tempView.Id)
    .OfClass(typeof(ElevationMarker))
    .WhereElementIsNotElementType()
    .Cast<ElevationMarker>()
    .Where(e => e.HasElevations())
    .ToList();

foreach (ElevationMarker marker in markersMaybeInRoom)
{
    BoundingBoxXYZ emBB = marker.get_BoundingBox(tempView);
    double x = emBB.Max.X - offset;
    double y = emBB.Max.Y - offset;

    XYZ markerLocation = new XYZ(x, y, tempView.GenLevel.ProjectElevation);

    Room markerRoom = doc.GetRoomAtPoint(markerLocation, roomPhase);
    if (markerRoom == null)
        continue; // ElevationMarker is not in a Room

    if (markerRoom.Id != room.Id)
        continue; // ElevationMarker is not in the modified Room

    markersInRoom.Add(marker);
}

但是,由于我们模型中元素的数量,这实在是太慢了。 我知道一种更快的方法是在创建立面时使用 ExtensibleStorage 来存储房间的唯一 ID,并为这些关联 ID 设置 DMU。 不过,我试图避免这种情况,因为它只适用于向前发展的模型,而 FilteredElementCollector 可以适用于any模型。

c# revit-api
1个回答
0
投票

我建议采用一种完全不同的方法,希望更有效:

  • 迭代所有标高和/或高程,并确定本地项目坐标系中所有 Z 坐标的排序列表 A。
  • 迭代所有房间并确定其上下范围的 Z 坐标。
  • 实施比较和排序算法来检查哪个房间
    [bottomZ,topZ]
    间隔与 A 中的哪些条目重叠。
© www.soinside.com 2019 - 2024. All rights reserved.