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

如何通过Design Automation更新BIM360中Composite Design Revit模型版本

处理BIM360 Composite Design模型版本更新的实现

针对Composite Design模型(打包为Zip格式),更新版本的核心是将修改后的所有关联模型重新打包为Zip,并在BIM360 API调用中指定正确的Composite Design类型标识。以下是第三步的完整实现示例,基于你提供的代码修改补充:

1. 添加Zip打包辅助方法

首先需要将修改后的主模型和所有关联模型文件打包成Zip:

private static MemoryStream CreateCompositeDesignZip(string mainRvtPath, IEnumerable<string> linkedRvtPaths)
{
    var zipStream = new MemoryStream();
    using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create, leaveOpen: true))
    {
        // 添加主Revit模型
        var mainEntry = archive.CreateEntry(Path.GetFileName(mainRvtPath));
        using (var entryStream = mainEntry.Open())
        using (var fileStream = File.OpenRead(mainRvtPath))
        {
            fileStream.CopyTo(entryStream);
        }

        // 添加所有关联的Revit模型
        foreach (var linkedPath in linkedRvtPaths)
        {
            var linkedEntry = archive.CreateEntry(Path.GetFileName(linkedPath));
            using (var entryStream = linkedEntry.Open())
            using (var fileStream = File.OpenRead(linkedPath))
            {
                fileStream.CopyTo(entryStream);
            }
        }
    }
    zipStream.Position = 0;
    return zipStream;
}

2. 修改存储创建方法(指定Composite Design类型)

更新CreateFileStorage中的BaseAttributesExtensionObject,使用Composite Design的类型标识:

private static async Task<string> CreateFileStorage(string projectId, string folderUrn, string filename,
    string accessToken)
{
    ProjectsApi projectsApi = new ProjectsApi();
    projectsApi.Configuration.AccessToken = accessToken;

    var storageRelData =
        new StorageRelationshipsTargetData(StorageRelationshipsTargetData.TypeEnum.Folders, folderUrn);
    var storageTarget = new CreateStorageDataRelationshipsTarget(storageRelData);
    var storageRel = new CreateStorageDataRelationships(storageTarget);
    // 替换为Composite Design的Extension类型
    var attributes =
        new BaseAttributesExtensionObject("objects:autodesk.bim360:CompositeDesign", "1.0", new JsonApiLink(string.Empty), null);
    var storageAtt = new CreateStorageDataAttributes(filename, attributes);
    var storageData = new CreateStorageData(CreateStorageData.TypeEnum.Objects, storageAtt, storageRel);
    var storage = new CreateStorage(new JsonApiVersionJsonapi(JsonApiVersionJsonapi.VersionEnum._0), storageData);

    try
    {
        var res = await projectsApi.PostStorageAsync(projectId, storage).ConfigureAwait(false);
        string id = res.data.id;
        return id;
    }
    catch (ApiException ex)
    {
        throw new Exception(ex.Message);
    }
}

3. 修改版本创建/更新方法(适配Composite Design)

在CreateFileItemOrAppendVersionAsync和UpdateVersionAsync中,替换Item和Version的Extension类型:

修改CreateFileItemOrAppendVersionAsync中的Item创建部分

// 原代码中的CreateItemDataAttributes替换为:
new CreateItemDataAttributes
(
    DisplayName: filename,
    new BaseAttributesExtensionObject
    (
        Type: "items:autodesk.bim360:CompositeDesign", // 替换为Composite Design类型
        Version: "1.0"
    )
)

// 原代码中的CreateItemIncluded内的BaseAttributesExtensionObject替换为:
new BaseAttributesExtensionObject
(
    Type: "versions:autodesk.bim360:CompositeDesign", // 替换为Composite Design版本类型
    Version: "1.0"
)

修改UpdateVersionAsync中的版本属性

// 原代码中的BaseAttributesExtensionObject替换为:
new BaseAttributesExtensionObject
(
    "versions:autodesk.bim360:CompositeDesign", // 替换为Composite Design版本类型
    "1.0",
    new JsonApiLink(string.Empty),
    null
)

4. 完整的更新流程调用示例

将上述方法整合,完成Composite Design模型的版本更新:

public static async Task<FileInfoInDocs> UpdateCompositeDesignVersionAsync(
    string projectId,
    string folderUrn,
    string compositeDesignItemId,
    string mainRvtPath,
    IEnumerable<string> linkedRvtPaths,
    string accessToken)
{
    // 1. 打包修改后的所有模型为Zip
    var zipStream = CreateCompositeDesignZip(mainRvtPath, linkedRvtPaths);
    var zipFilename = $"Updated_Composite_{DateTime.Now:yyyyMMddHHmmss}.zip";

    // 2. 创建存储位置
    var storageId = await CreateFileStorage(projectId, folderUrn, zipFilename, accessToken);

    // 3. 上传Zip文件
    var objectDetails = await UploadFileAsync(storageId, zipStream, accessToken);

    // 4. 更新Composite Design模型的版本
    var versionId = await UpdateVersionAsync(projectId, compositeDesignItemId, storageId, zipFilename, accessToken);

    return new FileInfoInDocs
    {
        ProjectId = projectId,
        FolderUrn = folderUrn,
        ItemId = compositeDesignItemId,
        VersionId = versionId
    };
}

关键注意事项

  • Zip结构:Composite Design的Zip包需要包含主模型和所有关联模型,文件名需保持与原Composite Design一致,否则BIM360无法正确识别关联关系。
  • 类型标识:所有涉及Item、Version、Storage的Extension Type必须使用autodesk.bim360:CompositeDesign相关标识,不能使用普通File类型。
  • Item ID获取:如果不知道Composite Design的Item ID,可以通过GetFolderItems方法过滤items:autodesk.bim360:CompositeDesign类型来获取。

内容的提问来源于stack exchange,提问作者chuongmep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:19:52