我有一个相当简单的,但同时挑战的问题,与Revit。有一个主要的Revit模型和一个连接的体系结构模型。我想知道我的MEP元素属于哪个房间。为此,我尝试了两种方法:
ElementIntersectsFilter作为链接模型(杰里米博客上有一篇文章)--当链接旋转或移位时,它不起作用。ElementIntersectsSolidFilter -它工作,但花费了大量的时间。例如,我的主要型号有大约35000元素和连接1100个房间。95%的传球时间用于投球ElementIntersectsSolidFilter。一个房间30秒的时间,这意味着9小时内挂在一个系统上!过滤MainModel中的所有目标元素(~35000 elems)
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保存有关房间的可靠信息和其他附加信息
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;
}我想知道如何在合理的时间内做到这一点,我将不胜感激,
发布于 2020-06-22 21:14:43
您可以更简单、更有效地解决这个问题。您需要了解模型主MEP模型和链接体系结构模型之间的转换。接下来,确定您的家庭实例或MEP元素或其他任何元素的位置P。将P从MEP模型转换为关联的体系结构模型。在建筑模型中,找出哪些房间或空间包含转换点。
Revit讨论论坛中最近的一个线程处理了一个不同的主题,但却说明了几乎所有所需的原则:如何计算房间的柱面面积。
https://stackoverflow.com/questions/62523202
复制相似问题