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

30/01/2019

Руководство по Design Automation для Revit: 4. Публикация Design Automation appbundle

Содержание

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

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

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

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

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

6. Запуск workitem

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

Appbundle - это пакет dll и дополнительных файлов Вашего приложения Revit Addin.

Шаг 1. Структура AppBundle

Appbundle Design Automation для Revit представляет собой zip-архив определенной структуры. Пример такого appbundle: DeleteWallsApp.zip.

Его структура

Код - HTML: [Выделить]
  1. DeleteWallsApp.zip
  2. |-- DeleteWalls.bundle
  3. |   |-- PackageContents.xml
  4. |   |-- Contents
  5. |   |   |-- DeleteWalls.dll
  6. |   |   |-- DeleteWalls.addin

Имя корневой папки обязательно должно быть вида *.bundle. В этой папке *.bundle должен быть файл PackageContents.xml, который содержит описание appbundle и относительный путь к файлу манифеста .addin.

Код - XML: [Выделить]
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <ApplicationPackage>
  3.   <Components Description="Delete Walls">
  4.     <RuntimeRequirements OS="Win64"
  5.                          Platform="Revit"
  6.                          SeriesMin="R2018"
  7.                          SeriesMax="R2018" />
  8.     <ComponentEntry AppName="DeleteWalls"
  9.                     Version="1.0.0"
  10.                     ModuleName="./Contents/DeleteWalls.addin"
  11.                     AppDescription="Deletes walls"
  12.                     LoadOnCommandInvocation="False"
  13.                     LoadOnRevitStartup="True" />
  14.   </Components>
  15. </ApplicationPackage>

SeriesMin и SeriesMax относятся к Revit 2018 (R2018). Текущая версия сервиса Design Automation для Revit поддерживает только appbundle-ы, которые могут быть запущены в версиях Revit R2018 и R2019.

В папку *.bundle\Contents положит файл addinDLL приложения и его зависимостей.

Код - XML: [Выделить]
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RevitAddIns>
  3.   <AddIn Type="DBApplication">
  4.     <Name>DeleteWalls</Name>
  5.     <Assembly>.\DeleteWalls.dll</Assembly>
  6.     <AddInId>d7fe1983-8f10-4983-98e2-c3cc332fc978</AddInId>
  7.     <FullClassName>DeleteWalls.DeleteWallsApp</FullClassName>
  8.     <Description>"Walls Deleter"</Description>
  9.     <VendorId>Autodesk</VendorId>
  10.     <VendorDescription>
  11.     </VendorDescription>
  12.   </AddIn>
  13. </RevitAddIns>

Примечание: Type должен быть DBApplication. Design Automation для Revit не поддерживает приложений, которым нужен пользовательский интерфейс. В Assembly укажите относительный путь к DLL.

Примеры структуры и содержания папки *.bundle и файла PackageContent.xml показаны в презентации об Autodesk Exchange Revit Apps здесь.

Файл PackageContents.xml существующего приложения из Autodesk Exchange Revit apps может быть использован как есть, но Design Automation для Revit считывает толькоблокиRuntimeRequirements и ComponentEntry, отмеченные ниже:


Шаг 2. API для appbundles

- /v3/appbundles (POST) - создает новый appbundle

- /v3/appbundles/{id}/aliases (POST) - задает alias appbundle-а

- /v3/appbundles/{id}/versions (POST) - создает новую версию appbundle-а

- /v3/appbundles/{id}/aliases/{aliasId} (PATCH) - предназначен для изменения appbundle-а

Базовый URL: https://developer.api.autodesk.com/da/us-east

Перечень API для appbundle-ов доступен здесь.

Создание нового Appbundle

Для публикации appbundle в сервисе Design Automation, Вам необходимо его создать и загрузить в него zip-файл, созданный на предыдущем этапе.

В этом примере создается appbundle DeleteWallsApp. Целевая машина сервиса Design Automation для этого примера - Revit 2018:

Код - HTML: [Выделить]
  1. curl -X POST  https://developer.api.autodesk.com/da/us-east/v3/appbundles  -H 'Authorization: Bearer LongStringAccessTokenObtainedDuringAuthenthication'  -H 'Content-Type: application/json'  -d '{
  2.   "id": "DeleteWallsApp",
  3.   "engine": "Autodesk.Revit+2018",
  4.   "description": "Delete Walls appbundle based on Revit 2018"
  5. }'

Здесь:

- id - имя appbundle

- engine - Autodesk.Revit+2018 - для Revit 2018

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

Код - JavaScript: [Выделить]
  1. {
  2.     "uploadParameters": {
  3.         "endpointURL": "https://dasprod-store.s3.amazonaws.com",
  4.         "formData": {
  5.             "key": "apps/Revit/DeleteWallsApp/1",
  6.             "content-type": "application/octet-stream",
  7.             "policy": "eyJleHBpcmF0aW9uIjoiMjAxOC... (truncated)",
  8.             "success_action_status": "200",
  9.             "success_action_redirect": "",
  10.             "x-amz-signature": "6c68268e23ecb8452... (truncated)",
  11.             "x-amz-credential": "ASIAQ2W... (truncated)",
  12.             "x-amz-algorithm": "AWS4-HMAC-SHA256",
  13.             "x-amz-date": "20180810... (truncated)",
  14.             "x-amz-server-side-encryption": "AES256",
  15.             "x-amz-security-token": "FQoGZXIvYXdzEPj//////////wEaDHavu... (truncated)"
  16.         }
  17.     },
  18.     "engine": "Autodesk.Revit+2018",
  19.     "description": "Delete Walls appbundle based on Revit 2018",
  20.     "version": 1,
  21.     "id": "YourNickname.DeleteWallsApp"
  22. }

Здесь:

- endpointURL - url, по которому должен быть загружен zip-файл, созданный на 1 шаге

- version - номер версии appbundle-а. Для новых appbundle-ов это всегда 1.

- formData - данные, которые должны быть использованы при загрузке appbundle-а. Они имеют время жизни - 1 час, по истечении которого становятся недействительными

Шаг 3. Загрузка zip-файла appbundle-а

Теперь Вы можете загрузить zip-файл по URL, который пришёл в ответе сервиса на предыдущий запрос endpointURL:

Код - HTML: [Выделить]
  1. curl -X POST  https://dasprod-store.s3.amazonaws.com  -H 'Cache-Control: no-cache'  -F key=apps/Revit/DeleteWallsApp/1  -F content-type=application/octet-stream  -F policy=eyJleHBpcmF0aW9uIjoiMjAxOC... (truncated)  -F success_action_status=200  -F success_action_redirect=  -F x-amz-signature=6c68268e23ecb8452... (truncated)  -F x-amz-credential=ASIAQ2W... (truncated)  -F x-amz-algorithm=AWS4-HMAC-SHA256  -F x-amz-date=20180810... (truncated)  -F x-amz-server-side-encryption=AES256  -F 'x-amz-security-token=FQoGZXIvYXdzEPj//////////wEaDHavu... (truncated)'  -F 'file=@path/to/your/app/zip'

Это пример для утилиты curl. Вы можете использовать другие инструменты, например Postman, чтобы загрузить файл appbundel-а. Не забудьте указать все данные form-data из ответа сервиса, полученного на предыдущем шаге.

Шаг 4. Создание Alias-а Appbundle-а

Новая версия Вашего appbundle будет доступна по псевдониму (alias).

В этом примере создается alias с id test для версии 1 appbundle-а DeleteWallsApp:

Код - HTML: [Выделить]
  1. curl -X POST  https://developer.api.autodesk.com/da/us-east/v3/appbundles/DeleteWallsApp/aliases  -H 'Content-Type: application/json'  -H 'Authorization: Bearer LongStringAccessTokenObtainedDuringAuthenthication'  -d '{
  2.       "version": 1,
  3.       "id": "test"
  4.     }'

https://developer.api.autodesk.com/da/us-east/v3/appbundles/{appId}/aliases - {appId}(DeleteWallsApp) можно заменить для того, чтобы использовать этот пример с другими appbundle-ами.

Шаг 5. Обновление существующего Appbundle-а

Чтобы обновить существующий appbundle, необходимо создать новую версию appbundle-а и загрузить обновленный zip-архив приложения.

Создание новой версии

