ADN Open CIS
Сообщество программистов Autodesk в СНГ

30/01/2019

Руководство по Design Automation для Revit: 6. Запуск workitem

Содержание

1. Преобразуем код десктопного Revit addin в код для сервиса Design Automation

2. Создание приложения Forge и авторизация

3. Создание nickname приложения Forge

4. Публикация Design Automation appbundle

5. Публикация activity

6. Запуск workitem

7. Обработка ошибок и предупреждений

Шаг 1. Workitem

Когда Вы создаете workitem в Design Automation, Вы запрашиваете запуск задачи сервисом Design Automation.

Workitem используется для запуска activity. Отношение между activity и workitem может быть описано как “определение функции” и “вызов функции” соответственно. Именованные параметры activity соответствуют именованным параметрам workitem. Так же как при вызове функций, необязательные параметры activity могут быть пропущены при создании workitem.

API workitem-ов доступны здесь.

Шаг 2. Создание Workitem

Пример создания workitem-а для запуска DeleteWallsActivity:

Код - HTML: [Выделить]
  1. curl -X POST  https://developer.api.autodesk.com/da/us-east/v3/workitems  -H 'Content-Type: application/json'  -H 'Authorization: Bearer LongStringAccessTokenObtainedDuringAuthenthication'  -d '{
  2.         "activityId": "YourNickname.DeleteWallsActivity+test",
  3.         "arguments": {
  4.           "rvtFile": {
  5.             "url": "https://s3-us-west-2.amazonaws.com/revitio-dev/test-data/DeleteWalls.rvt"
  6.           },
  7.           "result": {
  8.             "verb": "put",
  9.             "url": "https://myWebsite/signed/url/to/result"
  10.           }
  11.         }
  12.       }'

LongStringAccessTokenObtainedDuringAuthenthication нужно заменить токеном, полученным при авторизации.

Ответ сервиса будет включать id созданной workitem:

Код - JavaScript: [Выделить]
  1. {
  2.     "status": "pending",
  3.     "stats": {
  4.         "timeQueued": "2018-04-16T21:45:08.1357163Z"
  5.     },
  6.     "id": "e8a3ee53770a4eaeb86f267aab76af47"
  7. }

Статус Workitem:

Workitem-ы в Design Automation ставятся в очередь перед тем, как они будут переданы в обработку. При обработке workitem-ы могут быть выполнены успешно, либо с ошибкой выполнения.

Проверить статус workitem-а можно с помощью GET-запроса /workitems/{id}:

Код - HTML: [Выделить]
  1. curl -X GET  https://developer.api.autodesk.com/da/us-east/v3/workitems/e8a3ee53770a4eaeb86f267aab76af47  -H 'Content-Type: application/json'  -H 'Authorization: Bearer LongStringAccessTokenObtainedDuringAuthenthication'

LongStringAccessTokenObtainedDuringAuthenthication нужно заменить токеном, полученным при авторизации.

Пример ответа сервиса:

Код - JavaScript: [Выделить]
  1. {
  2.     "status": "success",
  3.     "reportUrl":  "https://dasprod-store.s3.amazonaws.com/workItem/Revit/e8a3ee53770a4eaeb86f267aab76af47/report.txt?XXXXXXXXX",
  4.     "stats": {
  5.         "timeQueued": "2018-04-13T03:15:15.9772282Z",
  6.         "timeDownloadStarted": "2018-04-13T03:15:17.2960823Z",
  7.         "timeInstructionsStarted": "2018-04-13T03:15:20.2803318Z",
  8.         "timeInstructionsEnded": "2018-04-13T03:15:41.6075799Z",
  9.         "timeUploadEnded": "2018-04-13T03:15:42.0450494Z"
  10.     },
  11.     "id": "e8a3ee53770a4eaeb86f267aab76af47"
  12. }

status в ответе сервиса показывает возможные варианты: ожидается выполнение, успешно, произошла ошибка или было отменено. reportUrl содержит url с логами выполнения workitem, по этой ссылке можно скачать файл с логом.

Шаг 3. Аргументы WorkItem

Входные параметры: JSON.

