如何从大型 Revit 模型中基于 dbid 在 APS/Forge Viewer 中查找和选择多个元素?

问题描述 投票:0回答:1

我们上传了一个大型 Revit 模型(总共约 4 GB),并且有一个包含 30-40 个 Revit 元素 ID 的列表,我们试图在查看器中找到并在屏幕上选择,然后在周围创建一个剖面框。

我们尝试创建所有元素和 dbids 的映射,然后对其进行搜索 - 但是创建模型需要 2-3 分钟,然后需要更多时间进行搜索。

我们也尝试过使用Model Derivative API来搜索元素,但似乎dbid只在查看器中生成。所以我们可以获取属性和位置来创建剖面框,但不能在模型中选择它们。

最后我们尝试使用查看器中的搜索功能,但它一次只接受一个参数,因此搜索每个元素 id,然后得到一个 dbid,跨越 40 次搜索需要一些时间。

有没有一种方法可以基于多个参数在查看器中进行搜索,例如 AND / OR 函数?

autodesk-forge autodesk-viewer autodesk-model-derivative
1个回答
0
投票

我假设你一直在使用

getExternalIdMapping
来搜索你的元素。如果这需要几分钟,我有一个可能的解决方案,这将需要大量工作,但可以显着加快您的查询速度。

我相信 dbId <-> externalId 映射也可以从

PropertyDatabase
中提取,您可以下载一个 SQLite 数据库。 这篇博文 概述了如何下载和处理数据库,但有点过时了。这些是我使用的步骤:

  1. 获取模型的清单
  2. 找到具有
    role: Autodesk.CloudPlatform.PropertyDatabase
  3. 的清单孩子
  4. 使用儿童缸创建一个签名的cookie下载URL
  5. 使用收到的 cookie 和 url 从 cdn.derivative.autodesk.com 获取属性数据库

数据库可能与您的 Revit 模型大小相同。在这个大数据库上运行实时查询不会很快,但仍然比在前端搜索快很多。如果您需要更高的性能,您需要提取最少的必需信息以满足您从数据库预先查询并将其保存在内存(或 Redis)中。我认为这应该很容易为您提供亚秒级响应时间,并且仅受后端可用内存量的限制。

更新

我用 SVF2 模型对此进行了测试,发现 SQLite 数据库中的 dbId 与查看器中的 dbId 不匹配。我假设这些 id 用于较旧的 SVF 格式(如果我错了请纠正我)。解决方法是在数据库中查询 externalId

,然后使用 
此 APS(测试版)端点 查找查看器 dbId。如果此端点支持您要运行的查询,您可能能够完全跳过数据库。

如果您知道将 externalId 映射到 SVF2 dbId(或 SVF dbId 到 SVF2 dbId)的更好方法,请在下面发表评论,最好是无需运行查看器实例即可在后端完成的操作。

APS 属性:查询注意事项

api端点目前(2023年第一季度)处于测试阶段,在参考页面上它说DO NOT USE IN PRODUCTION ENVIRONMENTS

¯\_(ツ)_/¯

我通过以下查询在单个请求中将 ~800 个房间的 externalIds 映射到它们相应的 (SVF2) dbIds 来测试它:

{ "query": { "$in": [ "externalId", "3e22bf41-f3f7-4cc9-89fe-abc441902d17-00373b62", "3e22bf41-f3f7-4cc9-89fe-abc441902d17-00373b6b", "3e22bf41-f3f7-4cc9-89fe-abc441902d17-00373b6c", ... ] }, "fields": ["objectid"], "pagination": { "limit": 1000, "offset": 0 } }
这个请求的响应时间大约是 500 毫秒到 1 秒。

目前 api 返回

{ "result": "success" }

 而不是实际数据很多,几乎在所有其他请求上。立即重试似乎工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.