You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:40:29