При попытке создать appbundle, как указано выше в шаге 2, Вы получите ошибку 409 Conflict.

Этот POST-запрос создает новую версию appbundle-а DeleteWallsApp:

Код - HTML: [Выделить]
  1. curl -X POST  https://developer.api.autodesk.com/da/us-east/v3/appbundles/DeleteWallsApp/versions -H 'Content-Type: application/json'  -H 'Authorization: Bearer LongStringAccessTokenObtainedDuringAuthenthication'  -d '{
  2.       "id": null,
  3.       "engine": "Autodesk.Revit+2018",
  4.       "description": "Delete Walls appbundle based on Revit 2018 Update"
  5.     }'

Примечания:

  • Вы можете опустить id в теле запроса. Если id указан в теле запроса, его значение должно быть null, иначе сервис выдаст ошибку.
  • https://developer.api.autodesk.com/da/us-east/v3/appbundles/{appId}/versions - Замените {appId}(DeleteWallsApp) чтобы использовать этот пример с другими appbundle-ами.

Ответ сервиса:

Код - JavaScript: [Выделить]
  1. {
  2.     "uploadParameters": {
  3.         "endpointURL": "https://dasprod-store.s3.amazonaws.com",
  4.         "formData": {
  5.             "key": "apps/Revit/DeleteWallsApp/2",
  6.             "content-type": "application/octet-stream",
  7.             "policy": "eyJleHBpcmF0aW9uIjoiMjAxOC... (truncated)",
  8.             "success_action_status": "200",
  9.             "success_action_redirect": "",
  10.             "x-amz-signature": "6c68268e23ecb8452... (truncated)",
  11.             "x-amz-credential": "ASIAQ2W... (truncated)",
  12.             "x-amz-algorithm": "AWS4-HMAC-SHA256",
  13.             "x-amz-date": "20180810... (truncated)",
  14.             "x-amz-server-side-encryption": "AES256",
  15.             "x-amz-security-token": "FQoGZXIvYXdzEPj//////////wEaDHavu... (truncated)"
  16.         }
  17.     },
  18.     "engine": "Autodesk.Revit+2018",
  19.     "description": "Delete Walls appbundle based on Revit 2018",
  20.     "version": 2,
  21.     "id": "YourNickname.DeleteWallsApp"
  22. }

Здесь:

- package - url, по которому должен быть загружен zip-файл

- version - номер новой версии

Теперь Вы можете загрузить обновлённую версию zip-файла appbundle-f приложения по URL, который вернул сервис в ответе выше. Это делается так же, как на 3-ем шаге, см. выше.

Шаг 6. Присвоение существующего alias-а новой версии appbundle-а

Вы можете присвоить существующий alias новой версии appbundle-а, например после создания новой версии.

Для этого Вы можете либо удалить alias и пересоздать его заново с указанием новой версии appbundle-а, либо выполнить PATCH-запрос:

Код - HTML: [Выделить]
  1. curl -X PATCH  https://developer.api.autodesk.com/da/us-east/v3/appbundles/DeleteWallsApp/aliases/test  -H 'Content-Type: application/json'  -H 'Authorization: Bearer LongStringAccessTokenObtainedDuringAuthenthication'  -d '{
  2.         "version": 2
  3.         }'`

 

Псевдонимы (alias) версий доступных engine:

  • Каждый appbundle POST-запрос требует указания engine, который определяет приложение, которое будет выполнять код. Alias-ы версий Design Automation engine соответствуют разным версиям Revit. Указанный engineдолжен быть совместим с указанными в PackageContent.xml SeriesMin и SeriesMax appbundle-а.
  • Текущие alias-ы версий engine:
    • Autodesk.Revit+2018 - Revit 2018.3.2
    • Autodesk.Revit+2019 - Revit 2019.1

Примечания:

- API для получения информации о доступных engine доступно здесь.

- Общее описание возможных ошибок доступно здесь.

Назад к созданию nickname приложения Forge

Читать далее о публикации activity

Источник: https://forge.autodesk.com/en/docs/design-automation/v3/tutorials/revit/step4-publish-appbundle/

 

 

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

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

Опубликовано 30.01.2019
Отредактировано 30.01.2019 в 19:03:26