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

如何通过APS从ACC获取Revit文件的Workitem?求助.NET示例

从ACC获取Revit文件并创建Design Automation Workitem(.NET示例)

核心问题分析

你需要直接从ACC文件的URN(格式如urn:adsk.wipprod:fs.file:vf.rXJhqUE6QamM6ANpG2Qz6w?version=1)获取文件,用于Design Automation的Workitem,而非本地上传流程。现有代码的问题在于直接携带AccessToken的URL无法被Design Automation服务识别,且URN解析逻辑可优化。

正确实现步骤及代码示例

1. 解析ACC文件URN并获取OSS预签名URL

Design Automation不支持带Bearer Token的OSS访问,需通过API获取文件的预签名下载URL,以下是优化后的获取逻辑:

using Autodesk.Forge;
using Autodesk.Forge.DesignAutomation.Model;
using Autodesk.Forge.Model;
using System.Linq;

[TestCase("b.ca790fb5-141d-4ad5-b411-0461af2e9748", "urn:adsk.wipprod:fs.file:vf.rXJhqUE6QamM6ANpG2Qz6w?version=1")]
public async Task GetAccFileForDesignAutomation(string projectId, string versionUrn)
{
    // 初始化版本API客户端
    var versionsApi = new VersionsApi();
    versionsApi.Configuration.AccessToken = Token;

    // 获取版本的存储关系ID
    var version = await versionsApi.GetVersionAsync(projectId, versionUrn);
    var storageId = version.Data.Relationships.Storage.Data.Id;

    // 解析存储ID为bucketKey和objectName
    var storageParts = storageId.Split('/');
    var bucketKey = storageParts[^2].Split(':').Last();
    var objectName = storageParts[^1];

    // 获取预签名下载URL(有效期30分钟,无需携带Token)
    var objectsApi = new ObjectsApi();
    objectsApi.Configuration.AccessToken = Token;
    var signedUrl = await objectsApi.CreateSignedResourceAsync(
        bucketKey,
        objectName,
        new PostBucketsSigned(30),
        "read"
    );

    // 构建Design Automation可用的输入参数
    var inputArgument = new XrefTreeArgument
    {
        Url = signedUrl.SignedUrl,
        Verb = Verb.Get
    };

    // 后续将inputArgument用于Workitem的Inputs配置
}

2. 完整Workitem提交示例

拿到有效输入URL后,结合输出配置提交Workitem:

public async Task SubmitRevitWorkitem(string inputFileUrl, string outputBucketKey, string outputFileName)
{
    var designAutomationApi = new DesignAutomationClient();
    designAutomationApi.Configuration.AccessToken = Token;

    // 获取Revit引擎别名(示例为2025版,可按需替换)
    var engineAlias = await designAutomationApi.GetEngineAliasAsync("Autodesk.Revit+2025");

    // 定义Workitem的输入输出参数
    var workitem = new WorkItem
    {
        ActivityId = "YourCustomRevitActivityId", // 替换为你的自定义Activity ID
        Arguments = new Dictionary<string, IArgument>
        {
            {
                "inputFile",
                new XrefTreeArgument
                {
                    Url = inputFileUrl,
                    Verb = Verb.Get
                }
            },
            {
                "outputFile",
                new XrefTreeArgument
                {
                    Url = await GetSignedUploadUrl(outputBucketKey, outputFileName),
                    Verb = Verb.Put
                }
            }
        },
        Engine = engineAlias.Id
    };

    // 提交Workitem到Design Automation服务
    var submittedWorkitem = await designAutomationApi.CreateWorkItemAsync(workitem);
}

// 辅助方法:获取输出文件的预签名上传URL
private async Task<string> GetSignedUploadUrl(string bucketKey, string fileName)
{
    var objectsApi = new ObjectsApi();
    objectsApi.Configuration.AccessToken = Token;
    var signedUrl = await objectsApi.CreateSignedResourceAsync(
        bucketKey,
        fileName,
        new PostBucketsSigned(30),
        "write"
    );
    return signedUrl.SignedUrl;
}

3. 关键注意事项

  • 预签名URL权限:输入文件用read权限,输出文件用write权限,有效期建议设置15-60分钟。
  • Activity匹配:Workitem的参数名称需与自定义Activity的输入输出参数完全一致。
  • Token权限:调用API的Token需包含data:read、data:write、bucket:read、bucket:write、code:all权限。

原有代码问题点

  1. 直接在XrefTreeArgument中携带Bearer Token:Design Automation无法识别该方式,必须使用预签名URL。
  2. 存储ID解析逻辑冗余:可通过C#索引器简化代码,提升可靠性。
  3. 缺少Workitem提交环节:仅构建URL未完成完整的Workitem定义与提交流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:11:39