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

О пакетной обработке DWG-чертежей, программный подход с Map 3D - Часть 1

Оглавление

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

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

Применимо ко мне, задача состояла в том, чтобы импортировать в каждый из чертежей в рамках большой коллекции набор геометрии другого чертежа в области нужного полигона (операция из ГИС - получение данных внутри полигона).

Я пробовал к слову резать DXF файлы алгоритмами OGR, но они плохо (вообще не) обрабатывали сложные структуры файла, поэтому мне и пришлось прибегнуть к Map 3D.

Вручную, это функционал запросов Map 3D, где по одиночке для каждого файла создаешь новый запрос, подключаешь чертеж с данными и исполняешь его. Описание этой процедуры читай здесь.

Получение примерно такого - обрезки исходных данных (к примеру, топоосновы) по внешнему контуру
Получение примерно такого - обрезки исходных данных (к примеру, топоосновы) по внешнему контуру

1. Предыстория подхода

Честно говоря, я постоянно откладывал в долгий ящик идеи попробовать поработать с API Map 3D, поскольку мне казалось, что там таится древнее непонятное зло. Да и времени особо не было.

Время "нашлось" на моменте, когда меня окончательно **** делать это вручную для сотен файлов.

У меня был как раз набор SDK для Map 3D (качал отсюда), мне понравился их структурированный вид -- в виде *.chm файлов. Почему-то для Civil 3D у меня не получилось найти такие-же .. не люблю web-версию API Reference Guide :(

Я сразу отказался от идеи делать это из-под Dynamo (как я обычно поступаю), поскольку во-первых, под него ничего не было на эту тему, во вторых, мне бы потребовалось извращаться с подключением нужных библиотек в его среду и в третьих .. я был не уверен насчет его стабильности и скорости работы с функционалом Map 3D (хоть тот же Civil3DToolkit и включает ряд возможностей по работе с ObjectData).

2. Описание реализации и замечания к коду

При старте погружения в тему я столкнулся с почти полным отсутствием какого-либо вспомогательного материала (примеров чужого кода) "как с этим работать".

В отчаянии, я даже полез искать по отдельным методам примеры кода на GitHub - нашел пару репозиториев .. без комментариев, и вопросов возникло больше чем ответов.

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

Вариант с настройкой конфигурации запроса я оставлю на вторую часть статьи .. поскольку это отдельная **** мозга.

Реализацию кода я делал при помощи командного метода (это такой, что запускается из командной строки AutoCAD после загрузки библиотеки плагина в программу через NETLOAD). Шаблон кода я сделал на gist.github вот тут.

3. Анализ кода

Отдельные мысли, которые я изложу и здесь, более простыми словами я уже привел в рамках новой темы на форуме adn-cis.org.

Итак, для начала работы с API Map 3D, необходимо подключить библиотеку C:\Program Files\Autodesk\AutoCAD****\Map\ManagedMapApi.dll

Нужные нам функции содержатся среди следующих пространстве имён:

Autodesk.Gis.Map.Project; Autodesk.Gis.Map; Autodesk.Gis.Map.Query
Это начало - здесь мы в рамках списка файлов из папки открываем каждый, и получаем его Document, который передаем на Application, от которого получаем Database - на базе чего получаем проект Map3D для данного чертежа
Это начало - здесь мы в рамках списка файлов из папки открываем каждый, и получаем его Document, который передаем на Application, от которого получаем Database - на базе чего получаем проект Map3D для данного чертежа
Далее мы получаем объект коллекции чертежей, подключенных в данному проекту Map 3D и удаляем из неё все подключенные данные -- так как это вызовет ошибки обработки, если они лежат по неизвестным путям (вернее, с неизвестными данному AutoCAD псевдонимами пути). По окончании удаления, подключаем наш целевой чертеж.
Далее мы получаем объект коллекции чертежей, подключенных в данному проекту Map 3D и удаляем из неё все подключенные данные -- так как это вызовет ошибки обработки, если они лежат по неизвестным путям (вернее, с неизвестными данному AutoCAD псевдонимами пути). По окончании удаления, подключаем наш целевой чертеж.
На завершении - получаем текущий запрос и просто запускаем его Run() в режиме активации всех подключенных чертежей к проекту, а Execute() -- это буквально, исполнение запроса. По окончанию - отключаем внешний целевой чертеж и закрываем файл с сохранением.
На завершении - получаем текущий запрос и просто запускаем его Run() в режиме активации всех подключенных чертежей к проекту, а Execute() -- это буквально, исполнение запроса. По окончанию - отключаем внешний целевой чертеж и закрываем файл с сохранением.

4. Замечания к использованию

Стоит ещё раз отметить подход к работу с функционалом Map 3D:

  • в качестве активной "среды документа" используется собственная инициация проекта Map 3D;
  • внешние чертежи подключаются через псевдонимы пути и также хранятся, индексируются они не в виде файлов а в виде элементов Map 3D (MapId);
  • до и после использования своих операций необходимо очищать список подключенных чертежей, из которых вы брали информацию - это поможет пользователю в будущем во первых, не видеть информационных сообщений "связь разорвана" и "вы уверены, что ...", а во-вторых, избежать внесения изменений в загруженные связями файлы (путем применения операции "сохранить изменения в файл" -- так как режиме вставки данных "для редактирования").

Засим можно закончить эту статью. Вторую часть, как я и оговорился мы посвятим вопросу настройки параметров запроса - операндам Autodesk.Gis.Map.Query.LocationCondition, Autodesk.Gis.Map.Query.QueryBranch и пр.

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

#autodesk #map 3d #autocad map 3d #autocad civil3d #map 3d api #autodesk api #adn-cis.org #programming #gis