对于插件,我需要在rvt文件中获取所有视图,并在xaml对话框中显示它们的信息但是我第一次使用它的过程非常缓慢(使用调试器:对于83 viewplan来说,是500毫秒,如果没有调试器,它也非常慢)(如果再次执行我的代码,则执行是同时执行的)
我的下面的代码
你能帮我吗?
预先感谢
Luc
protected IEnumerable<Element> GetAllEl(Document document)
{
var filteredElementCollector = new FilteredElementCollector(document);
filteredElementCollector = filteredElementCollector
.OfCategory(BuiltInCategory.OST_Sheets)
.WhereElementIsNotElementType()
.OfClass(typeof(ViewSheet));
var fcElements = filteredElementCollector.ToElements();
return fcElements;
}
我认为目前没有解决该问题的通用解决方案。
这里是与开发团队最近的讨论:
对于给定的元素ID,问题:,我们需要找到显示它的图纸ID的列表。当前解决方案:我们遍历所有图纸和视图并使用FilteredElementCollector( doc, sheet.Id)
根据这些结果,我们再次调用FilteredElementCollector( doc, view.Id)
,并查找元素ID。问题:当前解决方案需要花费很多时间,并显示Revit进度栏,显示Generating graphics
。有没有更好的方法来知道工作表中是否有给定的元素ID?例如,类似这样的东西将非常有用:
getAllSheets(ElementId) // returns array of sheet id
hasGuid(ElementId,sheetId) // return true/false
API是否提供任何此类方法,以检查表中是否有给定的ElementId?
答案:因此,目标是要找到一个在图纸上显示特定元素的视图?许多模型元素可能在多个视图上可见,而大多数注释元素通常仅在一个视图中出现。您要检查什么类型的元素?您将如何处理该信息?
Response:目标是找到一个在图纸上显示特定元素的视图。它可以是任何类型的元素。
答案:以下是一些先前的相关讨论:
Response:问题是对FilteredElementCollector( doc, viewId )
的第一次调用在进度栏中显示generating graphics
。只有第一次搜索才这样做。第二次,在同一视图上进行搜索没有性能问题。
答案:第一次很慢,因为要迭代视图中可见的元素,必须生成该视图的图形。我想不出一种解决方法来获得准确的答案。您可以跳过视口列表中没有模型视图的图纸,以节省一些时间。某些工作表可能只包含草稿视图,进度表和注释。
开发小组提出了非常有帮助的建议,在特殊情况下有助于解决generating graphics
调用,到Loop through sheets - generating graphics。
也许您可以针对特定情况以类似方式进行优化?
我认为您可能过度过滤了ElementCollector。在我的外接程序中,我只使用以下代码即可获取视图表:new FilteredElementCollector(_doc).OfClass(typeof(ViewSheet));