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

Автор Тема: Особенности работы с функционалом запросов Map 3d - назад в глубокое прошлое  (Прочитано 6737 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн GeorgАвтор темы

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

Что мне было нужно: есть набор dwg-чертежей (пусть для простоты пустых файлов), есть dwg-файл с данными (топооснова к примеру), есть необходимость вставить обрезанную топооснову по полигону в каждый из чертежей (полигон везде свой).
Что я использую: запросы Map 3d (методы библиотеки C:\Program Files\Autodesk\AutoCAD ****\Map\ManagedMapApi.dll. Их особенность в том, что для идентификации текущего документа используются не производные от DataBase/Application.DocumentManager.MdiActiveDocument, а свой класс --
Код - C# [Выбрать]
  1. Autodesk.Gis.Map.MapApplication mapApp = Autodesk.Gis.Map.HostMapApplicationServices.Application;
. Он берет либо текущий документ, либо базу данных открытого документа (что делает невозможным (?) выполнять запросы из-под закрытого чертежа работая только с его Database).

Как корректно делать пакетную обработку? Пока что я придерживаюсь следующего сценария (взял отсюда https://adn-cis.org/forum/index.php?topic=813.msg3221#msg3221 с изменениями):
Код - C# [Выбрать]
  1. [CommandMethod("test1", CommandFlags.Session)]
  2.         public static void StartActions()
  3.         {
  4.             foreach (string OneDwg in Directory.GetFiles(@"D:\Work\Temp\AD_Files", "*.dwg", SearchOption.TopDirectoryOnly))
  5.             {
  6.                 Document dwgFile = Application.DocumentManager.Open(OneDwg, false);
  7.                 Application.DocumentManager.MdiActiveDocument = dwgFile;
  8.                 Database db = Application.DocumentManager.MdiActiveDocument.Database;
  9.  
  10.                 Autodesk.Gis.Map.Project.ProjectModel activeProject = Autodesk.Gis.Map.HostMapApplicationServices.Application.GetProjectForDB(db);
  11.                 //Выполняем разные действия (о них ниже по тексту)
  12.                 dwgSet.DetachDrawing(PathToDataDrawing);
  13.                 dwgFile.CloseAndSave(OneDwg);
  14.             }
  15.         }

Что здесь происходит - стандартными средствами .NET получаем каталог файлов в директории, устанавливаем статичный файловый путь к файлу с данными (данные из которого мы хотим получить), и далее поочередно открываем файлы, получаем их Database, и по этой Database получаем
Код - C# [Выбрать]
  1. Autodesk.Gis.Map.HostMapApplicationServices.Application.GetProjectForDB(db);
"проект" Map 3d для документа -- по умолчанию он один. В конце в рамках "правил хорошего тона" отключаем присоединенный чертеж от данного набора чертежей "проекта map 3d".

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


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

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

Теперь по поводу исполнения самого запроса. Я исходил оттого, что в открываемых мной файлах уже были раннее определен этот "запрос" - настроена область захвата. Имеющийся запрос получается вот так:
Код - C# [Выбрать]
  1. Autodesk.Gis.Map.Project.ProjectModel activeProject = Autodesk.Gis.Map.HostMapApplicationServices.Application.GetProjectForDB(db);
  2. Autodesk.Gis.Map.Query.QueryModel qryModel = activeProject.CurQuery;
Для его исполнения (после настройки) необходимо выполнить такие действия:
Код - C# [Выбрать]
  1. qryModel.Run();
  2. qryModel.Execute(dwgSet);

Вопросы
Собственно, вопросы касаются по большей части иных примеров работы с функционалом запросов ... как-то в сети примеров жиденько, даже поиск по GitHub нашел пару куцых репозиториев, да и то -- один на китайском  :o.
Другой более интересный вопрос связан с возможностью исполнения этих процедур изпод Lisp (я так понял, оно родилось из него - во всяком случае вот сохраняемая конфигурация запроса сильно напоминающая AutoLisp)
Код - Auto/Visual Lisp [Выбрать]
  1. (setq ade_cmddia_before_qry (getvar "cmddia"))
  2. (setvar "cmddia" 0)
  3. (mapcar 'ade_dwgdeactivate (ade_dslist))
  4. (setq ade_tmpprefval (ade_prefgetval "ActivateDwgsOnAttach"))
  5. (ade_prefsetval "ActivateDwgsOnAttach" T)
  6. (setq dwg_id(ade_dsattach "C:\\Св_ВР_Кам.dwg"))
  7. (ade_prefsetval "ActivateDwgsOnAttach" ade_tmpprefval)
  8. (ade_qryclear)
  9. (ade_qrysettype "draw")
  10. (ade_qrydefine '("" "(" "" "Location" ("all" )")"))
  11. (ade_qrysetaltprop nil)
  12. (ade_qryexecute)
  13. (setvar "cmddia" ade_cmddia_before_qry)

Также хочу поинтересоваться, корректно ли я делал, подавая базу данных файла для определения текущего проекта map 3d?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Georg,
В чем заключаются вопросы я так и не понял. Ну и основное правило форума: Один вопрос - одна тема.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Как корректно делать пакетную обработку? Пока что я придерживаюсь следующего сценария (взял отсюда https://adn-cis.org/forum/index.php?topic=813.msg3221#msg3221 с изменениями):
Любой рабочий способ будет корректен. Тот, который указан, открывает каждый чертёж, делает его активным и в нём выполняет какой-то код. С одной стороны - он удобен в том плане, что чертёж полностью открывается и доступны функции как базы чертежа, так и редактора. С другой стороны - есть подозрение, что если будут какие-то дополнительные диалоги при открытии чертежа (типа шрифт не найден или ещё что-то подобное), то выполнение кода может либо остановиться, либо упадёт что-нибудь. Собственно, это как раз оно:
Да конечно, путь можно переопределить - но руками. И при открытии чертежа кодом выше такое надо будет также править руками.
Есть вариант подгрузки чертежей без открытия их как документы. Вот, например: https://adn-cis.org/forum/index.php?topic=8449.0. Но не факт, что при этом будут доступны все возможности Map API.
Также хочу поинтересоваться, корректно ли я делал, подавая базу данных файла для определения текущего проекта map 3d?
Хм, а какие ещё могут быть варианты?

Оффлайн GeorgАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 1
  • //Я не программист
В чем заключаются вопросы я так и не понял
Да вот все вопросы решились пока писал сообщение на форум; решил просто зафиксировать тут варианты решения - в силу малого числа материалов по теме, особенно на русском :-).
Как таковые вопросы уже будут решаться в процессе тестирования оставшихся функций