如何在Forge聚合视图中通过URN+Object ID缩放指定BIM对象
解决Aggregate View下精准缩放指定模型对象的方案
前端Viewer实现精准定位
在多模型合并场景中,Object ID(DbId)不具备全局唯一性,必须结合模型URN来锁定目标对象,具体步骤:
- 获取目标模型的
Model实例:通过Viewer的getDocumentNode()方法传入目标模型URN,从返回的节点中提取model属性 - 构造唯一目标集合:创建包含
model实例和对应DbId的对象数组,格式为[{ model: 目标Model实例, dbId: 目标Object ID }] - 执行缩放:调用Viewer的
fitToView()方法,传入上述集合即可精准定位到指定文件中的设备
前端示例代码:
// 已知目标模型URN和Object ID const targetModelUrn = 'urn:xxx:xxx:文件1的URN'; const targetDbId = 2204; // 获取目标模型实例 const targetModelNode = viewer.getDocumentNode(targetModelUrn); const targetModel = targetModelNode.model; // 构造目标对象并执行缩放 viewer.fitToView([{ model: targetModel, dbId: targetDbId }]);
C#后端辅助函数实现
可以封装函数,通过文件名/URN和Object ID返回前端所需的定位参数,同时可前置校验Object ID的有效性:
using Autodesk.Forge; using Autodesk.Forge.Model; using System.Linq; using System.Threading.Tasks; public class ForgeModelLocator { private readonly DerivativesApi _derivativesApi; // 假设已存储文件名与URN的映射,或从Data Management API动态查询 private readonly Dictionary<string, string> _fileUrnMapping = new() { { "文件1.rvt", "urn:xxx:xxx:文件1的URN" }, { "文件2.rvt", "urn:xxx:xxx:文件2的URN" } }; public ForgeModelLocator(string forgeAccessToken) { _derivativesApi = new DerivativesApi(); _derivativesApi.Configuration.AccessToken = forgeAccessToken; } public async Task<(string ModelUrn, int DbId)> GetValidatedTarget(string fileName, int targetDbId) { // 1. 根据文件名获取对应模型URN if (!_fileUrnMapping.TryGetValue(fileName, out string modelUrn)) throw new ArgumentException($"未找到文件 {fileName} 对应的模型URN"); // 2. 校验Object ID在该模型中存在 bool isDbIdValid = await ValidateDbIdInModel(modelUrn, targetDbId); if (!isDbIdValid) throw new ArgumentException($"Object ID {targetDbId} 不存在于模型 {fileName} 中"); return (modelUrn, targetDbId); } private async Task<bool> ValidateDbIdInModel(string modelUrn, int dbId) { var manifest = await _derivativesApi.GetManifestAsync(modelUrn); var svfDerivative = manifest.Derivatives.FirstOrDefault(d => d.Type.Equals("svf")); if (svfDerivative == null) return false; var metadata = await _derivativesApi.GetModelMetadataAsync(modelUrn, svfDerivative.Urn); return metadata.Data.Objects.Any(obj => obj.ObjectID == dbId); } }
注:使用前需确保已获取有效的Forge访问令牌,且文件名与URN的映射逻辑需根据你的实际存储/查询方式调整。
内容的提问来源于stack exchange,提问作者Nandha
相关产品推荐
相关产品推荐

