Данная статья посвящена обзору функциональных возможностей по работе с быстрыми ссылками 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 нам будет проще воспользоваться вторым вариантом.
Усложним задачу - для получения нескольких экземпляров данных. Текущий метод позволяет импортировать экземпляры по одиночке, ну и ладно - подадим ему на вход коллекцию объектов:
Есть другой метод, делающий тоже самое, но другим способом (через индекс элемента в исходном чертеже). Метод называется также, но располагается в классе DataShortcuts.DataShortcutManager вот здесь. Но вот понять, как получить этот индекс у меня не вышло :(
3. Инициализация данных БС
Здесь я имею в виду возможность получить доступ ко всему перечню объектов, которые можно импортировать через БС (хранящиеся в БД БС). То что в чертеже Civil 3D представлено как упорядоченное дерево:
Возможно, методы из класса DataShortcuts.DataShortcutManager призваны получить этот структурированный список, но у меня не было особого желания в них разбираться и так как БС фиксируются в папке проекта БС как xml-файлы, я решил идти по этому пути - а именно - получить набор всех данных, содержащихся в проекте БС.
Наша задача - пройтись циклом по всем файлам *.xml по всех папках и "выудить" словари для каждого элемента, где будет информация о:
- типе элемента DataShortcutEntityType, в type;
- родительскому чертежу, в File;
- имени объекта в родительском чертеже (и БС), в name.
- индексу элемента в чертеже, LowHandle
Проходку по файлам и их открытие я сделаю при помощи класса System.IO и System.Xml.Linq при помощи пользовательского нода GetAllElementsFromDSFolder.
По сути, я получил свойства каждого из объекта вместо прямых методов из этого класса.
Теперь поставим боевую задачу - вставить в текущий чертеж трассу и зависимые от неё рамки видов.
Для поиска зависимых элементов от данного в 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д