Dynamo
Primer for v2.0
Русский
Русский
  • О программе
  • Введение
    • Что представляет собой программа Dynamo и как она работает?
    • Руководство пользователя Dynamo Primer, сообщество и платформа Dynamo
  • Настройка Dynamo
  • Пользовательский интерфейс
    • Рабочее пространство
    • Библиотека
  • Узлы и провода
  • Основные узлы и понятия
    • Указатель узлов
    • Геометрия для машинного проектирования
      • Обзор концепции геометрии
      • Вектор, плоскость и система координат
      • Точки
      • Кривые
      • Поверхности
      • Тела
      • Сети
    • Компоновочные блоки программ
      • Передача данных
      • Math
      • Logic
      • Строки
      • Цвет
    • Проектирование на основе списков
      • Что такое список
      • Работа со списками
      • Списки списков
      • Многомерные списки
    • Словари в Dynamo
      • Что такое словарь
      • Узлы Dictionary
      • Словари в узлах Code Block
      • Примеры использования Revit
  • Пользовательские узлы и пакеты
    • Пользовательские узлы
      • Пользовательские узлы: введение
      • Создание пользовательских узлов
      • Публикация узлов в библиотеку
    • Пакеты
      • Пакеты: введение
      • Практикум по работе с пакетом: Mesh Toolkit
      • Разработка пакетов
      • Публикация пакетов
      • Импорт Zero Touch
  • Dynamo для Revit
    • Подключение к Revit
    • Выбор
    • Редактирование
    • Создание
    • Адаптация
    • Выпуск документации
  • Dynamo for Civil 3D
    • Совместимость с Civil 3D
    • Начало работы
    • Библиотека узлов
    • Примеры рабочих процессов
      • Дороги
        • Размещение осветительных столбов
      • Землеустройство
        • Размещение коммуникаций
      • Инженерные сети
        • Переименование колодцев
      • Железная дорога
        • Границы зазора
      • Топосъемка
        • Управление группами точек
    • Дополнительные разделы
      • Привязка объекта
      • Python и Civil 3D
    • Проигрыватель Dynamo
    • Полезные пакеты
    • Ресурсы
  • Бета-версия Dynamo в Forma
    • Настройка Dynamo Player в Forma
    • Добавление графов и предоставление к ним общего доступа в Dynamo Player
    • Запуск графов в Dynamo Player
    • Отличия вычислительной службы Dynamo от классического приложения Dynamo
  • Создание кода в Dynamo
    • Узлы Code Block и DesignScript
      • Что такое Code Block
      • Синтаксис DesignScript
      • Сокращение
      • Функции
    • Создание геометрии с помощью DesignScript
      • Основы работы с геометрией посредством DesignScript
      • Геометрические примитивы
      • Векторная математика
      • Кривые: интерполяционные и по управляющим точкам
      • Перенос, поворот и другие преобразования
      • Поверхности: интерполяционные, лофтированные, по управляющим точкам и поверхности вращения
      • Параметризация геометрических объектов
      • Пересечение и обрезка
      • Логические операции с геометрическими объектами
      • Генераторы точек Python
    • Python
      • Узлы Python
      • Python и Revit
      • Настройка собственного шаблона Python
    • Изменения языка
  • Практические советы
    • Методы создания графиков
    • Методы создания сценариев
    • Справочник по созданию сценариев
    • Управление структурой программы
    • Эффективная работа с большими наборами данных в Dynamo
  • Примеры рабочих процессов
    • Процессы для начала работы
      • Параметрическая ваза
      • Точки притяжения
    • Индекс понятий
  • Руководство для разработчиков
    • Сборка Dynamo на основе исходного кода
      • Сборка DynamoRevit на основе исходного кода
      • Управление зависимостями и их обновление в Dynamo
    • Разработка для Dynamo
      • Начало работы
      • Пример использования узлов Zero-Touch — узел сетки
      • Выполнение сценариев Python в узлах Zero-Touch (C#)
      • Дальнейшая работа с Zero-Touch
      • Расширенная настройка узлов Dynamo
      • Использование типов COM (взаимодействие) в пакетах Dynamo
      • Пример использования NodeModel — настраиваемый пользовательский интерфейс
      • Обновление пакетов и библиотек Dynamo для Dynamo 2.x
      • Обновление пакетов и библиотек Dynamo для Dynamo 3.x
      • Расширения
      • Определение пользовательской организации пакетов для Dynamo 2.0 или более поздней версии
      • Интерфейс командной строки Dynamo
      • Интеграция с Dynamo
      • Разработка для Dynamo for Revit
      • Публикация пакета
      • Создание пакета из Visual Studio
      • Расширения в виде пакетов
    • Запросы на слияние
    • Ожидания от тестирования
    • Примеры
  • Приложение
    • Вопросы и ответы
    • Визуальное программирование и Dynamo
    • Ресурсы
    • Примечания к выпуску
    • Полезные пакеты
    • Файлы примеров
    • Таблица интеграции с основной программой
    • PDF для скачивания
    • Сочетания клавиш Dynamo
Powered by GitBook
On this page
Edit on GitHub
Export as PDF
  1. Руководство для разработчиков
  2. Разработка для Dynamo

Выполнение сценариев Python в узлах Zero-Touch (C#)

PreviousПример использования узлов Zero-Touch — узел сеткиNextДальнейшая работа с Zero-Touch

Last updated 1 month ago

Выполнение сценариев Python в узлах Zero-Touch (C#)

Если вы умеете писать сценарии на языке Python и хотите получить расширенные возможности при использовании стандартных узлов Dynamo Python, создайте собственный узел с помощью технологии Zero-Touch. Начнем с простого примера, в котором мы передадим сценарий Python в виде строки в узел Zero-Touch, где сценарий выполнится и вернет результат. В этом практическом примере мы опираемся на пошаговые инструкции и примеры из раздела «Начало работы». Если вы еще не работали с узлами Zero-Touch, начните с этого раздела.

Узел Zero-Touch, выполняющий строку сценария Python

Обработчик 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... (Файл > Импортировать библиотеку).

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;

namespace PythonLibrary
{
    public class PythonZT
    {
        // Unless a constructor is provided, Dynamo will automatically create one and add it to the library
        // To avoid this, create a private constructor
        private PythonZT() { }

        // The method that executes the Python string
        public static string executePyString(string pyString)
        {
            ScriptEngine engine = Python.CreateEngine();
            ScriptScope scope = engine.CreateScope();
            engine.Execute(pyString, scope);
            // Return the value of the 'output' variable from the Python script below
            var output = scope.GetVariable("output");
            return (output);
        }
    }
}
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

cube = Cuboid.ByLengths(10,10,10);
volume = cube.Volume
output = str(volume)

Несколько выходных данных

Одно из ограничений стандартных узлов Python заключается в том, что они имеют только один порт вывода, поэтому, если мы хотим вернуть несколько объектов, мы должны создать список и извлечь каждый объект. Если мы изменим приведенный выше пример для возврата словаря, мы можем добавить любое количество портов вывода. Более подробные сведения о словарях см. в разделе «Возврат нескольких значений» документа «Дальнейшая работа с Zero-Touch».

Этот узел позволяет возвращать как объем кубоида, так и его центр тяжести.

Изменим предыдущий пример, выполнив следующие действия:

  • Добавьте ссылку на DynamoServices.dll из диспетчера пакетов NuGet.

  • В дополнение к предыдущим сборкам включите System.Collections.Generic и Autodesk.DesignScript.Runtime.

  • Измените тип возвращаемого значения метода, чтобы он возвращал словарь с выходными данными.

  • Все выходные данные должны извлекаться из области по отдельности (рекомендуется создать простой цикл для больших наборов выходных данных)

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System.Collections.Generic;
using Autodesk.DesignScript.Runtime;

namespace PythonLibrary
{
    public class PythonZT
    {
        private PythonZT() { }

        [MultiReturn(new[] { "output1", "output2" })]
        public static Dictionary<string, object> executePyString(string pyString)
        {
            ScriptEngine engine = Python.CreateEngine();
            ScriptScope scope = engine.CreateScope();
            engine.Execute(pyString, scope);
            // Return the value of 'output1' from script
            var output1 = scope.GetVariable("output1");
            // Return the value of 'output2' from script
            var output2 = scope.GetVariable("output2");
            // Define the names of outputs and the objects to return
            return new Dictionary<string, object> {
                { "output1", (output1) },
                { "output2", (output2) }
            };
        }
    }
}

В пример сценария Python мы добавили дополнительную выходную переменную (output2). Следует иметь в виду, что для таких переменных можно использовать любые соглашения об именовании Python. В данном примере название «output» используется только для наглядности.

import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

cube = Cuboid.ByLengths(10,10,10);
centroid = Cuboid.Centroid(cube);
volume = cube.Volume
output1 = str(volume)
output2 = str(centroid)

Сценарий Python возвращает переменную output, значит в сценарии Python требуется переменная output . Используйте этот пример сценария для тестирования узла в Dynamo. Если вы уже использовали узел Python в Dynamo, то вам будет знаком следующий фрагмент кода. Дополнительную информацию смотрите в разделе руководства, посвященном .

Python
Узел Zero-Touch, выполняющий строку сценария Python
Этот узел позволяет возвращать как объем кубоида, так и его центр тяжести.