Revit API。从主模型元素所在的链接模型中获取一个房间

Posted

技术标签:

【中文标题】Revit API。从主模型元素所在的链接模型中获取一个房间【英文标题】:Revit API. Get a room from the linked model in which the main model element is located 【发布时间】:2020-06-22 20:44:30 【问题描述】:

我有一个非常简单但同时具有挑战性的 Revit Api 问题。 有一个主要的 Revit-MEP 模型和一个链接的建筑模型。我想知道我的 MEP 元素属于哪个房间。为此,我尝试了两种方法:

    ElementIntersectsFilter 用于链接模型(Jeremy 博客上有一篇文章)- 当链接旋转或移位时它不起作用。 导入实体几何体并转换实体,然后使用ElementIntersectsSolidFilter - 它可以工作,但需要大量时间。例如,我的主模型有大约 35000 个元素和链接的 1100 个房间。 95% 的时间用于传球 ElementIntersectsSolidFilter。一个房间平均 30 秒,这意味着在系统上挂起 9 小时!

从 MainModel 中过滤所有目标元素(~35000 个元素)

ICollection<ElementId> fec = new FilteredElementCollector(doc)
.WhereElementIsNotElementType()
.WherePasses(new ElementMulticategoryFilter(bic))
.ToElementIds()
.ToList();

从链接获取所有房间并检索实体(~1100 个元素)

IEnumerable<Room> rooms = new FilteredElementCollector(link.GetLinkDocument())
.WhereElementIsNotElementType()
.OfCategory(BuiltInCategory.OST_Rooms)
.Cast<Room>();

RoomInfo 包含有关 Room 的可靠信息和其他附加信息

rlf - 做所有的检索工作

IEnumerable<RoomInfo> ifs = rlf.GetItemInfos(rooms).Cast<RoomInfo>();

一种采用实体和对目标元素集合的引用的方法。 返回所有与实体相交的元素并将它们从目标集合中移除(~35000),这样集合在每次迭代时都会下降。

        Public ICollection<ElementId> GetIntersectedElements(Solid solid, ref ICollection<ElementId> eIds)
        
            if (!eIds.Any())
            
                log.Info($"Input collection is empty. Task done.");
                return new List<ElementId>();
            
            var solidFilter = new ElementIntersectsSolidFilter(solid);

            var fec = new FilteredElementCollector(doc, eIds)
           // This filter eat time
                .WherePasses(solidFilter)
                .ToElementIds();

            if (fec.Any())
            
                eIds = new FilteredElementCollector(doc, eIds)
                    .Excluding(fec)
                    .ToElementIds();
            
            return fec;
        

我将不胜感激如何在合理的时间内做到这一点

【问题讨论】:

【参考方案1】:

您可以更简单有效地解决这个问题。您需要弄清楚模型主 MEP 模型和链接建筑模型之间的转换。接下来确定您的家庭实例或 MEP 元素或其他任何东西的位置 P。将 P 从 MEP 模型转换为链接的建筑模型。在建筑模型中,找出哪个房间或空间包含转换点。

Revit API 讨论论坛中最近的一个帖子处理了一个不同的主题,但说明了几乎所有所需的原则:How to calculate the column finish area of room。

【讨论】:

以上是关于Revit API。从主模型元素所在的链接模型中获取一个房间的主要内容,如果未能解决你的问题,请参考以下文章

Revit API获取链接模型中构件

是否可以通过 Revit API 或 FORGE API 在 Revit 模型中加载新的 Cloud (BIM 360) 链接?

使用链接下载 Revit 模型

如何使用 Forge API 从模型 Revit 2022 获取零件类别

Autodesk Forge 数据管理参考 API 未列出 Revit 参考

如何使用 Forge 模型衍生 API 获取 revit 模型的单位?