我如何从已翻译的 compressed/zip revit 文件中获取 link 文件的列表?
How can i get the list of link files from a translated compressed/zip of revit file?
我翻译了一个包含多个 link 文件的 revit 文件。在查看器中,我可以浏览根 Revit 模型中的所有元素,包括使用 'Model Browser' 默认扩展名的 link 文件中的所有元素。甚至我还创建了一个自定义扩展,从中我可以隔离每个对象类型的所有元素。
现在,我想创建一个像 'Model Browser' 这样的扩展,它将根文件名显示为顶部或父节点,所有 link 文件名显示为子节点 node.I,通过单击每个 link 文件,该 link 文件中的所有元素都应在查看器中隔离,通过单击根文件,包括所有 link 文件元素在内的所有元素都应显示 .
有关信息,我的应用程序是使用 C# 和 JavaScript 在 .Net 平台中构建的。
任何人都可以告诉我哪个 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
这是我的测试截图:
希望对你有帮助~
我翻译了一个包含多个 link 文件的 revit 文件。在查看器中,我可以浏览根 Revit 模型中的所有元素,包括使用 'Model Browser' 默认扩展名的 link 文件中的所有元素。甚至我还创建了一个自定义扩展,从中我可以隔离每个对象类型的所有元素。
现在,我想创建一个像 'Model Browser' 这样的扩展,它将根文件名显示为顶部或父节点,所有 link 文件名显示为子节点 node.I,通过单击每个 link 文件,该 link 文件中的所有元素都应在查看器中隔离,通过单击根文件,包括所有 link 文件元素在内的所有元素都应显示 .
有关信息,我的应用程序是使用 C# 和 JavaScript 在 .Net 平台中构建的。
任何人都可以告诉我哪个 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
这是我的测试截图:
希望对你有帮助~