Autodesk forge 如何从revit文件的转换压缩/zip文件中获取链接文件列表?

Autodesk forge 如何从revit文件的转换压缩/zip文件中获取链接文件列表?,autodesk-forge,autodesk-viewer,autodesk-model-derivative,Autodesk Forge,Autodesk Viewer,Autodesk Model Derivative,我已经翻译了一个revit文件和几个链接文件。从查看器中,我可以使用“模型浏览器”默认扩展名浏览根revit模型中的所有图元,包括链接文件中的所有图元。甚至我还创建了一个自定义扩展,从中可以隔离每个对象类型的所有元素 现在,我想创建一个类似“模型浏览器”的扩展名,它将根文件名显示为顶部节点或父节点,所有链接文件名显示为子节点。我还希望,通过单击每个链接文件,该链接文件中的所有元素应在查看器中隔离,通过单击根文件,包括所有链接文件元素在内的所有元素应显示 我的应用程序是在.Net平台上使用C#和J

我已经翻译了一个revit文件和几个链接文件。从查看器中,我可以使用“模型浏览器”默认扩展名浏览根revit模型中的所有图元,包括链接文件中的所有图元。甚至我还创建了一个自定义扩展,从中可以隔离每个对象类型的所有元素

现在,我想创建一个类似“模型浏览器”的扩展名,它将根文件名显示为顶部节点或父节点,所有链接文件名显示为子节点。我还希望,通过单击每个链接文件,该链接文件中的所有元素应在查看器中隔离,通过单击根文件,包括所有链接文件元素在内的所有元素应显示

我的应用程序是在.Net平台上使用C#和JavaScript构建的

谁能告诉我哪种api,我可以试试?如果有人分享我可以得到帮助的例子或url,这也会非常有帮助


提前谢谢

您可以利用AecModelData从Forge Viewer中的PropertyDB获取链接模型数据并重建关系

如果对象来自链接的RVT,则可以检查其“外部id”。如果外部id包含斜杠符号,则表示它来自链接的RVT。以下是一个例子:

  • 对象外部id:
    ffa0b0a8-8aab-48f9-beb5-dba5d9b4968f-0010cfee/e021b7a9-1e57-428c-87db-8e087322cd49-0015a0f6
  • AECModelData中linkedDocuments中的实例ID:
    ffa0b0a8-8aab-48f9-beb5-dba5d9b4968f-0010cfee
您可以看到斜杠符号左侧的GUID与上面提到的实例id匹配

要获取链接的RVT模型名称,我们可以重用AECModelData的linkedDocuments中的instanceId,以再次获取所需的信息。下面是一段代码片段,假设实例id为
ffa0b0a8-8aab-48f9-beb5-dba5d9b4968f-0010cfee

function getExternalIdMappingAsync( model ) {
    return new Promise( ( resolve, reject ) => {
        model.getExternalIdMapping(
            map => resolve( map ),
            error => reject( error )
        );
    });
}

function getPropertiesAsync( dbId, viewer ) {
    return new Promise( ( resolve, reject ) => {
        viewer.getProperties(
            dbId,
            result => resolve( result ),
            error => reject( error )
        );
    });
}

//1.  Get external id mapping for converting external id to Viewer's dbId
let externalIdMapping = await getExternalIdMappingAsync( viewer.model );
let dbId = externalIdMapping['ffa0b0a8-8aab-48f9-beb5-dba5d9b4968f-0010cfee'];

//2. Get properties of the linked model instance
let propResult = await getPropertiesAsync( dbId, viewer )

//3. Find the type name property for its value
let linkNameProp = propResult.properties.find( prop => prop.displayName == 'Type Name' || prop.attributeName == 'Type Name' );
let linkName = linkNameProp.displayValue; //!<<< This is linked RVT name

函数GetExternaldMappingAsync(模型){ 返回新承诺((解决、拒绝)=>{ model.getExternaldMapping( 映射=>解析(映射), 错误=>拒绝(错误) ); }); } 函数getPropertiesAsync(dbId,查看器){ 返回新承诺((解决、拒绝)=>{ viewer.getProperties( dbId, 结果=>解析(结果), 错误=>拒绝(错误) ); }); } //1. 获取外部id映射以将外部id转换为查看器的dbId 让ExternaldMapping=等待GetExternaldMappingAsync(viewer.model); 设dbId=ExternaldMapping['ffa0b0a8-8aab-48f9-beb5-dba5d9b4968f-0010cfee'; //2. 获取链接模型实例的属性 让propResult=等待getPropertiesAsync(dbId,查看器) //3. 查找其值的类型名称属性 让linkNameProp=propResult.properties.find(prop=>prop.displayName=='Type Name'| | prop.attributeName=='Type Name');
让linkName=linkNameProp.displayValue;//!嗨,康奕迅,谢谢你的详细回答!看来会有用的。让我们努力实施它。我将再次回到这里。你好,伊森·康,我们已经实现了它,它几乎适用于所有型号,除了一个型号,我们正在努力提高性能,因为它有许多链接文件(35+),并且大小非常大(7GB+)。在这个模型中,我按照你的步骤做的扩展非常慢。为了解决这个问题,我们稍微改变了策略。在主模型及其所有链接模型中,我们添加了一个项目级参数,我们在其中填充了模型名称,并通过扩展使用了该参数。我列出了所有这些链接文件,可以打开/关闭模型数据,并获得了很多性能,但是还是没那么多。总之,再次谢谢。嗨,阿哈萨努尔,谢谢你让我知道。要提高性能,可以利用在分离的线程中重建树,或在后端查询AecModelData&properties。下面是一个示例,演示如何在不使用查看器加载模型的情况下查询属性: