Dynamo for Civil 3D содержит эффективный механизм «запоминания» объектов, создаваемых каждым узлом. Этот механизм называется привязкой объекта, и он позволяет получать последовательные результаты при каждом запуске графика Dynamo в определенном документе. Во многих случаях подобное поведение программы является желательным, однако в определенных ситуациях пользователям требуется возможность управлять аспектами работы Dynamo более детально. В этом разделе описывается, как работает функция привязки объектов и как ее можно использовать.
Рассмотрим данный график, который позволяет создать окружность в пространстве модели на текущем слое.
Посмотрим, что произойдет при изменении радиуса.
Это функция привязки объекта в действии. По умолчанию программа Dynamo изменяет радиус существующей окружности, а не создает новую окружность при каждом новом входном значении радиуса. Это происходит потому, что при каждом запуске графика узел Object.ByGeometry «вспоминает», что он создал эту конкретную окружность. Кроме того, эта информация сохраняется в Dynamo, чтобы в следующий раз при открытии документа Civil 3D и запуске графика поведение программы было аналогичным.
Рассмотрим пример, в котором требуется изменить стандартное поведение функции привязки объекта в Dynamo. Предположим, требуется создать график, позволяющий разместить текст внутри окружности. При этом предполагается, что график будет запускаться многократно, и при каждом его запуске новый текст должен вставляться в конкретную выбранную окружность. Вот как может выглядеть этот график.
Однако вот что происходит при выборе разных окружностей.
Может показаться, что при каждом запуске графика текст удаляется и создается заново. На самом деле программа изменяет положение текста в зависимости от того, какая окружность выбрана. Это тот же самый текст, который просто помещен в другое место. Чтобы текст создавался заново каждый раз при запуске графика, необходимо изменить параметры привязки объекта Dynamo так, чтобы данные привязки не сохранялись в программе (см. раздел #binding-settings ниже).
Изменив данный параметр, мы получаем нужное поведение.
Dynamo for Civil 3D позволяет изменить поведение привязки объектов по умолчанию с помощью параметров Binding Data Storage (Хранение данных привязки) в меню Dynamo.
Обратите внимание, что параметры хранения данных привязки доступны в Civil 3D 2022.1 и более поздних версиях.
По умолчанию все параметры включены. Ниже приведен обзор каждого параметра.
Если этот параметр включен, Dynamo будет «забывать» объекты, созданные при последнем запуске того или иного графика. Этот график можно запускать в любом чертеже и в любых условиях, и каждый раз при его запуске будут создаваться новые объекты.
Рекомендации по использованию
Используйте этот параметр, если требуется, чтобы программа Dynamo «забывала» сделанное при предшествующих запусках графика и каждый раз создавала новые объекты.
Если этот параметр выбран, метаданные привязки объекта будут проиндексированы в графике (файл DYN) при его сохранении. Если закрыть и заново открыть график, а затем запустить его в том же чертеже, он должен работать точно таким же образом, что и до закрытия. При запуске этого же графика в другом чертеже данные привязки будут из него удалены, и в чертеже будут созданы новые объекты. Это означает, что при открытии исходного чертежа и повторном запуске в нем графика в дополнение к старым объектам будут созданы новые.
Рекомендации по использованию
Используйте этот параметр, если требуется, чтобы программа Dynamo «запоминала» объекты, созданные при последнем запуске графика в конкретном чертеже.
Этот параметр оптимален для ситуаций, когда определенный график Dynamo используется только в конкретном чертеже и больше нигде. Параметры 1 и 3 больше подходят для графиков, предназначенных для использования в нескольких чертежах.
Этот параметр похож на параметр 2, однако при его выборе данные привязки объекта индексируются не в графике (файл DYN), а в чертеже. Если закрыть и заново открыть график, а затем запустить его в том же чертеже, он должен работать точно таким же образом, что и до закрытия. Если запустить этот график в другом чертеже, данные привязки будут по-прежнему доступны в исходном чертеже, поскольку они сохраняются в нем, а не в графике.
Рекомендации по использованию
Используйте этот параметр, если требуется, чтобы программа Dynamo «запоминала» все полученные результаты при запуске определенного графика в нескольких чертежах.
Первое, что следует учесть при выборе этого параметра, — это то, он не влияет на взаимодействие графика с чертежом при запуске графика через основной интерфейс Dynamo. Этот параметр применяется только при запуске графика с помощью проигрывателя Dynamo.
Если вы еще не знакомы с проигрывателем Dynamo, см. раздел Проигрыватель Dynamo.
Если запустить график в основном интерфейсе Dynamo, а затем закрыть и запустить его снова, но уже в проигрывателе Dynamo, то в дополнение к созданным изначально объектам будут созданы новые. Однако после того, как график будет выполнен в проигрывателе Dynamo, данные привязки объектов будут индексированы в чертеже. Таким образом, если запустить один и тот же график несколько раз в проигрывателе Dynamo, то вместо создания новых объектов будут обновляться уже существующие. Если запустить этот же график через проигрыватель Dynamo в другом чертеже, данные привязки будут по-прежнему доступны в исходном чертеже, поскольку они сохраняются в нем, а не в графике.
Рекомендации по использованию
Используйте этот параметр, если требуется, чтобы проигрыватель Dynamo «запоминал» все полученные результаты при запуске определенного графика в нескольких чертежах.
Возможно, со временем, когда базовых возможностей Dynamo станет недостаточно, вы захотите погрузиться в изучение внутреннего устройства этой программы. Информация в этом разделе поможет вам научиться работать с расширенными возможностями Dynamo for Civil 3D, которые позволят вам создавать графики наивысшего уровня.
Dynamo — это чрезвычайно мощный инструмент визуального программирования, однако его можно использовать не только для работы с узлами и проводами, но и для написания кода в текстовом формате. Сделать это можно двумя способами.
Написать код DesignScript с помощью Code Block.
Написать код Python с помощью узла Python.
В этом разделе рассматривается использование Python в среде Civil 3D для работы с .NET API программ AutoCAD и Civil 3D.
Общие сведения об использовании Python в Dynamo см. в разделе Python.
В AutoCAD и Civil 3D есть несколько API-интерфейсов, которые позволяют разработчикам расширять базовые возможности этих программ за счет пользовательских функций. В отношении Dynamo для этого применяются управляемые .NET API. По ссылкам ниже можно ознакомиться со сведениями, необходимыми для понимания структуры API-интерфейсов и принципа их работы.
Руководство разработчика .NET API AutoCAD (англ.)
Справочное руководство по .NET API AutoCAD (англ.)
Руководство разработчика .NET API Civil 3D (англ.)
Справочное руководство по .NET API Civil 3D (англ.)
В этом разделе могут встречаться незнакомые вам понятия, такие как базы данных, транзакции, методы, свойства и т. д. Многие из этих понятий необходимо знать для работы с .NET API, и они не относятся исключительно к Dynamo или Python. Мы не будем подробно рассматривать эти понятия в данном руководстве и потому рекомендуем обратиться к приведенным выше ссылкам для получения дополнительной информации.
Когда вы впервые откроете новый узел Python для его редактирования, он будет по умолчанию заполнен шаблонным кодом. Ниже приводится описание данного шаблона с пояснениями по каждому блоку.
Импорт модулей
sys
иclr
, необходимых для правильной работы интерпретатора Python. В частности, модульclr
позволяет обрабатывать пространства имен .NET как пакеты Python.Загрузка стандартных сборок (например, файлов DLL) для работы с управляемыми .NET API для AutoCAD и Civil 3D.
Добавление ссылок на стандартные пространства имен AutoCAD и Civil 3D. Эквивалентно директивам
using
иImports
в C# и VB.NET, соответственно.Доступ к входным портам узла осуществляется с помощью предварительно определенного списка
IN
. Для доступа к данным в определенном порте можно использовать его порядковый номер, например:dataInFirstPort = IN[0]
.Получение активных документа и редактора.
Блокировка документа и запуск транзакции базы данных.
Здесь размещается основная часть логики сценария.
Раскомментируйте эту строку, чтобы зафиксировать транзакцию после выполнения основного объема работы.
Если требуется вывести какие-либо данные из узла, назначьте их переменной
OUT
в конце сценария.
Хотите адаптировать шаблон?
Шаблон Python по умолчанию можно изменить, отредактировав файл PythonTemplate.py
, расположенный в папке C:\ProgramData\Autodesk\C3D <version>\Dynamo
.
Чтобы ознакомиться с некоторыми из основных понятий, относящихся к написанию сценариев Python в Dynamo for Civil 3D, рассмотрим пример.
Ниже приведены файлы примеров, которые можно использовать в этом упражнении.
Ниже представлен обзор логики, используемой в этом графике.
Изучить документацию по API Civil 3D.
Выбрать все водосборы в документе по имени слоя.
«Развернуть» объекты Dynamo для доступа ко внутренним элементам API Civil 3D.
Создать точки Dynamo на основе точек AutoCAD.
Создать сложные кривые по точкам.
Приступим!
Прежде чем приступить к созданию графика и написанию кода, ознакомьтесь с документацией по API Civil 3D, чтобы получить представление о доступных возможностях. В данном случае нас интересует свойство в классе Catchment, которое возвращает точки контура водосбора. Обратите внимание, что это свойство возвращает объект Point3dCollection
, но программа Dynamo не умеет обрабатывать такие объекты. Другими словами, мы не сможем создать сложную кривую на основе Point3dCollection
, поэтому нам придется преобразовать все полученные данные в точки Dynamo. Позже мы рассмотрим этот процесс подробнее.
Теперь можно приступить к выстраиванию логики графика. Сначала необходимо получить список всех водосборов в документе. Для решения этой задачи можно использовать узлы, поэтому мы не будем включать ее в сценарий Python. Использование узлов упрощает визуальное восприятие графика (не нужно пробираться через большой объем кода Python), а также позволяет посвятить сценарий Python выполнению одной задачи: получение точек контура водосборов.
Обратите внимание, что выходные данные узла All Objects on Layer представляют собой список элементов CivilObjects. Это связано с тем, что в Dynamo for Civil 3D в данный момент нет узлов для работы с водосборами, и именно поэтому нам требуется получить доступ к API через Python.
Прежде чем продолжить, кратко рассмотрим одну важную концепцию. В разделе Библиотека узлов была рассмотрена взаимосвязь элементов Object и CivilObject. Если рассмотреть эту взаимосвязь чуть глубже, можно увидеть, что каждый элемент Object Dynamo представляет собой оболочку для элемента Entity AutoCAD. Аналогичным образом, элемент CivilObject Dynamo представляет собой оболочку для элемента Entity Civil 3D. Эту оболочку можно снять, «развернув» элемент Object путем доступа к его свойствам InternalDBObject
или InternalObjectId
.
На практике в большинстве случаев надежнее сначала получить идентификатор объекта с помощью свойства InternalObjectId
, а затем получить доступ к объекту-оболочке в транзакции. Причина в том, что свойство InternalDBObject
возвращает элемент DBObject AutoCAD, недоступный для записи.
Вот полный сценарий Python, который обращается к внутренним объектам водосбора и получает их точки контура. В сценарии выделены строки, содержащие измененный шаблонный код или новый пользовательский код.
Для просмотра пояснений щелкните подчеркнутые строки сценария.
На практике основной объем логики сценария рекомендуется размещать внутри транзакции. Это обеспечивает безопасный доступ к объектам, которые сценарий считывает или записывает. Если пропустить транзакцию, во многих случаях это может привести к неустранимой ошибке.
На этом этапе сценарий Python должен вывести список точек Dynamo, который можно увидеть в фоновом просмотре. Нам осталось просто создать сложных кривые на основе этих точек. Обратите внимание, что сделать это можно напрямую в сценарии Python, однако мы намеренно размещаем эту операцию за пределами сценария, в узле, чтобы сделать ее более заметной. Вот как выглядит итоговый график.
А вот итоговая геометрия Dynamo.
Небольшой комментарий перед завершением данного раздела. Настройка узла Python может выполняться по-разному в зависимости от используемой версии Civil 3D. В Civil 3D 2020 и 2021 в Dynamo использовался инструмент IronPython, который позволял переносить данные между объектами .NET и сценариями Python. Однако в Civil 3D 2022 в Dynamo применяется стандартный встроенный интерпретатор Python (CPython), в котором используется Python 3. Переход на этот вариант обеспечивает ряд преимуществ, в том числе доступ к популярным современным библиотекам и новым возможностям платформы, а также установку обновлений и исправлений для системы безопасности.
Подробные сведения об этом переходе и обновлении сценариев предыдущих версий можно найти в блоге Dynamo. Если вы хотите и дальше работать с IronPython, установите пакет DynamoIronPython2.7 с помощью Dynamo Package Manager.
Эта строка позволяет нам получить определенный класс из библиотеки геометрии Dynamo. Обратите внимание, что здесь мы указываем import Point as DynPoint
, а не import *
. Это нужно, чтобы избежать конфликтов имен.
Здесь мы указали, какой именно порт ввода содержит нужные данные, вместо того чтобы использовать значение по умолчанию IN
, которое ссылается на список всех портов ввода.
[^13: Входной список объектов может содержать не только водосборы, но и другие элементы. Необходимо проверить, так ли это, и принять соответствующие меры (итерация цикла продолжается только в том случае, если элемент действительно является водосбором).
Здесь мы получаем точки контура водосбора с помощью соответствующего свойства, которое мы нашли ранее в документации по API. Как уже упоминалось, в результате мы получим объект Point3dCollection
, который по сути является списком точек AutoCAD. Чтобы использовать эти точки, нам потребуется преобразовать их в точки Dynamo.
Запускаем цикл для каждого объекта Point3d
в Point3dCollection
.
Получение геометрии границ всех водосборов на чертеже.
Тип Dynamo | Оболочка для |
---|---|
Миссия выполнена!
Object Autodesk.AutoCAD.DynamoNodes.Object
Entity Autodesk.AutoCAD.DatabaseServices.Entity
CivilObject Autodesk.Civil.DynamoNodes.CivilObject
Entity Autodesk.Civil.DatabaseServices.Entity