如何使用 Forge 数据管理在 BIM360 文档中找到 Revit 文档派生 URN API

How can I find Revit document derivatives URNs in BIM360 Docs using the Forge Data Management API

我有一些 Revit 文件存储在 BIM360 项目中。我正在尝试在 Forge Viewer 中可视化这些文件。现在 Forge Viewer 不能直接与 Revit file/documents 一起使用,但需要 'svf' 格式的翻译文件的 'urn'。

我可以使用 Forge Model Derivative API 将我的 Revit 文件转换为 'svf' 文件,但这会消耗一些积分,我不应该这样做,因为在上传Revit 文件到 BIM360,翻译已经在那里进行了。

那时我想知道,如何找到我的 Revit 文档的基础 'svf' 文件的 'urn'? 在浏览我的 BIM360 文件夹的内容,或使用 Forge Data Management API 检查我的 Revit 文档的版本时,我发现几乎没有什么资源可以帮助我,我应该能够在响应中访问代表派生的派生对象Forge 查看器可以使用的模型。 https://forums.autodesk.com/t5/bim-360-api-forum/connecting-forge-viewer-with-bim-360/td-p/6742779

但是对我来说,API 响应中没有衍生对象,请参见下面的 API 响应示例(出于安全目的,我混淆了一些数据):

 {
                         "type":  "versions",
                         "id":  "urn:adsk.wipprod:fs.file:vf.XXXXXXXXXXXXXXXXXXXX?version=1",
                         "attributes":  "@{name=139200.33_Amenities Building_R21.rvt; displayName=139200.33_Amenities Building_R21.rvt; createTime=2021-09-03T04:24:18.0000000Z; createUserId=XXXXXXXXXX; createUserName=Holmes Consulting; lastModifiedTime=2021-09-03T04:28:02.0000000Z; lastModifiedUserId=XXXXXXXXXXXX; lastModifiedUserName=XXXXXXXXXX; versionNumber=1; storageSize=19808256; fileType=rvt; extension=}",
                         "links":  "@{self=; webView=}",
                         "relationships":  "@{item=; links=; refs=; downloadFormats=; derivatives=; thumbnails=; storage=}"
                     },

我正在使用上面提供的 link 中使用的 API 调用:https://developer.api.autodesk.com/data/v1/projects/:project_id/folders/:folder_id/contents

为什么我的回复包含的数据这么少?

请在relationships.data.derivatives的id值中查找。例如,

"derivatives": {
    "data": {
        "type": "derivatives",
        "id": "dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLkVueWtrU3FjU0lPVTVYMGhRdy1mQUM_dmVyc2lvbj0x"
    },
    // ...
},

或者检查这一行:https://github.com/Autodesk-Forge/learn.forge.viewhubmodels/blob/nodejs/routes/datamanagement.js#L155

const viewerUrn = (version.relationships != null && version.relationships.derivatives != null ? version.relationships.derivatives.data.id : null);

首先感谢Eason的贡献

因为我的衍生对象是空的,所以我尝试直接使用我的对象版本的'urn'。

当使用问题中提到的文件夹获取内容 API 方法列出我的所有文件夹文档时,我得到 'data' 项目数组中的所有文档及其所有版本 'included' 版本数组。我们需要使用文档版本 id 来构建 urn。请参阅下面的示例:

 "included":  [
                     {
                         "type":  "versions",
                         "id":  "urn:adsk.wipprod:fs.file:vf.l9pc9re6QOmeEVHvTCTlIQ?version=1",
                         "attributes":  "@{name=139200.33_Amenities Building_R21.rvt; displayName=139200.33_Amenities Building_R21.rvt; createTime=2021-09-03T04:24:18.0000000Z; createUserId=XXXXXX; createUserName=XXXXXXXX; lastModifiedTime=2021-09-03T04:28:02.0000000Z; lastModifiedUserId=XXXXXXXXXXXX; lastModifiedUserName=XXXXXXXXXXXX; versionNumber=1; storageSize=19808256; fileType=rvt; extension=}",
                         "links":  "@{self=; webView=}",
                         "relationships":  "@{item=; links=; refs=; downloadFormats=; derivatives=; thumbnails=; storage=}"
                     },

现在必须对 id 进行 base64 编码。我正在使用 https://www.freeformatter.com/base64-encoder.html 对 id urn:adsk.wipprod:fs.file:vf.l9pc9re6QOmeEVHvTCTlIQ?version=1 进行编码。当心结果将是 dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLmw5cGM5cmU2UU9tZUVWSHZUQ1RsSVE/dmVyc2lvbj0,这在我的 JS 代码中无效,无法在 Forge Viewer 中加载文档,因为 /.它需要用_代替。所以最终将我的文档加载到 Forge Viewer 中的 JS 部分看起来像这样:

var documentId = 'urn:dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLmw5cGM5cmU2UU9tZUVWSHZUQ1RsSVE_dmVyc2lvbj0x'; //139200.33_Amenities Building_R21.rvt

Autodesk.Viewing.Initializer(options, function() {

    var htmlDiv = document.getElementById('forgeViewer');
    viewer = new Autodesk.Viewing.GuiViewer3D(htmlDiv);
    viewer.start();
    Autodesk.Viewing.Document.load(documentId, onDocumentLoadSuccess, onDocumentLoadFailure);

    function onDocumentLoadSuccess(viewerDocument) {
        // Choose the default viewable - most likely a 3D model, rather than a 2D sheet.
        var defaultModel = viewerDocument.getRoot().getDefaultGeometry();
        viewer.loadDocumentNode(viewerDocument, defaultModel);
    }

    function onDocumentLoadFailure() {
        console.error('Failed fetching Forge manifest');
    }    

});