Входные параметры activity требуют JSON-значений, но значения JSON могут использоваться в самой workitem.

Например, activity CountItActivity требует параметр с именем countItParams. Activity ожидает значение параметра файлом JSON. Workitem может внедрить значение JSON в workitem как показано ниже с помощью префикса data:application/json. Фреймворк Design Automation framework обработает его как JSON и сохранит в JSON-файл:

Код - HTML: [Выделить]
  1. curl -X POST  https://developer.api.autodesk.com/da/us-east/v3/workitems  -H 'Content-Type: application/json'  -H 'Authorization: Bearer LongStringAccessTokenObtainedDuringAuthenthication'  -d '{
  2.           "activityId": "YourNickname.CountItActivity+test",
  3.           "arguments": {
  4.             "rvtFile": {
  5.               "url": "https://s3-us-west-2.amazonaws.com/revitio-dev/test-data/CountIt.rvt"
  6.             },
  7.             "countItParams": {
  8.               "url": "data:application/json,{'walls': false, 'floors': true, 'doors': true, 'windows': true}"
  9.             },
  10.             "result": {
  11.               "verb": "put",
  12.               "url": "https://myWebsite/signed/url/to/result"
  13.             }
  14.           }
  15.       }'

Входные параметры: eTransmit

Design Automation может обработать файлы Revit, обработанные с помощью eTransmit, необходимо только создать zip-архив с этими файлами:

Код - HTML: [Выделить]
  1. curl POST  https://developer.api.autodesk.com/da/us-east/v3/workitems  -H 'Content-Type: application/json'  -H 'Authorization: Bearer LongStringAccessTokenObtainedDuringAuthenthication'  -d '{
  2.         "activityId" : "YourNickname.CountItActivity+test",
  3.         "arguments": {
  4.           "rvtFile": {
  5.             "url": "https://s3-us-west-2.amazonaws.com/revitio-dev/test-data/TopHost.zip"
  6.           },
  7.           "countItParams": {
  8.             "url": "data:application/json,{'walls': true, 'floors': true, 'doors': true, 'windows': true}"
  9.           },
  10.           "result": {
  11.             "verb": "put",
  12.             "url": "https://myWebsite/signed/url/to/result"
  13.           }
  14.         }
  15.     }'

Пример такого файла TopHost.zip доступен здесь: TopHost.zip.

Имя “главной модели” считывается из файлам манифеста и считывается из zip-архива.

Входные параметры: RVT со связанными файлами

Код - HTML: [Выделить]
  1. curl POST  https://developer.api.autodesk.com/da/us-east/v3/workitems  -H 'Content-Type: application/json'  -H 'Authorization: Bearer LongStringAccessTokenObtainedDuringAuthenthication'  -d '{
  2.         "activityId": "YourNickname.CountItActivity+test",
  3.         "arguments": {
  4.           "rvtFile": {
  5.             "url": "https://s3-us-west-2.amazonaws.com/revitio-dev/test-data/TopHost.rvt",
  6.             "references": [
  7.               {
  8.                 "url": "https://s3-us-west-2.amazonaws.com/revitio-dev/test-data/LinkA.rvt",
  9.                 "references": [
  10.                   {
  11.                     "url": "https://s3-us-west-2.amazonaws.com/revitio-dev/test-data/LinkA1.rvt"
  12.                   },
  13.                   {
  14.                     "url": "https://s3-us-west-2.amazonaws.com/revitio-dev/test-data/LinkA2.rvt"
  15.                   }
  16.                 ]
  17.               },
  18.               {
  19.                 "url": "https://s3-us-west-2.amazonaws.com/revitio-dev/test-data/LinkB.rvt"
  20.               }
  21.             ]
  22.           },
  23.           "countItParams": {
  24.             "url": "data:application/json,{'walls': true, 'floors': true, 'doors': true, 'windows': true}"
  25.           },
  26.           "result": {
  27.             "verb": "put",
  28.             "url": "https://myWebsite/signed/url/to/result"
  29.           }
  30.         }
  31.     }'

