C# Revit:获取所有视图表的速度非常慢

C# Revit:获取所有视图表的速度非常慢,c#,revit,collectors,C#,Revit,Collectors,对于插件,我需要获取rvt文件中的所有视图表,并在xaml对话框中显示来自它们的信息 但是我第一次使用它的过程非常慢 (使用调试器时:83 viewplan为500毫秒,没有调试器时速度非常慢) (如果我再次执行代码,则执行是不相关的) 我的密码在吼叫 你能帮我吗 提前谢谢 卢克 受保护的IEnumerable GetAllEl(文档) { var filteredElementCollector=新的filteredElementCollector(文档); filteredElementCo

对于插件,我需要获取rvt文件中的所有视图表,并在xaml对话框中显示来自它们的信息 但是我第一次使用它的过程非常慢 (使用调试器时:83 viewplan为500毫秒,没有调试器时速度非常慢) (如果我再次执行代码,则执行是不相关的)

我的密码在吼叫

你能帮我吗

提前谢谢

卢克

受保护的IEnumerable GetAllEl(文档)
{
var filteredElementCollector=新的filteredElementCollector(文档);
filteredElementCollector=filteredElementCollector
类别名称(内置类别OST_表)
.WhereElementIsNotElementType()
.类别(视图页的类型);
var fcElements=filteredElementCollector.ToElements();
返回元素;
}

我认为目前还没有已知的通用解决方案

以下是最近与开发团队就以下问题进行的讨论:

问题:对于给定的元素id,我们需要找到显示它的工作表id列表。 当前解决方案:我们循环浏览所有图纸和视图,并使用
FilteredElementCollector(doc,sheet.Id)
根据结果,我们再次调用
FilteredElementCollector(doc,view.Id)
并查找元素Id。 问题:当前解决方案需要花费大量时间,并显示一个Revit进度条,上面显示“生成图形”。 有没有更好的方法来知道给定的元素id在工作表中是否可用? 例如,类似这样的内容非常有用:

    getAllSheets(ElementId) // returns array of sheet id
    hasGuid(ElementId,sheetId) // return true/false
API是否提供任何此类方法来检查给定的ElementId在工作表中是否可用

答案:那么目标是找到在图纸上显示特定元素的视图? 许多模型图元可能在多个视图中可见,而大多数注释图元通常仅显示在一个视图中。 您正在检查哪种类型的元素? 你会如何处理这些信息

响应:目标是找到在图纸上显示特定元素的视图。 它可以是任何类型的元素

回答:以下是之前的一些相关讨论:

  • 相反
响应:问题是第一次调用
FilteredElementCollector(doc,viewId)
会在进度条中显示
生成图形。
只有第一次搜索才会这样做。第二次,在同一视图上进行搜索时,性能没有问题

回答:第一次很慢,因为为了在视图中可见的元素上迭代,必须生成该视图的图形。 我想不出一个解决办法来得到准确的答案。 您可以跳过视口列表中没有模型视图的图纸,以节省一些时间。 某些图纸可能只有绘图视图、明细表和注释

开发团队提供了一个非常有用的建议,在特殊情况下帮助解决了
生成图形
调用的问题,
对


也许您可以针对您的具体情况以类似的方式进行优化?

我认为您可能过度过滤了ElementCollector。在我的外接程序中,我只使用以下代码获取视图工作表:
newfilteredelementcollector(_doc).OfClass(typeof(ViewSheet))

第二次很快,因为您已经拥有第一次结果的数据。没有简单的方法可以在不了解更多应用程序和数据库的情况下加速第一个结果。这里有一个可以立即应用的最小性能增强:消除对
元素的调用。它没有任何用处,只是通过复制现有数据来浪费性能时间和内存空间。筛选的元素收集器已经是一个
IEnumerable
    getAllSheets(ElementId) // returns array of sheet id
    hasGuid(ElementId,sheetId) // return true/false