C# Revit API。从主模型图元所在的链接模型中获取房间
我在Revit Api中遇到了一个非常简单但同时又极具挑战性的问题。 有一个主Revit MEP模型和一个链接的建筑模型。我想知道我的MEP元素属于哪个房间。为此,我尝试了两种方法: 将ElementIntersectsFilter用于链接模型Jeremy博客上有一篇文章,当链接旋转或移位时,它不起作用。 导入实体几何体并变换实体,然后使用ElementIntersectsSolidFilter–它可以工作,但需要花费大量时间。例如,我的主模型有大约35000个元素,链接了1100个房间。传递-抛出元素所花费的95%的时间与LidsFilter相交。对于一个房间,平均30秒,这意味着在9小时内挂上一个系统! 过滤MainModel~35000元素中的所有目标元素C# Revit API。从主模型图元所在的链接模型中获取房间,c#,revit-api,C#,Revit Api,我在Revit Api中遇到了一个非常简单但同时又极具挑战性的问题。 有一个主Revit MEP模型和一个链接的建筑模型。我想知道我的MEP元素属于哪个房间。为此,我尝试了两种方法: 将ElementIntersectsFilter用于链接模型Jeremy博客上有一篇文章,当链接旋转或移位时,它不起作用。 导入实体几何体并变换实体,然后使用ElementIntersectsSolidFilter–它可以工作,但需要花费大量时间。例如,我的主模型有大约35000个元素,链接了1100个房间。传递-
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讨论论坛中最近的一个帖子处理了一个不同的主题,但说明了几乎所有必需的原则: