如何通过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
相关产品推荐
相关产品推荐

