Найти в Дзене
Хроники Георга

Civil 3D API. Работаем с быстрыми ссылками - Часть 1

Оглавление

Данная статья посвящена обзору функциональных возможностей по работе с быстрыми ссылками Civil 3D через API, особенно в свете летних обновлений по расширению методов API по работе с ними. Не претендую на полноту обзора (в силу своих поверхностных знаний программирования), скорее привожу реализацию отдельных методов и трудностей с которыми столкнулся и закладываю основу для второй части (во что не получилось вникнуть с "наскока").

Предмет разговора
Предмет разговора

1. Немного о справке и библиотеках

Функциональные возможности по работе с быстрыми ссылками раскрываются при использовании пространства имен Autodesk.Civil.DataShortcuts.DataShortcuts, которое "находится" в составе библиотеки AeccDataShortcutMgd (лежит в C:\Program Files\Autodesk\AutoCAD ****\C3D в зависимости от версии программы).

Вообще говоря, информация о методах API по работе с БС крайне неструктурированная (упоминается функциональность, но не сами методы) - как например на этом разделе.

Кроме того, в новых API Reference Guaide's для версий 2021-2022 вообще нет раздела с описанием методов по работе с БС, в отличие от раздела для версии 2020, от которой я и буду отталкиваться в этом обзоре, по большей части.

Не могу не упомянуть Dynamo-пакета Camber, который "подсказал" мне направление, куда копать за справкой API. По словам, кстати, самого автора - возможности по работе с БС запутанные и он сам реализовал далеко не всё.

Ища материалы на форумах, как с ними работать, наткнулся на интересный вариант "обхода" ограничений отсутствия API следующим образом.

2. Работа с папкой БС

Начнем с самых простых методов, которые к слову и реализованы составе Dynamo-пакета Camber - группа методов из класса DataShortcuts по работе с папкой проекта БС на данные и методов по формированию ссылок на объекты чертежа из класса.

Эти методы проиллюстрированы ниже:

Группа методов, получение информации о текущей папке БС
Группа методов, получение информации о текущей папке БС

2. Импорт данных по БС

Интересным выглядит метод CreateReference(), который судя по описанию позволяет подключать из состава имеющихся БС данные в текущий чертеж. Попробуем его реализовать?

У метода есть конструктор двух видов - принимающий на вход БД "родительского" чертежа в форме database или в форме абсолютного файлового пути к файлу. В связи с ограничениями работы через Dynamo нам будет проще воспользоваться вторым вариантом.

Задаем параметры метода
Задаем параметры метода
Вуаля - получаем ссылочный элемент.
Вуаля - получаем ссылочный элемент.
При попытке повторно запустить скрипт на импорт трассы - получим ошибку)
При попытке повторно запустить скрипт на импорт трассы - получим ошибку)

Усложним задачу - для получения нескольких экземпляров данных. Текущий метод позволяет импортировать экземпляры по одиночке, ну и ладно - подадим ему на вход коллекцию объектов:

Вот так
Вот так
И вот результат - импорт трех трасс :d
И вот результат - импорт трех трасс :d

Есть другой метод, делающий тоже самое, но другим способом (через индекс элемента в исходном чертеже). Метод называется также, но располагается в классе DataShortcuts.DataShortcutManager вот здесь. Но вот понять, как получить этот индекс у меня не вышло :(

3. Инициализация данных БС

Здесь я имею в виду возможность получить доступ ко всему перечню объектов, которые можно импортировать через БС (хранящиеся в БД БС). То что в чертеже Civil 3D представлено как упорядоченное дерево:

Речь про это дерево
Речь про это дерево

Возможно, методы из класса DataShortcuts.DataShortcutManager призваны получить этот структурированный список, но у меня не было особого желания в них разбираться и так как БС фиксируются в папке проекта БС как xml-файлы, я решил идти по этому пути - а именно - получить набор всех данных, содержащихся в проекте БС.

Сперва получаем файловый путь к текущей папке БС проекта
Сперва получаем файловый путь к текущей папке БС проекта
Так выглядит каталог с данными БС в файловой системе
Так выглядит каталог с данными БС в файловой системе
Каждая вложенная папка содержит ссылку на данные
Каждая вложенная папка содержит ссылку на данные

Наша задача - пройтись циклом по всем файлам *.xml по всех папках и "выудить" словари для каждого элемента, где будет информация о:

  • родительскому чертежу, в File;
  • имени объекта в родительском чертеже (и БС), в name.
  • индексу элемента в чертеже, LowHandle

Проходку по файлам и их открытие я сделаю при помощи класса System.IO и System.Xml.Linq при помощи пользовательского нода GetAllElementsFromDSFolder.

Выглядит вот так, выгружу как метод класса DataShortcuts в репозитории пакета здесь https://github.com/GeorgGrebenyuk/Civil3D.CustomNodes
Выглядит вот так, выгружу как метод класса DataShortcuts в репозитории пакета здесь https://github.com/GeorgGrebenyuk/Civil3D.CustomNodes
Результат работы нода - пример для одной из позиций.
Результат работы нода - пример для одной из позиций.

По сути, я получил свойства каждого из объекта вместо прямых методов из этого класса.

Теперь поставим боевую задачу - вставить в текущий чертеж трассу и зависимые от неё рамки видов.

Для поиска зависимых элементов от данного в API есть интересный метод GetExportableItemAt(), но как он работает, я пока не разобрался, поэтому пользуясь тем, что нужные мне рамки видов я называл по родительской трассе, сделаю выборку по этому условию.

Выборка элементов
Выборка элементов

Вставку элементов делаем вот так:

Вставляем выбранные элементы в чертеж
Вставляем выбранные элементы в чертеж

4. Обращение к родительскому чертежу за зависимыми/родительскими элементами

Раз у меня не получилось воспользоваться методами класса DataShortcuts.DataShortcutManager, я решил пойти иным путем - по номеру элемента (id) в пространстве БД чертежа найти зависимые/родительские элементы через транзакции к родительскому чертежу.

При вызове операции из-под родительского чертежа, операция удалась - что подтверждает теорию, что параметр LowHandle - это и есть id-элемента в БД чертежа:

Тест на родительском чертеже
Тест на родительском чертеже

Но вот с обращение к файлу из-под текущего у меня возникли проблемы :(. Так я пока делать не научился

Мой героический посыл выглядел вот так, но терпения уже не хватило и я бросил))
Мой героический посыл выглядел вот так, но терпения уже не хватило и я бросил))

5. О выводах

Итак, что удалось рассмотреть - на базе справки для версии 2020 (куда к слову до-внесли новые методы для 2022.1) я попытался воспользоваться отдельными методами по работе с содержимым базы объектов быстрых ссылок.

Большой пласт методов остался нераскрытым (из класса DataShortcuts.DataShortcutManager), которые позволяют получать дочерние/родительские элементы для выбранного элемента. Вместе с тем отсутствует внятный механизм получения всех объектов БС.

Я попытался обойти непонятный мне функционал при помощи обращения к БД БС (в формате *.xml-файлов), в папке проекта БС на данный проект. Структура каждого XML жестко фиксированная, поэтому не составила труда получить информацию по каждому из элементов (имя, тип, родительский чертеж, и номер элемента в БД родительского чертежа). То, что значение параметра LowHandle и является записью об объекте в БД чертежа подтвердилось при помощи адресной транзакции к выбранным объектам в чертеже и получению их наименований.

Обозначенные функциональные возможности были реализованы как метод в составе Dynamo-пакета Civil3D.CustomNodes, которому я постараюсь уделить внимание в следующих статьях. Сам скрипт "DataShortcuts_InsertObjByNameAndType.dyn" я также выкладываю в составе рабочего репозитория этого пакета по ссылке.

Репозиторий с кодом
Репозиторий с кодом

В следующей части постараюсь разобраться с возможностью использования класса DataShortcuts.DataShortcutManager (наверное, с помощью кода на C# - как ноды в пакете), так как с Python не очень получается. Также постараюсь разобраться с возможностью импорта в БД быстрых ссылок имеющиеся объекты чертежа, сгруппированные по отдельным папкам, так как при наличии в чертеже большого числа элементов эта задача превращается в адовую (легко ошибиться).

#civil3d api #autodesk #programming #data shortcuts #dynamo #ironpython #collaboration #быстрые ссылки #быстрые ссылки сивил 3д

Не пропускайте публикации, подписывайтесь на Telegram-канал с тизерами статей.