【问题标题】:Forge - The category 'rfaFile' in '$(rfaFile)' is unrecognizedForge - \'$(rfaFile)\' 中的类别 \'rfaFile\' 无法识别
【发布时间】:2022-08-15 09:38:21
【问题描述】:

在 Forge 的设计自动化 API 中执行 WorkItem 时出现错误。 错误是这样的:

Error: The category \'rfaFile\' in \'$(rfaFile)\' is unrecognized. Valid values are args, settings, appbundles, engine, engines.

它发生在report.txt 中的“开始准备脚本和命令行参数”之后。我们不确定为什么会发生这种情况。看起来错误是在活动中引发的。活动如下所示:

function publishActivity() {
        return $.ajax({
          url: \"/api/forge/design_automation/activities\",
          headers: {
            \"X-CSRF-Token\": csrfToken,
            \"Forge-Token\": forgeToken
          },
          method: \"POST\",
          contentType: \"application/json\",
          data: JSON.stringify({
            activity: {
              \"id\": \"DeleteWallsActivity\",
              \"commandLine\": [ \"$(engine.path)\\\\\\\\revitcoreconsole.exe /i \\\"$(args[rfaFile].path)\\\" /al \\\"$(appbundles[TestAppId].path)\\\"\" ],
              \"parameters\": {
                \"rfaFile\": {
                  \"zip\": false,
                  \"ondemand\": false,
                  \"verb\": \"get\",
                  \"description\": \"Input Revit model\",
                  \"required\": true,
                  \"localName\": \"$(rfaFile)\"
                },
                \"result\": {
                  \"zip\": false,
                  \"ondemand\": false,
                  \"verb\": \"put\",
                  \"description\": \"Results\",
                  \"required\": true,
                  \"localName\": \"result.rfa\"
                },
                \"inputJson\": {
                  \"verb\": \"get\",
                  \"description\": \"input json\",
                  \"localName\": \"params.json\",
                  \"ondemand\": false,
                  \"required\": false,
                  \"zip\": false
                }                
              },
              \"engine\": \"Autodesk.Revit+2021\",
              \"appbundles\": [ \"petar3db.TestAppId+test\" ],
              \"description\": \"Deletes walls from Revit file.\"              
            }
          })
        }).done(function(data) {
          console.log(\"Activity created\");
          bundleUploadData = data[\"uploadParameters\"];
        }).fail(function(jqXHR, textStatus) {
          console.log(\"Failed to create activity\", jqXHR.responseJSON);
          console.log(jqXHR, textStatus);
        });
      }

看起来\"localName\": \"$(rfaFile)\" 造成了麻烦。 让我们看一下我们通过 websockets 执行的 WorkItem 代码:

{
 \"headers\": {
    \"Authorization\" : \"Bearer <token here>\"
 },
 \"action\": \"post-workitem\",
 \"data\": {
    \"activityId\": \"petar3db.DeleteWallsActivity+test\",
    \"arguments\": {
        \"rfaFile\": {\"url\": \"https://developer.api.autodesk.com/oss/v2/signedresources/da992c60-a3d7-469d-8c3e-d0f089e2e509?region=US\", \"pathInZip\": \"emptyfam.rfa\"},
        \"result\": {\"verb\": \"put\", \"url\": \"https://developer.api.autodesk.com/oss/v2/signedresources/b78151c1-93aa-495f-96c8-183bca26e071?region=US\"},
        \"inputJson\": {\"localName\": \"params.json\", \"url\": \"the url to the file\"}
    }
 }
}

真正奇怪的是,当我们将\"inputJson\" 添加到活动和工作项中时,这个过程运行得很好并且开始抛出这个错误。 (我们想通过 WorkItem 向 AppBundle 发送一些 JSON 数据) 可能是什么问题?缺少什么吗?

  • 您的帖子中是否有错字,或者这些是确切的值吗?看起来您在名为rfaFile 的活动中有一个参数,但工作项参数是rvtFile。不过,如果是这种情况,我们应该更好地向您报告此错误。
  • @RahulBhobe 是的,这是一个错字,对不起.. 它也不能与 rfaFile 一起使用。
  • 好的!你有同样的错误吗?您想要压缩 rfa 文件的任何具体原因?
  • @RahulBhobe 不,在实施艾玛朱的建议后,我们不再有同样的错误。不幸的是,我们有一个新问题:文档错误:\"Document doc = data.RevitDoc;\" 行在插件代码中返回 null,所以我什至无法直接调用 LoadFamily。 zip 文件并没有什么特别之处,但如果我是对的,那根本不是问题,因为 AppBundle 可以处理 .zip 文件?
  • 您是想将此系列加载到另一个文档中还是只是打开它?如果你想加载它,那么你想在哪个文档中加载它:-)?从命令行中删除/i 参数,使DA 无法打开任何文档,因此您得到一个空指针。如果您想“打开”家庭文档,请执行以下两个选项之一 - a)/i 参数添加回您的命令行,并且在将家庭文件发送到 DA 时不要压缩家庭文件。 DA 会为您打开。或b) 关注艾玛的回答并使用OpenDocumentFile

标签: api autodesk-forge autodesk-designautomation


【解决方案1】:

至于"localName": "$(rfaFile)",需要注意的是,如果本地名称是这样定义的,Design Automation 会根据自己的逻辑为这个参数提供一个有效的名称。如果您想完全控制输入文件,例如在 addin(Appbundles) 的代码中访问它,建议改为定义一个“真实的”localName,例如"localName": "input.rfa"

在上述情况下,您可能需要:

  • Activity 中的commandLine 中删除/i \"$(args[rfaFile].path)\"
  • 定义"localName": "inputRFA",这样输入就会被下载,解压作为名为@9​​87654328@ 的文件夹。 emptyfam.rfa 应该在这个文件夹下。
  • 在插件中调用OpenDocumentFile打开一个Revit文件,得到document
  • 在添加打开/加载rfa文件时调用document.LoadFamily(".\inputRFA\emptyfam.rfa", out family);。见this Revit API

【讨论】:

  • 谢谢艾玛。我按照您描述的方式设置了所有内容,但现在出现文档错误:“Document doc = data.RevitDoc;”行在插件代码中返回 null,所以我什至无法直接调用 LoadFamily。我想我也应该在这里改变一些东西?
  • 我修复了上面评论中的错误,应该按照 Rahul Bhobe 的建议在 Addin 代码中使用 OpenDocumentFile!
【解决方案2】:

activity 中的 parameter 名称与 workitem 中的 argument 名称不匹配。发布workitem 的正确方法应该是:

{
 "headers": {
    "Authorization" : "Bearer <token here>"
 },
 "action": "post-workitem",
 "data": {
    "activityId": "petar3db.DeleteWallsActivity+test",
    "arguments": {
        "rfaFile": {"url": "https://developer.api.autodesk.com/oss/v2/signedresources/da992c60-a3d7-469d-8c3e-d0f089e2e509?region=US", "pathInZip": "emptyfam.rfa"},
        "result": {"verb": "put", "url": "https://developer.api.autodesk.com/oss/v2/signedresources/b78151c1-93aa-495f-96c8-183bca26e071?region=US"},
        "inputJson": {"localName": "params.json", "url": "the url to the file"}
    }
 }
}

argument 字段rvtFile 更改为rfaFile

【讨论】:

  • 你是对的,这是一个错字。但是,它也不适用于 rfaFile 。我修正了问题中的错字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多