В предыдущем разделе был приведен пример использования сценариев Python в Dynamo. Теперь рассмотрим подключение библиотек Revit в среде сценариев. Как вы помните, мы импортировали стандартную библиотеку Python и базовые узлы Dynamo с помощью первых четырех строк в блоке кода, представленном ниже. Для импорта узлов Revit, элементов Revit и диспетчера документов Revit необходимо добавить еще несколько строк:
Это обеспечит доступ к API Revit и позволит создавать пользовательские сценарии для любых задач Revit. Благодаря объединению процесса визуального программирования с написанием сценариев в API Revit возможности совместной работы и разработки инструментов значительно увеличиваются. Например, специалист по BIM и проектировщик схем могут совместно работать над одним и тем же графиком. В результате эффективность проектирования и реализации модели повысится.
В основе проекта Dynamo лежит план по расширению масштабов внедрения платформ. По мере добавления в Dynamo поддержки новых программ пользователи получают доступ к API-интерфейсам для конкретных платформ из среды создания сценариев Python. Данный раздел посвящен работе с Revit, однако в будущем можно ожидать появления новых разделов, содержащих учебные пособия по созданию сценариев для других платформ. Кроме того, в данный момент доступно множество библиотек IronPython, которые можно импортировать в Dynamo.
В приведенных ниже примерах иллюстрируются способы выполнения операций Revit из модуля Dynamo с использованием языка программирования Python. Дополнительные сведения об особенностях использования Python в Dynamo и Revit см. на странице Wiki, посвященной Dynamo. Еще один полезный ресурс по Python и Revit — проект Revit Python Shell.
Создайте новый проект Revit.
Скачайте файл примера, щелкнув указанную ниже ссылку.
Полный список файлов примеров можно найти в приложении.
В этих упражнениях рассматриваются простейшие сценарии Python, которые можно использовать в модуле Dynamo для Revit. Данное упражнение посвящено работе с файлами и элементами Revit, а также взаимодействию между Revit и Dynamo.
Рассмотрим стандартный способ извлечения элементов doc, uiapp и app из файла Revit, связанного с сеансом Dynamo. Программистам, которые уже работали с API Revit, могут быть знакомы элементы в списке отслеживания. Однако даже если эти элементы встречаются в первый раз, в последующих упражнениях будут и другие примеры.
Ниже описывается процедура импорта служб Revit и извлечения данных документа в Dynamo.
Посмотрите, как выглядит узел Python в Dynamo. Код также можно найти ниже.
Скачайте файл примера, щелкнув указанную ниже ссылку.
Полный список файлов примеров можно найти в приложении.
В этом упражнении будет создана простая кривая модели в Revit с помощью узла Python в Dynamo.
Для начала добавьте в Revit новое семейство концептуальных формообразующих элементов.
Откройте папку Conceptual Mass и используйте файл шаблона Metric Mass.rft.
В Revit используйте комбинацию клавиш un
, чтобы вызвать окно параметров«Единицы проекта», и измените единицы измерения длины на метры.
Запустите Dynamo и сформируйте набор узлов, как показано на изображении ниже. Сначала создайте две опорные точки в Revit с помощью узлов Dynamo.
Создайте узел Code Block и присвойте ему значение
"0;"
.Соедините это значение с портами ввода X, Y и Z узла ReferencePoint.ByCoordinates.
Создайте три регулятора в диапазоне от –100 до 100 с шагом 1.
Соедините каждый из регуляторов с узлом ReferencePoint.ByCoordinates.
Добавьте в рабочее пространство узел Python, нажмите кнопку «+» в узле, чтобы добавить еще один порт ввода, и соедините опорные точки с портами ввода. Откройте узел Python.
Посмотрите, как выглядит узел Python в Dynamo. Полный код см. ниже.
System.Array. Приложению Revit в качестве входного параметра требуется системный массив (а не список Python). Для этого необходима лишь еще одна строка кода, но следует уделить особое внимание типам аргументов, чтобы упростить программирование на языке Python в Revit.
В Dynamo с помощью Python мы создали две опорные точки, соединенные линией. Продолжим работу с этим примером в следующем упражнении.
Скачайте файл примера, щелкнув указанную ниже ссылку.
Полный список файлов примеров можно найти в приложении.
Это упражнение довольно несложное, однако оно хорошо иллюстрирует процесс обмена данными и геометрией между Revit и Dynamo. Сначала откройте файл Revit-StructuralFraming.rvt. Затем запустите Dynamo и откройте файл Revit-StructuralFraming.dyn.
Этот файл Revit содержит лишь самые базовые данные. Имеются две опорные кривые: одна на уровне 1, другая — на уровне 2. Эти кривые необходимо добавить в Dynamo, сохранив динамическую связь.
В файле имеется набор узлов, соединяемых с пятью портами ввода узла Python.
Узлы Select Model Element. Нажмите кнопку выбора в каждом узле и выберите соответствующую кривую в Revit.
Code Block. Используя синтаксис
0..1..#x;
, соедините регулятор целых чисел от 0 до 20 с портом ввода x. Этот регулятор задает количество балок, которые будут построены между двумя кривыми.Structural Framing Types. В раскрывающемся меню выберите балку по умолчанию (W12x26).
Levels. Выберите Level 1.
Этот код Python чуть более сложен, но весь процесс снабжен подробными комментариями.
Итак, в Revit появился массив балок, расположенных между двумя кривыми и играющих роль несущих элементов. Примечание. Данный пример не вполне реалистичен. Несущие элементы используются всего лишь в качестве примера собственных экземпляров Revit, созданных в Dynamo.
Результаты также можно увидеть в Dynamo. Балки в узле Watch3D ссылаются на геометрию, запрошенную из элементов Revit.
Обратите внимание, что полученный процесс преобразования данных из среды Revit в среду Dynamo является непрерывным. Вкратце этот процесс происходит следующим образом:
Выбор элемента Revit.
Преобразование элемента Revit в кривую Dynamo.
Разделение кривой Dynamo на серию точек Dynamo.
Использование точек Dynamo между двумя кривыми для создания линий Dynamo.
Создание балок Revit на основе линий Dynamo.
Вывод поверхностей Dynamo путем запроса геометрии балок Revit.
Этот процесс может показаться довольно сложным, однако при использовании сценария достаточно отредактировать кривую в Revit и повторно запустить решатель (хотя при этом может потребоваться удалить ранее созданные балки). Это связано с тем, что при размещении балок в Python связи стандартных узлов по умолчанию разрываются.
Обновив опорные кривые в Revit, мы получим новый массив балок.
В Dynamo 2.0 появилась возможность задавать шаблон по умолчанию (.py extension)
для использования при первом открытии окна Python. Эта функция, о которой нас давно просили пользователи, значительно ускоряет процесс работы со сценариями Python в Dynamo. Благодаря возможности использовать шаблон программисты получают мгновенный доступ к данным, которые требуется импортировать по умолчанию и на основе которых они могут разрабатывать пользовательские сценарии Python.
Этот шаблон размещается в подпапке APPDATA
папки установки Dynamo.
Обычно используется следующий путь: ( %appdata%\Dynamo\Dynamo Core\{version}\ )
.
Для использования этой функции необходимо добавить в файл DynamoSettings.xml
следующую строку (правки вносятся в Блокноте).
Найдите строку <PythonTemplateFilePath />
и замените ее следующим кодом:
Примечание. Замените CURRENTUSER на имя пользователя.
Теперь нужно создать шаблон, включающий функции для встраивания. В данном случае требуется встроить функции импорта определенных данных из Revit, а также некоторые другие функции, обычно используемые при работе с Revit.
Создайте документ в Блокноте и вставьте в него следующий код:
Когда все будет готово, сохраните этот файл под именем PythonTemplate.py
в папке APPDATA
.
После того как шаблон Python задан в приложении Dynamo, каждый раз при размещении узла Python будет выполняться поиск этого шаблона. Если шаблон не найден, отображается стандартное окно Python.
Если шаблон Python найден (как в случае с созданным шаблоном для работы с Revit), отображаются встроенные в него функции по умолчанию.
Подробные сведения об этом дополнении см. в следующем материале (автор: Раду Гидей [Radu Gidei]): https://github.com/DynamoDS/Dynamo/pull/8122
Зачем использовать текстовое программирование в среде визуального программирования Dynamo? У визуального программирования много преимуществ. Оно позволяет создавать программы в интуитивно-понятном визуальном интерфейсе, не обладая навыками работы со специальным синтаксисом. Однако визуальная программа может оказаться перегруженной, а порой и недостаточно функциональной. Для сравнения, в Python реализованы гораздо более доступные способы записи условных выражений (если/то) и создания циклов. Python — это мощный инструмент, который позволяет расширить возможности Dynamo и заменить большое количество узлов компактными строками кода.
Визуальная программа
Текстовая программа
Подобно блокам кода узлы Python представляют собой интерфейс сценариев в среде визуального программирования. Узел Python находится в библиотеке в разделе Script > Editor > Python Script.
Двойной щелчок на узле приводит к открытию редактора сценариев Python (можно также щелкнуть узел правой кнопкой мыши и выбрать команду Редактировать...). Сверху находится подсказка, которая поможет обратиться к нужным библиотекам. Входные данные хранятся в массиве IN. Значения возвращаются в Dynamo путем назначения им переменной OUT.
Библиотека Autodesk.DesignScript.Geometry позволяет использовать точечные обозначения, аналогичные блокам кода (узлам Code Block). Дополнительные сведения о синтаксисе Dynamo см. в файле https://github.com/DynamoDS/DynamoPrimerNew/blob/master-rus/coding-in-dynamo/7_code-blocks-and-design-script/7-2_design-script-syntax.md, а также в Руководстве по DesignScript (чтобы скачать этот файл PDF, щелкните правой кнопкой мыши ссылку и выберите «Сохранить как»). При вводе определенного типа геометрии (например Point), отображается список методов, доступных для создания и запроса точек.
Методы включают в себя конструкторы (например, ByCoordinates), действия (например, Add) и запросы (например, координаты X, Y и Z).
Скачайте файл примера, щелкнув указанную ниже ссылку.
Полный список файлов примеров можно найти в приложении.
В этом примере мы напишем сценарий Python для создания образцов на основе твердотельного модуля и преобразуем этот сценарий в пользовательский узел. Сначала создадим твердотельный модуль с помощью узлов Dynamo.
Rectangle.ByWidthLength. Создайте прямоугольник, который будет служить основой твердого тела.
Surface.ByPatch. Соедините прямоугольник с входным параметром closedCurve для создания нижней поверхности.
Geometry.Translate. Соедините прямоугольник с входным параметром geometry для его перемещения вверх, используя блок кода для указания толщины основания тела.
Polygon.Points. Запросите извлечение угловых точек из преобразованного прямоугольника.
Geometry.Translate. Используйте блок кода для создания списка из четырех значений, соответствующих четырем точкам, перемещающим один угол тела вверх.
Polygon.ByPoints. С помощью преобразованных точек воссоздайте верхний полигон.
Surface.ByPatch. Присоедините полигон для создания верхней поверхности.
Теперь, имея в распоряжении верхнюю и нижнюю поверхности, выполним лофтинг между двумя профилями, чтобы создать стороны тела.
List.Create. Соедините нижний прямоугольник и верхний полигон с входными параметрами индекса.
Surface.ByLoft. Выполните лофтинг двух профилей для создания сторон тела.
List.Create. Соедините верхнюю, боковую и нижнюю поверхности с входными параметрами индекса для создания списка поверхностей.
Solid.ByJoinedSurfaces. Соедините поверхности для создания твердотельного модуля.
Теперь, получив твердое тело, перетащите в рабочее пространство узел сценария Python.
Чтобы добавить дополнительные входные параметры к узлу, закройте редактор и щелкните значок «+» на узле. Входным параметрам присваиваются имена IN[0], IN[1] и т. д. Это говорит о том, что они представляют элементы в списке.
Начнем с определения входных и выходных параметров. Дважды щелкните узел, чтобы открыть редактор Python. Используйте приведенный ниже код, чтобы изменить код в редакторе.
Смысл этого кода будет понятен позже по мере выполнения упражнения. Далее необходимо подумать о том, какая информация необходима для создания массива на основе имеющегося твердотельного модуля. Во-первых, необходимо знать размеры тела, чтобы определить расстояние переноса. Из-за ошибки, связанной с ограничивающей рамкой, для ее создания необходимо использовать геометрию кривой кромки.
Посмотрите, как выглядит узел Python в Dynamo. Обратите внимание, что используется тот же синтаксис, что и в заголовках узлов Dynamo. Ознакомьтесь с кодом, приведенным ниже.
Поскольку твердотельные модули будут не только преобразовываться, но и поворачиваться, воспользуемся операцией Geometry.Transform. Если посмотреть на узел Geometry.Transform, становится понятно, что для преобразования тела потребуется исходная система координат и целевая система координат. В качестве первой выступает контекстная система координат тела, а в качестве второй — система координат, которая различна для каждого модуля массива. Таким образом, чтобы система координат каждый раз преобразовывалась по-разному, необходимо перебирать значения координат по осям X и Y.
Нажмите кнопку «Выполнить», а затем сохраните код. Соедините узел Python с существующим сценарием следующим образом.
Соедините выходные данные узла Python с узлом Solid.ByJoinedSurfaces в качестве первого порта ввода и используйте узел Code Block для определения других входных данных.
Создайте узел Topology.Edges и используйте в качестве входных данных выходные данные узла Python.
Наконец, создайте узел Edge.CurveGeometry и в качестве входных данных используйте выходные данные Topology.Edges.
Попробуйте изменить начальное значение для создания различных образцов. Кроме того, можно изменять параметры самого твердотельного модуля для получения различных эффектов.
Создав нужный сценарий Python, сохраним его как пользовательский узел. Выберите узел сценария Python, щелкните правой кнопкой мыши рабочее пространство и выберите «Создание пользовательского узла».
Присвойте имя, добавьте описание и категорию.
При этом откроется новое рабочее пространство для редактирования пользовательского узла.
Inputs. Измените имена входных параметров, сделав их более описательными, и добавьте типы данных и значения по умолчанию.
Output: измените имя узла Output.
Сохраните узел в виде файла DYF. В пользовательском узле отобразятся внесенные изменения.
Python — это широко распространенный язык программирования, получивший большую популярность благодаря стилю используемого синтаксиса. Этот язык значительно доступнее и проще, чем многие другие языки программирования. Python поддерживает модули и пакеты, а также может быть внедрен в существующие приложения. Тем, кто только начинает работу с Python, мы рекомендуем посетить страницу Getting Started на веб-сайте Python.org.