Главная модель в этом примере TopHost.rvt и она содержит LinkA.rvt и LinkB.rvt. В свою очередь, файл LinkA.rvt содержит LinkA1.rvt and LinkA2.rvt. Каждый файл загружается в облако по-отдельности и для каждого из них указывается отдельный путь:

Код - HTML: [Выделить]
  1. TopHost.rvt
  2. |-- LinkA.rvt
  3. |   |-- LinkA1.rvt
  4. |   |-- LinkA2.rvt
  5. |
  6. |-- LinkB.rvt

Входные параметры: связанные файлы в подпапках

Переменная localName  workitem-а может использоваться для создания структуры папок в рабочем каталоге (working directory). Например, файл Revit Host.rvt содержит связанный файл в папке SubFolder/Link.rvt, тогда workitem должен быть определн следующим образом:

Код - JavaScript: [Выделить]
  1. {
  2.   "url": "https://s3-us-west-2.amazonaws.com/revitio-dev/test-data/TestForSubFolders/Host.rvt",
  3.   "references": [
  4.     {
  5.       "url": "https://s3-us-west-2.amazonaws.com/revitio-dev/test-data/TestForSubFolders/Link.rvt",
  6.       "localName": "SubFolder/Link.rvt"
  7.     }
  8.   ]
  9. }

Тогда в рабочем каталоге будут созданы папки/файлы:

Код - HTML: [Выделить]
  1. {CWD}/Host.rvt
  2. {CWD}/SubFolder/Link.rvt

Поскольку доступ к папкам и файлам вне рабочей папки запрещён, в случае, если главный файл имеет ссылки с относительным путём вида ../ParallelFolder/Link.rvt, Вы можете переместить всю структуру на один уровень вниз. Переменная localName может быть использована также для размещения главного файла:

Код - JavaScript: [Выделить]
  1. {
  2.  "url": "https://path/to/Host.rvt",
  3.  "localName": "TopFolder/Host.rvt",
  4.  "references": [
  5.    {
  6.      "url": "https://path/to/Link.rvt",
  7.      "localName": "ParallelFolder/Link.rvt"
  8.    }
  9.  ]
  10. }

Тогда в рабочем каталоге будут созданы папки/файлы:

Код - HTML: [Выделить]
  1. {CWD}/TopFolder/Host.rvt
  2. {CWD}/ParallelFolder/Link.rvt

Входные параметры: загрузка ZIP-файла

Для ускорения загрузки, Design Automation предлагает возможность загрузки zip-файлов. При указании пути к главному Revit-файлу используйте параметр "pathInZip"

Код - JavaScript: [Выделить]
  1. "arguments": {
  2.   "rvtFile": {
  3.     "url": "https://path/to/zip/file.zip",
  4.     "pathInZip":  "RevitFile.rvt"
  5.   },
  6. }

Выходные параметры: onComplete callback

В workitem-е можно указать специальный выходной параметр onComplete. В случае его наличия, URL будет вызван при завершении выполнения workitem-а.

Пример:

Код - HTML: [Выделить]
  1. curl -X POST  https://developer.api.autodesk.com/da/us-east/v3/workitems  -H 'Content-Type: application/json'  -H 'Authorization: Bearer LongStringAccessTokenObtainedDuringAuthenthication'  -d '{
  2.         "activityId": "YourNickname.DeleteWallsActivity+test",
  3.         "arguments": {
  4.           "rvtFile": {
  5.             "url": "https://s3-us-west-2.amazonaws.com/revitio-dev/test-data/DeleteWalls.rvt"
  6.           },
  7.           "result": {
  8.             "verb": "put",
  9.             "url": "https://myWebsite/signed/url/to/result"
  10.           },
  11.           "onComplete": {
  12.             "verb": "post",
  13.             "url": "https://myWebsite/callback"
  14.           }
  15.         }
  16.       }'

Назад к публикации activity

Читать дальше об обработке ошибок и предупреждений

Источник: https://forge.autodesk.com/en/docs/design-automation/v3/tutorials/revit/step6-post-workitem/

Автор перевода: Александр Игнатович

Обсуждение: http://adn-cis.org/forum/index.php?topic=

Опубликовано 30.01.2019