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

31/08/2020

Часть 3. Шаблон проекта Visual Studio Design Automation для Inventor. Запуск WorkItem-а

Я ранее рассказал Вам о шаблоне проекта Visual Studio для использования в сервисе Design Automation для Inventor-а (см. также перевод[TODO] на нашем сайте), и о том, как он может помочь Вам при отладке Вашего кода (см. также перевод[TODO] на нашем сайте).

В этой статья я расскажу о том, как использовать проект "Interaction" для создания и обновления AppBundle-а, Activity и запуска WorkItem-ов.

В первую очередь, Вам необходимо прописать clientid, clientsecret Вашего приложения Forge в файле "appsettings.json":

Поскольку в событии Post-Build проекта AppBundle (в нашем случае "TestPlugin") уже описан механизм создания zip-файла AppBundle-а, который может быть загружен в сервис Design Automation, Вы уже можете запустить задачу "Post app bundle" в приложении "Interaction" для загрузки AppBundle-а в облако.

Примечание: лучше всё-таки запустить сначала "Rebuild Solution", чтобы быть полностью уверенным, что Вы загружаете в сервис последнюю версию Вашего кода.

В файле"Publisher.Custom.cs" Вы можете задать те параметры AppBundleActivity и WorkItem-а, которые нужны Вам. В данном случае я добавил свойство "InputJson", в котором будет передаваться путь к json-файлу с параметрами, используемыми в конкретномWorkItem.

Я могу использовать это свойство в Activity, в WorkItem и в командной строке Activity. Вот как можно указать путь в командной строке Activity:

Код - C#: [Выделить]
  1. private static List<string> GetActivityCommandLine()
  2. {
  3.     return new List<string> {
  4.         $"$(engine.path)\\InventorCoreConsole.exe /al $(appbundles[{Constants.Activity.Id}].path)" +
  5.         $"/i $(args[{Constants.Parameters.InventorDoc}].path) $(args[{Constants.Parameters.InputJson}].path)"
  6.     };
  7. }

Поскольку мы не передаем путь к нашему json-файлу в качестве известной сервису командной строки (например такой как "/i", определяющей, какой документ необходимо открыть), то в методе RunWithArguments() из AppBundle-а он будет доступен через объект "map". В нашем случае, по ключу "_1", см. статью Run() vs RunWithArguments() (перевод на нашем сайте).

Теперь добавим параметр самойActivity:

Код - C#: [Выделить]
  1. private static Dictionary<string, Parameter> GetActivityParams()
  2. {
  3.     return new Dictionary<string, Parameter>
  4.     {
  5.         {
  6.             Constants.Parameters.InventorDoc,
  7.             new Parameter
  8.             {
  9.                 Verb = Verb.Get,
  10.                 Description = "IPT file to process"
  11.             }
  12.         },
  13.         {
  14.             Constants.Parameters.InputJson,
  15.             new Parameter
  16.             {
  17.                 Verb = Verb.Get,
  18.                 LocalName = "params.json",
  19.                 Description = "Input parameters"
  20.             }
  21.         },
  22.         {
  23.             Constants.Parameters.OutputIpt,
  24.             new Parameter
  25.             {
  26.                 Verb = Verb.Put,
  27.                 LocalName = "result.ipt",
  28.                 Description = "Resulting IPT",
  29.                 Ondemand = false,
  30.                 Required = false
  31.             }
  32.         }
  33.     };
  34. }

Примечание: убедитесь, что Вы указали свойство localName в свойстве параметраActivity (как показано выше) или в свойстве WorkItem-а, в противном случае, Design Automation будет пытаться скачать данные по переданному значению URL, что в нашем случае будет "data:application/json,{\"length\":\"10 in\"}", см. ниже. 

Теперь можно запустить задачу "Post activity" приложения "Interaction". Осталось добавить параметр WorkItem-а:

Код - C#: [Выделить]
  1. private static Dictionary<string, IArgument> GetWorkItemArgs()
  2. {
  3.     // TODO: укажите реальные URL
  4.     return new Dictionary<string, IArgument>
  5.     {
  6.         {
  7.             Constants.Parameters.InventorDoc,
  8.             new XrefTreeArgument
  9.             {
  10.                 Url = "!!! CHANGE ME !!!"
  11.             }
  12.         },
  13.         {
  14.             Constants.Parameters.InputJson,
  15.             new XrefTreeArgument
  16.             {
  17.                 Url = "data:application/json,{\"length\":\"10 in\"}"
  18.             }
  19.         },
  20.         {
  21.             Constants.Parameters.OutputIpt,
  22.             new XrefTreeArgument
  23.             {
  24.                 Verb = Verb.Put,
  25.                 Url = "!!! CHANGE ME !!!"
  26.             }
  27.         }
  28.     };
  29. }

Как Вы можете видеть в коде выше, вполне возможно передать содержимое json-файла напрямую в URL, вместо необходимости создания его где-либо, создания pre-signed url для него и передачи в WorkItem.

Самым простым способом создания URL-ов для параметровInventorDoc и OutputIpt является их загрузка в bucket ObjectStore Service-а и генерация pre-signed URL для них:

Для этого вы можете использовать такие инструменты как https://oss-manager.autodesk.io/  или Autodesk Forge Tools расширение для VS Code (перевод статьи на нашем сайте)

После заполнения значений URL-ов в свойствах WorkItem-а, Выможетезапустить задачу "Run work item" приложения "Interaction". После завершения выполнения WorkItem-а, созданный сервисом отчет будет выведен в консоли:

Помимо общей информации, такой какой именно движок сервисаDesign Automation был использован, успешно ли была выполнена задача и т.д., отчет будет содержать Trace сообщения, из кода AppBundle или правил iLogic:

Вы также можете использовать https://da-manager.autodesk.io/ или выше указанное расширение  для  VSCode, чтобы проверить Ваши AppBundlesActivities и WorkItems:

 

Источник: https://forge.autodesk.com/blog/design-automation-inventor-vs-template-run-workitem

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