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

30/04/2019

Design Automation API - особенности создания нового документа (NewProjectDocument)

Обычно, использование Design Automation API предполагает импорт исходного файла, выполнение определенных операций над ним. В качестве результата мы имеем либо обновленный исходный файл, либо некоторые данные, которые мы получили из него. Activity в таком случае определяется примерно следующим образом (пример на Postman):

Код - HTML: [Выделить]
  1. {
  2.                 "id": "{{activityName}}",
  3.                 "commandLine": [ "$(engine.path)\\\\revitcoreconsole.exe /i $(args[rvtFile].path) /al $(appbundles[{{appBudleName}}].path)" ],
  4.                 "parameters": {
  5.                   "rvtFile": {
  6.                                "zip": false,
  7.                                "ondemand": false,
  8.                                "verb": "get",
  9.                                "description": "Input Revit model",
  10.                                "required": true
  11.                   },
  12.                   "result": {
  13.                                "zip": false,
  14.                                "ondemand": false,
  15.                                "verb": "put",
  16.                                "description": "Results",
  17.                                "required": true,
  18.                                "localName": "result.rvt"
  19.                   }
  20.                 },
  21.                 "engine": "Autodesk.Revit+2019",
  22.                 "appbundles": [ "{{dasNickName}}.{{appBudleName}}+{{appBundleAlias}}" ],
  23.                 "description": "Demo DA Activity."
  24. }

Код обработчика выглядит примерно следующим образом:

Код - C#: [Выделить]
  1. public void HandleDesignAutomationReadyEvent(object sender, DesignAutomationReadyEventArgs e)
  2. {
  3.                 e.Succeeded = true;
  4.                 Application app = sender as Application;
  5.  
  6.                 DoJob(e.DesignAutomationData);
  7. }
  8.  
  9. public static void DoJob(DesignAutomationData data)
  10. {
  11.                 Application rvtApp = data.RevitApp;
  12.                 if (rvtApp == null)
  13.                                throw new InvalidDataException(nameof(rvtApp));
  14.  
  15.                 Document rvtDoc = data.RevitDoc;
  16.                 // основные операции и          
  17.                 // вывод…
  18. }

Поскольку мы определили входным параметром /i исходных файл, Design Automation для Revit откроет его и выполнит заданные операции, т.е. имеем алгоритм вида:

Мы же хотим создать новый файл:

Код - C#: [Выделить]
  1. public static void DoJob(DesignAutomationData data)
  2. {
  3.                 Application rvtApp = data.RevitApp;
  4.                 if (rvtApp == null)
  5.                                throw new InvalidDataException(nameof(rvtApp));
  6.  
  7.                 Document rvtDoc = data.RevitDoc;
  8.                 Document newDoc = e.DesignAutomationData.RevitApp.NewProjectDocument( rvtDoc.PathName);
  9.                 // Работаем с новосозданным документом newDoc
  10.                 // Вывод…
  11. }

Design Automation откроет файл шаблона и попытается создать новый файл на основе этого же файла шаблона. НО! Файл шаблона уже открыт и заблокирован, поэтому вызов NewProjectDocument выдаст ошибку и задача не будет выполнена.

Вообще говоря, при разработке для Design Automation для Revit совсем не помешает использовать утилиту отладки, она позволит выявить большинство проблем, в частности Exception при вызове NewProjectDocument как в коде выше.

Так как же решить проблему с вызовом NewProjectDocument? Легко! Определите файл шаблона как общим входным параметром в Activity, т.е. вместо параметра в /i задайте параметром входной файл с указанным localName:

Код - HTML: [Выделить]
  1. {
  2.     "id": "{{activityName}}",
  3.     "commandLine": [ "$(engine.path)\\\\revitcoreconsole.exe /al $(appbundles[{{appBudleName}}].path)" ],
  4.     "parameters": {
  5.       "rvtFile": {
  6.         "zip": false,
  7.         "ondemand": false,
  8.         "verb": "get",
  9.         "description": "Input Revit model",
  10.         "required": true,
  11.          "localName": "BaseTemplate.rte"
  12.        },
  13.       "result": {
  14.         "zip": false,
  15.         "ondemand": false,
  16.         "verb": "put",
  17.         "description": "Results",
  18.         "required": true,
  19.         "localName": "result.rvt"
  20.       }
  21.     },
  22.     "engine": "Autodesk.Revit+2019",
  23.     "appbundles": [ "{{dasNickName}}.{{appBudleName}}+{{appBundleAlias}}" ],
  24.     "description": "Demo Activity."
  25. }

В плагине используйте local name для создания нового документа, т.е. при старте work item-а, Design Automation загрузит файл шаблона в рабочий каталог, но не будет его открывать автоматически. Загруженный файл будет доступен под именем local name, указанным в Activity:

Код - C#: [Выделить]
  1. public static void DoJob(DesignAutomationData data)
  2. {
  3.                 Application rvtApp = data.RevitApp;
  4.                 if (rvtApp == null)
  5.                                throw new InvalidDataException(nameof(rvtApp));
  6.  
  7.                 Document rvtDoc = data.RevitDoc;
  8.                 Document newDoc = e.DesignAutomationData.RevitApp.NewProjectDocument(“BaseTemplate.rte);
  9.                 // работаем с newDoc
  10. }

Источник: https://forge.autodesk.com/blog/when-working-newprojectdocument-design-automation-api

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

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

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