Design Automatiion: Запуск дополнительных утилит в WorkItem
Основной задачей Design Automation API является возможность запуска различных продуктов Autodesk в облаке. Но у Вас могут быть какие-то существующие программы, которые Вы, возможно, хотите запустить в рамках Вашего рабочего процесса. Тогда для Вас хорошей новостью будет описанный в этой статье способ запуска таких программ. Конечно, есть некоторые ограничения. Во-первых, эти программы не должны требовать установки, должно быть достаточно загрузить в облако exe-файл, возможно, какие-то файлы библиотек, дополнительные ресурсы. Во-вторых, может оказаться так, что какие-то ресурсы окажутся недоступными в виртуальной машине, в которой запускается задача Design Automation.Для того, чтобы запустить программу, достаточно просто добавить её в архив AppBundle и добавить в командную строку Activity в нужном порядке несколько строк, как в этом примере:
- "commandLine": [
- "$(engine.path)\\InventorCoreConsole.exe /al $(appbundles[ObjUpdater].path)",
- "$(appbundles[ObjUpdater].path)\\ObjUpdaterPlugin.bundle\\Contents\\MyUtility.exe input.obj output.obj"
- ]
Одной из проблем, с которой я встретился, было то, что sandboxer на наших серверах добавляет дополнительные аргументы командной строки при запуске программы. Если это проблема (например, программа возвращает что-то вроде «input parameter not recognized»), то я нашёл для Вас по крайней мере два способа, как это исправить:
а) Использовать batch-файл (*.bat)
Это, наверное, самый простой способ. Единственная хитрость, это получить полный путь к запускаемой программе. Поскольку *.bat и *.exe файлы должны быть где-то рядом в папке Contents архива AppBundle, можно использовать путь к родительской папке *.bat файла:
Содержимое MyUtility.bat:
- %~dp0MyUtility.exe input.obj output.obj
Теперь нужно поправить аргумент командной строки Activity, чтобы запускать batch файл.
- "commandLine": [
- "$(engine.path)\\InventorCoreConsole.exe /al $(appbundles[ObjUpdater].path)",
- "$(appbundles[ObjUpdater].path)\\ObjUpdaterPlugin.bundle\\Contents\\MyUtility.bat"
- ]
б) Запускать программу из кода AppBundle
Если Вы запускете .Net-код в AppBundle, используйте объект класса Process для запуска внешней программы из Вашего кода:
- public void Run(Document doc)
- {
- LogTrace("Run called");
- string codeBase = Assembly.GetExecutingAssembly().CodeBase;
- UriBuilder uri = new UriBuilder(codeBase);
- string path = Uri.UnescapeDataString(uri.Path);
- string dir = System.IO.Path.GetDirectoryName(path);
- LogTrace("Assembly folder: " + dir);
- string utilityPath = System.IO.Path.Combine(dir, "MyUtility.exe");
- if (System.IO.File.Exists(utilityPath))
- {
- LogTrace(utilityPath + " found");
- ProcessStartInfo psi = new ProcessStartInfo(
- utilityPath,
- "input.obj output.obj"
- );
- psi.RedirectStandardOutput = true;
- psi.UseShellExecute = false;
- Process p = Process.Start(psi);
- LogTrace("Waiting for utility to finish");
- p.WaitForExit();
- LogTrace("Utility finished");
- }
- else
- {
- LogTrace(utilityPath + " not found");
- }
- }
Этот способ, на самом деле обладает большим потенциалом чем просто решение проблемы автоматической подстановки дополнительных параметров в командную строку запускаемой программы. Он так же позволит
- запускать программу нужное Вам количество раз в цикле
- менять параметры командной строки запускаемой программы
В этом случае, в командную строку Activity добавлять запуск программы не требуется:
- "commandLine": [
- "$(engine.path)\\InventorCoreConsole.exe /al $(appbundles[ObjUpdater].path)"
- ]
Источник: https://forge.autodesk.com/blog/run-additional-programs-inside-workitem
Опубликовано 29.04.2020