Design Automation API - особенности создания нового документа (NewProjectDocument)
Обычно, использование Design Automation API предполагает импорт исходного файла, выполнение определенных операций над ним. В качестве результата мы имеем либо обновленный исходный файл, либо некоторые данные, которые мы получили из него. Activity в таком случае определяется примерно следующим образом (пример на Postman):
- {
- "id": "{{activityName}}",
- "commandLine": [ "$(engine.path)\\\\revitcoreconsole.exe /i $(args[rvtFile].path) /al $(appbundles[{{appBudleName}}].path)" ],
- "parameters": {
- "rvtFile": {
- "zip": false,
- "ondemand": false,
- "verb": "get",
- "description": "Input Revit model",
- "required": true
- },
- "result": {
- "zip": false,
- "ondemand": false,
- "verb": "put",
- "description": "Results",
- "required": true,
- "localName": "result.rvt"
- }
- },
- "engine": "Autodesk.Revit+2019",
- "appbundles": [ "{{dasNickName}}.{{appBudleName}}+{{appBundleAlias}}" ],
- "description": "Demo DA Activity."
- }
Код обработчика выглядит примерно следующим образом:
- public void HandleDesignAutomationReadyEvent(object sender, DesignAutomationReadyEventArgs e)
- {
- e.Succeeded = true;
- Application app = sender as Application;
- DoJob(e.DesignAutomationData);
- }
- public static void DoJob(DesignAutomationData data)
- {
- Application rvtApp = data.RevitApp;
- if (rvtApp == null)
- throw new InvalidDataException(nameof(rvtApp));
- Document rvtDoc = data.RevitDoc;
- // основные операции и
- // вывод…
- }
Поскольку мы определили входным параметром /i исходных файл, Design Automation для Revit откроет его и выполнит заданные операции, т.е. имеем алгоритм вида:
Мы же хотим создать новый файл:
- public static void DoJob(DesignAutomationData data)
- {
- Application rvtApp = data.RevitApp;
- if (rvtApp == null)
- throw new InvalidDataException(nameof(rvtApp));
- Document rvtDoc = data.RevitDoc;
- Document newDoc = e.DesignAutomationData.RevitApp.NewProjectDocument( rvtDoc.PathName);
- // Работаем с новосозданным документом newDoc
- // Вывод…
- }
Design Automation откроет файл шаблона и попытается создать новый файл на основе этого же файла шаблона. НО! Файл шаблона уже открыт и заблокирован, поэтому вызов NewProjectDocument выдаст ошибку и задача не будет выполнена.
Вообще говоря, при разработке для Design Automation для Revit совсем не помешает использовать утилиту отладки, она позволит выявить большинство проблем, в частности Exception при вызове NewProjectDocument как в коде выше.
Так как же решить проблему с вызовом NewProjectDocument? Легко! Определите файл шаблона как общим входным параметром в Activity, т.е. вместо параметра в /i задайте параметром входной файл с указанным localName:
- {
- "id": "{{activityName}}",
- "commandLine": [ "$(engine.path)\\\\revitcoreconsole.exe /al $(appbundles[{{appBudleName}}].path)" ],
- "parameters": {
- "rvtFile": {
- "zip": false,
- "ondemand": false,
- "verb": "get",
- "description": "Input Revit model",
- "required": true,
- "localName": "BaseTemplate.rte"
- },
- "result": {
- "zip": false,
- "ondemand": false,
- "verb": "put",
- "description": "Results",
- "required": true,
- "localName": "result.rvt"
- }
- },
- "engine": "Autodesk.Revit+2019",
- "appbundles": [ "{{dasNickName}}.{{appBudleName}}+{{appBundleAlias}}" ],
- "description": "Demo Activity."
- }
В плагине используйте local name для создания нового документа, т.е. при старте work item-а, Design Automation загрузит файл шаблона в рабочий каталог, но не будет его открывать автоматически. Загруженный файл будет доступен под именем local name, указанным в Activity:
- public static void DoJob(DesignAutomationData data)
- {
- Application rvtApp = data.RevitApp;
- if (rvtApp == null)
- throw new InvalidDataException(nameof(rvtApp));
- Document rvtDoc = data.RevitDoc;
- Document newDoc = e.DesignAutomationData.RevitApp.NewProjectDocument(“BaseTemplate.rte”);
- // работаем с newDoc
- }
Источник: https://forge.autodesk.com/blog/when-working-newprojectdocument-design-automation-api
Обсуждение: http://adn-cis.org/forum/index.php?topic=
Опубликовано 30.04.2019