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

30/01/2019

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

Содержание

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

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

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

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

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

6. Запуск workitem

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

Как переделать код addin для десктопного приложения Revit в код, который сможет обработать сервис Design Automation для Revit?

Шаг 1. Подключение сборки DesignAutomationBridge.dll

Загрузите сборку и добавьте её в Reference-ы проекта:

Revit 2018: DesignAutomationBridge.dll

Revit 2019: DesignAutomationBridge.dll

Шаг 2. Используйте IExternalDBApplication вместо IExternalApplication или IExternalCommand

Так как облачный сервис Design Automation для Revit не имеет пользовательского интерфейса, вы не сможете запустить команды (IExternalCommand) так, как это делается в десктопной версии приложения. Вам необходимо реализовать в Вашем коде методы OnStartup и OnShutdown. Эти методы принимают в качестве параметра объект ControlledApplication вместо UIControlledApplication и возвращают ExternalDBApplicationResult:

Код - C#: [Выделить]
  1. using Autodesk.Revit.ApplicationServices;
  2. using Autodesk.Revit.DB;
  3. using DesignAutomationFramework;
  4. namespace DeleteWalls
  5. {
  6.    [Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
  7.    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
  8.    public class DeleteWallsApp : IExternalDBApplication
  9.    {
  10.       public ExternalDBApplicationResult OnStartup(Autodesk.Revit.ApplicationServices.ControlledApplication app)
  11.       {
  12.          return ExternalDBApplicationResult.Succeeded;
  13.       }
  14.  
  15.       public ExternalDBApplicationResult OnShutdown(Autodesk.Revit.ApplicationServices.ControlledApplication app)
  16.       {
  17.          return ExternalDBApplicationResult.Succeeded;
  18.       }

RevitAPIUI References

В Reference-ах проекта не должно быть ссылок на RevitAPIUI (а так же WPF, WindowsForms и т.д.), т.к. код, выполняемый на сервере не предполагает пользовательского взаимодействия. Любое действие, вызывающее диалог, требующий пользовательского ввода подвесит систему.

В файле .addin необходимо указать:

Код - XML: [Выделить]
  1. <AddIn Type="DBApplication">

Шаг 3. Добавьте в Reference проекта DesignAutomationBridge.dll и обработчик события DesignAutomationReady

Код проекта для Design Automation для Revit требует подключения сборки DesignAutomationBridge.dll. Найдите проект в Visual Studio Solution Explorer, в нём в References по щелчку правой кнопкой мыши будет доступен пункт "Add reference...". В открывшемся окне нажмите кнопку "Browse", найдите файл DesignAutomationBridge.dll, выберите его и нажмите "OK".

DesignAutomationBridge определяет событие DesignAutomationReadyEvent. Сервис Design Automation вызовет это событие, когда он будет готов запустить Ваш addin. Ваш код должен запускаться в обработчике этого события:

Код - C#: [Выделить]
  1. public class DeleteWallsApp : IExternalDBApplication
  2. {
  3.    public ExternalDBApplicationResult OnStartup(Autodesk.Revit.ApplicationServices.ControlledApplication app)
  4.    {
  5.       DesignAutomationBridge.DesignAutomationReadyEvent += HandleDesignAutomationReadyEvent;
  6.       return ExternalDBApplicationResult.Succeeded;
  7.    }
  8.    public void HandleDesignAutomationReadyEvent(object sender, DesignAutomationReadyEventArgs e)
  9.    {
  10.       e.Succeeded = true;
  11.       DeleteAllWalls(e.DesignAutomationData);
  12.    }

Установите значение фактического параметра DesignAutomationReadyEventArgs.Succeeded чтобы уведомить сервис о том, что Ваш код был успешно выполнен.

Во время выполнения кода Вашего addin все файлы, которые Вы загружаете или записываете должны находиться в Windows current working directory (или её дочерних папках). Вы не сможете получить доступ к каким-либо файлам вне этого каталога.

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

Все ошибки и предупреждения в Revit обрабатываются с помощью специального механизма обработки. Подробности об обработке ошибок в Revit здесь, Вам необходимо реализовать собственную стратегию их обработки в Вашем приложении.

Шаг 5. Тестирование addin

Тестирование доступно только на Вашей локальной машине, Вы не сможете отлаживать код, который запускается в облаке сервисом Design Automation для Revit.

Лучшим способом тестирование Вашего addin - временно добавить обработку события ApplicationInitialized.

Предупреждение: не запускайте код обработки события ApplicationInitialized в облаке, потому что Design Automation для Revit после события ApplicationInitialized еще не закончил предобработку, необходимую для запуска Вашего кода.

Временно закомментируйте код обработки события DesignAutomationBridge.DesignAutomationReadyEvent

Код - C#: [Выделить]
  1. public class DeleteWallsApp : IExternalDBApplication
  2. {
  3.    public ExternalDBApplicationResult OnStartup(Autodesk.Revit.ApplicationServices.ControlledApplication app)
  4.    {
  5.       //Не обрабатываем событие в облаке:
  6.       //DesignAutomationBridge.DesignAutomationReadyEvent += HandleDesignAutomationReadyEvent;
  7.       //Подписываемся на событие инициализации Revit
  8.       app.ApplicationInitialized += HandleApplicationInitializedEvent;
  9.       return ExternalDBApplicationResult.Succeeded;
  10.    }
  11.  
  12.    //public void HandleDesignAutomationReadyEvent(object sender, DesignAutomationReadyEventArgs e)
  13.    //{
  14.    //   e.Succeeded = true;
  15.    //   DeleteAllWalls(e.DesignAutomationData);
  16.    //}
  17.  
  18.    public void HandleApplicationInitializedEvent(object sender, Autodesk.Revit.DB.Events.ApplicationInitializedEventArgs e)
  19.    {
  20.       Autodesk.Revit.ApplicationServices.Application app = sender as Autodesk.Revit.ApplicationServices.Application;
  21.       DesignAutomationData data = new DesignAutomationData(app, "/path/to/file.rvt");
  22.       DeleteAllWalls(data);
  23.    }

Дальнейшие действия идентичны разработке addin для десктопной версии Revit, сборка и файл манифеста .addin должны находиться в одном из мест, откуда Revit считывает их, напримерC:\ProgramData\Autodesk\Revit\Addins\2018\ (или 2019 для Revit 2019)

С обработчиком события ApplicationInitialized, Ваш addin выполнится автоматически при запуске Revit. См здесь об отладке addin для Revit.

Замечания:

  • Ваше приложение не сможет использовать сеть или записывать файлы вне рабочей директории. Ограничения Design Automation для Revit описаны здесь.

Читать дальше о создании приложения Forge

Источник: https://forge.autodesk.com/en/docs/design-automation/v3/tutorials/revit/step1-convert-addin/

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

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

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