我在Revit Api上有一个非常简单但同时具有挑战性的问题。 有一个主Revit-MEP模型和链接建筑模型。我想知道我的 MEP 元素属于哪个房间。为此,我尝试了两种方法:
- 使用
ElementIntersectsFilter
作为链接模型(Jeremy博客上有一篇文章( - 当链接旋转或移位时不起作用。 - 导入实体几何体并变换实体,然后使用
ElementIntersectsSolidFilter
- 它可以工作,但需要大量时间。例如,我的主模型大约有 35000 个元素和链接的 1100 个房间。95%的传球时间ElementIntersectsSolidFilter
.对于一个房间,平均 30 秒,这意味着在系统上挂起 9 小时!
从主模型过滤所有目标元素(~35000 elems(
ICollection<ElementId> fec = new FilteredElementCollector(doc)
.WhereElementIsNotElementType()
.WherePasses(new ElementMulticategoryFilter(bic))
.ToElementIds()
.ToList();
从链接获取所有房间并检索实体(~1100 elems(
IEnumerable<Room> rooms = new FilteredElementCollector(link.GetLinkDocument())
.WhereElementIsNotElementType()
.OfCategory(BuiltInCategory.OST_Rooms)
.Cast<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;
}
我将不胜感激任何想法如何在合理的时间内做到这一点
您可以更简单有效地解决此问题。您需要弄清楚模型主 MEP 模型和链接的架构模型之间的转换。接下来确定族实例或 MEP 元素或其他元素的位置 P。将 P 从 MEP 模型转换为链接的建筑模型。在建筑模型中,找出包含变换点的房间或空间。
Revit API 讨论论坛中最近的一个帖子处理了一个不同的主题,但说明了几乎所有必需的原则:如何计算房间的列完成面积。