Вы создали пользовательский узел и применили его к определенному процессу на графике Dynamo. Это очень полезный узел, поэтому его надо сохранить в библиотеке Dynamo для использования в других графиках. Для этого нужно опубликовать узел локально. Этот процесс аналогичен публикации пакета, который будет рассмотрен подробнее в следующей главе.
Узел, опубликованный локально, станет доступен в библиотеке Dynamo после запуска нового сеанса. Если пользовательский узел не опубликован, его необходимо разместить в папке графика Dynamo, ссылающегося на этот узел (либо этот узел нужно импортировать в Dynamo с помощью меню Файл > Импорт библиотеки).
Пользовательские узлы и пакеты из Dynamo Sandbox можно публиковать в версии 2.17 и более поздних, если они не имеют зависимостей основного API. В более ранних версиях пользовательские узлы и пакеты можно публиковать только в Dynamo for Revit и Dynamo for Civil 3D.
Скачайте файл примера, щелкнув указанную ниже ссылку.
Полный список файлов примеров можно найти в приложении.
Продолжайте работу с пользовательским узлом, созданным в предыдущем разделе. После открытия пользовательского узла PointsToSurface график отображается в редакторе пользовательских узлов Dynamo. Пользовательский узел также можно открыть, дважды щелкнув его в редакторе графиков Dynamo.
Чтобы опубликовать пользовательский узел локально, щелкните правой кнопкой мыши в рабочей области и выберите Опубликовать данный пользовательский узел...
Введите все необходимые сведения, как показано на изображении выше, и выберите Опубликовать локально. Обратите внимание, что в поле «Группа» задается основной элемент, который будет доступен в меню Dynamo.
Выберите папку для хранения всех пользовательских узлов, которые планируется опубликовать локально. Приложение Dynamo будет проверять эту папку каждый раз при загрузке, поэтому она должна находиться в постоянном расположении. Перейдите к этой папке и нажмите Выбрать папку. Пользовательский узел Dynamo опубликован локально и теперь будет отображаться в библиотеке Dynamo при каждой загрузке программы.
Чтобы проверить расположение папки пользовательского узла, откройте меню Dynamo > Настройки > Параметры пакета > Пути к узлу и пакету.
В этом окне отображается список путей.
Documents\DynamoCustomNodes... — расположение пользовательских узлов, которые были опубликованы локально.
AppData\Roaming\Dynamo... — путь по умолчанию к пакетам Dynamo, установленным из интернета.
Рекомендуется переместить путь к локальной папке вниз по списку (для этого щелкните стрелку вниз на панели слева от строки с путем). Верхняя папка всегда по умолчанию используется как расположение для установки пакетов. Поэтому если в качестве верхней папки будет указан путь для установки пакетов Dynamo, все полученные через интернет пакеты будут храниться отдельно от узлов, опубликованных локально
Порядок путей к папкам изменен, чтобы в качестве пути по умолчанию в Dynamo использовалась папка установки пакетов.
Перейдите в эту локальную папку. Исходный пользовательский узел находится в папке .dyf, имя которой является расширением для файлов пользовательских узлов Dynamo. Если отредактировать файл в этой папке, соответствующий узел будет обновлен в пользовательском интерфейсе. Кроме того, можно добавить дополнительные узлы в главную папку DynamoCustomNode, и после перезапуска Dynamo они появятся в библиотеке.
Теперь при каждой загрузке Dynamo узел PointsToSurface будет отображаться в группе DynamoPrimer библиотеки Dynamo.
В Dynamo доступно большое количество базовых узлов, позволяющих решать широкий спектр задач визуального программирования. Однако иногда создание пользовательских узлов позволяет прийти к более быстрому, оригинальному или удобному для совместного использования решению. Такие узлы можно многократно использовать в разных проектах. Они позволяют упростить и очистить графики. Опубликовав их в Package Manager, этими узлами можно поделиться с другими пользователями Dynamo по всему миру.
Пользовательские узлы создаются путем помещения стандартных и созданных разработчиками узлов в так называемый пользовательский узел Dynamo, который можно рассматривать как своего рода контейнер. При запуске такого узла-контейнера в графике происходит запуск всех содержащихся в нем компонентов. В результате получается удобная комбинация узлов для многократного использования и предоставления другим пользователям.
Если в графике присутствует несколько копий пользовательского узла, их все можно отредактировать одновременно, изменив базовый экземпляр этого узла. Это позволяет с легкостью редактировать график и адаптировать его к изменениям, которые могут возникнуть в проекте или рабочем процессе.
Главное преимущество пользовательских узлов — удобство совместной работы. Например, если опытный программист создает в Dynamo сложный график, который затем требуется передать проектировщику, не работавшему с Dynamo, то программист может упростить представление графика и сделать его максимально доступным для проектировщика. Пользовательский узел-контейнер, в который помещается график, можно открывать для редактирования его содержимого, однако внешний вид контейнера при этом может оставаться простым и аккуратным. Таким образом, пользовательские узлы позволяют делать графики Dynamo лаконичными и интуитивно понятными.
Создавать пользовательские узлы в Dynamo можно самыми разными способами. В примерах, которые приведены в этой главе, пользовательские узлы создаются с помощью функций интерфейса Dynamo. Программисты, интересующиеся возможностями форматирования в C# или Zero Touch, могут ознакомиться с подробным обзором на этой странице справки Wiki по Dynamo.
Перейдите в среду пользовательского узла, чтобы создать простой узел для расчета процентного соотношения. Среда пользовательского узла отличается от среды графика Dynamo, но работа в ней осуществляется на основе тех же принципов. Итак, пора создать первый пользовательский узел.
Чтобы создать пользовательский узел с нуля, запустите Dynamo и выберите «Пользовательский узел» или используйте сочетание клавиш CTRL + SHIFT + N в рабочей области.
Задайте имя, описание и категорию в диалоговом окне «Свойства пользовательского узла».
Имя: Percentage
Описание: расчет процентного соотношения между двумя значениями.
Категория: Math.Functions
Откроется рабочая область с желтым фоном, указывающим на то, что вы находитесь в среде пользовательского узла. В этом окне можно получить доступ ко всем стандартным узлам Dynamo, а также к узлам ввода и вывода, которые используются для обозначения данных, поступающих в пользовательский узел на входе и получаемых из него на выходе. Их можно найти в разделе «Input > Basic».
Inputs: узлы Input используются для настройки портов ввода пользовательского узла. Синтаксис узла ввода: имя_ввода : тип_данных = значение_по_умолчанию (необязательно).
Outputs: аналогично узлам ввода узлы вывода используются для настройки портов вывода пользовательского узла. К портам ввода и вывода можно добавлять пользовательские комментарии для указания типа входных и выходных данных. Подробную информацию см. в разделе Создание пользовательских узлов.
Этот пользовательский узел можно сохранить в файле DYF (вместо стандартного формата DYN), после чего он автоматически станет доступен в текущем и будущих сеансах. Пользовательский узел находится в разделе Add-ons библиотеки.
После создания первого пользовательского узла можно переходить к дальнейшим разделам, в которых подробнее рассматриваются функциональные возможности пользовательских узлов и процесс публикации типовых рабочих процессов. В следующем разделе представлен процесс разработки пользовательского узла, позволяющего переносить геометрию с одной поверхности на другую.
В Dynamo предусмотрено несколько способов создания пользовательских узлов. Их можно создавать с нуля на основе существующего графика или непосредственно на языке C#. В этом разделе рассматривается создание пользовательского узла в интерфейсе Dynamo на основе существующего графика. Этот метод идеально подходит для очистки рабочего пространства, а также для упаковки последовательности узлов с целью их повторного использования в другом месте.
На изображении ниже точка одной поверхности сопоставляется с другой точкой с помощью UV-координат. Этот принцип будет использоваться для создания панелей поверхности, ссылающихся на кривые в плоскости XY. В данном случае сформируем прямоугольные панели, но этим же способом можно создавать разнообразные панели с использованием UV-наложения. Это отличная возможность для разработки пользовательских узлов, так как данную процедуру можно повторять в этом же графике или в других рабочих процессах Dynamo.
Скачайте файл примера, щелкнув указанную ниже ссылку.
Полный список файлов примеров можно найти в приложении.
Начните с создания графика, который будет вложен в пользовательский узел. В этом примере с помощью UV-координат мы создадим график, который сопоставляет полигоны базовой поверхности с целевой поверхностью. Эта процедура UV-наложения используется часто, благодаря чему хорошо подходит для создания пользовательских узлов. Дополнительную информацию о поверхностях и UV-пространстве см. на странице Поверхность. Готовый график — _UVmapping\Custom-Node.dyn из скачанного ранее файла ZIP.
Code Block. Используйте эту строку для создания диапазона из 10 чисел от –45 до 45
45..45..#10;
.Point.ByCoordinates. Соедините выходные данные узла Code Block с входными данными x и y, выбрав в качестве переплетения перекрестную ссылку. При этом будет создана сетка точек.
Plane.ByOriginNormal. Соедините выходные данные Point с входными данными origin, чтобы создать плоскость в каждой из точек. Будет использован вектор нормали по умолчанию (0,0,1).
Rectangle.ByWidthLength. Соедините плоскости из предыдущего шага с выходными данными plane и с помощью узла Code Block со значением 10 задайте ширину и длину.
При этом появится сетка прямоугольников. Сопоставьте эти прямоугольники с целевой поверхностью, используя UV-координаты.
Polygon.Points. Соедините выходные данные Rectangle.ByWidthLength из предыдущего шага с входными данными polygon, чтобы извлечь угловые точки каждого прямоугольника. Именно эти точки будут сопоставляться с целевой поверхностью.
Rectangle.ByWidthLength. С помощью узла Code Block со значением 100 задайте ширину и длину прямоугольника. Это будет граница базовой поверхности.
Surface.ByPatch. Соедините Rectangle.ByWidthLength из предыдущего шага с входными данными closedCurve для создания базовой поверхности.
Surface.UVParameterAtPoint. Соедините выходные данные Point узла Polygon.Points с выходными данными Surface узла Surface.ByPatch для получения параметра UV в каждой точке.
Теперь, имея базовую поверхность и набор UV-координат, можно импортировать целевую поверхность и сопоставить точки между поверхностями.
File Path. Выберите путь к файлу поверхности, которую требуется импортировать. Файл должен иметь тип SAT. Нажмите кнопку Обзор... и перейдите к файлу UVmapping_srf.sat из скачанного ранее файла ZIP.
Geometry.ImportFromSAT. Для импорта поверхности присоедините путь к файлу. При этом в области предварительного просмотра геометрии должна появиться импортированная поверхность.
UV. Соедините выходные данные параметра UV с узлами UV.U и UV.V.
Surface.PointAtParameter. Присоедините импортированную поверхность, а также координаты u и v. Теперь на целевой поверхности должна появиться сетка 3D-точек.
Последний шаг — построение прямоугольных участков поверхности с помощью 3D-точек.
PolyCurve.ByPoints. Соедините точки на поверхности, чтобы построить сложную кривую через точки.
Boolean. Добавьте в рабочее пространство узел Boolean и соедините его с входными данными connectLastToFirst, задав значение True, чтобы замкнуть сложные кривые. При этом должны появиться прямоугольники, сопоставленные с поверхностью.
Surface.ByPatch. Соедините сложные кривые с входными данными closedCurve для создания участков поверхности.
Теперь выберите узлы, которые необходимо вложить в пользовательский узел, учитывая, какие входные и выходные данные должны быть у конечного узла. Пользовательский узел должен быть максимально гибким и пригодным для сопоставления любых полигонов, а не только прямоугольников.
Выберите следующие узлы (начиная с Polygon.Points), щелкните правой кнопкой мыши рабочее пространство и выберите «Создание пользовательского узла».
В диалоговом окне «Свойства пользовательского узла» присвойте пользовательскому узлу имя, введите описание и укажите категорию.
Имя: MapPolygonsToSurface
Описание: сопоставление полигонов из базы с целевой поверхностью
Категория в разделе «Надстройки»: Geometry.Curve
Пользовательский узел в значительной мере очистил рабочее пространство. Обратите внимание, что входным и выходным данным были присвоены имена, соответствующие исходным узлам. Отредактируйте пользовательский узел, чтобы сделать имена более описательными.
Дважды щелкните пользовательский узел, чтобы отредактировать его. Откроется рабочее пространство с желтым фоном, представляющее собой внутреннюю часть узла.
Inputs. Измените имена входных параметров, задав baseSurface и targetSurface.
Outputs. Добавьте дополнительный выходной параметр для сопоставленных многоугольников.
Сохраните пользовательский узел и вернитесь в исходное рабочее пространство. Внесенные изменения отражаются в узле MapPolygonsToSurface.
Для наглядности можно добавить к узлу Пользовательские комментарии. В комментариях можно указать сведения о типах входных и выходных данных или разъяснить функции узла. Комментарии отображаются при наведении курсора на входной или выходной параметр пользовательского узла.
Дважды щелкните пользовательский узел, чтобы отредактировать его. Снова откроется рабочее пространство с желтым фоном.
Начните редактировать блок Code Block Input. Чтобы создать комментарий, введите символы «//», а затем текст комментария. Добавьте любые пояснения к узлу. В данном случае будет дано описание входного параметра targetSurface.
Кроме того, задайте значение по умолчанию для входного параметра inputSurface, указав это значение в качестве типа входных данных. В данном случае в качестве значения по умолчанию будет задан исходный набор Surface.ByPatch.
Комментарии также можно применить к выходным параметрам.
Отредактируйте текст блока «Code Block» Output. Введите «//», а затем текст комментария. Добавьте пояснения к выходным параметрам Polygons и surfacePatches путем ввода для них подробного описания.
Наведите курсор на пользовательский узел Inputs, чтобы просмотреть комментарии.
Так как для входного параметра inputSurface задано значение по умолчанию, при запуске определения можно не вводить значение поверхности.