ADN Club > Civil 3D API

Особенности работы с функционалом запросов Map 3d - назад в глубокое прошлое

(1/1)

Georg:
Что интересно, пока писал это сообщение (дня 2), разными действиями так или иначе решил свои проблемы  ;D, но там всё равно есть пласт вопросов (в конце под заголовком "Вопросы")... в любом случае в сети минимум информации как работать програмно с запросами map 3d -- поэтому в рамках данной темы хотел бы часть из них поднять.
Пользуюсь им к слову только ради быстрых алгоритмов обрезки данных по dwg файлам и (!?!?) более-менее оптимизации по производительности в этих процедурах.

Что мне было нужно: есть набор dwg-чертежей (пусть для простоты пустых файлов), есть dwg-файл с данными (топооснова к примеру), есть необходимость вставить обрезанную топооснову по полигону в каждый из чертежей (полигон везде свой).
Что я использую: запросы Map 3d (методы библиотеки C:\Program Files\Autodesk\AutoCAD ****\Map\ManagedMapApi.dll. Их особенность в том, что для идентификации текущего документа используются не производные от DataBase/Application.DocumentManager.MdiActiveDocument, а свой класс --

--- Код - C# [Выбрать] ---Autodesk.Gis.Map.MapApplication mapApp = Autodesk.Gis.Map.HostMapApplicationServices.Application;. Он берет либо текущий документ, либо базу данных открытого документа (что делает невозможным (?) выполнять запросы из-под закрытого чертежа работая только с его Database).

Как корректно делать пакетную обработку? Пока что я придерживаюсь следующего сценария (взял отсюда https://adn-cis.org/forum/index.php?topic=813.msg3221#msg3221 с изменениями):

--- Код - C# [Выбрать] ---[CommandMethod("test1", CommandFlags.Session)]        public static void StartActions()        {            foreach (string OneDwg in Directory.GetFiles(@"D:\Work\Temp\AD_Files", "*.dwg", SearchOption.TopDirectoryOnly))            {                Document dwgFile = Application.DocumentManager.Open(OneDwg, false);                Application.DocumentManager.MdiActiveDocument = dwgFile;                Database db = Application.DocumentManager.MdiActiveDocument.Database;                 Autodesk.Gis.Map.Project.ProjectModel activeProject = Autodesk.Gis.Map.HostMapApplicationServices.Application.GetProjectForDB(db);                //Выполняем разные действия (о них ниже по тексту)                dwgSet.DetachDrawing(PathToDataDrawing);                dwgFile.CloseAndSave(OneDwg);            }        }
Что здесь происходит - стандартными средствами .NET получаем каталог файлов в директории, устанавливаем статичный файловый путь к файлу с данными (данные из которого мы хотим получить), и далее поочередно открываем файлы, получаем их Database, и по этой Database получаем
--- Код - C# [Выбрать] ---Autodesk.Gis.Map.HostMapApplicationServices.Application.GetProjectForDB(db); "проект" Map 3d для документа -- по умолчанию он один. В конце в рамках "правил хорошего тона" отключаем присоединенный чертеж от данного набора чертежей "проекта map 3d".

Я не зря описался про отключение присоединенного чертежа от общего набора чертежей. Дело в том, что Map 3d использует механику присоединения чертежей через так называемые "Drive alias" - что позволяет сокращать хранимый путь к файлу, срезая общую для файлов часть пути - до данной директории. И вот эти "alias" хранятся только у данного пользователя. При передаче файла другому пользователю, AutoCAD не найдет заданный путь для такого псевдонима и логично вернет ошибку:


Да конечно, путь можно переопределить - но руками. И при открытии чертежа кодом выше такое надо будет также править руками. Для того, чтобы избежать подобного сценария, используем следующий "костыль":


--- Код - C# [Выбрать] ---                //Отключаем все прочие ранние файлы                void DetachFiles (int DrawingsCount, AttachedDrawings collection_files)                {                    int drawings_count = DrawingsCount;                    if (drawings_count > 0)                    {                        AttachedDrawings dwg_collection_files = collection_files;                        for (int i1 = 0; i1 < drawings_count; i1++)                        {                            AttachedDrawing OneDrawing = dwg_collection_files[i1];                            string FilePath = OneDrawing.ActualPath;                            OneDrawing.Deactivate();                            dwgSet.DetachDrawing(OneDrawing.ObjectId);                        }                    }                }                DetachFiles(dwgSet.AllDrawingsCount, dwgSet.AllAttachedDrawings);Здесь мы получаем набор всех (имеется ввиду + вложенных в данный, если они были получены как другие запросы Map 3d) чертежей и поочередно их сперва деактивируем. затем отключаем включая все известные и неизвестные. Тогда эта ошибка возникать не будет

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

--- Код - C# [Выбрать] ---Autodesk.Gis.Map.Project.ProjectModel activeProject = Autodesk.Gis.Map.HostMapApplicationServices.Application.GetProjectForDB(db);Autodesk.Gis.Map.Query.QueryModel qryModel = activeProject.CurQuery;Для его исполнения (после настройки) необходимо выполнить такие действия:

--- Код - C# [Выбрать] ---qryModel.Run();qryModel.Execute(dwgSet);
ВопросыСобственно, вопросы касаются по большей части иных примеров работы с функционалом запросов ... как-то в сети примеров жиденько, даже поиск по GitHub нашел пару куцых репозиториев, да и то -- один на китайском  :o.
Другой более интересный вопрос связан с возможностью исполнения этих процедур изпод Lisp (я так понял, оно родилось из него - во всяком случае вот сохраняемая конфигурация запроса сильно напоминающая AutoLisp)

--- Код - Auto/Visual Lisp [Выбрать] ---(setq ade_cmddia_before_qry (getvar "cmddia"))(setvar "cmddia" 0)(mapcar 'ade_dwgdeactivate (ade_dslist))(setq ade_tmpprefval (ade_prefgetval "ActivateDwgsOnAttach"))(ade_prefsetval "ActivateDwgsOnAttach" T)(setq dwg_id(ade_dsattach "C:\\Св_ВР_Кам.dwg"))(ade_prefsetval "ActivateDwgsOnAttach" ade_tmpprefval)(ade_qryclear)(ade_qrysettype "draw")(ade_qrydefine '("" "(" "" "Location" ("all" )")"))(ade_qrysetaltprop nil)(ade_qryexecute)(setvar "cmddia" ade_cmddia_before_qry)
Также хочу поинтересоваться, корректно ли я делал, подавая базу данных файла для определения текущего проекта map 3d?

Александр Ривилис:
Georg,
В чем заключаются вопросы я так и не понял. Ну и основное правило форума: Один вопрос - одна тема.

Александр Ривилис:
На всякий случай:
1. Документация Map3d: https://knowledge.autodesk.com/support/autocad-map-3d/troubleshooting/caas/downloads/content/autocad-map-3d-developer-documentation.html
2. AutoCAD Map 3D ObjectARX (там есть и примеры с использованием .NET): https://www.autodesk.com/developer-network/platform-technologies/autocad/map3d-objectarx-license-download

Дмитрий Загорулькин:

--- Цитата: Georg от 20-12-2021, 00:44:32 ---Как корректно делать пакетную обработку? Пока что я придерживаюсь следующего сценария (взял отсюда https://adn-cis.org/forum/index.php?topic=813.msg3221#msg3221 с изменениями):
--- Конец цитаты ---
Любой рабочий способ будет корректен. Тот, который указан, открывает каждый чертёж, делает его активным и в нём выполняет какой-то код. С одной стороны - он удобен в том плане, что чертёж полностью открывается и доступны функции как базы чертежа, так и редактора. С другой стороны - есть подозрение, что если будут какие-то дополнительные диалоги при открытии чертежа (типа шрифт не найден или ещё что-то подобное), то выполнение кода может либо остановиться, либо упадёт что-нибудь. Собственно, это как раз оно:

--- Цитата: Georg от 20-12-2021, 00:44:32 ---Да конечно, путь можно переопределить - но руками. И при открытии чертежа кодом выше такое надо будет также править руками.
--- Конец цитаты ---
Есть вариант подгрузки чертежей без открытия их как документы. Вот, например: https://adn-cis.org/forum/index.php?topic=8449.0. Но не факт, что при этом будут доступны все возможности Map API.

--- Цитата: Georg от 20-12-2021, 00:44:32 ---Также хочу поинтересоваться, корректно ли я делал, подавая базу данных файла для определения текущего проекта map 3d?
--- Конец цитаты ---
Хм, а какие ещё могут быть варианты?

Georg:

--- Цитата: Александр Ривилис от 22-12-2021, 19:37:31 ---В чем заключаются вопросы я так и не понял
--- Конец цитаты ---
Да вот все вопросы решились пока писал сообщение на форум; решил просто зафиксировать тут варианты решения - в силу малого числа материалов по теме, особенно на русском :-).
Как таковые вопросы уже будут решаться в процессе тестирования оставшихся функций

Навигация

[0] Главная страница сообщений

Перейти к полной версии