Atook 发表于 2019-10-14 17:38:54

通过xdata过滤BlockTableRecords而不迭代?

是否可以在不迭代块表的情况下获取包含某些 xdata 的图形中的所有 BlockTableRecords?类似于按 xdata 筛选选择集,现在我正在做这个迭代的事情:(原谅未包含的代码)public static ObjectIdCollection BlockDefsWithXData(string appName)。
{。
ObjectIdCollection result = new ObjectIdCollection();。
using (Transaction tr = Active.Document.TransactionManager.StartTransaction())。
{。
BlockTable bt = (BlockTable)tr.GetObject(Active.Database.BlockTableId, OpenMode.ForRead);。
foreach (ObjectId id in bt)。
{。
if (XData.HasAppName(id, appName)) // 查看它是否具有 appname。
{。
结果,Add(id);。
}。
}。
断续器Commit();。
}。
返回结果;。
}。
**** Hidden Message *****

MickD 发表于 2019-10-14 19:11:22

据我所知,即使您可以,应用程序也会进行迭代,并且无论如何只会稍微快一点(阅读为不明显)。
如果您在编辑器中使用当前db,您可能可以使用带有PromptSelectionOptions.SelectEverythingInAperture的SelectionSet来使用过滤器选择所有内容?
我认为迭代会更快,因为您没有处理Editor和SelectionSet代码层。

gile 发表于 2019-10-15 00:51:24

嗨,
我有时做了一些测试,似乎使用Editor.SelectAll和选择过滤器并不比迭代模型和纸张空间更快,当不需要打开实体时,它甚至会慢一点(即仅通过ObjectId.ObjectClass过滤实体类型)。

Atook 发表于 2019-10-15 07:50:05


谢谢吉尔,这真是个好消息
看来我将继续遍历blocktable。

Atook 发表于 2019-10-15 07:55:00


感谢您的回复MickD。选择集不起作用,因为我正在寻找块定义,而不是块引用。在你的帖子和Gile的帖子之间,迭代似乎是要走的路。
页: [1]
查看完整版本: 通过xdata过滤BlockTableRecords而不迭代?