Максим Степанников, Мария Девятова, Евгения Энгель
Перевод статьи Racel Williams "To Dynamo 2.0 and Beyond"
Сегодня — особенный день! По прошествии многих дней, наконец появилась долгожданная версия Dynamo 2.0.
Dynamo 2.0 — особенный и значимый релиз для нашей команды, поскольку это одно из крупных обновлений программы. Но, что самое важное, данный релиз вобрал в себя те изменения и новый функционал, который в будущем сделает возможным процессы передачи данных из десктопной версии программы в web.
Итак, что же такого «крупного» в этом релизе?
В предыдущих публикациях мы уже писали о том, что в Dynamo версии 2.0 произойдет масштабное обновление программы. И это означает следующее:
- Файлы формата DYN и DYF теперь сохраняются в формате, который больше не совместим с предыдущими версиями Dynamo. Скрипты и пользовательские узлы Dynamo 2.0 не могут быть открыты в версиях 1.x.
- Dynamo 2.0 можно устанавливать параллельно с текущей версией 1.x, что позволит вам переключаться между версиями, с которыми вы хотите работать в текущем проекте. В Dynamo для Revit при первом запуске Dynamo вам необходимо будет выбрать версию программы во всплывающем окне. Данный выбор будет сохраняться только в текущей сессии работы Revit. И после его повторного запуска может быть изменен на другую версию.
- Начиная с Dynamo 1.0, мы следовали правилам семантического управления версиями программы, что означает, что в этот релиз были внесены критические изменения в API программы, а это может повлиять на корректную работу текущих пакетов и скриптов, совместимых с версиями 1.x. Более подробную информацию о версиях — см. версии Dynamo.
Будет ли Dynamo 2.0 наконец устанавливаться вместе с Revit?
Нет, не будет. Оно будет доступно для скачивания отдельно на dynamobuilds.com и будет совместимо с 2017, 2018, и 2019-ми версиями Revit.
Будет ли мой пакет нодов версии 1.x работать с версией 2.0?
При том, что большинство пакетов версии 1.x будут прекрасно работать и на версии 2.0, вполне возможно, что из-за критических изменений в API программы в работе некоторых из них могут возникнуть сложности. Мы советуем заново протестировать ваши алгоритмы и пакеты, чтобы убедиться в их совместимости с новой версией программы. Как мы уже говорили ранее, разработчикам следует взять за правило публиковать версию своего пакета в сопоставлении с версией сборки Dynamo, для которой он был выпущен (в качестве примера можно взять пакет нодов «Mesh Toolkit», в котором очень ясно прослеживается история версий пакета в сопоставлении с версиями сборок Dynamo). Несколько замечаний для разработчиков пакетов нодов:
- В целом, данный релиз Dynamo не повлиял на работу нодов типа «zero-touch». Но если внутри ваших узлов данного типа есть ссылки на библиотеки Dynamo Core (которые изменились), то вам возможно потребуется обновить ссылки и перекомпилировать файлы.
- Из-за измененного синтаксиса словарей и списков могут возникнуть проблемы с входными слотами узлов ZeroTouch, в особенности, со значениями по умолчанию. При открытии скриптов версии 1.x их синтаксис будет, в большинстве случаев, обновляться до нового, но синтаксис значений по умолчанию в нодах Zero Touch обновляться не будет.
- Пользовательские узлы версий 1.x, созданные в XML-формате, по всей видимости, продолжат работать и в версии 2.0. Тем не менее, советуем протестировать данные узлы на предмет потери функциональности и переводить их по возможности в JSON для дальнейшей совместимости с будущими версиями Dynamo.
Подробнее см. список изменений в API Dynamo 2.0.
Возможны ли на сегодняшний день процессы передачи данных из настольной версии Dynamo в web?
На данный момент — еще нет, но мы активно над этим работаем. За кулисами нашей команды уже давно ведется серьезная разработка технологий, поддерживающих распределенные облачные вычисления и взаимосвязанные процессы обмена данными между различными приложениями. Все эти разрабатываемые технологии могут кардинально изменить уровень производительности и эффективности скриптов, которые вы создаете, предоставят вам бо́льшую гибкость в совместной работе и управлении вашими скриптами внутри команды через режим совместной работы в реальном времени. Также они предоставят возможность иметь онлайн-хранилище разнообразных услуг, скриптов и прочих рабочих процессов. И, хотя мы еще не представляли данные разработки широкой публике, узлы Dynamo 2.0 уже сейчас содержат несколько функций, которые в будущем позволят вам с легкостью переключаться между настольной и интернет-средой разработки Dynamo и ее новыми онлайн-сервисами. Для достижения будущей совместимости с интернет-сервисами, в текущей версии Dynamo 2.0 уже внесены следующие изменения:
- ФОРМАТ ФАЙЛОВ: Dynamo 2.0 сменила формат файлов с XML на JSON для облегчения разработки скриптов в более близких для web и не связанных с Windows средах. Одна из характерных особенностей подобного изменения заключается в том, что описание пользовательского интерфейса нода (где находится узел, как он выглядит) было отделено от описания его функциональной логики (что делает скрипт). В будущем это позволит создавать более чистые решения по использованию скриптов Dynamo вне его нодовой среды, например, при пакетном запуске скриптов или же в интерфейсах наподобие Dynamo Pleer.
- БИБЛИОТЕКА НОДОВ: Библиотека нодов теперь представляет из себя веб-компонент, который можно будет использовать как в среде настольного приложения, так и веб-среде.
- ИЗМЕНЕНИЯ В ЯЗЫКЕ DESIGNSСRIPT: Было внесено несколько изменений, целью которых являлось упрощение языка для его более легкого обслуживания и повышения удобочитаемости как на локальном компьютере, так и в распределенной облачной вычислительной системе. Список изменений смотрите на странице вики.
Что нового в Dynamo 2.0?
Формат файлов
Как отмечалось ранее, формат файлов скриптов Dynamo сменился с XML на JSON. Это было сделано для того, чтобы основной формат файлов соответствовал новой системе взаимодействия в наших облачных сервисах. Файлы, созданные в версиях 1.х, будут при открытии обновлены до версии 2.0, за исключением некоторых нодов, не поддающихся обновлению. Чтобы не допустить потери необходимой информации, копия файла, созданного в версии 1.х, будет сохранена в папку для хранения бэкапов под именем [оригинальное имя]_xml.dyn.
Библиотека нодов
Возможно, вы заметили, что библиотека выглядит иначе, чем в предыдущих версиях программы. Помимо того, что она стала веб-совместимой, произошло еще несколько значительных обновлений пользовательского интерфейса. Изменился порядок того, как организованы узлы. Это, в свою очередь, облегчает поиск узлов как новым, так и опытным пользователями программы. Произошли следующие изменения:
- Все нестандартные узлы (пользовательские узлы, пакеты, библиотеки DLL) отображаются в отдельном разделе под строкой с именем Add-ons.
- Теперь можно менять размер боковой панели, а также полностью сворачивать ее, цепляя за край панели и уводя его справа налево.
- Произошла значительная реорганизация структуры хранения нодов в библиотеке. Мы удалили сбивающие с толку категории, такие как «Core» и «BuiltIn», и организовали подкатегории и классы, чтобы отобразить взаимосвязи между узлами или облегчить восприятие того, как группируются узлы на панели.
Автоматическое переплетение списков
Dynamo 2.0 вводит «Автоматический» вариант работы переплетения списков. Режим работы «кратчайший» теперь более строго подходит к переплетению, в котором участвует одиночный элемент в сопоставлении со списком элементов. Это позволяет более точно управлять структурой данных и более ясно указывать переплетение списка при помощи символов репликации на языке DesignScript. Новый режим автоматического переплетения будет, в свою очередь, вести себя примерно так, как в предыдущих версиях Dynamo вел себя режим «кратчайший». Во всех скриптах, написанных в версиях 1.х, при обновлении до версии на 2.0 будет изменен тип переплетения с «кратчайшего» на «автоматический». На картинке ниже показана разница в работе двух данных режимов переплетения списков.
Обновленный код Python
Как многие знают, ноды на языке Python могут играть значительную роль в работе скрипта Dynamo, позволяя легко и быстро расширять его функционал. В Dynamo 2.0 добавлены новые методы взаимодействия, которые позволят облегчить вашу работу с Python:
- Теперь вы можете открыть несколько окон редактирования кода Python, чтобы упростить одновременную работу с несколькими нодами на этом языке.
- В окно редактирования кода Python добавлена кнопка «Выполнить» для того, чтобы вы смогли перезапустить код Python и все ноды, которые идут перед ним, без повторного открытия окна Python.
- Название окна редактирования кода Python теперь совпадает с названием самого нода.
- Теперь поддерживаются шаблоны скриптов на Python, которые могут использоваться любыми нодами Python, добавленными в рабочую область. Dynamo ищет в пользовательском расположении %appdata%/Dynamo/Core/{version}/ файл под названием «PythonTemplate.py», чтобы найти в нем пригодный к применению шаблон.
Изменения в языке DesignScript
В языке произошли следующие изменения, которые позволили сделать DesignScript более понятным, предсказуемым и легким при поддержке:
- Унифицирован синтаксис задания уровня работы списка List@Level для того, чтобы он стал более похож на интерфейс нодов, их панелей Preview и нодов Watch. Например, @-2 теперь необходимо писать как @L2.
- Чтобы свести к минимуму возможность неоднозначной трактовки того, какую функцию необходимо вызвать программе, вам следует быть более точным с тем, какой тип данных вы подаете в узел. Раньше функции, которые использовали одинаковые методы, например такие как Geometry.Translate и FamilyInstance.Translate, смотрели на первый элемент в подаваемом списке и пытались подобрать корректный метод исполнения. После этого они повторяли этот метод для всех элементов списка. Это приводило к проблемам при подаче списков с неоднородными данными. Например, до этих изменений, FamilyInstance.Translate брал любую геометрию и транслировал ее. Теперь же вам придется более пристально следить за типом данных, которые вы подаете в этот нод.
- Ноды, которые раньше совпадали по имени с каким-то еще методом и отличались лишь уровнями работы со списками, были вычищены. Например, если было два узла с именем «foo», и один из них принимал на вход список, а другой — один элемент, тот, который принимал всего лишь один элемент мы убирали как устаревший. Мы это делали для того, чтобы очистить библиотеку от повторяющихся нодов и упростить поддержку библиотеки в будущем.
- При написании функций и императивных блоков больше нет необходимости писать знак «=» в переменной возврата данных. Это сделано с целью упростить процесс написания скриптов на языке DesignScript и упрощения работы с его синтаксисом. Например, вы теперь элементарно можете написать return x; вместо return=х.
- Переменные внутри Code Block стали неизменяемыми. Если вы, к примеру, используете переменную «х» в Code Block, вы не можете переопределить ее заново в другой части этого же Code Block.
- Переменные, определенные внутри императивного блока, ограничены рамками действия этого блока. Взаимодействие переменных, заданных внутри и вне императивных блоков больше не допускается, поскольку в прошлом это приводило к непредсказуемому поведению и нестабильности в работе нода.
- Одиночные элементы больше не превращаются автоматически в отдельный список. Это сделано для того, чтобы избавиться от генерации избыточных и ненужных структур списка. Например, если вы используете список из числовых значений в переплетении с одним числовым значением, выбрав опцию «векторное произведение», теперь на выходе вы получите плоский список значений вместо дополнительных вложенных структур списка.
Словари
Dynamo 2.0 вводит новую концепцию структур данных, разделяя понятия «словарь» и «список» в две отдельные структуры. Это изменение может существенно повлиять на то, по какому алгоритму вы генерируете и работаете с данными в своих скриптах. До выхода версии 2.0 словари и списки были единым типом данных. По сути, списки были словарями с ключами в виде целых чисел.
- Что из себя представляет словарь? Словарь — это структура данных, состоящая из из парных данных типа «ключ-значение», где ключ — всегда уникальный, неповторяющийся элемент в рамках одной коллекции. Элементы в словаре не расположены в строгом порядке, как в списках, и любой элемент вы можете найти напрямую по его ключу вместо того, чтобы указывать его индекс. В Dynamo 2.0 ключи могут быть представлены только типом данных «строка».
- Что такое список? Список — структура данных, состоящая из упорядоченных значений. В Dynamo списки используют целые числа в качестве значений индексов элементов в списке.
- Зачем нужны эти изменения и какое мне до них дело? Отделением словарей от списков мы хотели обратить ваше особенное внимание на данную структуру данных как на первоочередную, поскольку с ее помощью вы можете легко и быстро накапливать и извлекать значения без нужды того, чтобы помнить значение индексов элементов и без нужды постоянного соблюдения строгой структуры списков в своих скриптах. Тестирования показали, что использование словарей позволяет значительно уменьшить объем и сложность скриптов в сравнении с теми, что были написаны без их использования с применением обычных методов List.GetItemAtIndex.
- Что же изменилось? Изменился синтаксис написания словарей и списков внутри Code Block. Словари теперь используют синтаксис {ключ:значение}. Списки используют синтаксис [элемент1, элемент2, элемент3]. В библиотеке нодов появились новые узлы по работе со словарями (создание, изменение, получение значений). При обновлении скриптов с версии 1.х до версии 2.0 все фигурные скобки, использовавшиеся в прошлом для обозначения списков, автоматически заменятся на квадратные скобки.
Ждите обновления справочной документации, посвященной словарям, которая скоро должна появиться на нашем сайте!
Новые ноды и их обновленные версии
Благодаря многим участникам нашего сообщества мы добавили несколько новых нодов и обновили функционал некоторых старых, например:
- Color Picker (спасибо Adam Sheather за его разработку).
- File.AppendText (спасибо Radu Gidei за его разработку).
- GetDirectoryContents с рекурсивным доступом к подпапкам (спасибо Radu Gidei за его разработку).
- Обновленный узел ImportExcel, позволяющий регулировать всплытие окна Excel (спасибо Dimitar Venkov за улучшение).
- Оператор математического остатка (%) теперь ведет себя так, как привычно пользователям Python, Excel и Google calculator, следуя знаку делителя при выполнении операции.
Возвращение версии Sandbox
Для тех, кто скучал по Dynamo Sandbox: после установки вы сможете найти его в расположении Program Files\Dynamo\Dynamo Core\2.
Что мы убрали из Dynamo 2.0?
К сожалению, каждый релиз не обходится без списка функций, от которых пришлось отказаться ради ясности, удобства и простоты использования программы. С прискорбием сообщаем, что данных функций, когда-то очень крутых, больше с нами нет. Мы будем по ним очень скучать и объявляем минуту молчания в их память:
Предварительные настройки узлов (не беспокойтесь, мы уже ищем более оптимальное решение для решения данного вопроса).
Просмотр предшествующих элементов (честно, мы даже и не знаем, что делала данная опция... шутка).
Сохранения опции прикрепления в элементе предварительного просмотра нода. В скриптах версии 2.0 нельзя сохранить эту настройку, скрипт каждый раз будет открываться с открепленными элементами предварительного просмотра.
Из корневой библиотеки Dynamo исключены следующие элементы: NewtonRootFind1DNoDeriv, NewtonRootFind1DWithDeriv.
Исключена опция Drag and Drop, позволявшая раньше перетащить нод с боковой панели на холст (теперь только кликом).
Избавились от дублирующих узлов (например, теперь всего один нод List.Flatten и List.Count).
Пользовательские узлы теперь не могут располагаться в одном месте со стандартными нодами и их категориями.
Геометрия линий модели, линий детализации, марок и текста больше не прорисовывается автоматически в окне предварительного просмотра Dynamo при их выборе. Это изменение было сделано для того, чтобы сделать поведение этих элементов более похожим на другие элементы и предотвратить вылет программы. Пользователи по-прежнему могут получить геометрию данных элементов через узлы Element.Geometry и Element.Curve. При этом марки и текст не будут иметь никакой геометрии, поскольку это аннотативные объекты.
Итак, вы готовы?
Я даже немного устала... Вот что в целом представляет из себя Dynamo 2.0. Естественно, кое что я пропустила. Для получения дополнительной информации о некоторых изменениях, исправлениях, известных ошибках и багах, с которыми вы можете столкнуться при использовании Dynamo 2.0, вы можете ознакомиться в примечаниях к релизу.
Кроме того, обратите внимание на дополнительную документацию по новым функциям и разработке в среде Dynamo 2.0, которая вскоре должна появиться.
Еще раз спасибо всем, кто внес свой вклад в релиз и всему сообществу Dynamo за то, что продолжаете поддерживать нашу работу. Надеемся, вам удастся опробовать Dynamo 2.0. И, как обычно, дайте нам знать, если у вас появятся какие-либо вопросы и предложения!