Выполнение сценариев Python в узлах Zero-Touch (C#)
Last updated
Last updated
Если вы умеете писать сценарии на языке Python и хотите получить расширенные возможности при использовании стандартных узлов Dynamo Python, создайте собственный узел с помощью технологии Zero-Touch. Начнем с простого примера, в котором мы передадим сценарий Python в виде строки в узел Zero-Touch, где сценарий выполнится и вернет результат. В этом практическом примере мы опираемся на пошаговые инструкции и примеры из раздела «Начало работы». Если вы еще не работали с узлами Zero-Touch, начните с этого раздела.
Узел Zero-Touch, выполняющий строку сценария Python
Этот узел основан на экземпляре обработчика сценариев IronPython. Нам нужно создать ссылки на несколько дополнительных сборок. Чтобы настроить базовый шаблон в Visual Studio, выполните следующие действия:
Создайте новый проект класса Visual Studio.
Добавьте ссылку на файл IronPython.dll
, расположенный в папке C:\Program Files (x86)\IronPython 2.7\IronPython.dll
.
Добавьте ссылку на файл Microsoft.Scripting.dll
, расположенный в папке C:\Program Files (x86)\IronPython 2.7\Platforms\Net40\Microsoft.Scripting.dll
.
Включите в класс операторы IronPython.Hosting
и Microsoft.Scripting.Hosting
using
.
Добавьте частный пустой конструктор, чтобы предотвратить добавление дополнительного узла в библиотеку Dynamo с пакетом.
Создайте новый метод, при котором в качестве входного параметра используется одна строка.
В рамках этого метода создается экземпляр нового обработчика Python и пустая область сценария. Вы можете представить эту область как глобальные переменные в экземпляре интерпретатора Python.
Затем вызовите Execute
в обработчике, передав входную строку и область в качестве параметров.
Наконец, извлеките и верните результаты сценария. Для этого вызовите GetVariable
в области и передайте имя переменной из сценария Python, содержащего возвращаемое значение. (См. пример ниже.)
Следующий код представляет пример для описанного выше шага. При сборке решения будет создан новый файл .dll
, расположенный в папке bin нашего проекта. Теперь .dll
можно импортировать в Dynamo в составе пакета или выбрав File < Import Library...
(Файл > Импортировать библиотеку).
Сценарий Python возвращает переменную output
, значит в сценарии Python требуется переменная output
. Используйте этот пример сценария для тестирования узла в Dynamo. Если вы уже использовали узел Python в Dynamo, то вам будет знаком следующий фрагмент кода. Дополнительную информацию смотрите в разделе руководства, посвященном Python.
Одно из ограничений стандартных узлов Python заключается в том, что они имеют только один порт вывода, поэтому, если мы хотим вернуть несколько объектов, мы должны создать список и извлечь каждый объект. Если мы изменим приведенный выше пример для возврата словаря, мы можем добавить любое количество портов вывода. Более подробные сведения о словарях см. в разделе «Возврат нескольких значений» документа «Дальнейшая работа с Zero-Touch».
Этот узел позволяет возвращать как объем кубоида, так и его центр тяжести.
Изменим предыдущий пример, выполнив следующие действия:
Добавьте ссылку на DynamoServices.dll
из диспетчера пакетов NuGet.
В дополнение к предыдущим сборкам включите System.Collections.Generic
и Autodesk.DesignScript.Runtime
.
Измените тип возвращаемого значения метода, чтобы он возвращал словарь с выходными данными.
Все выходные данные должны извлекаться из области по отдельности (рекомендуется создать простой цикл для больших наборов выходных данных)
В пример сценария Python мы добавили дополнительную выходную переменную (output2
). Следует иметь в виду, что для таких переменных можно использовать любые соглашения об именовании Python. В данном примере название «output» используется только для наглядности.