C# Revit API。从主模型图元所在的链接模型中获取房间

C# Revit API。从主模型图元所在的链接模型中获取房间,c#,revit-api,C#,Revit Api,我在Revit Api中遇到了一个非常简单但同时又极具挑战性的问题。 有一个主Revit MEP模型和一个链接的建筑模型。我想知道我的MEP元素属于哪个房间。为此,我尝试了两种方法: 将ElementIntersectsFilter用于链接模型Jeremy博客上有一篇文章,当链接旋转或移位时,它不起作用。 导入实体几何体并变换实体,然后使用ElementIntersectsSolidFilter–它可以工作,但需要花费大量时间。例如,我的主模型有大约35000个元素,链接了1100个房间。传递-

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

将ElementIntersectsFilter用于链接模型Jeremy博客上有一篇文章,当链接旋转或移位时,它不起作用。 导入实体几何体并变换实体,然后使用ElementIntersectsSolidFilter–它可以工作,但需要花费大量时间。例如,我的主模型有大约35000个元素,链接了1100个房间。传递-抛出元素所花费的95%的时间与LidsFilter相交。对于一个房间,平均30秒,这意味着在9小时内挂上一个系统! 过滤MainModel~35000元素中的所有目标元素

ICollection<ElementId> fec = new FilteredElementCollector(doc)
.WhereElementIsNotElementType()
.WherePasses(new ElementMulticategoryFilter(bic))
.ToElementIds()
.ToList();
从link获取所有房间并检索~1100个元素的实体

IEnumerable<Room> rooms = new FilteredElementCollector(link.GetLinkDocument())
.WhereElementIsNotElementType()
.OfCategory(BuiltInCategory.OST_Rooms)
.Cast<Room>();
RoomInfo保存有关房间的实体信息和其他附加信息

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

如果您能在合理的时间内提出任何建议,我将不胜感激。

您可以更简单有效地解决此问题。您需要确定模型主MEP模型和链接建筑模型之间的转换。接下来确定族实例或MEP元素或其他元素的位置P。将MEP模型转换为链接的建筑模型。在建筑模型中,找出包含变换点的房间或空间

Revit API讨论论坛中最近的一个帖子处理了一个不同的主题,但说明了几乎所有必需的原则: