在 Forge API 中将 Revit 元素数据返回为 JSON

Returning Revit elements data as JSON in Forge API

在使用 Forge API 的 Web 客户端中,我想获得模型中 Revit 元素的 JSON 数组。使用设计自动化 API,我正在创建一个 Activity,它使用 FilteredElementCollector 来检索元素,但是一旦我有了这些元素,我就不确定检索这些结果的最佳方法我的网络服务。 Activity 不需要写回 .rvt 文件。

results.txt 文件和解析结果的 CountItApp 教程 writes the results to a results.txt file in cloud storage, and the web app then downloads。在我的 Web 客户端上,我想显示这些结果,但是文件 I/O 似乎不是 JSON 数据的一个很好的解决方案。我考虑过的几个备选方案:

  1. WorkItem 完成后,将结果写入外部数据库并在我的 Web 应用程序中查询该数据库。据我所知,这是不可能的,因为 Forge 在 Activity.
  2. 中的网络访问 restrictions
  3. 通过 onComplete 回调传递结果。不知道可不可以。

设计自动化允许您 post 一个带有输出参数的工作项 POST 回调。如果您的 activity 生成的输出文件是 json 文件,这允许您将输出数据接收为 application/json

设计自动化还允许您在输出 url 中指定变量 workitem.id。当您的工作项完成时,我们将调用此 url 并使用 variable expanded 作为该工作项的 ID。此动态变量路径允许您确定与该回调关联的工作项 ID。

这是您可以进行的操作。首先用硬编码的本地名称 result.json:

定义一个带有这样一个输出参数 (verb: post) 的 activity
"results": {
    "zip": false,
    "ondemand": false,
    "verb": "post",
    "description": "Results",
    "required": true,
    "localName": "results.json"
}

在您的 appbundle 代码中,将硬编码名称 result.json 的文件中的 json 内容保存到当前工作文件夹。

using (StreamWriter sw = File.CreateText("result.json"))
{
    sw.WriteLine(JsonConvert.SerializeObject(data, Formatting.Indented));
    sw.Close();
}

然后您可以 post 像这样的工作项:

"result": {
    "verb": "post",
    "url": "https://www.yourserver.com/results/$(workitem.id)"
}

在回调的服务器实现中,您将获得 json 内容作为有效负载。您可以读取结果并使用套接字或您可能与客户使用的任何其他通信方式与工作项 ID 对应的客户端进行通信。